diff options
| author | 2025-02-26 20:52:41 -0800 | |
|---|---|---|
| committer | 2025-02-26 20:52:41 -0800 | |
| commit | 2a0824e295b9866e4f4afca5181b92d77a27fe75 (patch) | |
| tree | b6b1aefc6f174f401393ef6f0ac42bd3ebcbd185 | |
| parent | 59c660c413b10486cb9d5d8215712900559ffaca (diff) | |
| parent | fa195b9027a242e2b3cdea563df770d7172b3c85 (diff) | |
Merge "Update the DesktopTaskChangeListener logic to work correctly for task management." into main
2 files changed, 75 insertions, 27 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt index 6034299453fb..70a648f57125 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt @@ -35,7 +35,7 @@ class DesktopTaskChangeListener(private val desktopUserRepositories: DesktopUser desktopRepository.removeTask(taskInfo.displayId, taskInfo.taskId) return } - if (isFreeformTask(taskInfo)) { + if (isFreeformTask(taskInfo) && !desktopRepository.isActiveTask(taskInfo.taskId)) { desktopRepository.addTask(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible) } } @@ -44,23 +44,33 @@ class DesktopTaskChangeListener(private val desktopUserRepositories: DesktopUser logD("onTaskChanging for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId) val desktopRepository: DesktopRepository = desktopUserRepositories.getProfile(taskInfo.userId) - if (!desktopRepository.isActiveTask(taskInfo.taskId)) return - // TODO: b/394281403 - with multiple desks, it's possible to have a non-freeform task // inside a desk, so this should be decoupled from windowing mode. // Also, changes in/out of desks are handled by the [DesksTransitionObserver], which has // more specific information about the desk involved in the transition, which might be // more accurate than assuming it's always the default/active desk in the display, as this // method does. - // Case 1: Freeform task is changed in Desktop Mode. - if (isFreeformTask(taskInfo)) { - if (taskInfo.isVisible) { + // Case 1: When the task change is from a task in the desktop repository which is now + // fullscreen, + // remove the task from the desktop repository since it is no longer a freeform task. + if (!isFreeformTask(taskInfo)) { + if (desktopRepository.isActiveTask(taskInfo.taskId)) { + desktopRepository.removeTask(taskInfo.displayId, taskInfo.taskId) + } + } else { // Task change is a freeform task + if (!desktopRepository.isActiveTask(taskInfo.taskId)) { + // Case 2: When the task change is a freeform visible task, but the task is not + // yet active in the desktop repository, adds task to desktop repository. desktopRepository.addTask(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible) + } else { + // Case 3: When the task change is a freeform task which already exists as an active + // task in the desktop repository, updates the task state. + desktopRepository.updateTask( + taskInfo.displayId, + taskInfo.taskId, + taskInfo.isVisible, + ) } - desktopRepository.updateTask(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible) - } else { - // Case 2: Freeform task is changed outside Desktop Mode. - desktopRepository.removeTask(taskInfo.displayId, taskInfo.taskId) } } @@ -82,14 +92,22 @@ class DesktopTaskChangeListener(private val desktopUserRepositories: DesktopUser logD("onTaskMovingToFront for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId) val desktopRepository: DesktopRepository = desktopUserRepositories.getProfile(taskInfo.userId) - if (!desktopRepository.isActiveTask(taskInfo.taskId)) return - if (!isFreeformTask(taskInfo)) { + // When the task change is from a task in the desktop repository which is now fullscreen, + // remove the task from the desktop repository since it is no longer a freeform task. + if (!isFreeformTask(taskInfo) && desktopRepository.isActiveTask(taskInfo.taskId)) { desktopRepository.removeTask(taskInfo.displayId, taskInfo.taskId) } - desktopRepository.addTask(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible) + if (isFreeformTask(taskInfo)) { + // If the task is already active in the repository, then it only moves the task to the + // front. + desktopRepository.addTask(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible) + } } override fun onTaskMovingToBack(taskInfo: RunningTaskInfo) { + val desktopRepository: DesktopRepository = + desktopUserRepositories.getProfile(taskInfo.userId) + if (!desktopRepository.isActiveTask(taskInfo.taskId)) return logD("onTaskMovingToBack for taskId=%d, displayId=%d", taskInfo.taskId, taskInfo.displayId) // TODO: b/367268953 - Connect this with DesktopRepository. } @@ -101,7 +119,7 @@ class DesktopTaskChangeListener(private val desktopUserRepositories: DesktopUser if (!desktopRepository.isActiveTask(taskInfo.taskId)) return // TODO: b/370038902 - Handle Activity#finishAndRemoveTask. if ( - !DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue() || + !DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue || desktopRepository.isClosingTask(taskInfo.taskId) ) { // A task that's vanishing should be removed: diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListenerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListenerTest.kt index 50590f021a2a..6b0ee5b7ffd4 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListenerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListenerTest.kt @@ -56,7 +56,7 @@ class DesktopTaskChangeListenerTest : ShellTestCase() { } @Test - fun onTaskOpening_fullscreenTask_notActiveDesktopTask_noop() { + fun onTaskOpening_fullscreenTask_nonActiveDesktopTask_noop() { val task = createFullscreenTask().apply { isVisible = true } whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(false) @@ -68,7 +68,7 @@ class DesktopTaskChangeListenerTest : ShellTestCase() { } @Test - fun onTaskOpening_freeformTask_activeDesktopTask_removesTaskFromRepo() { + fun onTaskOpening_fullscreenTask_taskIsActiveInDesktopRepo_removesTaskFromDesktopRepo() { val task = createFullscreenTask().apply { isVisible = true } whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true) @@ -78,19 +78,20 @@ class DesktopTaskChangeListenerTest : ShellTestCase() { } @Test - fun onTaskOpening_freeformTask_visibleDesktopTask_addsTaskToRepository() { + fun onTaskOpening_freeformTask_activeInDesktopRepository_noop() { val task = createFreeformTask().apply { isVisible = true } - whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(false) + whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true) desktopTaskChangeListener.onTaskOpening(task) - verify(desktopUserRepositories.current).addTask(task.displayId, task.taskId, task.isVisible) + verify(desktopUserRepositories.current, never()) + .addTask(task.displayId, task.taskId, task.isVisible) } @Test - fun onTaskOpening_freeformTask_nonVisibleDesktopTask_addsTaskToRepository() { + fun onTaskOpening_freeformTask_notActiveInDesktopRepo_addsTaskToRepository() { val task = createFreeformTask().apply { isVisible = false } - whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true) + whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(false) desktopTaskChangeListener.onTaskOpening(task) @@ -98,7 +99,7 @@ class DesktopTaskChangeListenerTest : ShellTestCase() { } @Test - fun onTaskChanging_freeformTaskOutsideDesktop_removesTaskFromRepo() { + fun onTaskChanging_fullscreenTask_activeInDesktopRepository_removesTaskFromRepo() { val task = createFullscreenTask().apply { isVisible = true } whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true) @@ -108,7 +109,27 @@ class DesktopTaskChangeListenerTest : ShellTestCase() { } @Test - fun onTaskChanging_visibleTaskInDesktop_updatesTaskVisibility() { + fun onTaskChanging_fullscreenTask_nonActiveInDesktopRepo_noop() { + val task = createFullscreenTask().apply { isVisible = true } + whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(false) + + desktopTaskChangeListener.onTaskChanging(task) + + verify(desktopUserRepositories.current, never()).removeTask(task.displayId, task.taskId) + } + + @Test + fun onTaskChanging_freeformTask_nonActiveTaskInDesktopRepo_addsTaskToDesktopRepo() { + val task = createFreeformTask().apply { isVisible = true } + whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(false) + + desktopTaskChangeListener.onTaskChanging(task) + + verify(desktopUserRepositories.current).addTask(task.displayId, task.taskId, task.isVisible) + } + + @Test + fun onTaskChanging_freeformTask_activeVisibleTaskInDesktopRepo_updatesTaskVisibility() { val task = createFreeformTask().apply { isVisible = true } whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true) @@ -119,7 +140,7 @@ class DesktopTaskChangeListenerTest : ShellTestCase() { } @Test - fun onTaskChanging_nonVisibleTask_updatesTaskVisibility() { + fun onTaskChanging_freeformTask_activeNonVisibleTask_updatesTaskVisibility() { val task = createFreeformTask().apply { isVisible = false } whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true) @@ -130,7 +151,7 @@ class DesktopTaskChangeListenerTest : ShellTestCase() { } @Test - fun onTaskMovingToFront_freeformTaskOutsideDesktop_removesTaskFromRepo() { + fun onTaskMovingToFront_fullscreenTask_activeTaskInDesktopRepo_removesTaskFromRepo() { val task = createFullscreenTask().apply { isVisible = true } whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true) @@ -140,9 +161,18 @@ class DesktopTaskChangeListenerTest : ShellTestCase() { } @Test - fun onTaskMovingToFront_freeformTaskOutsideDesktop_addsTaskToRepo() { + fun onTaskMovingToFront_fullscreenTask_nonActiveTaskInDesktopRepo_noop() { val task = createFullscreenTask().apply { isVisible = true } - whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(true) + whenever(desktopUserRepositories.current.isActiveTask(task.taskId)).thenReturn(false) + + desktopTaskChangeListener.onTaskMovingToFront(task) + + verify(desktopUserRepositories.current, never()).removeTask(task.displayId, task.taskId) + } + + @Test + fun onTaskMovingToFront_freeformTask_addsTaskToRepo() { + val task = createFreeformTask().apply { isVisible = true } desktopTaskChangeListener.onTaskMovingToFront(task) |