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

Commit 8ae87ea1 authored by Bookatz's avatar Bookatz Committed by Adam Bookatz
Browse files

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
parent db644b95
Loading
Loading
Loading
Loading
+43 −30
Original line number Diff line number Diff line
@@ -3106,38 +3106,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);
@@ -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.