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

Commit 046807f0 authored by Charles Chen's avatar Charles Chen
Browse files

Reconfigure displays on ready to apply DisplayWindowSettings

For secondary displays, we apply display settings in RWC#createDisplayContent()
in RAC#setWindowManager() but WMS#reconfigureDisplayLocked() may not take effect since
display was not ready then and reconfigure call will be a no-op.

This CL will reconfigure all displays in WMS#displayReady().

Fixes: 131909551
Test: atest WmTests:DisplayWindowSettingsTests#testDisplayWindowSettingsAppliedOnDisplayReady
Test: manual: 1. adb pull data/system/display_settings.xml
              2. add forcedDensity="XXX" in the row which display
	      name="local:1"
	      3. adb push display_settings.xml data/system
	      4. adb reboot
	      5. Verify if nav bar applies the density change
Change-Id: I21172fbe590da499c633b54bfe53f6e92adb7ee8
parent dcb73777
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -4405,12 +4405,12 @@ public class WindowManagerService extends IWindowManager.Stub
            if (mMaxUiWidth > 0) {
                mRoot.forAllDisplays(displayContent -> displayContent.setMaxUiWidth(mMaxUiWidth));
            }
            final boolean changed = applyForcedPropertiesForDefaultDisplay();
            applyForcedPropertiesForDefaultDisplay();
            mAnimator.ready();
            mDisplayReady = true;
            if (changed) {
                reconfigureDisplayLocked(getDefaultDisplayContentLocked());
            }
            // Reconfigure all displays to make sure that forced properties and
            // DisplayWindowSettings are applied.
            mRoot.forAllDisplays(this::reconfigureDisplayLocked);
            mIsTouchDevice = mContext.getPackageManager().hasSystemFeature(
                    PackageManager.FEATURE_TOUCHSCREEN);
        }
+31 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static android.view.WindowManager.REMOVE_CONTENT_MODE_MOVE_TO_PRIMARY;

import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;

import static com.android.dx.mockito.inline.extended.ExtendedMockito.atLeastOnce;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
@@ -41,6 +42,7 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Matchers.eq;

import android.app.WindowConfiguration;
import android.content.res.Configuration;
import android.platform.test.annotations.Presubmit;
import android.util.Xml;
import android.view.Display;
@@ -606,6 +608,35 @@ public class DisplayWindowSettingsTests extends WindowTestsBase {
        }
    }

    @Test
    public void testDisplayWindowSettingsAppliedOnDisplayReady() {
        // Set forced densities for two displays in DisplayWindowSettings
        final DisplayContent dc = createMockSimulatedDisplay();
        final DisplayWindowSettings settings = new DisplayWindowSettings(mWm, mStorage);
        settings.setForcedDensity(mPrimaryDisplay, 123, 0 /* userId */);
        settings.setForcedDensity(dc, 456, 0 /* userId */);

        // Apply settings to displays - the settings will be stored, but config will not be
        // recalculated immediately.
        settings.applySettingsToDisplayLocked(mPrimaryDisplay);
        settings.applySettingsToDisplayLocked(dc);
        assertFalse(mPrimaryDisplay.mWaitingForConfig);
        assertFalse(dc.mWaitingForConfig);

        // Notify WM that the displays are ready and check that they are reconfigured.
        spyOn(mWm);
        mWm.displayReady();
        waitUntilHandlersIdle();
        verify(mWm, atLeastOnce()).reconfigureDisplayLocked(eq(mPrimaryDisplay));
        verify(mWm, atLeastOnce()).reconfigureDisplayLocked(eq(dc));

        final Configuration config = new Configuration();
        mPrimaryDisplay.computeScreenConfiguration(config);
        assertEquals(123, config.densityDpi);
        dc.computeScreenConfiguration(config);
        assertEquals(456, config.densityDpi);
    }

    /**
     * Prepares display settings and stores in {@link #mStorage}. Uses provided display identifier
     * and stores windowingMode=WINDOWING_MODE_PINNED.