diff options
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java | 125 |
1 files changed, 36 insertions, 89 deletions
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 3a2820ee3aa9..f40e0bac1b4e 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 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { @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 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { || 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; - - AnimationAdapter(@NonNull SurfaceControl leash) { - mLeash = leash; + 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()); } - - void setTransaction(@NonNull SurfaceControl.Transaction transaction) { - mTransaction = transaction; + if (position != null) { + tmpTransformation.getMatrix().postTranslate(position.x, position.y); } - - @Override - public void onAnimationUpdate(@NonNull ValueAnimator animator) { - applyTransformation(animator); - if (mChoreographer == null) { - mChoreographer = Choreographer.getInstance(); - } - mTransaction.setFrameTimelineVsync(mChoreographer.getVsyncId()); - mTransaction.apply(); + t.setMatrix(leash, tmpTransformation.getMatrix(), matrix); + t.setAlpha(leash, tmpTransformation.getAlpha()); + + 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); } - 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; + 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 - 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(); } } |