diff options
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java | 42 |
1 files changed, 33 insertions, 9 deletions
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 6471760be6d8..2bcbe3013397 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 @@ -31,6 +31,7 @@ import static com.android.wm.shell.transition.Transitions.TRANSIT_EXIT_PIP; import static com.android.wm.shell.transition.Transitions.TRANSIT_REMOVE_PIP; import static com.android.wm.shell.transition.Transitions.TRANSIT_RESIZE_PIP; +import android.animation.ValueAnimator; import android.annotation.NonNull; import android.app.ActivityManager; import android.app.PictureInPictureParams; @@ -120,6 +121,8 @@ public class PipTransition extends PipTransitionController implements @Nullable private Transitions.TransitionFinishCallback mFinishCallback; + private ValueAnimator mTransitionAnimator; + public PipTransition( Context context, @NonNull ShellInit shellInit, @@ -209,7 +212,12 @@ public class PipTransition extends PipTransitionController implements @Override public void mergeAnimation(@NonNull IBinder transition, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction t, @NonNull IBinder mergeTarget, - @NonNull Transitions.TransitionFinishCallback finishCallback) {} + @NonNull Transitions.TransitionFinishCallback finishCallback) { + // Just jump-cut the current animation if any, but do not merge. + if (info.getType() == TRANSIT_EXIT_PIP) { + end(); + } + } @Override public void onTransitionConsumed(@NonNull IBinder transition, boolean aborted, @@ -271,6 +279,14 @@ public class PipTransition extends PipTransitionController implements return false; } + @Override + public void end() { + if (mTransitionAnimator != null && mTransitionAnimator.isRunning()) { + mTransitionAnimator.end(); + mTransitionAnimator = null; + } + } + // // Animation schedulers and entry points // @@ -438,7 +454,7 @@ public class PipTransition extends PipTransitionController implements } finishTransition(); }); - animator.start(); + cacheAndStartTransitionAnimator(animator); return true; } @@ -538,7 +554,7 @@ public class PipTransition extends PipTransitionController implements PipAlphaAnimator.FADE_IN); // This should update the pip transition state accordingly after we stop playing. animator.setAnimationEndCallback(this::finishTransition); - animator.start(); + cacheAndStartTransitionAnimator(animator); return true; } @@ -608,7 +624,7 @@ public class PipTransition extends PipTransitionController implements } finishTransition(); }); - animator.start(); + cacheAndStartTransitionAnimator(animator); return true; } @@ -834,17 +850,17 @@ public class PipTransition extends PipTransitionController implements return leash; } + void cacheAndStartTransitionAnimator(@NonNull ValueAnimator animator) { + mTransitionAnimator = animator; + mTransitionAnimator.start(); + } + // // Miscellaneous callbacks and listeners // @Override public void finishTransition() { - if (mFinishCallback != null) { - mFinishCallback.onTransitionFinished(null /* finishWct */); - mFinishCallback = null; - } - final int currentState = mPipTransitionState.getState(); int nextState = PipTransitionState.UNDEFINED; switch (currentState) { @@ -859,6 +875,14 @@ public class PipTransition extends PipTransitionController implements break; } mPipTransitionState.setState(nextState); + + if (mFinishCallback != null) { + // Need to unset mFinishCallback first because onTransitionFinished can re-enter this + // handler if there is a pending PiP animation. + final Transitions.TransitionFinishCallback finishCallback = mFinishCallback; + mFinishCallback = null; + finishCallback.onTransitionFinished(null /* finishWct */); + } } @Override |