summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/display/mode/DisplayModeDirector.java22
-rw-r--r--services/core/java/com/android/server/display/mode/SkinThermalStatusObserver.java2
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/mode/DisplayModeDirectorTest.java52
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);