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