From a09442c0990a81d9ff5d0defcc52a4556503f459 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Fri, 24 Sep 2021 10:23:57 +0800 Subject: [PATCH] Don't offset snapshot surface position The snapshot surface will be offset with its parent, so no need to offset itself. Bug: 196173550 Test: test with demo app on click back from split to split. Change-Id: I1c65bf2e4b1b8c489ad7fe5eec1418707d590d13 --- .../embedding/TaskFragmentAnimationAdapter.java | 13 +++++++++---- .../embedding/TaskFragmentAnimationRunner.java | 7 +++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationAdapter.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationAdapter.java index 65bd9f330e371..06f6228623d8b 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationAdapter.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationAdapter.java @@ -16,6 +16,7 @@ package androidx.window.extensions.embedding; +import android.graphics.Point; import android.graphics.Rect; import android.view.Choreographer; import android.view.RemoteAnimationTarget; @@ -24,6 +25,7 @@ import android.view.animation.Animation; import android.view.animation.Transformation; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; /** * Wrapper to handle the TaskFragment animation update in one {@link SurfaceControl.Transaction}. @@ -33,6 +35,7 @@ class TaskFragmentAnimationAdapter { private final RemoteAnimationTarget mTarget; private final SurfaceControl mLeash; private final boolean mSizeChanged; + private final Point mPosition; private final Transformation mTransformation = new Transformation(); private final float[] mMatrix = new float[9]; private final float[] mVecs = new float[4]; @@ -41,7 +44,7 @@ class TaskFragmentAnimationAdapter { TaskFragmentAnimationAdapter(@NonNull Animation animation, @NonNull RemoteAnimationTarget target) { - this(animation, target, target.leash, false /* sizeChanged */); + this(animation, target, target.leash, false /* sizeChanged */, null /* position */); } /** @@ -49,11 +52,14 @@ class TaskFragmentAnimationAdapter { */ TaskFragmentAnimationAdapter(@NonNull Animation animation, @NonNull RemoteAnimationTarget target, @NonNull SurfaceControl leash, - boolean sizeChanged) { + boolean sizeChanged, @Nullable Point position) { mAnimation = animation; mTarget = target; mLeash = leash; mSizeChanged = sizeChanged; + mPosition = position != null + ? position + : new Point(target.localBounds.left, target.localBounds.top); } /** Called on frame update. */ @@ -65,8 +71,7 @@ class TaskFragmentAnimationAdapter { currentPlayTime = Math.min(currentPlayTime, mAnimation.getDuration()); mAnimation.getTransformation(currentPlayTime, mTransformation); - mTransformation.getMatrix().postTranslate( - mTarget.localBounds.left, mTarget.localBounds.top); + mTransformation.getMatrix().postTranslate(mPosition.x, mPosition.y); t.setMatrix(mLeash, mTransformation.getMatrix(), mMatrix); t.setAlpha(mLeash, mTransformation.getAlpha()); t.setFrameTimelineVsync(Choreographer.getInstance().getVsyncId()); diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java index bb37fff297a7f..3980d077a7dd5 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationRunner.java @@ -23,6 +23,7 @@ import static android.view.WindowManager.TRANSIT_OLD_TASK_FRAGMENT_OPEN; import android.animation.Animator; import android.animation.ValueAnimator; +import android.graphics.Point; import android.os.Handler; import android.os.Looper; import android.os.RemoteException; @@ -193,10 +194,12 @@ class TaskFragmentAnimationRunner extends IRemoteAnimationRunner.Stub { if (target.startBounds != null) { final Animation[] animations = mAnimationSpec.createChangeBoundsChangeAnimations(target); + // The snapshot surface will always be at (0, 0) of its parent. adapters.add(new TaskFragmentAnimationAdapter(animations[0], target, - target.startLeash, false /* sizeChanged */)); + target.startLeash, false /* sizeChanged */, new Point(0, 0))); + // The end surface will have size change for scaling. adapters.add(new TaskFragmentAnimationAdapter(animations[1], target, - target.leash, true /* sizeChanged */)); + target.leash, true /* sizeChanged */, null /* position */)); continue; }