Loading services/core/java/com/android/server/display/mode/DisplayModeDirector.java +10 −4 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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, Loading services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java +97 −4 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -1654,9 +1667,17 @@ 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); } Loading Loading @@ -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, Loading @@ -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); } Loading Loading @@ -1828,6 +1869,58 @@ public class DisplayModeDirectorTest { /* frameRateHigh= */ Float.POSITIVE_INFINITY); } @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. Loading Loading
services/core/java/com/android/server/display/mode/DisplayModeDirector.java +10 −4 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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, Loading
services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java +97 −4 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -1654,9 +1667,17 @@ 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); } Loading Loading @@ -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, Loading @@ -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); } Loading Loading @@ -1828,6 +1869,58 @@ public class DisplayModeDirectorTest { /* frameRateHigh= */ Float.POSITIVE_INFINITY); } @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. Loading