From 6f700c0a087824d49ae798ca7f469da06744630c Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Wed, 14 Jun 2023 22:02:43 +0800 Subject: [PATCH] Reduce flickering when exiting PiP to fullscreen The start transaction should use the operation from the first frame of animation. Otherwise it doesn't include the operations made by source hint or rotation. Note that the change in PipTaskOrganizer doesn't affect anything. Just make sure potential overrides of getExitDestinationBounds take effect, e.g. other form factor with special implementation. Bug: 285086073 Test: Resize PiP to max and expand PiP to fullscreen. Change-Id: Iba87494f7ce76a808e1b8c88053cd9d5b5b1a5d6 --- .../wm/shell/pip/PipTaskOrganizer.java | 3 +-- .../android/wm/shell/pip/PipTransition.java | 21 +++++++++---------- 2 files changed, 11 insertions(+), 13 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 07d11cf9f63c2..76a6a60f96ede 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 @@ -534,8 +534,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, return; } - final Rect displayBounds = mPipBoundsState.getDisplayBounds(); - final Rect destinationBounds = new Rect(displayBounds); + final Rect destinationBounds = new Rect(getExitDestinationBounds()); final int direction = syncWithSplitScreenBounds(destinationBounds, requestEnterSplit) ? TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN : TRANSITION_DIRECTION_LEAVE_PIP; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java index 86b0f33ad54c5..e04e9f7caa91c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTransition.java @@ -351,7 +351,7 @@ public class PipTransition extends PipTransitionController { if (taskInfo != null) { startExpandAnimation(taskInfo, mPipOrganizer.getSurfaceControl(), mPipBoundsState.getBounds(), mPipBoundsState.getBounds(), - new Rect(mExitDestinationBounds), Surface.ROTATION_0); + new Rect(mExitDestinationBounds), Surface.ROTATION_0, null /* startT */); } mExitDestinationBounds.setEmpty(); mCurrentPipTaskToken = null; @@ -604,14 +604,8 @@ public class PipTransition extends PipTransitionController { } } - // Set the initial frame as scaling the end to the start. final Rect destinationBounds = new Rect(pipChange.getEndAbsBounds()); destinationBounds.offset(-offset.x, -offset.y); - startTransaction.setWindowCrop(pipLeash, destinationBounds.width(), - destinationBounds.height()); - mSurfaceTransactionHelper.scale(startTransaction, pipLeash, destinationBounds, - currentBounds); - startTransaction.apply(); // Check if it is fixed rotation. final int rotationDelta; @@ -641,7 +635,7 @@ public class PipTransition extends PipTransitionController { rotationDelta = Surface.ROTATION_0; } startExpandAnimation(taskInfo, pipLeash, currentBounds, currentBounds, destinationBounds, - rotationDelta); + rotationDelta, startTransaction); } private void startExpandAndRotationAnimation(@NonNull TransitionInfo info, @@ -697,7 +691,7 @@ public class PipTransition extends PipTransitionController { private void startExpandAnimation(final TaskInfo taskInfo, final SurfaceControl leash, final Rect baseBounds, final Rect startBounds, final Rect endBounds, - final int rotationDelta) { + final int rotationDelta, @Nullable SurfaceControl.Transaction startTransaction) { final Rect sourceHintRect = PipBoundsAlgorithm.getValidSourceHintRect( taskInfo.pictureInPictureParams, endBounds); final PipAnimationController.PipTransitionAnimator animator = @@ -705,9 +699,14 @@ public class PipTransition extends PipTransitionController { endBounds, sourceHintRect, TRANSITION_DIRECTION_LEAVE_PIP, 0 /* startingAngle */, rotationDelta); animator.setTransitionDirection(TRANSITION_DIRECTION_LEAVE_PIP) - .setPipAnimationCallback(mPipAnimationCallback) + .setDuration(mEnterExitAnimationDuration); + if (startTransaction != null) { + animator.setPipTransactionHandler(mTransactionConsumer).applySurfaceControlTransaction( + leash, startTransaction, PipAnimationController.FRACTION_START); + startTransaction.apply(); + } + animator.setPipAnimationCallback(mPipAnimationCallback) .setPipTransactionHandler(mPipOrganizer.getPipTransactionHandler()) - .setDuration(mEnterExitAnimationDuration) .start(); }