diff options
3 files changed, 67 insertions, 9 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 6079a3295502..21f9d8ab9d14 100644 --- a/services/core/java/com/android/server/display/mode/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/mode/DisplayModeDirector.java @@ -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; diff --git a/services/core/java/com/android/server/display/mode/SkinThermalStatusObserver.java b/services/core/java/com/android/server/display/mode/SkinThermalStatusObserver.java index b29cda88802a..625b6bbc0e83 100644 --- a/services/core/java/com/android/server/display/mode/SkinThermalStatusObserver.java +++ b/services/core/java/com/android/server/display/mode/SkinThermalStatusObserver.java @@ -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<>(); 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 89a1e13636d8..890feda6cce7 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 @@ -617,6 +617,24 @@ public class DisplayModeDirectorTest { } @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]; modes[0] = new Display.Mode( @@ -925,7 +943,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); @@ -985,6 +1003,38 @@ public class DisplayModeDirectorTest { } @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 = createDirectorFromRefreshRateArray(new float[] {60.f, 90.f}, 0); |