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

Commit 876e7794 authored by Nick Chameyev's avatar Nick Chameyev
Browse files

Load rotation settings when creating a display

In ag/16433357 applyRotationSettingsToDisplayLocked
was extracted from applySettingsToDisplayLocked method.
This was done to load rotation settings only after updating
the display size.
After separating this method we didn't call the second method
in all places where we called the original one.
Added a flag that controls loading rotation settings
which is 'true' by default to fix loading of these
settings on the first boot.

Fixes: 212200866
Test: atest WmTests:DisplayWindowSettingsTests
Test: open portrait only app on a display with
 'ignore orientation request = true' after booting
Change-Id: Id248393dc389b54c140a83d3a0bb93fef1a200ed
parent b082666f
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -2783,7 +2783,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        if (displayMetricsChanged || physicalDisplayChanged) {
            if (physicalDisplayChanged) {
                // Reapply the window settings as the underlying physical display has changed.
                mWmService.mDisplayWindowSettings.applySettingsToDisplayLocked(this);
                // Do not include rotation settings here, postpone them until the display
                // metrics are updated as rotation settings might depend on them
                mWmService.mDisplayWindowSettings.applySettingsToDisplayLocked(this,
                        /* includeRotationSettings */ false);
            }

            // If there is an override set for base values - use it, otherwise use new values.
+6 −0
Original line number Diff line number Diff line
@@ -244,6 +244,10 @@ class DisplayWindowSettings {
    }

    void applySettingsToDisplayLocked(DisplayContent dc) {
        applySettingsToDisplayLocked(dc, /* includeRotationSettings */ true);
    }

    void applySettingsToDisplayLocked(DisplayContent dc, boolean includeRotationSettings) {
        final DisplayInfo displayInfo = dc.getDisplayInfo();
        final SettingsProvider.SettingsEntry settings = mSettingsProvider.getSettings(displayInfo);

@@ -282,6 +286,8 @@ class DisplayWindowSettings {
        boolean dontMoveToTop = settings.mDontMoveToTop != null
                ? settings.mDontMoveToTop : false;
        dc.mDontMoveToTop = dontMoveToTop;

        if (includeRotationSettings) applyRotationSettingsToDisplayLocked(dc);
    }

    void applyRotationSettingsToDisplayLocked(DisplayContent dc) {
+16 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ import androidx.test.filters.SmallTest;

import com.android.server.LocalServices;
import com.android.server.policy.WindowManagerPolicy;
import com.android.server.wm.DisplayWindowSettings.SettingsProvider.SettingsEntry;

import org.junit.Before;
import org.junit.Test;
@@ -447,6 +448,21 @@ public class DisplayWindowSettingsTests extends WindowTestsBase {
        assertEquals(456, config.densityDpi);
    }

    @Test
    public void testDisplayRotationSettingsAppliedOnCreation() {
        // Create new displays with different rotation settings
        final SettingsEntry settingsEntry1 = new SettingsEntry();
        settingsEntry1.mIgnoreOrientationRequest = false;
        final DisplayContent dcDontIgnoreOrientation = createMockSimulatedDisplay(settingsEntry1);
        final SettingsEntry settingsEntry2 = new SettingsEntry();
        settingsEntry2.mIgnoreOrientationRequest = true;
        final DisplayContent dcIgnoreOrientation = createMockSimulatedDisplay(settingsEntry2);

        // Verify that newly created displays are created with correct rotation settings
        assertFalse(dcDontIgnoreOrientation.getIgnoreOrientationRequest());
        assertTrue(dcIgnoreOrientation.getIgnoreOrientationRequest());
    }

    public final class TestSettingsProvider implements DisplayWindowSettings.SettingsProvider {
        Map<DisplayInfo, SettingsEntry> mOverrideSettingsCache = new HashMap<>();

+13 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;

import static org.mockito.ArgumentMatchers.any;

import android.annotation.Nullable;
import android.content.res.Configuration;
import android.graphics.Insets;
import android.graphics.Rect;
@@ -38,6 +39,8 @@ import android.view.Display;
import android.view.DisplayCutout;
import android.view.DisplayInfo;

import com.android.server.wm.DisplayWindowSettings.SettingsProvider.SettingsEntry;

class TestDisplayContent extends DisplayContent {

    public static final int DEFAULT_LOGICAL_DISPLAY_DENSITY = 300;
@@ -81,6 +84,7 @@ class TestDisplayContent extends DisplayContent {
        protected final ActivityTaskManagerService mService;
        private boolean mSystemDecorations = false;
        private int mStatusBarHeight = 0;
        private SettingsEntry mOverrideSettings;

        Builder(ActivityTaskManagerService service, int width, int height) {
            mService = service;
@@ -104,6 +108,10 @@ class TestDisplayContent extends DisplayContent {
        private String generateUniqueId() {
            return "TEST_DISPLAY_CONTENT_" + System.currentTimeMillis();
        }
        Builder setOverrideSettings(@Nullable SettingsEntry overrideSettings) {
            mOverrideSettings = overrideSettings;
            return this;
        }
        Builder setSystemDecorations(boolean yes) {
            mSystemDecorations = yes;
            return this;
@@ -151,6 +159,11 @@ class TestDisplayContent extends DisplayContent {
        TestDisplayContent build() {
            SystemServicesTestRule.checkHoldsLock(mService.mGlobalLock);

            if (mOverrideSettings != null) {
                mService.mWindowManager.mDisplayWindowSettingsProvider
                        .updateOverrideSettings(mInfo, mOverrideSettings);
            }

            final int displayId = SystemServicesTestRule.sNextDisplayId++;
            final Display display = new Display(DisplayManagerGlobal.getInstance(), displayId,
                    mInfo, DEFAULT_DISPLAY_ADJUSTMENTS);
+14 −6
Original line number Diff line number Diff line
@@ -106,6 +106,7 @@ import android.window.TransitionRequestInfo;

import com.android.internal.policy.AttributeCache;
import com.android.internal.util.ArrayUtils;
import com.android.server.wm.DisplayWindowSettings.SettingsProvider.SettingsEntry;

import org.junit.After;
import org.junit.Before;
@@ -720,18 +721,21 @@ class WindowTestsBase extends SystemServiceTestsBase {

    /** Creates a {@link DisplayContent} and adds it to the system. */
    private DisplayContent createNewDisplayWithImeSupport(@DisplayImePolicy int imePolicy) {
        return createNewDisplay(mDisplayInfo, imePolicy);
        return createNewDisplay(mDisplayInfo, imePolicy, /* overrideSettings */ null);
    }

    /** Creates a {@link DisplayContent} that supports IME and adds it to the system. */
    DisplayContent createNewDisplay(DisplayInfo info) {
        return createNewDisplay(info, DISPLAY_IME_POLICY_LOCAL);
        return createNewDisplay(info, DISPLAY_IME_POLICY_LOCAL, /* overrideSettings */ null);
    }

    /** Creates a {@link DisplayContent} and adds it to the system. */
    private DisplayContent createNewDisplay(DisplayInfo info, @DisplayImePolicy int imePolicy) {
    private DisplayContent createNewDisplay(DisplayInfo info, @DisplayImePolicy int imePolicy,
            @Nullable SettingsEntry overrideSettings) {
        final DisplayContent display =
                new TestDisplayContent.Builder(mAtm, info).build();
                new TestDisplayContent.Builder(mAtm, info)
                        .setOverrideSettings(overrideSettings)
                        .build();
        final DisplayContent dc = display.mDisplayContent;
        // this display can show IME.
        dc.mWmService.mDisplayWindowSettings.setDisplayImePolicy(dc, imePolicy);
@@ -749,7 +753,7 @@ class WindowTestsBase extends SystemServiceTestsBase {
        DisplayInfo displayInfo = new DisplayInfo();
        displayInfo.copyFrom(mDisplayInfo);
        displayInfo.state = displayState;
        return createNewDisplay(displayInfo, DISPLAY_IME_POLICY_LOCAL);
        return createNewDisplay(displayInfo, DISPLAY_IME_POLICY_LOCAL, /* overrideSettings */ null);
    }

    /** Creates a {@link TestWindowState} */
@@ -761,11 +765,15 @@ class WindowTestsBase extends SystemServiceTestsBase {

    /** Creates a {@link DisplayContent} as parts of simulate display info for test. */
    DisplayContent createMockSimulatedDisplay() {
        return createMockSimulatedDisplay(/* overrideSettings */ null);
    }

    DisplayContent createMockSimulatedDisplay(@Nullable SettingsEntry overrideSettings) {
        DisplayInfo displayInfo = new DisplayInfo();
        displayInfo.copyFrom(mDisplayInfo);
        displayInfo.type = Display.TYPE_VIRTUAL;
        displayInfo.ownerUid = SYSTEM_UID;
        return createNewDisplay(displayInfo, DISPLAY_IME_POLICY_FALLBACK_DISPLAY);
        return createNewDisplay(displayInfo, DISPLAY_IME_POLICY_FALLBACK_DISPLAY, overrideSettings);
    }

    IDisplayWindowInsetsController createDisplayWindowInsetsController() {