SdkConfig.java revision a1a48067516f4968580859ac36093a782f66f558
1package org.robolectric.internal; 2 3import android.os.Build; 4import org.jetbrains.annotations.NotNull; 5import org.robolectric.internal.dependency.DependencyJar; 6import org.robolectric.util.Logger; 7 8import java.util.Collections; 9import java.util.HashMap; 10import java.util.Map; 11import java.util.Objects; 12import java.util.Set; 13 14public class SdkConfig implements Comparable<SdkConfig> { 15 16 private static final Map<Integer, SdkVersion> SUPPORTED_APIS = Collections.unmodifiableMap(new HashMap<Integer, SdkVersion>() { 17 private final double jdkVersion = Double.parseDouble(System.getProperty("java.specification.version")); 18 19 { 20 addSdk(Build.VERSION_CODES.JELLY_BEAN, "4.1.2_r1", "0", "1.6"); 21 addSdk(Build.VERSION_CODES.JELLY_BEAN_MR1, "4.2.2_r1.2", "0", "1.6"); 22 addSdk(Build.VERSION_CODES.JELLY_BEAN_MR2, "4.3_r2", "0", "1.6"); 23 addSdk(Build.VERSION_CODES.KITKAT, "4.4_r1", "1", "1.7"); 24 addSdk(Build.VERSION_CODES.LOLLIPOP, "5.0.0_r2", "1", "1.7"); 25 addSdk(Build.VERSION_CODES.LOLLIPOP_MR1, "5.1.1_r9", "1", "1.7"); 26 addSdk(Build.VERSION_CODES.M, "6.0.1_r3", "0", "1.7"); 27 addSdk(Build.VERSION_CODES.N, "7.0.0_r1", "0", "1.8"); 28 addSdk(Build.VERSION_CODES.N_MR1, "7.1.0_r7", "0", "1.8"); 29 addSdk(Build.VERSION_CODES.CUR_DEVELOPMENT, "o-preview-1", "0", "1.8"); 30 } 31 32 private void addSdk(int sdkVersion, String androidVersion, String frameworkSdkBuildVersion, String minJdkVersion) { 33 if (jdkVersion >= Double.parseDouble(minJdkVersion)) { 34 put(sdkVersion, new SdkVersion(androidVersion, frameworkSdkBuildVersion)); 35 } else { 36 Logger.info("Android SDK %s not supported on JDK %s (it requires %s)", sdkVersion, jdkVersion, minJdkVersion); 37 } 38 } 39 }); 40 41 public static final int FALLBACK_SDK_VERSION = Build.VERSION_CODES.JELLY_BEAN; 42 public static final int MAX_SDK_VERSION = Collections.max(getSupportedApis()); 43 44 private final int apiLevel; 45 46 public static Set<Integer> getSupportedApis() { 47 return SUPPORTED_APIS.keySet(); 48 } 49 50 public SdkConfig(int apiLevel) { 51 this.apiLevel = apiLevel; 52 } 53 54 public int getApiLevel() { 55 return apiLevel; 56 } 57 58 public String getAndroidVersion() { 59 return getSdkVersion().androidVersion; 60 } 61 62 public DependencyJar getAndroidSdkDependency() { 63 return createDependency("org.robolectric", "android-all", getSdkVersion().toString(), null); 64 } 65 66 @Override 67 public boolean equals(Object that) { 68 return that == this || that instanceof SdkConfig && ((SdkConfig) that).apiLevel == (apiLevel); 69 } 70 71 @Override 72 public int hashCode() { 73 return apiLevel; 74 } 75 76 @Override 77 public String toString() { 78 return "API Level " + apiLevel; 79 } 80 81 @Override 82 public int compareTo(@NotNull SdkConfig o) { 83 return apiLevel - o.apiLevel; 84 } 85 86 private SdkVersion getSdkVersion() { 87 final SdkVersion sdkVersion = SUPPORTED_APIS.get(apiLevel); 88 if (sdkVersion == null) { 89 throw new UnsupportedOperationException("Robolectric does not support API level " + apiLevel + "."); 90 } 91 return sdkVersion; 92 } 93 94 private DependencyJar createDependency(String groupId, String artifactId, String version, String classifier) { 95 return new DependencyJar(groupId, artifactId, version, classifier); 96 } 97 98 private static final class SdkVersion { 99 private final String androidVersion; 100 private final String robolectricVersion; 101 102 SdkVersion(String androidVersion, String robolectricVersion) { 103 this.androidVersion = androidVersion; 104 this.robolectricVersion = robolectricVersion; 105 } 106 107 @Override 108 public boolean equals(Object that) { 109 return that == this || that instanceof SdkVersion && equals((SdkVersion) that); 110 } 111 112 public boolean equals(SdkVersion that) { 113 return that == this || 114 Objects.equals(that.androidVersion, androidVersion) && 115 Objects.equals(that.robolectricVersion, robolectricVersion); 116 } 117 118 @Override 119 public int hashCode() { 120 return androidVersion.hashCode() * 31 + robolectricVersion.hashCode(); 121 } 122 123 @Override 124 public String toString() { 125 return androidVersion + "-robolectric-" + robolectricVersion; 126 } 127 } 128} 129