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:
@@ -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.
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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<>();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user