blob: 3bc4b24c951fa7c08d495d7d089bc6abb95dfe5d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
package com.xtremelabs.robolectric.res;
import org.w3c.dom.Node;
public class IntegerResourceLoader extends XTagXmlResourceLoader implements ResourceValueConverter {
private final ResourceReferenceResolver< Integer > integerResolver = new ResourceReferenceResolver< Integer >( "integer" );
public IntegerResourceLoader( ResourceExtractor resourceExtractor ) {
super( resourceExtractor, "integer" );
}
public int getValue( int resourceId ) {
final String resourceIdDebugString = String.valueOf(resourceId) + " (" + "0x" + Integer.toHexString(resourceId) + ")";
String resourceName = resourceExtractor.getResourceName(resourceId);
if (resourceName == null) {
throw new IllegalArgumentException("No such resource: " + resourceId);
}
Integer value = integerResolver.getValue(resourceName);
if (value == null) { // instead of auto-unboxing NPE
throw new IllegalArgumentException("Got resource name " + resourceName + " from id " + resourceIdDebugString
+ ", but found no resource by that name");
}
return value;
}
public int getValue( String resourceName, boolean isSystem ) {
Integer resourceId = resourceExtractor.getResourceId(resourceName, isSystem);
if (resourceName == null) {
throw new IllegalArgumentException("No such resource (" + isSystem + "): " + resourceName);
}
return getValue(resourceId);
}
@Override
public Object convertRawValue( String rawValue ) {
try {
// Decode into long, because there are some large hex values in the android resource files
// (e.g. config_notificationsBatteryLowARGB = 0xFFFF0000 in sdk 14).
// Integer.decode() does not support large, i.e. negative values in hex numbers.
return (int) Long.decode(rawValue).longValue();
} catch ( NumberFormatException nfe ) {
throw new RuntimeException( rawValue + " is not an integer." , nfe );
}
}
@Override
protected void processNode( Node node, String name, boolean isSystem ) {
integerResolver.processResource( name, node.getTextContent(), this, isSystem );
}
}
|