summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Al Sutton <alsutton@google.com> 2019-08-08 12:14:23 +0100
committer Al Sutton <alsutton@google.com> 2019-08-12 16:59:14 +0100
commit867ded271a81a6d06c3ebb01f1285844c02b8ea9 (patch)
tree9a8764783567b5e9e05f26c5cb60f258f6f2fa16
parent776091060501bde926c1d642ad0270b802aff6c6 (diff)
Fix logic in validators
Fixes: 138953494 Test: atest SettingsValidatorsTest Change-Id: I3c4387275f775ea9f9622bef8d8ca4b889b19c0b
-rw-r--r--core/java/android/provider/Settings.java55
-rw-r--r--core/java/android/provider/SettingsValidators.java46
-rw-r--r--core/tests/coretests/src/android/provider/SettingsValidatorsTest.java49
3 files changed, 102 insertions, 48 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 7df1ebe15d44..0bdb23edf21f 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -7110,24 +7110,8 @@ public final class Settings {
*/
public static final String TTS_DEFAULT_LOCALE = "tts_default_locale";
- private static final Validator TTS_DEFAULT_LOCALE_VALIDATOR = new Validator() {
- @Override
- public boolean validate(@Nullable String value) {
- if (value == null || value.length() == 0) {
- return false;
- }
- String[] ttsLocales = value.split(",");
- boolean valid = true;
- for (String ttsLocale : ttsLocales) {
- String[] parts = ttsLocale.split(":");
- valid |= ((parts.length == 2)
- && (parts[0].length() > 0)
- && ANY_STRING_VALIDATOR.validate(parts[0])
- && LOCALE_VALIDATOR.validate(parts[1]));
- }
- return valid;
- }
- };
+ private static final Validator TTS_DEFAULT_LOCALE_VALIDATOR =
+ new SettingsValidators.TTSListValidator();
/**
* Space delimited list of plugin packages that are enabled.
@@ -8647,25 +8631,13 @@ public final class Settings {
/**
* Holds comma separated list of ordering of QS tiles.
+ *
* @hide
*/
public static final String QS_TILES = "sysui_qs_tiles";
- private static final Validator QS_TILES_VALIDATOR = new Validator() {
- @Override
- public boolean validate(@Nullable String value) {
- if (value == null) {
- return false;
- }
- String[] tiles = value.split(",");
- boolean valid = true;
- for (String tile : tiles) {
- // tile can be any non-empty string as specified by OEM
- valid |= ((tile.length() > 0) && ANY_STRING_VALIDATOR.validate(tile));
- }
- return valid;
- }
- };
+ private static final Validator QS_TILES_VALIDATOR =
+ new SettingsValidators.TileListValidator();
/**
* Specifies whether the web action API is enabled.
@@ -8731,21 +8703,8 @@ public final class Settings {
*/
public static final String QS_AUTO_ADDED_TILES = "qs_auto_tiles";
- private static final Validator QS_AUTO_ADDED_TILES_VALIDATOR = new Validator() {
- @Override
- public boolean validate(@Nullable String value) {
- if (value == null) {
- return false;
- }
- String[] tiles = value.split(",");
- boolean valid = true;
- for (String tile : tiles) {
- // tile can be any non-empty string as specified by OEM
- valid |= ((tile.length() > 0) && ANY_STRING_VALIDATOR.validate(tile));
- }
- return valid;
- }
- };
+ private static final Validator QS_AUTO_ADDED_TILES_VALIDATOR =
+ new SettingsValidators.TileListValidator();
/**
* Whether the Lockdown button should be shown in the power menu.
diff --git a/core/java/android/provider/SettingsValidators.java b/core/java/android/provider/SettingsValidators.java
index 405121378d1f..e4cf9fd6aaee 100644
--- a/core/java/android/provider/SettingsValidators.java
+++ b/core/java/android/provider/SettingsValidators.java
@@ -283,4 +283,50 @@ public class SettingsValidators {
return true;
}
}
+
+ private abstract static class ListValidator implements Validator {
+ public boolean validate(@Nullable String value) {
+ if (!isEntryValid(value)) {
+ return false;
+ }
+ String[] items = value.split(",");
+ for (String item : items) {
+ if (!isItemValid(item)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ protected abstract boolean isEntryValid(String entry);
+
+ protected abstract boolean isItemValid(String item);
+ }
+
+ /** Ensure a restored value is a string in the format the text-to-speech system handles */
+ public static final class TTSListValidator extends ListValidator {
+ protected boolean isEntryValid(String entry) {
+ return entry != null && entry.length() > 0;
+ }
+
+ protected boolean isItemValid(String item) {
+ String[] parts = item.split(":");
+ // Replaces any old language separator (-) with the new one (_)
+ return ((parts.length == 2)
+ && (parts[0].length() > 0)
+ && ANY_STRING_VALIDATOR.validate(parts[0])
+ && LOCALE_VALIDATOR.validate(parts[1].replace('-', '_')));
+ }
+ }
+
+ /** Ensure a restored value is suitable to be used as a tile name */
+ public static final class TileListValidator extends ListValidator {
+ protected boolean isEntryValid(String entry) {
+ return entry != null;
+ }
+
+ protected boolean isItemValid(String item) {
+ return item.length() > 0 && ANY_STRING_VALIDATOR.validate(item);
+ }
+ }
}
diff --git a/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java b/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java
index 8081e9e6c67b..eea8c83e036b 100644
--- a/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java
@@ -255,6 +255,55 @@ public class SettingsValidatorsTest {
}
@Test
+ public void testTTSListValidator_withValidInput_returnsTrue() {
+ Validator v = new SettingsValidators.TTSListValidator();
+
+ assertTrue(v.validate("com.foo.ttsengine:en-US,com.bar.ttsengine:es_ES"));
+ }
+
+ @Test
+ public void testTTSListValidator_withInvalidInput_returnsFalse() {
+ Validator v = new SettingsValidators.TTSListValidator();
+
+ assertFalse(v.validate("com.foo.ttsengine:eng-USA,INVALID"));
+ }
+
+ @Test
+ public void testTTSListValidator_withEmptyInput_returnsFalse() {
+ Validator v = new SettingsValidators.TTSListValidator();
+
+ assertFalse(v.validate(""));
+ }
+
+ @Test
+ public void testTTSListValidator_withNullInput_returnsFalse() {
+ Validator v = new SettingsValidators.TTSListValidator();
+
+ assertFalse(v.validate(null));
+ }
+
+ @Test
+ public void testTileListValidator_withValidInput_returnsTrue() {
+ Validator v = new SettingsValidators.TileListValidator();
+
+ assertTrue(v.validate("1,2,3,4"));
+ }
+
+ @Test
+ public void testTileListValidator_withMissingValue_returnsFalse() {
+ Validator v = new SettingsValidators.TileListValidator();
+
+ assertFalse(v.validate("1,,3"));
+ }
+
+ @Test
+ public void testTileListValidator_withNullInput_returnsFalse() {
+ Validator v = new SettingsValidators.TileListValidator();
+
+ assertFalse(v.validate(null));
+ }
+
+ @Test
public void ensureAllBackedUpGlobalSettingsHaveValidators() {
String offenders = getOffenders(concat(Settings.Global.SETTINGS_TO_BACKUP,
Settings.Global.LEGACY_RESTORE_SETTINGS), Settings.Global.VALIDATORS);