diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 3feffc6ae7dfc..24e279190c47d 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -141,7 +141,6 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; @@ -1754,10 +1753,6 @@ public final class DisplayManagerService extends SystemService { void setUserPreferredDisplayModeInternal(int displayId, Display.Mode mode) { synchronized (mSyncRoot) { - if (Objects.equals(mUserPreferredMode, mode) && displayId == Display.INVALID_DISPLAY) { - return; - } - if (mode != null && !isResolutionAndRefreshRateValid(mode) && displayId == Display.INVALID_DISPLAY) { throw new IllegalArgumentException("width, height and refresh rate of mode should " @@ -1811,7 +1806,15 @@ public final class DisplayManagerService extends SystemService { Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.USER_PREFERRED_RESOLUTION_WIDTH, resolutionWidth); mDisplayDeviceRepo.forEachLocked((DisplayDevice device) -> { - device.setUserPreferredDisplayModeLocked(mode); + // If there is a display specific mode, don't override that + final Point deviceUserPreferredResolution = + mPersistentDataStore.getUserPreferredResolution(device); + final float deviceRefreshRate = + mPersistentDataStore.getUserPreferredRefreshRate(device); + if (!isValidResolution(deviceUserPreferredResolution) + && !isValidRefreshRate(deviceRefreshRate)) { + device.setUserPreferredDisplayModeLocked(mode); + } }); } @@ -3531,6 +3534,14 @@ public final class DisplayManagerService extends SystemService { && (brightness <= PowerManager.BRIGHTNESS_MAX); } + private static boolean isValidResolution(Point resolution) { + return (resolution != null) && (resolution.x > 0) && (resolution.y > 0); + } + + private static boolean isValidRefreshRate(float refreshRate) { + return !Float.isNaN(refreshRate) && (refreshRate > 0.0f); + } + private final class LocalService extends DisplayManagerInternal { @Override