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

Commit 604ef951 authored by Adrian Roos's avatar Adrian Roos
Browse files

PIP: Fix transition to and from PiP when letterboxed

When an app is letterboxed, it cannot always take up the full
task bounds, and we need to constrain the PIP animations to
the constraints imposed by the layout.

Change-Id: If238ddfb4462c7e1e5c975f76666ad1d4ec3b076
Fixes: 77802617
Test: Enable cutout emulation, enter landscape, verify transitions both into and out of pip work as intended.
Test: atest ActivityManagerPinnedStackTests
parent 6d084215
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -409,7 +409,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP

    final Rect mContainingFrame = new Rect();

    private final Rect mParentFrame = new Rect();
    final Rect mParentFrame = new Rect();

    /** Whether the parent frame would have been different if there was no display cutout. */
    private boolean mParentFrameWasClippedByDisplayCutout;
@@ -931,6 +931,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
                    mContainingFrame.set(contentFrame);
                }
            }

            final TaskStack stack = getStack();
            if (inPinnedWindowingMode() && stack != null
                    && stack.lastAnimatingBoundsWasToFullscreen()) {
                // PIP edge case: When going from pinned to fullscreen, we apply a
                // tempInsetFrame for the full task - but we're still at the start of the animation.
                // To prevent a jump if there's a letterbox, restrict to the parent frame.
                mInsetFrame.intersectUnchecked(parentFrame);
                mContainingFrame.intersectUnchecked(parentFrame);
            }

            mDisplayFrame.set(mContainingFrame);
            layoutXDiff = !mInsetFrame.isEmpty() ? mInsetFrame.left - mContainingFrame.left : 0;
            layoutYDiff = !mInsetFrame.isEmpty() ? mInsetFrame.top - mContainingFrame.top : 0;
+7 −0
Original line number Diff line number Diff line
@@ -927,6 +927,13 @@ class WindowStateAnimator {
                mTmpSourceBounds.inset(mWin.mLastRelayoutContentInsets);
                allowStretching = true;
            }

            // Make sure that what we're animating to and from is actually the right size in case
            // the window cannot take up the full screen.
            mTmpStackBounds.intersectUnchecked(w.mParentFrame);
            mTmpSourceBounds.intersectUnchecked(w.mParentFrame);
            mTmpAnimatingBounds.intersectUnchecked(w.mParentFrame);

            if (!mTmpSourceBounds.isEmpty()) {
                // Get the final target stack bounds, if we are not animating, this is just the
                // current stack bounds