133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows;
28baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard
38baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richardimport android.content.ContentResolver;
48baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richardimport android.provider.Settings;
5345fb6b77303f0d3c98cf748fefa0136183bdc79Christian Williamsimport com.xtremelabs.robolectric.Robolectric;
622c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
722c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
88baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard
98baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richardimport java.util.HashMap;
108baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richardimport java.util.Map;
118baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richardimport java.util.WeakHashMap;
128baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard
1359d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin/**
1459d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * Shadow of {@code Settings} that allows the status of various System and Secure settings to be simulated, changed and
1559d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * queried.
1659d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin */
178baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard@SuppressWarnings({"UnusedDeclaration"})
188baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard@Implements(Settings.class)
19afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowSettings {
20537f38b99433fee0ee08d7c634763e7381942f58Phil Goodwin    @Implements(Settings.class)
218baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard    private static class SettingsImpl {
22fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        private static final WeakHashMap<ContentResolver, Map<String, Object>> dataMap = new WeakHashMap<ContentResolver, Map<String, Object>>();
238baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard
24de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams        @Implementation
258baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard        public static boolean putInt(ContentResolver cr, String name, int value) {
268baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard            get(cr).put(name, value);
278baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard            return true;
288baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard        }
298baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard
30de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams        @Implementation
318baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard        public static int getInt(ContentResolver cr, String name, int def) {
32fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            if (get(cr).get(name) instanceof Integer) {
33fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                return (Integer) get(cr).get(name);
34fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            } else {
35fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                return def;
36fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            }
37fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        }
38fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel
39fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        @Implementation
40fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        public static int getInt(ContentResolver cr, String name) throws Settings.SettingNotFoundException {
41fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            if (get(cr).get(name) instanceof Integer) {
42fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                return (Integer) get(cr).get(name);
43fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            } else {
44fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                throw new Settings.SettingNotFoundException(name);
45fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            }
46fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        }
47fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel
48fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        @Implementation
49fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        public static boolean putString(ContentResolver cr, String name, String value) {
50fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            get(cr).put(name, value);
51fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            return true;
52fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        }
53fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel
54fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        @Implementation
55fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        public static String getString(ContentResolver cr, String name) {
56fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            if (get(cr).get(name) instanceof String) {
57fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                return (String) get(cr).get(name);
58fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            } else {
59fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                return null;
60fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            }
61fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        }
62fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel
63fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        @Implementation
64fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        public static boolean putLong(ContentResolver cr, String name, long value) {
65fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            get(cr).put(name, value);
66fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            return true;
67fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        }
68fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel
69fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        @Implementation
70fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        public static long getLong(ContentResolver cr, String name, long def) {
71fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            if (get(cr).get(name) instanceof Long) {
72fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                return (Long) get(cr).get(name);
73fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            } else {
74fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                return def;
75fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            }
76fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        }
77fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel
78fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        @Implementation
79fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        public static long getLong(ContentResolver cr, String name) throws Settings.SettingNotFoundException {
80fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            if (get(cr).get(name) instanceof Long) {
81fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                return (Long) get(cr).get(name);
82fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            } else {
83fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                throw new Settings.SettingNotFoundException(name);
84fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            }
85fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        }
86fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel
87fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        @Implementation
88fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        public static boolean putFloat(ContentResolver cr, String name, float value) {
89fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            get(cr).put(name, value);
90fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            return true;
91fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        }
92fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel
93fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        @Implementation
94fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        public static float getFloat(ContentResolver cr, String name, float def) {
95fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            if (get(cr).get(name) instanceof Float) {
96fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                return (Float) get(cr).get(name);
97fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            } else {
98fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                return def;
99fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            }
100fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        }
101fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel
102fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        @Implementation
103fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        public static float getFloat(ContentResolver cr, String name) throws Settings.SettingNotFoundException {
104fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            if (get(cr).get(name) instanceof Float) {
105fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                return (Float) get(cr).get(name);
106fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            } else {
107fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                throw new Settings.SettingNotFoundException(name);
108fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            }
1098baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard        }
1108baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard
111de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams        @Implementation
112fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel        private static Map<String, Object> get(ContentResolver cr) {
113fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel            Map<String, Object> map = dataMap.get(cr);
1148baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard            if (map == null) {
115fd3ea5a3a2648261e81c49a1da565d650e58a1a8Jan Berkel                map = new HashMap<String, Object>();
1168baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard                dataMap.put(cr, map);
1178baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard            }
1188baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard            return map;
1198baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard        }
1208baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard    }
1218baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard
1228baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard    @Implements(Settings.System.class)
123afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams    public static class ShadowSystem extends SettingsImpl {
1248baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard    }
1258baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard
1268baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard    @Implements(Settings.Secure.class)
127afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williams    public static class ShadowSecure extends SettingsImpl {
1288baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard    }
129d51f199c0680a726a770395f0159f3f0f22b08c7Christian Williams & Ryan Richard
130fd457c259610a8a7533482b160ffd8607db78b40Jon Boekenoogen    @Implements(Settings.Global.class)
131fd457c259610a8a7533482b160ffd8607db78b40Jon Boekenoogen    public static class ShadowGlobal extends SettingsImpl {
132fd457c259610a8a7533482b160ffd8607db78b40Jon Boekenoogen    }
133fd457c259610a8a7533482b160ffd8607db78b40Jon Boekenoogen
13459d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin    /**
13559d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     * Non-Android accessor that allows the value of the AIRPLANE_MODE_ON setting to be set.
13659d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     *
13759d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     * @param isAirplaneMode new status for airplane mode
13859d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     */
139d51f199c0680a726a770395f0159f3f0f22b08c7Christian Williams & Ryan Richard    public static void setAirplaneMode(boolean isAirplaneMode) {
140345fb6b77303f0d3c98cf748fefa0136183bdc79Christian Williams        Settings.System.putInt(Robolectric.application.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, isAirplaneMode ? 1 : 0);
141d51f199c0680a726a770395f0159f3f0f22b08c7Christian Williams & Ryan Richard    }
142d51f199c0680a726a770395f0159f3f0f22b08c7Christian Williams & Ryan Richard
14359d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin    /**
14459d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     * Non-Android accessor that allows the value of the WIFI_ON setting to be set.
14559d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     *
14659d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     * @param isOn new status for wifi mode
14759d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     */
148d51f199c0680a726a770395f0159f3f0f22b08c7Christian Williams & Ryan Richard    public static void setWifiOn(boolean isOn) {
149345fb6b77303f0d3c98cf748fefa0136183bdc79Christian Williams        Settings.Secure.putInt(Robolectric.application.getContentResolver(), Settings.Secure.WIFI_ON, isOn ? 1 : 0);
150d51f199c0680a726a770395f0159f3f0f22b08c7Christian Williams & Ryan Richard    }
151403e3977849b4170a7b04dbb54d0faf0454327d2Joe Moore & Ryan Richard
15259d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin    /**
15359d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     * Non-Android accessor thatallows the value of the TIME_12_24 setting to be set.
15459d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     *
15559d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     * @param use24HourTimeFormat new status for the time setting
15659d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin     */
157403e3977849b4170a7b04dbb54d0faf0454327d2Joe Moore & Ryan Richard    public static void set24HourTimeFormat(boolean use24HourTimeFormat) {
158403e3977849b4170a7b04dbb54d0faf0454327d2Joe Moore & Ryan Richard        Settings.System.putInt(Robolectric.application.getContentResolver(), Settings.System.TIME_12_24, use24HourTimeFormat ? 24 : 12);
159403e3977849b4170a7b04dbb54d0faf0454327d2Joe Moore & Ryan Richard    }
1608baea4cbf332f0e0acf559dfab4aa59dd7c71003Christian Williams & Ryan Richard}
161