summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Piotr WilczyƄski <wilczynskip@google.com> 2024-03-08 15:29:56 +0000
committer Yvonne Lin <yvonnecylin@google.com> 2024-03-13 07:10:32 +0000
commitee0ba57ed857974ae427810c932c06be57c39d3b (patch)
tree2df2490b047237ffd091e5573d20363613f6b197
parent1745193e5af373170102df7176f17b8ecaf3f119 (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)
-rw-r--r--services/core/java/com/android/server/display/mode/DisplayModeDirector.java14
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java101
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();