diff options
2 files changed, 76 insertions, 9 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index f38957e48dbf..7e9a4c1ed4ef 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -1378,6 +1378,31 @@ class DesktopTasksController( ?.let { homeTask -> wct.reorder(homeTask.getToken(), /* onTop= */ toTop) } } + private fun addLaunchHomePendingIntent(wct: WindowContainerTransaction, displayId: Int) { + val launchHomeIntent = + Intent(Intent.ACTION_MAIN).apply { + if (displayId != DEFAULT_DISPLAY) { + addCategory(Intent.CATEGORY_SECONDARY_HOME) + } else { + addCategory(Intent.CATEGORY_HOME) + } + } + val options = + ActivityOptions.makeBasic().apply { + launchWindowingMode = WINDOWING_MODE_FULLSCREEN + pendingIntentBackgroundActivityStartMode = + ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS + } + val pendingIntent = + PendingIntent.getActivity( + context, + /* requestCode = */ 0, + launchHomeIntent, + PendingIntent.FLAG_IMMUTABLE, + ) + wct.sendPendingIntent(pendingIntent, launchHomeIntent, options.toBundle()) + } + private fun addWallpaperActivity(displayId: Int, wct: WindowContainerTransaction) { logV("addWallpaperActivity") if (Flags.enableDesktopWallpaperActivityForSystemUser()) { @@ -1460,6 +1485,7 @@ class DesktopTasksController( displayId: Int, wct: WindowContainerTransaction, forceToFullscreen: Boolean, + shouldEndUpAtHome: Boolean = true, ) { taskRepository.setPipShouldKeepDesktopActive(displayId, !forceToFullscreen) if (Flags.enablePerDisplayDesktopWallpaperActivity()) { @@ -1481,6 +1507,11 @@ class DesktopTasksController( FULLSCREEN_ANIMATION_DURATION ) removeWallpaperActivity(wct, displayId) + if (shouldEndUpAtHome) { + // If the transition should end up with user going to home, launch home with a pending + // intent. + addLaunchHomePendingIntent(wct, displayId) + } } fun releaseVisualIndicator() { @@ -2093,6 +2124,7 @@ class DesktopTasksController( taskInfo.displayId, wct, forceToFullscreen = true, + shouldEndUpAtHome = false, ) } @@ -2132,6 +2164,7 @@ class DesktopTasksController( taskInfo.displayId, wct, forceToFullscreen = false, + shouldEndUpAtHome = false, ) } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index f549b0563827..e4a3c56d2b59 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -1569,6 +1569,7 @@ class DesktopTasksControllerTest : ShellTestCase() { verify(desktopModeEnterExitTransitionListener) .onExitDesktopModeTransitionStarted(FULLSCREEN_ANIMATION_DURATION) assertThat(taskChange.windowingMode).isEqualTo(WINDOWING_MODE_UNDEFINED) + assertThat(wct.hierarchyOps).hasSize(1) // Removes wallpaper activity when leaving desktop wct.assertReorderAt(index = 0, wallpaperToken, toTop = false) } @@ -1603,6 +1604,7 @@ class DesktopTasksControllerTest : ShellTestCase() { assertThat(taskChange.windowingMode).isEqualTo(WINDOWING_MODE_FULLSCREEN) verify(desktopModeEnterExitTransitionListener) .onExitDesktopModeTransitionStarted(FULLSCREEN_ANIMATION_DURATION) + assertThat(wct.hierarchyOps).hasSize(1) // Removes wallpaper activity when leaving desktop wct.assertReorderAt(index = 0, wallpaperToken, toTop = false) } @@ -2010,15 +2012,15 @@ class DesktopTasksControllerTest : ShellTestCase() { } @Test - fun onDesktopWindowClose_singleActiveTask_noWallpaperActivityToken() { + fun onDesktopWindowClose_singleActiveTask_noWallpaperActivityToken_launchesHome() { val task = setUpFreeformTask() val wct = WindowContainerTransaction() whenever(desktopWallpaperActivityTokenProvider.getToken()).thenReturn(null) controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, task) - // Doesn't modify transaction - assertThat(wct.hierarchyOps).isEmpty() + // Should launch home + wct.assertPendingIntentAt(0, launchHomeIntent(DEFAULT_DISPLAY)) } @Test @@ -2867,14 +2869,16 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) - fun handleRequest_backTransition_singleTaskNoToken_withWallpaper_removesTask() { + fun handleRequest_backTransition_singleTaskNoToken_withWallpaper_launchesHome() { val task = setUpFreeformTask() whenever(desktopWallpaperActivityTokenProvider.getToken()).thenReturn(null) val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_TO_BACK)) - assertNull(result, "Should not handle request") + // Should launch home + assertNotNull(result, "Should handle request") + .assertPendingIntentAt(0, launchHomeIntent(DEFAULT_DISPLAY)) } @Test @@ -2891,14 +2895,16 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) - fun handleRequest_backTransition_singleTaskNoToken_doesNotHandle() { + fun handleRequest_backTransition_singleTaskNoToken_launchesHomes() { val task = setUpFreeformTask() whenever(desktopWallpaperActivityTokenProvider.getToken()).thenReturn(null) val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_TO_BACK)) - assertNull(result, "Should not handle request") + // Should launch home + assertNotNull(result, "Should handle request") + .assertPendingIntentAt(0, launchHomeIntent(DEFAULT_DISPLAY)) } @Test @@ -3017,14 +3023,30 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) - fun handleRequest_closeTransition_singleTaskNoToken_doesNotHandle() { + fun handleRequest_closeTransition_singleTaskNoToken_launchesHome() { val task = setUpFreeformTask() whenever(desktopWallpaperActivityTokenProvider.getToken()).thenReturn(null) val result = controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_CLOSE)) - assertNull(result, "Should not handle request") + // Should launch home + assertNotNull(result, "Should handle request") + .assertPendingIntentAt(0, launchHomeIntent(DEFAULT_DISPLAY)) + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) + fun handleRequest_closeTransition_singleTaskNoToken_secondaryDisplay_launchesHome() { + val task = setUpFreeformTask(displayId = SECOND_DISPLAY) + whenever(desktopWallpaperActivityTokenProvider.getToken()).thenReturn(null) + + val result = + controller.handleRequest(Binder(), createTransition(task, type = TRANSIT_CLOSE)) + + // Should launch home + assertNotNull(result, "Should handle request") + .assertPendingIntentAt(0, launchHomeIntent(SECOND_DISPLAY)) } @Test @@ -3750,6 +3772,7 @@ class DesktopTasksControllerTest : ShellTestCase() { eq(SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT), eq(task2.configuration.windowConfiguration.bounds), ) + assertThat(wctArgument.value.hierarchyOps).hasSize(1) // Removes wallpaper activity when leaving desktop wctArgument.value.assertReorderAt(index = 0, wallpaperToken, toTop = false) } @@ -4947,6 +4970,16 @@ class DesktopTasksControllerTest : ShellTestCase() { private val desktopWallpaperIntent: Intent get() = Intent(context, DesktopWallpaperActivity::class.java) + private fun launchHomeIntent(displayId: Int): Intent { + return Intent(Intent.ACTION_MAIN).apply { + if (displayId != DEFAULT_DISPLAY) { + addCategory(Intent.CATEGORY_SECONDARY_HOME) + } else { + addCategory(Intent.CATEGORY_HOME) + } + } + } + private fun addFreeformTaskAtPosition( pos: DesktopTaskPosition, stableBounds: Rect, @@ -5260,6 +5293,7 @@ private fun WindowContainerTransaction.assertPendingIntentAt(index: Int, intent: val op = hierarchyOps[index] assertThat(op.type).isEqualTo(HIERARCHY_OP_TYPE_PENDING_INTENT) assertThat(op.pendingIntent?.intent?.component).isEqualTo(intent.component) + assertThat(op.pendingIntent?.intent?.categories).isEqualTo(intent.categories) } private fun WindowContainerTransaction.assertLaunchTaskAt( |