Merge "Revert "Revert "Use the Coreographer's frame time for a more rel..."" into main

This commit is contained in:
Luca Zuccarini
2024-12-05 10:23:36 +00:00
committed by Android (Google) Code Review
2 changed files with 25 additions and 5 deletions

View File

@@ -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<RemoteAnimationTarget[], WindowAnimationState[]> targetsAndStates =
extractTargetsAndStates(mRemoteTargetHandles, velocityPxPerMs);
extractTargetsAndStates(
mRemoteTargetHandles, timestamp, velocityPxPerMs);
mRecentsAnimationController.handOffAnimation(
targetsAndStates.first, targetsAndStates.second);
ActiveGestureProtoLogProxy.logHandOffAnimation();

View File

@@ -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<RemoteAnimationTarget[], WindowAnimationState[]> 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];