• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.robolectric.shadows;
2 
3 import android.content.res.ApkAssets;
4 import android.content.res.AssetManager;
5 import android.util.ArraySet;
6 import com.google.common.annotations.VisibleForTesting;
7 import com.google.common.collect.Ordering;
8 import java.nio.file.Path;
9 import java.util.Collection;
10 import java.util.List;
11 import org.robolectric.RuntimeEnvironment;
12 import org.robolectric.annotation.ResourcesMode;
13 import org.robolectric.annotation.ResourcesMode.Mode;
14 import org.robolectric.config.ConfigurationRegistry;
15 import org.robolectric.res.android.AssetPath;
16 import org.robolectric.res.android.CppAssetManager;
17 import org.robolectric.res.android.ResTable;
18 import org.robolectric.res.android.String8;
19 import org.robolectric.util.reflector.Accessor;
20 import org.robolectric.util.reflector.Direct;
21 import org.robolectric.util.reflector.ForType;
22 import org.robolectric.util.reflector.Static;
23 
24 public abstract class ShadowAssetManager {
25 
26   public static final Ordering<String> ATTRIBUTE_TYPE_PRECIDENCE =
27       Ordering.explicit(
28           "reference",
29           "color",
30           "boolean",
31           "integer",
32           "fraction",
33           "dimension",
34           "float",
35           "enum",
36           "flag",
37           "flags",
38           "string");
39 
40   private static final Object resourcesModeLock = new Object();
41   private static Mode cachedResourcesMode;
42 
43   public static class Picker extends ResourceModeShadowPicker<ShadowAssetManager> {
44 
Picker()45     public Picker() {
46       super(
47           ShadowArscAssetManager.class,
48           ShadowArscAssetManager9.class,
49           ShadowArscAssetManager10.class,
50           ShadowArscAssetManager14.class,
51           ShadowNativeAssetManager.class);
52     }
53   }
54 
resourcesMode()55   static ResourcesMode.Mode resourcesMode() {
56     synchronized (resourcesModeLock) {
57       if (cachedResourcesMode == null) {
58         cachedResourcesMode = ConfigurationRegistry.get(ResourcesMode.Mode.class);
59       }
60     }
61     return cachedResourcesMode;
62   }
63 
getAllAssetDirs()64   abstract Collection<Path> getAllAssetDirs();
65 
66   @VisibleForTesting
getNativePtr()67   abstract long getNativePtr();
68 
69   public abstract static class ArscBase extends ShadowAssetManager {
70     private ResTable compileTimeResTable;
71 
72     /**
73      * @deprecated Avoid use.
74      */
75     @Deprecated
getCompileTimeResTable()76     public synchronized ResTable getCompileTimeResTable() {
77       if (compileTimeResTable == null) {
78         CppAssetManager compileTimeCppAssetManager = new CppAssetManager();
79         for (AssetPath assetPath : getAssetPaths()) {
80           if (assetPath.isSystem) {
81             compileTimeCppAssetManager.addDefaultAssets(
82                 RuntimeEnvironment.getCompileTimeSystemResourcesPath());
83           } else {
84             compileTimeCppAssetManager.addAssetPath(new String8(assetPath.file), null, false);
85           }
86         }
87         compileTimeResTable = compileTimeCppAssetManager.getResources();
88       }
89 
90       return compileTimeResTable;
91     }
92 
getAssetPaths()93     abstract List<AssetPath> getAssetPaths();
94   }
95 
96   /** Accessor interface for {@link AssetManager}'s internals. */
97   @ForType(AssetManager.class)
98   interface _AssetManager_ {
99     @Direct
100     @Static
getSystem()101     AssetManager getSystem();
102 
103     @Static
104     @Accessor("sSystem")
setSystem(AssetManager o)105     void setSystem(AssetManager o);
106 
107     @Accessor("mObject")
getNativePtr()108     long getNativePtr();
109   }
110 
111   /** Accessor interface for {@link AssetManager}'s internals added in API level 28. */
112   @ForType(AssetManager.class)
113   interface _AssetManager28_ extends _AssetManager_ {
114 
115     @Static
116     @Accessor("sSystemApkAssets")
getSystemApkAssets()117     ApkAssets[] getSystemApkAssets();
118 
119     @Static
120     @Accessor("sSystemApkAssets")
setSystemApkAssets(ApkAssets[] apkAssets)121     void setSystemApkAssets(ApkAssets[] apkAssets);
122 
123     @Static
124     @Accessor("sSystemApkAssetsSet")
getSystemApkAssetsSet()125     ArraySet<ApkAssets> getSystemApkAssetsSet();
126 
127     @Static
128     @Accessor("sSystemApkAssetsSet")
setSystemApkAssetsSet(ArraySet<ApkAssets> assetsSet)129     void setSystemApkAssetsSet(ArraySet<ApkAssets> assetsSet);
130 
getApkAssets()131     ApkAssets[] getApkAssets();
132   }
133 }
134