diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2017-08-17 17:27:49 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-08-17 17:27:49 +0000 |
commit | b044109732f88d7c56cbd37fe27547fe4f20fef9 (patch) | |
tree | 3a81683832a2e1d75d06598e3e0b86548747fb0d | |
parent | 89becc539f7e1184bc0260ebe51e880ae807b384 (diff) | |
parent | 61b9b21916fca68b5e991e1fd43e48b61d4138dc (diff) | |
download | base-b044109732f88d7c56cbd37fe27547fe4f20fef9.tar.gz |
Merge cherrypicks of [2749916] into oc-r4-releaseandroid-8.0.0_r10
Change-Id: Ice4e4b8556ffddcd902769cf50ea4e39f01f4a75
-rw-r--r-- | packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java | 83 | ||||
-rw-r--r-- | packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java | 24 |
2 files changed, 84 insertions, 23 deletions
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index f5d7dd8d9acd..973d21c80616 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -2895,7 +2895,7 @@ public class SettingsProvider extends ContentProvider { } private final class UpgradeController { - private static final int SETTINGS_VERSION = 145; + private static final int SETTINGS_VERSION = 146; private final int mUserId; @@ -3421,22 +3421,11 @@ public class SettingsProvider extends ContentProvider { } if (currentVersion == 141) { - // Version 142: 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(); - + // This implementation was incorrectly setting the current value of + // settings changed by non-system packages as the default which default + // is set by the system. We add a new upgrade step at the end to properly + // handle this case which would also fix incorrect changes made by the + // old implementation of this step. currentVersion = 142; } @@ -3496,6 +3485,31 @@ public class SettingsProvider extends ContentProvider { currentVersion = 145; } + if (currentVersion == 145) { + // Version 146: In step 142 we had a bug where incorrectly + // some settings were considered system set and as a result + // made the default and marked as the default being set by + // the system. Here reevaluate the default and default system + // set flags. This would both fix corruption by the old impl + // of step 142 and also properly handle devices which never + // run 142. + if (userId == UserHandle.USER_SYSTEM) { + SettingsState globalSettings = getGlobalSettingsLocked(); + ensureLegacyDefaultValueAndSystemSetUpdatedLocked(globalSettings, userId); + globalSettings.persistSyncLocked(); + } + + SettingsState secureSettings = getSecureSettingsLocked(mUserId); + ensureLegacyDefaultValueAndSystemSetUpdatedLocked(secureSettings, userId); + secureSettings.persistSyncLocked(); + + SettingsState systemSettings = getSystemSettingsLocked(mUserId); + ensureLegacyDefaultValueAndSystemSetUpdatedLocked(systemSettings, userId); + systemSettings.persistSyncLocked(); + + currentVersion = 146; + } + // vXXX: Add new settings above this point. if (currentVersion != newVersion) { @@ -3514,19 +3528,46 @@ public class SettingsProvider extends ContentProvider { } } - private void ensureLegacyDefaultValueAndSystemSetUpdatedLocked(SettingsState settings) { + private void ensureLegacyDefaultValueAndSystemSetUpdatedLocked(SettingsState settings, + int userId) { List<String> 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()); + + // In the upgrade case we pretend the call is made from the app + // that made the last change to the setting to properly determine + // whether the call has been made by a system component. + int callingUid = -1; + try { + callingUid = mPackageManager.getPackageUid(setting.getPackageName(), 0, userId); + } catch (RemoteException e) { + /* ignore - handled below */ + } + if (callingUid < 0) { + Slog.e(LOG_TAG, "Unknown package: " + setting.getPackageName()); + continue; + } + try { + final boolean systemSet = SettingsState.isSystemPackage(getContext(), + setting.getPackageName(), callingUid); if (systemSet) { settings.insertSettingLocked(name, setting.getValue(), setting.getTag(), true, setting.getPackageName()); + } else if (setting.getDefaultValue() != null && setting.isDefaultFromSystem()) { + // We had a bug where changes by non-system packages were marked + // as system made and as a result set as the default. Therefore, if + // the package changed the setting last is not a system one but the + // setting is marked as its default coming from the system we clear + // the default and clear the system set flag. + settings.resetSettingDefaultValueLocked(name); } + } catch (IllegalStateException e) { + // If the package goes over its quota during the upgrade, don't + // crash but just log the error as the system does the upgrade. + Slog.e(LOG_TAG, "Error upgrading setting: " + setting.getName(), e); + } } } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index 5f4b2391a763..6c983601b5a9 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -298,6 +298,22 @@ final class SettingsState { } // The settings provider must hold its lock when calling here. + public void resetSettingDefaultValueLocked(String name) { + Setting oldSetting = getSettingLocked(name); + if (oldSetting != null && !oldSetting.isNull() && oldSetting.getDefaultValue() != null) { + String oldValue = oldSetting.getValue(); + String oldDefaultValue = oldSetting.getDefaultValue(); + Setting newSetting = new Setting(name, oldSetting.getValue(), null, + oldSetting.getPackageName(), oldSetting.getTag(), false, + oldSetting.getId()); + mSettings.put(name, newSetting); + updateMemoryUsagePerPackageLocked(newSetting.getPackageName(), oldValue, + newSetting.getValue(), oldDefaultValue, newSetting.getDefaultValue()); + scheduleWriteIfNeededLocked(); + } + } + + // The settings provider must hold its lock when calling here. public boolean insertSettingLocked(String name, String value, String tag, boolean makeDefault, String packageName) { if (TextUtils.isEmpty(name)) { @@ -1003,6 +1019,10 @@ final class SettingsState { } public static boolean isSystemPackage(Context context, String packageName) { + return isSystemPackage(context, packageName, Binder.getCallingUid()); + } + + public static boolean isSystemPackage(Context context, String packageName, int callingUid) { synchronized (sLock) { if (SYSTEM_PACKAGE_NAME.equals(packageName)) { return true; @@ -1015,7 +1035,7 @@ final class SettingsState { } // Native services running as a special UID get a pass - final int callingAppId = UserHandle.getAppId(Binder.getCallingUid()); + final int callingAppId = UserHandle.getAppId(callingUid); if (callingAppId < FIRST_APPLICATION_UID) { sSystemUids.put(callingAppId, callingAppId); return true; @@ -1026,7 +1046,7 @@ final class SettingsState { // profile for the purpose of determining whether the other end is a // system component we need to use the user id of the caller for // pulling information about the caller from the package manager. - final int callingUserId = UserHandle.getCallingUserId(); + final int callingUserId = UserHandle.getUserId(callingUid); final long identity = Binder.clearCallingIdentity(); try { |