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

Commit 9ce218f2 authored by Felipe Leme's avatar Felipe Leme
Browse files

Refactored UserVisibilityMediator to use UserVisibilityType.

Test: atest FrameworksMockingServicesTests:com.android.server.pm.UserManagerServiceTest UserVisibilityMediatorMUMDTest UserVisibilityMediatorSUSDTest UserControllerTest

Fixes: 261537398

Change-Id: Ic4f15603cbfb63731ba32c5f2a9a3b9a6a17f214
parent 334e44d4
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -1571,12 +1571,6 @@ class UserController implements Handler.Callback {
        checkCallingHasOneOfThosePermissions("startUserOnSecondaryDisplay",
                MANAGE_USERS, INTERACT_ACROSS_USERS);

        // DEFAULT_DISPLAY is used for the current foreground user only
        // TODO(b/245939659): might need to move this check to UserVisibilityMediator to support
        // passenger-only screens
        Preconditions.checkArgument(displayId != Display.DEFAULT_DISPLAY,
                "Cannot use DEFAULT_DISPLAY");

        try {
            return startUserNoChecks(userId, displayId, USER_START_MODE_BACKGROUND_VISIBLE,
                    /* unlockListener= */ null);
+1 −3
Original line number Diff line number Diff line
@@ -6986,10 +6986,8 @@ public class UserManagerService extends IUserManager.Stub {
        @UserAssignmentResult
        public int assignUserToDisplayOnStart(@UserIdInt int userId,
                @UserIdInt int profileGroupId, @UserStartMode int userStartMode, int displayId) {
            // TODO(245939659): change UserVisibilityMediator to take @UserStartMode
            boolean foreground = userStartMode == UserManagerInternal.USER_START_MODE_FOREGROUND;
            return mUserVisibilityMediator.assignUserToDisplayOnStart(userId, profileGroupId,
                    foreground, displayId);
                    userStartMode, displayId);
        }

        @Override
+30 −7
Original line number Diff line number Diff line
@@ -23,7 +23,11 @@ import static android.view.Display.DEFAULT_DISPLAY;
import static com.android.server.pm.UserManagerInternal.USER_ASSIGNMENT_RESULT_FAILURE;
import static com.android.server.pm.UserManagerInternal.USER_ASSIGNMENT_RESULT_SUCCESS_INVISIBLE;
import static com.android.server.pm.UserManagerInternal.USER_ASSIGNMENT_RESULT_SUCCESS_VISIBLE;
import static com.android.server.pm.UserManagerInternal.USER_START_MODE_BACKGROUND;
import static com.android.server.pm.UserManagerInternal.USER_START_MODE_BACKGROUND_VISIBLE;
import static com.android.server.pm.UserManagerInternal.USER_START_MODE_FOREGROUND;
import static com.android.server.pm.UserManagerInternal.userAssignmentResultToString;
import static com.android.server.pm.UserManagerInternal.userStartModeToString;

import android.annotation.IntDef;
import android.annotation.Nullable;
@@ -43,6 +47,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
import com.android.server.am.EventLogTags;
import com.android.server.pm.UserManagerInternal.UserAssignmentResult;
import com.android.server.pm.UserManagerInternal.UserStartMode;
import com.android.server.pm.UserManagerInternal.UserVisibilityListener;
import com.android.server.utils.Slogf;

@@ -142,7 +147,8 @@ public final class UserVisibilityMediator implements Dumpable {
     * See {@link UserManagerInternal#assignUserToDisplayOnStart(int, int, int, int)}.
     */
    public @UserAssignmentResult int assignUserToDisplayOnStart(@UserIdInt int userId,
            @UserIdInt int unResolvedProfileGroupId, boolean foreground, int displayId) {
            @UserIdInt int unResolvedProfileGroupId, @UserStartMode int userStartMode,
            int displayId) {
        Preconditions.checkArgument(!isSpecialUserId(userId), "user id cannot be generic: %d",
                userId);
        // This method needs to perform 4 actions:
@@ -161,14 +167,16 @@ public final class UserVisibilityMediator implements Dumpable {
                ? userId
                : unResolvedProfileGroupId;
        if (DBG) {
            Slogf.d(TAG, "assignUserToDisplayOnStart(%d, %d, %b, %d): actualProfileGroupId=%d",
                    userId, unResolvedProfileGroupId, foreground, displayId, profileGroupId);
            Slogf.d(TAG, "assignUserToDisplayOnStart(%d, %d, %s, %d): actualProfileGroupId=%d",
                    userId, unResolvedProfileGroupId, userStartModeToString(userStartMode),
                    displayId, profileGroupId);
        }

        int result;
        IntArray visibleUsersBefore, visibleUsersAfter;
        synchronized (mLock) {
            result = getUserVisibilityOnStartLocked(userId, profileGroupId, foreground, displayId);
            result = getUserVisibilityOnStartLocked(userId, profileGroupId, userStartMode,
                    displayId);
            if (DBG) {
                Slogf.d(TAG, "result of getUserVisibilityOnStartLocked(%s)",
                        userAssignmentResultToString(result));
@@ -185,7 +193,7 @@ public final class UserVisibilityMediator implements Dumpable {
            visibleUsersBefore = getVisibleUsers();

            // Set current user / profiles state
            if (foreground) {
            if (userStartMode == USER_START_MODE_FOREGROUND) {
                mCurrentUserId = userId;
            }
            if (DBG) {
@@ -228,8 +236,23 @@ public final class UserVisibilityMediator implements Dumpable {

    @GuardedBy("mLock")
    @UserAssignmentResult
    private int getUserVisibilityOnStartLocked(@UserIdInt int userId,
            @UserIdInt int profileGroupId, boolean foreground, int displayId) {
    private int getUserVisibilityOnStartLocked(@UserIdInt int userId, @UserIdInt int profileGroupId,
            @UserStartMode int userStartMode, int displayId) {

        // Check for invalid combinations first
        if (userStartMode == USER_START_MODE_BACKGROUND && displayId != DEFAULT_DISPLAY) {
            Slogf.wtf(TAG, "cannot start user (%d) as BACKGROUND_USER on secondary display (%d) "
                    + "(it should be BACKGROUND_USER_VISIBLE", userId, displayId);
            return USER_ASSIGNMENT_RESULT_FAILURE;
        }
        if (userStartMode == USER_START_MODE_BACKGROUND_VISIBLE
                && displayId == DEFAULT_DISPLAY && !isProfile(userId, profileGroupId)) {
            Slogf.wtf(TAG, "cannot start full user (%d) visible on default display", userId);
            return USER_ASSIGNMENT_RESULT_FAILURE;
        }

        boolean foreground = userStartMode == USER_START_MODE_FOREGROUND;

        if (displayId != DEFAULT_DISPLAY) {
            if (foreground) {
                Slogf.w(TAG, "getUserVisibilityOnStartLocked(%d, %d, %b, %d) failed: cannot start "
+10 −9
Original line number Diff line number Diff line
@@ -107,8 +107,8 @@ public final class UserVisibilityMediatorMUMDTest extends UserVisibilityMediator
                onVisible(PROFILE_USER_ID));
        startForegroundUser(PARENT_USER_ID);

        int result = mMediator.assignUserToDisplayOnStart(PROFILE_USER_ID, PARENT_USER_ID, BG,
                DEFAULT_DISPLAY);
        int result = mMediator.assignUserToDisplayOnStart(PROFILE_USER_ID, PARENT_USER_ID,
                BG_VISIBLE, DEFAULT_DISPLAY);
        assertStartUserResult(result, USER_ASSIGNMENT_RESULT_SUCCESS_VISIBLE);

        expectUserIsVisible(PROFILE_USER_ID);
@@ -138,7 +138,8 @@ public final class UserVisibilityMediatorMUMDTest extends UserVisibilityMediator
    public void testStartBgUser_onInvalidDisplay() throws Exception {
        AsyncUserVisibilityListener listener = addListenerForNoEvents();

        int result = mMediator.assignUserToDisplayOnStart(USER_ID, USER_ID, BG, INVALID_DISPLAY);
        int result = mMediator.assignUserToDisplayOnStart(USER_ID, USER_ID, BG_VISIBLE,
                INVALID_DISPLAY);

        assertStartUserResult(result, USER_ASSIGNMENT_RESULT_FAILURE);

@@ -151,7 +152,7 @@ public final class UserVisibilityMediatorMUMDTest extends UserVisibilityMediator
    public void testStartBgUser_onSecondaryDisplay_displayAvailable() throws Exception {
        AsyncUserVisibilityListener listener = addListenerForEvents(onVisible(USER_ID));

        int result = mMediator.assignUserToDisplayOnStart(USER_ID, USER_ID, BG,
        int result = mMediator.assignUserToDisplayOnStart(USER_ID, USER_ID, BG_VISIBLE,
                SECONDARY_DISPLAY_ID);
        assertStartUserResult(result, USER_ASSIGNMENT_RESULT_SUCCESS_VISIBLE);

@@ -176,7 +177,7 @@ public final class UserVisibilityMediatorMUMDTest extends UserVisibilityMediator
        expectUserIsNotVisibleOnDisplay("before", PARENT_USER_ID, SECONDARY_DISPLAY_ID);
        expectUserIsNotVisibleOnDisplay("before", PROFILE_USER_ID, SECONDARY_DISPLAY_ID);

        int result = mMediator.assignUserToDisplayOnStart(USER_ID, USER_ID, BG,
        int result = mMediator.assignUserToDisplayOnStart(USER_ID, USER_ID, BG_VISIBLE,
                SECONDARY_DISPLAY_ID);
        assertStartUserResult(result, USER_ASSIGNMENT_RESULT_SUCCESS_VISIBLE);

@@ -189,7 +190,7 @@ public final class UserVisibilityMediatorMUMDTest extends UserVisibilityMediator
        AsyncUserVisibilityListener listener = addListenerForEvents(onVisible(OTHER_USER_ID));
        startUserInSecondaryDisplay(OTHER_USER_ID, SECONDARY_DISPLAY_ID);

        int result = mMediator.assignUserToDisplayOnStart(USER_ID, USER_ID, BG,
        int result = mMediator.assignUserToDisplayOnStart(USER_ID, USER_ID, BG_VISIBLE,
                SECONDARY_DISPLAY_ID);
        assertStartUserResult(result, USER_ASSIGNMENT_RESULT_FAILURE);

@@ -205,7 +206,7 @@ public final class UserVisibilityMediatorMUMDTest extends UserVisibilityMediator
        AsyncUserVisibilityListener listener = addListenerForEvents(onVisible(USER_ID));
        startUserInSecondaryDisplay(USER_ID, OTHER_SECONDARY_DISPLAY_ID);

        int result = mMediator.assignUserToDisplayOnStart(USER_ID, USER_ID, BG,
        int result = mMediator.assignUserToDisplayOnStart(USER_ID, USER_ID, BG_VISIBLE,
                SECONDARY_DISPLAY_ID);
        assertStartUserResult(result, USER_ASSIGNMENT_RESULT_FAILURE);

@@ -228,8 +229,8 @@ public final class UserVisibilityMediatorMUMDTest extends UserVisibilityMediator
        AsyncUserVisibilityListener listener = addListenerForEvents(onVisible(PARENT_USER_ID));
        startUserInSecondaryDisplay(PARENT_USER_ID, OTHER_SECONDARY_DISPLAY_ID);

        int result = mMediator.assignUserToDisplayOnStart(PROFILE_USER_ID, PARENT_USER_ID, BG,
                DEFAULT_DISPLAY);
        int result = mMediator.assignUserToDisplayOnStart(PROFILE_USER_ID, PARENT_USER_ID,
                BG_VISIBLE, DEFAULT_DISPLAY);
        assertStartUserResult(result, USER_ASSIGNMENT_RESULT_SUCCESS_INVISIBLE);

        expectUserIsNotVisibleAtAll(PROFILE_USER_ID);
+3 −3
Original line number Diff line number Diff line
@@ -106,8 +106,8 @@ public final class UserVisibilityMediatorSUSDTest extends UserVisibilityMediator
                onVisible(PROFILE_USER_ID));
        startForegroundUser(PARENT_USER_ID);

        int result = mMediator.assignUserToDisplayOnStart(PROFILE_USER_ID, PARENT_USER_ID, BG,
                DEFAULT_DISPLAY);
        int result = mMediator.assignUserToDisplayOnStart(PROFILE_USER_ID, PARENT_USER_ID,
                BG_VISIBLE, DEFAULT_DISPLAY);
        assertStartUserResult(result, USER_ASSIGNMENT_RESULT_SUCCESS_VISIBLE);

        expectUserIsVisible(PROFILE_USER_ID);
@@ -126,7 +126,7 @@ public final class UserVisibilityMediatorSUSDTest extends UserVisibilityMediator
    public void testStartBgUser_onSecondaryDisplay() throws Exception {
        AsyncUserVisibilityListener listener = addListenerForNoEvents();

        int result = mMediator.assignUserToDisplayOnStart(USER_ID, USER_ID, BG,
        int result = mMediator.assignUserToDisplayOnStart(USER_ID, USER_ID, BG_VISIBLE,
                SECONDARY_DISPLAY_ID);
        assertStartUserResult(result, USER_ASSIGNMENT_RESULT_FAILURE);

Loading