diff options
Diffstat (limited to 'libs')
4 files changed, 35 insertions, 37 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java index fd387d1811fb..37296531ee34 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java @@ -350,7 +350,7 @@ public class PipMotionHelper implements PipAppOpsListener.Callback, } cancelPhysicsAnimation(); mMenuController.hideMenu(ANIM_TYPE_DISMISS, false /* resize */); - mPipScheduler.removePipAfterAnimation(); + mPipScheduler.scheduleRemovePip(); } /** Sets the movement bounds to use to constrain PIP position animations. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java index 4461a5c6a70c..7f673d2efc68 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java @@ -122,34 +122,26 @@ public class PipScheduler { * Schedules exit PiP via expand transition. */ public void scheduleExitPipViaExpand() { - WindowContainerTransaction wct = getExitPipViaExpandTransaction(); - if (wct != null) { - mMainExecutor.execute(() -> { + mMainExecutor.execute(() -> { + if (!mPipTransitionState.isInPip()) return; + WindowContainerTransaction wct = getExitPipViaExpandTransaction(); + if (wct != null) { mPipTransitionController.startExitTransition(TRANSIT_EXIT_PIP, wct, null /* destinationBounds */); - }); - } - } - - // TODO: Optimize this by running the animation as part of the transition - /** Runs remove PiP animation and schedules remove PiP transition after the animation ends. */ - public void removePipAfterAnimation() { - SurfaceControl.Transaction tx = mSurfaceControlTransactionFactory.getTransaction(); - PipAlphaAnimator animator = mPipAlphaAnimatorSupplier.get(mContext, - mPipTransitionState.getPinnedTaskLeash(), tx, PipAlphaAnimator.FADE_OUT); - animator.setAnimationEndCallback(this::scheduleRemovePipImmediately); - animator.start(); + } + }); } /** Schedules remove PiP transition. */ - private void scheduleRemovePipImmediately() { - WindowContainerTransaction wct = getRemovePipTransaction(); - if (wct != null) { - mMainExecutor.execute(() -> { + public void scheduleRemovePip() { + mMainExecutor.execute(() -> { + if (!mPipTransitionState.isInPip()) return; + WindowContainerTransaction wct = getRemovePipTransaction(); + if (wct != null) { mPipTransitionController.startExitTransition(TRANSIT_REMOVE_PIP, wct, null /* destinationBounds */); - }); - } + } + }); } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java index acb5622b041c..2e38449d4584 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java @@ -278,7 +278,8 @@ public class PipTransition extends PipTransitionController implements } if (isRemovePipTransition(info)) { - return removePipImmediately(info, startTransaction, finishTransaction, finishCallback); + mPipTransitionState.setState(PipTransitionState.EXITING_PIP); + return startRemoveAnimation(info, startTransaction, finishTransaction, finishCallback); } return false; } @@ -668,13 +669,18 @@ public class PipTransition extends PipTransitionController implements return true; } - private boolean removePipImmediately(@NonNull TransitionInfo info, + private boolean startRemoveAnimation(@NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction startTransaction, @NonNull SurfaceControl.Transaction finishTransaction, @NonNull Transitions.TransitionFinishCallback finishCallback) { - startTransaction.apply(); - finishCallback.onTransitionFinished(null); - mPipTransitionState.setState(PipTransitionState.EXITED_PIP); + TransitionInfo.Change pipChange = getChangeByToken(info, + mPipTransitionState.getPipTaskToken()); + mFinishCallback = finishCallback; + PipAlphaAnimator animator = new PipAlphaAnimator(mContext, pipChange.getLeash(), + startTransaction, PipAlphaAnimator.FADE_OUT); + finishTransaction.setAlpha(pipChange.getLeash(), 0f); + animator.setAnimationEndCallback(this::finishTransition); + animator.start(); return true; } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip2/phone/PipSchedulerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip2/phone/PipSchedulerTest.java index 3fe8c109807a..a8aa25700c7e 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip2/phone/PipSchedulerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip2/phone/PipSchedulerTest.java @@ -120,15 +120,22 @@ public class PipSchedulerTest { @Test public void scheduleExitPipViaExpand_nullTaskToken_noop() { setNullPipTaskToken(); + when(mMockPipTransitionState.isInPip()).thenReturn(true); mPipScheduler.scheduleExitPipViaExpand(); - verify(mMockMainExecutor, never()).execute(any()); + verify(mMockMainExecutor, times(1)).execute(mRunnableArgumentCaptor.capture()); + assertNotNull(mRunnableArgumentCaptor.getValue()); + mRunnableArgumentCaptor.getValue().run(); + + verify(mMockPipTransitionController, never()) + .startExitTransition(eq(TRANSIT_EXIT_PIP), any(), isNull()); } @Test public void scheduleExitPipViaExpand_exitTransitionCalled() { setMockPipTaskToken(); + when(mMockPipTransitionState.isInPip()).thenReturn(true); mPipScheduler.scheduleExitPipViaExpand(); @@ -142,20 +149,13 @@ public class PipSchedulerTest { @Test public void removePipAfterAnimation() { - //TODO: Update once this is changed to run animation as part of transition setMockPipTaskToken(); + when(mMockPipTransitionState.isInPip()).thenReturn(true); - mPipScheduler.removePipAfterAnimation(); - verify(mMockAlphaAnimator, times(1)) - .setAnimationEndCallback(mRunnableArgumentCaptor.capture()); - assertNotNull(mRunnableArgumentCaptor.getValue()); - verify(mMockAlphaAnimator, times(1)).start(); - - mRunnableArgumentCaptor.getValue().run(); + mPipScheduler.scheduleRemovePip(); verify(mMockMainExecutor, times(1)).execute(mRunnableArgumentCaptor.capture()); assertNotNull(mRunnableArgumentCaptor.getValue()); - mRunnableArgumentCaptor.getValue().run(); verify(mMockPipTransitionController, times(1)) |