diff options
4 files changed, 131 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java index b43b35ba50bc..ddb091dd170d 100644 --- a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java +++ b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java @@ -15,6 +15,8 @@ */ package com.android.server.display.brightness.strategy; +import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE; + import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DOZE; @@ -133,14 +135,20 @@ public class AutomaticBrightnessStrategy extends AutomaticBrightnessStrategy2 // We are still in the process of updating the power state, so there's no need to trigger // an update again switchMode(targetDisplayState, /* sendUpdate= */ false); - final boolean autoBrightnessEnabledInDoze = - allowAutoBrightnessWhileDozingConfig && Display.isDozeState(targetDisplayState); + + // If the policy is POLICY_DOZE and the display state is STATE_ON, auto-brightness should + // only be enabled if the config allows it + final boolean autoBrightnessEnabledInDoze = allowAutoBrightnessWhileDozingConfig + && policy == POLICY_DOZE && targetDisplayState != Display.STATE_OFF; + mIsAutoBrightnessEnabled = shouldUseAutoBrightness() - && (targetDisplayState == Display.STATE_ON || autoBrightnessEnabledInDoze) + && ((targetDisplayState == Display.STATE_ON && policy != POLICY_DOZE) + || autoBrightnessEnabledInDoze) && brightnessReason != BrightnessReason.REASON_OVERRIDE && mAutomaticBrightnessController != null; mAutoBrightnessDisabledDueToDisplayOff = shouldUseAutoBrightness() - && !(targetDisplayState == Display.STATE_ON || autoBrightnessEnabledInDoze); + && !((targetDisplayState == Display.STATE_ON && policy != POLICY_DOZE) + || autoBrightnessEnabledInDoze); final int autoBrightnessState = mIsAutoBrightnessEnabled && brightnessReason != BrightnessReason.REASON_FOLLOWER ? AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED diff --git a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2.java b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2.java index 4d9c18ab72fe..c87872cb24cb 100644 --- a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2.java +++ b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2.java @@ -15,6 +15,8 @@ */ package com.android.server.display.brightness.strategy; +import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE; + import android.annotation.Nullable; import android.content.Context; import android.hardware.display.BrightnessConfiguration; @@ -107,14 +109,19 @@ public class AutomaticBrightnessStrategy2 { public void setAutoBrightnessState(int targetDisplayState, boolean allowAutoBrightnessWhileDozingConfig, int brightnessReason, int policy, float lastUserSetScreenBrightness, boolean userSetBrightnessChanged) { - final boolean autoBrightnessEnabledInDoze = - allowAutoBrightnessWhileDozingConfig && Display.isDozeState(targetDisplayState); + // If the policy is POLICY_DOZE and the display state is STATE_ON, auto-brightness should + // only be enabled if the config allows it + final boolean autoBrightnessEnabledInDoze = allowAutoBrightnessWhileDozingConfig + && policy == POLICY_DOZE && targetDisplayState != Display.STATE_OFF; + mIsAutoBrightnessEnabled = shouldUseAutoBrightness() - && (targetDisplayState == Display.STATE_ON || autoBrightnessEnabledInDoze) + && ((targetDisplayState == Display.STATE_ON && policy != POLICY_DOZE) + || autoBrightnessEnabledInDoze) && brightnessReason != BrightnessReason.REASON_OVERRIDE && mAutomaticBrightnessController != null; mAutoBrightnessDisabledDueToDisplayOff = shouldUseAutoBrightness() - && !(targetDisplayState == Display.STATE_ON || autoBrightnessEnabledInDoze); + && !((targetDisplayState == Display.STATE_ON && policy != POLICY_DOZE) + || autoBrightnessEnabledInDoze); final int autoBrightnessState = mIsAutoBrightnessEnabled && brightnessReason != BrightnessReason.REASON_FOLLOWER ? AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2Test.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2Test.java index 498bffd260dd..4e10b98c0041 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2Test.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2Test.java @@ -192,7 +192,7 @@ public class AutomaticBrightnessStrategy2Test { } @Test - public void testAutoBrightnessState_DisplayIsInDoze_ConfigDoesAllow() { + public void testAutoBrightnessState_DeviceIsInDoze_ConfigDoesAllow() { mAutomaticBrightnessStrategy.setUseAutoBrightness(true); int targetDisplayState = Display.STATE_DOZE; boolean allowAutoBrightnessWhileDozing = true; @@ -218,6 +218,32 @@ public class AutomaticBrightnessStrategy2Test { } @Test + public void testAutoBrightnessState_DeviceIsInDoze_ConfigDoesAllow_ScreenOff() { + mAutomaticBrightnessStrategy.setUseAutoBrightness(true); + int targetDisplayState = Display.STATE_OFF; + boolean allowAutoBrightnessWhileDozing = true; + int brightnessReason = BrightnessReason.REASON_UNKNOWN; + int policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE; + float lastUserSetBrightness = 0.2f; + boolean userSetBrightnessChanged = true; + Settings.System.putFloat(mContext.getContentResolver(), + Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0.4f); + mAutomaticBrightnessStrategy.updatePendingAutoBrightnessAdjustments(); + mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, + allowAutoBrightnessWhileDozing, brightnessReason, policy, lastUserSetBrightness, + userSetBrightnessChanged); + verify(mAutomaticBrightnessController) + .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE, + mBrightnessConfiguration, + lastUserSetBrightness, + userSetBrightnessChanged, /* adjustment */ 0.4f, + /* userChangedAutoBrightnessAdjustment= */ true, policy, + targetDisplayState, /* shouldResetShortTermModel */ true); + assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessEnabled()); + assertTrue(mAutomaticBrightnessStrategy.isAutoBrightnessDisabledDueToDisplayOff()); + } + + @Test public void testAutoBrightnessState_DisplayIsOn() { mAutomaticBrightnessStrategy.setUseAutoBrightness(true); int targetDisplayState = Display.STATE_ON; @@ -245,6 +271,33 @@ public class AutomaticBrightnessStrategy2Test { } @Test + public void testAutoBrightnessState_DisplayIsOn_PolicyIsDoze() { + mAutomaticBrightnessStrategy.setUseAutoBrightness(true); + int targetDisplayState = Display.STATE_ON; + boolean allowAutoBrightnessWhileDozing = false; + int brightnessReason = BrightnessReason.REASON_UNKNOWN; + float lastUserSetBrightness = 0.2f; + boolean userSetBrightnessChanged = true; + int policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE; + float pendingBrightnessAdjustment = 0.1f; + Settings.System.putFloat(mContext.getContentResolver(), + Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, pendingBrightnessAdjustment); + mAutomaticBrightnessStrategy.updatePendingAutoBrightnessAdjustments(); + mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, + allowAutoBrightnessWhileDozing, brightnessReason, policy, lastUserSetBrightness, + userSetBrightnessChanged); + verify(mAutomaticBrightnessController) + .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE, + mBrightnessConfiguration, + lastUserSetBrightness, + userSetBrightnessChanged, pendingBrightnessAdjustment, + /* userChangedAutoBrightnessAdjustment= */ true, policy, targetDisplayState, + /* shouldResetShortTermModel */ true); + assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessEnabled()); + assertTrue(mAutomaticBrightnessStrategy.isAutoBrightnessDisabledDueToDisplayOff()); + } + + @Test public void accommodateUserBrightnessChangesWorksAsExpected() { // Verify the state if automaticBrightnessController is configured. assertFalse(mAutomaticBrightnessStrategy.isShortTermModelActive()); diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java index 1d04baaa6acd..e16377e57321 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java @@ -202,7 +202,7 @@ public class AutomaticBrightnessStrategyTest { } @Test - public void testAutoBrightnessState_DisplayIsInDoze_ConfigDoesAllow() { + public void testAutoBrightnessState_DeviceIsInDoze_ConfigDoesAllow() { mAutomaticBrightnessStrategy.setUseAutoBrightness(true); int targetDisplayState = Display.STATE_DOZE; boolean allowAutoBrightnessWhileDozing = true; @@ -228,6 +228,32 @@ public class AutomaticBrightnessStrategyTest { } @Test + public void testAutoBrightnessState_DeviceIsInDoze_ConfigDoesAllow_ScreenOff() { + mAutomaticBrightnessStrategy.setUseAutoBrightness(true); + int targetDisplayState = Display.STATE_OFF; + boolean allowAutoBrightnessWhileDozing = true; + int brightnessReason = BrightnessReason.REASON_UNKNOWN; + int policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE; + float lastUserSetBrightness = 0.2f; + boolean userSetBrightnessChanged = true; + Settings.System.putFloat(mContext.getContentResolver(), + Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0.4f); + mAutomaticBrightnessStrategy.updatePendingAutoBrightnessAdjustments(); + mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, + allowAutoBrightnessWhileDozing, brightnessReason, policy, lastUserSetBrightness, + userSetBrightnessChanged); + verify(mAutomaticBrightnessController) + .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE, + mBrightnessConfiguration, + lastUserSetBrightness, + userSetBrightnessChanged, /* adjustment */ 0.4f, + /* userChangedAutoBrightnessAdjustment= */ true, policy, + targetDisplayState, /* shouldResetShortTermModel */ true); + assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessEnabled()); + assertTrue(mAutomaticBrightnessStrategy.isAutoBrightnessDisabledDueToDisplayOff()); + } + + @Test public void testAutoBrightnessState_DisplayIsOn() { mAutomaticBrightnessStrategy.setUseAutoBrightness(true); int targetDisplayState = Display.STATE_ON; @@ -255,6 +281,33 @@ public class AutomaticBrightnessStrategyTest { } @Test + public void testAutoBrightnessState_DisplayIsOn_PolicyIsDoze() { + mAutomaticBrightnessStrategy.setUseAutoBrightness(true); + int targetDisplayState = Display.STATE_ON; + boolean allowAutoBrightnessWhileDozing = false; + int brightnessReason = BrightnessReason.REASON_UNKNOWN; + float lastUserSetBrightness = 0.2f; + boolean userSetBrightnessChanged = true; + int policy = DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE; + float pendingBrightnessAdjustment = 0.1f; + Settings.System.putFloat(mContext.getContentResolver(), + Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, pendingBrightnessAdjustment); + mAutomaticBrightnessStrategy.updatePendingAutoBrightnessAdjustments(); + mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, + allowAutoBrightnessWhileDozing, brightnessReason, policy, lastUserSetBrightness, + userSetBrightnessChanged); + verify(mAutomaticBrightnessController) + .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE, + mBrightnessConfiguration, + lastUserSetBrightness, + userSetBrightnessChanged, pendingBrightnessAdjustment, + /* userChangedAutoBrightnessAdjustment= */ true, policy, targetDisplayState, + /* shouldResetShortTermModel */ true); + assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessEnabled()); + assertTrue(mAutomaticBrightnessStrategy.isAutoBrightnessDisabledDueToDisplayOff()); + } + + @Test public void testAutoBrightnessState_modeSwitch() { // Setup the test when(mDisplayManagerFlags.areAutoBrightnessModesEnabled()).thenReturn(true); |