Loading services/core/java/com/android/server/am/UserController.java +0 −6 Original line number Diff line number Diff line Loading @@ -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); Loading services/core/java/com/android/server/pm/UserManagerService.java +1 −3 Original line number Diff line number Diff line Loading @@ -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 Loading services/core/java/com/android/server/pm/UserVisibilityMediator.java +30 −7 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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: Loading @@ -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)); Loading @@ -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) { Loading Loading @@ -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 " Loading services/tests/mockingservicestests/src/com/android/server/pm/UserVisibilityMediatorMUMDTest.java +10 −9 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading services/tests/mockingservicestests/src/com/android/server/pm/UserVisibilityMediatorSUSDTest.java +3 −3 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 Loading
services/core/java/com/android/server/am/UserController.java +0 −6 Original line number Diff line number Diff line Loading @@ -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); Loading
services/core/java/com/android/server/pm/UserManagerService.java +1 −3 Original line number Diff line number Diff line Loading @@ -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 Loading
services/core/java/com/android/server/pm/UserVisibilityMediator.java +30 −7 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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: Loading @@ -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)); Loading @@ -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) { Loading Loading @@ -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 " Loading
services/tests/mockingservicestests/src/com/android/server/pm/UserVisibilityMediatorMUMDTest.java +10 −9 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading @@ -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); Loading
services/tests/mockingservicestests/src/com/android/server/pm/UserVisibilityMediatorSUSDTest.java +3 −3 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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