diff options
2 files changed, 69 insertions, 12 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserver.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserver.kt index 7dabeb7c9d15..2ec6105e5af9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserver.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserver.kt @@ -38,6 +38,8 @@ import com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.isExitDesktop import com.android.wm.shell.desktopmode.desktopwallpaperactivity.DesktopWallpaperActivityTokenProvider import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE import com.android.wm.shell.shared.TransitionUtil +import com.android.wm.shell.shared.TransitionUtil.isClosingMode +import com.android.wm.shell.shared.TransitionUtil.isOpeningMode import com.android.wm.shell.shared.desktopmode.DesktopModeStatus import com.android.wm.shell.sysui.ShellInit import com.android.wm.shell.transition.Transitions @@ -345,18 +347,29 @@ class DesktopTasksTransitionObserver( } private fun updateTopTransparentFullscreenTaskId(info: TransitionInfo) { - info.changes.forEach { change -> - change.taskInfo?.let { task -> - val desktopRepository = desktopUserRepositories.getProfile(task.userId) - val displayId = task.displayId - // Clear `topTransparentFullscreenTask` information from repository if task - // is closed or sent to back. - if ( - TransitionUtil.isClosingMode(change.mode) && - task.taskId == - desktopRepository.getTopTransparentFullscreenTaskId(displayId) - ) { - desktopRepository.clearTopTransparentFullscreenTaskId(displayId) + run forEachLoop@{ + info.changes.forEach { change -> + change.taskInfo?.let { task -> + val desktopRepository = desktopUserRepositories.getProfile(task.userId) + val displayId = task.displayId + val transparentTaskId = + desktopRepository.getTopTransparentFullscreenTaskId(displayId) + if (transparentTaskId == null) return@forEachLoop + val changeMode = change.mode + val taskId = task.taskId + val isTopTransparentFullscreenTaskClosing = + taskId == transparentTaskId && isClosingMode(changeMode) + val isNonTopTransparentFullscreenTaskOpening = + taskId != transparentTaskId && isOpeningMode(changeMode) + // Clear `topTransparentFullscreenTask` information from repository if task + // is closed, sent to back or if a different task is opened, brought to front. + if ( + isTopTransparentFullscreenTaskClosing || + isNonTopTransparentFullscreenTaskOpening + ) { + desktopRepository.clearTopTransparentFullscreenTaskId(displayId) + return@forEachLoop + } } } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserverTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserverTest.kt index a7dc706eb6c9..ac9a509ac6cb 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserverTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserverTest.kt @@ -336,6 +336,50 @@ class DesktopTasksTransitionObserverTest { } @Test + @EnableFlags( + Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY, + Flags.FLAG_INCLUDE_TOP_TRANSPARENT_FULLSCREEN_TASK_IN_DESKTOP_HEURISTIC, + ) + fun nonTopTransparentTaskOpened_clearTopTransparentTaskIdFromRepository() { + val mockTransition = Mockito.mock(IBinder::class.java) + val topTransparentTask = createTaskInfo(1) + val nonTopTransparentTask = createTaskInfo(2) + whenever(taskRepository.getTopTransparentFullscreenTaskId(any())) + .thenReturn(topTransparentTask.taskId) + + transitionObserver.onTransitionReady( + transition = mockTransition, + info = createOpenChangeTransition(nonTopTransparentTask), + startTransaction = mock(), + finishTransaction = mock(), + ) + + verify(taskRepository).clearTopTransparentFullscreenTaskId(topTransparentTask.displayId) + } + + @Test + @EnableFlags( + Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY, + Flags.FLAG_INCLUDE_TOP_TRANSPARENT_FULLSCREEN_TASK_IN_DESKTOP_HEURISTIC, + ) + fun nonTopTransparentTaskSentToFront_clearTopTransparentTaskIdFromRepository() { + val mockTransition = Mockito.mock(IBinder::class.java) + val topTransparentTask = createTaskInfo(1) + val nonTopTransparentTask = createTaskInfo(2) + whenever(taskRepository.getTopTransparentFullscreenTaskId(any())) + .thenReturn(topTransparentTask.taskId) + + transitionObserver.onTransitionReady( + transition = mockTransition, + info = createToFrontTransition(nonTopTransparentTask), + startTransaction = mock(), + finishTransaction = mock(), + ) + + verify(taskRepository).clearTopTransparentFullscreenTaskId(topTransparentTask.displayId) + } + + @Test fun transitCloseWallpaper_wallpaperActivityVisibilitySaved() { val wallpaperTask = createWallpaperTaskInfo() |