diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index 2d351c74bf547..d93c0150410d3 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -1313,7 +1313,8 @@ final class SettingsState { } // isValuePreservedInRestore shouldn't change back to false if it has been set to true. - boolean isPreserved = shouldPreserveSetting(overrideableByRestore, resetToDefault); + boolean isPreserved = shouldPreserveSetting(overrideableByRestore, resetToDefault, + packageName, value); // Is something gonna change? if (Objects.equals(value, this.value) @@ -1339,11 +1340,16 @@ final class SettingsState { } private boolean shouldPreserveSetting(boolean overrideableByRestore, - boolean resetToDefault) { + boolean resetToDefault, String packageName, String value) { if (resetToDefault) { // By default settings are not marked as preserved. return false; } + if (value != null && value.equals(this.value) + && SYSTEM_PACKAGE_NAME.equals(packageName)) { + // Do not mark preserved if it's the system reinitializing to the same value. + return false; + } // isValuePreservedInRestore shouldn't change back to false if it has been set to true. return this.isValuePreservedInRestore || !overrideableByRestore; diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java index 6a3c6619c0efc..9f448af7f3448 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsStateTest.java @@ -47,6 +47,7 @@ public class SettingsStateTest extends AndroidTestCase { "日本語"; private static final String TEST_PACKAGE = "package"; + private static final String SYSTEM_PACKAGE = "android"; private static final String SETTING_NAME = "test_setting"; private final Object mLock = new Object(); @@ -253,6 +254,26 @@ public class SettingsStateTest extends AndroidTestCase { } + public void testModifySettingBySystemPackage_sameValue_preserveFlagNotSet() { + SettingsState settingsState = getSettingStateObject(); + // Initialize the setting. + settingsState.insertSettingLocked(SETTING_NAME, "1", null, false, SYSTEM_PACKAGE); + // Update the setting. + settingsState.insertSettingLocked(SETTING_NAME, "1", null, false, SYSTEM_PACKAGE); + + assertFalse(settingsState.getSettingLocked(SETTING_NAME).isValuePreservedInRestore()); + } + + public void testModifySettingBySystemPackage_newValue_preserveFlagSet() { + SettingsState settingsState = getSettingStateObject(); + // Initialize the setting. + settingsState.insertSettingLocked(SETTING_NAME, "1", null, false, SYSTEM_PACKAGE); + // Update the setting. + settingsState.insertSettingLocked(SETTING_NAME, "2", null, false, SYSTEM_PACKAGE); + + assertTrue(settingsState.getSettingLocked(SETTING_NAME).isValuePreservedInRestore()); + } + private SettingsState getSettingStateObject() { SettingsState settingsState = new SettingsState(getContext(), mLock, mSettingsFile, 1, SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, Looper.getMainLooper());