summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Songchun Fan <schfan@google.com> 2023-11-01 14:40:16 -0700
committer Song Chun Fan <schfan@google.com> 2023-11-02 00:29:45 +0000
commit91f81d739dad67f67e6e22b15c640e5f609dc8fa (patch)
tree0af7f79638113f9ab92b87cb3c0d1386582d8666
parentc46f6012c0b639d40fb8b9f45a59b177fdf880de (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.java29
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;
}