1 package org.robolectric.internal; 2 3 import javax.annotation.Nonnull; 4 import org.robolectric.internal.bytecode.Sandbox; 5 import org.robolectric.internal.dependency.DependencyResolver; 6 import org.robolectric.res.Fs; 7 import org.robolectric.res.PackageResourceTable; 8 import org.robolectric.res.ResourcePath; 9 import org.robolectric.res.ResourceTableFactory; 10 11 public class SdkEnvironment extends Sandbox { 12 private final SdkConfig sdkConfig; 13 private PackageResourceTable systemResourceTable; 14 15 public SdkEnvironment(SdkConfig sdkConfig, ClassLoader robolectricClassLoader) { 16 super(robolectricClassLoader); 17 this.sdkConfig = sdkConfig; 18 } 19 20 public synchronized PackageResourceTable getSystemResourceTable(DependencyResolver dependencyResolver) { 21 if (systemResourceTable == null) { 22 ResourcePath resourcePath = createRuntimeSdkResourcePath(dependencyResolver); 23 systemResourceTable = new ResourceTableFactory().newFrameworkResourceTable(resourcePath); 24 } 25 return systemResourceTable; 26 } 27 28 @Nonnull 29 private ResourcePath createRuntimeSdkResourcePath(DependencyResolver dependencyResolver) { 30 try { 31 Fs systemResFs = Fs.fromJar(dependencyResolver.getLocalArtifactUrl(sdkConfig.getAndroidSdkDependency())); 32 Class<?> androidRClass = getRobolectricClassLoader().loadClass("android.R"); 33 Class<?> androidInternalRClass = getRobolectricClassLoader().loadClass("com.android.internal.R"); 34 return new ResourcePath(androidRClass, 35 systemResFs.join("raw-res/res"), 36 systemResFs.join("raw-res/assets"), 37 androidInternalRClass); 38 } catch (ClassNotFoundException e) { 39 throw new RuntimeException(e); 40 } 41 } 42 43 public SdkConfig getSdkConfig() { 44 return sdkConfig; 45 } 46 } 47