From 00d05a454bdf215671778a62140d1501073fdc70 Mon Sep 17 00:00:00 2001 From: Kriti Dang Date: Thu, 25 Aug 2022 12:27:13 +0200 Subject: [PATCH] Removing the initialising the mode with system pref mode. This is unncessary because the initial active mode by system is the correct mode, and there is no need to initialise with system pref mode. But this mode needs to be set while clearing user pref mode. Bug: 221400174 Test: atest DefaultDisplayModeTest Test: atest LocalDisplayAdapterTest Change-Id: Ic7533f1974cd9fe4f418d807929490e06ca1a274 (cherry picked from commit b14bca30b88868af372ad5758526d209d9a887a1) --- .../server/display/LocalDisplayAdapter.java | 14 ++++--- .../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 2a219289cf10b..efb2cb7a32830 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 9c615d140e851..ed369c0167707 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();