diff options
| -rw-r--r-- | core/java/com/android/internal/display/RefreshRateSettingsUtils.java | 29 | ||||
| -rw-r--r-- | services/tests/displayservicetests/src/com/android/server/display/RefreshRateSettingsUtilsTest.java | 39 |
2 files changed, 65 insertions, 3 deletions
diff --git a/core/java/com/android/internal/display/RefreshRateSettingsUtils.java b/core/java/com/android/internal/display/RefreshRateSettingsUtils.java index fab8984ce067..c23a5012923b 100644 --- a/core/java/com/android/internal/display/RefreshRateSettingsUtils.java +++ b/core/java/com/android/internal/display/RefreshRateSettingsUtils.java @@ -16,6 +16,8 @@ package com.android.internal.display; +import static android.hardware.display.DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED; + import android.content.Context; import android.hardware.display.DisplayManager; import android.util.Log; @@ -54,4 +56,31 @@ public class RefreshRateSettingsUtils { } return maxRefreshRate; } + + /** + * Find the highest refresh rate among all the modes of all the displays. + * + * This method will acquire DisplayManager.mLock, so calling it while holding other locks + * should be done with care. + * @param context The context + * @return The highest refresh rate + */ + public static float findHighestRefreshRateAmongAllDisplays(Context context) { + final DisplayManager dm = context.getSystemService(DisplayManager.class); + final Display[] displays = dm.getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED); + if (displays.length == 0) { + Log.w(TAG, "No valid display devices"); + return DEFAULT_REFRESH_RATE; + } + + float maxRefreshRate = DEFAULT_REFRESH_RATE; + for (Display display : displays) { + for (Display.Mode mode : display.getSupportedModes()) { + if (mode.getRefreshRate() > maxRefreshRate) { + maxRefreshRate = mode.getRefreshRate(); + } + } + } + return maxRefreshRate; + } } diff --git a/services/tests/displayservicetests/src/com/android/server/display/RefreshRateSettingsUtilsTest.java b/services/tests/displayservicetests/src/com/android/server/display/RefreshRateSettingsUtilsTest.java index a8af98f7a332..8a6c2440a232 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/RefreshRateSettingsUtilsTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/RefreshRateSettingsUtilsTest.java @@ -16,6 +16,8 @@ package com.android.server.display; +import static android.hardware.display.DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED; + import static com.android.internal.display.RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE; import static org.junit.Assert.assertEquals; @@ -50,6 +52,8 @@ public class RefreshRateSettingsUtilsTest { private DisplayManager mDisplayManagerMock; @Mock private Display mDisplayMock; + @Mock + private Display mDisplayMock2; @Before public void setUp() { @@ -65,25 +69,54 @@ public class RefreshRateSettingsUtilsTest { new Display.Mode(/* modeId= */ 0, /* width= */ 800, /* height= */ 600, /* refreshRate= */ 90) }; - when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(mDisplayMock); when(mDisplayMock.getSupportedModes()).thenReturn(modes); + + Display.Mode[] modes2 = new Display.Mode[]{ + new Display.Mode(/* modeId= */ 0, /* width= */ 800, /* height= */ 600, + /* refreshRate= */ 70), + new Display.Mode(/* modeId= */ 0, /* width= */ 800, /* height= */ 600, + /* refreshRate= */ 130), + new Display.Mode(/* modeId= */ 0, /* width= */ 800, /* height= */ 600, + /* refreshRate= */ 80) + }; + when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY + 1)).thenReturn(mDisplayMock2); + when(mDisplayMock2.getSupportedModes()).thenReturn(modes2); + + when(mDisplayManagerMock.getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)) + .thenReturn(new Display[]{ mDisplayMock, mDisplayMock2 }); } @Test public void testFindHighestRefreshRateForDefaultDisplay() { - when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(mDisplayMock); assertEquals(120, RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext), /* delta= */ 0); } @Test - public void testFindHighestRefreshRate_DisplayIsNull() { + public void testFindHighestRefreshRateForDefaultDisplay_DisplayIsNull() { when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(null); assertEquals(DEFAULT_REFRESH_RATE, RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext), /* delta= */ 0); } + + @Test + public void testFindHighestRefreshRateAmongAllDisplays() { + assertEquals(130, + RefreshRateSettingsUtils.findHighestRefreshRateAmongAllDisplays(mContext), + /* delta= */ 0); + } + + @Test + public void testFindHighestRefreshRateAmongAllDisplays_NoDisplays() { + when(mDisplayManagerMock.getDisplays(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)) + .thenReturn(new Display[0]); + assertEquals(DEFAULT_REFRESH_RATE, + RefreshRateSettingsUtils.findHighestRefreshRateAmongAllDisplays(mContext), + /* delta= */ 0); + + } } |