Apply Hdr transition rate only when cap is changed
Bug: b/333865835
Test: manual testing, atest HdrClamperTest
Change-Id: Idb9d24f4555b757be81cca4ce80fb14a1b321da5
diff --git a/services/core/java/com/android/server/display/BrightnessRangeController.java b/services/core/java/com/android/server/display/BrightnessRangeController.java
index dc0e80c..9b37418 100644
--- a/services/core/java/com/android/server/display/BrightnessRangeController.java
+++ b/services/core/java/com/android/server/display/BrightnessRangeController.java
@@ -19,7 +19,6 @@
import android.hardware.display.BrightnessInfo;
import android.os.Handler;
import android.os.IBinder;
-import android.os.PowerManager;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.display.brightness.clamper.HdrClamper;
@@ -148,9 +147,7 @@
float getHdrBrightnessValue() {
float hdrBrightness = mHbmController.getHdrBrightnessValue();
- float brightnessMax = mUseHdrClamper ? mHdrClamper.getMaxBrightness()
- : PowerManager.BRIGHTNESS_MAX;
- return Math.min(hdrBrightness, brightnessMax);
+ return mUseHdrClamper ? mHdrClamper.clamp(hdrBrightness) : hdrBrightness;
}
float getTransitionPoint() {
diff --git a/services/core/java/com/android/server/display/brightness/clamper/HdrClamper.java b/services/core/java/com/android/server/display/brightness/clamper/HdrClamper.java
index f1cb66c..902daa4 100644
--- a/services/core/java/com/android/server/display/brightness/clamper/HdrClamper.java
+++ b/services/core/java/com/android/server/display/brightness/clamper/HdrClamper.java
@@ -59,6 +59,11 @@
private boolean mAutoBrightnessEnabled = false;
+ /**
+ * Indicates that maxBrightness is changed, and we should use slow transition
+ */
+ private boolean mUseSlowTransition = false;
+
public HdrClamper(BrightnessClamperController.ClamperChangeListener clamperChangeListener,
Handler handler) {
this(clamperChangeListener, handler, new Injector());
@@ -72,6 +77,7 @@
mDebouncer = () -> {
mTransitionRate = mDesiredTransitionRate;
mMaxBrightness = mDesiredMaxBrightness;
+ mUseSlowTransition = true;
mClamperChangeListener.onChanged();
};
mHdrListener = injector.getHdrListener((visible) -> {
@@ -80,14 +86,24 @@
}, handler);
}
- // Called in same looper: mHandler.getLooper()
+ /**
+ * Applies clamping
+ * Called in same looper: mHandler.getLooper()
+ */
+ public float clamp(float brightness) {
+ return Math.min(brightness, mMaxBrightness);
+ }
+
+ @VisibleForTesting
public float getMaxBrightness() {
return mMaxBrightness;
}
// Called in same looper: mHandler.getLooper()
public float getTransitionRate() {
- return mTransitionRate;
+ float expectedTransitionRate = mUseSlowTransition ? mTransitionRate : -1;
+ mUseSlowTransition = false;
+ return expectedTransitionRate;
}
/**
@@ -173,7 +189,8 @@
mMaxBrightness = PowerManager.BRIGHTNESS_MAX;
mDesiredMaxBrightness = PowerManager.BRIGHTNESS_MAX;
mDesiredTransitionRate = -1f;
- mTransitionRate = 1f;
+ mTransitionRate = -1f;
+ mUseSlowTransition = false;
mClamperChangeListener.onChanged();
}
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 de93914..78ebdb1 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
@@ -1312,7 +1312,7 @@
when(mHolder.hbmController.getHighBrightnessMode()).thenReturn(
BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR);
when(mHolder.hbmController.getHdrBrightnessValue()).thenReturn(PowerManager.BRIGHTNESS_MAX);
- when(mHolder.hdrClamper.getMaxBrightness()).thenReturn(clampedBrightness);
+ when(mHolder.hdrClamper.clamp(PowerManager.BRIGHTNESS_MAX)).thenReturn(clampedBrightness);
when(mHolder.hdrClamper.getTransitionRate()).thenReturn(transitionRate);
mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/HdrClamperTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/HdrClamperTest.java
index 39ffe5b..c785ea6 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/HdrClamperTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/clamper/HdrClamperTest.java
@@ -221,6 +221,18 @@
assertEquals(0.04f, mHdrClamper.getTransitionRate(), FLOAT_TOLERANCE);
}
+ @Test
+ public void testCalmper_transitionRateOverriddenByOtherRequest() {
+ mHdrClamper.onAmbientLuxChange(499);
+
+ mClock.fastForward(3000);
+ mTestHandler.timeAdvance();
+ assertEquals(0.6f, mHdrClamper.getMaxBrightness(), FLOAT_TOLERANCE);
+ assertEquals(0.04, mHdrClamper.getTransitionRate(), FLOAT_TOLERANCE);
+ // getTransitionRate should reset transitionRate
+ assertEquals(-1f, mHdrClamper.getTransitionRate(), FLOAT_TOLERANCE);
+ }
+
// MsgInfo.sendTime is calculated first by adding SystemClock.uptimeMillis()
// (in Handler.sendMessageDelayed) and then by subtracting SystemClock.uptimeMillis()
// (in TestHandler.sendMessageAtTime, there might be several milliseconds difference between