diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index 19700142c0..fbc8d6a306 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -80,6 +80,8 @@ import android.os.IBinder; import android.os.SystemClock; import android.util.Log; import android.util.Pair; +import android.util.TimeUtils; +import android.view.Choreographer; import android.view.MotionEvent; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; @@ -1734,13 +1736,30 @@ public abstract class AbsSwipeUpHandler< } private void handOffAnimation(PointF velocityPxPerMs) { - if (!TransitionAnimator.Companion.longLivedReturnAnimationsEnabled() - || mRecentsAnimationController == null) { + if (!TransitionAnimator.Companion.longLivedReturnAnimationsEnabled()) { + return; + } + + // This function is not guaranteed to be called inside a frame. We try to access the frame + // time immediately, but if we're not inside a frame we must post a callback to be run at + // the beginning of the next frame. + try { + handOffAnimationInternal(Choreographer.getInstance().getFrameTime(), velocityPxPerMs); + } catch (IllegalStateException e) { + Choreographer.getInstance().postFrameCallback( + frameTimeNanos -> handOffAnimationInternal( + frameTimeNanos / TimeUtils.NANOS_PER_MS, velocityPxPerMs)); + } + } + + private void handOffAnimationInternal(long timestamp, PointF velocityPxPerMs) { + if (mRecentsAnimationController == null) { return; } Pair targetsAndStates = - extractTargetsAndStates(mRemoteTargetHandles, velocityPxPerMs); + extractTargetsAndStates( + mRemoteTargetHandles, timestamp, velocityPxPerMs); mRecentsAnimationController.handOffAnimation( targetsAndStates.first, targetsAndStates.second); ActiveGestureProtoLogProxy.logHandOffAnimation(); diff --git a/quickstep/src/com/android/quickstep/TaskViewUtils.java b/quickstep/src/com/android/quickstep/TaskViewUtils.java index 783c87c8af..084cede033 100644 --- a/quickstep/src/com/android/quickstep/TaskViewUtils.java +++ b/quickstep/src/com/android/quickstep/TaskViewUtils.java @@ -795,14 +795,15 @@ public final class TaskViewUtils { * second applies to the target in the same index of the first. * * @param handles The handles wrapping each target. + * @param timestamp The start time of the current frame. * @param velocityPxPerMs The current velocity of the target animations. */ @NonNull public static Pair extractTargetsAndStates( - @NonNull RemoteTargetHandle[] handles, @NonNull PointF velocityPxPerMs) { + @NonNull RemoteTargetHandle[] handles, long timestamp, + @NonNull PointF velocityPxPerMs) { RemoteAnimationTarget[] targets = new RemoteAnimationTarget[handles.length]; WindowAnimationState[] animationStates = new WindowAnimationState[handles.length]; - long timestamp = System.currentTimeMillis(); for (int i = 0; i < handles.length; i++) { targets[i] = handles[i].getTransformParams().getTargetSet().apps[i];