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