Make sure PiP appears on screen when folding the device

Folding triggers onDisplayChanged callback that will update the display
layout used to compute PiP position.

However, due to race condition of the setShelfHeight handler, sometimes
the new bounds for PiP are set by using the bounds in animator from
previous display layout. That value is used as a reference when we call
onMovementBoundsChanged in PipTaskOrganizer, and thus results sometimes
in displacing PiP outside of the visible screen bounds when folding.

Test: manually, via temporary log statement in the "if" body to verify
the trigger condition
Test: before http://recall/-/fj1xzZpuaq8SChahfwQ86e/dXk0Qq0aeOSbqoiMSoazIm
Test: after http://recall/-/fj1xzZpuaq8SChahfwQ86e/eHOB8F62DUS9d284FpWk7R
Bug: 263211281

Change-Id: Ibfa68f94bc81797d55c33c0aafcc937e04079a53
This commit is contained in:
Mateusz Cicheński
2023-02-17 01:14:32 +00:00
parent e56827c6e4
commit de50711482
2 changed files with 7 additions and 1 deletions

View File

@@ -209,7 +209,7 @@ public class PipAnimationController {
/**
* Quietly cancel the animator by removing the listeners first.
*/
static void quietCancel(@NonNull ValueAnimator animator) {
public static void quietCancel(@NonNull ValueAnimator animator) {
animator.removeAllUpdateListeners();
animator.removeAllListeners();
animator.cancel();

View File

@@ -715,6 +715,12 @@ public class PipController implements PipTransitionController.PipTransitionCallb
private void onDisplayChanged(DisplayLayout layout, boolean saveRestoreSnapFraction) {
if (!mPipBoundsState.getDisplayLayout().isSameGeometry(layout)) {
PipAnimationController.PipTransitionAnimator animator =
mPipAnimationController.getCurrentAnimator();
if (animator != null && animator.isRunning()) {
// cancel any running animator, as it is using stale display layout information
PipAnimationController.quietCancel(animator);
}
onDisplayChangedUncheck(layout, saveRestoreSnapFraction);
}
}