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

Commit 3c0bdfaf authored by Oleg Petšjonkin's avatar Oleg Petšjonkin Committed by Android (Google) Code Review
Browse files

Merge "Clearing PRIORITY_FLICKER_RR votes on low power mode on" into main

parents 5442c06b 605ea878
Loading
Loading
Loading
Loading
+15 −7
Original line number Diff line number Diff line
@@ -1812,20 +1812,28 @@ public class DisplayModeDirector {
                mRefreshRateChangeable = changeable;
                updateSensorStatus();
                if (!changeable) {
                    // Revoke previous vote from BrightnessObserver
                    mVotesStorage.updateGlobalVote(Vote.PRIORITY_FLICKER_REFRESH_RATE, null);
                    mVotesStorage.updateGlobalVote(Vote.PRIORITY_FLICKER_REFRESH_RATE_SWITCH, null);
                    removeFlickerRefreshRateVotes();
                }
            }
        }

        private void onLowPowerModeEnabledLocked(boolean b) {
            if (mLowPowerModeEnabled != b) {
                mLowPowerModeEnabled = b;
        @VisibleForTesting
        void onLowPowerModeEnabledLocked(boolean enabled) {
            if (mLowPowerModeEnabled != enabled) {
                mLowPowerModeEnabled = enabled;
                updateSensorStatus();
                if (enabled) {
                    removeFlickerRefreshRateVotes();
                }
            }
        }

        private void removeFlickerRefreshRateVotes() {
            // Revoke previous vote from BrightnessObserver
            mVotesStorage.updateGlobalVote(Vote.PRIORITY_FLICKER_REFRESH_RATE, null);
            mVotesStorage.updateGlobalVote(Vote.PRIORITY_FLICKER_REFRESH_RATE_SWITCH, null);
        }

        private void onDeviceConfigLowBrightnessThresholdsChanged(float[] displayThresholds,
                float[] ambientThresholds) {
            if (displayThresholds != null && ambientThresholds != null
@@ -2128,7 +2136,7 @@ public class DisplayModeDirector {
        }

        private void onBrightnessChangedLocked() {
            if (!mRefreshRateChangeable) {
            if (!mRefreshRateChangeable || mLowPowerModeEnabled) {
                return;
            }
            Vote refreshRateVote = null;
+1 −1
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ final class SkinThermalStatusObserver extends IThermalEventListener.Stub impleme
    private final Object mThermalObserverLock = new Object();
    @GuardedBy("mThermalObserverLock")
    @Temperature.ThrottlingStatus
    private int mStatus = -1;
    private int mStatus = Temperature.THROTTLING_NONE;
    @GuardedBy("mThermalObserverLock")
    private final SparseArray<SparseArray<SurfaceControl.RefreshRateRange>>
            mThermalThrottlingByDisplay = new SparseArray<>();
+51 −1
Original line number Diff line number Diff line
@@ -609,6 +609,24 @@ public class DisplayModeDirectorTest {
        verifyBrightnessObserverCall(director, 120, 90, 0, 120, 90);
    }

    @Test
    public void testBrightnessObserver_LowPowerModeRemovesFlickerVotes() {
        float[] refreshRates = {60.f, 90.f, 120.f};
        DisplayModeDirector director =
                createDirectorFromRefreshRateArray(refreshRates, /*baseModeId=*/0);
        SparseArray<Vote> votes = new SparseArray<>();
        SparseArray<SparseArray<Vote>> votesByDisplay = new SparseArray<>();
        votesByDisplay.put(-1, votes); // Global Vote
        votes.put(Vote.PRIORITY_FLICKER_REFRESH_RATE, Vote.forPhysicalRefreshRates(0, 60));
        votes.put(Vote.PRIORITY_FLICKER_REFRESH_RATE_SWITCH, Vote.forRenderFrameRates(60, 90));
        director.injectVotesByDisplay(votesByDisplay);

        director.getBrightnessObserver().onLowPowerModeEnabledLocked(true);

        assertNull(director.getVote(-1, Vote.PRIORITY_FLICKER_REFRESH_RATE));
        assertNull(director.getVote(-1, Vote.PRIORITY_FLICKER_REFRESH_RATE_SWITCH));
    }

    @Test
    public void testVotingWithAlwaysRespectAppRequest() {
        Display.Mode[] modes = new Display.Mode[3];
@@ -918,7 +936,7 @@ public class DisplayModeDirectorTest {
    public void setBrightness_doesNotLockFpsIfSmoothDisplayIsOff() {
        DisplayModeDirector director =
                createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
        setPeakRefreshRate(60); // set smooth display ON
        setPeakRefreshRate(60); // set smooth display OFF
        director.getSettingsObserver().setDefaultRefreshRate(90);
        director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);

@@ -977,6 +995,38 @@ public class DisplayModeDirectorTest {
        assertThat(vote.disableRefreshRateSwitching).isTrue();
    }

    @Test
    public void setBrightness_doesNotLockFpsIfSmoothDisplayIsOnAndLowPowerMode() {
        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.LOW_POWER_MODE, 1);
        DisplayModeDirector director =
                createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0);
        setPeakRefreshRate(90); // set smooth display ON
        director.getSettingsObserver().setDefaultRefreshRate(90);
        director.getBrightnessObserver().setDefaultDisplayState(Display.STATE_ON);

        final FakeDeviceConfig config = mInjector.getDeviceConfig();
        config.setRefreshRateInLowZone(90);
        config.setLowDisplayBrightnessThresholds(new int[] { 10 });
        config.setLowAmbientBrightnessThresholds(new int[] { 20 });

        director.start(createMockSensorManager(createLightSensor()));

        ArgumentCaptor<DisplayListener> displayListenerCaptor =
                ArgumentCaptor.forClass(DisplayListener.class);
        verify(mInjector).registerDisplayListener(displayListenerCaptor.capture(),
                any(Handler.class),
                eq(DisplayManager.EVENT_FLAG_DISPLAY_CHANGED
                        | DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS));
        DisplayListener displayListener = displayListenerCaptor.getValue();

        setBrightness(10, 10, displayListener);

        Vote vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_FLICKER_REFRESH_RATE);
        assertThat(vote).isNull();
        vote = director.getVote(Display.DEFAULT_DISPLAY, Vote.PRIORITY_FLICKER_REFRESH_RATE_SWITCH);
        assertThat(vote).isNull();
    }

    @Test
    public void testLockFpsForLowZone() throws Exception {
        DisplayModeDirector director =