diff options
| author | 2024-03-08 15:29:56 +0000 | |
|---|---|---|
| committer | 2024-03-13 07:10:32 +0000 | |
| commit | ee0ba57ed857974ae427810c932c06be57c39d3b (patch) | |
| tree | 2df2490b047237ffd091e5573d20363613f6b197 | |
| parent | 1745193e5af373170102df7176f17b8ecaf3f119 (diff) | |
Fix Smooth Display screen recording
Only look at the peak refresh rate of the default display to determine if the back up smooth display feature flag has been turned on/off.
Add missing tests for turning off Smooth Display and Force Peak Refresh Rate.
Bug: 327562842
Test: adb shell dumpsys settings
Test: adb shell dumpsys display
Test: atest DisplayModeDirectorTest
Change-Id: I24e6ab3763b9276e976a9f1e4d85d86d4a4d284c
(cherry picked from commit ec350bb29c7666418f2cfe98cf4f994bfe443dbd)
2 files changed, 107 insertions, 8 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 8b4e1ff4981f..64cbd5488d90 100644 --- a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java @@ -1015,12 +1015,15 @@ public class DisplayModeDirector { // Infinity means that we want the highest possible refresh rate minRefreshRate = highestRefreshRate; - if (!mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled) { - // The flag had been turned off, we need to restore the original value + if (!mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled + && displayId == Display.DEFAULT_DISPLAY) { + // The flag has been turned off, we need to restore the original value. We'll + // use the peak refresh rate of the default display. Settings.System.putFloatForUser(cr, Settings.System.MIN_REFRESH_RATE, highestRefreshRate, cr.getUserId()); } } else if (mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled + && displayId == Display.DEFAULT_DISPLAY && Math.round(minRefreshRate) == Math.round(highestRefreshRate)) { // The flag has been turned on, we need to upgrade the setting Settings.System.putFloatForUser(cr, Settings.System.MIN_REFRESH_RATE, @@ -1033,12 +1036,15 @@ public class DisplayModeDirector { // Infinity means that we want the highest possible refresh rate peakRefreshRate = highestRefreshRate; - if (!mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled) { - // The flag had been turned off, we need to restore the original value + if (!mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled + && displayId == Display.DEFAULT_DISPLAY) { + // The flag has been turned off, we need to restore the original value. We'll + // use the peak refresh rate of the default display. Settings.System.putFloatForUser(cr, Settings.System.PEAK_REFRESH_RATE, highestRefreshRate, cr.getUserId()); } } else if (mIsBackUpSmoothDisplayAndForcePeakRefreshRateEnabled + && displayId == Display.DEFAULT_DISPLAY && Math.round(peakRefreshRate) == Math.round(highestRefreshRate)) { // The flag has been turned on, we need to upgrade the setting Settings.System.putFloatForUser(cr, Settings.System.PEAK_REFRESH_RATE, 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 64076e604414..3eced7fa025c 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 @@ -1631,12 +1631,25 @@ public class DisplayModeDirectorTest { director.start(sensorManager); director.injectSupportedModesByDisplay(supportedModesByDisplay); - setPeakRefreshRate(Float.POSITIVE_INFINITY); + // Disable Smooth Display + setPeakRefreshRate(RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); Vote vote1 = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); Vote vote2 = director.getVote(DISPLAY_ID_2, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); + assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ 0, + /* frameRateHigh= */ RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); + assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 0, + /* frameRateHigh= */ RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); + + // Enable Smooth Display + setPeakRefreshRate(Float.POSITIVE_INFINITY); + + vote1 = director.getVote(DISPLAY_ID, + Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); + vote2 = director.getVote(DISPLAY_ID_2, + Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ 0, /* frameRateHigh= */ 130); assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 0, /* frameRateHigh= */ 140); } @@ -1654,10 +1667,18 @@ public class DisplayModeDirectorTest { SensorManager sensorManager = createMockSensorManager(lightSensor); director.start(sensorManager); - setPeakRefreshRate(peakRefreshRate); + // Disable Smooth Display + setPeakRefreshRate(RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, + /* frameRateHigh= */ RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); + + // Enable Smooth Display + setPeakRefreshRate(peakRefreshRate); + + vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); + assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, /* frameRateHigh= */ peakRefreshRate); } @@ -1759,11 +1780,23 @@ public class DisplayModeDirectorTest { director.start(sensorManager); director.injectSupportedModesByDisplay(supportedModesByDisplay); - setMinRefreshRate(Float.POSITIVE_INFINITY); + // Disable Force Peak Refresh Rate + setMinRefreshRate(0); Vote vote1 = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); Vote vote2 = director.getVote(DISPLAY_ID_2, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); + assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ 0, + /* frameRateHigh= */ Float.POSITIVE_INFINITY); + assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 0, + /* frameRateHigh= */ Float.POSITIVE_INFINITY); + + // Enable Force Peak Refresh Rate + setMinRefreshRate(Float.POSITIVE_INFINITY); + + vote1 = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); + vote2 = director.getVote(DISPLAY_ID_2, + Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ 130, /* frameRateHigh= */ Float.POSITIVE_INFINITY); assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 140, @@ -1783,9 +1816,17 @@ public class DisplayModeDirectorTest { SensorManager sensorManager = createMockSensorManager(lightSensor); director.start(sensorManager); - setMinRefreshRate(minRefreshRate); + // Disable Force Peak Refresh Rate + setMinRefreshRate(0); Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); + assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, + /* frameRateHigh= */ Float.POSITIVE_INFINITY); + + // Enable Force Peak Refresh Rate + setMinRefreshRate(minRefreshRate); + + vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ minRefreshRate, /* frameRateHigh= */ Float.POSITIVE_INFINITY); } @@ -1829,6 +1870,58 @@ public class DisplayModeDirectorTest { } @Test + public void testPeakAndMinRefreshRate_FlagEnabled_DisplayWithOneMode() { + 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= */ 130), + }; + 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); + + Sensor lightSensor = createLightSensor(); + SensorManager sensorManager = createMockSensorManager(lightSensor); + director.start(sensorManager); + director.injectSupportedModesByDisplay(supportedModesByDisplay); + + // Disable Force Peak Refresh Rate and Smooth Display + setMinRefreshRate(0); + setPeakRefreshRate(RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); + + // Even though the highest refresh rate of the second display == the current min refresh + // rate == 60, Force Peak Refresh Rate should remain disabled + Vote vote1 = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); + Vote vote2 = director.getVote(DISPLAY_ID_2, + Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE); + assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ 0, + /* frameRateHigh= */ Float.POSITIVE_INFINITY); + assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 0, + /* frameRateHigh= */ Float.POSITIVE_INFINITY); + + // Even though the highest refresh rate of the second display == the current peak refresh + // rate == 60, Smooth Display should remain disabled + vote1 = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); + vote2 = director.getVote(DISPLAY_ID_2, + Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE); + assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ 0, + /* frameRateHigh= */ RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); + assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 0, + /* frameRateHigh= */ RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE); + } + + @Test public void testSensorRegistration() { // First, configure brightness zones or DMD won't register for sensor data. final FakeDeviceConfig config = mInjector.getDeviceConfig(); |