Change the way in which user preferred display mode gets applied

If a display has display specific user pref mode, global user pref mode
should not overide it.

Test: atest DefaultDisplayModeTest
Bug: 201782019

Change-Id: I44e0fbc5177873ed658a4c41032b319f311420ba
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 3feffc6..24e2791 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.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 @@
 
     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 @@
         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 @@
                 && (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