From 55ab97b862b370c84d70c2995e62c27685031d7b Mon Sep 17 00:00:00 2001 From: An An Yu Date: Thu, 14 Apr 2022 14:59:53 -0700 Subject: [PATCH] Update ActivityEmbedding default TaskFragment animations to crossfade. Test: tested locally on 1p app. Change-Id: I1c4bd4d51ad0a9c909cf2cb002849b267868e1f2 --- .../anim-ldrtl/task_fragment_close_enter.xml | 38 ++++++++++++++++++ .../anim-ldrtl/task_fragment_close_exit.xml | 40 +++++++++++++++++++ .../anim-ldrtl/task_fragment_open_enter.xml | 40 +++++++++++++++++++ .../anim-ldrtl/task_fragment_open_exit.xml | 38 ++++++++++++++++++ .../res/anim/task_fragment_close_enter.xml | 21 ++++++---- .../res/res/anim/task_fragment_close_exit.xml | 19 ++++----- .../res/res/anim/task_fragment_open_enter.xml | 14 +++---- core/res/res/anim/task_fragment_open_exit.xml | 20 ++++++---- .../TaskFragmentAnimationAdapter.java | 32 +++++++-------- 9 files changed, 210 insertions(+), 52 deletions(-) create mode 100644 core/res/res/anim-ldrtl/task_fragment_close_enter.xml create mode 100644 core/res/res/anim-ldrtl/task_fragment_close_exit.xml create mode 100644 core/res/res/anim-ldrtl/task_fragment_open_enter.xml create mode 100644 core/res/res/anim-ldrtl/task_fragment_open_exit.xml diff --git a/core/res/res/anim-ldrtl/task_fragment_close_enter.xml b/core/res/res/anim-ldrtl/task_fragment_close_enter.xml new file mode 100644 index 0000000000000..e5f5707c9a208 --- /dev/null +++ b/core/res/res/anim-ldrtl/task_fragment_close_enter.xml @@ -0,0 +1,38 @@ + + + + + + + + + \ No newline at end of file diff --git a/core/res/res/anim-ldrtl/task_fragment_close_exit.xml b/core/res/res/anim-ldrtl/task_fragment_close_exit.xml new file mode 100644 index 0000000000000..c5a36542cc7df --- /dev/null +++ b/core/res/res/anim-ldrtl/task_fragment_close_exit.xml @@ -0,0 +1,40 @@ + + + + + + + + + \ No newline at end of file diff --git a/core/res/res/anim-ldrtl/task_fragment_open_enter.xml b/core/res/res/anim-ldrtl/task_fragment_open_enter.xml new file mode 100644 index 0000000000000..b6f1af3e78408 --- /dev/null +++ b/core/res/res/anim-ldrtl/task_fragment_open_enter.xml @@ -0,0 +1,40 @@ + + + + + + + + \ No newline at end of file diff --git a/core/res/res/anim-ldrtl/task_fragment_open_exit.xml b/core/res/res/anim-ldrtl/task_fragment_open_exit.xml new file mode 100644 index 0000000000000..6cea53c3e934b --- /dev/null +++ b/core/res/res/anim-ldrtl/task_fragment_open_exit.xml @@ -0,0 +1,38 @@ + + + + + + + + \ No newline at end of file diff --git a/core/res/res/anim/task_fragment_close_enter.xml b/core/res/res/anim/task_fragment_close_enter.xml index c940552d53ad7..cb6cdbeb71f4f 100644 --- a/core/res/res/anim/task_fragment_close_enter.xml +++ b/core/res/res/anim/task_fragment_close_enter.xml @@ -17,16 +17,21 @@ - + + + android:startOffset="0" + android:duration="200" /> \ No newline at end of file diff --git a/core/res/res/anim/task_fragment_close_exit.xml b/core/res/res/anim/task_fragment_close_exit.xml index 8998f764ff9b8..84d8b7e6b5cd3 100644 --- a/core/res/res/anim/task_fragment_close_exit.xml +++ b/core/res/res/anim/task_fragment_close_exit.xml @@ -19,24 +19,21 @@ android:shareInterpolator="false" android:zAdjustment="top"> - + + + android:duration="200" /> diff --git a/core/res/res/anim/task_fragment_open_enter.xml b/core/res/res/anim/task_fragment_open_enter.xml index 6bc47deb2de43..aa61e6f170700 100644 --- a/core/res/res/anim/task_fragment_open_enter.xml +++ b/core/res/res/anim/task_fragment_open_enter.xml @@ -25,17 +25,13 @@ android:fillAfter="true" android:interpolator="@interpolator/linear" android:startOffset="50" - android:duration="50"/> - + + android:duration="400" /> diff --git a/core/res/res/anim/task_fragment_open_exit.xml b/core/res/res/anim/task_fragment_open_exit.xml index 160eb84223dae..b4914d21d0978 100644 --- a/core/res/res/anim/task_fragment_open_exit.xml +++ b/core/res/res/anim/task_fragment_open_exit.xml @@ -17,16 +17,20 @@ - + + + android:duration="400" /> \ No newline at end of file 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 b3becad3dc5ac..cdee9e386b339 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationAdapter.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentAnimationAdapter.java @@ -17,6 +17,8 @@ package androidx.window.extensions.embedding; import static android.graphics.Matrix.MSCALE_X; +import static android.graphics.Matrix.MTRANS_X; +import static android.graphics.Matrix.MTRANS_Y; import android.graphics.Rect; import android.view.Choreographer; @@ -96,22 +98,20 @@ 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); + // Get current animation position. + final int positionX = Math.round(mMatrix[MTRANS_X]); + final int positionY = Math.round(mMatrix[MTRANS_Y]); + // The exiting surface starts at position: mTarget.localBounds and moves with + // positionX varying. Offset our crop region by the amount we have slided so crop + // regions stays exactly on the original container in split. + final int cropOffsetX = mTarget.localBounds.left - positionX; + final int cropOffsetY = mTarget.localBounds.top - positionY; + final Rect cropRect = new Rect(); + cropRect.set(mTarget.localBounds); + // Because window crop uses absolute position. + cropRect.offsetTo(0, 0); + cropRect.offset(cropOffsetX, cropOffsetY); + t.setCrop(mLeash, cropRect); } /** Called after animation finished. */