Home | History | Annotate | Download | only in internal
      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