Max animation time for idle screen brightness mode
- Switch animation time cap when switching between idle and interactive
screen brightness mode.
- Fallback to interactive mode value if no value is specified
- Gate this behind flag
Additionally:
- add tests in DisplayDeviceConfigTest for fallback values for auto brightness light debounce
Bug: 252770716
Test: atest DisplayServiceTests
Test: adb shell setprop persist.sys.com.android.server.display.feature.flags.enable_adaptive_tone_improvements_1 1
Change-Id: Iee8d299f4ae9c2ed9e1b96e539480eebe4a986f7
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index c35424d..7913ad1 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -34,6 +34,7 @@
":sdk_sandbox_flags_lib{.generated_srcjars}",
":android.permission.flags-aconfig-java{.generated_srcjars}",
":hwui_flags_java_lib{.generated_srcjars}",
+ ":display_flags_lib{.generated_srcjars}",
]
filegroup {
@@ -305,3 +306,10 @@
aconfig_declarations: "hwui_flags",
defaults: ["framework-minus-apex-aconfig-java-defaults"],
}
+
+// Display
+java_aconfig_library {
+ name: "display_flags_lib",
+ aconfig_declarations: "display_flags",
+ defaults: ["framework-minus-apex-aconfig-java-defaults"],
+}
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
index 3a6e5f93..507ae26 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java
@@ -303,6 +303,8 @@
*
* <screenBrightnessRampIncreaseMaxMillis>2000</screenBrightnessRampIncreaseMaxMillis>
* <screenBrightnessRampDecreaseMaxMillis>3000</screenBrightnessRampDecreaseMaxMillis>
+ * <screenBrightnessRampIncreaseMaxIdleMillis>2000</screenBrightnessRampIncreaseMaxIdleMillis>
+ * <screenBrightnessRampDecreaseMaxIdleMillis>2000</screenBrightnessRampDecreaseMaxIdleMillis>
*
* <lightSensor>
* <type>android.sensor.light</type>
@@ -619,6 +621,8 @@
private float mBrightnessRampSlowIncreaseIdle = Float.NaN;
private long mBrightnessRampDecreaseMaxMillis = 0;
private long mBrightnessRampIncreaseMaxMillis = 0;
+ private long mBrightnessRampDecreaseMaxIdleMillis = 0;
+ private long mBrightnessRampIncreaseMaxIdleMillis = 0;
private int mAmbientHorizonLong = AMBIENT_LIGHT_LONG_HORIZON_MILLIS;
private int mAmbientHorizonShort = AMBIENT_LIGHT_SHORT_HORIZON_MILLIS;
private float mScreenBrighteningMinThreshold = 0.0f; // Retain behaviour as though there is
@@ -1078,6 +1082,14 @@
return mBrightnessRampIncreaseMaxMillis;
}
+ public long getBrightnessRampDecreaseMaxIdleMillis() {
+ return mBrightnessRampDecreaseMaxIdleMillis;
+ }
+
+ public long getBrightnessRampIncreaseMaxIdleMillis() {
+ return mBrightnessRampIncreaseMaxIdleMillis;
+ }
+
public int getAmbientHorizonLong() {
return mAmbientHorizonLong;
}
@@ -1697,6 +1709,8 @@
+ ", mBrightnessRampSlowIncreaseIdle=" + mBrightnessRampSlowIncreaseIdle
+ ", mBrightnessRampDecreaseMaxMillis=" + mBrightnessRampDecreaseMaxMillis
+ ", mBrightnessRampIncreaseMaxMillis=" + mBrightnessRampIncreaseMaxMillis
+ + ", mBrightnessRampDecreaseMaxIdleMillis=" + mBrightnessRampDecreaseMaxIdleMillis
+ + ", mBrightnessRampIncreaseMaxIdleMillis=" + mBrightnessRampIncreaseMaxIdleMillis
+ "\n"
+ "mAmbientHorizonLong=" + mAmbientHorizonLong
+ ", mAmbientHorizonShort=" + mAmbientHorizonShort
@@ -1892,6 +1906,8 @@
mBrightnessRampSlowIncreaseIdle = PowerManager.BRIGHTNESS_MAX;
mBrightnessRampDecreaseMaxMillis = 0;
mBrightnessRampIncreaseMaxMillis = 0;
+ mBrightnessRampDecreaseMaxIdleMillis = 0;
+ mBrightnessRampIncreaseMaxIdleMillis = 0;
setSimpleMappingStrategyValues();
loadAmbientLightSensorFromConfigXml();
setProxSensorUnspecified();
@@ -2767,6 +2783,19 @@
mBrightnessRampSlowDecreaseIdle = mBrightnessRampSlowDecrease;
mBrightnessRampSlowIncreaseIdle = mBrightnessRampSlowIncrease;
}
+
+ final BigInteger increaseMaxIdle = config.getScreenBrightnessRampIncreaseMaxIdleMillis();
+ if (increaseMaxIdle != null) {
+ mBrightnessRampIncreaseMaxIdleMillis = increaseMaxIdle.intValue();
+ } else {
+ mBrightnessRampIncreaseMaxIdleMillis = mBrightnessRampIncreaseMaxMillis;
+ }
+ final BigInteger decreaseMaxIdle = config.getScreenBrightnessRampDecreaseMaxIdleMillis();
+ if (decreaseMaxIdle != null) {
+ mBrightnessRampDecreaseMaxIdleMillis = decreaseMaxIdle.intValue();
+ } else {
+ mBrightnessRampDecreaseMaxIdleMillis = mBrightnessRampDecreaseMaxMillis;
+ }
}
private void loadBrightnessRampsFromConfigXml() {
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index f86b8ca..bc81491 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -317,10 +317,14 @@
private final Clock mClock;
private final Injector mInjector;
- // Maximum time a ramp animation can take.
+ // Maximum time a ramp animation can take.
private long mBrightnessRampIncreaseMaxTimeMillis;
private long mBrightnessRampDecreaseMaxTimeMillis;
+ // Maximum time a ramp animation can take in idle mode.
+ private long mBrightnessRampIncreaseMaxTimeIdleMillis;
+ private long mBrightnessRampDecreaseMaxTimeIdleMillis;
+
// The pending power request.
// Initially null until the first call to requestPowerState.
@GuardedBy("mLock")
@@ -585,6 +589,8 @@
private boolean mBootCompleted;
+ private final DisplayManagerFlags mFlags;
+
/**
* Creates the display power controller.
*/
@@ -750,6 +756,8 @@
mPendingAutoBrightnessAdjustment = PowerManager.BRIGHTNESS_INVALID_FLOAT;
mBootCompleted = bootCompleted;
+
+ mFlags = flags;
}
private void applyReduceBrightColorsSplineAdjustment() {
@@ -1057,11 +1065,7 @@
loadNitsRange(mContext.getResources());
setUpAutoBrightness(mContext.getResources(), mHandler);
reloadReduceBrightColours();
- if (mScreenBrightnessRampAnimator != null) {
- mScreenBrightnessRampAnimator.setAnimationTimeLimits(
- mBrightnessRampIncreaseMaxTimeMillis,
- mBrightnessRampDecreaseMaxTimeMillis);
- }
+ setAnimatorRampSpeeds(/* isIdleMode= */ false);
mBrightnessRangeController.loadFromConfig(hbmMetadata, token, info, mDisplayDeviceConfig);
mBrightnessThrottler.loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig(
mDisplayDeviceConfig.getThermalBrightnessThrottlingDataMapByThrottlingId(),
@@ -1102,9 +1106,8 @@
mScreenBrightnessRampAnimator = mInjector.getDualRampAnimator(mPowerState,
DisplayPowerState.SCREEN_BRIGHTNESS_FLOAT,
DisplayPowerState.SCREEN_SDR_BRIGHTNESS_FLOAT);
- mScreenBrightnessRampAnimator.setAnimationTimeLimits(
- mBrightnessRampIncreaseMaxTimeMillis,
- mBrightnessRampDecreaseMaxTimeMillis);
+ setAnimatorRampSpeeds(mAutomaticBrightnessController != null
+ && mAutomaticBrightnessController.isInIdleMode());
mScreenBrightnessRampAnimator.setListener(mRampAnimatorListener);
noteScreenState(mPowerState.getScreenState());
@@ -1323,6 +1326,10 @@
mDisplayDeviceConfig.getBrightnessRampDecreaseMaxMillis();
mBrightnessRampIncreaseMaxTimeMillis =
mDisplayDeviceConfig.getBrightnessRampIncreaseMaxMillis();
+ mBrightnessRampDecreaseMaxTimeIdleMillis =
+ mDisplayDeviceConfig.getBrightnessRampDecreaseMaxIdleMillis();
+ mBrightnessRampIncreaseMaxTimeIdleMillis =
+ mDisplayDeviceConfig.getBrightnessRampIncreaseMaxIdleMillis();
}
private void loadNitsRange(Resources resources) {
@@ -1349,6 +1356,7 @@
} else {
mAutomaticBrightnessController.switchToInteractiveScreenBrightnessMode();
}
+ setAnimatorRampSpeeds(isIdle);
}
Message msg = mHandler.obtainMessage();
@@ -1357,6 +1365,21 @@
mHandler.sendMessageAtTime(msg, mClock.uptimeMillis());
}
+ private void setAnimatorRampSpeeds(boolean isIdle) {
+ if (mScreenBrightnessRampAnimator == null) {
+ return;
+ }
+ if (mFlags.isAdaptiveTone1Enabled() && isIdle) {
+ mScreenBrightnessRampAnimator.setAnimationTimeLimits(
+ mBrightnessRampIncreaseMaxTimeIdleMillis,
+ mBrightnessRampDecreaseMaxTimeIdleMillis);
+ } else {
+ mScreenBrightnessRampAnimator.setAnimationTimeLimits(
+ mBrightnessRampIncreaseMaxTimeMillis,
+ mBrightnessRampDecreaseMaxTimeMillis);
+ }
+ }
+
private final Animator.AnimatorListener mAnimatorListener = new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
diff --git a/services/core/java/com/android/server/display/DisplayPowerController2.java b/services/core/java/com/android/server/display/DisplayPowerController2.java
index da29981..90a8490 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController2.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController2.java
@@ -285,10 +285,14 @@
private final Clock mClock;
private final Injector mInjector;
- // Maximum time a ramp animation can take.
+ // Maximum time a ramp animation can take.
private long mBrightnessRampIncreaseMaxTimeMillis;
private long mBrightnessRampDecreaseMaxTimeMillis;
+ // Maximum time a ramp animation can take in idle mode.
+ private long mBrightnessRampIncreaseMaxTimeIdleMillis;
+ private long mBrightnessRampDecreaseMaxTimeIdleMillis;
+
// The pending power request.
// Initially null until the first call to requestPowerState.
@GuardedBy("mLock")
@@ -465,6 +469,8 @@
private boolean mBootCompleted;
+ private final DisplayManagerFlags mFlags;
+
/**
* Creates the display power controller.
*/
@@ -615,6 +621,7 @@
R.bool.config_displayBrightnessBucketsInDoze);
mBootCompleted = bootCompleted;
+ mFlags = flags;
}
private void applyReduceBrightColorsSplineAdjustment() {
@@ -862,11 +869,7 @@
loadNitsRange(mContext.getResources());
setUpAutoBrightness(mContext.getResources(), mHandler);
reloadReduceBrightColours();
- if (mScreenBrightnessRampAnimator != null) {
- mScreenBrightnessRampAnimator.setAnimationTimeLimits(
- mBrightnessRampIncreaseMaxTimeMillis,
- mBrightnessRampDecreaseMaxTimeMillis);
- }
+ setAnimatorRampSpeeds(/* isIdleMode= */ false);
mBrightnessRangeController.loadFromConfig(hbmMetadata, token, info, mDisplayDeviceConfig);
mBrightnessThrottler.loadThermalBrightnessThrottlingDataFromDisplayDeviceConfig(
@@ -908,9 +911,8 @@
mScreenBrightnessRampAnimator = mInjector.getDualRampAnimator(mPowerState,
DisplayPowerState.SCREEN_BRIGHTNESS_FLOAT,
DisplayPowerState.SCREEN_SDR_BRIGHTNESS_FLOAT);
- mScreenBrightnessRampAnimator.setAnimationTimeLimits(
- mBrightnessRampIncreaseMaxTimeMillis,
- mBrightnessRampDecreaseMaxTimeMillis);
+ setAnimatorRampSpeeds(mAutomaticBrightnessController != null
+ && mAutomaticBrightnessController.isInIdleMode());
mScreenBrightnessRampAnimator.setListener(mRampAnimatorListener);
noteScreenState(mPowerState.getScreenState());
@@ -1136,6 +1138,10 @@
mDisplayDeviceConfig.getBrightnessRampDecreaseMaxMillis();
mBrightnessRampIncreaseMaxTimeMillis =
mDisplayDeviceConfig.getBrightnessRampIncreaseMaxMillis();
+ mBrightnessRampDecreaseMaxTimeIdleMillis =
+ mDisplayDeviceConfig.getBrightnessRampDecreaseMaxIdleMillis();
+ mBrightnessRampIncreaseMaxTimeIdleMillis =
+ mDisplayDeviceConfig.getBrightnessRampIncreaseMaxIdleMillis();
}
private void loadNitsRange(Resources resources) {
@@ -1162,6 +1168,7 @@
} else {
mAutomaticBrightnessController.switchToInteractiveScreenBrightnessMode();
}
+ setAnimatorRampSpeeds(isIdle);
}
Message msg = mHandler.obtainMessage();
msg.what = MSG_SET_DWBC_STRONG_MODE;
@@ -1169,6 +1176,21 @@
mHandler.sendMessageAtTime(msg, mClock.uptimeMillis());
}
+ private void setAnimatorRampSpeeds(boolean isIdle) {
+ if (mScreenBrightnessRampAnimator == null) {
+ return;
+ }
+ if (mFlags.isAdaptiveTone1Enabled() && isIdle) {
+ mScreenBrightnessRampAnimator.setAnimationTimeLimits(
+ mBrightnessRampIncreaseMaxTimeIdleMillis,
+ mBrightnessRampDecreaseMaxTimeIdleMillis);
+ } else {
+ mScreenBrightnessRampAnimator.setAnimationTimeLimits(
+ mBrightnessRampIncreaseMaxTimeMillis,
+ mBrightnessRampDecreaseMaxTimeMillis);
+ }
+ }
+
private final Animator.AnimatorListener mAnimatorListener = new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
diff --git a/services/core/java/com/android/server/display/feature/Android.bp b/services/core/java/com/android/server/display/feature/Android.bp
index 27c48ed..a0ead38 100644
--- a/services/core/java/com/android/server/display/feature/Android.bp
+++ b/services/core/java/com/android/server/display/feature/Android.bp
@@ -5,8 +5,3 @@
"*.aconfig",
],
}
-
-java_aconfig_library {
- name: "display_flags_lib",
- aconfig_declarations: "display_flags",
-}
diff --git a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
index d23c4fe..3f6bf1a 100644
--- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
+++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java
@@ -43,6 +43,10 @@
Flags.FLAG_ENABLE_HDR_CLAMPER,
Flags::enableHdrClamper);
+ private final FlagState mAdaptiveToneImprovements1 = new FlagState(
+ Flags.FLAG_ENABLE_ADAPTIVE_TONE_IMPROVEMENTS_1,
+ Flags::enableAdaptiveToneImprovements1);
+
/** Returns whether connected display management is enabled or not. */
public boolean isConnectedDisplayManagementEnabled() {
return mConnectedDisplayManagementFlagState.isEnabled();
@@ -57,6 +61,13 @@
return mHdrClamperFlagState.isEnabled();
}
+ /**
+ * Returns whether adaptive tone improvements are enabled
+ */
+ public boolean isAdaptiveTone1Enabled() {
+ return mAdaptiveToneImprovements1.isEnabled();
+ }
+
private static class FlagState {
private final String mName;
diff --git a/services/core/java/com/android/server/display/feature/display_flags.aconfig b/services/core/java/com/android/server/display/feature/display_flags.aconfig
index ce64bd3..4d86004 100644
--- a/services/core/java/com/android/server/display/feature/display_flags.aconfig
+++ b/services/core/java/com/android/server/display/feature/display_flags.aconfig
@@ -25,3 +25,12 @@
bug: "295100043"
is_fixed_read_only: true
}
+
+flag {
+ name: "enable_adaptive_tone_improvements_1"
+ namespace: "display_manager"
+ description: "Feature flag for Adaptive Tone Improvements"
+ bug: "299550755"
+ is_fixed_read_only: true
+}
+
diff --git a/services/core/xsd/display-device-config/display-device-config.xsd b/services/core/xsd/display-device-config/display-device-config.xsd
index 4203e89..d0a9c45 100644
--- a/services/core/xsd/display-device-config/display-device-config.xsd
+++ b/services/core/xsd/display-device-config/display-device-config.xsd
@@ -96,6 +96,16 @@
<xs:element type="xs:nonNegativeInteger" name="screenBrightnessRampDecreaseMaxMillis">
<xs:annotation name="final"/>
</xs:element>
+ <!-- Maximum time in milliseconds that a brightness increase animation
+ can take in idle mode. -->
+ <xs:element type="xs:nonNegativeInteger" name="screenBrightnessRampIncreaseMaxIdleMillis">
+ <xs:annotation name="final"/>
+ </xs:element>
+ <!-- Maximum time in milliseconds that a brightness decrease animation
+ can take in idle mode. -->
+ <xs:element type="xs:nonNegativeInteger" name="screenBrightnessRampDecreaseMaxIdleMillis">
+ <xs:annotation name="final"/>
+ </xs:element>
<xs:element type="sensorDetails" name="lightSensor">
<xs:annotation name="final"/>
</xs:element>
diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt
index ebd9b1c..949b1f2 100644
--- a/services/core/xsd/display-device-config/schema/current.txt
+++ b/services/core/xsd/display-device-config/schema/current.txt
@@ -111,9 +111,11 @@
method public com.android.server.display.config.RefreshRateConfigs getRefreshRate();
method @NonNull public final java.math.BigDecimal getScreenBrightnessDefault();
method @NonNull public final com.android.server.display.config.NitsMap getScreenBrightnessMap();
+ method public final java.math.BigInteger getScreenBrightnessRampDecreaseMaxIdleMillis();
method public final java.math.BigInteger getScreenBrightnessRampDecreaseMaxMillis();
method public final java.math.BigDecimal getScreenBrightnessRampFastDecrease();
method public final java.math.BigDecimal getScreenBrightnessRampFastIncrease();
+ method public final java.math.BigInteger getScreenBrightnessRampIncreaseMaxIdleMillis();
method public final java.math.BigInteger getScreenBrightnessRampIncreaseMaxMillis();
method public final java.math.BigDecimal getScreenBrightnessRampSlowDecrease();
method public final java.math.BigDecimal getScreenBrightnessRampSlowDecreaseIdle();
@@ -141,9 +143,11 @@
method public void setRefreshRate(com.android.server.display.config.RefreshRateConfigs);
method public final void setScreenBrightnessDefault(@NonNull java.math.BigDecimal);
method public final void setScreenBrightnessMap(@NonNull com.android.server.display.config.NitsMap);
+ method public final void setScreenBrightnessRampDecreaseMaxIdleMillis(java.math.BigInteger);
method public final void setScreenBrightnessRampDecreaseMaxMillis(java.math.BigInteger);
method public final void setScreenBrightnessRampFastDecrease(java.math.BigDecimal);
method public final void setScreenBrightnessRampFastIncrease(java.math.BigDecimal);
+ method public final void setScreenBrightnessRampIncreaseMaxIdleMillis(java.math.BigInteger);
method public final void setScreenBrightnessRampIncreaseMaxMillis(java.math.BigInteger);
method public final void setScreenBrightnessRampSlowDecrease(java.math.BigDecimal);
method public final void setScreenBrightnessRampSlowDecreaseIdle(java.math.BigDecimal);
diff --git a/services/tests/displayservicetests/Android.bp b/services/tests/displayservicetests/Android.bp
index e28028f9..0275c7d 100644
--- a/services/tests/displayservicetests/Android.bp
+++ b/services/tests/displayservicetests/Android.bp
@@ -29,6 +29,7 @@
static_libs: [
"androidx.test.ext.junit",
"androidx.test.rules",
+ "flag-junit",
"frameworks-base-testutils",
"junit",
"junit-params",
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java
index 7374901..6ef150c 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java
@@ -103,12 +103,6 @@
assertEquals(mDisplayDeviceConfig.getName(), "Example Display");
assertEquals(mDisplayDeviceConfig.getAmbientHorizonLong(), 5000);
assertEquals(mDisplayDeviceConfig.getAmbientHorizonShort(), 50);
- assertEquals(mDisplayDeviceConfig.getBrightnessRampDecreaseMaxMillis(), 3000);
- assertEquals(mDisplayDeviceConfig.getBrightnessRampIncreaseMaxMillis(), 2000);
- assertEquals(mDisplayDeviceConfig.getBrightnessRampFastDecrease(), 0.01f, ZERO_DELTA);
- assertEquals(mDisplayDeviceConfig.getBrightnessRampFastIncrease(), 0.02f, ZERO_DELTA);
- assertEquals(mDisplayDeviceConfig.getBrightnessRampSlowIncrease(), 0.04f, ZERO_DELTA);
- assertEquals(mDisplayDeviceConfig.getBrightnessRampSlowDecrease(), 0.03f, ZERO_DELTA);
assertEquals(mDisplayDeviceConfig.getBrightnessDefault(), 0.5f, ZERO_DELTA);
assertArrayEquals(mDisplayDeviceConfig.getBrightness(), BRIGHTNESS, ZERO_DELTA);
assertArrayEquals(mDisplayDeviceConfig.getNits(), NITS, ZERO_DELTA);
@@ -235,7 +229,8 @@
@Test
public void testInvalidLuxThrottling() throws Exception {
setupDisplayDeviceConfigFromDisplayConfigFile(
- getContent(getInvalidLuxThrottling(), getValidProxSensor()));
+ getContent(getInvalidLuxThrottling(), getValidProxSensor(),
+ /* includeIdleMode= */ true));
Map<DisplayDeviceConfig.BrightnessLimitMapType, Map<Float, Float>> luxThrottlingData =
mDisplayDeviceConfig.getLuxThrottlingData();
@@ -258,6 +253,10 @@
// We should fall back to the config resource
verifyConfigValuesFromConfigResource();
+ assertEquals(3000, mDisplayDeviceConfig.getAutoBrightnessBrighteningLightDebounce());
+ assertEquals(4000, mDisplayDeviceConfig.getAutoBrightnessDarkeningLightDebounce());
+ assertEquals(3000, mDisplayDeviceConfig.getAutoBrightnessBrighteningLightDebounceIdle());
+ assertEquals(4000, mDisplayDeviceConfig.getAutoBrightnessDarkeningLightDebounceIdle());
}
@Test
@@ -438,7 +437,8 @@
@Test
public void testProximitySensorWithEmptyValuesFromDisplayConfig() throws IOException {
setupDisplayDeviceConfigFromDisplayConfigFile(
- getContent(getValidLuxThrottling(), getProxSensorWithEmptyValues()));
+ getContent(getValidLuxThrottling(), getProxSensorWithEmptyValues(),
+ /* includeIdleMode= */ true));
assertNull(mDisplayDeviceConfig.getProximitySensor());
}
@@ -577,6 +577,39 @@
assertEquals(mDisplayDeviceConfig.getAutoBrightnessDarkeningLightDebounceIdle(), 1500);
}
+ @Test
+ public void testBrightnessRamps() throws IOException {
+ setupDisplayDeviceConfigFromDisplayConfigFile();
+
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampDecreaseMaxMillis(), 3000);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampIncreaseMaxMillis(), 2000);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampDecreaseMaxIdleMillis(), 5000);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampIncreaseMaxIdleMillis(), 4000);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampFastDecrease(), 0.01f, ZERO_DELTA);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampFastIncrease(), 0.02f, ZERO_DELTA);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampSlowDecrease(), 0.03f, ZERO_DELTA);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampSlowIncrease(), 0.04f, ZERO_DELTA);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampSlowDecreaseIdle(), 0.05f, ZERO_DELTA);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampSlowIncreaseIdle(), 0.06f, ZERO_DELTA);
+ }
+
+ @Test
+ public void testBrightnessRamps_IdleFallsBackToConfigInteractive() throws IOException {
+ setupDisplayDeviceConfigFromDisplayConfigFile(getContent(getValidLuxThrottling(),
+ getValidProxSensor(), /* includeIdleMode= */ false));
+
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampDecreaseMaxMillis(), 3000);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampIncreaseMaxMillis(), 2000);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampDecreaseMaxIdleMillis(), 3000);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampIncreaseMaxIdleMillis(), 2000);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampFastDecrease(), 0.01f, ZERO_DELTA);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampFastIncrease(), 0.02f, ZERO_DELTA);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampSlowDecrease(), 0.03f, ZERO_DELTA);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampSlowIncrease(), 0.04f, ZERO_DELTA);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampSlowDecreaseIdle(), 0.03f, ZERO_DELTA);
+ assertEquals(mDisplayDeviceConfig.getBrightnessRampSlowIncreaseIdle(), 0.04f, ZERO_DELTA);
+ }
+
private String getValidLuxThrottling() {
return "<luxThrottling>\n"
+ " <brightnessLimitMap>\n"
@@ -731,11 +764,103 @@
+ "</hdrBrightnessConfig>";
}
- private String getContent() {
- return getContent(getValidLuxThrottling(), getValidProxSensor());
+ private String getRampSpeedsIdle() {
+ return "<brighteningLightDebounceIdleMillis>"
+ + "2500"
+ + "</brighteningLightDebounceIdleMillis>\n"
+ + "<darkeningLightDebounceIdleMillis>"
+ + "1500"
+ + "</darkeningLightDebounceIdleMillis>\n";
}
- private String getContent(String brightnessCapConfig, String proxSensor) {
+ private String getThresholdsIdle() {
+ return "<ambientBrightnessChangeThresholdsIdle>\n"
+ + "<brighteningThresholds>\n"
+ + "<minimum>20</minimum>\n"
+ + "<brightnessThresholdPoints>\n"
+ + "<brightnessThresholdPoint>\n"
+ + "<threshold>0</threshold><percentage>21</percentage>\n"
+ + "</brightnessThresholdPoint>\n"
+ + "<brightnessThresholdPoint>\n"
+ + "<threshold>500</threshold><percentage>22</percentage>\n"
+ + "</brightnessThresholdPoint>\n"
+ + "<brightnessThresholdPoint>\n"
+ + "<threshold>600</threshold><percentage>23</percentage>\n"
+ + "</brightnessThresholdPoint>\n"
+ + "</brightnessThresholdPoints>\n"
+ + "</brighteningThresholds>\n"
+ + "<darkeningThresholds>\n"
+ + "<minimum>40</minimum>\n"
+ + "<brightnessThresholdPoints>\n"
+ + "<brightnessThresholdPoint>\n"
+ + "<threshold>0</threshold><percentage>23</percentage>\n"
+ + "</brightnessThresholdPoint>\n"
+ + "<brightnessThresholdPoint>\n"
+ + "<threshold>700</threshold><percentage>24</percentage>\n"
+ + "</brightnessThresholdPoint>\n"
+ + "<brightnessThresholdPoint>\n"
+ + "<threshold>800</threshold><percentage>25</percentage>\n"
+ + "</brightnessThresholdPoint>\n"
+ + "</brightnessThresholdPoints>\n"
+ + "</darkeningThresholds>\n"
+ + "</ambientBrightnessChangeThresholdsIdle>\n"
+ + "<displayBrightnessChangeThresholdsIdle>\n"
+ + "<brighteningThresholds>\n"
+ + "<minimum>0.2</minimum>\n"
+ + "<brightnessThresholdPoints>\n"
+ + "<brightnessThresholdPoint>\n"
+ + "<threshold>0</threshold><percentage>17</percentage>\n"
+ + "</brightnessThresholdPoint>\n"
+ + "<brightnessThresholdPoint>\n"
+ + "<threshold>0.12</threshold><percentage>18</percentage>\n"
+ + "</brightnessThresholdPoint>\n"
+ + "<brightnessThresholdPoint>\n"
+ + "<threshold>0.22</threshold><percentage>19</percentage>\n"
+ + "</brightnessThresholdPoint>\n"
+ + "</brightnessThresholdPoints>\n"
+ + "</brighteningThresholds>\n"
+ + "<darkeningThresholds>\n"
+ + "<minimum>0.4</minimum>\n"
+ + "<brightnessThresholdPoints>\n"
+ + "<brightnessThresholdPoint>\n"
+ + "<threshold>0</threshold><percentage>19</percentage>\n"
+ + "</brightnessThresholdPoint>\n"
+ + "<brightnessThresholdPoint>\n"
+ + "<threshold>0.13</threshold><percentage>20</percentage>\n"
+ + "</brightnessThresholdPoint>\n"
+ + "<brightnessThresholdPoint>\n"
+ + "<threshold>0.23</threshold><percentage>21</percentage>\n"
+ + "</brightnessThresholdPoint>\n"
+ + "</brightnessThresholdPoints>\n"
+ + "</darkeningThresholds>\n"
+ + "</displayBrightnessChangeThresholdsIdle>\n";
+ }
+
+ private String getScreenBrightnessRampSlowIdle() {
+ return "<screenBrightnessRampSlowDecreaseIdle>"
+ + "0.05"
+ + "</screenBrightnessRampSlowDecreaseIdle>\n"
+ + "<screenBrightnessRampSlowIncreaseIdle>"
+ + "0.06"
+ + "</screenBrightnessRampSlowIncreaseIdle>\n";
+ }
+
+ private String getScreenBrightnessRampCapsIdle() {
+ return "<screenBrightnessRampIncreaseMaxIdleMillis>"
+ + "4000"
+ + "</screenBrightnessRampIncreaseMaxIdleMillis>\n"
+ + "<screenBrightnessRampDecreaseMaxIdleMillis>"
+ + "5000"
+ + "</screenBrightnessRampDecreaseMaxIdleMillis>\n";
+
+ }
+ private String getContent() {
+ return getContent(getValidLuxThrottling(), getValidProxSensor(),
+ /* includeIdleMode= */ true);
+ }
+
+ private String getContent(String brightnessCapConfig, String proxSensor,
+ boolean includeIdleMode) {
return "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+ "<displayConfiguration>\n"
+ "<name>Example Display</name>\n"
@@ -778,12 +903,7 @@
+ "<autoBrightness>\n"
+ "<brighteningLightDebounceMillis>2000</brighteningLightDebounceMillis>\n"
+ "<darkeningLightDebounceMillis>1000</darkeningLightDebounceMillis>\n"
- + "<brighteningLightDebounceIdleMillis>"
- + "2500"
- + "</brighteningLightDebounceIdleMillis>\n"
- + "<darkeningLightDebounceIdleMillis>"
- + "1500"
- + "</darkeningLightDebounceIdleMillis>\n"
+ + (includeIdleMode ? getRampSpeedsIdle() : "")
+ "<displayBrightnessMapping>\n"
+ "<displayBrightnessPoint>\n"
+ "<lux>50</lux>\n"
@@ -899,76 +1019,19 @@
+ "</brightnessThresholdPoints>\n"
+ "</darkeningThresholds>\n"
+ "</displayBrightnessChangeThresholds>\n"
- + "<ambientBrightnessChangeThresholdsIdle>\n"
- + "<brighteningThresholds>\n"
- + "<minimum>20</minimum>\n"
- + "<brightnessThresholdPoints>\n"
- + "<brightnessThresholdPoint>\n"
- + "<threshold>0</threshold><percentage>21</percentage>\n"
- + "</brightnessThresholdPoint>\n"
- + "<brightnessThresholdPoint>\n"
- + "<threshold>500</threshold><percentage>22</percentage>\n"
- + "</brightnessThresholdPoint>\n"
- + "<brightnessThresholdPoint>\n"
- + "<threshold>600</threshold><percentage>23</percentage>\n"
- + "</brightnessThresholdPoint>\n"
- + "</brightnessThresholdPoints>\n"
- + "</brighteningThresholds>\n"
- + "<darkeningThresholds>\n"
- + "<minimum>40</minimum>\n"
- + "<brightnessThresholdPoints>\n"
- + "<brightnessThresholdPoint>\n"
- + "<threshold>0</threshold><percentage>23</percentage>\n"
- + "</brightnessThresholdPoint>\n"
- + "<brightnessThresholdPoint>\n"
- + "<threshold>700</threshold><percentage>24</percentage>\n"
- + "</brightnessThresholdPoint>\n"
- + "<brightnessThresholdPoint>\n"
- + "<threshold>800</threshold><percentage>25</percentage>\n"
- + "</brightnessThresholdPoint>\n"
- + "</brightnessThresholdPoints>\n"
- + "</darkeningThresholds>\n"
- + "</ambientBrightnessChangeThresholdsIdle>\n"
- + "<displayBrightnessChangeThresholdsIdle>\n"
- + "<brighteningThresholds>\n"
- + "<minimum>0.2</minimum>\n"
- + "<brightnessThresholdPoints>\n"
- + "<brightnessThresholdPoint>\n"
- + "<threshold>0</threshold><percentage>17</percentage>\n"
- + "</brightnessThresholdPoint>\n"
- + "<brightnessThresholdPoint>\n"
- + "<threshold>0.12</threshold><percentage>18</percentage>\n"
- + "</brightnessThresholdPoint>\n"
- + "<brightnessThresholdPoint>\n"
- + "<threshold>0.22</threshold><percentage>19</percentage>\n"
- + "</brightnessThresholdPoint>\n"
- + "</brightnessThresholdPoints>\n"
- + "</brighteningThresholds>\n"
- + "<darkeningThresholds>\n"
- + "<minimum>0.4</minimum>\n"
- + "<brightnessThresholdPoints>\n"
- + "<brightnessThresholdPoint>\n"
- + "<threshold>0</threshold><percentage>19</percentage>\n"
- + "</brightnessThresholdPoint>\n"
- + "<brightnessThresholdPoint>\n"
- + "<threshold>0.13</threshold><percentage>20</percentage>\n"
- + "</brightnessThresholdPoint>\n"
- + "<brightnessThresholdPoint>\n"
- + "<threshold>0.23</threshold><percentage>21</percentage>\n"
- + "</brightnessThresholdPoint>\n"
- + "</brightnessThresholdPoints>\n"
- + "</darkeningThresholds>\n"
- + "</displayBrightnessChangeThresholdsIdle>\n"
- + "<screenBrightnessRampFastDecrease>0.01</screenBrightnessRampFastDecrease> "
- + "<screenBrightnessRampFastIncrease>0.02</screenBrightnessRampFastIncrease> "
- + "<screenBrightnessRampSlowDecrease>0.03</screenBrightnessRampSlowDecrease>"
- + "<screenBrightnessRampSlowIncrease>0.04</screenBrightnessRampSlowIncrease>"
+ + (includeIdleMode ? getThresholdsIdle() : "")
+ + "<screenBrightnessRampFastDecrease>0.01</screenBrightnessRampFastDecrease>\n"
+ + "<screenBrightnessRampFastIncrease>0.02</screenBrightnessRampFastIncrease>\n"
+ + "<screenBrightnessRampSlowDecrease>0.03</screenBrightnessRampSlowDecrease>\n"
+ + "<screenBrightnessRampSlowIncrease>0.04</screenBrightnessRampSlowIncrease>\n"
+ + (includeIdleMode ? getScreenBrightnessRampSlowIdle() : "")
+ "<screenBrightnessRampIncreaseMaxMillis>"
+ "2000"
- + "</screenBrightnessRampIncreaseMaxMillis>"
+ + "</screenBrightnessRampIncreaseMaxMillis>\n"
+ "<screenBrightnessRampDecreaseMaxMillis>"
+ "3000"
- + "</screenBrightnessRampDecreaseMaxMillis>"
+ + "</screenBrightnessRampDecreaseMaxMillis>\n"
+ + (includeIdleMode ? getScreenBrightnessRampCapsIdle() : "")
+ "<ambientLightHorizonLong>5000</ambientLightHorizonLong>\n"
+ "<ambientLightHorizonShort>50</ambientLightHorizonShort>\n"
+ "<screenBrightnessRampIncreaseMaxMillis>"
@@ -1201,6 +1264,13 @@
when(mResources.getString(com.android.internal.R.string.config_displayLightSensorType))
.thenReturn("test_light_sensor");
+ when(mResources.getInteger(
+ R.integer.config_autoBrightnessBrighteningLightDebounce))
+ .thenReturn(3000);
+ when(mResources.getInteger(
+ R.integer.config_autoBrightnessDarkeningLightDebounce))
+ .thenReturn(4000);
+
mDisplayDeviceConfig = DisplayDeviceConfig.create(mContext, true);
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java
index 85406b5..9174899 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java
@@ -53,6 +53,10 @@
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.test.TestLooper;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.provider.Settings;
import android.testing.TestableContext;
import android.util.FloatProperty;
@@ -71,6 +75,7 @@
import com.android.server.display.brightness.clamper.HdrClamper;
import com.android.server.display.color.ColorDisplayService;
import com.android.server.display.feature.DisplayManagerFlags;
+import com.android.server.display.feature.flags.Flags;
import com.android.server.display.layout.Layout;
import com.android.server.display.whitebalance.DisplayWhiteBalanceController;
import com.android.server.policy.WindowManagerPolicy;
@@ -108,12 +113,16 @@
private static final float BRIGHTNESS_RAMP_RATE_SLOW_INCREASE_IDLE = 0.5f;
private static final float BRIGHTNESS_RAMP_RATE_SLOW_DECREASE_IDLE = 0.6f;
+ private static final long BRIGHTNESS_RAMP_INCREASE_MAX = 1000;
+ private static final long BRIGHTNESS_RAMP_DECREASE_MAX = 2000;
+ private static final long BRIGHTNESS_RAMP_INCREASE_MAX_IDLE = 3000;
+ private static final long BRIGHTNESS_RAMP_DECREASE_MAX_IDLE = 4000;
+
private OffsettableClock mClock;
private TestLooper mTestLooper;
private Handler mHandler;
private DisplayPowerControllerHolder mHolder;
private Sensor mProxSensor;
-
@Mock
private DisplayPowerCallbacks mDisplayPowerCallbacksMock;
@Mock
@@ -130,6 +139,8 @@
private ColorDisplayService.ColorDisplayServiceInternal mCdsiMock;
@Mock
private DisplayWhiteBalanceController mDisplayWhiteBalanceControllerMock;
+ @Mock
+ private DisplayManagerFlags mDisplayManagerFlagsMock;
@Captor
private ArgumentCaptor<SensorEventListener> mSensorEventListenerCaptor;
@@ -145,6 +156,9 @@
.spyStatic(BatteryStatsService.class)
.build();
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
@Before
public void setUp() throws Exception {
mClock = new OffsettableClock.Stopped();
@@ -1303,6 +1317,113 @@
eq(transitionRate), eq(true));
}
+ @Test
+ @RequiresFlagsDisabled(Flags.FLAG_ENABLE_ADAPTIVE_TONE_IMPROVEMENTS_1)
+ public void testRampMaxTimeInteractiveThenIdle() {
+ // Send a display power request
+ DisplayPowerRequest dpr = new DisplayPowerRequest();
+ dpr.policy = DisplayPowerRequest.POLICY_BRIGHT;
+ dpr.useProximitySensor = true;
+ mHolder.dpc.requestPowerState(dpr, false /* waitForNegativeProximity */);
+
+ // Run updatePowerState
+ advanceTime(1);
+
+ setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class),
+ mHolder.config, /* isEnabled= */ true);
+ verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX,
+ BRIGHTNESS_RAMP_DECREASE_MAX);
+
+ // switch to idle mode
+ mHolder.dpc.setAutomaticScreenBrightnessMode(/* idle= */ true);
+ advanceTime(1);
+
+ // A second time, when switching to idle mode.
+ verify(mHolder.animator, times(2)).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX,
+ BRIGHTNESS_RAMP_DECREASE_MAX);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_ADAPTIVE_TONE_IMPROVEMENTS_1)
+ public void testRampMaxTimeInteractiveThenIdle_DifferentValues() {
+ DisplayManagerFlags flags = mock(DisplayManagerFlags.class);
+ when(flags.isAdaptiveTone1Enabled()).thenReturn(true);
+ mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID, /* isEnabled= */ true, flags);
+
+ // Send a display power request
+ DisplayPowerRequest dpr = new DisplayPowerRequest();
+ dpr.policy = DisplayPowerRequest.POLICY_BRIGHT;
+ dpr.useProximitySensor = true;
+ mHolder.dpc.requestPowerState(dpr, false /* waitForNegativeProximity */);
+
+ // Run updatePowerState
+ advanceTime(1);
+
+ setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class),
+ mHolder.config, /* isEnabled= */ true);
+ verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX,
+ BRIGHTNESS_RAMP_DECREASE_MAX);
+
+ // switch to idle mode
+ mHolder.dpc.setAutomaticScreenBrightnessMode(/* idle= */ true);
+ advanceTime(1);
+
+ // A second time, when switching to idle mode.
+ verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX_IDLE,
+ BRIGHTNESS_RAMP_DECREASE_MAX_IDLE);
+ }
+
+ @Test
+ @RequiresFlagsDisabled(Flags.FLAG_ENABLE_ADAPTIVE_TONE_IMPROVEMENTS_1)
+ public void testRampMaxTimeIdle() {
+ // Send a display power request
+ DisplayPowerRequest dpr = new DisplayPowerRequest();
+ dpr.policy = DisplayPowerRequest.POLICY_BRIGHT;
+ dpr.useProximitySensor = true;
+ mHolder.dpc.requestPowerState(dpr, false /* waitForNegativeProximity */);
+ // Run updatePowerState
+ advanceTime(1);
+ // Once on setup
+ verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX,
+ BRIGHTNESS_RAMP_DECREASE_MAX);
+
+ setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class),
+ mHolder.config, /* isEnabled= */ true);
+
+ // switch to idle mode
+ mHolder.dpc.setAutomaticScreenBrightnessMode(true);
+
+ // A second time when switching to idle mode.
+ verify(mHolder.animator, times(2)).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX,
+ BRIGHTNESS_RAMP_DECREASE_MAX);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_ADAPTIVE_TONE_IMPROVEMENTS_1)
+ public void testRampMaxTimeIdle_DifferentValues() {
+ DisplayManagerFlags flags = mock(DisplayManagerFlags.class);
+ when(flags.isAdaptiveTone1Enabled()).thenReturn(true);
+ mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID, /* isEnabled= */ true, flags);
+
+ // Send a display power request
+ DisplayPowerRequest dpr = new DisplayPowerRequest();
+ dpr.policy = DisplayPowerRequest.POLICY_BRIGHT;
+ dpr.useProximitySensor = true;
+ mHolder.dpc.requestPowerState(dpr, false /* waitForNegativeProximity */);
+
+ // Run updatePowerState
+ advanceTime(1);
+
+ setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class),
+ mHolder.config, /* isEnabled= */ true);
+
+ // switch to idle mode
+ mHolder.dpc.setAutomaticScreenBrightnessMode(true);
+
+ verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX_IDLE,
+ BRIGHTNESS_RAMP_DECREASE_MAX_IDLE);
+ }
+
/**
* Creates a mock and registers it to {@link LocalServices}.
*/
@@ -1366,6 +1487,7 @@
});
when(displayDeviceConfigMock.getScreenOffBrightnessSensorValueToLux())
.thenReturn(new int[0]);
+
when(displayDeviceConfigMock.getBrightnessRampFastDecrease())
.thenReturn(BRIGHTNESS_RAMP_RATE_FAST_DECREASE);
when(displayDeviceConfigMock.getBrightnessRampFastIncrease())
@@ -1378,6 +1500,15 @@
.thenReturn(BRIGHTNESS_RAMP_RATE_SLOW_INCREASE_IDLE);
when(displayDeviceConfigMock.getBrightnessRampSlowDecreaseIdle())
.thenReturn(BRIGHTNESS_RAMP_RATE_SLOW_DECREASE_IDLE);
+
+ when(displayDeviceConfigMock.getBrightnessRampIncreaseMaxMillis())
+ .thenReturn(BRIGHTNESS_RAMP_INCREASE_MAX);
+ when(displayDeviceConfigMock.getBrightnessRampDecreaseMaxMillis())
+ .thenReturn(BRIGHTNESS_RAMP_DECREASE_MAX);
+ when(displayDeviceConfigMock.getBrightnessRampIncreaseMaxIdleMillis())
+ .thenReturn(BRIGHTNESS_RAMP_INCREASE_MAX_IDLE);
+ when(displayDeviceConfigMock.getBrightnessRampDecreaseMaxIdleMillis())
+ .thenReturn(BRIGHTNESS_RAMP_DECREASE_MAX_IDLE);
}
private DisplayPowerControllerHolder createDisplayPowerController(int displayId,
@@ -1424,13 +1555,14 @@
final DisplayPowerController2 dpc = new DisplayPowerController2(
mContext, injector, mDisplayPowerCallbacksMock, mHandler,
mSensorManagerMock, mDisplayBlankerMock, display,
- mBrightnessTrackerMock, brightnessSetting, () -> {},
+ mBrightnessTrackerMock, brightnessSetting, () -> {
+ },
hbmMetadata, /* bootCompleted= */ false, flags);
return new DisplayPowerControllerHolder(dpc, display, displayPowerState, brightnessSetting,
animator, automaticBrightnessController, wakelockController,
screenOffBrightnessSensorController, hbmController, hdrClamper, hbmMetadata,
- brightnessMappingStrategy, injector);
+ brightnessMappingStrategy, injector, config);
}
/**
@@ -1452,6 +1584,7 @@
public final HighBrightnessModeMetadata hbmMetadata;
public final BrightnessMappingStrategy brightnessMappingStrategy;
public final DisplayPowerController2.Injector injector;
+ public final DisplayDeviceConfig config;
DisplayPowerControllerHolder(DisplayPowerController2 dpc, LogicalDisplay display,
DisplayPowerState displayPowerState, BrightnessSetting brightnessSetting,
@@ -1463,7 +1596,8 @@
HdrClamper hdrClamper,
HighBrightnessModeMetadata hbmMetadata,
BrightnessMappingStrategy brightnessMappingStrategy,
- DisplayPowerController2.Injector injector) {
+ DisplayPowerController2.Injector injector,
+ DisplayDeviceConfig config) {
this.dpc = dpc;
this.display = display;
this.displayPowerState = displayPowerState;
@@ -1477,6 +1611,7 @@
this.hbmMetadata = hbmMetadata;
this.brightnessMappingStrategy = brightnessMappingStrategy;
this.injector = injector;
+ this.config = config;
}
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
index c53e763..412b65f 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
@@ -53,6 +53,10 @@
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.test.TestLooper;
+import android.platform.test.annotations.RequiresFlagsDisabled;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.provider.Settings;
import android.testing.TestableContext;
import android.util.FloatProperty;
@@ -71,6 +75,7 @@
import com.android.server.display.brightness.BrightnessEvent;
import com.android.server.display.color.ColorDisplayService;
import com.android.server.display.feature.DisplayManagerFlags;
+import com.android.server.display.feature.flags.Flags;
import com.android.server.display.layout.Layout;
import com.android.server.display.whitebalance.DisplayWhiteBalanceController;
import com.android.server.policy.WindowManagerPolicy;
@@ -107,6 +112,11 @@
private static final float BRIGHTNESS_RAMP_RATE_SLOW_INCREASE_IDLE = 0.5f;
private static final float BRIGHTNESS_RAMP_RATE_SLOW_DECREASE_IDLE = 0.6f;
+ private static final long BRIGHTNESS_RAMP_INCREASE_MAX = 1000;
+ private static final long BRIGHTNESS_RAMP_DECREASE_MAX = 2000;
+ private static final long BRIGHTNESS_RAMP_INCREASE_MAX_IDLE = 3000;
+ private static final long BRIGHTNESS_RAMP_DECREASE_MAX_IDLE = 4000;
+
private OffsettableClock mClock;
private TestLooper mTestLooper;
private Handler mHandler;
@@ -129,6 +139,9 @@
private ColorDisplayService.ColorDisplayServiceInternal mCdsiMock;
@Mock
private DisplayWhiteBalanceController mDisplayWhiteBalanceControllerMock;
+ @Mock
+ private DisplayManagerFlags mDisplayManagerFlagsMock;
+
@Captor
private ArgumentCaptor<SensorEventListener> mSensorEventListenerCaptor;
@@ -147,6 +160,9 @@
@Rule
public LocalServiceKeeperRule mLocalServiceKeeperRule = new LocalServiceKeeperRule();
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
@Before
public void setUp() throws Exception {
mClock = new OffsettableClock.Stopped();
@@ -1260,6 +1276,110 @@
eq(BRIGHTNESS_RAMP_RATE_MINIMUM), eq(false));
}
+ @Test
+ @RequiresFlagsDisabled(Flags.FLAG_ENABLE_ADAPTIVE_TONE_IMPROVEMENTS_1)
+ public void testRampMaxTimeInteractiveThenIdle() {
+ // Send a display power request
+ DisplayPowerRequest dpr = new DisplayPowerRequest();
+ dpr.policy = DisplayPowerRequest.POLICY_BRIGHT;
+ dpr.useProximitySensor = true;
+ mHolder.dpc.requestPowerState(dpr, false /* waitForNegativeProximity */);
+
+ // Run updatePowerState
+ advanceTime(1);
+
+ setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class),
+ mHolder.config, /* isEnabled= */ true);
+
+ verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX,
+ BRIGHTNESS_RAMP_DECREASE_MAX);
+
+ // switch to idle
+ mHolder.dpc.setAutomaticScreenBrightnessMode(/* idle= */ true);
+ advanceTime(1);
+
+ verify(mHolder.animator, times(2)).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX,
+ BRIGHTNESS_RAMP_DECREASE_MAX);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_ADAPTIVE_TONE_IMPROVEMENTS_1)
+ public void testRampMaxTimeInteractiveThenIdle_DifferentValues() {
+ when(mDisplayManagerFlagsMock.isAdaptiveTone1Enabled()).thenReturn(true);
+ // Send a display power request
+ DisplayPowerRequest dpr = new DisplayPowerRequest();
+ dpr.policy = DisplayPowerRequest.POLICY_BRIGHT;
+ dpr.useProximitySensor = true;
+ mHolder.dpc.requestPowerState(dpr, false /* waitForNegativeProximity */);
+
+ // Run updatePowerState
+ advanceTime(1);
+
+ setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class),
+ mHolder.config, /* isEnabled= */ true);
+
+ verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX,
+ BRIGHTNESS_RAMP_DECREASE_MAX);
+
+ // switch to idle
+ mHolder.dpc.setAutomaticScreenBrightnessMode(/* idle= */ true);
+ advanceTime(1);
+
+ verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX_IDLE,
+ BRIGHTNESS_RAMP_DECREASE_MAX_IDLE);
+ }
+
+ @Test
+ @RequiresFlagsDisabled(Flags.FLAG_ENABLE_ADAPTIVE_TONE_IMPROVEMENTS_1)
+ public void testRampMaxTimeIdle() {
+ // Send a display power request
+ DisplayPowerRequest dpr = new DisplayPowerRequest();
+ dpr.policy = DisplayPowerRequest.POLICY_BRIGHT;
+ dpr.useProximitySensor = true;
+ mHolder.dpc.requestPowerState(dpr, false /* waitForNegativeProximity */);
+
+ // Run updatePowerState
+ advanceTime(1);
+
+ // once on setup
+ verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX,
+ BRIGHTNESS_RAMP_DECREASE_MAX);
+
+ setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class),
+ mHolder.config, /* isEnabled= */ true);
+
+ // switch to idle mode
+ mHolder.dpc.setAutomaticScreenBrightnessMode(true);
+
+ // second time when switching to idle screen brightness mode
+ verify(mHolder.animator, times(2)).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX,
+ BRIGHTNESS_RAMP_DECREASE_MAX);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_ADAPTIVE_TONE_IMPROVEMENTS_1)
+ public void testRampMaxTimeIdle_DifferentValues() {
+ when(mDisplayManagerFlagsMock.isAdaptiveTone1Enabled()).thenReturn(true);
+
+ // Send a display power request
+ DisplayPowerRequest dpr = new DisplayPowerRequest();
+ dpr.policy = DisplayPowerRequest.POLICY_BRIGHT;
+ dpr.useProximitySensor = true;
+ mHolder.dpc.requestPowerState(dpr, false /* waitForNegativeProximity */);
+
+ // Run updatePowerState
+ advanceTime(1);
+
+ setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class),
+ mHolder.config, /* isEnabled= */ true);
+
+ // switch to idle mode
+ mHolder.dpc.setAutomaticScreenBrightnessMode(true);
+
+ verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX_IDLE,
+ BRIGHTNESS_RAMP_DECREASE_MAX_IDLE);
+ }
+
private void advanceTime(long timeMs) {
mClock.fastForward(timeMs);
mTestLooper.dispatchAll();
@@ -1315,6 +1435,7 @@
});
when(displayDeviceConfigMock.getScreenOffBrightnessSensorValueToLux())
.thenReturn(new int[0]);
+
when(displayDeviceConfigMock.getBrightnessRampFastDecrease())
.thenReturn(BRIGHTNESS_RAMP_RATE_FAST_DECREASE);
when(displayDeviceConfigMock.getBrightnessRampFastIncrease())
@@ -1327,6 +1448,15 @@
.thenReturn(BRIGHTNESS_RAMP_RATE_SLOW_DECREASE_IDLE);
when(displayDeviceConfigMock.getBrightnessRampSlowIncreaseIdle())
.thenReturn(BRIGHTNESS_RAMP_RATE_SLOW_INCREASE_IDLE);
+
+ when(displayDeviceConfigMock.getBrightnessRampIncreaseMaxMillis())
+ .thenReturn(BRIGHTNESS_RAMP_INCREASE_MAX);
+ when(displayDeviceConfigMock.getBrightnessRampDecreaseMaxMillis())
+ .thenReturn(BRIGHTNESS_RAMP_DECREASE_MAX);
+ when(displayDeviceConfigMock.getBrightnessRampIncreaseMaxIdleMillis())
+ .thenReturn(BRIGHTNESS_RAMP_INCREASE_MAX_IDLE);
+ when(displayDeviceConfigMock.getBrightnessRampDecreaseMaxIdleMillis())
+ .thenReturn(BRIGHTNESS_RAMP_DECREASE_MAX_IDLE);
}
private DisplayPowerControllerHolder createDisplayPowerController(int displayId,
@@ -1358,7 +1488,6 @@
final HighBrightnessModeMetadata hbmMetadata = mock(HighBrightnessModeMetadata.class);
final BrightnessSetting brightnessSetting = mock(BrightnessSetting.class);
final DisplayDeviceConfig config = mock(DisplayDeviceConfig.class);
- final DisplayManagerFlags flags = mock(DisplayManagerFlags.class);
setUpDisplay(displayId, uniqueId, display, device, config, isEnabled);
@@ -1366,11 +1495,11 @@
mContext, injector, mDisplayPowerCallbacksMock, mHandler,
mSensorManagerMock, mDisplayBlankerMock, display,
mBrightnessTrackerMock, brightnessSetting, () -> {},
- hbmMetadata, /* bootCompleted= */ false, flags);
+ hbmMetadata, /* bootCompleted= */ false, mDisplayManagerFlagsMock);
return new DisplayPowerControllerHolder(dpc, display, displayPowerState, brightnessSetting,
animator, automaticBrightnessController, screenOffBrightnessSensorController,
- hbmController, hbmMetadata, brightnessMappingStrategy, injector);
+ hbmController, hbmMetadata, brightnessMappingStrategy, injector, config);
}
/**
@@ -1389,6 +1518,7 @@
public final HighBrightnessModeMetadata hbmMetadata;
public final BrightnessMappingStrategy brightnessMappingStrategy;
public final DisplayPowerController.Injector injector;
+ public final DisplayDeviceConfig config;
DisplayPowerControllerHolder(DisplayPowerController dpc, LogicalDisplay display,
DisplayPowerState displayPowerState, BrightnessSetting brightnessSetting,
@@ -1398,7 +1528,8 @@
HighBrightnessModeController hbmController,
HighBrightnessModeMetadata hbmMetadata,
BrightnessMappingStrategy brightnessMappingStrategy,
- DisplayPowerController.Injector injector) {
+ DisplayPowerController.Injector injector,
+ DisplayDeviceConfig config) {
this.dpc = dpc;
this.display = display;
this.displayPowerState = displayPowerState;
@@ -1410,6 +1541,7 @@
this.hbmMetadata = hbmMetadata;
this.brightnessMappingStrategy = brightnessMappingStrategy;
this.injector = injector;
+ this.config = config;
}
}