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

Commit 7b20e7f1 authored by Kazuki Takise's avatar Kazuki Takise
Browse files

Atomically apply windowing mode and display windowing mode

We currently call super.setWindowingMode() and
super.setDisplayWindowingMode() in DisplayContent#setWindowingMode(),
and super.setWindowingMode() calls onConfigurationChanged, which
can end up triggerring rotation update logic.

As some code assumes windowing mode and display windowing mode
always match, they should be atomically updated.

The concrete problem we are facing is that windowing mode change for
the  default dipslay triggers rotation incorrectly.

Bug: 159751214
Test: go/wm-smoke
Test: atest DisplayContentTests
Change-Id: Icca1673d8bf649f6cb17bceed8cd0d533d76fabd
parent fa6332bb
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -2295,8 +2295,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp

    @Override
    public void setWindowingMode(int windowingMode) {
        super.setWindowingMode(windowingMode);
        super.setDisplayWindowingMode(windowingMode);
        // Intentionally call onRequestedOverrideConfigurationChanged() directly to change windowing
        // mode and display windowing mode atomically.
        mTmpConfiguration.setTo(getRequestedOverrideConfiguration());
        mTmpConfiguration.windowConfiguration.setWindowingMode(windowingMode);
        mTmpConfiguration.windowConfiguration.setDisplayWindowingMode(windowingMode);
        onRequestedOverrideConfigurationChanged(mTmpConfiguration);
    }

    @Override
+18 −0
Original line number Diff line number Diff line
@@ -1512,6 +1512,24 @@ public class DisplayContentTests extends WindowTestsBase {
        mDisplayContent.ensureActivitiesVisible(null, 0, false, false);
    }

    @Test
    public void testSetWindowingModeAtomicallyUpdatesWindoingModeAndDisplayWindowingMode() {
        final DisplayContent dc = createNewDisplay();
        final ActivityStack stack =
                new ActivityTestsBase.StackBuilder(mWm.mAtmService.mRootWindowContainer)
                .setDisplay(dc)
                .build();
        doAnswer(invocation -> {
            Object[] args = invocation.getArguments();
            final Configuration config = ((Configuration) args[0]);
            assertEquals(config.windowConfiguration.getWindowingMode(),
                    config.windowConfiguration.getDisplayWindowingMode());
            return null;
        }).when(stack).onConfigurationChanged(any());
        dc.setWindowingMode(WINDOWING_MODE_FREEFORM);
        dc.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
    }

    private boolean isOptionsPanelAtRight(int displayId) {
        return (mWm.getPreferredOptionsPanelGravity(displayId) & Gravity.RIGHT) == Gravity.RIGHT;
    }