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