Config.java revision f6df8a55ac378dee35324bc865fb4d741dcb4824
1cfb3d242306311ce27ec51bf511764377c173a7cKiran Ryali + Christian Williamspackage org.robolectric.annotation; 2dd40f718cf785a56e63c0685feeb73d266c13e3fWenhui Yao 3f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport org.jetbrains.annotations.NotNull; 4f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 5f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.lang.annotation.Annotation; 6f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.lang.annotation.Documented; 7f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.lang.annotation.ElementType; 8f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.lang.annotation.Retention; 9f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.lang.annotation.RetentionPolicy; 10f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.lang.annotation.Target; 11f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.util.ArrayList; 12f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.util.Arrays; 13f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 14dd40f718cf785a56e63c0685feeb73d266c13e3fWenhui Yao/** 1580c8a1718d42c7e2165289a7bbfab5e7f3dc0513Christian Williams & Dimitris Couchell * Indicate that robolectric should look for values that is specific by those qualifiers 16dd40f718cf785a56e63c0685feeb73d266c13e3fWenhui Yao */ 17f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams@Documented 18f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams@Retention(RetentionPolicy.RUNTIME) 19f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams@Target({ElementType.TYPE, ElementType.METHOD}) 207be4d2ba0e45483ad70cbd994955ae1b70afafdcKiran Ryali + Christian Williamspublic @interface Config { 217be4d2ba0e45483ad70cbd994955ae1b70afafdcKiran Ryali + Christian Williams 227be4d2ba0e45483ad70cbd994955ae1b70afafdcKiran Ryali + Christian Williams /** 238084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams * The Android SDK level to emulate. If not specified, Robolectric defaults to the targetSdkVersion in your app's manifest. 247be4d2ba0e45483ad70cbd994955ae1b70afafdcKiran Ryali + Christian Williams */ 258084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams int emulateSdk() default -1; 267be4d2ba0e45483ad70cbd994955ae1b70afafdcKiran Ryali + Christian Williams 278084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams /** 288084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams * Qualifiers for the resource resolution, such as "fr-normal-port-hdpi". 298084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams */ 308084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams String qualifiers() default ""; 317be4d2ba0e45483ad70cbd994955ae1b70afafdcKiran Ryali + Christian Williams 328084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams /** 338084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams * The Android SDK level to report in Build.VERSION.SDK_INT. 348084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams */ 357be4d2ba0e45483ad70cbd994955ae1b70afafdcKiran Ryali + Christian Williams int reportSdk() default -1; 368084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams 378084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams /** 388084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams * A list of shadow classes to enable, in addition to those that are already present. 398084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams */ 408084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams Class<?>[] shadows() default {}; 41f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 42f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams public class Implementation implements Config { 43f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams private final int emulateSdk; 44f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams private final String qualifiers; 45f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams private final int reportSdk; 46f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams private final Class<?>[] shadows; 47f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 48f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams public Implementation(int emulateSdk, String qualifiers, int reportSdk, Class<?>[] shadows) { 49f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.emulateSdk = emulateSdk; 50f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.qualifiers = qualifiers; 51f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.reportSdk = reportSdk; 52f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.shadows = shadows; 53f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 54f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 55f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams public Implementation(Config baseConfig, Config overlayConfig) { 56f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.emulateSdk = pick(baseConfig.emulateSdk(), overlayConfig.emulateSdk(), -1); 57f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.qualifiers = pick(baseConfig.qualifiers(), overlayConfig.qualifiers(), ""); 58f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.reportSdk = pick(baseConfig.reportSdk(), overlayConfig.reportSdk(), -1); 59f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams ArrayList<Class<?>> shadows = new ArrayList<Class<?>>(); 60f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams shadows.addAll(Arrays.asList(baseConfig.shadows())); 61f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams shadows.addAll(Arrays.asList(overlayConfig.shadows())); 62f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.shadows = shadows.toArray(new Class[shadows.size()]); 63f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 64f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 65f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams private <T> T pick(T baseValue, T overlayValue, T nullValue) { 66f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return overlayValue.equals(nullValue) ? baseValue : overlayValue; 67f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 68f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 69f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams @Override public int emulateSdk() { 70f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return emulateSdk; 71f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 72f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 73f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams @Override public String qualifiers() { 74f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return qualifiers; 75f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 76f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 77f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams @Override public int reportSdk() { 78f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return reportSdk; 79f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 80f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 81f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams @Override public Class<?>[] shadows() { 82f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return shadows; 83f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 84f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 85f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams @NotNull @Override public Class<? extends Annotation> annotationType() { 86f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return Config.class; 87f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 88f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 89f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams @Override 90f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams public boolean equals(Object o) { 91f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams if (this == o) return true; 92f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams if (o == null || getClass() != o.getClass()) return false; 93f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 94f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams Implementation other = (Implementation) o; 95f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 96f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams if (emulateSdk != other.emulateSdk) return false; 97f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams if (reportSdk != other.reportSdk) return false; 98f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams if (!qualifiers.equals(other.qualifiers)) return false; 99f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams if (!Arrays.equals(shadows, other.shadows)) return false; 100f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 101f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return true; 102f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 103f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 104f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams @Override 105f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams public int hashCode() { 106f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams int result = emulateSdk; 107f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams result = 31 * result + qualifiers.hashCode(); 108f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams result = 31 * result + reportSdk; 109f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams result = 31 * result + Arrays.hashCode(shadows); 110f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return result; 111f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 112f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 113f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 114dd40f718cf785a56e63c0685feeb73d266c13e3fWenhui Yao} 115