aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/xtremelabs/robolectric/res/IntegerResourceLoader.java
blob: 3bc4b24c951fa7c08d495d7d089bc6abb95dfe5d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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 );
	}

}