Merge "Do not stop lock task if it is starting background user" into oc-dev

This commit is contained in:
TreeHugger Robot
2017-04-06 13:24:45 +00:00
committed by Android (Google) Code Review
2 changed files with 81 additions and 49 deletions

View File

@@ -670,7 +670,7 @@ final class UserController {
}
mInjector.systemServiceManagerCleanupUser(userId);
synchronized (mLock) {
mInjector.stackSupervisorRemoveUserLocked(userId);
mInjector.getActivityStackSupervisor().removeUserLocked(userId);
}
// Remove the user if it is ephemeral.
if (getUserInfo(userId).isEphemeral()) {
@@ -823,8 +823,10 @@ final class UserController {
return true;
}
mInjector.stackSupervisorSetLockTaskModeLocked(null,
ActivityManager.LOCK_TASK_MODE_NONE, "startUser", false);
if (foreground) {
mInjector.getActivityStackSupervisor().setLockTaskModeLocked(
null, ActivityManager.LOCK_TASK_MODE_NONE, "startUser", false);
}
final UserInfo userInfo = getUserInfo(userId);
if (userInfo == null) {
@@ -1202,11 +1204,12 @@ final class UserController {
}
void moveUserToForegroundLocked(UserState uss, int oldUserId, int newUserId) {
boolean homeInFront = mInjector.stackSupervisorSwitchUserLocked(newUserId, uss);
boolean homeInFront =
mInjector.getActivityStackSupervisor().switchUserLocked(newUserId, uss);
if (homeInFront) {
mInjector.startHomeActivityLocked(newUserId, "moveUserToForeground");
} else {
mInjector.stackSupervisorResumeFocusedStackTopActivityLocked();
mInjector.getActivityStackSupervisor().resumeFocusedStackTopActivityLocked();
}
EventLogTags.writeAmSwitchUser(newUserId);
sendUserSwitchBroadcastsLocked(oldUserId, newUserId);
@@ -1680,10 +1683,6 @@ final class UserController {
mService.mSystemServiceManager.cleanupUser(userId);
}
void stackSupervisorRemoveUserLocked(int userId) {
mService.mStackSupervisor.removeUserLocked(userId);
}
protected UserManagerService getUserManager() {
if (mUserManager == null) {
IBinder b = ServiceManager.getService(Context.USER_SERVICE);
@@ -1743,24 +1742,10 @@ final class UserController {
return mService.checkComponentPermission(permission, pid, uid, owningUid, exported);
}
boolean stackSupervisorSwitchUserLocked(int userId, UserState uss) {
return mService.mStackSupervisor.switchUserLocked(userId, uss);
}
void startHomeActivityLocked(int userId, String reason) {
mService.startHomeActivityLocked(userId, reason);
}
void stackSupervisorResumeFocusedStackTopActivityLocked() {
mService.mStackSupervisor.resumeFocusedStackTopActivityLocked();
}
void stackSupervisorSetLockTaskModeLocked(TaskRecord task, int lockTaskModeState,
String reason, boolean andResume) {
mService.mStackSupervisor.setLockTaskModeLocked(task, lockTaskModeState, reason,
andResume);
}
void updateUserConfigurationLocked() {
mService.updateUserConfigurationLocked();
}
@@ -1778,5 +1763,9 @@ final class UserController {
true /* above system */);
d.show();
}
ActivityStackSupervisor getActivityStackSupervisor() {
return mService.mStackSupervisor;
}
}
}

View File

@@ -16,6 +16,7 @@
package com.android.server.am;
import android.app.ActivityManager;
import android.app.IUserSwitchObserver;
import android.content.Context;
import android.content.IIntentReceiver;
@@ -49,16 +50,20 @@ import java.util.Set;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static com.android.server.am.ActivityManagerService.CONTINUE_USER_SWITCH_MSG;
import static com.android.server.am.ActivityManagerService.REPORT_LOCKED_BOOT_COMPLETE_MSG;
import static com.android.server.am.ActivityManagerService.REPORT_USER_SWITCH_COMPLETE_MSG;
import static com.android.server.am.ActivityManagerService.REPORT_USER_SWITCH_MSG;
import static com.android.server.am.ActivityManagerService.SYSTEM_USER_CURRENT_MSG;
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.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.nullable;
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;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
@@ -71,9 +76,29 @@ public class UserControllerTest extends AndroidTestCase {
private UserController mUserController;
private TestInjector mInjector;
private static final List<String> START_FOREGROUND_USER_ACTIONS =
Arrays.asList(
Intent.ACTION_USER_STARTED,
Intent.ACTION_USER_SWITCHED,
Intent.ACTION_USER_STARTING);
private static final List<String> START_BACKGROUND_USER_ACTIONS =
Arrays.asList(
Intent.ACTION_USER_STARTED,
Intent.ACTION_LOCKED_BOOT_COMPLETED,
Intent.ACTION_USER_STARTING);
private static final Set<Integer> START_FOREGROUND_USER_MESSAGE_CODES =
new HashSet<>(Arrays.asList(REPORT_USER_SWITCH_MSG, USER_SWITCH_TIMEOUT_MSG,
SYSTEM_USER_START_MSG, SYSTEM_USER_CURRENT_MSG));
private static final Set<Integer> START_BACKGROUND_USER_MESSAGE_CODES =
new HashSet<>(Arrays.asList(SYSTEM_USER_START_MSG, REPORT_LOCKED_BOOT_COMPLETE_MSG));
@Override
public void setUp() throws Exception {
super.setUp();
System.setProperty("dexmaker.share_classloader", "true");
mInjector = new TestInjector(getContext());
mUserController = new UserController(mInjector);
setUpUser(TEST_USER_ID, 0);
@@ -83,39 +108,62 @@ public class UserControllerTest extends AndroidTestCase {
protected void tearDown() throws Exception {
super.tearDown();
mInjector.handlerThread.quit();
}
@SmallTest
public void testStartUser() throws RemoteException {
mUserController.startUser(TEST_USER_ID, true);
public void testStartUser_foreground() throws RemoteException {
mUserController.startUser(TEST_USER_ID, true /* foreground */);
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();
Mockito.verify(mInjector.getActivityStackSupervisor()).setLockTaskModeLocked(
nullable(TaskRecord.class),
eq(ActivityManager.LOCK_TASK_MODE_NONE),
anyString(),
anyBoolean());
startForegroundUserAssertions();
}
@SmallTest
public void testStartUser_background() throws RemoteException {
mUserController.startUser(TEST_USER_ID, false /* foreground */);
Mockito.verify(
mInjector.getWindowManager(), never()).startFreezingScreen(anyInt(), anyInt());
Mockito.verify(mInjector.getWindowManager(), never()).setSwitchingUser(anyBoolean());
Mockito.verify(mInjector.getActivityStackSupervisor(), never()).setLockTaskModeLocked(
nullable(TaskRecord.class),
eq(ActivityManager.LOCK_TASK_MODE_NONE),
anyString(),
anyBoolean());
startBackgroundUserAssertions();
}
@SmallTest
public void testStartUserUIDisabled() throws RemoteException {
mUserController.mUserSwitchUiEnabled = false;
mUserController.startUser(TEST_USER_ID, true);
mUserController.startUser(TEST_USER_ID, true /* foreground */);
Mockito.verify(mInjector.getWindowManager(), never())
.startFreezingScreen(anyInt(), anyInt());
Mockito.verify(mInjector.getWindowManager(), never()).stopFreezingScreen();
Mockito.verify(mInjector.getWindowManager(), never()).setSwitchingUser(anyBoolean());
startUserAssertions();
startForegroundUserAssertions();
}
private void startUserAssertions() throws RemoteException {
List<String> expectedActions = Arrays.asList(Intent.ACTION_USER_STARTED,
Intent.ACTION_USER_SWITCHED, Intent.ACTION_USER_STARTING);
private void startUserAssertions(
List<String> expectedActions, Set<Integer> expectedMessageCodes)
throws RemoteException {
assertEquals(expectedActions, getActions(mInjector.sentIntents));
Set<Integer> expectedCodes = new HashSet<>(
Arrays.asList(REPORT_USER_SWITCH_MSG, USER_SWITCH_TIMEOUT_MSG,
SYSTEM_USER_START_MSG, SYSTEM_USER_CURRENT_MSG));
Set<Integer> actualCodes = mInjector.handler.getMessageCodes();
assertEquals("Unexpected message sent", expectedCodes, actualCodes);
assertEquals("Unexpected message sent", expectedMessageCodes, actualCodes);
}
private void startBackgroundUserAssertions() throws RemoteException {
startUserAssertions(START_BACKGROUND_USER_ACTIONS, START_BACKGROUND_USER_MESSAGE_CODES);
}
private void startForegroundUserAssertions() throws RemoteException {
startUserAssertions(START_FOREGROUND_USER_ACTIONS, START_FOREGROUND_USER_MESSAGE_CODES);
Message reportMsg = mInjector.handler.getMessageForCode(REPORT_USER_SWITCH_MSG);
assertNotNull(reportMsg);
UserState userState = (UserState) reportMsg.obj;
@@ -275,6 +323,7 @@ public class UserControllerTest extends AndroidTestCase {
UserManagerService userManagerMock;
UserManagerInternal userManagerInternalMock;
WindowManagerService windowManagerMock;
ActivityStackSupervisor activityStackSupervisor;
private Context mCtx;
List<Intent> sentIntents = new ArrayList<>();
@@ -287,6 +336,7 @@ public class UserControllerTest extends AndroidTestCase {
userManagerMock = mock(UserManagerService.class);
userManagerInternalMock = mock(UserManagerInternal.class);
windowManagerMock = mock(WindowManagerService.class);
activityStackSupervisor = mock(ActivityStackSupervisor.class);
}
@Override
@@ -320,12 +370,6 @@ public class UserControllerTest extends AndroidTestCase {
return PERMISSION_GRANTED;
}
@Override
void stackSupervisorSetLockTaskModeLocked(TaskRecord task, int lockTaskModeState,
String reason, boolean andResume) {
Log.i(TAG, "stackSupervisorSetLockTaskModeLocked");
}
@Override
WindowManagerService getWindowManager() {
return windowManagerMock;
@@ -346,17 +390,16 @@ public class UserControllerTest extends AndroidTestCase {
return 0;
}
@Override
boolean stackSupervisorSwitchUserLocked(int userId, UserState uss) {
Log.i(TAG, "stackSupervisorSwitchUserLocked " + userId);
return true;
}
@Override
void startHomeActivityLocked(int userId, String reason) {
Log.i(TAG, "startHomeActivityLocked " + userId);
}
}
@Override
ActivityStackSupervisor getActivityStackSupervisor() {
return activityStackSupervisor;
}
}
private static class TestHandler extends Handler {
private final List<Message> mMessages = new ArrayList<>();