diff --git a/AconfigFlags.bp b/AconfigFlags.bp index c35424d80dae1af081328889dd63f5daad74e327..7913ad1d09a5f7e9dfe86436825cfe81276861ff 100644 --- a/AconfigFlags.bp +++ b/AconfigFlags.bp @@ -34,6 +34,7 @@ aconfig_srcjars = [ ":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 @@ java_aconfig_library { 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 3a6e5f93861b7eecf66f459c6597f6e077103ab2..507ae2676b16ab2d1247e18483ca6c2f82c42aee 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 @@ import javax.xml.datatype.DatatypeConfigurationException; * * <screenBrightnessRampIncreaseMaxMillis>2000</screenBrightnessRampIncreaseMaxMillis> * <screenBrightnessRampDecreaseMaxMillis>3000</screenBrightnessRampDecreaseMaxMillis> + * <screenBrightnessRampIncreaseMaxIdleMillis>2000</screenBrightnessRampIncreaseMaxIdleMillis> + * <screenBrightnessRampDecreaseMaxIdleMillis>2000</screenBrightnessRampDecreaseMaxIdleMillis> * * <lightSensor> * <type>android.sensor.light</type> @@ -619,6 +621,8 @@ public class DisplayDeviceConfig { 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 @@ public class DisplayDeviceConfig { return mBrightnessRampIncreaseMaxMillis; } + public long getBrightnessRampDecreaseMaxIdleMillis() { + return mBrightnessRampDecreaseMaxIdleMillis; + } + + public long getBrightnessRampIncreaseMaxIdleMillis() { + return mBrightnessRampIncreaseMaxIdleMillis; + } + public int getAmbientHorizonLong() { return mAmbientHorizonLong; } @@ -1697,6 +1709,8 @@ public class DisplayDeviceConfig { + ", mBrightnessRampSlowIncreaseIdle=" + mBrightnessRampSlowIncreaseIdle + ", mBrightnessRampDecreaseMaxMillis=" + mBrightnessRampDecreaseMaxMillis + ", mBrightnessRampIncreaseMaxMillis=" + mBrightnessRampIncreaseMaxMillis + + ", mBrightnessRampDecreaseMaxIdleMillis=" + mBrightnessRampDecreaseMaxIdleMillis + + ", mBrightnessRampIncreaseMaxIdleMillis=" + mBrightnessRampIncreaseMaxIdleMillis + "\n" + "mAmbientHorizonLong=" + mAmbientHorizonLong + ", mAmbientHorizonShort=" + mAmbientHorizonShort @@ -1892,6 +1906,8 @@ public class DisplayDeviceConfig { mBrightnessRampSlowIncreaseIdle = PowerManager.BRIGHTNESS_MAX; mBrightnessRampDecreaseMaxMillis = 0; mBrightnessRampIncreaseMaxMillis = 0; + mBrightnessRampDecreaseMaxIdleMillis = 0; + mBrightnessRampIncreaseMaxIdleMillis = 0; setSimpleMappingStrategyValues(); loadAmbientLightSensorFromConfigXml(); setProxSensorUnspecified(); @@ -2767,6 +2783,19 @@ public class DisplayDeviceConfig { 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 f86b8ca5208b74ff20c7e33f9b7f3deb5281ec74..bc81491aefbfaa405f44c85f038b115f54f81819 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 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call 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 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private boolean mBootCompleted; + private final DisplayManagerFlags mFlags; + /** * Creates the display power controller. */ @@ -750,6 +756,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mPendingAutoBrightnessAdjustment = PowerManager.BRIGHTNESS_INVALID_FLOAT; mBootCompleted = bootCompleted; + + mFlags = flags; } private void applyReduceBrightColorsSplineAdjustment() { @@ -1057,11 +1065,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call 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 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call 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 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mDisplayDeviceConfig.getBrightnessRampDecreaseMaxMillis(); mBrightnessRampIncreaseMaxTimeMillis = mDisplayDeviceConfig.getBrightnessRampIncreaseMaxMillis(); + mBrightnessRampDecreaseMaxTimeIdleMillis = + mDisplayDeviceConfig.getBrightnessRampDecreaseMaxIdleMillis(); + mBrightnessRampIncreaseMaxTimeIdleMillis = + mDisplayDeviceConfig.getBrightnessRampIncreaseMaxIdleMillis(); } private void loadNitsRange(Resources resources) { @@ -1349,6 +1356,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } else { mAutomaticBrightnessController.switchToInteractiveScreenBrightnessMode(); } + setAnimatorRampSpeeds(isIdle); } Message msg = mHandler.obtainMessage(); @@ -1357,6 +1365,21 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call 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 da299813d525008c16b70e7fbdd4e34b089bbd66..90a8490b6f49793723cf9125c54f707b1279f811 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 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal 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 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal private boolean mBootCompleted; + private final DisplayManagerFlags mFlags; + /** * Creates the display power controller. */ @@ -615,6 +621,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal R.bool.config_displayBrightnessBucketsInDoze); mBootCompleted = bootCompleted; + mFlags = flags; } private void applyReduceBrightColorsSplineAdjustment() { @@ -862,11 +869,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal 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 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal 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 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mDisplayDeviceConfig.getBrightnessRampDecreaseMaxMillis(); mBrightnessRampIncreaseMaxTimeMillis = mDisplayDeviceConfig.getBrightnessRampIncreaseMaxMillis(); + mBrightnessRampDecreaseMaxTimeIdleMillis = + mDisplayDeviceConfig.getBrightnessRampDecreaseMaxIdleMillis(); + mBrightnessRampIncreaseMaxTimeIdleMillis = + mDisplayDeviceConfig.getBrightnessRampIncreaseMaxIdleMillis(); } private void loadNitsRange(Resources resources) { @@ -1162,6 +1168,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal } else { mAutomaticBrightnessController.switchToInteractiveScreenBrightnessMode(); } + setAnimatorRampSpeeds(isIdle); } Message msg = mHandler.obtainMessage(); msg.what = MSG_SET_DWBC_STRONG_MODE; @@ -1169,6 +1176,21 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal 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 27c48eda83c6e165220cd8198d425298806fca8c..a0ead384c1d25a7dce2f448b316b42d0f12f41aa 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_declarations { "*.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 d23c4fe91c8473f3772029f385945577bdadaa14..3f6bf1adfe48e1bd555a4828b335a0a7b8b8d6dc 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 @@ public class DisplayManagerFlags { 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 @@ public class DisplayManagerFlags { 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 ce64bd3898399909e1bc68bad0c35446b6d95921..4d8600448c33989ed064bc832407e572f2fa28a5 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 @@ flag { 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 4203e89ec6189de877f0334faa4ce132fe44cc99..d0a9c458a20f7fa58603106c88fcde25761da398 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 ebd9b1c23a50394967aeb17c2c19bcf79c4ed4a2..949b1f2cb74b955ef19a9f4e9b38363148f0be56 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 @@ package com.android.server.display.config { 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 @@ package com.android.server.display.config { 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 e28028f9fc2b600ed479dce4ac9f01dece7e9bfc..0275c7df46481363d7d40dfe703ba291bba0d011 100644 --- a/services/tests/displayservicetests/Android.bp +++ b/services/tests/displayservicetests/Android.bp @@ -29,6 +29,7 @@ android_test { 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 7374901763db1154d77bbfd46cda5f44166a9de4..6ef150c80037ca71719a9bae0d77ec67fbfe4af1 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 @@ public final class DisplayDeviceConfigTest { 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 @@ public final class DisplayDeviceConfigTest { @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 @@ public final class DisplayDeviceConfigTest { // 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 @@ public final class DisplayDeviceConfigTest { @Test public void testProximitySensorWithEmptyValuesFromDisplayConfig() throws IOException { setupDisplayDeviceConfigFromDisplayConfigFile( - getContent(getValidLuxThrottling(), getProxSensorWithEmptyValues())); + getContent(getValidLuxThrottling(), getProxSensorWithEmptyValues(), + /* includeIdleMode= */ true)); assertNull(mDisplayDeviceConfig.getProximitySensor()); } @@ -577,6 +577,39 @@ public final class DisplayDeviceConfigTest { 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 @@ public final class DisplayDeviceConfigTest { + "</hdrBrightnessConfig>"; } + private String getRampSpeedsIdle() { + return "<brighteningLightDebounceIdleMillis>" + + "2500" + + "</brighteningLightDebounceIdleMillis>\n" + + "<darkeningLightDebounceIdleMillis>" + + "1500" + + "</darkeningLightDebounceIdleMillis>\n"; + } + + 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()); + return getContent(getValidLuxThrottling(), getValidProxSensor(), + /* includeIdleMode= */ true); } - private String getContent(String brightnessCapConfig, String proxSensor) { + 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 @@ public final class DisplayDeviceConfigTest { + "<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 @@ public final class DisplayDeviceConfigTest { + "</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 @@ public final class DisplayDeviceConfigTest { 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 85406b5d12dd0f03fcd904ab4b996389a3be4b82..9174899dfe6c31a217c96c7b7b9b2327bddee432 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.PowerManager; 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.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 @@ public final class DisplayPowerController2Test { 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 @@ public final class DisplayPowerController2Test { private ColorDisplayService.ColorDisplayServiceInternal mCdsiMock; @Mock private DisplayWhiteBalanceController mDisplayWhiteBalanceControllerMock; + @Mock + private DisplayManagerFlags mDisplayManagerFlagsMock; @Captor private ArgumentCaptor<SensorEventListener> mSensorEventListenerCaptor; @@ -145,6 +156,9 @@ public final class DisplayPowerController2Test { .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 @@ public final class DisplayPowerController2Test { 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 @@ public final class DisplayPowerController2Test { }); when(displayDeviceConfigMock.getScreenOffBrightnessSensorValueToLux()) .thenReturn(new int[0]); + when(displayDeviceConfigMock.getBrightnessRampFastDecrease()) .thenReturn(BRIGHTNESS_RAMP_RATE_FAST_DECREASE); when(displayDeviceConfigMock.getBrightnessRampFastIncrease()) @@ -1378,6 +1500,15 @@ public final class DisplayPowerController2Test { .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 @@ public final class DisplayPowerController2Test { 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 class DisplayPowerController2Test { 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 @@ public final class DisplayPowerController2Test { 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 @@ public final class DisplayPowerController2Test { 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 c53e763068b77ac08879d0ab72bb8c1b20a5b407..412b65f5835a4e57980086960d7b269d7c3a92c9 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.PowerManager; 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.RampAnimator.DualRampAnimator; 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 @@ public final class DisplayPowerControllerTest { 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 @@ public final class DisplayPowerControllerTest { private ColorDisplayService.ColorDisplayServiceInternal mCdsiMock; @Mock private DisplayWhiteBalanceController mDisplayWhiteBalanceControllerMock; + @Mock + private DisplayManagerFlags mDisplayManagerFlagsMock; + @Captor private ArgumentCaptor<SensorEventListener> mSensorEventListenerCaptor; @@ -147,6 +160,9 @@ public final class DisplayPowerControllerTest { @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 @@ public final class DisplayPowerControllerTest { 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 @@ public final class DisplayPowerControllerTest { }); when(displayDeviceConfigMock.getScreenOffBrightnessSensorValueToLux()) .thenReturn(new int[0]); + when(displayDeviceConfigMock.getBrightnessRampFastDecrease()) .thenReturn(BRIGHTNESS_RAMP_RATE_FAST_DECREASE); when(displayDeviceConfigMock.getBrightnessRampFastIncrease()) @@ -1327,6 +1448,15 @@ public final class DisplayPowerControllerTest { .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 @@ public final class DisplayPowerControllerTest { 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 @@ public final class DisplayPowerControllerTest { 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 class DisplayPowerControllerTest { 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 @@ public final class DisplayPowerControllerTest { 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 @@ public final class DisplayPowerControllerTest { this.hbmMetadata = hbmMetadata; this.brightnessMappingStrategy = brightnessMappingStrategy; this.injector = injector; + this.config = config; } }