diff options
| author | 2023-11-01 14:40:16 -0700 | |
|---|---|---|
| committer | 2023-11-02 00:29:45 +0000 | |
| commit | 91f81d739dad67f67e6e22b15c640e5f609dc8fa (patch) | |
| tree | 0af7f79638113f9ab92b87cb3c0d1386582d8666 | |
| parent | c46f6012c0b639d40fb8b9f45a59b177fdf880de (diff) | |
[SettingsProvider] promptly initialize tables for inserts
When DevicePolicyManager creates the work profile, it calls
SettingsProvider put methods for the new user, before SettingsProvider
receives USER_ADDED broadcast. This can cause work profile apps to
disappear in Recent apps. This CL allows SettingsProvider to promptly
set up new tables for the new user before the USER_ADDED broadcast is
received. This will still work with the new ReadWrite lock that we're
introducing to mininize lock contention in SettingsProvider.
BUG: 308397884
Test: manual with TestDPC && create a work profile
Change-Id: Ic256f00b43d605fef16707a9651b9e1255c9475e
| -rw-r--r-- | packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 8c8a71ccf01e..785003a355fc 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -3030,11 +3030,25 @@ public class SettingsProvider extends ContentProvider { } @GuardedBy("mLock") - public void ensureSettingsForUserLocked(int userId) { + @Nullable + private SettingsState getOrCreateSettingsStateLocked(int key) { + SettingsState settingsState = mSettingsStates.get(key); + if (settingsState != null) { + return settingsState; + } + + if (!ensureSettingsForUserLocked(getUserIdFromKey(key))) { + return null; + } + return mSettingsStates.get(key); + } + + @GuardedBy("mLock") + public boolean ensureSettingsForUserLocked(int userId) { // First make sure this user actually exists. if (mUserManager.getUserInfo(userId) == null) { Slog.wtf(LOG_TAG, "Requested user " + userId + " does not exist"); - return; + return false; } // Migrate the setting for this user if needed. @@ -3072,6 +3086,7 @@ public class SettingsProvider extends ContentProvider { // Upgrade the settings to the latest version. UpgradeController upgrader = new UpgradeController(userId); upgrader.upgradeIfNeededLocked(); + return true; } @GuardedBy("mLock") @@ -3149,7 +3164,7 @@ public class SettingsProvider extends ContentProvider { boolean success = false; boolean wasUnsetNonPredefinedSetting = false; - SettingsState settingsState = mSettingsStates.get(key); + SettingsState settingsState = getOrCreateSettingsStateLocked(key); if (settingsState != null) { if (!isSettingPreDefined(name, type) && !settingsState.hasSetting(name)) { wasUnsetNonPredefinedSetting = true; @@ -3184,7 +3199,7 @@ public class SettingsProvider extends ContentProvider { @GuardedBy("mLock") public boolean setConfigSettingsLocked(int key, String prefix, Map<String, String> keyValues, String packageName) { - SettingsState settingsState = mSettingsStates.get(key); + SettingsState settingsState = getOrCreateSettingsStateLocked(key); if (settingsState != null) { if (settingsState.isNewConfigBannedLocked(prefix, keyValues)) { return false; @@ -3207,7 +3222,7 @@ public class SettingsProvider extends ContentProvider { final int key = makeKey(type, userId); boolean success = false; - SettingsState settingsState = mSettingsStates.get(key); + SettingsState settingsState = getOrCreateSettingsStateLocked(key); if (settingsState != null) { success = settingsState.deleteSettingLocked(name); } @@ -3232,7 +3247,7 @@ public class SettingsProvider extends ContentProvider { final int key = makeKey(type, userId); boolean success = false; - SettingsState settingsState = mSettingsStates.get(key); + SettingsState settingsState = getOrCreateSettingsStateLocked(key); if (settingsState != null) { success = settingsState.updateSettingLocked(name, value, tag, makeDefault, packageName); @@ -3284,7 +3299,7 @@ public class SettingsProvider extends ContentProvider { public boolean resetSettingsLocked(int type, int userId, String packageName, int mode, String tag, @Nullable String prefix) { final int key = makeKey(type, userId); - SettingsState settingsState = mSettingsStates.get(key); + SettingsState settingsState = getOrCreateSettingsStateLocked(key); if (settingsState == null) { return false; } |