From f7f6d141483f98683e18a45307cc4a92b413e018 Mon Sep 17 00:00:00 2001 From: d34d Date: Fri, 13 Nov 2015 16:28:03 -0800 Subject: [PATCH] CMSettings: Validate name and value for System settings Verify that the name and value being inserted/updated are correct. Change-Id: I0243556701b1d303ca52135178b055c2fd87671c --- .../cmsettings/CMSettingsProvider.java | 29 +- .../cyanogenmod/providers/CMSettings.java | 693 +++++++++++++++++- 2 files changed, 717 insertions(+), 5 deletions(-) diff --git a/packages/CMSettingsProvider/src/org/cyanogenmod/cmsettings/CMSettingsProvider.java b/packages/CMSettingsProvider/src/org/cyanogenmod/cmsettings/CMSettingsProvider.java index 9521364..cdd4291 100644 --- a/packages/CMSettingsProvider/src/org/cyanogenmod/cmsettings/CMSettingsProvider.java +++ b/packages/CMSettingsProvider/src/org/cyanogenmod/cmsettings/CMSettingsProvider.java @@ -20,7 +20,6 @@ import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.ContentProvider; import android.content.ContentResolver; -import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.Intent; @@ -29,7 +28,6 @@ import android.content.SharedPreferences; import android.content.UriMatcher; import android.content.pm.PackageManager; import android.content.pm.UserInfo; -import android.content.res.Configuration; import android.database.AbstractCursor; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; @@ -505,12 +503,18 @@ public class CMSettingsProvider extends ContentProvider { CMDatabaseHelper dbHelper = getOrEstablishDatabase(getUserIdForTable(tableName, userId)); + // Validate value if inserting int System table + final String name = values.getAsString(Settings.NameValueTable.NAME); + if (CMDatabaseHelper.CMTableNames.TABLE_SYSTEM.equals(tableName)) { + final String value = values.getAsString(Settings.NameValueTable.VALUE); + validateSystemSettingNameValue(name, value); + } + SQLiteDatabase db = dbHelper.getWritableDatabase(); long rowId = db.insert(tableName, null, values); Uri returnUri = null; if (rowId > -1) { - String name = values.getAsString(Settings.NameValueTable.NAME); returnUri = Uri.withAppendedPath(uri, name); notifyChange(returnUri, tableName, userId); if (LOCAL_LOGV) Log.d(TAG, "Inserted row id: " + rowId + " into tableName: " + @@ -568,6 +572,13 @@ public class CMSettingsProvider extends ContentProvider { String tableName = getTableNameFromUri(uri); checkWritePermissions(tableName); + // Validate value if updating System table + final String name = values.getAsString(Settings.NameValueTable.NAME); + if (CMDatabaseHelper.CMTableNames.TABLE_SYSTEM.equals(tableName)) { + final String value = values.getAsString(Settings.NameValueTable.VALUE); + validateSystemSettingNameValue(name, value); + } + int callingUserId = UserHandle.getCallingUserId(); CMDatabaseHelper dbHelper = getOrEstablishDatabase(getUserIdForTable(tableName, callingUserId)); @@ -763,5 +774,17 @@ public class CMSettingsProvider extends ContentProvider { if (LOCAL_LOGV) Log.v(TAG, "notifying for " + notifyTarget + ": " + uri); } + private void validateSystemSettingNameValue(String name, String value) { + CMSettings.System.Validator validator = CMSettings.System.VALIDATORS.get(name); + if (validator == null) { + throw new IllegalArgumentException("Invalid setting: " + name); + } + + if (!validator.validate(value)) { + throw new IllegalArgumentException("Invalid value: " + value + + " for setting: " + name); + } + } + // TODO Add caching } diff --git a/src/java/cyanogenmod/providers/CMSettings.java b/src/java/cyanogenmod/providers/CMSettings.java index cd7645f..aafceae 100644 --- a/src/java/cyanogenmod/providers/CMSettings.java +++ b/src/java/cyanogenmod/providers/CMSettings.java @@ -29,12 +29,18 @@ import android.os.UserHandle; import android.provider.Settings; import android.text.TextUtils; import android.util.AndroidException; +import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Log; +import com.android.internal.util.ArrayUtils; + import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.regex.Pattern; /** @@ -272,12 +278,53 @@ public final class CMSettings { public static final String SYS_PROP_CM_SETTING_VERSION = "sys.cm_settings_system_version"; + /** @hide */ + public static interface Validator { + public boolean validate(String value); + } + private static final NameValueCache sNameValueCache = new NameValueCache( SYS_PROP_CM_SETTING_VERSION, CONTENT_URI, CALL_METHOD_GET_SYSTEM, CALL_METHOD_PUT_SYSTEM); + private static final Validator sBooleanValidator = + new DiscreteValueValidator(new String[] {"0", "1"}); + + private static final Validator sNonNegativeIntegerValidator = new Validator() { + @Override + public boolean validate(String value) { + try { + return Integer.parseInt(value) >= 0; + } catch (NumberFormatException e) { + return false; + } + } + }; + + private static final Validator sUriValidator = new Validator() { + @Override + public boolean validate(String value) { + try { + Uri.decode(value); + return true; + } catch (IllegalArgumentException e) { + return false; + } + } + }; + + private static final Validator sColorValidator = + new InclusiveIntegerRangeValidator(Integer.MIN_VALUE, Integer.MAX_VALUE); + + private static final Validator sAlwaysTrueValidator = new Validator() { + @Override + public boolean validate(String value) { + return true; + } + }; + // region Methods /** @@ -624,6 +671,96 @@ public final class CMSettings { // endregion + private static final class DiscreteValueValidator implements Validator { + private final String[] mValues; + + public DiscreteValueValidator(String[] values) { + mValues = values; + } + + @Override + public boolean validate(String value) { + return ArrayUtils.contains(mValues, value); + } + } + + private static final class InclusiveIntegerRangeValidator implements Validator { + private final int mMin; + private final int mMax; + + public InclusiveIntegerRangeValidator(int min, int max) { + mMin = min; + mMax = max; + } + + @Override + public boolean validate(String value) { + try { + final int intValue = Integer.parseInt(value); + return intValue >= mMin && intValue <= mMax; + } catch (NumberFormatException e) { + return false; + } + } + } + + private static final class InclusiveFloatRangeValidator implements Validator { + private final float mMin; + private final float mMax; + + public InclusiveFloatRangeValidator(float min, float max) { + mMin = min; + mMax = max; + } + + @Override + public boolean validate(String value) { + try { + final float floatValue = Float.parseFloat(value); + return floatValue >= mMin && floatValue <= mMax; + } catch (NumberFormatException e) { + return false; + } + } + } + + private static final class DelimitedListValidator implements Validator { + private final ArraySet mValidValueSet; + private final String mDelimiter; + private final boolean mAllowEmptyList; + + public DelimitedListValidator(String[] validValues, String delimiter, + boolean allowEmptyList) { + mValidValueSet = new ArraySet(Arrays.asList(validValues)); + mDelimiter = delimiter; + mAllowEmptyList = allowEmptyList; + } + + @Override + public boolean validate(String value) { + ArraySet values = new ArraySet(); + if (!TextUtils.isEmpty(value)) { + final String[] array = TextUtils.split(value, Pattern.quote(mDelimiter)); + for (String item : array) { + if (TextUtils.isEmpty(item)) { + continue; + } + values.add(item); + } + } + if (values.size() > 0) { + values.removeAll(mValidValueSet); + // values.size() will be non-zero if it contains any values not in + // mValidValueSet + return values.size() == 0; + } else if (mAllowEmptyList) { + return true; + } + + return false; + } + } + // region System Settings /** @@ -633,6 +770,10 @@ public final class CMSettings { */ public static final String QS_QUICK_PULLDOWN = "qs_quick_pulldown"; + /** @hide */ + public static final Validator QS_QUICK_PULLDOWN_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 2); + /** * Whether to attach a queue to media notifications. * 0 = 0ff, 1 = on @@ -640,6 +781,9 @@ public final class CMSettings { */ public static final String NOTIFICATION_PLAY_QUEUE = "notification_play_queue"; + /** @hide */ + public static final Validator NOTIFICATION_PLAY_QUEUE_VALIDATOR = sBooleanValidator; + /** * Whether the HighTouchSensitivity is activated or not. * 0 = off, 1 = on @@ -648,12 +792,20 @@ public final class CMSettings { public static final String HIGH_TOUCH_SENSITIVITY_ENABLE = "high_touch_sensitivity_enable"; + /** @hide */ + public static final Validator HIGH_TOUCH_SENSITIVITY_ENABLE_VALIDATOR = + sBooleanValidator; + /** * Show the pending notification counts as overlays on the status bar * @hide */ public static final String SYSTEM_PROFILES_ENABLED = "system_profiles_enabled"; + /** @hide */ + public static final Validator SYSTEM_PROFILES_ENABLED_VALIDATOR = + sBooleanValidator; + /** * Whether to hide the clock, show it in the right or left * position or show it in the center @@ -666,6 +818,10 @@ public final class CMSettings { */ public static final String STATUS_BAR_CLOCK = "status_bar_clock"; + /** @hide */ + public static final Validator STATUS_BAR_CLOCK_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 3); + /** * Display style of AM/PM next to clock in status bar * 0: Normal display (Eclair stock) @@ -676,6 +832,10 @@ public final class CMSettings { */ public static final String STATUS_BAR_AM_PM = "status_bar_am_pm"; + /** @hide */ + public static final Validator STATUS_BAR_AM_PM_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 2); + /** * Display style of the status bar battery information * 0: Display the battery an icon in portrait mode @@ -688,6 +848,10 @@ public final class CMSettings { */ public static final String STATUS_BAR_BATTERY_STYLE = "status_bar_battery_style"; + /** @hide */ + public static final Validator STATUS_BAR_BATTERY_STYLE_VALIDATOR = + new DiscreteValueValidator(new String[] {"0", "2", "4", "5", "6"}); + /** * Status bar battery % * 0: Hide the battery percentage @@ -695,8 +859,12 @@ public final class CMSettings { * 2: Display the battery percentage next to the icon * @hide */ - public static final String STATUS_BAR_SHOW_BATTERY_PERCENT = "status_bar_show_battery_percent"; - // endregion + public static final String STATUS_BAR_SHOW_BATTERY_PERCENT = + "status_bar_show_battery_percent"; + + /** @hide */ + public static final Validator STATUS_BAR_SHOW_BATTERY_PERCENT_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 2); /** * Whether the phone ringtone should be played in an increasing manner @@ -704,18 +872,29 @@ public final class CMSettings { */ public static final String INCREASING_RING = "increasing_ring"; + /** @hide */ + public static final Validator INCREASING_RING_VALIDATOR = sBooleanValidator; + /** * Start volume fraction for increasing ring volume * @hide */ public static final String INCREASING_RING_START_VOLUME = "increasing_ring_start_vol"; + /** @hide */ + public static final Validator INCREASING_RING_START_VOLUME_VALIDATOR = + new InclusiveFloatRangeValidator(0, 1); + /** * Ramp up time (seconds) for increasing ring * @hide */ public static final String INCREASING_RING_RAMP_UP_TIME = "increasing_ring_ramp_up_time"; + /** @hide */ + public static final Validator INCREASING_RING_RAMP_UP_TIME_VALIDATOR = + new InclusiveIntegerRangeValidator(5, 60); + /** * Volume Adjust Sounds Enable, This is the noise made when using volume hard buttons * Defaults to 1 - sounds enabled @@ -723,12 +902,21 @@ public final class CMSettings { */ public static final String VOLUME_ADJUST_SOUNDS_ENABLED = "volume_adjust_sounds_enabled"; + /** @hide */ + public static final Validator VOLUME_ADJUST_SOUNDS_ENABLED_VALIDATOR = + sBooleanValidator; + /** * Navigation controls to Use * @hide */ public static final String NAV_BUTTONS = "nav_buttons"; + /** @hide */ + public static final Validator NAV_BUTTONS_VALIDATOR = + new DelimitedListValidator(new String[] {"empty", "home", "back", "search", + "recent", "menu0", "menu1", "menu2", "dpad_left", "dpad_right"}, "|", true); + /** * Volume key controls ringtone or media sound stream * @hide @@ -736,6 +924,10 @@ public final class CMSettings { public static final String VOLUME_KEYS_CONTROL_RING_STREAM = "volume_keys_control_ring_stream"; + /** @hide */ + public static final Validator VOLUME_KEYS_CONTROL_RING_STREAM_VALIDATOR = + sBooleanValidator; + /** * boolean value. toggles using arrow key locations on nav bar * as left and right dpad keys @@ -743,6 +935,10 @@ public final class CMSettings { */ public static final String NAVIGATION_BAR_MENU_ARROW_KEYS = "navigation_bar_menu_arrow_keys"; + /** @hide */ + public static final Validator NAVIGATION_BAR_MENU_ARROW_KEYS_VALIDATOR = + sBooleanValidator; + /** * Action to perform when the home key is long-pressed. * (Default can be configured via config_longPressOnHomeBehavior) @@ -759,6 +955,10 @@ public final class CMSettings { */ public static final String KEY_HOME_LONG_PRESS_ACTION = "key_home_long_press_action"; + /** @hide */ + public static final Validator KEY_HOME_LONG_PRESS_ACTION_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 8); + /** * Action to perform when the home key is double-tapped. * (Default can be configured via config_doubleTapOnHomeBehavior) @@ -767,24 +967,40 @@ public final class CMSettings { */ public static final String KEY_HOME_DOUBLE_TAP_ACTION = "key_home_double_tap_action"; + /** @hide */ + public static final Validator KEY_HOME_DOUBLE_TAP_ACTION_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 8); + /** * Whether to wake the screen with the back key, the value is boolean. * @hide */ public static final String BACK_WAKE_SCREEN = "back_wake_screen"; + /** @hide */ + public static final Validator BACK_WAKE_SCREEN_VALIDATOR = + sBooleanValidator; + /** * Whether to wake the screen with the menu key, the value is boolean. * @hide */ public static final String MENU_WAKE_SCREEN = "menu_wake_screen"; + /** @hide */ + public static final Validator MENU_WAKE_SCREENN_VALIDATOR = + sBooleanValidator; + /** * Whether to wake the screen with the volume keys, the value is boolean. * @hide */ public static final String VOLUME_WAKE_SCREEN = "volume_wake_screen"; + /** @hide */ + public static final Validator VOLUME_WAKE_SCREEN_VALIDATOR = + sBooleanValidator; + /** * Action to perform when the menu key is pressed. (Default is 1) * (See KEY_HOME_LONG_PRESS_ACTION for valid values) @@ -792,6 +1008,10 @@ public final class CMSettings { */ public static final String KEY_MENU_ACTION = "key_menu_action"; + /** @hide */ + public static final Validator KEY_MENU_ACTION_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 8); + /** * Action to perform when the menu key is long-pressed. * (Default is 0 on devices with a search key, 3 on devices without) @@ -800,6 +1020,10 @@ public final class CMSettings { */ public static final String KEY_MENU_LONG_PRESS_ACTION = "key_menu_long_press_action"; + /** @hide */ + public static final Validator KEY_MENU_LONG_PRESS_ACTION_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 8); + /** * Action to perform when the assistant (search) key is pressed. (Default is 3) * (See KEY_HOME_LONG_PRESS_ACTION for valid values) @@ -807,6 +1031,10 @@ public final class CMSettings { */ public static final String KEY_ASSIST_ACTION = "key_assist_action"; + /** @hide */ + public static final Validator KEY_ASSIST_ACTION_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 8); + /** * Action to perform when the assistant (search) key is long-pressed. (Default is 4) * (See KEY_HOME_LONG_PRESS_ACTION for valid values) @@ -814,6 +1042,10 @@ public final class CMSettings { */ public static final String KEY_ASSIST_LONG_PRESS_ACTION = "key_assist_long_press_action"; + /** @hide */ + public static final Validator KEY_ASSIST_LONG_PRESS_ACTION_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 8); + /** * Action to perform when the app switch key is pressed. (Default is 2) * (See KEY_HOME_LONG_PRESS_ACTION for valid values) @@ -821,6 +1053,10 @@ public final class CMSettings { */ public static final String KEY_APP_SWITCH_ACTION = "key_app_switch_action"; + /** @hide */ + public static final Validator KEY_APP_SWITCH_ACTION_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 8); + /** * Action to perform when the app switch key is long-pressed. (Default is 0) * (See KEY_HOME_LONG_PRESS_ACTION for valid values) @@ -828,42 +1064,70 @@ public final class CMSettings { */ public static final String KEY_APP_SWITCH_LONG_PRESS_ACTION = "key_app_switch_long_press_action"; + /** @hide */ + public static final Validator KEY_APP_SWITCH_LONG_PRESS_ACTION_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 8); + /** * Whether to wake the screen with the home key, the value is boolean. * @hide */ public static final String HOME_WAKE_SCREEN = "home_wake_screen"; + /** @hide */ + public static final Validator HOME_WAKE_SCREEN_VALIDATOR = + sBooleanValidator; + /** * Whether to wake the screen with the assist key, the value is boolean. * @hide */ public static final String ASSIST_WAKE_SCREEN = "assist_wake_screen"; + /** @hide */ + public static final Validator ASSIST_WAKE_SCREEN_VALIDATOR = + sBooleanValidator; + /** * Whether to wake the screen with the app switch key, the value is boolean. * @hide */ public static final String APP_SWITCH_WAKE_SCREEN = "app_switch_wake_screen"; + /** @hide */ + public static final Validator APP_SWITCH_WAKE_SCREEN_VALIDATOR = + sBooleanValidator; + /** * Whether to wake the screen with the camera key half-press. * @hide */ public static final String CAMERA_WAKE_SCREEN = "camera_wake_screen"; + /** @hide */ + public static final Validator CAMERA_WAKE_SCREEN_VALIDATOR = + sBooleanValidator; + /** * Whether or not to send device back to sleep if Camera button is released ("Peek") * @hide */ public static final String CAMERA_SLEEP_ON_RELEASE = "camera_sleep_on_release"; + /** @hide */ + public static final Validator CAMERA_SLEEP_ON_RELEASE_VALIDATOR = + sBooleanValidator; + /** * Whether to launch secure camera app when key is longpressed * @hide */ public static final String CAMERA_LAUNCH = "camera_launch"; + /** @hide */ + public static final Validator CAMERA_LAUNCH_VALIDATOR = + sBooleanValidator; + /** * Swap volume buttons when the screen is rotated * 0 - Disabled @@ -873,6 +1137,10 @@ public final class CMSettings { */ public static final String SWAP_VOLUME_KEYS_ON_ROTATION = "swap_volume_keys_on_rotation"; + /** @hide */ + public static final Validator SWAP_VOLUME_KEYS_ON_ROTATION_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 2); + /** * Whether the battery light should be enabled (if hardware supports it) * The value is boolean (1 or 0). @@ -880,6 +1148,10 @@ public final class CMSettings { */ public static final String BATTERY_LIGHT_ENABLED = "battery_light_enabled"; + /** @hide */ + public static final Validator BATTERY_LIGHT_ENABLED_VALIDATOR = + sBooleanValidator; + /** * Whether the battery LED should repeatedly flash when the battery is low * on charge. The value is boolean (1 or 0). @@ -887,36 +1159,60 @@ public final class CMSettings { */ public static final String BATTERY_LIGHT_PULSE = "battery_light_pulse"; + /** @hide */ + public static final Validator BATTERY_LIGHT_PULSE_VALIDATOR = + sBooleanValidator; + /** * What color to use for the battery LED while charging - low * @hide */ public static final String BATTERY_LIGHT_LOW_COLOR = "battery_light_low_color"; + /** @hide */ + public static final Validator BATTERY_LIGHT_LOW_COLOR_VALIDATOR = + sColorValidator; + /** * What color to use for the battery LED while charging - medium * @hide */ public static final String BATTERY_LIGHT_MEDIUM_COLOR = "battery_light_medium_color"; + /** @hide */ + public static final Validator BATTERY_LIGHT_MEDIUM_COLOR_VALIDATOR = + sColorValidator; + /** * What color to use for the battery LED while charging - full * @hide */ public static final String BATTERY_LIGHT_FULL_COLOR = "battery_light_full_color"; + /** @hide */ + public static final Validator BATTERY_LIGHT_FULL_COLOR_VALIDATOR = + sColorValidator; + /** * Sprint MWI Quirk: Show message wait indicator notifications * @hide */ public static final String ENABLE_MWI_NOTIFICATION = "enable_mwi_notification"; + /** @hide */ + public static final Validator ENABLE_MWI_NOTIFICATION_VALIDATOR = + sBooleanValidator; + /** * Check the proximity sensor during wakeup * @hide */ public static final String PROXIMITY_ON_WAKE = "proximity_on_wake"; + /** @hide */ + public static final Validator PROXIMITY_ON_WAKE_VALIDATOR = + sBooleanValidator; + /** * Enable looking up of phone numbers of nearby places * @@ -924,6 +1220,10 @@ public final class CMSettings { */ public static final String ENABLE_FORWARD_LOOKUP = "enable_forward_lookup"; + /** @hide */ + public static final Validator ENABLE_FORWARD_LOOKUP_VALIDATOR = + sBooleanValidator; + /** * Enable looking up of phone numbers of people * @@ -931,6 +1231,10 @@ public final class CMSettings { */ public static final String ENABLE_PEOPLE_LOOKUP = "enable_people_lookup"; + /** @hide */ + public static final Validator ENABLE_PEOPLE_LOOKUP_VALIDATOR = + sBooleanValidator; + /** * Enable looking up of information of phone numbers not in the contacts * @@ -938,6 +1242,10 @@ public final class CMSettings { */ public static final String ENABLE_REVERSE_LOOKUP = "enable_reverse_lookup"; + /** @hide */ + public static final Validator ENABLE_REVERSE_LOOKUP_VALIDATOR = + sBooleanValidator; + /** * The forward lookup provider * @@ -945,6 +1253,9 @@ public final class CMSettings { */ public static final String FORWARD_LOOKUP_PROVIDER = "forward_lookup_provider"; + /** @hide */ + public static final Validator FORWARD_LOOKUP_PROVIDER_VALIDATOR = sAlwaysTrueValidator; + /** * The people lookup provider * @@ -952,6 +1263,9 @@ public final class CMSettings { */ public static final String PEOPLE_LOOKUP_PROVIDER = "people_lookup_provider"; + /** @hide */ + public static final Validator PEOPLE_LOOKUP_PROVIDER_VALIDATOR = sAlwaysTrueValidator; + /** * The reverse lookup provider * @@ -959,6 +1273,9 @@ public final class CMSettings { */ public static final String REVERSE_LOOKUP_PROVIDER = "reverse_lookup_provider"; + /** @hide */ + public static final Validator REVERSE_LOOKUP_PROVIDER_VALIDATOR = sAlwaysTrueValidator; + /** * The OpenCNAM paid account ID * @@ -966,6 +1283,10 @@ public final class CMSettings { */ public static final String DIALER_OPENCNAM_ACCOUNT_SID = "dialer_opencnam_account_sid"; + /** @hide */ + public static final Validator DIALER_OPENCNAM_ACCOUNT_SID_VALIDATOR = + sAlwaysTrueValidator; + /** * The OpenCNAM authentication token * @@ -973,84 +1294,160 @@ public final class CMSettings { */ public static final String DIALER_OPENCNAM_AUTH_TOKEN = "dialer_opencnam_auth_token"; + /** @hide */ + public static final Validator DIALER_OPENCNAM_AUTH_TOKEN_VALIDATOR = + sAlwaysTrueValidator; + /** * Color temperature of the display during the day * @hide */ public static final String DISPLAY_TEMPERATURE_DAY = "display_temperature_day"; + /** @hide */ + public static final Validator DISPLAY_TEMPERATURE_DAY_VALIDATOR = + new InclusiveIntegerRangeValidator(1000, 10000); + /** * Color temperature of the display at night * @hide */ public static final String DISPLAY_TEMPERATURE_NIGHT = "display_temperature_night"; + /** @hide */ + public static final Validator DISPLAY_TEMPERATURE_NIGHT_VALIDATOR = + new InclusiveIntegerRangeValidator(1000, 10000); + /** * Display color temperature adjustment mode, one of DAY (default), NIGHT, or AUTO. * @hide */ public static final String DISPLAY_TEMPERATURE_MODE = "display_temperature_mode"; + /** @hide */ + public static final Validator DISPLAY_TEMPERATURE_MODE_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 4); + /** * Automatic outdoor mode * @hide */ public static final String DISPLAY_AUTO_OUTDOOR_MODE = "display_auto_outdoor_mode"; + /** @hide */ + public static final Validator DISPLAY_AUTO_OUTDOOR_MODE_VALIDATOR = + sBooleanValidator; + /** * Use display power saving features such as CABC or CABL * @hide */ public static final String DISPLAY_LOW_POWER = "display_low_power"; + /** @hide */ + public static final Validator DISPLAY_LOW_POWER_VALIDATOR = + sBooleanValidator; + /** * Use color enhancement feature of display * @hide */ public static final String DISPLAY_COLOR_ENHANCE = "display_color_enhance"; + /** @hide */ + public static final Validator DISPLAY_COLOR_ENHANCE_VALIDATOR = + sBooleanValidator; + /** * Manual display color adjustments (RGB values as floats, separated by spaces) * @hide */ public static final String DISPLAY_COLOR_ADJUSTMENT = "display_color_adjustment"; + /** @hide */ + public static final Validator DISPLAY_COLOR_ADJUSTMENT_VALIDATOR = + new Validator() { + @Override + public boolean validate(String value) { + String[] colorAdjustment = value == null ? + null : value.split(" "); + if (colorAdjustment != null && colorAdjustment.length != 3) { + return false; + } + Validator floatValidator = new InclusiveFloatRangeValidator(0, 1); + return colorAdjustment == null || + floatValidator.validate(colorAdjustment[0]) && + floatValidator.validate(colorAdjustment[1]) && + floatValidator.validate(colorAdjustment[2]); + } + }; + /** * Did we tell about how they can stop breaking their eyes? * @hide */ public static final String LIVE_DISPLAY_HINTED = "live_display_hinted"; + /** @hide */ + public static final Validator LIVE_DISPLAY_HINTED_VALIDATOR = + sBooleanValidator; + /** * Enable statusbar double tap gesture on to put device to sleep * @hide */ public static final String DOUBLE_TAP_SLEEP_GESTURE = "double_tap_sleep_gesture"; + /** @hide */ + public static final Validator DOUBLE_TAP_SLEEP_GESTURE_VALIDATOR = + sBooleanValidator; + /** * Boolean value on whether to show weather in the statusbar * @hide */ public static final String STATUS_BAR_SHOW_WEATHER = "status_bar_show_weather"; + /** @hide */ + public static final Validator STATUS_BAR_SHOW_WEATHER_VALIDATOR = + sBooleanValidator; + /** * Show search bar in recents * @hide */ public static final String RECENTS_SHOW_SEARCH_BAR = "recents_show_search_bar"; + /** @hide */ + public static final Validator RECENTS_SHOW_SEARCH_BAR_VALIDATOR = + sBooleanValidator; + /** * Whether navigation bar is placed on the left side in landscape mode * @hide */ public static final String NAVBAR_LEFT_IN_LANDSCAPE = "navigation_bar_left"; + /** @hide */ + public static final Validator NAVBAR_LEFT_IN_LANDSCAPE_VALIDATOR = + sBooleanValidator; + /** * Locale for secondary overlay on dialer for t9 search input * @hide */ public static final String T9_SEARCH_INPUT_LOCALE = "t9_search_input_locale"; + /** @hide */ + public static final Validator T9_SEARCH_INPUT_LOCALE_VALIDATOR = + new Validator() { + @Override + public boolean validate(String value) { + final Locale locale = new Locale(value); + return ArrayUtils.contains(Locale.getAvailableLocales(), locale); + } + }; + /** * If all file types can be accepted over Bluetooth OBEX. * @hide @@ -1058,6 +1455,10 @@ public final class CMSettings { public static final String BLUETOOTH_ACCEPT_ALL_FILES = "bluetooth_accept_all_files"; + /** @hide */ + public static final Validator BLUETOOTH_ACCEPT_ALL_FILES_VALIDATOR = + sBooleanValidator; + /** * Whether to scramble a pin unlock layout * @hide @@ -1065,29 +1466,49 @@ public final class CMSettings { public static final String LOCKSCREEN_PIN_SCRAMBLE_LAYOUT = "lockscreen_scramble_pin_layout"; + /** @hide */ + public static final Validator LOCKSCREEN_PIN_SCRAMBLE_LAYOUT_VALIDATOR = + sBooleanValidator; + /** * @hide */ public static final String SHOW_ALARM_ICON = "show_alarm_icon"; + /** @hide */ + public static final Validator SHOW_ALARM_ICON_VALIDATOR = + sBooleanValidator; + /** * Whether to show the IME switcher in the status bar * @hide */ public static final String STATUS_BAR_IME_SWITCHER = "status_bar_ime_switcher"; + /** @hide */ + public static final Validator STATUS_BAR_IME_SWITCHER_VALIDATOR = + sBooleanValidator; + /** Whether to allow one finger quick settings expansion on the right side of the statusbar. * * @hide */ public static final String STATUS_BAR_QUICK_QS_PULLDOWN = "status_bar_quick_qs_pulldown"; + /** @hide */ + public static final Validator STATUS_BAR_QUICK_QS_PULLDOWN_VALIDATOR = + sBooleanValidator; + /** Whether to show the brightness slider in quick settings panel. * * @hide */ public static final String QS_SHOW_BRIGHTNESS_SLIDER = "qs_show_brightness_slider"; + /** @hide */ + public static final Validator QS_SHOW_BRIGHTNESS_SLIDER_VALIDATOR = + sBooleanValidator; + /** * Whether to control brightness from status bar * @@ -1095,24 +1516,40 @@ public final class CMSettings { */ public static final String STATUS_BAR_BRIGHTNESS_CONTROL = "status_bar_brightness_control"; + /** @hide */ + public static final Validator STATUS_BAR_BRIGHTNESS_CONTROL_VALIDATOR = + sBooleanValidator; + /** * Whether or not volume button music controls should be enabled to seek media tracks * @hide */ public static final String VOLBTN_MUSIC_CONTROLS = "volbtn_music_controls"; + /** @hide */ + public static final Validator VOLBTN_MUSIC_CONTROLS_VALIDATOR = + sBooleanValidator; + /** * Use EdgeGesture Service for system gestures in PhoneWindowManager * @hide */ public static final String USE_EDGE_SERVICE_FOR_GESTURES = "edge_service_for_gestures"; + /** @hide */ + public static final Validator USE_EDGE_SERVICE_FOR_GESTURES_VALIDATOR = + sBooleanValidator; + /** * Show the pending notification counts as overlays on the status bar * @hide */ public static final String STATUS_BAR_NOTIF_COUNT = "status_bar_notif_count"; + /** @hide */ + public static final Validator STATUS_BAR_NOTIF_COUNT_VALIDATOR = + sBooleanValidator; + /** * Call recording format value * 0: AMR_WB @@ -1122,13 +1559,22 @@ public final class CMSettings { */ public static final String CALL_RECORDING_FORMAT = "call_recording_format"; + /** @hide */ + public static final Validator CALL_RECORDING_FORMAT_VALIDATOR = + new InclusiveIntegerRangeValidator(0, 1); + /** * Contains the notifications light maximum brightness to use. + * Values range from 1 to 255 * @hide */ public static final String NOTIFICATION_LIGHT_BRIGHTNESS_LEVEL = "notification_light_brightness_level"; + /** @hide */ + public static final Validator NOTIFICATION_LIGHT_BRIGHTNESS_LEVEL_VALIDATOR = + new InclusiveIntegerRangeValidator(1, 255); + /** * Whether to use the all the LEDs for the notifications or just one. * @hide @@ -1136,6 +1582,10 @@ public final class CMSettings { public static final String NOTIFICATION_LIGHT_MULTIPLE_LEDS_ENABLE = "notification_light_multiple_leds_enable"; + /** @hide */ + public static final Validator NOTIFICATION_LIGHT_MULTIPLE_LEDS_ENABLE_VALIDATOR = + sBooleanValidator; + /** * Whether to allow notifications with the screen on or DayDreams. * The value is boolean (1 or 0). Default will always be false. @@ -1144,6 +1594,10 @@ public final class CMSettings { public static final String NOTIFICATION_LIGHT_SCREEN_ON = "notification_light_screen_on_enable"; + /** @hide */ + public static final Validator NOTIFICATION_LIGHT_SCREEN_ON_VALIDATOR = + sBooleanValidator; + /** * What color to use for the notification LED by default * @hide @@ -1151,6 +1605,10 @@ public final class CMSettings { public static final String NOTIFICATION_LIGHT_PULSE_DEFAULT_COLOR = "notification_light_pulse_default_color"; + /** @hide */ + public static final Validator NOTIFICATION_LIGHT_PULSE_DEFAULT_COLOR_VALIDATOR = + sColorValidator; + /** * How long to flash the notification LED by default * @hide @@ -1158,6 +1616,10 @@ public final class CMSettings { public static final String NOTIFICATION_LIGHT_PULSE_DEFAULT_LED_ON = "notification_light_pulse_default_led_on"; + /** @hide */ + public static final Validator NOTIFICATION_LIGHT_PULSE_DEFAULT_LED_ON_VALIDATOR = + sNonNegativeIntegerValidator; + /** * How long to wait between flashes for the notification LED by default * @hide @@ -1165,6 +1627,10 @@ public final class CMSettings { public static final String NOTIFICATION_LIGHT_PULSE_DEFAULT_LED_OFF = "notification_light_pulse_default_led_off"; + /** @hide */ + public static final Validator NOTIFICATION_LIGHT_PULSE_DEFAULT_LED_OFF_VALIDATOR = + sNonNegativeIntegerValidator; + /** * What color to use for the missed call notification LED * @hide @@ -1172,6 +1638,10 @@ public final class CMSettings { public static final String NOTIFICATION_LIGHT_PULSE_CALL_COLOR = "notification_light_pulse_call_color"; + /** @hide */ + public static final Validator NOTIFICATION_LIGHT_PULSE_CALL_COLOR_VALIDATOR = + sColorValidator; + /** * How long to flash the missed call notification LED * @hide @@ -1179,12 +1649,21 @@ public final class CMSettings { public static final String NOTIFICATION_LIGHT_PULSE_CALL_LED_ON = "notification_light_pulse_call_led_on"; + /** @hide */ + public static final Validator NOTIFICATION_LIGHT_PULSE_CALL_LED_ON_VALIDATOR = + sNonNegativeIntegerValidator; + /** * How long to wait between flashes for the missed call notification LED * @hide */ public static final String NOTIFICATION_LIGHT_PULSE_CALL_LED_OFF = "notification_light_pulse_call_led_off"; + + /** @hide */ + public static final Validator NOTIFICATION_LIGHT_PULSE_CALL_LED_OFF_VALIDATOR = + sNonNegativeIntegerValidator; + /** * What color to use for the voicemail notification LED * @hide @@ -1192,6 +1671,10 @@ public final class CMSettings { public static final String NOTIFICATION_LIGHT_PULSE_VMAIL_COLOR = "notification_light_pulse_vmail_color"; + /** @hide */ + public static final Validator NOTIFICATION_LIGHT_PULSE_VMAIL_COLOR_VALIDATOR = + sColorValidator; + /** * How long to flash the voicemail notification LED * @hide @@ -1199,6 +1682,10 @@ public final class CMSettings { public static final String NOTIFICATION_LIGHT_PULSE_VMAIL_LED_ON = "notification_light_pulse_vmail_led_on"; + /** @hide */ + public static final Validator NOTIFICATION_LIGHT_PULSE_VMAIL_LED_ON_VALIDATOR = + sNonNegativeIntegerValidator; + /** * How long to wait between flashes for the voicemail notification LED * @hide @@ -1206,6 +1693,10 @@ public final class CMSettings { public static final String NOTIFICATION_LIGHT_PULSE_VMAIL_LED_OFF = "notification_light_pulse_vmail_led_off"; + /** @hide */ + public static final Validator NOTIFICATION_LIGHT_PULSE_VMAIL_LED_OFF_VALIDATOR = + sNonNegativeIntegerValidator; + /** * Whether to use the custom LED values for the notification pulse LED. * @hide @@ -1213,6 +1704,10 @@ public final class CMSettings { public static final String NOTIFICATION_LIGHT_PULSE_CUSTOM_ENABLE = "notification_light_pulse_custom_enable"; + /** @hide */ + public static final Validator NOTIFICATION_LIGHT_PULSE_CUSTOM_ENABLE_VALIDATOR = + sBooleanValidator; + /** * Which custom LED values to use for the notification pulse LED. * @hide @@ -1220,6 +1715,70 @@ public final class CMSettings { public static final String NOTIFICATION_LIGHT_PULSE_CUSTOM_VALUES = "notification_light_pulse_custom_values"; + /** @hide */ + public static final Validator NOTIFICATION_LIGHT_PULSE_CUSTOM_VALUES_VALIDATOR = + new Validator() { + @Override + public boolean validate(String value) { + if (TextUtils.isEmpty(value)) { + return true; + } + + for (String packageValuesString : value.split("\\|")) { + String[] packageValues = packageValuesString.split("="); + if (packageValues.length != 2) { + if (LOCAL_LOGV) { + Log.d(TAG, "Incorrect number of package values: " + + packageValues.length); + } + return false; + } + String packageName = packageValues[0]; + if (TextUtils.isEmpty(packageName)) { + if (LOCAL_LOGV) Log.d(TAG, "Empty package name"); + return false; + } + String[] values = packageValues[1].split(";"); + if (values.length != 3) { + if (LOCAL_LOGV) { + Log.d(TAG, "Incorrect number of values: " + values.length); + } + return false; + } + try { + // values[0] is LED color + if (!sColorValidator.validate(values[0])) { + if (LOCAL_LOGV) { + Log.d(TAG, "Invalid LED color (" + values[0] + ") for " + + packageName); + } + return false; + } + // values[1] is the LED on time and should be non-negative + if (!sNonNegativeIntegerValidator.validate(values[1])) { + if (LOCAL_LOGV) { + Log.d(TAG, "Invalid LED on time (" + values[1] + ") for " + + packageName); + } + return false; + } + // values[1] is the LED off time and should be non-negative + if (!sNonNegativeIntegerValidator.validate(values[2])) { + if (LOCAL_LOGV) { + Log.d(TAG, "Invalid LED off time (" + values[2] + ") for " + + packageName); + } + return false; + } + } catch (NumberFormatException e) { + return false; + } + } + // if we make it all the way through then the data is considered valid + return true; + } + }; + /** * @hide */ @@ -1317,6 +1876,136 @@ public final class CMSettings { public static boolean isLegacySetting(String key) { return ArrayUtils.contains(LEGACY_SYSTEM_SETTINGS, key); } + + /** + * Mapping of validators for all system settings. This map is used to validate both valid + * keys as well as validating the values for those keys. + * + * Note: Make sure if you add a new System setting you create a Validator for it and add + * it to this map. + * + * @hide + */ + public static final Map VALIDATORS = + new ArrayMap(); + static { + VALIDATORS.put(QS_QUICK_PULLDOWN, QS_QUICK_PULLDOWN_VALIDATOR); + VALIDATORS.put(NOTIFICATION_PLAY_QUEUE, NOTIFICATION_PLAY_QUEUE_VALIDATOR); + VALIDATORS.put(HIGH_TOUCH_SENSITIVITY_ENABLE, + HIGH_TOUCH_SENSITIVITY_ENABLE_VALIDATOR); + VALIDATORS.put(SYSTEM_PROFILES_ENABLED, SYSTEM_PROFILES_ENABLED_VALIDATOR); + VALIDATORS.put(STATUS_BAR_CLOCK, STATUS_BAR_CLOCK_VALIDATOR); + VALIDATORS.put(STATUS_BAR_AM_PM, STATUS_BAR_AM_PM_VALIDATOR); + VALIDATORS.put(STATUS_BAR_BATTERY_STYLE, STATUS_BAR_BATTERY_STYLE_VALIDATOR); + VALIDATORS.put(STATUS_BAR_SHOW_BATTERY_PERCENT, + STATUS_BAR_SHOW_BATTERY_PERCENT_VALIDATOR); + VALIDATORS.put(INCREASING_RING, INCREASING_RING_VALIDATOR); + VALIDATORS.put(INCREASING_RING_START_VOLUME, + INCREASING_RING_START_VOLUME_VALIDATOR); + VALIDATORS.put(INCREASING_RING_RAMP_UP_TIME, + INCREASING_RING_RAMP_UP_TIME_VALIDATOR); + VALIDATORS.put(VOLUME_ADJUST_SOUNDS_ENABLED, + VOLUME_ADJUST_SOUNDS_ENABLED_VALIDATOR); + VALIDATORS.put(NAV_BUTTONS, NAV_BUTTONS_VALIDATOR); + VALIDATORS.put(VOLUME_KEYS_CONTROL_RING_STREAM, + VOLUME_KEYS_CONTROL_RING_STREAM_VALIDATOR); + VALIDATORS.put(NAVIGATION_BAR_MENU_ARROW_KEYS, + NAVIGATION_BAR_MENU_ARROW_KEYS_VALIDATOR); + VALIDATORS.put(KEY_HOME_LONG_PRESS_ACTION, KEY_HOME_LONG_PRESS_ACTION_VALIDATOR); + VALIDATORS.put(KEY_HOME_DOUBLE_TAP_ACTION, KEY_HOME_DOUBLE_TAP_ACTION_VALIDATOR); + VALIDATORS.put(BACK_WAKE_SCREEN, BACK_WAKE_SCREEN_VALIDATOR); + VALIDATORS.put(MENU_WAKE_SCREEN, MENU_WAKE_SCREENN_VALIDATOR); + VALIDATORS.put(VOLUME_WAKE_SCREEN, VOLUME_WAKE_SCREEN_VALIDATOR); + VALIDATORS.put(KEY_MENU_ACTION, KEY_MENU_ACTION_VALIDATOR); + VALIDATORS.put(KEY_MENU_LONG_PRESS_ACTION, KEY_MENU_LONG_PRESS_ACTION_VALIDATOR); + VALIDATORS.put(KEY_ASSIST_ACTION, KEY_ASSIST_ACTION_VALIDATOR); + VALIDATORS.put(KEY_ASSIST_LONG_PRESS_ACTION, + KEY_ASSIST_LONG_PRESS_ACTION_VALIDATOR); + VALIDATORS.put(KEY_APP_SWITCH_ACTION, KEY_APP_SWITCH_ACTION_VALIDATOR); + VALIDATORS.put(KEY_APP_SWITCH_LONG_PRESS_ACTION, + KEY_APP_SWITCH_LONG_PRESS_ACTION_VALIDATOR); + VALIDATORS.put(HOME_WAKE_SCREEN, HOME_WAKE_SCREEN_VALIDATOR); + VALIDATORS.put(ASSIST_WAKE_SCREEN, ASSIST_WAKE_SCREEN_VALIDATOR); + VALIDATORS.put(APP_SWITCH_WAKE_SCREEN, APP_SWITCH_WAKE_SCREEN_VALIDATOR); + VALIDATORS.put(CAMERA_WAKE_SCREEN, CAMERA_WAKE_SCREEN_VALIDATOR); + VALIDATORS.put(CAMERA_SLEEP_ON_RELEASE, CAMERA_SLEEP_ON_RELEASE_VALIDATOR); + VALIDATORS.put(CAMERA_LAUNCH, CAMERA_LAUNCH_VALIDATOR); + VALIDATORS.put(SWAP_VOLUME_KEYS_ON_ROTATION, + SWAP_VOLUME_KEYS_ON_ROTATION_VALIDATOR); + VALIDATORS.put(BATTERY_LIGHT_ENABLED, BATTERY_LIGHT_ENABLED_VALIDATOR); + VALIDATORS.put(BATTERY_LIGHT_PULSE, BATTERY_LIGHT_PULSE_VALIDATOR); + VALIDATORS.put(BATTERY_LIGHT_LOW_COLOR, BATTERY_LIGHT_LOW_COLOR_VALIDATOR); + VALIDATORS.put(BATTERY_LIGHT_MEDIUM_COLOR, BATTERY_LIGHT_MEDIUM_COLOR_VALIDATOR); + VALIDATORS.put(BATTERY_LIGHT_FULL_COLOR, BATTERY_LIGHT_FULL_COLOR_VALIDATOR); + VALIDATORS.put(ENABLE_MWI_NOTIFICATION, ENABLE_MWI_NOTIFICATION_VALIDATOR); + VALIDATORS.put(PROXIMITY_ON_WAKE, PROXIMITY_ON_WAKE_VALIDATOR); + VALIDATORS.put(ENABLE_FORWARD_LOOKUP, ENABLE_FORWARD_LOOKUP_VALIDATOR); + VALIDATORS.put(ENABLE_PEOPLE_LOOKUP, ENABLE_PEOPLE_LOOKUP_VALIDATOR); + VALIDATORS.put(ENABLE_REVERSE_LOOKUP, ENABLE_REVERSE_LOOKUP_VALIDATOR); + VALIDATORS.put(FORWARD_LOOKUP_PROVIDER, FORWARD_LOOKUP_PROVIDER_VALIDATOR); + VALIDATORS.put(PEOPLE_LOOKUP_PROVIDER, PEOPLE_LOOKUP_PROVIDER_VALIDATOR); + VALIDATORS.put(REVERSE_LOOKUP_PROVIDER, REVERSE_LOOKUP_PROVIDER_VALIDATOR); + VALIDATORS.put(DIALER_OPENCNAM_ACCOUNT_SID, + DIALER_OPENCNAM_ACCOUNT_SID_VALIDATOR); + VALIDATORS.put(DIALER_OPENCNAM_AUTH_TOKEN, DIALER_OPENCNAM_AUTH_TOKEN_VALIDATOR); + VALIDATORS.put(DISPLAY_TEMPERATURE_DAY, DISPLAY_TEMPERATURE_DAY_VALIDATOR); + VALIDATORS.put(DISPLAY_TEMPERATURE_NIGHT, DISPLAY_TEMPERATURE_NIGHT_VALIDATOR); + VALIDATORS.put(DISPLAY_TEMPERATURE_MODE, DISPLAY_TEMPERATURE_MODE_VALIDATOR); + VALIDATORS.put(DISPLAY_AUTO_OUTDOOR_MODE, DISPLAY_AUTO_OUTDOOR_MODE_VALIDATOR); + VALIDATORS.put(DISPLAY_LOW_POWER, DISPLAY_LOW_POWER_VALIDATOR); + VALIDATORS.put(DISPLAY_COLOR_ENHANCE, DISPLAY_COLOR_ENHANCE_VALIDATOR); + VALIDATORS.put(DISPLAY_COLOR_ADJUSTMENT, DISPLAY_COLOR_ADJUSTMENT_VALIDATOR); + VALIDATORS.put(LIVE_DISPLAY_HINTED, LIVE_DISPLAY_HINTED_VALIDATOR); + VALIDATORS.put(DOUBLE_TAP_SLEEP_GESTURE, DOUBLE_TAP_SLEEP_GESTURE_VALIDATOR); + VALIDATORS.put(STATUS_BAR_SHOW_WEATHER, STATUS_BAR_SHOW_WEATHER_VALIDATOR); + VALIDATORS.put(RECENTS_SHOW_SEARCH_BAR, RECENTS_SHOW_SEARCH_BAR_VALIDATOR); + VALIDATORS.put(NAVBAR_LEFT_IN_LANDSCAPE, NAVBAR_LEFT_IN_LANDSCAPE_VALIDATOR); + VALIDATORS.put(T9_SEARCH_INPUT_LOCALE, T9_SEARCH_INPUT_LOCALE_VALIDATOR); + VALIDATORS.put(BLUETOOTH_ACCEPT_ALL_FILES, BLUETOOTH_ACCEPT_ALL_FILES_VALIDATOR); + VALIDATORS.put(LOCKSCREEN_PIN_SCRAMBLE_LAYOUT, + LOCKSCREEN_PIN_SCRAMBLE_LAYOUT_VALIDATOR); + VALIDATORS.put(SHOW_ALARM_ICON, SHOW_ALARM_ICON_VALIDATOR); + VALIDATORS.put(STATUS_BAR_IME_SWITCHER, STATUS_BAR_IME_SWITCHER_VALIDATOR); + VALIDATORS.put(STATUS_BAR_QUICK_QS_PULLDOWN, + STATUS_BAR_QUICK_QS_PULLDOWN_VALIDATOR); + VALIDATORS.put(QS_SHOW_BRIGHTNESS_SLIDER, QS_SHOW_BRIGHTNESS_SLIDER_VALIDATOR); + VALIDATORS.put(STATUS_BAR_BRIGHTNESS_CONTROL, + STATUS_BAR_BRIGHTNESS_CONTROL_VALIDATOR); + VALIDATORS.put(VOLBTN_MUSIC_CONTROLS, VOLBTN_MUSIC_CONTROLS_VALIDATOR); + VALIDATORS.put(USE_EDGE_SERVICE_FOR_GESTURES, + USE_EDGE_SERVICE_FOR_GESTURES_VALIDATOR); + VALIDATORS.put(STATUS_BAR_NOTIF_COUNT, STATUS_BAR_NOTIF_COUNT_VALIDATOR); + VALIDATORS.put(CALL_RECORDING_FORMAT, CALL_RECORDING_FORMAT_VALIDATOR); + VALIDATORS.put(NOTIFICATION_LIGHT_BRIGHTNESS_LEVEL, + NOTIFICATION_LIGHT_BRIGHTNESS_LEVEL_VALIDATOR); + VALIDATORS.put(NOTIFICATION_LIGHT_MULTIPLE_LEDS_ENABLE, + NOTIFICATION_LIGHT_MULTIPLE_LEDS_ENABLE_VALIDATOR); + VALIDATORS.put(NOTIFICATION_LIGHT_SCREEN_ON, + NOTIFICATION_LIGHT_SCREEN_ON_VALIDATOR); + VALIDATORS.put(NOTIFICATION_LIGHT_PULSE_DEFAULT_COLOR, + NOTIFICATION_LIGHT_PULSE_DEFAULT_COLOR_VALIDATOR); + VALIDATORS.put(NOTIFICATION_LIGHT_PULSE_DEFAULT_LED_ON, + NOTIFICATION_LIGHT_PULSE_DEFAULT_LED_ON_VALIDATOR); + VALIDATORS.put(NOTIFICATION_LIGHT_PULSE_DEFAULT_LED_OFF, + NOTIFICATION_LIGHT_PULSE_DEFAULT_LED_OFF_VALIDATOR); + VALIDATORS.put(NOTIFICATION_LIGHT_PULSE_CALL_COLOR, + NOTIFICATION_LIGHT_PULSE_CALL_COLOR_VALIDATOR); + VALIDATORS.put(NOTIFICATION_LIGHT_PULSE_CALL_LED_ON, + NOTIFICATION_LIGHT_PULSE_CALL_LED_ON_VALIDATOR); + VALIDATORS.put(NOTIFICATION_LIGHT_PULSE_CALL_LED_OFF, + NOTIFICATION_LIGHT_PULSE_CALL_LED_OFF_VALIDATOR); + VALIDATORS.put(NOTIFICATION_LIGHT_PULSE_VMAIL_COLOR, + NOTIFICATION_LIGHT_PULSE_VMAIL_COLOR_VALIDATOR); + VALIDATORS.put(NOTIFICATION_LIGHT_PULSE_VMAIL_LED_ON, + NOTIFICATION_LIGHT_PULSE_VMAIL_LED_ON_VALIDATOR); + VALIDATORS.put(NOTIFICATION_LIGHT_PULSE_VMAIL_LED_OFF, + NOTIFICATION_LIGHT_PULSE_VMAIL_LED_OFF_VALIDATOR); + VALIDATORS.put(NOTIFICATION_LIGHT_PULSE_CUSTOM_ENABLE, + NOTIFICATION_LIGHT_PULSE_CUSTOM_ENABLE_VALIDATOR); + VALIDATORS.put(NOTIFICATION_LIGHT_PULSE_CUSTOM_VALUES, + NOTIFICATION_LIGHT_PULSE_CUSTOM_VALUES_VALIDATOR); + }; + // endregion } /**