Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +24 −7 Original line number Diff line number Diff line Loading @@ -385,6 +385,9 @@ class DesktopTasksController( /** Returns whether the given display has an active desk. */ fun isAnyDeskActive(displayId: Int): Boolean = taskRepository.isAnyDeskActive(displayId) /** Returns the id of the active desk in [displayId]. */ fun getActiveDeskId(displayId: Int): Int? = taskRepository.getActiveDeskId(displayId) /** * Moves focused task to desktop mode for given [displayId]. * Loading Loading @@ -476,20 +479,34 @@ class DesktopTasksController( transition: IBinder, finishWct: WindowContainerTransaction, returnToApp: Boolean, activeDeskIdOnRecentsStart: Int?, ) { if (!DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue) return logV("onRecentsInDesktopAnimationFinishing returnToApp=%b", returnToApp) if (returnToApp) return // Home/Recents only exists in the default display. val activeDesk = taskRepository.getActiveDeskId(DEFAULT_DISPLAY) ?: return // Not going back to the active desk, deactivate it. logV( "onRecentsInDesktopAnimationFinishing returnToApp=%b activeDeskIdOnRecentsStart=%d", returnToApp, activeDeskIdOnRecentsStart, ) if (returnToApp) { // Returning to the same desk, nothing to do. return } if ( activeDeskIdOnRecentsStart == null || !taskRepository.isDeskActive(activeDeskIdOnRecentsStart) ) { // No desk was active or it is already inactive. return } // At this point the recents transition is either finishing to home, to another non-desktop // task or to a different desk than the one that was active when recents started. For all // of those the desk that was active needs to be deactivated. val runOnTransitStart = performDesktopExitCleanUp( wct = finishWct, deskId = activeDesk, deskId = activeDeskIdOnRecentsStart, displayId = DEFAULT_DISPLAY, willExitDesktop = true, shouldEndUpAtHome = true, // No need to clean up the wallpaper / home when coming from a recents transition. skipWallpaperAndHomeOrdering = true, ) Loading libs/WindowManager/Shell/src/com/android/wm/shell/transition/RecentsMixedTransition.java +11 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.wm.shell.transition; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_UNOCCLUDING; import static com.android.wm.shell.shared.split.SplitScreenConstants.SPLIT_POSITION_UNDEFINED; Loading @@ -42,6 +43,13 @@ class RecentsMixedTransition extends DefaultMixedHandler.MixedTransition { private final RecentsTransitionHandler mRecentsHandler; private final DesktopTasksController mDesktopTasksController; /** * The id of the desk that was active when the transition started. Only set when {@link #mType} * is {@link DefaultMixedHandler.MixedTransition#TYPE_RECENTS_DURING_DESKTOP}. */ @Nullable private final Integer mActiveDeskIdOnStart; RecentsMixedTransition(int type, IBinder transition, Transitions player, MixedTransitionHandler mixedHandler, PipTransitionController pipHandler, StageCoordinator splitHandler, KeyguardTransitionHandler keyguardHandler, Loading @@ -51,6 +59,8 @@ class RecentsMixedTransition extends DefaultMixedHandler.MixedTransition { mRecentsHandler = recentsHandler; mDesktopTasksController = desktopTasksController; mLeftoversHandler = mRecentsHandler; mActiveDeskIdOnStart = mType == TYPE_RECENTS_DURING_DESKTOP ? mDesktopTasksController.getActiveDeskId(DEFAULT_DISPLAY) : null; } @Override Loading Loading @@ -204,7 +214,7 @@ class RecentsMixedTransition extends DefaultMixedHandler.MixedTransition { void onAnimateRecentsDuringDesktopFinishing(boolean returnToApp, @NonNull WindowContainerTransaction finishWct) { mDesktopTasksController.onRecentsInDesktopAnimationFinishing(mTransition, finishWct, returnToApp); returnToApp, mActiveDeskIdOnStart); } @Override Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +9 −4 Original line number Diff line number Diff line Loading @@ -8736,6 +8736,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() transition = transition, finishWct = finishWct, returnToApp = true, activeDeskIdOnRecentsStart = deskId, ) verify(desksOrganizer, never()).deactivateDesk(finishWct, deskId) Loading @@ -8747,7 +8748,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test @EnableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) fun onRecentsInDesktopAnimationFinishing_noActiveDesk_noDeskDeactivation() { fun onRecentsInDesktopAnimationFinishing_deskNoLongerActive_noDeskDeactivation() { val deskId = 0 taskRepository.setDeskInactive(deskId) Loading @@ -8757,6 +8758,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() transition = transition, finishWct = finishWct, returnToApp = false, activeDeskIdOnRecentsStart = deskId, ) verify(desksOrganizer, never()).deactivateDesk(finishWct, deskId) Loading @@ -8768,7 +8770,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test @EnableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) fun onRecentsInDesktopAnimationFinishing_activeDesk_notReturningToDesk_deactivatesDesk() { fun onRecentsInDesktopAnimationFinishing_deskStillActive_notReturningToDesk_deactivatesDesk() { val deskId = 0 taskRepository.setActiveDesk(DEFAULT_DISPLAY, deskId) Loading @@ -8778,6 +8780,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() transition = transition, finishWct = finishWct, returnToApp = false, activeDeskIdOnRecentsStart = deskId, ) verify(desksOrganizer).deactivateDesk(finishWct, deskId) Loading @@ -8787,7 +8790,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test @EnableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) fun onRecentsInDesktopAnimationFinishing_activeDesk_notReturningToDesk_notifiesDesktopExit() { fun onRecentsInDesktopAnimationFinishing_deskStillActive_notReturningToDesk_notifiesDesktopExit() { val deskId = 0 taskRepository.setActiveDesk(DEFAULT_DISPLAY, deskId) Loading @@ -8797,6 +8800,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() transition = transition, finishWct = finishWct, returnToApp = false, activeDeskIdOnRecentsStart = deskId, ) verify(desktopModeEnterExitTransitionListener) Loading @@ -8805,7 +8809,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test @EnableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) fun onRecentsInDesktopAnimationFinishing_activeDesk_notReturningToDesk_doesNotBringUpWallpaperOrHome() { fun onRecentsInDesktopAnimationFinishing_deskStillActive_notReturningToDesk_doesNotBringUpWallpaperOrHome() { val deskId = 0 taskRepository.setActiveDesk(DEFAULT_DISPLAY, deskId) Loading @@ -8815,6 +8819,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() transition = transition, finishWct = finishWct, returnToApp = false, activeDeskIdOnRecentsStart = deskId, ) finishWct.assertWithoutHop { hop -> Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +24 −7 Original line number Diff line number Diff line Loading @@ -385,6 +385,9 @@ class DesktopTasksController( /** Returns whether the given display has an active desk. */ fun isAnyDeskActive(displayId: Int): Boolean = taskRepository.isAnyDeskActive(displayId) /** Returns the id of the active desk in [displayId]. */ fun getActiveDeskId(displayId: Int): Int? = taskRepository.getActiveDeskId(displayId) /** * Moves focused task to desktop mode for given [displayId]. * Loading Loading @@ -476,20 +479,34 @@ class DesktopTasksController( transition: IBinder, finishWct: WindowContainerTransaction, returnToApp: Boolean, activeDeskIdOnRecentsStart: Int?, ) { if (!DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue) return logV("onRecentsInDesktopAnimationFinishing returnToApp=%b", returnToApp) if (returnToApp) return // Home/Recents only exists in the default display. val activeDesk = taskRepository.getActiveDeskId(DEFAULT_DISPLAY) ?: return // Not going back to the active desk, deactivate it. logV( "onRecentsInDesktopAnimationFinishing returnToApp=%b activeDeskIdOnRecentsStart=%d", returnToApp, activeDeskIdOnRecentsStart, ) if (returnToApp) { // Returning to the same desk, nothing to do. return } if ( activeDeskIdOnRecentsStart == null || !taskRepository.isDeskActive(activeDeskIdOnRecentsStart) ) { // No desk was active or it is already inactive. return } // At this point the recents transition is either finishing to home, to another non-desktop // task or to a different desk than the one that was active when recents started. For all // of those the desk that was active needs to be deactivated. val runOnTransitStart = performDesktopExitCleanUp( wct = finishWct, deskId = activeDesk, deskId = activeDeskIdOnRecentsStart, displayId = DEFAULT_DISPLAY, willExitDesktop = true, shouldEndUpAtHome = true, // No need to clean up the wallpaper / home when coming from a recents transition. skipWallpaperAndHomeOrdering = true, ) Loading
libs/WindowManager/Shell/src/com/android/wm/shell/transition/RecentsMixedTransition.java +11 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.wm.shell.transition; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_UNOCCLUDING; import static com.android.wm.shell.shared.split.SplitScreenConstants.SPLIT_POSITION_UNDEFINED; Loading @@ -42,6 +43,13 @@ class RecentsMixedTransition extends DefaultMixedHandler.MixedTransition { private final RecentsTransitionHandler mRecentsHandler; private final DesktopTasksController mDesktopTasksController; /** * The id of the desk that was active when the transition started. Only set when {@link #mType} * is {@link DefaultMixedHandler.MixedTransition#TYPE_RECENTS_DURING_DESKTOP}. */ @Nullable private final Integer mActiveDeskIdOnStart; RecentsMixedTransition(int type, IBinder transition, Transitions player, MixedTransitionHandler mixedHandler, PipTransitionController pipHandler, StageCoordinator splitHandler, KeyguardTransitionHandler keyguardHandler, Loading @@ -51,6 +59,8 @@ class RecentsMixedTransition extends DefaultMixedHandler.MixedTransition { mRecentsHandler = recentsHandler; mDesktopTasksController = desktopTasksController; mLeftoversHandler = mRecentsHandler; mActiveDeskIdOnStart = mType == TYPE_RECENTS_DURING_DESKTOP ? mDesktopTasksController.getActiveDeskId(DEFAULT_DISPLAY) : null; } @Override Loading Loading @@ -204,7 +214,7 @@ class RecentsMixedTransition extends DefaultMixedHandler.MixedTransition { void onAnimateRecentsDuringDesktopFinishing(boolean returnToApp, @NonNull WindowContainerTransaction finishWct) { mDesktopTasksController.onRecentsInDesktopAnimationFinishing(mTransition, finishWct, returnToApp); returnToApp, mActiveDeskIdOnStart); } @Override Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +9 −4 Original line number Diff line number Diff line Loading @@ -8736,6 +8736,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() transition = transition, finishWct = finishWct, returnToApp = true, activeDeskIdOnRecentsStart = deskId, ) verify(desksOrganizer, never()).deactivateDesk(finishWct, deskId) Loading @@ -8747,7 +8748,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test @EnableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) fun onRecentsInDesktopAnimationFinishing_noActiveDesk_noDeskDeactivation() { fun onRecentsInDesktopAnimationFinishing_deskNoLongerActive_noDeskDeactivation() { val deskId = 0 taskRepository.setDeskInactive(deskId) Loading @@ -8757,6 +8758,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() transition = transition, finishWct = finishWct, returnToApp = false, activeDeskIdOnRecentsStart = deskId, ) verify(desksOrganizer, never()).deactivateDesk(finishWct, deskId) Loading @@ -8768,7 +8770,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test @EnableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) fun onRecentsInDesktopAnimationFinishing_activeDesk_notReturningToDesk_deactivatesDesk() { fun onRecentsInDesktopAnimationFinishing_deskStillActive_notReturningToDesk_deactivatesDesk() { val deskId = 0 taskRepository.setActiveDesk(DEFAULT_DISPLAY, deskId) Loading @@ -8778,6 +8780,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() transition = transition, finishWct = finishWct, returnToApp = false, activeDeskIdOnRecentsStart = deskId, ) verify(desksOrganizer).deactivateDesk(finishWct, deskId) Loading @@ -8787,7 +8790,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test @EnableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) fun onRecentsInDesktopAnimationFinishing_activeDesk_notReturningToDesk_notifiesDesktopExit() { fun onRecentsInDesktopAnimationFinishing_deskStillActive_notReturningToDesk_notifiesDesktopExit() { val deskId = 0 taskRepository.setActiveDesk(DEFAULT_DISPLAY, deskId) Loading @@ -8797,6 +8800,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() transition = transition, finishWct = finishWct, returnToApp = false, activeDeskIdOnRecentsStart = deskId, ) verify(desktopModeEnterExitTransitionListener) Loading @@ -8805,7 +8809,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() @Test @EnableFlags(Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND) fun onRecentsInDesktopAnimationFinishing_activeDesk_notReturningToDesk_doesNotBringUpWallpaperOrHome() { fun onRecentsInDesktopAnimationFinishing_deskStillActive_notReturningToDesk_doesNotBringUpWallpaperOrHome() { val deskId = 0 taskRepository.setActiveDesk(DEFAULT_DISPLAY, deskId) Loading @@ -8815,6 +8819,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase() transition = transition, finishWct = finishWct, returnToApp = false, activeDeskIdOnRecentsStart = deskId, ) finishWct.assertWithoutHop { hop -> Loading