• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.xtremelabs.robolectric.res;
2 
3 import java.lang.reflect.Field;
4 import java.lang.reflect.Modifier;
5 import java.util.HashMap;
6 import java.util.Map;
7 
8 public class ResourceExtractor {
9     private Map<String, Integer> localResourceStringToId = new HashMap<String, Integer>();
10     private Map<String, Integer> systemResourceStringToId = new HashMap<String, Integer>();
11     private Map<Integer, String> resourceIdToString = new HashMap<Integer, String>();
12 
addLocalRClass(Class rClass)13     public void addLocalRClass(Class rClass) throws Exception {
14         addRClass(rClass, false);
15     }
16 
addSystemRClass(Class rClass)17     public void addSystemRClass(Class rClass) throws Exception {
18         addRClass(rClass, true);
19     }
20 
addRClass(Class rClass, boolean isSystemRClass)21     private void addRClass(Class rClass, boolean isSystemRClass) throws Exception {
22         for (Class innerClass : rClass.getClasses()) {
23             for (Field field : innerClass.getDeclaredFields()) {
24                 if (field.getType().equals(Integer.TYPE) && Modifier.isStatic(field.getModifiers())) {
25                     String section = innerClass.getSimpleName();
26                     String name = section + "/" + field.getName();
27                     int value = field.getInt(null);
28 
29                     if (isSystemRClass) {
30                         name = "android:" + name;
31                     }
32 
33                     if (!section.equals("styleable")) {
34                         if (isSystemRClass) {
35                             systemResourceStringToId.put(name, value);
36                         } else {
37                             localResourceStringToId.put(name, value);
38                         }
39 
40                         if (resourceIdToString.containsKey(value)) {
41                             throw new RuntimeException(value + " is already defined with name: " + resourceIdToString.get(value) + " can't also call it: " + name);
42                         }
43                         resourceIdToString.put(value, name);
44                     }
45                 }
46             }
47         }
48     }
49 
getResourceId(String resourceName)50     public Integer getResourceId(String resourceName) {
51         if (resourceName.contains("android:")) { // namespace needed for platform files
52             return getResourceId(resourceName, true);
53         } else {
54             return getResourceId(resourceName, false);
55         }
56     }
57 
getLocalResourceId(String value)58     public Integer getLocalResourceId(String value) {
59         boolean isSystem = false;
60         return getResourceId(value, isSystem);
61     }
62 
getResourceId(String resourceName, boolean isSystemResource)63     public Integer getResourceId(String resourceName, boolean isSystemResource) {
64         if (resourceName == null ) {
65             return null;
66         }
67         if (resourceName.equals("@null")) {
68         	return 0;
69         }
70 
71         if (resourceName.startsWith("@+id")) {
72             resourceName = resourceName.substring(2);
73         } else if (resourceName.startsWith("@+android:id")) {
74             resourceName = resourceName.substring(2);
75         } else if (resourceName.startsWith("@")) {
76             resourceName = resourceName.substring(1);
77         }
78 
79         if (isSystemResource) {
80             return systemResourceStringToId.get(resourceName);
81         } else {
82             return localResourceStringToId.get(resourceName);
83         }
84     }
85 
getResourceName(int resourceId)86     public String getResourceName(int resourceId) {
87         return resourceIdToString.get(resourceId);
88     }
89 }