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

Commit b5910b4f authored by Garfield Tan's avatar Garfield Tan
Browse files

Update connected display config on settings load.

Bug: 128354502
Test: Manual test.
atest DisplayWindowSettingsTests
atest RootWindowContainerTests
Change-Id: I2b85735d4b27516f5cb69d34592ae856208df25e
parent a49171ea
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -748,6 +748,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
            mWindowManager.setSupportsPictureInPicture(mSupportsPictureInPicture);
            mWindowManager.setSupportsFreeformWindowManagement(mSupportsFreeformWindowManagement);
            mWindowManager.setIsPc(isPc);
            mWindowManager.mRoot.onSettingsRetrieved();
            // This happens before any activities are started, so we can change global configuration
            // in-place.
            updateConfigurationLocked(configuration, null, true);
+18 −0
Original line number Diff line number Diff line
@@ -352,6 +352,24 @@ class DisplayWindowSettings {
        dc.mDisplayScalingDisabled = entry.mForcedScalingMode == FORCE_SCALING_MODE_DISABLED;
    }

    /**
     * Updates settings for the given display after system features are loaded into window manager
     * service, e.g. if this device is PC and if this device supports freeform.
     *
     * @param dc the given display.
     * @return {@code true} if any settings for this display has changed; {@code false} if nothing
     * changed.
     */
    boolean updateSettingsForDisplay(DisplayContent dc) {
        if (dc.getWindowingMode() != getWindowingModeLocked(dc)) {
            // For the time being the only thing that may change is windowing mode, so just update
            // that.
            dc.setWindowingMode(getWindowingModeLocked(dc));
            return true;
        }
        return false;
    }

    private void readSettings() {
        FileInputStream stream;
        try {
+28 −0
Original line number Diff line number Diff line
@@ -245,6 +245,34 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
        return dc;
    }

    /**
     * Called when DisplayWindowSettings values may change.
     */
    void onSettingsRetrieved() {
        final int numDisplays = mChildren.size();
        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
            final DisplayContent displayContent = mChildren.get(displayNdx);
            final boolean changed = mWmService.mDisplayWindowSettings.updateSettingsForDisplay(
                    displayContent);
            if (!changed) {
                continue;
            }

            displayContent.initializeDisplayOverrideConfiguration();
            mWmService.reconfigureDisplayLocked(displayContent);

            // We need to update global configuration as well if config of default display has
            // changed. Do it inline because ATMS#retrieveSettings() will soon update the
            // configuration inline, which will overwrite the new windowing mode.
            if (displayContent.isDefaultDisplay) {
                final Configuration newConfig = mWmService.computeNewConfiguration(
                        displayContent.getDisplayId());
                mWmService.mAtmService.updateConfigurationLocked(newConfig, null /* starting */,
                        false /* initLocale */);
            }
        }
    }

    boolean isLayoutNeeded() {
        final int numDisplays = mChildren.size();
        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
+13 −0
Original line number Diff line number Diff line
@@ -147,6 +147,19 @@ public class DisplayWindowSettingsTests extends WindowTestsBase {
                mPrimaryDisplay.getWindowingMode());
    }

    @Test
    public void testPrimaryDisplayUpdateToFreeform_HasFreeformSupport_IsPc() {
        mTarget.applySettingsToDisplayLocked(mPrimaryDisplay);

        mWm.setSupportsFreeformWindowManagement(true);
        mWm.setIsPc(true);

        mTarget.updateSettingsForDisplay(mPrimaryDisplay);

        assertEquals(WindowConfiguration.WINDOWING_MODE_FREEFORM,
                mPrimaryDisplay.getWindowingMode());
    }

    @Test
    public void testSecondaryDisplayDefaultToFullscreen_NoFreeformSupport() {
        mTarget.applySettingsToDisplayLocked(mSecondaryDisplay);
+18 −0
Original line number Diff line number Diff line
@@ -20,9 +20,11 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import android.app.WindowConfiguration;
import android.platform.test.annotations.Presubmit;

import androidx.test.filters.SmallTest;
@@ -71,5 +73,21 @@ public class RootWindowContainerTests extends WindowTestsBase {
        assertFalse(app.isVisible());
        assertFalse(mWm.mRoot.isAnyNonToastWindowVisibleForUid(FAKE_CALLING_UID));
    }

    @Test
    public void testUpdateDefaultDisplayWindowingModeOnSettingsRetrieved() {
        synchronized (mWm.mGlobalLock) {
            assertEquals(WindowConfiguration.WINDOWING_MODE_FULLSCREEN,
                    mWm.getDefaultDisplayContentLocked().getWindowingMode());

            mWm.mIsPc = true;
            mWm.mSupportsFreeformWindowManagement = true;

            mWm.mRoot.onSettingsRetrieved();

            assertEquals(WindowConfiguration.WINDOWING_MODE_FREEFORM,
                    mWm.getDefaultDisplayContentLocked().getWindowingMode());
        }
    }
}