diff options
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.java | 52 |
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 ); + } + +} |