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

Commit 98cc29d1 authored by Yunfan Chen's avatar Yunfan Chen
Browse files

Support given content insets for non-IME windows

This will let the task bar and all other windows provide an insets frame
smaller than the window's frame. This is a regression caused by the
flexible insets change.

If the window provides both internal insets and the content insets, both
of them will be deducted. A comment is added to the
provideInternalInsets to avoid the mis-use. There's a long term plan to
change the functionality of the provideInternalInsets. Will have it in
the follow-up patches.

Bug: 212221722
Test: atest DisplayPolicyTests
Change-Id: Ib9e414627992b46b1a1d0afa314ea180dfdbc4d6
parent 189f6926
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -3581,7 +3581,8 @@ public interface WindowManager extends ViewManager {

        /**
         * If specified, the insets provided by this window will be our window frame minus the
         * insets specified by providedInternalInsets.
         * insets specified by providedInternalInsets. This should not be used together with
         * {@link WindowState#mGivenContentInsets}. If both of them are set, both will be applied.
         *
         * @hide
         */
+7 −3
Original line number Diff line number Diff line
@@ -1122,6 +1122,7 @@ public class DisplayPolicy {
                            if (!mNavButtonForcedVisible) {
                                inOutFrame.inset(windowState.getLayoutingAttrs(
                                        displayFrames.mRotation).providedInternalInsets);
                                inOutFrame.inset(win.mGivenContentInsets);
                            }
                        },

@@ -1190,9 +1191,12 @@ public class DisplayPolicy {
                                break;
                        }
                        mDisplayContent.setInsetProvider(insetsType, win, (displayFrames,
                                windowState, inOutFrame) -> inOutFrame.inset(
                                windowState, inOutFrame) -> {
                            inOutFrame.inset(
                                    windowState.getLayoutingAttrs(displayFrames.mRotation)
                                        .providedInternalInsets), imeFrameProvider);
                                            .providedInternalInsets);
                            inOutFrame.inset(win.mGivenContentInsets);
                        }, imeFrameProvider);
                        mInsetsSourceWindowsExceptIme.add(win);
                    }
                }
+22 −0
Original line number Diff line number Diff line
@@ -322,4 +322,26 @@ public class DisplayPolicyTests extends WindowTestsBase {
        assertFalse(navBarSource.getFrame().isEmpty());
        assertTrue(imeSource.getFrame().contains(navBarSource.getFrame()));
    }

    @UseTestDisplay(addWindows = { W_NAVIGATION_BAR })
    @Test
    public void testInsetsGivenContentFrame() {
        final DisplayPolicy displayPolicy = mDisplayContent.getDisplayPolicy();
        final DisplayInfo displayInfo = new DisplayInfo();
        displayInfo.logicalWidth = 1000;
        displayInfo.logicalHeight = 2000;
        displayInfo.rotation = ROTATION_0;

        WindowManager.LayoutParams attrs = mNavBarWindow.mAttrs;
        displayPolicy.addWindowLw(mNavBarWindow, attrs);
        mNavBarWindow.setRequestedSize(attrs.width, attrs.height);
        mNavBarWindow.getControllableInsetProvider().setServerVisible(true);

        mNavBarWindow.mGivenContentInsets.set(0, 10, 0, 0);

        displayPolicy.layoutWindowLw(mNavBarWindow, null, mDisplayContent.mDisplayFrames);
        final InsetsState state = mDisplayContent.getInsetsStateController().getRawInsetsState();
        final InsetsSource navBarSource = state.peekSource(ITYPE_NAVIGATION_BAR);
        assertEquals(attrs.height - 10, navBarSource.getFrame().height());
    }
}