From 8216005fd0579242807dddec43c3451a63b4ea91 Mon Sep 17 00:00:00 2001 From: Pat Manning Date: Tue, 25 Mar 2025 14:35:35 +0000 Subject: [PATCH] Run dismiss immediately if no neighbors exist. Previously was still relying on spring driver to end, even if driving no neighbors. Update live tile before canceling animation to bring task off screen, or else it may still show at the top of the screen. Fix: 405364868 Test: Manual Flag: com.android.launcher3.enable_expressive_dismiss_task_motion Change-Id: Ic9a1b4ba9aaf1ec3830e49bf15573388a6d7a2ad --- .../quickstep/views/RecentsDismissUtils.kt | 40 ++++++++++--------- .../android/quickstep/views/RecentsView.java | 7 ++-- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt b/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt index 31edd65377..3c811a9ae5 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt +++ b/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt @@ -68,15 +68,16 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) { .setSpring(createExpressiveDismissSpringForce()) .setStartVelocity(startVelocity) .addUpdateListener { animation, value, _ -> - if (isDismissing && abs(value) >= abs(dismissLength)) { - animation.cancel() - } else if (draggedTaskView.isRunningTask && recentsView.enableDrawingLiveTile) { + if (draggedTaskView.isRunningTask && recentsView.enableDrawingLiveTile) { recentsView.runActionOnRemoteHandles { remoteTargetHandle -> remoteTargetHandle.taskViewSimulator.taskSecondaryTranslation.value = taskDismissFloatProperty.getValue(draggedTaskView) } recentsView.redrawLiveTile() } + if (isDismissing && abs(value) >= abs(dismissLength)) { + animation.cancel() + } } .addEndListener { _, _, _, _ -> if (isDismissing) { @@ -444,7 +445,17 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) { } } - if (tasksToReflow.isNotEmpty()) { + // Start animations and remove the dismissed task at the end, dismiss immediately if no + // neighboring tasks exist. + val runGridEndAnimationAndRelayout = { dismissDuration: Int -> + recentsView.expressiveDismissTaskView(dismissedTaskView, onEndRunnable, dismissDuration) + } + val runImmediately = tasksToReflow.isEmpty() + if (runImmediately) { + // Play the same haptic as when neighbors spring into place. + MSDLPlayerWrapper.INSTANCE.get(recentsView.context)?.playToken(MSDLToken.CANCEL) + runGridEndAnimationAndRelayout(DISMISS_IMMEDIATE_DURATION) + } else { addNeighborSettlingSpringAnimations( dismissedTaskView, springAnimationDriver, @@ -453,22 +464,13 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) { isSpringDirectionVertical = false, minVelocity = 0f, ) - } else { - springAnimationDriver.addEndListener { _, _, _, _ -> - // Play the same haptic as when neighbors spring into place. - MSDLPlayerWrapper.INSTANCE.get(recentsView.context)?.playToken(MSDLToken.CANCEL) + springAnimationDriver.apply { + addEndListener { _, _, _, _ -> + runGridEndAnimationAndRelayout(DISMISS_DEFAULT_DURATION) + } + animateToFinalPosition(dismissedTaskGap) } } - - // Start animations and remove the dismissed task at the end, dismiss immediately if no - // neighboring tasks exist. - val runGridEndAnimationAndRelayout = { - recentsView.expressiveDismissTaskView(dismissedTaskView, onEndRunnable) - } - springAnimationDriver?.apply { - addEndListener { _, _, _, _ -> runGridEndAnimationAndRelayout() } - animateToFinalPosition(dismissedTaskGap) - } ?: runGridEndAnimationAndRelayout() } private fun getDismissedTaskGapForReflow(dismissedTaskView: TaskView): Float { @@ -557,5 +559,7 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) { // The additional damping to apply to tasks further from the dismissed task. private const val ADDITIONAL_DISMISS_DAMPING_RATIO = 0.15f private const val RECENTS_SCALE_SPRING_MULTIPLIER = 1000f + private const val DISMISS_DEFAULT_DURATION = 300 + private const val DISMISS_IMMEDIATE_DURATION = 10 } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 9f916cb685..15af8ff9b9 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -4718,10 +4718,11 @@ public abstract class RecentsView< runDismissAnimation(pa); } - protected void expressiveDismissTaskView(TaskView taskView, Function0 onEndRunnable) { - PendingAnimation pa = new PendingAnimation(DISMISS_TASK_DURATION); + protected void expressiveDismissTaskView(TaskView taskView, Function0 onEndRunnable, + int dismissDuration) { + PendingAnimation pa = new PendingAnimation(dismissDuration); createTaskDismissAnimation(pa, taskView, false /* animateTaskView */, true /* removeTask */, - DISMISS_TASK_DURATION, false /* dismissingForSplitSelection*/, + dismissDuration, false /* dismissingForSplitSelection*/, true /* isExpressiveDismiss */); pa.addEndListener((success) -> onEndRunnable.invoke()); runDismissAnimation(pa);