SdkConfig.java revision 5203ed6cfc95a78289aeed2eb3fe2f489547e0bc
1package org.robolectric.internal; 2 3import android.os.Build; 4import org.robolectric.internal.dependency.DependencyJar; 5 6import java.io.IOException; 7import java.io.InputStream; 8import java.util.HashMap; 9import java.util.Map; 10import java.util.Properties; 11import java.util.Set; 12 13public class SdkConfig { 14 private final int apiLevel; 15 private final String artifactVersionString; 16 private static final String ROBOLECTRIC_VERSION; 17 private static final Map<Integer, SdkVersion> SUPPORTED_APIS; 18 public static final int FALLBACK_SDK_VERSION = Build.VERSION_CODES.JELLY_BEAN; 19 20 static { 21 SUPPORTED_APIS = new HashMap<>(); 22 SUPPORTED_APIS.put(Build.VERSION_CODES.JELLY_BEAN, new SdkVersion("4.1.2_r1", "0")); 23 SUPPORTED_APIS.put(Build.VERSION_CODES.JELLY_BEAN_MR1, new SdkVersion("4.2.2_r1.2", "0")); 24 SUPPORTED_APIS.put(Build.VERSION_CODES.JELLY_BEAN_MR2, new SdkVersion("4.3_r2", "0")); 25 SUPPORTED_APIS.put(Build.VERSION_CODES.KITKAT, new SdkVersion("4.4_r1", "1")); 26 SUPPORTED_APIS.put(Build.VERSION_CODES.LOLLIPOP, new SdkVersion("5.0.0_r2", "1")); 27 ROBOLECTRIC_VERSION = getRobolectricVersion(); 28 } 29 30 public static Set<Integer> getSupportedApis() { 31 return SUPPORTED_APIS.keySet(); 32 } 33 34 public SdkConfig(int apiLevel) { 35 this.apiLevel = apiLevel; 36 SdkVersion version = SUPPORTED_APIS.get(apiLevel); 37 if (version == null) { 38 throw new UnsupportedOperationException("Robolectric does not support API level " + apiLevel + "."); 39 } 40 this.artifactVersionString = version.toString(); 41 } 42 43 public int getApiLevel() { 44 return apiLevel; 45 } 46 47 public DependencyJar getSystemResourceDependency() { 48 return createDependency("org.robolectric", "android-all", artifactVersionString, null); 49 } 50 51 public DependencyJar[] getSdkClasspathDependencies() { 52 return new DependencyJar[] { 53 createDependency("org.robolectric", "android-all", artifactVersionString, null), 54 createDependency("org.robolectric", "shadows-core", ROBOLECTRIC_VERSION, Integer.toString(apiLevel)), 55 createDependency("org.json", "json", "20080701", null), 56 createDependency("org.ccil.cowan.tagsoup", "tagsoup", "1.2", null) 57 }; 58 } 59 60 @Override 61 public boolean equals(Object o) { 62 if (this == o) return true; 63 if (o == null || getClass() != o.getClass()) return false; 64 SdkConfig sdkConfig = (SdkConfig) o; 65 return artifactVersionString.equals(sdkConfig.artifactVersionString); 66 } 67 68 @Override 69 public String toString() { 70 return "API Level " + apiLevel; 71 } 72 73 @Override 74 public int hashCode() { 75 return artifactVersionString.hashCode(); 76 } 77 78 private DependencyJar createDependency(String groupId, String artifactId, String version, String classifier) { 79 return new DependencyJar(groupId, artifactId, version, classifier); 80 } 81 82 private static String getRobolectricVersion() { 83 ClassLoader classLoader = SdkVersion.class.getClassLoader(); 84 try (InputStream is = classLoader.getResourceAsStream("robolectric-version.properties")) { 85 final Properties properties = new Properties(); 86 properties.load(is); 87 return properties.getProperty("robolectric.version"); 88 } catch (IOException e) { 89 throw new RuntimeException("Error determining Robolectric version: " + e.getMessage()); 90 } 91 } 92 93 private static class SdkVersion { 94 private final String androidVersion; 95 private final String robolectricVersion; 96 97 public SdkVersion(String androidVersion, String robolectricVersion) { 98 this.androidVersion = androidVersion; 99 this.robolectricVersion = robolectricVersion; 100 } 101 102 @Override 103 public String toString() { 104 return androidVersion + "-robolectric-" + robolectricVersion; 105 } 106 } 107} 108