Config.java revision 48f95f3e0955035946f7c416dec56219a9b19886
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 { 2148f95f3e0955035946f7c416dec56219a9b19886Christian Williams @SuppressWarnings("UnusedDeclaration") 2248f95f3e0955035946f7c416dec56219a9b19886Christian Williams public static final String NONE = "--none"; 2348f95f3e0955035946f7c416dec56219a9b19886Christian Williams public static final String DEFAULT = "--default"; 247be4d2ba0e45483ad70cbd994955ae1b70afafdcKiran Ryali + Christian Williams 257be4d2ba0e45483ad70cbd994955ae1b70afafdcKiran Ryali + Christian Williams /** 268084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams * The Android SDK level to emulate. If not specified, Robolectric defaults to the targetSdkVersion in your app's manifest. 277be4d2ba0e45483ad70cbd994955ae1b70afafdcKiran Ryali + Christian Williams */ 288084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams int emulateSdk() default -1; 297be4d2ba0e45483ad70cbd994955ae1b70afafdcKiran Ryali + Christian Williams 308084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams /** 3148f95f3e0955035946f7c416dec56219a9b19886Christian Williams * The Android manifest file to load; Robolectric will look relative to the current directory. 3248f95f3e0955035946f7c416dec56219a9b19886Christian Williams * Resources and assets will be loaded relative to the manifest. 3348f95f3e0955035946f7c416dec56219a9b19886Christian Williams * 3448f95f3e0955035946f7c416dec56219a9b19886Christian Williams * If not specified, Robolectric defaults to {@code AndroidManifest.xml}. 3548f95f3e0955035946f7c416dec56219a9b19886Christian Williams * 3648f95f3e0955035946f7c416dec56219a9b19886Christian Williams * If your project has no manifest or resources, use {@link Config#NONE}. 3748f95f3e0955035946f7c416dec56219a9b19886Christian Williams */ 3848f95f3e0955035946f7c416dec56219a9b19886Christian Williams String manifest() default DEFAULT; 3948f95f3e0955035946f7c416dec56219a9b19886Christian Williams 4048f95f3e0955035946f7c416dec56219a9b19886Christian Williams /** 418084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams * Qualifiers for the resource resolution, such as "fr-normal-port-hdpi". 428084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams */ 438084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams String qualifiers() default ""; 447be4d2ba0e45483ad70cbd994955ae1b70afafdcKiran Ryali + Christian Williams 458084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams /** 468084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams * The Android SDK level to report in Build.VERSION.SDK_INT. 478084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams */ 487be4d2ba0e45483ad70cbd994955ae1b70afafdcKiran Ryali + Christian Williams int reportSdk() default -1; 498084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams 508084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams /** 518084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams * A list of shadow classes to enable, in addition to those that are already present. 528084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams */ 538084b47f2133fc32630fabb46f2e8a259bcd8735Christian Williams Class<?>[] shadows() default {}; 54f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 55f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams public class Implementation implements Config { 56f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams private final int emulateSdk; 5748f95f3e0955035946f7c416dec56219a9b19886Christian Williams private final String manifest; 58f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams private final String qualifiers; 59f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams private final int reportSdk; 60f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams private final Class<?>[] shadows; 61f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 6248f95f3e0955035946f7c416dec56219a9b19886Christian Williams public Implementation(int emulateSdk, String manifest, String qualifiers, int reportSdk, Class<?>[] shadows) { 63f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.emulateSdk = emulateSdk; 6448f95f3e0955035946f7c416dec56219a9b19886Christian Williams this.manifest = manifest; 65f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.qualifiers = qualifiers; 66f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.reportSdk = reportSdk; 67f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.shadows = shadows; 68f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 69f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 70f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams public Implementation(Config baseConfig, Config overlayConfig) { 71f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.emulateSdk = pick(baseConfig.emulateSdk(), overlayConfig.emulateSdk(), -1); 7248f95f3e0955035946f7c416dec56219a9b19886Christian Williams this.manifest = pick(baseConfig.manifest(), overlayConfig.manifest(), DEFAULT); 73f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.qualifiers = pick(baseConfig.qualifiers(), overlayConfig.qualifiers(), ""); 74f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.reportSdk = pick(baseConfig.reportSdk(), overlayConfig.reportSdk(), -1); 75f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams ArrayList<Class<?>> shadows = new ArrayList<Class<?>>(); 76f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams shadows.addAll(Arrays.asList(baseConfig.shadows())); 77f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams shadows.addAll(Arrays.asList(overlayConfig.shadows())); 78f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams this.shadows = shadows.toArray(new Class[shadows.size()]); 79f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 80f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 81f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams private <T> T pick(T baseValue, T overlayValue, T nullValue) { 82f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return overlayValue.equals(nullValue) ? baseValue : overlayValue; 83f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 84f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 85f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams @Override public int emulateSdk() { 86f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return emulateSdk; 87f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 88f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 8948f95f3e0955035946f7c416dec56219a9b19886Christian Williams @Override public String manifest() { 9048f95f3e0955035946f7c416dec56219a9b19886Christian Williams return manifest; 9148f95f3e0955035946f7c416dec56219a9b19886Christian Williams } 9248f95f3e0955035946f7c416dec56219a9b19886Christian Williams 93f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams @Override public String qualifiers() { 94f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return qualifiers; 95f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 96f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 97f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams @Override public int reportSdk() { 98f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return reportSdk; 99f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 100f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 101f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams @Override public Class<?>[] shadows() { 102f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return shadows; 103f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 104f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 105f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams @NotNull @Override public Class<? extends Annotation> annotationType() { 106f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return Config.class; 107f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 108f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 109f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams @Override 110f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams public boolean equals(Object o) { 111f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams if (this == o) return true; 112f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams if (o == null || getClass() != o.getClass()) return false; 113f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 114f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams Implementation other = (Implementation) o; 115f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 116f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams if (emulateSdk != other.emulateSdk) return false; 117f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams if (reportSdk != other.reportSdk) return false; 118f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams if (!qualifiers.equals(other.qualifiers)) return false; 119f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams if (!Arrays.equals(shadows, other.shadows)) return false; 120f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 121f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return true; 122f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 123f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 124f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams @Override 125f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams public int hashCode() { 126f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams int result = emulateSdk; 127f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams result = 31 * result + qualifiers.hashCode(); 128f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams result = 31 * result + reportSdk; 129f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams result = 31 * result + Arrays.hashCode(shadows); 130f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams return result; 131f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 132f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 133f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams } 134dd40f718cf785a56e63c0685feeb73d266c13e3fWenhui Yao} 135