diff options
| -rw-r--r-- | services/core/java/com/android/server/display/mode/DisplayModeDirector.java | 6 | ||||
| -rw-r--r-- | services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java | 78 |
2 files changed, 83 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java index 64cbd5488d90..d057cc40a549 100644 --- a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java @@ -1091,7 +1091,11 @@ public class DisplayModeDirector { maxRefreshRate = Math.min(defaultRefreshRate, peakRefreshRate); } - mBrightnessObserver.onRefreshRateSettingChangedLocked(minRefreshRate, maxRefreshRate); + // TODO(b/310237068): Make this work for multiple displays + if (displayId == Display.DEFAULT_DISPLAY) { + mBrightnessObserver.onRefreshRateSettingChangedLocked(minRefreshRate, + maxRefreshRate); + } } private void removeRefreshRateSetting(int displayId) { diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java b/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java index 3eced7fa025c..40f00fa13f55 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java @@ -1345,6 +1345,84 @@ public class DisplayModeDirectorTest { } @Test + public void testLockFps_DisplayWithOneMode() throws Exception { + when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled()) + .thenReturn(true); + DisplayModeDirector director = + new DisplayModeDirector(mContext, mHandler, mInjector, mDisplayManagerFlags); + director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); + + Display.Mode[] modes1 = new Display.Mode[] { + new Display.Mode(/* modeId= */ 1, /* width= */ 1280, /* height= */ 720, + /* refreshRate= */ 60), + new Display.Mode(/* modeId= */ 2, /* width= */ 1280, /* height= */ 720, + /* refreshRate= */ 90), + }; + Display.Mode[] modes2 = new Display.Mode[] { + new Display.Mode(/* modeId= */ 1, /* width= */ 1280, /* height= */ 720, + /* refreshRate= */ 60), + }; + SparseArray<Display.Mode[]> supportedModesByDisplay = new SparseArray<>(); + supportedModesByDisplay.put(DISPLAY_ID, modes1); + supportedModesByDisplay.put(DISPLAY_ID_2, modes2); + + final FakeDeviceConfig config = mInjector.getDeviceConfig(); + config.setRefreshRateInLowZone(90); + config.setLowDisplayBrightnessThresholds(new int[] { 10 }); + config.setLowAmbientBrightnessThresholds(new int[] { 20 }); + + Sensor lightSensor = createLightSensor(); + SensorManager sensorManager = createMockSensorManager(lightSensor); + + director.start(sensorManager); + director.injectSupportedModesByDisplay(supportedModesByDisplay); + director.getSettingsObserver().setDefaultRefreshRate(90); + + setPeakRefreshRate(Float.POSITIVE_INFINITY); + + ArgumentCaptor<DisplayListener> displayListenerCaptor = + ArgumentCaptor.forClass(DisplayListener.class); + verify(mInjector).registerDisplayListener(displayListenerCaptor.capture(), + any(Handler.class), + eq(DisplayManager.EVENT_FLAG_DISPLAY_CHANGED + | DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS)); + DisplayListener displayListener = displayListenerCaptor.getValue(); + + ArgumentCaptor<SensorEventListener> sensorListenerCaptor = + ArgumentCaptor.forClass(SensorEventListener.class); + Mockito.verify(sensorManager, Mockito.timeout(TimeUnit.SECONDS.toMillis(1))) + .registerListener( + sensorListenerCaptor.capture(), + eq(lightSensor), + anyInt(), + any(Handler.class)); + SensorEventListener sensorListener = sensorListenerCaptor.getValue(); + + setBrightness(10, 10, displayListener); + // Sensor reads 20 lux + sensorListener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, /* lux= */ 20)); + + Vote vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_FLICKER_REFRESH_RATE); + assertVoteForPhysicalRefreshRate(vote, /* fps= */ 90); + vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_FLICKER_REFRESH_RATE_SWITCH); + assertThat(vote).isNotNull(); + assertThat(vote).isInstanceOf(DisableRefreshRateSwitchingVote.class); + DisableRefreshRateSwitchingVote disableVote = (DisableRefreshRateSwitchingVote) vote; + assertThat(disableVote.mDisableRefreshRateSwitching).isTrue(); + + // We expect DisplayModeDirector to act on BrightnessInfo.adjustedBrightness; set only this + // parameter to the necessary threshold + setBrightness(10, 125, displayListener); + // Sensor reads 1000 lux + sensorListener.onSensorChanged(TestUtils.createSensorEvent(lightSensor, /* lux= */ 1000)); + + vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_FLICKER_REFRESH_RATE); + assertThat(vote).isNull(); + vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_FLICKER_REFRESH_RATE_SWITCH); + assertThat(vote).isNull(); + } + + @Test public void testLockFpsForHighZone() throws Exception { DisplayModeDirector director = createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); |