Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 91f81d73 authored by Songchun Fan's avatar Songchun Fan Committed by Song Chun Fan
Browse files

[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
parent c46f6012
Loading
Loading
Loading
Loading
+22 −7
Original line number Diff line number Diff line
@@ -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;
            }