ResourceLoader.java revision 4ac725f9b4cebbf46805fc5e9b2f0eaf3fdd9b29
1package com.xtremelabs.robolectric.res;
2
3import android.content.Context;
4import android.view.View;
5import android.view.ViewGroup;
6
7import java.io.File;
8import java.io.FileFilter;
9import java.io.InputStream;
10import java.util.HashMap;
11import java.util.Map;
12
13import static com.xtremelabs.robolectric.Robolectric.shadowOf;
14
15public class ResourceLoader {
16    private final ResourceExtractor resourceExtractor;
17    private ViewLoader viewLoader;
18    private final StringResourceLoader stringResourceLoader;
19    private final StringArrayResourceLoader stringArrayResourceLoader;
20    private final AttrResourceLoader attrResourceLoader;
21    private final ColorResourceLoader colorResourceLoader;
22    private final RawResourceLoader rawResourceLoader;
23    private boolean isInitialized = false;
24
25    // TODO: get these value from the xml resources instead [xw 20101011]
26    public final Map<Integer, Integer> dimensions = new HashMap<Integer, Integer>();
27    private File resourceDir;
28
29    public ResourceLoader(Class rClass, File resourceDir) throws Exception {
30        resourceExtractor = new ResourceExtractor();
31        resourceExtractor.addRClass(rClass);
32
33        stringResourceLoader = new StringResourceLoader(resourceExtractor);
34        stringArrayResourceLoader = new StringArrayResourceLoader(resourceExtractor, stringResourceLoader);
35        colorResourceLoader = new ColorResourceLoader(resourceExtractor);
36        attrResourceLoader = new AttrResourceLoader(resourceExtractor);
37        rawResourceLoader = new RawResourceLoader(resourceExtractor, resourceDir);
38
39        this.resourceDir = resourceDir;
40    }
41
42    private void init() {
43        if (isInitialized) {
44            return;
45        }
46
47        try {
48            if (resourceDir != null) {
49                DocumentLoader stringResourcesDocumentLoader = new DocumentLoader(stringResourceLoader);
50                File valuesResourceDir = new File(resourceDir, "values");
51                stringResourcesDocumentLoader.loadResourceXmlDir(valuesResourceDir);
52
53                DocumentLoader resourcesDocumentLoader = new DocumentLoader(stringArrayResourceLoader, colorResourceLoader, attrResourceLoader);
54                resourcesDocumentLoader.loadResourceXmlDir(valuesResourceDir);
55
56                viewLoader = new ViewLoader(resourceExtractor, attrResourceLoader);
57                DocumentLoader viewDocumentLoader = new DocumentLoader(viewLoader);
58                File[] layoutDirs = resourceDir.listFiles(new FileFilter() {
59                    @Override
60                    public boolean accept(File file) {
61                        return isLayoutDirectory(file.getPath());
62                    }
63                });
64                viewDocumentLoader.loadResourceXmlDirs(layoutDirs);
65            } else {
66                viewLoader = null;
67            }
68        } catch (Exception e) {
69            throw new RuntimeException(e);
70        }
71        isInitialized = true;
72    }
73
74    boolean isLayoutDirectory(String path) {
75        return path.contains(File.separator + "layout");
76    }
77
78    /*
79     * For tests only...
80     */
81    protected ResourceLoader(StringResourceLoader stringResourceLoader) {
82        resourceExtractor = new ResourceExtractor();
83        this.stringResourceLoader = stringResourceLoader;
84        viewLoader = null;
85        stringArrayResourceLoader = null;
86        attrResourceLoader = null;
87        colorResourceLoader = null;
88        rawResourceLoader = null;
89    }
90
91    public static ResourceLoader getFrom(Context context) {
92        ResourceLoader resourceLoader = shadowOf(context.getApplicationContext()).getResourceLoader();
93        resourceLoader.init();
94        return resourceLoader;
95    }
96
97    public String getNameForId(int viewId) {
98        init();
99        return resourceExtractor.getResourceName(viewId);
100    }
101
102    public View inflateView(Context context, int resource, ViewGroup viewGroup) {
103        init();
104        return viewLoader.inflateView(context, resource, viewGroup);
105    }
106
107    public int getColorValue(int id) {
108        init();
109        return colorResourceLoader.getValue(id);
110    }
111
112    public String getStringValue(int id) {
113        init();
114        return stringResourceLoader.getValue(id);
115    }
116
117    public InputStream getRawValue(int id) {
118        init();
119        return rawResourceLoader.getValue(id);
120    }
121
122    public String[] getStringArrayValue(int id) {
123        init();
124        return stringArrayResourceLoader.getArrayValue(id);
125    }
126}
127