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