Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9eef0e56 authored by Gustav Sennton's avatar Gustav Sennton
Browse files

Fix enter-desktop-by-drag cuj to only cancel when aborted.

Fix the CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_RELEASE interaction as it
was showing up as cancelled even when the transition finished correctly.

Test: DragToDesktopTransitionHandlerTest & Perfetto trace.
Bug: 357811393
Flag: com.android.window.flags.enable_desktop_windowing_mode
Change-Id: I8ebebc10cd141098665dc93536500651213a4df3
parent b84b0870
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -629,15 +629,20 @@ sealed class DragToDesktopTransitionHandler(
        finishTransaction: SurfaceControl.Transaction?
    ) {
        val state = transitionState ?: return
        if (aborted && state.startTransitionToken == transition) {
        if (!aborted) {
            return
        }
        if (state.startTransitionToken == transition) {
            ProtoLog.v(
                ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE,
                "DragToDesktop: onTransitionConsumed() start transition aborted"
            )
            state.startAborted = true
            // Cancel CUJ interaction if the transition is aborted.
            // The start-transition (DRAG_HOLD) is aborted, cancel its jank interaction.
            interactionJankMonitor.cancel(CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_HOLD)
        } else if (state.cancelTransitionToken != transition) {
            // This transition being aborted is neither the start, nor the cancel transition, so
            // it must be the finish transition (DRAG_RELEASE); cancel its jank interaction.
            interactionJankMonitor.cancel(CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_RELEASE)
        }
    }
+38 −0
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ import android.window.TransitionInfo.FLAG_IS_WALLPAPER
import android.window.WindowContainerTransaction
import androidx.test.filters.SmallTest
import com.android.dx.mockito.inline.extended.ExtendedMockito
import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_HOLD
import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_RELEASE
import com.android.internal.jank.InteractionJankMonitor
import com.android.wm.shell.RootTaskDisplayAreaOrganizer
import com.android.wm.shell.ShellTestCase
@@ -448,6 +450,42 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() {
        )
    }

    @Test
    fun startDragToDesktop_aborted_logsDragHoldCancelled() {
        val transition = startDragToDesktopTransition(defaultHandler, createTask(), dragAnimator)

        defaultHandler.onTransitionConsumed(transition, aborted = true, mock())

        verify(mockInteractionJankMonitor).cancel(eq(CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_HOLD))
        verify(mockInteractionJankMonitor, times(0)).cancel(
            eq(CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_RELEASE))
    }

    @Test
    fun mergeEndDragToDesktop_aborted_logsDragReleaseCancelled() {
        val task = createTask()
        val startTransition = startDrag(defaultHandler, task)
        val endTransition = mock<IBinder>()
        defaultHandler.onTaskResizeAnimationListener = mock()
        defaultHandler.mergeAnimation(
            transition = endTransition,
            info = createTransitionInfo(
                type = TRANSIT_DESKTOP_MODE_END_DRAG_TO_DESKTOP,
                draggedTask = task
            ),
            t = mock<SurfaceControl.Transaction>(),
            mergeTarget = startTransition,
            finishCallback = mock<Transitions.TransitionFinishCallback>()
        )

        defaultHandler.onTransitionConsumed(endTransition, aborted = true, mock())

        verify(mockInteractionJankMonitor)
            .cancel(eq(CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_RELEASE))
        verify(mockInteractionJankMonitor, times(0))
            .cancel(eq(CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_HOLD))
    }

    private fun startDrag(
        handler: DragToDesktopTransitionHandler,
        task: RunningTaskInfo = createTask(),