diff options
3 files changed, 30 insertions, 4 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java index a52db24aa184..b396ce528beb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAnimationController.java @@ -37,6 +37,7 @@ import com.android.wm.shell.animation.Interpolators; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.Objects; /** * Controller class of PiP animations (both from and to PiP mode). @@ -112,6 +113,7 @@ public class PipAnimationController { PipTransitionAnimator.ofAlpha(taskInfo, leash, destinationBounds, alphaStart, alphaEnd)); } else if (mCurrentAnimator.getAnimationType() == ANIM_TYPE_ALPHA + && Objects.equals(destinationBounds, mCurrentAnimator.getDestinationBounds()) && mCurrentAnimator.isRunning()) { mCurrentAnimator.updateEndValue(alphaEnd); } else { 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 ffa821daf7f8..447e4f59ed5d 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 @@ -98,9 +98,10 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, private enum State { UNDEFINED(0), TASK_APPEARED(1), - ENTERING_PIP(2), - ENTERED_PIP(3), - EXITING_PIP(4); + ENTRY_SCHEDULED(2), + ENTERING_PIP(3), + ENTERED_PIP(4), + EXITING_PIP(5); private final int mStateValue; @@ -264,6 +265,13 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, } /** + * Returns whether the entry animation is waiting to be started. + */ + public boolean isEntryScheduled() { + return mState == State.ENTRY_SCHEDULED; + } + + /** * Registers a callback when a display change has been detected when we enter PiP. */ public void registerOnDisplayIdChangeCallback(IntConsumer onDisplayIdChangeCallback) { @@ -481,6 +489,19 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, } } + /** + * Called when the display rotation handling is skipped (e.g. when rotation happens while in + * the middle of an entry transition). + */ + public void onDisplayRotationSkipped() { + if (isEntryScheduled()) { + // The PIP animation is scheduled to start with the previous orientation's bounds, + // re-calculate the entry bounds and restart the alpha animation. + final Rect destinationBounds = mPipBoundsAlgorithm.getEntryDestinationBounds(); + enterPipWithAlphaAnimation(destinationBounds, mEnterAnimationDuration); + } + } + @VisibleForTesting void enterPipWithAlphaAnimation(Rect destinationBounds, long durationMs) { // If we are fading the PIP in, then we should move the pip to the final location as @@ -490,6 +511,7 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, mSurfaceControlTransactionFactory.getTransaction(); tx.setAlpha(mLeash, 0f); tx.apply(); + mState = State.ENTRY_SCHEDULED; applyEnterPipSyncTransaction(destinationBounds, () -> { mPipAnimationController .getAnimator(mTaskInfo, mLeash, destinationBounds, 0f, 1f) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index d75c1d65614d..4b62b5f6c09b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -115,7 +115,8 @@ public class PipController implements PipTransitionController.PipTransitionCallb int displayId, int fromRotation, int toRotation, WindowContainerTransaction t) -> { if (!mPipTaskOrganizer.isInPip() || mPipBoundsState.getDisplayLayout().rotation() == toRotation - || mPipTaskOrganizer.isDeferringEnterPipAnimation()) { + || mPipTaskOrganizer.isDeferringEnterPipAnimation() + || mPipTaskOrganizer.isEntryScheduled()) { // Skip if the same rotation has been set or we aren't in PIP or haven't actually // entered PIP yet. We still need to update the display layout in the bounds handler // in this case. @@ -123,6 +124,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb // do not forget to update the movement bounds as well. updateMovementBounds(mPipBoundsState.getNormalBounds(), true /* fromRotation */, false /* fromImeAdjustment */, false /* fromShelfAdjustment */, t); + mPipTaskOrganizer.onDisplayRotationSkipped(); return; } // If there is an animation running (ie. from a shelf offset), then ensure that we calculate |