From 137015599e666b0a6dc5bfd696025ad61b17d6c7 Mon Sep 17 00:00:00 2001 From: Svet Ganov Date: Thu, 23 Feb 2017 12:45:17 -0800 Subject: [PATCH] Ensure default and system set bits grandfathered We added the notion of a default and whether the system set the setting. This is used for resetting the internal state and we need to make sure this value is updated for the existing settings, otherwise we would delete system set settings while they should stay unmodified. Test: manual bug:35317326 Change-Id: Iaffde2e7acab53653fd38e669a644e654cc7cd7d --- .../providers/settings/SettingsProvider.java | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 521b8d7c99258..93a00fec9765a 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -2737,7 +2737,7 @@ public class SettingsProvider extends ContentProvider { } private final class UpgradeController { - private static final int SETTINGS_VERSION = 141; + private static final int SETTINGS_VERSION = 142; private final int mUserId; @@ -3262,6 +3262,26 @@ public class SettingsProvider extends ContentProvider { currentVersion = 141; } + if (currentVersion == 141) { + // Version 141: We added the notion of a default and whether the system set + // the setting. This is used for resetting the internal state and we need + // to make sure this value is updated for the existing settings, otherwise + // we would delete system set settings while they should stay unmodified. + SettingsState globalSettings = getGlobalSettingsLocked(); + ensureLegacyDefaultValueAndSystemSetUpdatedLocked(globalSettings); + globalSettings.persistSyncLocked(); + + SettingsState secureSettings = getSecureSettingsLocked(mUserId); + ensureLegacyDefaultValueAndSystemSetUpdatedLocked(secureSettings); + secureSettings.persistSyncLocked(); + + SettingsState systemSettings = getSystemSettingsLocked(mUserId); + ensureLegacyDefaultValueAndSystemSetUpdatedLocked(systemSettings); + systemSettings.persistSyncLocked(); + + currentVersion = 142; + } + if (currentVersion != newVersion) { Slog.wtf("SettingsProvider", "warning: upgrading settings database to version " + newVersion + " left it at " @@ -3277,5 +3297,22 @@ public class SettingsProvider extends ContentProvider { return currentVersion; } } + + private void ensureLegacyDefaultValueAndSystemSetUpdatedLocked(SettingsState settings) { + List names = settings.getSettingNamesLocked(); + final int nameCount = names.size(); + for (int i = 0; i < nameCount; i++) { + String name = names.get(i); + Setting setting = settings.getSettingLocked(name); + if (setting.getDefaultValue() == null) { + boolean systemSet = SettingsState.isSystemPackage(getContext(), + setting.getPackageName()); + if (systemSet) { + settings.insertSettingLocked(name, setting.getValue(), + setting.getTag(), true, setting.getPackageName()); + } + } + } + } } }