diff options
| author | 2021-11-17 03:30:36 +0000 | |
|---|---|---|
| committer | 2021-11-17 03:30:36 +0000 | |
| commit | 9b017b058f596ed95542ed88ffe35cc8764ec858 (patch) | |
| tree | dd0cb16bb091ae738563a09a5970fc5546b46ecd | |
| parent | 305274a6b0aea9e04f10a6554f3058f871e310be (diff) | |
| parent | ddd87bf8d9925d11859b9cf964b0fffe6616e19a (diff) | |
Merge "Set window crop for TaskFragment open/close animation" into sc-v2-dev am: ddd87bf8d9
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16239964
Change-Id: Iad7ac0667b9f8593c5dfb431ddf3ebd97b1b1ee2
| -rw-r--r-- | libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationAdapter.java | 20 |
1 files changed, 18 insertions, 2 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 194b6330d92c..89d7a407e459 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationAdapter.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationAdapter.java @@ -39,6 +39,8 @@ class TaskFragmentAnimationAdapter { final Transformation mTransformation = new Transformation(); final float[] mMatrix = new float[9]; + final float[] mVecs = new float[4]; + final Rect mRect = new Rect(); private boolean mIsFirstFrame = true; TaskFragmentAnimationAdapter(@NonNull Animation animation, @@ -76,6 +78,22 @@ class TaskFragmentAnimationAdapter { mTarget.localBounds.left, mTarget.localBounds.top); t.setMatrix(mLeash, mTransformation.getMatrix(), mMatrix); t.setAlpha(mLeash, mTransformation.getAlpha()); + + // Open/close animation may scale up the surface. Apply an inverse scale to the window crop + // so that it will not be covering other windows. + mVecs[1] = mVecs[2] = 0; + mVecs[0] = mVecs[3] = 1; + mTransformation.getMatrix().mapVectors(mVecs); + mVecs[0] = 1.f / mVecs[0]; + mVecs[3] = 1.f / mVecs[3]; + final Rect clipRect = mTarget.localBounds; + mRect.left = (int) (clipRect.left * mVecs[0] + 0.5f); + mRect.right = (int) (clipRect.right * mVecs[0] + 0.5f); + mRect.top = (int) (clipRect.top * mVecs[3] + 0.5f); + mRect.bottom = (int) (clipRect.bottom * mVecs[3] + 0.5f); + mRect.offsetTo(Math.round(mTarget.localBounds.width() * (1 - mVecs[0]) / 2.f), + Math.round(mTarget.localBounds.height() * (1 - mVecs[3]) / 2.f)); + t.setWindowCrop(mLeash, mRect); } /** Called after animation finished. */ @@ -157,8 +175,6 @@ class TaskFragmentAnimationAdapter { * Should be used for the animation of the {@link RemoteAnimationTarget} that has size change. */ static class BoundsChangeAdapter extends TaskFragmentAnimationAdapter { - private final float[] mVecs = new float[4]; - private final Rect mRect = new Rect(); BoundsChangeAdapter(@NonNull Animation animation, @NonNull RemoteAnimationTarget target) { super(animation, target); |