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
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user