From 8ae87ea1d626562b0fa83208e75bf225c2520fdb Mon Sep 17 00:00:00 2001 From: Bookatz Date: Tue, 26 Nov 2019 12:00:19 -0800 Subject: [PATCH] UserManager: move preCreate code to new method This cl just moves the block of code that is dedicated to converting preCreated users to its own method to make the code look less messy. Also adds synchronization to the writeUserLP calls within that block. Bug: 142482943 Test: Treehugger (this cl just moves some code into a new method) Change-Id: I7326a6559540b7166f737a9ecc7a5745ffc67554 --- .../android/server/pm/UserManagerService.java | 73 +++++++++++-------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 814433829733d..9fcce59c10d19 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -3106,36 +3106,11 @@ public class UserManagerService extends IUserManager.Stub { } } - // First try to use a pre-created user (if available). - // TODO(b/142482943): Move this to its own function later. - if (!preCreate - && (parentId < 0 && isUserTypeEligibleForPreCreation(userTypeDetails))) { - final UserData preCreatedUserData; - synchronized (mUsersLock) { - preCreatedUserData = getPreCreatedUserLU(userType); - } - if (preCreatedUserData != null) { - final UserInfo preCreatedUser = preCreatedUserData.info; - final int newFlags = preCreatedUser.flags | flags; - if (!checkUserTypeConsistency(newFlags)) { - Slog.wtf(LOG_TAG, "Cannot reuse pre-created user " + preCreatedUser.id - + " of type " + userType + " because flags are inconsistent. " - + "Flags (" + Integer.toHexString(flags) + "); preCreatedUserFlags ( " - + Integer.toHexString(preCreatedUser.flags) + ")."); - } else { - Log.i(LOG_TAG, "Reusing pre-created user " + preCreatedUser.id + " of type " - + userType + " and bestowing on it flags " - + UserInfo.flagsToString(flags)); - preCreatedUser.name = name; - preCreatedUser.flags = newFlags; - preCreatedUser.preCreated = false; - preCreatedUser.creationTime = getCreationTime(); - - dispatchUserAddedIntent(preCreatedUser); - writeUserLP(preCreatedUserData); - writeUserListLP(); - return preCreatedUser; - } + // Try to use a pre-created user (if available). + if (!preCreate && parentId < 0 && isUserTypeEligibleForPreCreation(userTypeDetails)) { + final UserInfo preCreatedUser = convertPreCreatedUserIfPossible(userType, flags, name); + if (preCreatedUser != null) { + return preCreatedUser; } } @@ -3312,6 +3287,44 @@ public class UserManagerService extends IUserManager.Stub { return userInfo; } + /** + * Finds and converts a previously pre-created user into a regular user, if possible. + * + * @return the converted user, or {@code null} if no pre-created user could be converted. + */ + private @Nullable UserInfo convertPreCreatedUserIfPossible(String userType, + @UserInfoFlag int flags, String name) { + final UserData preCreatedUserData; + synchronized (mUsersLock) { + preCreatedUserData = getPreCreatedUserLU(userType); + } + if (preCreatedUserData == null) { + return null; + } + final UserInfo preCreatedUser = preCreatedUserData.info; + final int newFlags = preCreatedUser.flags | flags; + if (!checkUserTypeConsistency(newFlags)) { + Slog.wtf(LOG_TAG, "Cannot reuse pre-created user " + preCreatedUser.id + + " of type " + userType + " because flags are inconsistent. " + + "Flags (" + Integer.toHexString(flags) + "); preCreatedUserFlags ( " + + Integer.toHexString(preCreatedUser.flags) + ")."); + return null; + } + Log.i(LOG_TAG, "Reusing pre-created user " + preCreatedUser.id + " of type " + + userType + " and bestowing on it flags " + UserInfo.flagsToString(flags)); + preCreatedUser.name = name; + preCreatedUser.flags = newFlags; + preCreatedUser.preCreated = false; + preCreatedUser.creationTime = getCreationTime(); + + dispatchUserAddedIntent(preCreatedUser); + synchronized (mPackagesLock) { + writeUserLP(preCreatedUserData); + writeUserListLP(); + } + return preCreatedUser; + } + /** Checks that the flags do not contain mutually exclusive types/properties. */ static boolean checkUserTypeConsistency(@UserInfoFlag int flags) { // Mask to check that flags don't refer to multiple user types.