Crop the center when no source rect hint
When there is no source rect hint, forge a crop that matches the given
aspect ratio and centered, therefore we can use a consolidated animation
path and fix the issue with the round corner, which was inproperly
scaled in the past.
Flag: NONE bug fix
Bug: 298409662
Test: Test the overlay in both gesture and button navigation mode,\
with both YouTube and Google Maps,\
in both folded and unfolded mode.
Change-Id: I8ae48b999159a51eda2ff41c49cdb3c4e1541176
diff --git a/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java b/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java
index 99f10a7..b13e52d 100644
--- a/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java
+++ b/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java
@@ -154,8 +154,23 @@
}
if (sourceRectHint.isEmpty()) {
- mSourceRectHint.setEmpty();
- mSourceHintRectInsets = null;
+ // Crop a Rect matches the aspect ratio and pivots at the center point.
+ // To make the animation path simplified.
+ final float aspectRatio = destinationBounds.width()
+ / (float) destinationBounds.height();
+ if ((appBounds.width() / (float) appBounds.height()) > aspectRatio) {
+ // use the full height.
+ mSourceRectHint.set(0, 0,
+ (int) (appBounds.height() * aspectRatio), appBounds.height());
+ mSourceRectHint.offset(
+ (appBounds.width() - mSourceRectHint.width()) / 2, 0);
+ } else {
+ // use the full width.
+ mSourceRectHint.set(0, 0,
+ appBounds.width(), (int) (appBounds.width() / aspectRatio));
+ mSourceRectHint.offset(
+ 0, (appBounds.height() - mSourceRectHint.height()) / 2);
+ }
// Create a new overlay layer. We do not call detach on this instance, it's propagated
// to other classes like PipTaskOrganizer / RecentsAnimationController to complete
@@ -168,11 +183,11 @@
Log.d(TAG, getContentOverlay() + " is created: " + reasonForCreateOverlay);
} else {
mSourceRectHint.set(sourceRectHint);
- mSourceHintRectInsets = new Rect(sourceRectHint.left - appBounds.left,
- sourceRectHint.top - appBounds.top,
- appBounds.right - sourceRectHint.right,
- appBounds.bottom - sourceRectHint.bottom);
}
+ mSourceHintRectInsets = new Rect(mSourceRectHint.left - appBounds.left,
+ mSourceRectHint.top - appBounds.top,
+ appBounds.right - mSourceRectHint.right,
+ appBounds.bottom - mSourceRectHint.bottom);
addAnimatorListener(new AnimationSuccessListener() {
@Override
@@ -217,27 +232,7 @@
if (mPipContentOverlay != null) {
mPipContentOverlay.onAnimationUpdate(tx, mCurrentBounds, progress);
}
- final PictureInPictureSurfaceTransaction op;
- if (mSourceHintRectInsets == null) {
- // no source rect hint been set, directly scale the window down
- op = onAnimationScale(progress, tx, mCurrentBounds);
- } else {
- // scale and crop according to the source rect hint
- op = onAnimationScaleAndCrop(progress, tx, mCurrentBounds);
- }
- return op;
- }
-
- /** scale the window directly with no source rect hint being set */
- private PictureInPictureSurfaceTransaction onAnimationScale(
- float progress, SurfaceControl.Transaction tx, Rect bounds) {
- if (mFromRotation == Surface.ROTATION_90 || mFromRotation == Surface.ROTATION_270) {
- final RotatedPosition rotatedPosition = getRotatedPosition(progress);
- return mSurfaceTransactionHelper.scale(tx, mLeash, mAppBounds, bounds,
- rotatedPosition.degree, rotatedPosition.positionX, rotatedPosition.positionY);
- } else {
- return mSurfaceTransactionHelper.scale(tx, mLeash, mAppBounds, bounds);
- }
+ return onAnimationScaleAndCrop(progress, tx, mCurrentBounds);
}
/** scale and crop the window with source rect hint */