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

Commit 7a473d4f authored by Dan Shi's avatar Dan Shi Committed by Android (Google) Code Review
Browse files

Merge "Revert "Min and max refresh rate per display"" into main

parents bb8ea9a6 295c2a61
Loading
Loading
Loading
Loading
+2 −13
Original line number Diff line number Diff line
@@ -37,22 +37,11 @@ public class RefreshRateSettingsUtils {
     * @return The highest refresh rate
     */
    public static float findHighestRefreshRateForDefaultDisplay(Context context) {
        return findHighestRefreshRate(context, Display.DEFAULT_DISPLAY);
    }

    /**
     * Find the highest refresh rate among all the modes of the specified display.
     *
     * @param context The context
     * @param displayId The display ID
     * @return The highest refresh rate
     */
    public static float findHighestRefreshRate(Context context, int displayId) {
        final DisplayManager dm = context.getSystemService(DisplayManager.class);
        final Display display = dm.getDisplay(displayId);
        final Display display = dm.getDisplay(Display.DEFAULT_DISPLAY);

        if (display == null) {
            Log.w(TAG, "No valid display device with ID = " + displayId);
            Log.w(TAG, "No valid default display device");
            return DEFAULT_REFRESH_RATE;
        }

+10 −32
Original line number Diff line number Diff line
@@ -21,8 +21,8 @@ import static android.hardware.display.DisplayManagerInternal.REFRESH_RATE_LIMIT
import static android.os.PowerManager.BRIGHTNESS_INVALID_FLOAT;
import static android.view.Display.Mode.INVALID_MODE_ID;

import static com.android.internal.display.RefreshRateSettingsUtils.findHighestRefreshRate;
import static com.android.server.display.DisplayDeviceConfig.DEFAULT_LOW_REFRESH_RATE;
import static com.android.internal.display.RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay;

import android.annotation.IntegerRes;
import android.annotation.NonNull;
@@ -924,17 +924,12 @@ public class DisplayModeDirector {
        return mHbmObserver;
    }

    @VisibleForTesting
    DisplayObserver getDisplayObserver() {
        return mDisplayObserver;
    }

    @VisibleForTesting
    DesiredDisplayModeSpecs getDesiredDisplayModeSpecsWithInjectedFpsSettings(
            float minRefreshRate, float peakRefreshRate, float defaultRefreshRate) {
        synchronized (mLock) {
            mSettingsObserver.updateRefreshRateSettingLocked(minRefreshRate, peakRefreshRate,
                    defaultRefreshRate, Display.DEFAULT_DISPLAY);
            mSettingsObserver.updateRefreshRateSettingLocked(
                    minRefreshRate, peakRefreshRate, defaultRefreshRate);
            return getDesiredDisplayModeSpecs(Display.DEFAULT_DISPLAY);
        }
    }
@@ -1268,23 +1263,9 @@ public class DisplayModeDirector {
            mBrightnessObserver.onLowPowerModeEnabledLocked(inLowPowerMode);
        }

        /**
         * Update refresh rate settings for all displays
         */
        private void updateRefreshRateSettingLocked() {
            Display[] displays = mInjector.getDisplays();
            for (int i = 0; i < displays.length; i++) {
                updateRefreshRateSettingLocked(displays[i].getDisplayId());
            }
        }

        /**
         * Update refresh rate settings for a specific display
         * @param displayId The display ID
         */
        private void updateRefreshRateSettingLocked(int displayId) {
            final ContentResolver cr = mContext.getContentResolver();
            float highestRefreshRate = findHighestRefreshRate(mContext, displayId);
            float highestRefreshRate = findHighestRefreshRateForDefaultDisplay(mContext);

            float minRefreshRate = Settings.System.getFloatForUser(cr,
                    Settings.System.MIN_REFRESH_RATE, 0f, cr.getUserId());
@@ -1312,12 +1293,11 @@ public class DisplayModeDirector {
                }
            }

            updateRefreshRateSettingLocked(minRefreshRate, peakRefreshRate, mDefaultRefreshRate,
                    displayId);
            updateRefreshRateSettingLocked(minRefreshRate, peakRefreshRate, mDefaultRefreshRate);
        }

        private void updateRefreshRateSettingLocked(float minRefreshRate, float peakRefreshRate,
                float defaultRefreshRate, int displayId) {
        private void updateRefreshRateSettingLocked(
                float minRefreshRate, float peakRefreshRate, float defaultRefreshRate) {
            // TODO(b/156304339): The logic in here, aside from updating the refresh rate votes, is
            // used to predict if we're going to be doing frequent refresh rate switching, and if
            // so, enable the brightness observer. The logic here is more complicated and fragile
@@ -1325,9 +1305,9 @@ public class DisplayModeDirector {
            Vote peakVote = peakRefreshRate == 0f
                    ? null
                    : Vote.forRenderFrameRates(0f, Math.max(minRefreshRate, peakRefreshRate));
            mVotesStorage.updateVote(displayId, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE,
            mVotesStorage.updateGlobalVote(Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE,
                    peakVote);
            mVotesStorage.updateVote(displayId, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE,
            mVotesStorage.updateGlobalVote(Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE,
                    Vote.forRenderFrameRates(minRefreshRate, Float.POSITIVE_INFINITY));
            Vote defaultVote =
                    defaultRefreshRate == 0f
@@ -1484,8 +1464,7 @@ public class DisplayModeDirector {
        }
    }

    @VisibleForTesting
    public final class DisplayObserver implements DisplayManager.DisplayListener {
    private final class DisplayObserver implements DisplayManager.DisplayListener {
        // Note that we can never call into DisplayManager or any of the non-POD classes it
        // returns, while holding mLock since it may call into DMS, which might be simultaneously
        // calling into us already holding its own lock.
@@ -1577,7 +1556,6 @@ public class DisplayModeDirector {
            updateDisplayModes(displayId, displayInfo);
            updateLayoutLimitedFrameRate(displayId, displayInfo);
            updateUserSettingDisplayPreferredSize(displayInfo);
            mSettingsObserver.updateRefreshRateSettingLocked(displayId);
        }

        @Nullable
+3 −16
Original line number Diff line number Diff line
@@ -72,27 +72,14 @@ public class RefreshRateSettingsUtilsTest {

    @Test
    public void testFindHighestRefreshRateForDefaultDisplay() {
        when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(mDisplayMock);
        assertEquals(120,
        when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(null);
        assertEquals(DEFAULT_REFRESH_RATE,
                RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext),
                /* delta= */ 0);
    }

    @Test
    public void testFindHighestRefreshRate() {
        int displayId = 13;
        when(mDisplayManagerMock.getDisplay(displayId)).thenReturn(mDisplayMock);
        when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(mDisplayMock);
        assertEquals(120,
                RefreshRateSettingsUtils.findHighestRefreshRate(mContext, displayId),
                /* delta= */ 0);
    }

    @Test
    public void testFindHighestRefreshRate_DisplayIsNull() {
        when(mDisplayManagerMock.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(null);
        assertEquals(DEFAULT_REFRESH_RATE,
                RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext),
                /* delta= */ 0);

    }
}
+20 −98
Original line number Diff line number Diff line
@@ -290,7 +290,6 @@ public class DisplayModeDirectorTest {
    };

    private static final int DISPLAY_ID = Display.DEFAULT_DISPLAY;
    private static final int DISPLAY_ID_2 = Display.DEFAULT_DISPLAY + 1;
    private static final int MODE_ID = 1;
    private static final float TRANSITION_POINT = 0.763f;

@@ -1551,12 +1550,9 @@ public class DisplayModeDirectorTest {
    public void testPeakRefreshRate_FlagEnabled() {
        when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled())
                .thenReturn(true);
        float highestRefreshRate1 = 130;
        float highestRefreshRate2 = 132;
        doReturn(highestRefreshRate1).when(() ->
                RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID));
        doReturn(highestRefreshRate2).when(() ->
                RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID_2));
        float highestRefreshRate = 130;
        doReturn(highestRefreshRate).when(() ->
                RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext));
        DisplayModeDirector director =
                createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
        director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
@@ -1567,14 +1563,10 @@ public class DisplayModeDirectorTest {

        setPeakRefreshRate(Float.POSITIVE_INFINITY);

        Vote vote1 = director.getVote(DISPLAY_ID,
        Vote vote = director.getVote(Display.DEFAULT_DISPLAY,
                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= */ highestRefreshRate1);
        assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ 0,
                /* frameRateHigh= */ highestRefreshRate2);
        assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, /* frameRateHigh= */
                highestRefreshRate);
    }

    @Test
@@ -1592,54 +1584,19 @@ public class DisplayModeDirectorTest {

        setPeakRefreshRate(peakRefreshRate);

        Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE);
        assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0,
                /* frameRateHigh= */ peakRefreshRate);
    }

    @Test
    public void testPeakRefreshRate_DisplayChanged() {
        when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled())
                .thenReturn(true);
        float highestRefreshRate = 130;
        doReturn(highestRefreshRate).when(() ->
                RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID));
        DisplayModeDirector director =
                createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
        director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);

        Sensor lightSensor = createLightSensor();
        SensorManager sensorManager = createMockSensorManager(lightSensor);
        director.start(sensorManager);

        setPeakRefreshRate(Float.POSITIVE_INFINITY);

        Vote vote = director.getVote(DISPLAY_ID,
        Vote vote = director.getVote(Display.DEFAULT_DISPLAY,
                Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE);
        assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0,
                /* frameRateHigh= */ highestRefreshRate);

        // The highest refresh rate of the display changes
        highestRefreshRate = 140;
        doReturn(highestRefreshRate).when(() ->
                RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID));
        director.getDisplayObserver().onDisplayChanged(DISPLAY_ID);

        vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_PEAK_RENDER_FRAME_RATE);
        assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0,
                /* frameRateHigh= */ highestRefreshRate);
        assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ 0, /* frameRateHigh= */
                peakRefreshRate);
    }

    @Test
    public void testMinRefreshRate_FlagEnabled() {
        when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled())
                .thenReturn(true);
        float highestRefreshRate1 = 130;
        float highestRefreshRate2 = 132;
        doReturn(highestRefreshRate1).when(() ->
                RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID));
        doReturn(highestRefreshRate2).when(() ->
                RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID_2));
        float highestRefreshRate = 130;
        doReturn(highestRefreshRate).when(() ->
                RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(mContext));
        DisplayModeDirector director =
                createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
        director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);
@@ -1650,12 +1607,9 @@ public class DisplayModeDirectorTest {

        setMinRefreshRate(Float.POSITIVE_INFINITY);

        Vote vote1 = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE);
        Vote vote2 = director.getVote(DISPLAY_ID_2,
        Vote vote = director.getVote(Display.DEFAULT_DISPLAY,
                Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE);
        assertVoteForRenderFrameRateRange(vote1, /* frameRateLow= */ highestRefreshRate1,
                /* frameRateHigh= */ Float.POSITIVE_INFINITY);
        assertVoteForRenderFrameRateRange(vote2, /* frameRateLow= */ highestRefreshRate2,
        assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ highestRefreshRate,
                /* frameRateHigh= */ Float.POSITIVE_INFINITY);
    }

@@ -1674,43 +1628,12 @@ public class DisplayModeDirectorTest {

        setMinRefreshRate(minRefreshRate);

        Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE);
        Vote vote = director.getVote(Display.DEFAULT_DISPLAY,
                Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE);
        assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ minRefreshRate,
                /* frameRateHigh= */ Float.POSITIVE_INFINITY);
    }

    @Test
    public void testMinRefreshRate_DisplayChanged() {
        when(mDisplayManagerFlags.isBackUpSmoothDisplayAndForcePeakRefreshRateEnabled())
                .thenReturn(true);
        float highestRefreshRate = 130;
        doReturn(highestRefreshRate).when(() ->
                RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID));
        DisplayModeDirector director =
                createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
        director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);

        Sensor lightSensor = createLightSensor();
        SensorManager sensorManager = createMockSensorManager(lightSensor);
        director.start(sensorManager);

        setMinRefreshRate(Float.POSITIVE_INFINITY);

        Vote vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE);
        assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ highestRefreshRate,
                /* frameRateHigh= */ Float.POSITIVE_INFINITY);

        // The highest refresh rate of the display changes
        highestRefreshRate = 140;
        doReturn(highestRefreshRate).when(() ->
                RefreshRateSettingsUtils.findHighestRefreshRate(mContext, DISPLAY_ID));
        director.getDisplayObserver().onDisplayChanged(DISPLAY_ID);

        vote = director.getVote(DISPLAY_ID, Vote.PRIORITY_USER_SETTING_MIN_RENDER_FRAME_RATE);
        assertVoteForRenderFrameRateRange(vote, /* frameRateLow= */ highestRefreshRate,
                /* frameRateHigh= */ Float.POSITIVE_INFINITY);
    }

    @Test
    public void testSensorRegistration() {
        // First, configure brightness zones or DMD won't register for sensor data.
@@ -3406,7 +3329,7 @@ public class DisplayModeDirectorTest {
    public static class FakesInjector implements DisplayModeDirector.Injector {
        private final FakeDeviceConfig mDeviceConfig;
        private final DisplayInfo mDisplayInfo;
        private final Map<Integer, Display> mDisplays;
        private final Display mDisplay;
        private boolean mDisplayInfoValid = true;
        private final DisplayManagerInternal mDisplayManagerInternal;
        private final StatusBarManagerInternal mStatusBarManagerInternal;
@@ -3427,8 +3350,7 @@ public class DisplayModeDirectorTest {
            mDisplayInfo.defaultModeId = MODE_ID;
            mDisplayInfo.supportedModes = new Display.Mode[] {new Display.Mode(MODE_ID,
                    800, 600, /* refreshRate= */ 60)};
            mDisplays = Map.of(DISPLAY_ID, createDisplay(DISPLAY_ID),
                    DISPLAY_ID_2, createDisplay(DISPLAY_ID_2));
            mDisplay = createDisplay(DISPLAY_ID);
            mDisplayManagerInternal = displayManagerInternal;
            mStatusBarManagerInternal = statusBarManagerInternal;
            mSensorManagerInternal = sensorManagerInternal;
@@ -3459,12 +3381,12 @@ public class DisplayModeDirectorTest {

        @Override
        public Display getDisplay(int displayId) {
            return mDisplays.get(displayId);
            return mDisplay;
        }

        @Override
        public Display[] getDisplays() {
            return mDisplays.values().toArray(new Display[0]);
            return new Display[] { mDisplay };
        }

        @Override