diff options
| -rw-r--r-- | services/core/java/com/android/server/display/LocalDisplayAdapter.java | 14 | ||||
| -rw-r--r-- | services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java | 39 |
2 files changed, 39 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 2a219289cf10..efb2cb7a3283 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -411,11 +411,8 @@ final class LocalDisplayAdapter extends DisplayAdapter { // For a new display, we need to initialize the default mode ID. if (mDefaultModeId == INVALID_MODE_ID) { - mDefaultModeId = mSystemPreferredModeId != INVALID_MODE_ID - ? mSystemPreferredModeId : activeRecord.mMode.getModeId(); - mDefaultModeGroup = mSystemPreferredModeId != INVALID_MODE_ID - ? preferredSfDisplayMode.group - : mActiveSfDisplayMode.group; + mDefaultModeId = activeRecord.mMode.getModeId(); + mDefaultModeGroup = mActiveSfDisplayMode.group; } else if (modesAdded && activeModeChanged) { Slog.d(TAG, "New display modes are added and the active mode has changed, " + "use active mode as default mode."); @@ -897,6 +894,13 @@ final class LocalDisplayAdapter extends DisplayAdapter { public void setUserPreferredDisplayModeLocked(Display.Mode mode) { final int oldModeId = getPreferredModeId(); mUserPreferredMode = mode; + // When clearing the user preferred mode we need to also reset the default mode. This is + // used by DisplayModeDirector to determine the default resolution, so if we don't clear + // it then the resolution won't reset to what it would've been prior to setting a user + // preferred display mode. + if (mode == null && mSystemPreferredModeId != INVALID_MODE_ID) { + mDefaultModeId = mSystemPreferredModeId; + } if (mode != null && (mode.isRefreshRateSet() || mode.isResolutionSet())) { Display.Mode matchingSupportedMode; matchingSupportedMode = findMode(mode.getPhysicalWidth(), diff --git a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java index 9c615d140e85..ed369c016770 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/LocalDisplayAdapterTest.java @@ -764,11 +764,13 @@ public class LocalDisplayAdapterTest { @Test public void testGetSystemPreferredDisplayMode() throws Exception { SurfaceControl.DisplayMode displayMode1 = createFakeDisplayMode(0, 1920, 1080, 60f); - // preferred mode + // system preferred mode SurfaceControl.DisplayMode displayMode2 = createFakeDisplayMode(1, 3840, 2160, 60f); + // user preferred mode + SurfaceControl.DisplayMode displayMode3 = createFakeDisplayMode(2, 1920, 1080, 30f); SurfaceControl.DisplayMode[] modes = - new SurfaceControl.DisplayMode[]{displayMode1, displayMode2}; + new SurfaceControl.DisplayMode[]{displayMode1, displayMode2, displayMode3}; FakeDisplay display = new FakeDisplay(PORT_A, modes, 0, 1); setUpDisplay(display); updateAvailableDisplays(); @@ -780,24 +782,43 @@ public class LocalDisplayAdapterTest { DisplayDeviceInfo displayDeviceInfo = mListener.addedDisplays.get( 0).getDisplayDeviceInfoLocked(); - assertThat(displayDeviceInfo.supportedModes.length).isEqualTo(modes.length); - Display.Mode defaultMode = getModeById(displayDeviceInfo, displayDeviceInfo.defaultModeId); + assertThat(matches(defaultMode, displayMode1)).isTrue(); + + // Set the user preferred display mode + mListener.addedDisplays.get(0).setUserPreferredDisplayModeLocked( + new Display.Mode( + displayMode3.width, displayMode3.height, displayMode3.refreshRate)); + updateAvailableDisplays(); + waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); + displayDeviceInfo = mListener.addedDisplays.get( + 0).getDisplayDeviceInfoLocked(); + defaultMode = getModeById(displayDeviceInfo, displayDeviceInfo.defaultModeId); + assertThat(matches(defaultMode, displayMode3)).isTrue(); + + // clear the user preferred mode + mListener.addedDisplays.get(0).setUserPreferredDisplayModeLocked(null); + updateAvailableDisplays(); + waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); + displayDeviceInfo = mListener.addedDisplays.get( + 0).getDisplayDeviceInfoLocked(); + defaultMode = getModeById(displayDeviceInfo, displayDeviceInfo.defaultModeId); assertThat(matches(defaultMode, displayMode2)).isTrue(); - // Change the display and add new preferred mode - SurfaceControl.DisplayMode addedDisplayInfo = createFakeDisplayMode(2, 2340, 1080, 60f); - modes = new SurfaceControl.DisplayMode[]{displayMode1, displayMode2, addedDisplayInfo}; + // Change the display and add new system preferred mode + SurfaceControl.DisplayMode addedDisplayInfo = createFakeDisplayMode(3, 2340, 1080, 20f); + modes = new SurfaceControl.DisplayMode[]{ + displayMode1, displayMode2, displayMode3, addedDisplayInfo}; display.dynamicInfo.supportedDisplayModes = modes; - display.dynamicInfo.preferredBootDisplayMode = 2; + display.dynamicInfo.preferredBootDisplayMode = 3; setUpDisplay(display); mInjector.getTransmitter().sendHotplug(display, /* connected */ true); waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); assertTrue(mListener.traversalRequested); assertThat(mListener.addedDisplays.size()).isEqualTo(1); - assertThat(mListener.changedDisplays.size()).isEqualTo(1); + assertThat(mListener.changedDisplays.size()).isEqualTo(3); DisplayDevice displayDevice = mListener.changedDisplays.get(0); displayDevice.applyPendingDisplayDeviceInfoChangesLocked(); |