From 3d11e1f06c1884f4d53a5e2af624def3ff4ef3c2 Mon Sep 17 00:00:00 2001 From: Hongwei Wang Date: Thu, 28 May 2020 15:48:06 -0700 Subject: [PATCH] Save reentry fraction when animation is ignored When the exit PiP animation is ignored due to configuraton differs, we need to notify the PipBoundsHandler to save the reentry fraction as we would do in animation started. Video: http://go/recall/-/aaaaaabFQoRHlzixHdtY/fBf5A0hm0SbPxfN9kU8FZc Bug: 157597610 Test: manually enter/exit PiP Change-Id: I23148d3fa0290c619dba5474fa3a413786b1aa4b --- .../systemui/pip/PipTaskOrganizer.java | 66 ++++++++++++------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java index 3a8476729645b..b593bb4a85b0e 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java @@ -110,13 +110,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements new PipAnimationController.PipAnimationCallback() { @Override public void onPipAnimationStart(PipAnimationController.PipTransitionAnimator animator) { - mMainHandler.post(() -> { - for (int i = mPipTransitionCallbacks.size() - 1; i >= 0; i--) { - final PipTransitionCallback callback = mPipTransitionCallbacks.get(i); - callback.onPipTransitionStarted(mTaskInfo.baseActivity, - animator.getTransitionDirection()); - } - }); + sendOnPipTransitionStarted(animator.getTransitionDirection()); } @Override @@ -124,24 +118,12 @@ public class PipTaskOrganizer extends TaskOrganizer implements PipAnimationController.PipTransitionAnimator animator) { finishResize(tx, animator.getDestinationBounds(), animator.getTransitionDirection(), animator.getAnimationType()); - mMainHandler.post(() -> { - for (int i = mPipTransitionCallbacks.size() - 1; i >= 0; i--) { - final PipTransitionCallback callback = mPipTransitionCallbacks.get(i); - callback.onPipTransitionFinished(mTaskInfo.baseActivity, - animator.getTransitionDirection()); - } - }); + sendOnPipTransitionFinished(animator.getTransitionDirection()); } @Override public void onPipAnimationCancel(PipAnimationController.PipTransitionAnimator animator) { - mMainHandler.post(() -> { - for (int i = mPipTransitionCallbacks.size() - 1; i >= 0; i--) { - final PipTransitionCallback callback = mPipTransitionCallbacks.get(i); - callback.onPipTransitionCanceled(mTaskInfo.baseActivity, - animator.getTransitionDirection()); - } - }); + sendOnPipTransitionCancelled(animator.getTransitionDirection()); } }; @@ -281,18 +263,22 @@ public class PipTaskOrganizer extends TaskOrganizer implements final boolean orientationDiffers = initialConfig.windowConfiguration.getRotation() != mPipBoundsHandler.getDisplayRotation(); final WindowContainerTransaction wct = new WindowContainerTransaction(); + final Rect destinationBounds = initialConfig.windowConfiguration.getBounds(); + final int direction = syncWithSplitScreenBounds(destinationBounds) + ? TRANSITION_DIRECTION_TO_SPLIT_SCREEN + : TRANSITION_DIRECTION_TO_FULLSCREEN; if (orientationDiffers) { + // Send started callback though animation is ignored. + sendOnPipTransitionStarted(direction); // Don't bother doing an animation if the display rotation differs or if it's in // a non-supported windowing mode wct.setWindowingMode(mToken, WINDOWING_MODE_UNDEFINED); wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED); WindowOrganizer.applyTransaction(wct); + // Send finished callback though animation is ignored. + sendOnPipTransitionFinished(direction); mInPip = false; } else { - final Rect destinationBounds = initialConfig.windowConfiguration.getBounds(); - final int direction = syncWithSplitScreenBounds(destinationBounds) - ? TRANSITION_DIRECTION_TO_SPLIT_SCREEN - : TRANSITION_DIRECTION_TO_FULLSCREEN; final SurfaceControl.Transaction tx = mSurfaceControlTransactionFactory.getTransaction(); mSurfaceTransactionHelper.scale(tx, mLeash, destinationBounds, @@ -402,6 +388,36 @@ public class PipTaskOrganizer extends TaskOrganizer implements }); } + private void sendOnPipTransitionStarted( + @PipAnimationController.TransitionDirection int direction) { + mMainHandler.post(() -> { + for (int i = mPipTransitionCallbacks.size() - 1; i >= 0; i--) { + final PipTransitionCallback callback = mPipTransitionCallbacks.get(i); + callback.onPipTransitionStarted(mTaskInfo.baseActivity, direction); + } + }); + } + + private void sendOnPipTransitionFinished( + @PipAnimationController.TransitionDirection int direction) { + mMainHandler.post(() -> { + for (int i = mPipTransitionCallbacks.size() - 1; i >= 0; i--) { + final PipTransitionCallback callback = mPipTransitionCallbacks.get(i); + callback.onPipTransitionFinished(mTaskInfo.baseActivity, direction); + } + }); + } + + private void sendOnPipTransitionCancelled( + @PipAnimationController.TransitionDirection int direction) { + mMainHandler.post(() -> { + for (int i = mPipTransitionCallbacks.size() - 1; i >= 0; i--) { + final PipTransitionCallback callback = mPipTransitionCallbacks.get(i); + callback.onPipTransitionCanceled(mTaskInfo.baseActivity, direction); + } + }); + } + /** * Note that dismissing PiP is now originated from SystemUI, see {@link #exitPip(int)}. * Meanwhile this callback is invoked whenever the task is removed. For instance: