diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 79143629710a5..480c4b1f5ed8f 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -935,6 +935,8 @@
- 1.089058
+
+ true
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 18a1ff1067403..409428639a925 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -3407,6 +3407,7 @@
+
diff --git a/services/core/java/com/android/server/display/color/ColorDisplayService.java b/services/core/java/com/android/server/display/color/ColorDisplayService.java
index c5a8fc2f3bc59..017b96cc5f67a 100644
--- a/services/core/java/com/android/server/display/color/ColorDisplayService.java
+++ b/services/core/java/com/android/server/display/color/ColorDisplayService.java
@@ -740,7 +740,8 @@ public final class ColorDisplayService extends SystemService {
mDisplayWhiteBalanceTintController.setActivated(isDisplayWhiteBalanceSettingEnabled()
&& !mNightDisplayTintController.isActivated()
&& !isAccessibilityEnabled()
- && dtm.needsLinearColorMatrix());
+ && dtm.needsLinearColorMatrix()
+ && mDisplayWhiteBalanceTintController.isAllowed());
boolean activated = mDisplayWhiteBalanceTintController.isActivated();
if (mDisplayWhiteBalanceListener != null && oldActivated != activated) {
@@ -1453,6 +1454,12 @@ public final class ColorDisplayService extends SystemService {
*/
public class ColorDisplayServiceInternal {
+ /** Sets whether DWB should be allowed in the current state. */
+ public void setDisplayWhiteBalanceAllowed(boolean allowed) {
+ mDisplayWhiteBalanceTintController.setAllowed(allowed);
+ updateDisplayWhiteBalanceStatus();
+ }
+
/**
* Set the current CCT value for the display white balance transform, and if the transform
* is enabled, apply it.
diff --git a/services/core/java/com/android/server/display/color/DisplayWhiteBalanceTintController.java b/services/core/java/com/android/server/display/color/DisplayWhiteBalanceTintController.java
index 936149c690f45..93a78c1507ad1 100644
--- a/services/core/java/com/android/server/display/color/DisplayWhiteBalanceTintController.java
+++ b/services/core/java/com/android/server/display/color/DisplayWhiteBalanceTintController.java
@@ -61,12 +61,17 @@ final class DisplayWhiteBalanceTintController extends TintController {
boolean mSetUp = false;
private float[] mMatrixDisplayWhiteBalance = new float[16];
private Boolean mIsAvailable;
+ // This feature becomes disallowed if the device is in an unsupported strong/light state.
+ private boolean mIsAllowed = true;
@Override
public void setUp(Context context, boolean needsLinear) {
mSetUp = false;
final Resources res = context.getResources();
+ // Initialize with the config value for light mode, so it starts in the right state.
+ setAllowed(res.getBoolean(R.bool.config_displayWhiteBalanceLightModeAllowed));
+
ColorSpace.Rgb displayColorSpaceRGB = getDisplayColorSpaceFromSurfaceControl();
if (displayColorSpaceRGB == null) {
Slog.w(ColorDisplayService.TAG,
@@ -248,6 +253,7 @@ final class DisplayWhiteBalanceTintController extends TintController {
+ matrixToString(mDisplayColorSpaceRGB.getInverseTransform(), 3));
pw.println(" mMatrixDisplayWhiteBalance = "
+ matrixToString(mMatrixDisplayWhiteBalance, 4));
+ pw.println(" mIsAllowed = " + mIsAllowed);
}
}
@@ -263,6 +269,14 @@ final class DisplayWhiteBalanceTintController extends TintController {
}
}
+ public void setAllowed(boolean allowed) {
+ mIsAllowed = allowed;
+ }
+
+ public boolean isAllowed() {
+ return mIsAllowed;
+ }
+
private ColorSpace.Rgb makeRgbColorSpaceFromXYZ(float[] redGreenBlueXYZ, float[] whiteXYZ) {
return new ColorSpace.Rgb(
"Display Color Space",
diff --git a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java
index d04b5a27cf43e..85d5b4f0a1faa 100644
--- a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java
+++ b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java
@@ -65,6 +65,8 @@ public class DisplayWhiteBalanceController implements
// this effect.
private final float mHighLightAmbientColorTemperature;
+ private final boolean mLightModeAllowed;
+
private float mAmbientColorTemperature;
@VisibleForTesting
float mPendingAmbientColorTemperature;
@@ -148,6 +150,8 @@ public class DisplayWhiteBalanceController implements
* @param displayColorTemperatures
* The display color temperatures used to map the ambient color temperature to the display
* color temperature (or null if no mapping is necessary).
+ * @param lightModeAllowed
+ * Whether a lighter version should be applied when Strong Mode is not enabled.
*
* @throws NullPointerException
* - brightnessSensor is null;
@@ -171,7 +175,8 @@ public class DisplayWhiteBalanceController implements
float[] ambientColorTemperatures,
float[] displayColorTemperatures,
float[] strongAmbientColorTemperatures,
- float[] strongDisplayColorTemperatures) {
+ float[] strongDisplayColorTemperatures,
+ boolean lightModeAllowed) {
validateArguments(brightnessSensor, brightnessFilter, colorTemperatureSensor,
colorTemperatureFilter, throttler);
mBrightnessSensor = brightnessSensor;
@@ -186,6 +191,7 @@ public class DisplayWhiteBalanceController implements
mLastAmbientColorTemperature = -1.0f;
mAmbientColorTemperatureHistory = new History(/* size= */ 50);
mAmbientColorTemperatureOverride = -1.0f;
+ mLightModeAllowed = lightModeAllowed;
try {
mLowLightAmbientBrightnessToBiasSpline = new Spline.LinearSpline(
@@ -273,6 +279,8 @@ public class DisplayWhiteBalanceController implements
*/
public void setStrongModeEnabled(boolean enabled) {
mStrongModeEnabled = enabled;
+ mColorDisplayServiceInternal.setDisplayWhiteBalanceAllowed(mLightModeAllowed
+ || mStrongModeEnabled);
if (mEnabled) {
updateAmbientColorTemperature();
updateDisplayColorTemperature();
diff --git a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java
index 07821b0a984e1..62f813f2857ac 100644
--- a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java
+++ b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java
@@ -95,6 +95,8 @@ public class DisplayWhiteBalanceFactory {
final float[] strongDisplayColorTemperatures = getFloatArray(resources,
com.android.internal.R.array
.config_displayWhiteBalanceStrongDisplayColorTemperatures);
+ final boolean lightModeAllowed = resources.getBoolean(
+ com.android.internal.R.bool.config_displayWhiteBalanceLightModeAllowed);
final DisplayWhiteBalanceController controller = new DisplayWhiteBalanceController(
brightnessSensor, brightnessFilter, colorTemperatureSensor, colorTemperatureFilter,
throttler, displayWhiteBalanceLowLightAmbientBrightnesses,
@@ -102,7 +104,7 @@ public class DisplayWhiteBalanceFactory {
displayWhiteBalanceHighLightAmbientBrightnesses,
displayWhiteBalanceHighLightAmbientBiases, highLightAmbientColorTemperature,
ambientColorTemperatures, displayColorTemperatures, strongAmbientColorTemperatures,
- strongDisplayColorTemperatures);
+ strongDisplayColorTemperatures, lightModeAllowed);
brightnessSensor.setCallbacks(controller);
colorTemperatureSensor.setCallbacks(controller);
return controller;