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
This commit is contained in:
Nick Chameyev
2022-01-13 13:11:33 +00:00
parent b082666f0b
commit 876e779427
5 changed files with 53 additions and 7 deletions

View File

@@ -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.

View File

@@ -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) {

View File

@@ -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<>();

View File

@@ -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);

View File

@@ -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() {