Resize PiP on display density dpi change

Video: http://recall/-/aaaaaabFQoRHlzixHdtY/hucGOzgPr3NzCKndSnwpKo
Bug: 229561096
Bug: 229561218
Test: follow the reproduce steps in bug, see video
Change-Id: I9797197a63ed9574caaba7319d0b058821bdab36
This commit is contained in:
Hongwei Wang
2022-04-22 13:13:17 -07:00
parent 3473559b3c
commit 23e05492ba

View File

@@ -524,24 +524,44 @@ public class PipController implements PipTransitionController.PipTransitionCallb
mMenuController.attachPipMenuView();
// 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 Rect postChangeBounds = new Rect(mPipBoundsState.getBounds());
final float snapFraction = pipSnapAlgorithm.getSnapFraction(postChangeBounds,
mPipBoundsAlgorithm.getMovementBounds(postChangeBounds),
mPipBoundsState.getStashedState());
// Scale PiP on density dpi change, so it appears to be the same size physically.
final boolean densityDpiChanged = mPipBoundsState.getDisplayLayout().densityDpi() != 0
&& (mPipBoundsState.getDisplayLayout().densityDpi() != layout.densityDpi());
if (densityDpiChanged) {
final float scale = (float) layout.densityDpi()
/ mPipBoundsState.getDisplayLayout().densityDpi();
postChangeBounds.set(0, 0,
(int) (postChangeBounds.width() * scale),
(int) (postChangeBounds.height() * scale));
}
updateDisplayLayout.run();
// Calculate the stack bounds in the new orientation based on same fraction along the
// Calculate the PiP bounds in the new orientation based on same fraction along the
// rotated movement bounds.
final Rect postChangeMovementBounds = mPipBoundsAlgorithm.getMovementBounds(
postChangeStackBounds, false /* adjustForIme */);
pipSnapAlgorithm.applySnapFraction(postChangeStackBounds, postChangeMovementBounds,
postChangeBounds, false /* adjustForIme */);
pipSnapAlgorithm.applySnapFraction(postChangeBounds, postChangeMovementBounds,
snapFraction, mPipBoundsState.getStashedState(),
mPipBoundsState.getStashOffset(),
mPipBoundsState.getDisplayBounds(),
mPipBoundsState.getDisplayLayout().stableInsets());
mTouchHandler.getMotionHelper().movePip(postChangeStackBounds);
if (densityDpiChanged) {
// Using PipMotionHelper#movePip directly here may cause race condition since
// the app content in PiP mode may or may not be updated for the new density dpi.
final int duration = mContext.getResources().getInteger(
R.integer.config_pipEnterAnimationDuration);
mPipTaskOrganizer.scheduleAnimateResizePip(
postChangeBounds, duration, null /* updateBoundsCallback */);
} else {
mTouchHandler.getMotionHelper().movePip(postChangeBounds);
}
} else {
updateDisplayLayout.run();
}