summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Gustav Sennton <gsennton@google.com> 2024-11-25 15:52:06 +0000
committer Gustav Sennton <gsennton@google.com> 2024-11-29 12:45:06 +0000
commita0ba0e12d6da198cf4fe4cb2e1be2114dd79bc94 (patch)
treeffdb353813379481daedac207e5bf137ff71975f
parente6f0a01776cd5524f5ff1d091c0c5cc531c1ff93 (diff)
Desktop: check wallpaper to know if last window is closing
Before this CL, to know whether Desktop Mode is closing, we would check whether the closing task is the last active task in our desktop repository. However, in cases where we close the last task while the second to last task is still closing there will still be two active tasks in our desktop repository. In this CL we instead determine whether desktop mode is closing by checking whether the wallpaper activity is closing. Bug: 379852092 Test: ensure closing last task while 2nd last still closing works Flag: com.android.window.flags.enable_desktop_windowing_exit_transitions Change-Id: I7e999e6baf4e809409f54d7093f0b32609866f38 Change-Id: Iab045e98e0e5f88925dfc4f0dd7166494910269b
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt16
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt64
2 files changed, 52 insertions, 28 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt
index 36904fb5a05f..7764688695f7 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt
@@ -23,6 +23,7 @@ import android.os.Handler
import android.os.IBinder
import android.view.SurfaceControl
import android.view.WindowManager
+import android.view.WindowManager.TRANSIT_CLOSE
import android.view.WindowManager.TRANSIT_OPEN
import android.window.DesktopModeFlags
import android.window.TransitionInfo
@@ -197,8 +198,9 @@ class DesktopMixedTransitionHandler(
logW("Should have closing desktop task")
return false
}
- if (isLastDesktopTask(closeChange)) {
- // Dispatch close desktop task animation to the default transition handlers.
+ if (isWallpaperActivityClosing(info)) {
+ // If the wallpaper activity is closing then the desktop is closing, animate the closing
+ // desktop by dispatching to other transition handlers.
return dispatchCloseLastDesktopTaskAnimation(
transition,
info,
@@ -419,10 +421,12 @@ class DesktopMixedTransitionHandler(
) != null
}
- private fun isLastDesktopTask(change: TransitionInfo.Change): Boolean =
- change.taskInfo?.let {
- desktopUserRepositories.getProfile(it.userId).getExpandedTaskCount(it.displayId) == 1
- } ?: false
+ private fun isWallpaperActivityClosing(info: TransitionInfo) =
+ info.changes.any { change ->
+ change.mode == TRANSIT_CLOSE &&
+ change.taskInfo != null &&
+ DesktopWallpaperActivity.isWallpaperTask(change.taskInfo!!)
+ }
private fun findCloseDesktopTaskChange(info: TransitionInfo): TransitionInfo.Change? {
if (info.type != WindowManager.TRANSIT_CLOSE) return null
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt
index 267bbb6c51e8..49a7e2951a7e 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt
@@ -21,6 +21,7 @@ import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD
import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN
import android.app.WindowConfiguration.WindowingMode
+import android.content.Intent
import android.os.Binder
import android.os.Handler
import android.os.IBinder
@@ -36,7 +37,9 @@ import android.view.WindowManager.TRANSIT_NONE
import android.view.WindowManager.TRANSIT_OPEN
import android.view.WindowManager.TRANSIT_TO_BACK
import android.view.WindowManager.TransitionType
+import android.window.IWindowContainerToken
import android.window.TransitionInfo
+import android.window.WindowContainerToken
import android.window.WindowContainerTransaction
import androidx.test.filters.SmallTest
import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE
@@ -188,7 +191,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
fun startAnimation_withoutClosingDesktopTask_returnsFalse() {
val transition = mock<IBinder>()
val transitionInfo =
- createTransitionInfo(
+ createCloseTransitionInfo(
changeMode = TRANSIT_OPEN,
task = createTask(WINDOWING_MODE_FREEFORM)
)
@@ -213,8 +216,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
fun startAnimation_withClosingDesktopTask_callsCloseTaskHandler() {
val wct = WindowContainerTransaction()
val transition = mock<IBinder>()
- val transitionInfo = createTransitionInfo(task = createTask(WINDOWING_MODE_FREEFORM))
- whenever(desktopRepository.getExpandedTaskCount(any())).thenReturn(2)
+ val transitionInfo = createCloseTransitionInfo(task = createTask(WINDOWING_MODE_FREEFORM))
whenever(
closeDesktopTaskTransitionHandler.startAnimation(any(), any(), any(), any(), any())
)
@@ -243,8 +245,8 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
fun startAnimation_withClosingLastDesktopTask_dispatchesTransition() {
val wct = WindowContainerTransaction()
val transition = mock<IBinder>()
- val transitionInfo = createTransitionInfo(task = createTask(WINDOWING_MODE_FREEFORM))
- whenever(desktopRepository.getExpandedTaskCount(any())).thenReturn(1)
+ val transitionInfo = createCloseTransitionInfo(
+ task = createTask(WINDOWING_MODE_FREEFORM), withWallpaper = true)
whenever(transitions.dispatchTransition(any(), any(), any(), any(), any(), any()))
.thenReturn(mock())
whenever(transitions.startTransition(WindowManager.TRANSIT_CLOSE, wct, mixedHandler))
@@ -355,7 +357,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
val otherChange = createChange(createTask(WINDOWING_MODE_FREEFORM))
mixedHandler.startAnimation(
transition,
- createTransitionInfo(
+ createCloseTransitionInfo(
TRANSIT_OPEN,
listOf(launchTaskChange, otherChange)
),
@@ -395,7 +397,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
val immersiveChange = createChange(immersiveTask)
mixedHandler.startAnimation(
transition,
- createTransitionInfo(
+ createCloseTransitionInfo(
TRANSIT_OPEN,
listOf(launchTaskChange, immersiveChange)
),
@@ -437,7 +439,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
)
mixedHandler.startAnimation(
transition,
- createTransitionInfo(
+ createCloseTransitionInfo(
TRANSIT_OPEN,
listOf(launchTaskChange)
),
@@ -471,7 +473,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
)
mixedHandler.startAnimation(
transition,
- createTransitionInfo(
+ createCloseTransitionInfo(
TRANSIT_OPEN,
listOf(launchTaskChange, minimizeChange)
),
@@ -505,7 +507,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
val started = mixedHandler.startAnimation(
transition,
- createTransitionInfo(
+ createCloseTransitionInfo(
TRANSIT_OPEN,
listOf(nonLaunchTaskChange)
),
@@ -535,7 +537,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
val started = mixedHandler.startAnimation(
transition,
- createTransitionInfo(
+ createCloseTransitionInfo(
TRANSIT_OPEN,
listOf(createChange(task, mode = TRANSIT_OPEN))
),
@@ -569,7 +571,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
val openingChange = createChange(openingTask, mode = TRANSIT_OPEN)
val started = mixedHandler.startAnimation(
transition,
- createTransitionInfo(
+ createCloseTransitionInfo(
TRANSIT_OPEN,
listOf(immersiveChange, openingChange)
),
@@ -604,7 +606,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
)
mixedHandler.startAnimation(
transition,
- createTransitionInfo(
+ createCloseTransitionInfo(
TRANSIT_OPEN,
listOf(launchTaskChange)
),
@@ -640,7 +642,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
)
mixedHandler.startAnimation(
transition,
- createTransitionInfo(
+ createCloseTransitionInfo(
TRANSIT_OPEN,
listOf(launchTaskChange, minimizeChange)
),
@@ -670,7 +672,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
val launchTaskChange = createChange(launchingTask)
mixedHandler.startAnimation(
transition,
- createTransitionInfo(
+ createCloseTransitionInfo(
TRANSIT_OPEN,
listOf(launchTaskChange)
),
@@ -727,7 +729,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
val started = mixedHandler.startAnimation(
transition = transition,
info =
- createTransitionInfo(
+ createCloseTransitionInfo(
TRANSIT_TO_BACK,
listOf(minimizingTaskChange)
),
@@ -766,7 +768,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
mixedHandler.startAnimation(
transition = transition,
info =
- createTransitionInfo(
+ createCloseTransitionInfo(
TRANSIT_TO_BACK,
listOf(minimizingTaskChange)
),
@@ -786,12 +788,12 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
)
}
- private fun createTransitionInfo(
- type: Int = WindowManager.TRANSIT_CLOSE,
+ private fun createCloseTransitionInfo(
changeMode: Int = WindowManager.TRANSIT_CLOSE,
- task: RunningTaskInfo
+ task: RunningTaskInfo,
+ withWallpaper: Boolean = false,
): TransitionInfo =
- TransitionInfo(type, 0 /* flags */).apply {
+ TransitionInfo(WindowManager.TRANSIT_CLOSE, 0 /* flags */).apply {
addChange(
TransitionInfo.Change(mock(), closingTaskLeash).apply {
mode = changeMode
@@ -799,9 +801,18 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
taskInfo = task
}
)
+ if (withWallpaper) {
+ addChange(
+ TransitionInfo.Change(/* container= */ mock(), /* leash= */ mock()).apply {
+ mode = WindowManager.TRANSIT_CLOSE
+ parent = null
+ taskInfo = createWallpaperTask()
+ }
+ )
+ }
}
- private fun createTransitionInfo(
+ private fun createCloseTransitionInfo(
@TransitionType type: Int,
changes: List<TransitionInfo.Change> = emptyList()
): TransitionInfo = TransitionInfo(type, /* flags= */ 0).apply {
@@ -822,4 +833,13 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() {
.setActivityType(ACTIVITY_TYPE_STANDARD)
.setWindowingMode(windowingMode)
.build()
+
+ private fun createWallpaperTask() =
+ RunningTaskInfo().apply {
+ token = WindowContainerToken(mock<IWindowContainerToken>())
+ baseIntent =
+ Intent().apply {
+ component = DesktopWallpaperActivity.wallpaperActivityComponent
+ }
+ }
}