Loading services/core/java/com/android/server/am/UserController.java +1 −1 Original line number Diff line number Diff line Loading @@ -161,7 +161,7 @@ final class UserController { private final RemoteCallbackList<IUserSwitchObserver> mUserSwitchObservers = new RemoteCallbackList<>(); boolean mUserSwitchUiEnabled; boolean mUserSwitchUiEnabled = true; /** * Currently active user switch callbacks. Loading services/tests/servicestests/src/com/android/server/am/UserControllerTest.java +70 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ import static com.android.server.am.ActivityManagerService.SYSTEM_USER_CURRENT_M import static com.android.server.am.ActivityManagerService.SYSTEM_USER_START_MSG; import static com.android.server.am.ActivityManagerService.USER_SWITCH_TIMEOUT_MSG; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doAnswer; Loading @@ -65,6 +66,7 @@ import static org.mockito.Mockito.when; public class UserControllerTest extends AndroidTestCase { private static final int TEST_USER_ID = 10; private static final int NONEXIST_USER_ID = 2; private static String TAG = UserControllerTest.class.getSimpleName(); private UserController mUserController; private TestInjector mInjector; Loading @@ -89,6 +91,23 @@ public class UserControllerTest extends AndroidTestCase { mUserController.startUser(TEST_USER_ID, true); Mockito.verify(mInjector.getWindowManager()).startFreezingScreen(anyInt(), anyInt()); Mockito.verify(mInjector.getWindowManager(), never()).stopFreezingScreen(); Mockito.verify(mInjector.getWindowManager(), times(1)).setSwitchingUser(anyBoolean()); Mockito.verify(mInjector.getWindowManager()).setSwitchingUser(true); startUserAssertions(); } @SmallTest public void testStartUserUIDisabled() throws RemoteException { mUserController.mUserSwitchUiEnabled = false; mUserController.startUser(TEST_USER_ID, true); Mockito.verify(mInjector.getWindowManager(), never()) .startFreezingScreen(anyInt(), anyInt()); Mockito.verify(mInjector.getWindowManager(), never()).stopFreezingScreen(); Mockito.verify(mInjector.getWindowManager(), never()).setSwitchingUser(anyBoolean()); startUserAssertions(); } private void startUserAssertions() throws RemoteException { List<String> expectedActions = Arrays.asList(Intent.ACTION_USER_STARTED, Intent.ACTION_USER_SWITCHED, Intent.ACTION_USER_STARTING); assertEquals(expectedActions, getActions(mInjector.sentIntents)); Loading @@ -107,6 +126,14 @@ public class UserControllerTest extends AndroidTestCase { assertEquals("Unexpected new user id", TEST_USER_ID, reportMsg.arg2); } @SmallTest public void testFailedStartUserInForeground() throws RemoteException { mUserController.mUserSwitchUiEnabled = false; mUserController.startUserInForeground(NONEXIST_USER_ID); Mockito.verify(mInjector.getWindowManager(), times(1)).setSwitchingUser(anyBoolean()); Mockito.verify(mInjector.getWindowManager()).setSwitchingUser(false); } @SmallTest public void testDispatchUserSwitch() throws RemoteException { // Prepare mock observer and register it Loading Loading @@ -177,6 +204,27 @@ public class UserControllerTest extends AndroidTestCase { // Verify that continueUserSwitch worked as expected mUserController.continueUserSwitch(userState, oldUserId, newUserId); Mockito.verify(mInjector.getWindowManager(), times(1)).stopFreezingScreen(); continueUserSwitchAssertions(); } @SmallTest public void testContinueUserSwitchUIDisabled() throws RemoteException { mUserController.mUserSwitchUiEnabled = false; // Start user -- this will update state of mUserController mUserController.startUser(TEST_USER_ID, true); Message reportMsg = mInjector.handler.getMessageForCode(REPORT_USER_SWITCH_MSG); assertNotNull(reportMsg); UserState userState = (UserState) reportMsg.obj; int oldUserId = reportMsg.arg1; int newUserId = reportMsg.arg2; mInjector.handler.clearAllRecordedMessages(); // Verify that continueUserSwitch worked as expected mUserController.continueUserSwitch(userState, oldUserId, newUserId); Mockito.verify(mInjector.getWindowManager(), never()).stopFreezingScreen(); continueUserSwitchAssertions(); } private void continueUserSwitchAssertions() throws RemoteException { Set<Integer> expectedCodes = Collections.singleton(REPORT_USER_SWITCH_COMPLETE_MSG); Set<Integer> actualCodes = mInjector.handler.getMessageCodes(); assertEquals("Unexpected message sent", expectedCodes, actualCodes); Loading @@ -185,6 +233,28 @@ public class UserControllerTest extends AndroidTestCase { assertEquals("Unexpected userId", TEST_USER_ID, msg.arg1); } @SmallTest public void testDispatchUserSwitchComplete() throws RemoteException { // Prepare mock observer and register it IUserSwitchObserver observer = mock(IUserSwitchObserver.class); when(observer.asBinder()).thenReturn(new Binder()); mUserController.registerUserSwitchObserver(observer, "mock"); // Start user -- this will update state of mUserController mUserController.startUser(TEST_USER_ID, true); Message reportMsg = mInjector.handler.getMessageForCode(REPORT_USER_SWITCH_MSG); assertNotNull(reportMsg); int newUserId = reportMsg.arg2; mInjector.handler.clearAllRecordedMessages(); // Mockito can't reset only interactions, so just verify that this hasn't been // called with 'false' until after dispatchUserSwitchComplete. Mockito.verify(mInjector.getWindowManager(), never()).setSwitchingUser(false); // Call dispatchUserSwitchComplete mUserController.dispatchUserSwitchComplete(newUserId); Mockito.verify(observer, times(1)).onUserSwitchComplete(anyInt()); Mockito.verify(observer).onUserSwitchComplete(TEST_USER_ID); Mockito.verify(mInjector.getWindowManager(), times(1)).setSwitchingUser(false); } private void setUpUser(int userId, int flags) { UserInfo userInfo = new UserInfo(userId, "User" + userId, flags); when(mInjector.userManagerMock.getUserInfo(eq(userId))).thenReturn(userInfo); Loading Loading
services/core/java/com/android/server/am/UserController.java +1 −1 Original line number Diff line number Diff line Loading @@ -161,7 +161,7 @@ final class UserController { private final RemoteCallbackList<IUserSwitchObserver> mUserSwitchObservers = new RemoteCallbackList<>(); boolean mUserSwitchUiEnabled; boolean mUserSwitchUiEnabled = true; /** * Currently active user switch callbacks. Loading
services/tests/servicestests/src/com/android/server/am/UserControllerTest.java +70 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ import static com.android.server.am.ActivityManagerService.SYSTEM_USER_CURRENT_M import static com.android.server.am.ActivityManagerService.SYSTEM_USER_START_MSG; import static com.android.server.am.ActivityManagerService.USER_SWITCH_TIMEOUT_MSG; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doAnswer; Loading @@ -65,6 +66,7 @@ import static org.mockito.Mockito.when; public class UserControllerTest extends AndroidTestCase { private static final int TEST_USER_ID = 10; private static final int NONEXIST_USER_ID = 2; private static String TAG = UserControllerTest.class.getSimpleName(); private UserController mUserController; private TestInjector mInjector; Loading @@ -89,6 +91,23 @@ public class UserControllerTest extends AndroidTestCase { mUserController.startUser(TEST_USER_ID, true); Mockito.verify(mInjector.getWindowManager()).startFreezingScreen(anyInt(), anyInt()); Mockito.verify(mInjector.getWindowManager(), never()).stopFreezingScreen(); Mockito.verify(mInjector.getWindowManager(), times(1)).setSwitchingUser(anyBoolean()); Mockito.verify(mInjector.getWindowManager()).setSwitchingUser(true); startUserAssertions(); } @SmallTest public void testStartUserUIDisabled() throws RemoteException { mUserController.mUserSwitchUiEnabled = false; mUserController.startUser(TEST_USER_ID, true); Mockito.verify(mInjector.getWindowManager(), never()) .startFreezingScreen(anyInt(), anyInt()); Mockito.verify(mInjector.getWindowManager(), never()).stopFreezingScreen(); Mockito.verify(mInjector.getWindowManager(), never()).setSwitchingUser(anyBoolean()); startUserAssertions(); } private void startUserAssertions() throws RemoteException { List<String> expectedActions = Arrays.asList(Intent.ACTION_USER_STARTED, Intent.ACTION_USER_SWITCHED, Intent.ACTION_USER_STARTING); assertEquals(expectedActions, getActions(mInjector.sentIntents)); Loading @@ -107,6 +126,14 @@ public class UserControllerTest extends AndroidTestCase { assertEquals("Unexpected new user id", TEST_USER_ID, reportMsg.arg2); } @SmallTest public void testFailedStartUserInForeground() throws RemoteException { mUserController.mUserSwitchUiEnabled = false; mUserController.startUserInForeground(NONEXIST_USER_ID); Mockito.verify(mInjector.getWindowManager(), times(1)).setSwitchingUser(anyBoolean()); Mockito.verify(mInjector.getWindowManager()).setSwitchingUser(false); } @SmallTest public void testDispatchUserSwitch() throws RemoteException { // Prepare mock observer and register it Loading Loading @@ -177,6 +204,27 @@ public class UserControllerTest extends AndroidTestCase { // Verify that continueUserSwitch worked as expected mUserController.continueUserSwitch(userState, oldUserId, newUserId); Mockito.verify(mInjector.getWindowManager(), times(1)).stopFreezingScreen(); continueUserSwitchAssertions(); } @SmallTest public void testContinueUserSwitchUIDisabled() throws RemoteException { mUserController.mUserSwitchUiEnabled = false; // Start user -- this will update state of mUserController mUserController.startUser(TEST_USER_ID, true); Message reportMsg = mInjector.handler.getMessageForCode(REPORT_USER_SWITCH_MSG); assertNotNull(reportMsg); UserState userState = (UserState) reportMsg.obj; int oldUserId = reportMsg.arg1; int newUserId = reportMsg.arg2; mInjector.handler.clearAllRecordedMessages(); // Verify that continueUserSwitch worked as expected mUserController.continueUserSwitch(userState, oldUserId, newUserId); Mockito.verify(mInjector.getWindowManager(), never()).stopFreezingScreen(); continueUserSwitchAssertions(); } private void continueUserSwitchAssertions() throws RemoteException { Set<Integer> expectedCodes = Collections.singleton(REPORT_USER_SWITCH_COMPLETE_MSG); Set<Integer> actualCodes = mInjector.handler.getMessageCodes(); assertEquals("Unexpected message sent", expectedCodes, actualCodes); Loading @@ -185,6 +233,28 @@ public class UserControllerTest extends AndroidTestCase { assertEquals("Unexpected userId", TEST_USER_ID, msg.arg1); } @SmallTest public void testDispatchUserSwitchComplete() throws RemoteException { // Prepare mock observer and register it IUserSwitchObserver observer = mock(IUserSwitchObserver.class); when(observer.asBinder()).thenReturn(new Binder()); mUserController.registerUserSwitchObserver(observer, "mock"); // Start user -- this will update state of mUserController mUserController.startUser(TEST_USER_ID, true); Message reportMsg = mInjector.handler.getMessageForCode(REPORT_USER_SWITCH_MSG); assertNotNull(reportMsg); int newUserId = reportMsg.arg2; mInjector.handler.clearAllRecordedMessages(); // Mockito can't reset only interactions, so just verify that this hasn't been // called with 'false' until after dispatchUserSwitchComplete. Mockito.verify(mInjector.getWindowManager(), never()).setSwitchingUser(false); // Call dispatchUserSwitchComplete mUserController.dispatchUserSwitchComplete(newUserId); Mockito.verify(observer, times(1)).onUserSwitchComplete(anyInt()); Mockito.verify(observer).onUserSwitchComplete(TEST_USER_ID); Mockito.verify(mInjector.getWindowManager(), times(1)).setSwitchingUser(false); } private void setUpUser(int userId, int flags) { UserInfo userInfo = new UserInfo(userId, "User" + userId, flags); when(mInjector.userManagerMock.getUserInfo(eq(userId))).thenReturn(userInfo); Loading