Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +12 −2 Original line number Diff line number Diff line Loading @@ -2827,10 +2827,20 @@ class DesktopTasksController( task: RunningTaskInfo, transition: IBinder, ): WindowContainerTransaction? { logV("DesktopTasksController: handleHomeTaskLaunch") val activeDeskId = taskRepository.getActiveDeskId(task.displayId) ?: return null logV( "DesktopTasksController: handleHomeTaskLaunch taskId=%s userId=%s currentUserId=%d", task.taskId, task.userId, userId, ) // On user-switches, the home task is launched and the request is dispatched before the // user-switch is known by SysUI/Shell, so don't use the "current" repository. val repository = userRepositories.getProfile(task.userId) val activeDeskId = repository.getActiveDeskId(task.displayId) ?: return null val wct = WindowContainerTransaction() // TODO: b/393978539 - desktop-first displays may need to keep the desk active. // TODO: b/415381304 - pass in the correct |userId| to |performDesktopExitCleanUp| to // ensure desk deactivation updates are applied to the right repository. val runOnTransitStart = performDesktopExitCleanUp( wct = wct, Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/multidesks/DesksTransitionObserver.kt +4 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,10 @@ class DesksTransitionObserver( private fun handleDeskTransition(info: TransitionInfo, deskTransition: DeskTransition) { logD("Desk transition ready: %s", deskTransition) // TODO: b/415381304 - don't use |current|. It can point to the old user during user-switch // transitions while transition info changes can be for the new user. Transitions can // even contain changes for tasks of different users. Instead, add a |userId| argument // in |DeskTransition|, since |TaskInfo#mUserId| is also unreliable on non leaf tasks. val desktopRepository = desktopUserRepositories.current when (deskTransition) { is DeskTransition.RemoveDesk -> { Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +23 −1 Original line number Diff line number Diff line Loading @@ -202,6 +202,7 @@ import org.mockito.kotlin.argThat import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.atLeastOnce import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import org.mockito.quality.Strictness import platform.test.runner.parameterized.ParameterizedAndroidJunit4 Loading Loading @@ -8896,7 +8897,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @EnableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) fun handleRequest_homeTask_activeDesk_deactivates() { taskRepository.setActiveDesk(DEFAULT_DISPLAY, deskId = 0) val home = createHomeTask(DEFAULT_DISPLAY) val home = createHomeTask(DEFAULT_DISPLAY, userId = taskRepository.userId) val transition = Binder() val result = controller.handleRequest(transition, createTransition(home)) Loading @@ -8919,6 +8920,27 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() assertNull(result) } @Test @EnableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) fun handleRequest_homeTask_activeDesk_nonCurrentUser_deactivatesDeskOfCorrectUser() { val currentUserDesk = 0 taskRepository.setActiveDesk(DEFAULT_DISPLAY, deskId = currentUserDesk) val otherUser = 88 val otherUserDesk = 1 userRepositories.getProfile(otherUser).apply { addDesk(DEFAULT_DISPLAY, deskId = otherUserDesk) setActiveDesk(DEFAULT_DISPLAY, deskId = otherUserDesk) } val home = createHomeTask(DEFAULT_DISPLAY, userId = otherUser) val transition = Binder() val result = controller.handleRequest(transition, createTransition(home)) assertNotNull(result) verify(desksOrganizer).deactivateDesk(result, deskId = otherUserDesk) verify(desksOrganizer, never()).deactivateDesk(result, deskId = currentUserDesk) } @Test @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) fun shouldPlayDesktopAnimation_notShowingDesktop_doesNotPlay() { Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTestHelpers.kt +5 −2 Original line number Diff line number Diff line Loading @@ -81,13 +81,16 @@ object DesktopTestHelpers { .setLastActiveTime(100) .build() fun createHomeTask(displayId: Int = DEFAULT_DISPLAY): RunningTaskInfo = fun createHomeTask( displayId: Int = DEFAULT_DISPLAY, userId: Int = DEFAULT_USER_ID, ): RunningTaskInfo = TestRunningTaskInfoBuilder() .setDisplayId(displayId) .setToken(MockToken().token()) .setActivityType(ACTIVITY_TYPE_HOME) .setWindowingMode(WINDOWING_MODE_FULLSCREEN) .setUserId(DEFAULT_USER_ID) .setUserId(userId) .setLastActiveTime(100) .build() Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +12 −2 Original line number Diff line number Diff line Loading @@ -2827,10 +2827,20 @@ class DesktopTasksController( task: RunningTaskInfo, transition: IBinder, ): WindowContainerTransaction? { logV("DesktopTasksController: handleHomeTaskLaunch") val activeDeskId = taskRepository.getActiveDeskId(task.displayId) ?: return null logV( "DesktopTasksController: handleHomeTaskLaunch taskId=%s userId=%s currentUserId=%d", task.taskId, task.userId, userId, ) // On user-switches, the home task is launched and the request is dispatched before the // user-switch is known by SysUI/Shell, so don't use the "current" repository. val repository = userRepositories.getProfile(task.userId) val activeDeskId = repository.getActiveDeskId(task.displayId) ?: return null val wct = WindowContainerTransaction() // TODO: b/393978539 - desktop-first displays may need to keep the desk active. // TODO: b/415381304 - pass in the correct |userId| to |performDesktopExitCleanUp| to // ensure desk deactivation updates are applied to the right repository. val runOnTransitStart = performDesktopExitCleanUp( wct = wct, Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/multidesks/DesksTransitionObserver.kt +4 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,10 @@ class DesksTransitionObserver( private fun handleDeskTransition(info: TransitionInfo, deskTransition: DeskTransition) { logD("Desk transition ready: %s", deskTransition) // TODO: b/415381304 - don't use |current|. It can point to the old user during user-switch // transitions while transition info changes can be for the new user. Transitions can // even contain changes for tasks of different users. Instead, add a |userId| argument // in |DeskTransition|, since |TaskInfo#mUserId| is also unreliable on non leaf tasks. val desktopRepository = desktopUserRepositories.current when (deskTransition) { is DeskTransition.RemoveDesk -> { Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +23 −1 Original line number Diff line number Diff line Loading @@ -202,6 +202,7 @@ import org.mockito.kotlin.argThat import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.atLeastOnce import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import org.mockito.quality.Strictness import platform.test.runner.parameterized.ParameterizedAndroidJunit4 Loading Loading @@ -8896,7 +8897,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @EnableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) fun handleRequest_homeTask_activeDesk_deactivates() { taskRepository.setActiveDesk(DEFAULT_DISPLAY, deskId = 0) val home = createHomeTask(DEFAULT_DISPLAY) val home = createHomeTask(DEFAULT_DISPLAY, userId = taskRepository.userId) val transition = Binder() val result = controller.handleRequest(transition, createTransition(home)) Loading @@ -8919,6 +8920,27 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() assertNull(result) } @Test @EnableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) fun handleRequest_homeTask_activeDesk_nonCurrentUser_deactivatesDeskOfCorrectUser() { val currentUserDesk = 0 taskRepository.setActiveDesk(DEFAULT_DISPLAY, deskId = currentUserDesk) val otherUser = 88 val otherUserDesk = 1 userRepositories.getProfile(otherUser).apply { addDesk(DEFAULT_DISPLAY, deskId = otherUserDesk) setActiveDesk(DEFAULT_DISPLAY, deskId = otherUserDesk) } val home = createHomeTask(DEFAULT_DISPLAY, userId = otherUser) val transition = Binder() val result = controller.handleRequest(transition, createTransition(home)) assertNotNull(result) verify(desksOrganizer).deactivateDesk(result, deskId = otherUserDesk) verify(desksOrganizer, never()).deactivateDesk(result, deskId = currentUserDesk) } @Test @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) fun shouldPlayDesktopAnimation_notShowingDesktop_doesNotPlay() { Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTestHelpers.kt +5 −2 Original line number Diff line number Diff line Loading @@ -81,13 +81,16 @@ object DesktopTestHelpers { .setLastActiveTime(100) .build() fun createHomeTask(displayId: Int = DEFAULT_DISPLAY): RunningTaskInfo = fun createHomeTask( displayId: Int = DEFAULT_DISPLAY, userId: Int = DEFAULT_USER_ID, ): RunningTaskInfo = TestRunningTaskInfoBuilder() .setDisplayId(displayId) .setToken(MockToken().token()) .setActivityType(ACTIVITY_TYPE_HOME) .setWindowingMode(WINDOWING_MODE_FULLSCREEN) .setUserId(DEFAULT_USER_ID) .setUserId(userId) .setLastActiveTime(100) .build() Loading