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)