Merge "Revert "Extra common logic of default transition animation"" into main
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
index 3a2820ee..f40e0ba 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
@@ -826,26 +826,24 @@
             @NonNull Runnable finishCallback, @NonNull TransactionPool pool,
             @NonNull ShellExecutor mainExecutor, @Nullable Point position, float cornerRadius,
             @Nullable Rect clipRect, boolean isActivity) {
-        final DefaultAnimationAdapter adapter = new DefaultAnimationAdapter(anim, leash,
-                position, clipRect, cornerRadius, isActivity);
-        buildSurfaceAnimation(animations, anim, finishCallback, pool, mainExecutor, adapter);
-    }
-
-    /** Builds an animator for the surface and adds it to the `animations` list. */
-    static void buildSurfaceAnimation(@NonNull ArrayList<Animator> animations,
-            @NonNull Animation anim, @NonNull Runnable finishCallback,
-            @NonNull TransactionPool pool, @NonNull ShellExecutor mainExecutor,
-            @NonNull AnimationAdapter updateListener) {
         final SurfaceControl.Transaction transaction = pool.acquire();
-        updateListener.setTransaction(transaction);
         final ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
+        final Transformation transformation = new Transformation();
+        final float[] matrix = new float[9];
         // Animation length is already expected to be scaled.
         va.overrideDurationScale(1.0f);
         va.setDuration(anim.computeDurationHint());
+        final ValueAnimator.AnimatorUpdateListener updateListener = animation -> {
+            final long currentPlayTime = Math.min(va.getDuration(), va.getCurrentPlayTime());
+
+            applyTransformation(currentPlayTime, transaction, leash, anim, transformation, matrix,
+                    position, cornerRadius, clipRect, isActivity);
+        };
         va.addUpdateListener(updateListener);
 
         final Runnable finisher = () -> {
-            updateListener.onAnimationUpdate(va);
+            applyTransformation(va.getDuration(), transaction, leash, anim, transformation, matrix,
+                    position, cornerRadius, clipRect, isActivity);
 
             pool.release(transaction);
             mainExecutor.execute(() -> {
@@ -1009,88 +1007,37 @@
                 || animType == ANIM_FROM_STYLE;
     }
 
-    /** The animation adapter for buildSurfaceAnimation. */
-    abstract static class AnimationAdapter implements ValueAnimator.AnimatorUpdateListener {
-        @NonNull final SurfaceControl mLeash;
-        @NonNull SurfaceControl.Transaction mTransaction;
-        private Choreographer mChoreographer;
+    private static void applyTransformation(long time, SurfaceControl.Transaction t,
+            SurfaceControl leash, Animation anim, Transformation tmpTransformation, float[] matrix,
+            Point position, float cornerRadius, @Nullable Rect immutableClipRect,
+            boolean isActivity) {
+        tmpTransformation.clear();
+        anim.getTransformation(time, tmpTransformation);
+        if (com.android.graphics.libgui.flags.Flags.edgeExtensionShader()
+                && anim.getExtensionEdges() != 0x0 && isActivity) {
+            t.setEdgeExtensionEffect(leash, anim.getExtensionEdges());
+        }
+        if (position != null) {
+            tmpTransformation.getMatrix().postTranslate(position.x, position.y);
+        }
+        t.setMatrix(leash, tmpTransformation.getMatrix(), matrix);
+        t.setAlpha(leash, tmpTransformation.getAlpha());
 
-        AnimationAdapter(@NonNull SurfaceControl leash) {
-            mLeash = leash;
+        final Rect clipRect = immutableClipRect == null ? null : new Rect(immutableClipRect);
+        Insets extensionInsets = Insets.min(tmpTransformation.getInsets(), Insets.NONE);
+        if (!extensionInsets.equals(Insets.NONE) && clipRect != null && !clipRect.isEmpty()) {
+            // Clip out any overflowing edge extension
+            clipRect.inset(extensionInsets);
+            t.setCrop(leash, clipRect);
         }
 
-        void setTransaction(@NonNull SurfaceControl.Transaction transaction) {
-            mTransaction = transaction;
+        if (anim.hasRoundedCorners() && cornerRadius > 0 && clipRect != null) {
+            // We can only apply rounded corner if a crop is set
+            t.setCrop(leash, clipRect);
+            t.setCornerRadius(leash, cornerRadius);
         }
 
-        @Override
-        public void onAnimationUpdate(@NonNull ValueAnimator animator) {
-            applyTransformation(animator);
-            if (mChoreographer == null) {
-                mChoreographer = Choreographer.getInstance();
-            }
-            mTransaction.setFrameTimelineVsync(mChoreographer.getVsyncId());
-            mTransaction.apply();
-        }
-
-        abstract void applyTransformation(@NonNull ValueAnimator animator);
-    }
-
-    private static class DefaultAnimationAdapter extends AnimationAdapter {
-        final Transformation mTransformation = new Transformation();
-        final float[] mMatrix = new float[9];
-        @NonNull final Animation mAnim;
-        @Nullable final Point mPosition;
-        @Nullable final Rect mClipRect;
-        final float mCornerRadius;
-        final boolean mIsActivity;
-
-        DefaultAnimationAdapter(@NonNull Animation anim, @NonNull SurfaceControl leash,
-                @Nullable Point position, @Nullable Rect clipRect, float cornerRadius,
-                boolean isActivity) {
-            super(leash);
-            mAnim = anim;
-            mPosition = (position != null && (position.x != 0 || position.y != 0))
-                    ? position : null;
-            mClipRect = (clipRect != null && !clipRect.isEmpty()) ? clipRect : null;
-            mCornerRadius = cornerRadius;
-            mIsActivity = isActivity;
-        }
-
-        @Override
-        void applyTransformation(@NonNull ValueAnimator animator) {
-            final long currentPlayTime = Math.min(animator.getDuration(),
-                    animator.getCurrentPlayTime());
-            final Transformation transformation = mTransformation;
-            final SurfaceControl.Transaction t = mTransaction;
-            final SurfaceControl leash = mLeash;
-            transformation.clear();
-            mAnim.getTransformation(currentPlayTime, transformation);
-            if (com.android.graphics.libgui.flags.Flags.edgeExtensionShader()
-                    && mIsActivity && mAnim.getExtensionEdges() != 0) {
-                t.setEdgeExtensionEffect(leash, mAnim.getExtensionEdges());
-            }
-            if (mPosition != null) {
-                transformation.getMatrix().postTranslate(mPosition.x, mPosition.y);
-            }
-            t.setMatrix(leash, transformation.getMatrix(), mMatrix);
-            t.setAlpha(leash, transformation.getAlpha());
-
-            if (mClipRect != null) {
-                Rect clipRect = mClipRect;
-                final Insets extensionInsets = Insets.min(transformation.getInsets(), Insets.NONE);
-                if (!extensionInsets.equals(Insets.NONE)) {
-                    // Clip out any overflowing edge extension.
-                    clipRect = new Rect(mClipRect);
-                    clipRect.inset(extensionInsets);
-                    t.setCrop(leash, clipRect);
-                }
-                if (mCornerRadius > 0 && mAnim.hasRoundedCorners()) {
-                    // Rounded corner can only be applied if a crop is set.
-                    t.setCrop(leash, clipRect);
-                    t.setCornerRadius(leash, mCornerRadius);
-                }
-            }
-        }
+        t.setFrameTimelineVsync(Choreographer.getInstance().getVsyncId());
+        t.apply();
     }
 }