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