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