From 07474c17bc6c468852735340fc682999fc3e0d5b Mon Sep 17 00:00:00 2001 From: Oleg Petsjonkin Date: Tue, 2 May 2023 18:40:16 +0000 Subject: [PATCH] If smooth display is off, brightness change should not trigger rr change Bug: b/270605208 Test: manual testing, adb shell dupmpsys Change-Id: I616e75ae83b3d9f2269cb1b1f3628065d42233ca --- .../display/mode/DisplayModeDirector.java | 9 +-- .../display/mode/DisplayModeDirectorTest.java | 63 +++++++++++++++++++ 2 files changed, 68 insertions(+), 4 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 17f928af1c09b..18895788e4ec8 100644 --- a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java @@ -1977,10 +1977,8 @@ public class DisplayModeDirector { } updateSensorStatus(); - if (mRefreshRateChangeable) { - synchronized (mLock) { - onBrightnessChangedLocked(); - } + synchronized (mLock) { + onBrightnessChangedLocked(); } } @@ -2071,6 +2069,9 @@ public class DisplayModeDirector { } private void onBrightnessChangedLocked() { + if (!mRefreshRateChangeable) { + return; + } Vote refreshRateVote = null; Vote refreshRateSwitchingVote = null; diff --git a/services/tests/servicestests/src/com/android/server/display/mode/DisplayModeDirectorTest.java b/services/tests/servicestests/src/com/android/server/display/mode/DisplayModeDirectorTest.java index b2a3a57cccf87..04273d6f4ed6f 100644 --- a/services/tests/servicestests/src/com/android/server/display/mode/DisplayModeDirectorTest.java +++ b/services/tests/servicestests/src/com/android/server/display/mode/DisplayModeDirectorTest.java @@ -914,6 +914,69 @@ public class DisplayModeDirectorTest { .isEqualTo(updatedAmbientThresholds); } + @Test + public void setBrightness_doesNotLockFpsIfSmoothDisplayIsOff() { + DisplayModeDirector director = + createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); + setPeakRefreshRate(60); // set smooth display ON + director.getSettingsObserver().setDefaultRefreshRate(90); + director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); + + final FakeDeviceConfig config = mInjector.getDeviceConfig(); + config.setRefreshRateInLowZone(90); + config.setLowDisplayBrightnessThresholds(new int[] { 10 }); + config.setLowAmbientBrightnessThresholds(new int[] { 20 }); + + director.start(createMockSensorManager(createLightSensor())); + + ArgumentCaptor 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(); + + setBrightness(10, 10, displayListener); + + Vote 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 setBrightness_locksFpsIfSmoothDisplayIsOn() { + DisplayModeDirector director = + createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); + setPeakRefreshRate(90); // set smooth display ON + director.getSettingsObserver().setDefaultRefreshRate(90); + director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON); + + final FakeDeviceConfig config = mInjector.getDeviceConfig(); + config.setRefreshRateInLowZone(90); + config.setLowDisplayBrightnessThresholds(new int[] { 10 }); + config.setLowAmbientBrightnessThresholds(new int[] { 20 }); + + director.start(createMockSensorManager(createLightSensor())); + + ArgumentCaptor 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(); + + setBrightness(10, 10, displayListener); + + Vote vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_FLICKER_REFRESH_RATE); + assertVoteForPhysicalRefreshRate(vote, 90 /*fps*/); + vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_FLICKER_REFRESH_RATE_SWITCH); + assertThat(vote).isNotNull(); + assertThat(vote.disableRefreshRateSwitching).isTrue(); + } + @Test public void testLockFpsForLowZone() throws Exception { DisplayModeDirector director =