Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4ef153a7 authored by Ben Lin's avatar Ben Lin
Browse files

PiP: Recalculate size if too big/small on display change.

On display changes, it is possible that the old bounds is now too big
or too small for the new display. This is especially like on foldables,
such as a min size on a folded state is too big when in an unfolded
state.

Bug: 198679951
Test: Fold, minimal size, then unfold - see size change, and resizing
now doesn't jump to from too small -> small

Change-Id: I5de64860f1fbb476ff1a6a8dd9a0c50fd3259a45
parent 1c3b93b1
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -474,12 +474,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.
@@ -491,7 +504,7 @@ public class PipController implements PipTransitionController.PipTransitionCallb
                    mPipBoundsState.getDisplayBounds(),
                    mPipBoundsState.getDisplayLayout().stableInsets());

            mTouchHandler.getMotionHelper().movePip(postChangeStackBounds);
            mTouchHandler.getMotionHelper().animateResizedBounds(postChangeStackBounds);
        } else {
            updateDisplayLayout.run();
        }
+9 −0
Original line number Diff line number Diff line
@@ -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;
@@ -540,6 +541,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.
     */
+1 −1
Original line number Diff line number Diff line
@@ -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