From 03f9c385bdbe9b059cf5800c9c0340c9169d5def Mon Sep 17 00:00:00 2001 From: Gustav Sennton Date: Fri, 31 Jan 2025 15:05:27 +0000 Subject: Relax home-task assertion in end-drag-to-desktop transition Bug: 392514321 Bug: 392826275 Flag: com.android.window.flags.enable_desktop_windowing_enter_transition_bugfix Test: manual Change-Id: I85def62b247acca6128011a987325ce3915941bb --- .../desktopmode/DragToDesktopTransitionHandler.kt | 13 +++-- .../DragToDesktopTransitionHandlerTest.kt | 56 ++++++++++++++++++---- 2 files changed, 57 insertions(+), 12 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt index cc3d86c0c056..2ac76f319d32 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt @@ -959,9 +959,16 @@ constructor( super.setupEndDragToDesktop(info, startTransaction, finishTransaction) val state = requireTransitionState() - val homeLeash = state.homeChange?.leash ?: error("Expects home leash to be non-null") - // Hide home on finish to prevent flickering when wallpaper activity flag is enabled - finishTransaction.hide(homeLeash) + val homeLeash = state.homeChange?.leash + if (homeLeash == null) { + ProtoLog.e( + ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, + "DragToDesktop: home leash is null", + ) + } else { + // Hide home on finish to prevent flickering when wallpaper activity flag is enabled + finishTransaction.hide(homeLeash) + } // Setup freeform tasks before animation state.freeformTaskChanges.forEach { change -> val startScale = FREEFORM_TASKS_INITIAL_SCALE diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt index 33dc1aadf548..25246d9984c3 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt @@ -476,6 +476,40 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { verify(finishCallback).onTransitionFinished(null) } + @Test + fun mergeAnimation_endTransition_springHandler_noStartHomeChange_doesntCrash() { + whenever(dragAnimator.computeCurrentVelocity()).thenReturn(PointF()) + val playingFinishTransaction = mock() + val mergedStartTransaction = mock() + val mergedFinishTransaction = mock() + val finishCallback = mock() + val task = createTask() + val startTransition = startDrag( + springHandler, task, finishTransaction = playingFinishTransaction, homeChange = null) + springHandler.onTaskResizeAnimationListener = mock() + + springHandler.mergeAnimation( + transition = mock(), + info = + createTransitionInfo( + type = TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP, + draggedTask = task, + ), + startT = mergedStartTransaction, + finishT = mergedFinishTransaction, + mergeTarget = startTransition, + finishCallback = finishCallback, + ) + + // Should show dragged task layer in start and finish transaction + verify(mergedStartTransaction).show(draggedTaskLeash) + verify(playingFinishTransaction).show(draggedTaskLeash) + // Should update the dragged task layer + verify(mergedStartTransaction).setLayer(eq(draggedTaskLeash), anyInt()) + // Should merge animation + verify(finishCallback).onTransitionFinished(null) + } + @Test fun propertyValue_returnsSystemPropertyValue() { val name = "property_name" @@ -589,6 +623,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { handler: DragToDesktopTransitionHandler, task: RunningTaskInfo = createTask(), finishTransaction: SurfaceControl.Transaction = mock(), + homeChange: TransitionInfo.Change? = createHomeChange(), ): IBinder { whenever(dragAnimator.position).thenReturn(PointF()) // Simulate transition is started and is ready to animate. @@ -599,6 +634,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { createTransitionInfo( type = TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP, draggedTask = task, + homeChange = homeChange, ), startTransaction = mock(), finishTransaction = finishTransaction, @@ -684,16 +720,12 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { } } - private fun createTransitionInfo(type: Int, draggedTask: RunningTaskInfo) = + private fun createTransitionInfo( + type: Int, + draggedTask: RunningTaskInfo, + homeChange: TransitionInfo.Change? = createHomeChange()) = TransitionInfo(type, /* flags= */ 0).apply { - addChange( // Home. - TransitionInfo.Change(mock(), homeTaskLeash).apply { - parent = null - taskInfo = - TestRunningTaskInfoBuilder().setActivityType(ACTIVITY_TYPE_HOME).build() - flags = flags or FLAG_IS_WALLPAPER - } - ) + homeChange?.let { addChange(it) } addChange( // Dragged Task. TransitionInfo.Change(mock(), draggedTaskLeash).apply { parent = null @@ -709,6 +741,12 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { ) } + private fun createHomeChange() = TransitionInfo.Change(mock(), homeTaskLeash).apply { + parent = null + taskInfo = TestRunningTaskInfoBuilder().setActivityType(ACTIVITY_TYPE_HOME).build() + flags = flags or FLAG_IS_WALLPAPER + } + private fun systemPropertiesKey(name: String) = "${SpringDragToDesktopTransitionHandler.SYSTEM_PROPERTIES_GROUP}.$name" } -- cgit v1.2.3-59-g8ed1b