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