aboutsummaryrefslogtreecommitdiff
path: root/v1/src/main/java/com/xtremelabs/robolectric/res/IntegerResourceLoader.java
diff options
context:
space:
mode:
Diffstat (limited to 'v1/src/main/java/com/xtremelabs/robolectric/res/IntegerResourceLoader.java')
-rw-r--r--v1/src/main/java/com/xtremelabs/robolectric/res/IntegerResourceLoader.java52
1 files changed, 52 insertions, 0 deletions
diff --git a/v1/src/main/java/com/xtremelabs/robolectric/res/IntegerResourceLoader.java b/v1/src/main/java/com/xtremelabs/robolectric/res/IntegerResourceLoader.java
new file mode 100644
index 000000000..3bc4b24c9
--- /dev/null
+++ b/v1/src/main/java/com/xtremelabs/robolectric/res/IntegerResourceLoader.java
@@ -0,0 +1,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 );
+ }
+
+}