Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserver.kt +19 −18 Original line number Diff line number Diff line Loading @@ -185,29 +185,30 @@ class DesktopTasksTransitionObserver( // because for closing tasks we first need to check whether it's because of back navigation // so that we can minimize it if needed. val info = closingTransitionToTransitionInfo.remove(transition) ?: return removeClosingTask(info) removeClosingTasks(info) } /** Finds the closing task in the change and removes it full by a [TRANSIT_CLOSE] transition. */ private fun removeClosingTask(info: TransitionInfo) { val task = /** * Finds the closing tasks in the change and removes them full by a [TRANSIT_CLOSE] transition. */ private fun removeClosingTasks(info: TransitionInfo) { val wct = WindowContainerTransaction() info.changes .find { change -> change.mode == TRANSIT_CLOSE && change.taskInfo != null } ?.taskInfo ?: return transitions.startTransition( TRANSIT_CLOSE, WindowContainerTransaction().removeTask(task.token), null, ) .filter { it.mode == TRANSIT_CLOSE } .mapNotNull { it.taskInfo } .forEach { taskInfo -> if (taskInfo.windowingMode != WINDOWING_MODE_FREEFORM) return@forEach wct.removeTask(taskInfo.token) ProtoLog.d( WM_SHELL_DESKTOP_MODE, "DesktopTasksTransitionObserver: removing closing task=%d fully", task.taskId, taskInfo.taskId, ) } if (!wct.isEmpty) transitions.startTransition(TRANSIT_CLOSE, wct, null) } private fun updateWallpaperToken(info: TransitionInfo) { if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()) { return Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserverTest.kt +20 −16 Original line number Diff line number Diff line Loading @@ -113,7 +113,7 @@ class DesktopTasksTransitionObserverTest : ShellTestCase() { transitionObserver.onTransitionReady( transition = mockTransition, info = createCloseTransition(task), info = createCloseTransition(listOf(task)), startTransaction = mock(), finishTransaction = mock(), ) Loading Loading @@ -143,7 +143,7 @@ class DesktopTasksTransitionObserverTest : ShellTestCase() { transitionObserver.onTransitionReady( transition = mockTransition, info = createCloseTransition(topTransparentTask), info = createCloseTransition(listOf(topTransparentTask)), startTransaction = mock(), finishTransaction = mock(), ) Loading Loading @@ -240,7 +240,7 @@ class DesktopTasksTransitionObserverTest : ShellTestCase() { transitionObserver.onTransitionReady( transition = mock(), info = createCloseTransition(wallpaperTask), info = createCloseTransition(listOf(wallpaperTask)), startTransaction = mock(), finishTransaction = mock(), ) Loading @@ -265,7 +265,7 @@ class DesktopTasksTransitionObserverTest : ShellTestCase() { transitionObserver.onTransitionReady( transition = mockTransition, info = createCloseTransition(topTransparentTask), info = createCloseTransition(listOf(topTransparentTask)), startTransaction = mock(), finishTransaction = mock(), ) Loading @@ -281,20 +281,22 @@ class DesktopTasksTransitionObserverTest : ShellTestCase() { fun closingTask_startsTransitionToRemoveFully() { val mockTransition = Mockito.mock(IBinder::class.java) val freeformTask = createTaskInfo(1) val freeformTask2 = createTaskInfo(2) whenever(taskRepository.isAnyDeskActive(any())).thenReturn(true) whenever(mixedHandler.hasTransition(mockTransition)).thenReturn(false) transitionObserver.onTransitionReady( transition = mockTransition, info = createCloseTransition(freeformTask), info = createCloseTransition(listOf(freeformTask, freeformTask2)), startTransaction = mock(), finishTransaction = mock(), ) transitionObserver.onTransitionFinished(transition = mockTransition, aborted = false) val wct = getLatestWct(type = TRANSIT_CLOSE) assertThat(wct.hierarchyOps).hasSize(1) assertThat(wct.hierarchyOps).hasSize(2) wct.assertRemoveAt(index = 0, freeformTask.token) wct.assertRemoveAt(index = 1, freeformTask2.token) } @Test Loading @@ -313,7 +315,7 @@ class DesktopTasksTransitionObserverTest : ShellTestCase() { transitionObserver.onTransitionReady( transition = mockTransition, info = createCloseTransition(topTransparentTask), info = createCloseTransition(listOf(topTransparentTask)), startTransaction = mock(), finishTransaction = mock(), ) Loading Loading @@ -368,17 +370,19 @@ class DesktopTasksTransitionObserverTest : ShellTestCase() { } } private fun createCloseTransition(task: RunningTaskInfo?) = private fun createCloseTransition(tasks: List<RunningTaskInfo?>) = TransitionInfo(TRANSIT_CLOSE, /* flags= */ 0).apply { tasks.forEach { addChange( Change(mock(), mock()).apply { mode = TRANSIT_CLOSE parent = null taskInfo = task taskInfo = it flags = flags } ) } } private fun createToBackTransition(task: RunningTaskInfo?) = TransitionInfo(TRANSIT_TO_BACK, /* flags= */ 0).apply { Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserver.kt +19 −18 Original line number Diff line number Diff line Loading @@ -185,29 +185,30 @@ class DesktopTasksTransitionObserver( // because for closing tasks we first need to check whether it's because of back navigation // so that we can minimize it if needed. val info = closingTransitionToTransitionInfo.remove(transition) ?: return removeClosingTask(info) removeClosingTasks(info) } /** Finds the closing task in the change and removes it full by a [TRANSIT_CLOSE] transition. */ private fun removeClosingTask(info: TransitionInfo) { val task = /** * Finds the closing tasks in the change and removes them full by a [TRANSIT_CLOSE] transition. */ private fun removeClosingTasks(info: TransitionInfo) { val wct = WindowContainerTransaction() info.changes .find { change -> change.mode == TRANSIT_CLOSE && change.taskInfo != null } ?.taskInfo ?: return transitions.startTransition( TRANSIT_CLOSE, WindowContainerTransaction().removeTask(task.token), null, ) .filter { it.mode == TRANSIT_CLOSE } .mapNotNull { it.taskInfo } .forEach { taskInfo -> if (taskInfo.windowingMode != WINDOWING_MODE_FREEFORM) return@forEach wct.removeTask(taskInfo.token) ProtoLog.d( WM_SHELL_DESKTOP_MODE, "DesktopTasksTransitionObserver: removing closing task=%d fully", task.taskId, taskInfo.taskId, ) } if (!wct.isEmpty) transitions.startTransition(TRANSIT_CLOSE, wct, null) } private fun updateWallpaperToken(info: TransitionInfo) { if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()) { return Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserverTest.kt +20 −16 Original line number Diff line number Diff line Loading @@ -113,7 +113,7 @@ class DesktopTasksTransitionObserverTest : ShellTestCase() { transitionObserver.onTransitionReady( transition = mockTransition, info = createCloseTransition(task), info = createCloseTransition(listOf(task)), startTransaction = mock(), finishTransaction = mock(), ) Loading Loading @@ -143,7 +143,7 @@ class DesktopTasksTransitionObserverTest : ShellTestCase() { transitionObserver.onTransitionReady( transition = mockTransition, info = createCloseTransition(topTransparentTask), info = createCloseTransition(listOf(topTransparentTask)), startTransaction = mock(), finishTransaction = mock(), ) Loading Loading @@ -240,7 +240,7 @@ class DesktopTasksTransitionObserverTest : ShellTestCase() { transitionObserver.onTransitionReady( transition = mock(), info = createCloseTransition(wallpaperTask), info = createCloseTransition(listOf(wallpaperTask)), startTransaction = mock(), finishTransaction = mock(), ) Loading @@ -265,7 +265,7 @@ class DesktopTasksTransitionObserverTest : ShellTestCase() { transitionObserver.onTransitionReady( transition = mockTransition, info = createCloseTransition(topTransparentTask), info = createCloseTransition(listOf(topTransparentTask)), startTransaction = mock(), finishTransaction = mock(), ) Loading @@ -281,20 +281,22 @@ class DesktopTasksTransitionObserverTest : ShellTestCase() { fun closingTask_startsTransitionToRemoveFully() { val mockTransition = Mockito.mock(IBinder::class.java) val freeformTask = createTaskInfo(1) val freeformTask2 = createTaskInfo(2) whenever(taskRepository.isAnyDeskActive(any())).thenReturn(true) whenever(mixedHandler.hasTransition(mockTransition)).thenReturn(false) transitionObserver.onTransitionReady( transition = mockTransition, info = createCloseTransition(freeformTask), info = createCloseTransition(listOf(freeformTask, freeformTask2)), startTransaction = mock(), finishTransaction = mock(), ) transitionObserver.onTransitionFinished(transition = mockTransition, aborted = false) val wct = getLatestWct(type = TRANSIT_CLOSE) assertThat(wct.hierarchyOps).hasSize(1) assertThat(wct.hierarchyOps).hasSize(2) wct.assertRemoveAt(index = 0, freeformTask.token) wct.assertRemoveAt(index = 1, freeformTask2.token) } @Test Loading @@ -313,7 +315,7 @@ class DesktopTasksTransitionObserverTest : ShellTestCase() { transitionObserver.onTransitionReady( transition = mockTransition, info = createCloseTransition(topTransparentTask), info = createCloseTransition(listOf(topTransparentTask)), startTransaction = mock(), finishTransaction = mock(), ) Loading Loading @@ -368,17 +370,19 @@ class DesktopTasksTransitionObserverTest : ShellTestCase() { } } private fun createCloseTransition(task: RunningTaskInfo?) = private fun createCloseTransition(tasks: List<RunningTaskInfo?>) = TransitionInfo(TRANSIT_CLOSE, /* flags= */ 0).apply { tasks.forEach { addChange( Change(mock(), mock()).apply { mode = TRANSIT_CLOSE parent = null taskInfo = task taskInfo = it flags = flags } ) } } private fun createToBackTransition(task: RunningTaskInfo?) = TransitionInfo(TRANSIT_TO_BACK, /* flags= */ 0).apply { Loading