15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package com.xtremelabs.robolectric.shadows; 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.ContentResolver; 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.provider.Settings; 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import com.xtremelabs.robolectric.Robolectric; 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import com.xtremelabs.robolectric.internal.Implementation; 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import com.xtremelabs.robolectric.internal.Implements; 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.HashMap; 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.Map; 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.WeakHashMap; 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Shadow of {@code Settings} that allows the status of various System and Secure settings to be simulated, changed and 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * queried. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@SuppressWarnings({"UnusedDeclaration"}) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@Implements(Settings.class) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public class ShadowSettings { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implements(Settings.class) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static class SettingsImpl { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static final WeakHashMap<ContentResolver, Map<String, Object>> dataMap = new WeakHashMap<ContentResolver, Map<String, Object>>(); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implementation 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static boolean putInt(ContentResolver cr, String name, int value) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get(cr).put(name, value); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implementation 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static int getInt(ContentResolver cr, String name, int def) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (get(cr).get(name) instanceof Integer) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (Integer) get(cr).get(name); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return def; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implementation 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static int getInt(ContentResolver cr, String name) throws Settings.SettingNotFoundException { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (get(cr).get(name) instanceof Integer) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (Integer) get(cr).get(name); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) throw new Settings.SettingNotFoundException(name); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implementation 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static boolean putString(ContentResolver cr, String name, String value) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get(cr).put(name, value); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implementation 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static String getString(ContentResolver cr, String name) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (get(cr).get(name) instanceof String) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (String) get(cr).get(name); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return null; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implementation 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static boolean putLong(ContentResolver cr, String name, long value) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get(cr).put(name, value); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implementation 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static long getLong(ContentResolver cr, String name, long def) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (get(cr).get(name) instanceof Long) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (Long) get(cr).get(name); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return def; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implementation 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static long getLong(ContentResolver cr, String name) throws Settings.SettingNotFoundException { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (get(cr).get(name) instanceof Long) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (Long) get(cr).get(name); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) throw new Settings.SettingNotFoundException(name); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implementation 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static boolean putFloat(ContentResolver cr, String name, float value) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get(cr).put(name, value); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implementation 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static float getFloat(ContentResolver cr, String name, float def) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (get(cr).get(name) instanceof Float) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (Float) get(cr).get(name); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return def; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implementation 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static float getFloat(ContentResolver cr, String name) throws Settings.SettingNotFoundException { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (get(cr).get(name) instanceof Float) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (Float) get(cr).get(name); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) throw new Settings.SettingNotFoundException(name); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implementation 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static Map<String, Object> get(ContentResolver cr) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Map<String, Object> map = dataMap.get(cr); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (map == null) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map = new HashMap<String, Object>(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dataMap.put(cr, map); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return map; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implements(Settings.System.class) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static class ShadowSystem extends SettingsImpl { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implements(Settings.Secure.class) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static class ShadowSecure extends SettingsImpl { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Implements(Settings.Global.class) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static class ShadowGlobal extends SettingsImpl { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Non-Android accessor that allows the value of the AIRPLANE_MODE_ON setting to be set. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param isAirplaneMode new status for airplane mode 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static void setAirplaneMode(boolean isAirplaneMode) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Settings.System.putInt(Robolectric.application.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, isAirplaneMode ? 1 : 0); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Non-Android accessor that allows the value of the WIFI_ON setting to be set. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param isOn new status for wifi mode 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static void setWifiOn(boolean isOn) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Settings.Secure.putInt(Robolectric.application.getContentResolver(), Settings.Secure.WIFI_ON, isOn ? 1 : 0); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Non-Android accessor thatallows the value of the TIME_12_24 setting to be set. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param use24HourTimeFormat new status for the time setting 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public static void set24HourTimeFormat(boolean use24HourTimeFormat) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Settings.System.putInt(Robolectric.application.getContentResolver(), Settings.System.TIME_12_24, use24HourTimeFormat ? 24 : 12); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)