Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +8 −0 Original line number Original line Diff line number Diff line Loading @@ -1107,6 +1107,10 @@ class DesktopTasksController( if (useDesktopOverrideDensity()) { if (useDesktopOverrideDensity()) { wct.setDensityDpi(taskInfo.token, getDefaultDensityDpi()) wct.setDensityDpi(taskInfo.token, getDefaultDensityDpi()) } } if (desktopModeTaskRepository.isOnlyVisibleNonClosingTask(taskInfo.taskId)) { // Remove wallpaper activity when leaving desktop mode removeWallpaperActivity(wct) } } } /** /** Loading @@ -1122,6 +1126,10 @@ class DesktopTasksController( // The task's density may have been overridden in freeform; revert it here as we don't // The task's density may have been overridden in freeform; revert it here as we don't // want it overridden in multi-window. // want it overridden in multi-window. wct.setDensityDpi(taskInfo.token, getDefaultDensityDpi()) wct.setDensityDpi(taskInfo.token, getDefaultDensityDpi()) if (desktopModeTaskRepository.isOnlyVisibleNonClosingTask(taskInfo.taskId)) { // Remove wallpaper activity when leaving desktop mode removeWallpaperActivity(wct) } } } /** Returns the ID of the Task that will be minimized, or null if no task will be minimized. */ /** Returns the ID of the Task that will be minimized, or null if no task will be minimized. */ Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +157 −4 Original line number Original line Diff line number Diff line Loading @@ -934,6 +934,24 @@ class DesktopTasksControllerTest : ShellTestCase() { .isEqualTo(WINDOWING_MODE_UNDEFINED) .isEqualTo(WINDOWING_MODE_UNDEFINED) } } @Test fun moveToFullscreen_tdaFullscreen_windowingModeUndefined_removesWallpaperActivity() { val task = setUpFreeformTask() val wallpaperToken = MockToken().token() desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken assertNotNull(rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)) .configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FULLSCREEN controller.moveToFullscreen(task.taskId, transitionSource = UNKNOWN) val wct = getLatestExitDesktopWct() val taskChange = assertNotNull(wct.changes[task.token.asBinder()]) assertThat(taskChange.windowingMode).isEqualTo(WINDOWING_MODE_UNDEFINED) // Removes wallpaper activity when leaving desktop wct.assertRemoveAt(index = 0, wallpaperToken) } @Test @Test fun moveToFullscreen_tdaFreeform_windowingModeSetToFullscreen() { fun moveToFullscreen_tdaFreeform_windowingModeSetToFullscreen() { val task = setUpFreeformTask() val task = setUpFreeformTask() Loading @@ -945,6 +963,44 @@ class DesktopTasksControllerTest : ShellTestCase() { .isEqualTo(WINDOWING_MODE_FULLSCREEN) .isEqualTo(WINDOWING_MODE_FULLSCREEN) } } @Test fun moveToFullscreen_tdaFreeform_windowingModeFullscreen_removesWallpaperActivity() { val task = setUpFreeformTask() val wallpaperToken = MockToken().token() desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken assertNotNull(rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)) .configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FREEFORM controller.moveToFullscreen(task.taskId, transitionSource = UNKNOWN) val wct = getLatestExitDesktopWct() val taskChange = assertNotNull(wct.changes[task.token.asBinder()]) assertThat(taskChange.windowingMode).isEqualTo(WINDOWING_MODE_FULLSCREEN) // Removes wallpaper activity when leaving desktop wct.assertRemoveAt(index = 0, wallpaperToken) } @Test fun moveToFullscreen_multipleVisibleNonMinimizedTasks_doesNotRemoveWallpaperActivity() { val task1 = setUpFreeformTask() // Setup task2 setUpFreeformTask() val wallpaperToken = MockToken().token() desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken assertNotNull(rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)) .configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FULLSCREEN controller.moveToFullscreen(task1.taskId, transitionSource = UNKNOWN) val wct = getLatestExitDesktopWct() val task1Change = assertNotNull(wct.changes[task1.token.asBinder()]) assertThat(task1Change.windowingMode).isEqualTo(WINDOWING_MODE_UNDEFINED) // Does not remove wallpaper activity, as desktop still has a visible desktop task assertThat(wct.hierarchyOps).isEmpty() } @Test @Test fun moveToFullscreen_nonExistentTask_doesNothing() { fun moveToFullscreen_nonExistentTask_doesNothing() { controller.moveToFullscreen(999, transitionSource = UNKNOWN) controller.moveToFullscreen(999, transitionSource = UNKNOWN) Loading Loading @@ -1768,6 +1824,49 @@ class DesktopTasksControllerTest : ShellTestCase() { .isEqualTo(WINDOWING_MODE_UNDEFINED) // inherited FULLSCREEN .isEqualTo(WINDOWING_MODE_UNDEFINED) // inherited FULLSCREEN } } @Test fun moveFocusedTaskToFullscreen_onlyVisibleNonMinimizedTask_removesWallpaperActivity() { val task1 = setUpFreeformTask() val task2 = setUpFreeformTask() val task3 = setUpFreeformTask() val wallpaperToken = MockToken().token() task1.isFocused = false task2.isFocused = true task3.isFocused = false desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken desktopModeTaskRepository.minimizeTask(DEFAULT_DISPLAY, task1.taskId) desktopModeTaskRepository.updateVisibleFreeformTasks(DEFAULT_DISPLAY, task3.taskId, visible = false) controller.enterFullscreen(DEFAULT_DISPLAY, transitionSource = UNKNOWN) val wct = getLatestExitDesktopWct() val taskChange = assertNotNull(wct.changes[task2.token.asBinder()]) assertThat(taskChange.windowingMode).isEqualTo(WINDOWING_MODE_UNDEFINED) // inherited FULLSCREEN wct.assertRemoveAt(index = 0, wallpaperToken) } @Test fun moveFocusedTaskToFullscreen_multipleVisibleTasks_doesNotRemoveWallpaperActivity() { val task1 = setUpFreeformTask() val task2 = setUpFreeformTask() val task3 = setUpFreeformTask() val wallpaperToken = MockToken().token() task1.isFocused = false task2.isFocused = true task3.isFocused = false desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken controller.enterFullscreen(DEFAULT_DISPLAY, transitionSource = UNKNOWN) val wct = getLatestExitDesktopWct() val taskChange = assertNotNull(wct.changes[task2.token.asBinder()]) assertThat(taskChange.windowingMode).isEqualTo(WINDOWING_MODE_UNDEFINED) // inherited FULLSCREEN // Does not remove wallpaper activity, as desktop still has visible desktop tasks assertThat(wct.hierarchyOps).isEmpty() } @Test @Test @EnableFlags(Flags.FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS) @EnableFlags(Flags.FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS) fun dragToDesktop_landscapeDevice_resizable_undefinedOrientation_defaultLandscapeBounds() { fun dragToDesktop_landscapeDevice_resizable_undefinedOrientation_defaultLandscapeBounds() { Loading Loading @@ -1977,6 +2076,7 @@ class DesktopTasksControllerTest : ShellTestCase() { eq(null)) eq(null)) } } @Test fun enterSplit_freeformTaskIsMovedToSplit() { fun enterSplit_freeformTaskIsMovedToSplit() { val task1 = setUpFreeformTask() val task1 = setUpFreeformTask() val task2 = setUpFreeformTask() val task2 = setUpFreeformTask() Loading @@ -1986,14 +2086,67 @@ class DesktopTasksControllerTest : ShellTestCase() { task2.isFocused = true task2.isFocused = true task3.isFocused = false task3.isFocused = false controller.enterSplit(DEFAULT_DISPLAY, false) controller.enterSplit(DEFAULT_DISPLAY, leftOrTop = false) verify(splitScreenController) verify(splitScreenController) .requestEnterSplitSelect( .requestEnterSplitSelect( task2, eq(task2), any(), any(), SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT, eq(SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT), task2.configuration.windowConfiguration.bounds) eq(task2.configuration.windowConfiguration.bounds)) } @Test fun enterSplit_onlyVisibleNonMinimizedTask_removesWallpaperActivity() { val task1 = setUpFreeformTask() val task2 = setUpFreeformTask() val task3 = setUpFreeformTask() val wallpaperToken = MockToken().token() task1.isFocused = false task2.isFocused = true task3.isFocused = false desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken desktopModeTaskRepository.minimizeTask(DEFAULT_DISPLAY, task1.taskId) desktopModeTaskRepository.updateVisibleFreeformTasks(DEFAULT_DISPLAY, task3.taskId, visible = false) controller.enterSplit(DEFAULT_DISPLAY, leftOrTop = false) val wctArgument = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) verify(splitScreenController) .requestEnterSplitSelect( eq(task2), wctArgument.capture(), eq(SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT), eq(task2.configuration.windowConfiguration.bounds)) // Removes wallpaper activity when leaving desktop wctArgument.value.assertRemoveAt(index = 0, wallpaperToken) } @Test fun enterSplit_multipleVisibleNonMinimizedTasks_removesWallpaperActivity() { val task1 = setUpFreeformTask() val task2 = setUpFreeformTask() val task3 = setUpFreeformTask() val wallpaperToken = MockToken().token() task1.isFocused = false task2.isFocused = true task3.isFocused = false desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken controller.enterSplit(DEFAULT_DISPLAY, leftOrTop = false) val wctArgument = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) verify(splitScreenController) .requestEnterSplitSelect( eq(task2), wctArgument.capture(), eq(SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT), eq(task2.configuration.windowConfiguration.bounds)) // Does not remove wallpaper activity, as desktop still has visible desktop tasks assertThat(wctArgument.value.hierarchyOps).isEmpty() } } @Test @Test Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +8 −0 Original line number Original line Diff line number Diff line Loading @@ -1107,6 +1107,10 @@ class DesktopTasksController( if (useDesktopOverrideDensity()) { if (useDesktopOverrideDensity()) { wct.setDensityDpi(taskInfo.token, getDefaultDensityDpi()) wct.setDensityDpi(taskInfo.token, getDefaultDensityDpi()) } } if (desktopModeTaskRepository.isOnlyVisibleNonClosingTask(taskInfo.taskId)) { // Remove wallpaper activity when leaving desktop mode removeWallpaperActivity(wct) } } } /** /** Loading @@ -1122,6 +1126,10 @@ class DesktopTasksController( // The task's density may have been overridden in freeform; revert it here as we don't // The task's density may have been overridden in freeform; revert it here as we don't // want it overridden in multi-window. // want it overridden in multi-window. wct.setDensityDpi(taskInfo.token, getDefaultDensityDpi()) wct.setDensityDpi(taskInfo.token, getDefaultDensityDpi()) if (desktopModeTaskRepository.isOnlyVisibleNonClosingTask(taskInfo.taskId)) { // Remove wallpaper activity when leaving desktop mode removeWallpaperActivity(wct) } } } /** Returns the ID of the Task that will be minimized, or null if no task will be minimized. */ /** Returns the ID of the Task that will be minimized, or null if no task will be minimized. */ Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +157 −4 Original line number Original line Diff line number Diff line Loading @@ -934,6 +934,24 @@ class DesktopTasksControllerTest : ShellTestCase() { .isEqualTo(WINDOWING_MODE_UNDEFINED) .isEqualTo(WINDOWING_MODE_UNDEFINED) } } @Test fun moveToFullscreen_tdaFullscreen_windowingModeUndefined_removesWallpaperActivity() { val task = setUpFreeformTask() val wallpaperToken = MockToken().token() desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken assertNotNull(rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)) .configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FULLSCREEN controller.moveToFullscreen(task.taskId, transitionSource = UNKNOWN) val wct = getLatestExitDesktopWct() val taskChange = assertNotNull(wct.changes[task.token.asBinder()]) assertThat(taskChange.windowingMode).isEqualTo(WINDOWING_MODE_UNDEFINED) // Removes wallpaper activity when leaving desktop wct.assertRemoveAt(index = 0, wallpaperToken) } @Test @Test fun moveToFullscreen_tdaFreeform_windowingModeSetToFullscreen() { fun moveToFullscreen_tdaFreeform_windowingModeSetToFullscreen() { val task = setUpFreeformTask() val task = setUpFreeformTask() Loading @@ -945,6 +963,44 @@ class DesktopTasksControllerTest : ShellTestCase() { .isEqualTo(WINDOWING_MODE_FULLSCREEN) .isEqualTo(WINDOWING_MODE_FULLSCREEN) } } @Test fun moveToFullscreen_tdaFreeform_windowingModeFullscreen_removesWallpaperActivity() { val task = setUpFreeformTask() val wallpaperToken = MockToken().token() desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken assertNotNull(rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)) .configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FREEFORM controller.moveToFullscreen(task.taskId, transitionSource = UNKNOWN) val wct = getLatestExitDesktopWct() val taskChange = assertNotNull(wct.changes[task.token.asBinder()]) assertThat(taskChange.windowingMode).isEqualTo(WINDOWING_MODE_FULLSCREEN) // Removes wallpaper activity when leaving desktop wct.assertRemoveAt(index = 0, wallpaperToken) } @Test fun moveToFullscreen_multipleVisibleNonMinimizedTasks_doesNotRemoveWallpaperActivity() { val task1 = setUpFreeformTask() // Setup task2 setUpFreeformTask() val wallpaperToken = MockToken().token() desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken assertNotNull(rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)) .configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FULLSCREEN controller.moveToFullscreen(task1.taskId, transitionSource = UNKNOWN) val wct = getLatestExitDesktopWct() val task1Change = assertNotNull(wct.changes[task1.token.asBinder()]) assertThat(task1Change.windowingMode).isEqualTo(WINDOWING_MODE_UNDEFINED) // Does not remove wallpaper activity, as desktop still has a visible desktop task assertThat(wct.hierarchyOps).isEmpty() } @Test @Test fun moveToFullscreen_nonExistentTask_doesNothing() { fun moveToFullscreen_nonExistentTask_doesNothing() { controller.moveToFullscreen(999, transitionSource = UNKNOWN) controller.moveToFullscreen(999, transitionSource = UNKNOWN) Loading Loading @@ -1768,6 +1824,49 @@ class DesktopTasksControllerTest : ShellTestCase() { .isEqualTo(WINDOWING_MODE_UNDEFINED) // inherited FULLSCREEN .isEqualTo(WINDOWING_MODE_UNDEFINED) // inherited FULLSCREEN } } @Test fun moveFocusedTaskToFullscreen_onlyVisibleNonMinimizedTask_removesWallpaperActivity() { val task1 = setUpFreeformTask() val task2 = setUpFreeformTask() val task3 = setUpFreeformTask() val wallpaperToken = MockToken().token() task1.isFocused = false task2.isFocused = true task3.isFocused = false desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken desktopModeTaskRepository.minimizeTask(DEFAULT_DISPLAY, task1.taskId) desktopModeTaskRepository.updateVisibleFreeformTasks(DEFAULT_DISPLAY, task3.taskId, visible = false) controller.enterFullscreen(DEFAULT_DISPLAY, transitionSource = UNKNOWN) val wct = getLatestExitDesktopWct() val taskChange = assertNotNull(wct.changes[task2.token.asBinder()]) assertThat(taskChange.windowingMode).isEqualTo(WINDOWING_MODE_UNDEFINED) // inherited FULLSCREEN wct.assertRemoveAt(index = 0, wallpaperToken) } @Test fun moveFocusedTaskToFullscreen_multipleVisibleTasks_doesNotRemoveWallpaperActivity() { val task1 = setUpFreeformTask() val task2 = setUpFreeformTask() val task3 = setUpFreeformTask() val wallpaperToken = MockToken().token() task1.isFocused = false task2.isFocused = true task3.isFocused = false desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken controller.enterFullscreen(DEFAULT_DISPLAY, transitionSource = UNKNOWN) val wct = getLatestExitDesktopWct() val taskChange = assertNotNull(wct.changes[task2.token.asBinder()]) assertThat(taskChange.windowingMode).isEqualTo(WINDOWING_MODE_UNDEFINED) // inherited FULLSCREEN // Does not remove wallpaper activity, as desktop still has visible desktop tasks assertThat(wct.hierarchyOps).isEmpty() } @Test @Test @EnableFlags(Flags.FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS) @EnableFlags(Flags.FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS) fun dragToDesktop_landscapeDevice_resizable_undefinedOrientation_defaultLandscapeBounds() { fun dragToDesktop_landscapeDevice_resizable_undefinedOrientation_defaultLandscapeBounds() { Loading Loading @@ -1977,6 +2076,7 @@ class DesktopTasksControllerTest : ShellTestCase() { eq(null)) eq(null)) } } @Test fun enterSplit_freeformTaskIsMovedToSplit() { fun enterSplit_freeformTaskIsMovedToSplit() { val task1 = setUpFreeformTask() val task1 = setUpFreeformTask() val task2 = setUpFreeformTask() val task2 = setUpFreeformTask() Loading @@ -1986,14 +2086,67 @@ class DesktopTasksControllerTest : ShellTestCase() { task2.isFocused = true task2.isFocused = true task3.isFocused = false task3.isFocused = false controller.enterSplit(DEFAULT_DISPLAY, false) controller.enterSplit(DEFAULT_DISPLAY, leftOrTop = false) verify(splitScreenController) verify(splitScreenController) .requestEnterSplitSelect( .requestEnterSplitSelect( task2, eq(task2), any(), any(), SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT, eq(SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT), task2.configuration.windowConfiguration.bounds) eq(task2.configuration.windowConfiguration.bounds)) } @Test fun enterSplit_onlyVisibleNonMinimizedTask_removesWallpaperActivity() { val task1 = setUpFreeformTask() val task2 = setUpFreeformTask() val task3 = setUpFreeformTask() val wallpaperToken = MockToken().token() task1.isFocused = false task2.isFocused = true task3.isFocused = false desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken desktopModeTaskRepository.minimizeTask(DEFAULT_DISPLAY, task1.taskId) desktopModeTaskRepository.updateVisibleFreeformTasks(DEFAULT_DISPLAY, task3.taskId, visible = false) controller.enterSplit(DEFAULT_DISPLAY, leftOrTop = false) val wctArgument = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) verify(splitScreenController) .requestEnterSplitSelect( eq(task2), wctArgument.capture(), eq(SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT), eq(task2.configuration.windowConfiguration.bounds)) // Removes wallpaper activity when leaving desktop wctArgument.value.assertRemoveAt(index = 0, wallpaperToken) } @Test fun enterSplit_multipleVisibleNonMinimizedTasks_removesWallpaperActivity() { val task1 = setUpFreeformTask() val task2 = setUpFreeformTask() val task3 = setUpFreeformTask() val wallpaperToken = MockToken().token() task1.isFocused = false task2.isFocused = true task3.isFocused = false desktopModeTaskRepository.wallpaperActivityToken = wallpaperToken controller.enterSplit(DEFAULT_DISPLAY, leftOrTop = false) val wctArgument = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) verify(splitScreenController) .requestEnterSplitSelect( eq(task2), wctArgument.capture(), eq(SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT), eq(task2.configuration.windowConfiguration.bounds)) // Does not remove wallpaper activity, as desktop still has visible desktop tasks assertThat(wctArgument.value.hierarchyOps).isEmpty() } } @Test @Test Loading