Work around for display info mismatch during the PiP transition
This is a work around for b/152720544, we noticed that when entering PiP
from a landscape activity to home screen in portrait mode
- OnDisplayChangingListener is not called
- PinnedStackListener#onDisplayInfoChanged gets called after the
transition is started
This work around updates the destination bounds once this mismatch is
detected and a more proper fix should be there for b/152809058
Bug: 152720544
Test: manually enter/exit PiP from Play Movies for X times
Change-Id: I833027d4a4638a7a99f7abd2f50e493bdf5bad03
(cherry picked from commit 951dc026f5f9d5704422115a904f3b8116094a9e)
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java b/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java
index 232c23d..69cbda6 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/PipAnimationController.java
@@ -110,6 +110,10 @@
return mCurrentAnimator;
}
+ PipTransitionAnimator getCurrentAnimator() {
+ return mCurrentAnimator;
+ }
+
private PipTransitionAnimator setupPipTransitionAnimator(PipTransitionAnimator animator) {
animator.setSurfaceTransactionHelper(mSurfaceTransactionHelper);
animator.setInterpolator(mFastOutSlowInInterpolator);
@@ -239,6 +243,9 @@
void setDestinationBounds(Rect destinationBounds) {
mDestinationBounds.set(destinationBounds);
+ if (mAnimationType == ANIM_TYPE_ALPHA) {
+ onStartTransaction(mLeash, newSurfaceControlTransaction());
+ }
}
void setCurrentValue(T value) {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipBoundsHandler.java b/packages/SystemUI/src/com/android/systemui/pip/PipBoundsHandler.java
index 4969fc8..1868536 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/PipBoundsHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/PipBoundsHandler.java
@@ -199,6 +199,10 @@
return mLastDestinationBounds;
}
+ public Rect getDisplayBounds() {
+ return new Rect(0, 0, mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight);
+ }
+
/**
* Responds to IPinnedStackListener on {@link DisplayInfo} change.
* It will normally follow up with a
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
index af8b184..c5cb01f 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
@@ -311,6 +311,29 @@
}
/**
+ * TODO(b/152809058): consolidate the display info handling logic in SysUI
+ */
+ @SuppressWarnings("unchecked")
+ public void mayUpdateCurrentAnimationOnRotationChange() {
+ final PipAnimationController.PipTransitionAnimator animator =
+ mPipAnimationController.getCurrentAnimator();
+ if (animator != null && animator.isRunning()
+ && animator.getTransitionDirection() == TRANSITION_DIRECTION_TO_PIP) {
+ final Rect currentDestinationBounds = animator.getDestinationBounds();
+ if (mPipBoundsHandler.getDisplayBounds().contains(currentDestinationBounds)) {
+ return;
+ }
+ final Rect newDestinationBounds = mPipBoundsHandler.getDestinationBounds(
+ getAspectRatioOrDefault(mTaskInfo.pictureInPictureParams),
+ null /* bounds */, getMinimalSize(mTaskInfo.topActivityInfo));
+ if (animator.getAnimationType() == ANIM_TYPE_BOUNDS) {
+ animator.updateEndValue(newDestinationBounds);
+ }
+ animator.setDestinationBounds(newDestinationBounds);
+ }
+ }
+
+ /**
* @return {@code true} if the aspect ratio is changed since no other parameters within
* {@link PictureInPictureParams} would affect the bounds.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
index 9722c08..23190b8 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
@@ -364,6 +364,7 @@
mTouchHandler.onMovementBoundsChanged(mTmpInsetBounds, mTmpNormalBounds,
animatingBounds, fromImeAdjustment, fromShelfAdjustment,
mTmpDisplayInfo.rotation);
+ mPipTaskOrganizer.mayUpdateCurrentAnimationOnRotationChange();
}
public void dump(PrintWriter pw) {