diff options
| author | 2020-03-02 17:59:48 -0500 | |
|---|---|---|
| committer | 2020-03-12 15:33:23 +0000 | |
| commit | df6bdb5bafbe7c88f621fb155de803cc10cadd6b (patch) | |
| tree | 2d5903bb72ca905a4c9c439bd5483381cfbd0d6d | |
| parent | d3c7f0c2cb000b6eb37736121da9588c8207a2e5 (diff) | |
Migrate dark theme settings
When restoring settings from a different phone,
UiModeManager did not update the new settings.
Now, the settings are loaded from local storage and changes applied
when the SettingsHelper restores a value of interest
Bug: 138671559
Test: manual test: reset phone1, setup, used data transfer tool to restore from phone2, check dark mode is the same as phone 2
Change-Id: I861bec342b3284e0f398c8610fcc6881c27601a5
6 files changed, 63 insertions, 2 deletions
diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java index 8fa98c85fc33..d350d9df37b8 100644 --- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java +++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java @@ -141,6 +141,8 @@ public class SecureSettings { Settings.Secure.NOTIFICATION_NEW_INTERRUPTION_MODEL, Settings.Secure.TRUST_AGENTS_EXTEND_UNLOCK, Settings.Secure.UI_NIGHT_MODE, + Settings.Secure.DARK_THEME_CUSTOM_START_TIME, + Settings.Secure.DARK_THEME_CUSTOM_END_TIME, Settings.Secure.LOCK_SCREEN_WHEN_TRUST_LOST, Settings.Secure.SKIP_DIRECTION, Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES, diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java index 75c5f9581820..4d33b627f4e2 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java @@ -28,6 +28,7 @@ import static android.provider.settings.validators.SettingsValidators.LOCALE_VAL import static android.provider.settings.validators.SettingsValidators.NON_NEGATIVE_INTEGER_VALIDATOR; import static android.provider.settings.validators.SettingsValidators.NULLABLE_COMPONENT_NAME_VALIDATOR; import static android.provider.settings.validators.SettingsValidators.PACKAGE_NAME_VALIDATOR; +import static android.provider.settings.validators.SettingsValidators.NONE_NEGATIVE_LONG_VALIDATOR; import static android.provider.settings.validators.SettingsValidators.TILE_LIST_VALIDATOR; import static android.provider.settings.validators.SettingsValidators.TTS_LIST_VALIDATOR; @@ -235,7 +236,9 @@ public class SecureSettingsValidators { VALIDATORS.put(Secure.AWARE_TAP_PAUSE_TOUCH_COUNT, NON_NEGATIVE_INTEGER_VALIDATOR); VALIDATORS.put(Secure.ODI_CAPTIONS_ENABLED, BOOLEAN_VALIDATOR); VALIDATORS.put(Secure.DARK_MODE_DIALOG_SEEN, BOOLEAN_VALIDATOR); - VALIDATORS.put(Secure.UI_NIGHT_MODE, new InclusiveIntegerRangeValidator(0, 2)); + VALIDATORS.put(Secure.UI_NIGHT_MODE, NON_NEGATIVE_INTEGER_VALIDATOR); + VALIDATORS.put(Secure.DARK_THEME_CUSTOM_START_TIME, NONE_NEGATIVE_LONG_VALIDATOR); + VALIDATORS.put(Secure.DARK_THEME_CUSTOM_END_TIME, NONE_NEGATIVE_LONG_VALIDATOR); VALIDATORS.put(Secure.GLOBAL_ACTIONS_PANEL_ENABLED, BOOLEAN_VALIDATOR); VALIDATORS.put(Secure.AWARE_LOCK_ENABLED, BOOLEAN_VALIDATOR); VALIDATORS.put(Secure.DISPLAY_DENSITY_FORCED, NON_NEGATIVE_INTEGER_VALIDATOR); diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java index 71c7544a3a4c..8d5c6e69b850 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/SettingsValidators.java @@ -207,4 +207,15 @@ public class SettingsValidators { static final Validator ACCESSIBILITY_SHORTCUT_TARGET_LIST_VALIDATOR = new AccessibilityShortcutTargetListValidator(); + + static final Validator NONE_NEGATIVE_LONG_VALIDATOR = new Validator() { + @Override + public boolean validate(String value) { + try { + return Long.parseLong(value) >= 0; + } catch (NumberFormatException e) { + return false; + } + } + }; } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java index 36bb8ef62320..b6e31d26a088 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java @@ -75,6 +75,9 @@ public class SettingsHelper { sBroadcastOnRestore.add(Settings.Secure.ENABLED_VR_LISTENERS); sBroadcastOnRestore.add(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); sBroadcastOnRestore.add(Settings.Global.BLUETOOTH_ON); + sBroadcastOnRestore.add(Settings.Secure.UI_NIGHT_MODE); + sBroadcastOnRestore.add(Settings.Secure.DARK_THEME_CUSTOM_START_TIME); + sBroadcastOnRestore.add(Settings.Secure.DARK_THEME_CUSTOM_END_TIME); } private interface SettingsLookup { diff --git a/packages/SettingsProvider/test/src/android/provider/settings/validators/SettingsValidatorsTest.java b/packages/SettingsProvider/test/src/android/provider/settings/validators/SettingsValidatorsTest.java index bb9e6f6fe885..9134d875097e 100644 --- a/packages/SettingsProvider/test/src/android/provider/settings/validators/SettingsValidatorsTest.java +++ b/packages/SettingsProvider/test/src/android/provider/settings/validators/SettingsValidatorsTest.java @@ -277,6 +277,27 @@ public class SettingsValidatorsTest { } @Test + public void testPositiveLongValidator_zero() { + assertTrue(SettingsValidators.NONE_NEGATIVE_LONG_VALIDATOR.validate("0")); + } + + @Test + public void testPositiveLongValidator_negative() { + assertFalse(SettingsValidators.NONE_NEGATIVE_LONG_VALIDATOR.validate("-5")); + } + + + @Test + public void testPositiveLongValidator_positive() { + assertTrue(SettingsValidators.NONE_NEGATIVE_LONG_VALIDATOR.validate("5")); + } + + @Test + public void testPositiveLongValidator_floatFormat() { + assertFalse(SettingsValidators.NONE_NEGATIVE_LONG_VALIDATOR.validate("4.4756")); + } + + @Test public void testTTSListValidator_withNullInput_returnsFalse() { assertFalse(SettingsValidators.TTS_LIST_VALIDATOR.validate(null)); } diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java index 7c833faee1bd..eace86b7b976 100644 --- a/services/core/java/com/android/server/UiModeManagerService.java +++ b/services/core/java/com/android/server/UiModeManagerService.java @@ -75,7 +75,9 @@ import java.time.DateTimeException; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; @@ -293,7 +295,7 @@ final class UiModeManagerService extends SystemService { public void onChange(boolean selfChange, Uri uri) { synchronized (mLock) { // setup wizard is done now so we can unblock - if (setupWizardCompleteForCurrentUser()) { + if (setupWizardCompleteForCurrentUser() && !selfChange) { mSetupWizardComplete = true; getContext().getContentResolver() .unregisterContentObserver(mSetupWizardObserver); @@ -348,6 +350,9 @@ final class UiModeManagerService extends SystemService { IntentFilter batteryFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); context.registerReceiver(mBatteryReceiver, batteryFilter); + context.registerReceiver(mSettingsRestored, + new IntentFilter(Intent.ACTION_SETTING_RESTORED), null, mHandler); + mLocalPowerManager = LocalServices.getService(PowerManagerInternal.class); initPowerSave(); @@ -395,6 +400,22 @@ final class UiModeManagerService extends SystemService { mHandler.post(() -> updateSystemProperties()); } + private final BroadcastReceiver mSettingsRestored = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + List<String> settings = Arrays.asList( + Secure.UI_NIGHT_MODE, Secure.DARK_THEME_CUSTOM_START_TIME, + Secure.DARK_THEME_CUSTOM_END_TIME); + if (settings.contains(intent.getExtras().getCharSequence(Intent.EXTRA_SETTING_NAME))) { + synchronized (mLock) { + updateNightModeFromSettingsLocked(context, context.getResources(), + UserHandle.getCallingUserId()); + updateConfigurationLocked(); + } + } + } + }; + private void initPowerSave() { mPowerSave = mLocalPowerManager.getLowPowerState(ServiceType.NIGHT_MODE) |