1 package com.xtremelabs.robolectric.shadows; 2 3 import android.content.ContentResolver; 4 import android.provider.Settings; 5 import com.xtremelabs.robolectric.Robolectric; 6 import com.xtremelabs.robolectric.internal.Implementation; 7 import com.xtremelabs.robolectric.internal.Implements; 8 9 import java.util.HashMap; 10 import java.util.Map; 11 import java.util.WeakHashMap; 12 13 /** 14 * Shadow of {@code Settings} that allows the status of various System and Secure settings to be simulated, changed and 15 * queried. 16 */ 17 @SuppressWarnings({"UnusedDeclaration"}) 18 @Implements(Settings.class) 19 public class ShadowSettings { 20 @Implements(Settings.class) 21 private static class SettingsImpl { 22 private static final WeakHashMap<ContentResolver, Map<String, Object>> dataMap = new WeakHashMap<ContentResolver, Map<String, Object>>(); 23 24 @Implementation putInt(ContentResolver cr, String name, int value)25 public static boolean putInt(ContentResolver cr, String name, int value) { 26 get(cr).put(name, value); 27 return true; 28 } 29 30 @Implementation getInt(ContentResolver cr, String name, int def)31 public static int getInt(ContentResolver cr, String name, int def) { 32 if (get(cr).get(name) instanceof Integer) { 33 return (Integer) get(cr).get(name); 34 } else { 35 return def; 36 } 37 } 38 39 @Implementation getInt(ContentResolver cr, String name)40 public static int getInt(ContentResolver cr, String name) throws Settings.SettingNotFoundException { 41 if (get(cr).get(name) instanceof Integer) { 42 return (Integer) get(cr).get(name); 43 } else { 44 throw new Settings.SettingNotFoundException(name); 45 } 46 } 47 48 @Implementation putString(ContentResolver cr, String name, String value)49 public static boolean putString(ContentResolver cr, String name, String value) { 50 get(cr).put(name, value); 51 return true; 52 } 53 54 @Implementation getString(ContentResolver cr, String name)55 public static String getString(ContentResolver cr, String name) { 56 if (get(cr).get(name) instanceof String) { 57 return (String) get(cr).get(name); 58 } else { 59 return null; 60 } 61 } 62 63 @Implementation putLong(ContentResolver cr, String name, long value)64 public static boolean putLong(ContentResolver cr, String name, long value) { 65 get(cr).put(name, value); 66 return true; 67 } 68 69 @Implementation getLong(ContentResolver cr, String name, long def)70 public static long getLong(ContentResolver cr, String name, long def) { 71 if (get(cr).get(name) instanceof Long) { 72 return (Long) get(cr).get(name); 73 } else { 74 return def; 75 } 76 } 77 78 @Implementation getLong(ContentResolver cr, String name)79 public static long getLong(ContentResolver cr, String name) throws Settings.SettingNotFoundException { 80 if (get(cr).get(name) instanceof Long) { 81 return (Long) get(cr).get(name); 82 } else { 83 throw new Settings.SettingNotFoundException(name); 84 } 85 } 86 87 @Implementation putFloat(ContentResolver cr, String name, float value)88 public static boolean putFloat(ContentResolver cr, String name, float value) { 89 get(cr).put(name, value); 90 return true; 91 } 92 93 @Implementation getFloat(ContentResolver cr, String name, float def)94 public static float getFloat(ContentResolver cr, String name, float def) { 95 if (get(cr).get(name) instanceof Float) { 96 return (Float) get(cr).get(name); 97 } else { 98 return def; 99 } 100 } 101 102 @Implementation getFloat(ContentResolver cr, String name)103 public static float getFloat(ContentResolver cr, String name) throws Settings.SettingNotFoundException { 104 if (get(cr).get(name) instanceof Float) { 105 return (Float) get(cr).get(name); 106 } else { 107 throw new Settings.SettingNotFoundException(name); 108 } 109 } 110 111 @Implementation get(ContentResolver cr)112 private static Map<String, Object> get(ContentResolver cr) { 113 Map<String, Object> map = dataMap.get(cr); 114 if (map == null) { 115 map = new HashMap<String, Object>(); 116 dataMap.put(cr, map); 117 } 118 return map; 119 } 120 } 121 122 @Implements(Settings.System.class) 123 public static class ShadowSystem extends SettingsImpl { 124 } 125 126 @Implements(Settings.Secure.class) 127 public static class ShadowSecure extends SettingsImpl { 128 } 129 130 @Implements(Settings.Global.class) 131 public static class ShadowGlobal extends SettingsImpl { 132 } 133 134 /** 135 * Non-Android accessor that allows the value of the AIRPLANE_MODE_ON setting to be set. 136 * 137 * @param isAirplaneMode new status for airplane mode 138 */ setAirplaneMode(boolean isAirplaneMode)139 public static void setAirplaneMode(boolean isAirplaneMode) { 140 Settings.System.putInt(Robolectric.application.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, isAirplaneMode ? 1 : 0); 141 } 142 143 /** 144 * Non-Android accessor that allows the value of the WIFI_ON setting to be set. 145 * 146 * @param isOn new status for wifi mode 147 */ setWifiOn(boolean isOn)148 public static void setWifiOn(boolean isOn) { 149 Settings.Secure.putInt(Robolectric.application.getContentResolver(), Settings.Secure.WIFI_ON, isOn ? 1 : 0); 150 } 151 152 /** 153 * Non-Android accessor thatallows the value of the TIME_12_24 setting to be set. 154 * 155 * @param use24HourTimeFormat new status for the time setting 156 */ set24HourTimeFormat(boolean use24HourTimeFormat)157 public static void set24HourTimeFormat(boolean use24HourTimeFormat) { 158 Settings.System.putInt(Robolectric.application.getContentResolver(), Settings.System.TIME_12_24, use24HourTimeFormat ? 24 : 12); 159 } 160 } 161