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

Commit 9e51dbbb authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "UserManager: move preCreate code to new method"

parents 7e19fcd4 8ae87ea1
Loading
Loading
Loading
Loading
+43 −30
Original line number Diff line number Diff line
@@ -3107,38 +3107,13 @@ 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();
        // 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;
            }
        }
        }

        DeviceStorageMonitorInternal dsm = LocalServices
                .getService(DeviceStorageMonitorInternal.class);
@@ -3320,6 +3295,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.