Merge "PiP: Recalculate size if too big/small on display change." into sc-v2-dev am: 984af19cf9 am: 61e1c2de16

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16177568

Change-Id: I9bb2400adb1a9b2b6c8831d59c364a8885cc9ad8
This commit is contained in:
Ben Lin
2021-11-06 08:06:42 +00:00
committed by Automerger Merge Worker
3 changed files with 27 additions and 5 deletions

View File

@@ -490,12 +490,25 @@ public class PipController implements PipTransitionController.PipTransitionCallb
if (mPipTaskOrganizer.isInPip() && saveRestoreSnapFraction) {
// Calculate the snap fraction of the current stack along the old movement bounds
final PipSnapAlgorithm pipSnapAlgorithm = mPipBoundsAlgorithm.getSnapAlgorithm();
final Rect postChangeStackBounds = new Rect(mPipBoundsState.getBounds());
final float snapFraction = pipSnapAlgorithm.getSnapFraction(postChangeStackBounds,
mPipBoundsAlgorithm.getMovementBounds(postChangeStackBounds),
final float snapFraction = pipSnapAlgorithm.getSnapFraction(mPipBoundsState.getBounds(),
mPipBoundsAlgorithm.getMovementBounds(mPipBoundsState.getBounds()),
mPipBoundsState.getStashedState());
updateDisplayLayout.run();
final Rect postChangeStackBounds;
if (mPipBoundsState.getBounds() != null
&& (mPipBoundsState.getBounds().width() > mPipBoundsState.getMaxSize().x
|| mPipBoundsState.getBounds().height() > mPipBoundsState.getMaxSize().y)) {
postChangeStackBounds = new Rect(0, 0, mPipBoundsState.getMaxSize().x,
mPipBoundsState.getMaxSize().y);
} else if (mPipBoundsState.getBounds() != null
&& (mPipBoundsState.getBounds().width() < mPipBoundsState.getMinSize().x
|| mPipBoundsState.getBounds().height() < mPipBoundsState.getMinSize().y)) {
postChangeStackBounds = new Rect(0, 0, mPipBoundsState.getMinSize().x,
mPipBoundsState.getMinSize().y);
} else {
postChangeStackBounds = new Rect(mPipBoundsState.getBounds());
}
// Calculate the stack bounds in the new orientation based on same fraction along the
// rotated movement bounds.
@@ -507,7 +520,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
mPipBoundsState.getDisplayBounds(),
mPipBoundsState.getDisplayLayout().stableInsets());
mTouchHandler.getMotionHelper().movePip(postChangeStackBounds);
mTouchHandler.getMotionHelper().animateResizedBounds(postChangeStackBounds);
} else {
updateDisplayLayout.run();
}

View File

@@ -69,6 +69,7 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
private static final int UNSTASH_DURATION = 250;
private static final int LEAVE_PIP_DURATION = 300;
private static final int SHIFT_DURATION = 300;
private static final int ANIMATE_PIP_RESIZE_ANIMATION = 250;
/** Friction to use for PIP when it moves via physics fling animations. */
private static final float DEFAULT_FRICTION = 1.9f;
@@ -547,6 +548,14 @@ public class PipMotionHelper implements PipAppOpsListener.Callback,
resizeAndAnimatePipUnchecked(unstashedBounds, UNSTASH_DURATION);
}
/**
* Animates the PiP from an old bound to a new bound. This is mostly used when display
* has changed and PiP bounds needs to be changed.
*/
void animateResizedBounds(Rect newBounds) {
resizeAndAnimatePipUnchecked(newBounds, ANIMATE_PIP_RESIZE_ANIMATION);
}
/**
* Animates the PiP to offset it from the IME or shelf.
*/

View File

@@ -191,7 +191,7 @@ public class PipControllerTest extends ShellTestCase {
mPipController.mDisplaysChangedListener.onDisplayConfigurationChanged(
displayId, new Configuration());
verify(mMockPipMotionHelper).movePip(any(Rect.class));
verify(mMockPipMotionHelper).animateResizedBounds(any(Rect.class));
}
@Test