From 91f81d739dad67f67e6e22b15c640e5f609dc8fa Mon Sep 17 00:00:00 2001 From: Songchun Fan Date: Wed, 1 Nov 2023 14:40:16 -0700 Subject: [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 --- .../providers/settings/SettingsProvider.java | 29 ++++++++++++++++------ 1 file 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 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; } -- cgit v1.2.3-59-g8ed1b