Loading libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt +32 −14 Original line number Diff line number Diff line Loading @@ -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) } } Loading @@ -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) { desktopRepository.addTask(taskInfo.displayId, taskInfo.taskId, 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) } desktopRepository.updateTask(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible) } 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 2: Freeform task is changed outside Desktop Mode. desktopRepository.removeTask(taskInfo.displayId, taskInfo.taskId) // 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, ) } } } Loading @@ -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) } 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. } Loading @@ -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: Loading libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListenerTest.kt +43 −13 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListener.kt +32 −14 Original line number Diff line number Diff line Loading @@ -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) } } Loading @@ -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) { desktopRepository.addTask(taskInfo.displayId, taskInfo.taskId, 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) } desktopRepository.updateTask(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible) } 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 2: Freeform task is changed outside Desktop Mode. desktopRepository.removeTask(taskInfo.displayId, taskInfo.taskId) // 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, ) } } } Loading @@ -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) } 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. } Loading @@ -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: Loading
libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTaskChangeListenerTest.kt +43 −13 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading @@ -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) Loading