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

Commit 643293e1 authored by jaehoon.kim's avatar jaehoon.kim Committed by chaviw
Browse files

[wm]: Prevent app relayout or relaunch by inset in freeform mode

When freefrom window region is located over navigation bar this may cause configuration change by inset
leading to relayout or relaunch of activity. So disregard inset while in freeform

Test: manual - Observe freeform layout change or blink when freeform is moved over to navigation bar or away from navigation bar
      atest WmTests:TaskRecordTests#testInsetDisregardedWhenFreeformOverlapsNavBar

Bug: 144058516
Change-Id: I2f3f2813c3c426aa6222885692217c5b6808e9ba
(cherry-picked from 09e19649a4c9ef5d3d7cabb1ead333e522255ff0)
parent df155220
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1881,7 +1881,10 @@ class Task extends WindowContainer<WindowContainer> {

        if (inOutConfig.screenWidthDp == Configuration.SCREEN_WIDTH_DP_UNDEFINED
                || inOutConfig.screenHeightDp == Configuration.SCREEN_HEIGHT_DP_UNDEFINED) {
            if (insideParentBounds && mStack != null) {
            if (insideParentBounds && WindowConfiguration.isFloating(windowingMode)) {
                mTmpNonDecorBounds.set(mTmpFullBounds);
                mTmpStableBounds.set(mTmpFullBounds);
            } else if (insideParentBounds && mStack != null) {
                final DisplayInfo di = new DisplayInfo();
                mStack.getDisplay().mDisplay.getDisplayInfo(di);

+55 −0
Original line number Diff line number Diff line
@@ -427,6 +427,61 @@ public class TaskRecordTests extends ActivityTestsBase {
        assertNotEquals(origScreenH, task.getConfiguration().screenHeightDp);
    }

    @Test
    public void testInsetDisregardedWhenFreeformOverlapsNavBar() {
        DisplayContent display = mService.mRootActivityContainer.getDefaultDisplay();
        ActivityStack stack = display.createStack(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD,
                true /* onTop */);
        DisplayInfo displayInfo = new DisplayInfo();
        mService.mContext.getDisplay().getDisplayInfo(displayInfo);
        final int displayHeight = displayInfo.logicalHeight;
        final Task task = new TaskBuilder(mSupervisor).setStack(stack).build();
        final Configuration inOutConfig = new Configuration();
        final Configuration parentConfig = new Configuration();
        final int longSide = 1200;
        final int shortSide = 600;
        parentConfig.densityDpi = 400;
        parentConfig.screenHeightDp = 200; // 200 * 400 / 160 = 500px
        parentConfig.screenWidthDp = 100; // 100 * 400 / 160 = 250px
        parentConfig.windowConfiguration.setRotation(ROTATION_0);

        final float density = 2.5f; // densityDpi / DENSITY_DEFAULT_SCALE = 400 / 160.0f
        final int longSideDp = 480; // longSide / density = 1200 / 400 * 160
        final int shortSideDp = 240; // shortSide / density = 600 / 400 * 160
        final int screenLayout = parentConfig.screenLayout
                & (Configuration.SCREENLAYOUT_LONG_MASK | Configuration.SCREENLAYOUT_SIZE_MASK);
        final int reducedScreenLayout =
                Configuration.reduceScreenLayout(screenLayout, longSideDp, shortSideDp);

        // Portrait bounds overlapping with navigation bar, without insets.
        inOutConfig.windowConfiguration.getBounds().set(0,
                displayHeight - 10 - longSide,
                shortSide,
                displayHeight - 10);
        // Set to freeform mode to verify bug fix.
        inOutConfig.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM);

        task.computeConfigResourceOverrides(inOutConfig, parentConfig);

        assertEquals(parentConfig.screenWidthDp, inOutConfig.screenWidthDp);
        assertEquals(parentConfig.screenHeightDp, inOutConfig.screenHeightDp);
        assertEquals(reducedScreenLayout, inOutConfig.screenLayout);

        inOutConfig.setToDefaults();
        // Landscape bounds overlapping with navigtion bar, without insets.
        inOutConfig.windowConfiguration.getBounds().set(0,
                displayHeight - 10 - shortSide,
                longSide,
                displayHeight - 10);
        inOutConfig.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM);

        task.computeConfigResourceOverrides(inOutConfig, parentConfig);

        assertEquals(parentConfig.screenWidthDp, inOutConfig.screenWidthDp);
        assertEquals(parentConfig.screenHeightDp, inOutConfig.screenHeightDp);
        assertEquals(reducedScreenLayout, inOutConfig.screenLayout);
    }

    /** Ensures that the alias intent won't have target component resolved. */
    @Test
    public void testTaskIntentActivityAlias() {