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