Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec350bb2 authored by Piotr Wilczyński's avatar Piotr Wilczyński
Browse files

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
parent 10274506
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -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,
+97 −4
Original line number Diff line number Diff line
@@ -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,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);
    }
@@ -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);
    }
@@ -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.