160acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yaopackage com.xtremelabs.robolectric.res; 260acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao 360acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yaoimport org.w3c.dom.Node; 460acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao 560acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yaopublic class IntegerResourceLoader extends XTagXmlResourceLoader implements ResourceValueConverter { 660acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao 7c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth private final ResourceReferenceResolver< Integer > integerResolver = new ResourceReferenceResolver< Integer >( "integer" ); 860acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao 960acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao public IntegerResourceLoader( ResourceExtractor resourceExtractor ) { 1060acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao super( resourceExtractor, "integer" ); 1160acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao } 1260acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao 1360acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao public int getValue( int resourceId ) { 14c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth final String resourceIdDebugString = String.valueOf(resourceId) + " (" + "0x" + Integer.toHexString(resourceId) + ")"; 15c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth String resourceName = resourceExtractor.getResourceName(resourceId); 16c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth if (resourceName == null) { 17c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth throw new IllegalArgumentException("No such resource: " + resourceId); 18c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth } 19c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth Integer value = integerResolver.getValue(resourceName); 20c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth if (value == null) { // instead of auto-unboxing NPE 21c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth throw new IllegalArgumentException("Got resource name " + resourceName + " from id " + resourceIdDebugString 22c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth + ", but found no resource by that name"); 23c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth } 24c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth return value; 2560acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao } 2660acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao 27100f894536018bd96549d2de7d760676e48cef9fWenhui Yao public int getValue( String resourceName, boolean isSystem ) { 28c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth Integer resourceId = resourceExtractor.getResourceId(resourceName, isSystem); 29c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth if (resourceName == null) { 30c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth throw new IllegalArgumentException("No such resource (" + isSystem + "): " + resourceName); 31c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth } 32c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth return getValue(resourceId); 3360acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao } 34100f894536018bd96549d2de7d760676e48cef9fWenhui Yao 3560acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao @Override 3660acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao public Object convertRawValue( String rawValue ) { 3760acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao try { 38c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth // Decode into long, because there are some large hex values in the android resource files 39c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth // (e.g. config_notificationsBatteryLowARGB = 0xFFFF0000 in sdk 14). 40c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth // Integer.decode() does not support large, i.e. negative values in hex numbers. 41c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth return (int) Long.decode(rawValue).longValue(); 4260acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao } catch ( NumberFormatException nfe ) { 43c668c98e7afc301e765f088eec7c1a24a562c305Maja Bratseth throw new RuntimeException( rawValue + " is not an integer." , nfe ); 4460acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao } 4560acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao } 4660acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao 4760acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao @Override 48100f894536018bd96549d2de7d760676e48cef9fWenhui Yao protected void processNode( Node node, String name, boolean isSystem ) { 4960acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao integerResolver.processResource( name, node.getTextContent(), this, isSystem ); 5060acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao } 5160acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao 5260acd70f30b2ffcfa8c00be0e0e5558fcf3a8504Wenhui Yao} 53