Home | History | Annotate | Download | only in res
      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 
      9 	public IntegerResourceLoader( ResourceExtractor resourceExtractor ) {
     10 		super( resourceExtractor, "integer" );
     11 	}
     12 
     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 
     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
     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
     48 	protected void processNode( Node node, String name, boolean isSystem ) {
     49 		integerResolver.processResource( name, node.getTextContent(), this, isSystem );
     50 	}
     51 
     52 }
     53