package org.robolectric.internal; import javax.annotation.Nonnull; import org.robolectric.internal.bytecode.Sandbox; import org.robolectric.internal.dependency.DependencyResolver; import org.robolectric.res.Fs; import org.robolectric.res.PackageResourceTable; import org.robolectric.res.ResourcePath; import org.robolectric.res.ResourceTableFactory; public class SdkEnvironment extends Sandbox { private final SdkConfig sdkConfig; private PackageResourceTable systemResourceTable; public SdkEnvironment(SdkConfig sdkConfig, ClassLoader robolectricClassLoader) { super(robolectricClassLoader); this.sdkConfig = sdkConfig; } public synchronized PackageResourceTable getSystemResourceTable(DependencyResolver dependencyResolver) { if (systemResourceTable == null) { ResourcePath resourcePath = createRuntimeSdkResourcePath(dependencyResolver); systemResourceTable = new ResourceTableFactory().newFrameworkResourceTable(resourcePath); } return systemResourceTable; } @Nonnull private ResourcePath createRuntimeSdkResourcePath(DependencyResolver dependencyResolver) { try { Fs systemResFs = Fs.fromJar(dependencyResolver.getLocalArtifactUrl(sdkConfig.getAndroidSdkDependency())); Class<?> androidRClass = getRobolectricClassLoader().loadClass("android.R"); Class<?> androidInternalRClass = getRobolectricClassLoader().loadClass("com.android.internal.R"); return new ResourcePath(androidRClass, systemResFs.join("res"), systemResFs.join("assets"), androidInternalRClass); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } public SdkConfig getSdkConfig() { return sdkConfig; } }