diff options
| author | 2021-06-08 12:35:24 -0700 | |
|---|---|---|
| committer | 2021-06-08 13:13:39 -0700 | |
| commit | 6422ad45c925f3c8eaba7c57e3781183ca83051a (patch) | |
| tree | 6652ea89e30f637c052a0b7dfcdf2e8bfd0b6708 | |
| parent | 7b8b7b5cba9e6a1dbe2a6eff803f3e41ba5c4fdc (diff) | |
Polish round corner for auto-enter-pip
Video: http://recall/-/aaaaaabFQoRHlzixHdtY/b47ErxSscLnZl9clVncSY6
Bug: 187834841
Test: manual, see video
Change-Id: I59132ea50a3213a9caa2366c103fdddf642498e2
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java | 6 | ||||
| -rw-r--r-- | packages/SystemUI/shared/src/com/android/systemui/shared/pip/PipSurfaceTransactionHelper.java | 31 |
2 files changed, 27 insertions, 10 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java index 7d032ad90535..afd7d2694ad6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java @@ -628,8 +628,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, final Rect destinationBounds = mPipBoundsState.getBounds(); final SurfaceControl swipeToHomeOverlay = mSwipePipToHomeOverlay; final SurfaceControl.Transaction tx = mSurfaceControlTransactionFactory.getTransaction(); - mSurfaceTransactionHelper.resetScale(tx, mLeash, destinationBounds); - mSurfaceTransactionHelper.crop(tx, mLeash, destinationBounds); + mSurfaceTransactionHelper + .resetScale(tx, mLeash, destinationBounds) + .crop(tx, mLeash, destinationBounds) + .round(tx, mLeash, isInPip()); // The animation is finished in the Launcher and here we directly apply the final touch. applyEnterPipSyncTransaction(destinationBounds, () -> { // Ensure menu's settled in its final bounds first. diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/pip/PipSurfaceTransactionHelper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/pip/PipSurfaceTransactionHelper.java index 74aa1384e1f8..fb9aa4a4b358 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/pip/PipSurfaceTransactionHelper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/pip/PipSurfaceTransactionHelper.java @@ -46,12 +46,13 @@ public class PipSurfaceTransactionHelper { mTmpSourceRectF.set(sourceBounds); mTmpDestinationRectF.set(destinationBounds); mTmpTransform.setRectToRect(mTmpSourceRectF, mTmpDestinationRectF, Matrix.ScaleToFit.FILL); + final float cornerRadius = getScaledCornerRadius(sourceBounds, destinationBounds); tx.setMatrix(leash, mTmpTransform, mTmpFloat9) .setPosition(leash, mTmpDestinationRectF.left, mTmpDestinationRectF.top) - .setCornerRadius(leash, mCornerRadius); + .setCornerRadius(leash, cornerRadius); return new PictureInPictureSurfaceTransaction( mTmpDestinationRectF.left, mTmpDestinationRectF.top, - mTmpFloat9, 0 /* rotation */, mCornerRadius, sourceBounds); + mTmpFloat9, 0 /* rotation */, cornerRadius, sourceBounds); } public PictureInPictureSurfaceTransaction scale( @@ -62,11 +63,12 @@ public class PipSurfaceTransactionHelper { mTmpDestinationRectF.set(destinationBounds); mTmpTransform.setRectToRect(mTmpSourceRectF, mTmpDestinationRectF, Matrix.ScaleToFit.FILL); mTmpTransform.postRotate(degree, 0, 0); + final float cornerRadius = getScaledCornerRadius(sourceBounds, destinationBounds); tx.setMatrix(leash, mTmpTransform, mTmpFloat9) .setPosition(leash, positionX, positionY) - .setCornerRadius(leash, mCornerRadius); + .setCornerRadius(leash, cornerRadius); return new PictureInPictureSurfaceTransaction( - positionX, positionY, mTmpFloat9, degree, mCornerRadius, sourceBounds); + positionX, positionY, mTmpFloat9, degree, cornerRadius, sourceBounds); } public PictureInPictureSurfaceTransaction scaleAndCrop( @@ -83,12 +85,15 @@ public class PipSurfaceTransactionHelper { final float left = destinationBounds.left - insets.left * scale; final float top = destinationBounds.top - insets.top * scale; mTmpTransform.setScale(scale, scale); + final Rect cornerRadiusRect = new Rect(destinationBounds); + cornerRadiusRect.inset(insets); + final float cornerRadius = getScaledCornerRadius(sourceBounds, cornerRadiusRect); tx.setMatrix(leash, mTmpTransform, mTmpFloat9) .setWindowCrop(leash, mTmpDestinationRect) .setPosition(leash, left, top) - .setCornerRadius(leash, mCornerRadius); + .setCornerRadius(leash, cornerRadius); return new PictureInPictureSurfaceTransaction( - left, top, mTmpFloat9, 0 /* rotation */, mCornerRadius, mTmpDestinationRect); + left, top, mTmpFloat9, 0 /* rotation */, cornerRadius, mTmpDestinationRect); } public PictureInPictureSurfaceTransaction scaleAndRotate( @@ -105,12 +110,22 @@ public class PipSurfaceTransactionHelper { : (float) destinationBounds.height() / sourceBounds.height(); mTmpTransform.setRotate(degree, 0, 0); mTmpTransform.postScale(scale, scale); + final Rect cornerRadiusRect = new Rect(destinationBounds); + cornerRadiusRect.inset(insets); + final float cornerRadius = getScaledCornerRadius(sourceBounds, cornerRadiusRect); tx.setMatrix(leash, mTmpTransform, mTmpFloat9) .setWindowCrop(leash, mTmpDestinationRect) .setPosition(leash, positionX, positionY) - .setCornerRadius(leash, mCornerRadius); + .setCornerRadius(leash, cornerRadius); return new PictureInPictureSurfaceTransaction( - positionX, positionY, mTmpFloat9, degree, mCornerRadius, mTmpDestinationRect); + positionX, positionY, mTmpFloat9, degree, cornerRadius, mTmpDestinationRect); + } + + /** @return the round corner radius scaled by given from and to bounds */ + private float getScaledCornerRadius(Rect fromBounds, Rect toBounds) { + final float scale = (float) (Math.hypot(fromBounds.width(), fromBounds.height()) + / Math.hypot(toBounds.width(), toBounds.height())); + return mCornerRadius * scale; } /** @return {@link SurfaceControl.Transaction} instance with vsync-id */ |