Loading services/core/java/com/android/server/display/mode/DisplayModeDirector.java +15 −7 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -2128,7 +2136,7 @@ public class DisplayModeDirector { } private void onBrightnessChangedLocked() { if (!mRefreshRateChangeable) { if (!mRefreshRateChangeable || mLowPowerModeEnabled) { return; } Vote refreshRateVote = null; Loading services/core/java/com/android/server/display/mode/SkinThermalStatusObserver.java +1 −1 Original line number Diff line number Diff line Loading @@ -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<>(); Loading services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java +51 −1 Original line number Diff line number Diff line Loading @@ -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]; Loading Loading @@ -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); Loading Loading @@ -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 = Loading Loading
services/core/java/com/android/server/display/mode/DisplayModeDirector.java +15 −7 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -2128,7 +2136,7 @@ public class DisplayModeDirector { } private void onBrightnessChangedLocked() { if (!mRefreshRateChangeable) { if (!mRefreshRateChangeable || mLowPowerModeEnabled) { return; } Vote refreshRateVote = null; Loading
services/core/java/com/android/server/display/mode/SkinThermalStatusObserver.java +1 −1 Original line number Diff line number Diff line Loading @@ -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<>(); Loading
services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java +51 −1 Original line number Diff line number Diff line Loading @@ -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]; Loading Loading @@ -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); Loading Loading @@ -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 = Loading