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;