Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +4 −2 Original line number Diff line number Diff line Loading @@ -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. Loading packages/SystemUI/shared/src/com/android/systemui/shared/pip/PipSurfaceTransactionHelper.java +23 −8 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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( Loading @@ -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( Loading @@ -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 */ Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +4 −2 Original line number Diff line number Diff line Loading @@ -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. Loading
packages/SystemUI/shared/src/com/android/systemui/shared/pip/PipSurfaceTransactionHelper.java +23 −8 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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( Loading @@ -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( Loading @@ -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 */ Loading