Loading core/res/res/values/config.xml +22 −3 Original line number Diff line number Diff line Loading @@ -4018,9 +4018,28 @@ </array> <!-- See DisplayWhiteBalanceController. The ambient brightness threshold (in lux) beneath which we fall back to a fixed ambient color temperature. --> <item name="config_displayWhiteBalanceLowLightAmbientBrightnessThreshold" format="float" type="dimen">10.0</item> A float array containing a list of ambient brightnesses, in Lux. This array, together with config_displayWhiteBalanceLowLightAmbientBiases, is used to generate a lookup table used in DisplayWhiteBalanceController. This lookup table is used to map ambient brightness readings to a bias, where the bias is used to linearly interpolate between ambient color temperature and config_displayWhiteBalanceLowLightAmbientColorTemperature. This table is optional. If used, this array must, 1) Contain at least two entries 2) Be the same length as config_displayWhiteBalanceLowLightAmbientBiases. --> <array name ="config_displayWhiteBalanceLowLightAmbientBrightnesses"> <item>10.0</item> <item>10.0</item> </array> <!-- See DisplayWhiteBalanceController. An array containing a list of biases. See config_displayWhiteBalanceLowLightAmbientBrightnesses for additional details. This array must be in the range of [0.0, 1.0]. --> <array name ="config_displayWhiteBalanceLowLightAmbientBiases"> <item>0.0</item> <item>1.0</item> </array> <!-- See DisplayWhiteBalanceController. The ambient color temperature (in cct) to which we fall back when the ambient brightness Loading core/res/res/values/symbols.xml +2 −1 Original line number Diff line number Diff line Loading @@ -3744,7 +3744,8 @@ <java-symbol type="array" name="config_displayWhiteBalanceBaseThresholds" /> <java-symbol type="array" name="config_displayWhiteBalanceIncreaseThresholds" /> <java-symbol type="array" name="config_displayWhiteBalanceDecreaseThresholds" /> <java-symbol type="dimen" name="config_displayWhiteBalanceLowLightAmbientBrightnessThreshold" /> <java-symbol type="array" name="config_displayWhiteBalanceLowLightAmbientBrightnesses" /> <java-symbol type="array" name="config_displayWhiteBalanceLowLightAmbientBiases" /> <java-symbol type="dimen" name="config_displayWhiteBalanceLowLightAmbientColorTemperature" /> <java-symbol type="array" name="config_displayWhiteBalanceAmbientColorTemperatures" /> <java-symbol type="array" name="config_displayWhiteBalanceDisplayColorTemperatures" /> Loading services/core/java/com/android/server/display/whitebalance/AmbientFilter.java +3 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.display.whitebalance; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.server.display.utils.RollingBuffer; import java.io.PrintWriter; Loading Loading @@ -155,7 +156,8 @@ abstract class AmbientFilter { /** * A weighted average prioritising recent changes. */ static class WeightedMovingAverageAmbientFilter extends AmbientFilter { @VisibleForTesting public static class WeightedMovingAverageAmbientFilter extends AmbientFilter { // How long the latest ambient value change is predicted to last. private static final int PREDICTION_TIME = 100; // Milliseconds Loading services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java +42 −19 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.util.Slog; import android.util.Spline; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import com.android.server.LocalServices; import com.android.server.display.color.ColorDisplayService.ColorDisplayServiceInternal; Loading Loading @@ -53,18 +54,21 @@ public class DisplayWhiteBalanceController implements private Callbacks mCallbacks; private AmbientSensor.AmbientBrightnessSensor mBrightnessSensor; private AmbientFilter mBrightnessFilter; @VisibleForTesting AmbientFilter mBrightnessFilter; private AmbientSensor.AmbientColorTemperatureSensor mColorTemperatureSensor; private AmbientFilter mColorTemperatureFilter; @VisibleForTesting AmbientFilter mColorTemperatureFilter; private DisplayWhiteBalanceThrottler mThrottler; // When the brightness drops below a certain threshold, it affects the color temperature // accuracy, so we fall back to a fixed ambient color temperature. private final float mLowLightAmbientBrightnessThreshold; private final float mLowLightAmbientColorTemperature; private float mAmbientColorTemperature; private float mPendingAmbientColorTemperature; @VisibleForTesting float mPendingAmbientColorTemperature; private float mLastAmbientColorTemperature; private ColorDisplayServiceInternal mColorDisplayServiceInternal; Loading @@ -79,6 +83,9 @@ public class DisplayWhiteBalanceController implements // A piecewise linear relationship between ambient and display color temperatures. private Spline.LinearSpline mAmbientToDisplayColorTemperatureSpline; // A piecewise linear relationship between low light brightness and low light bias. private Spline.LinearSpline mLowLightAmbientBrightnessToBiasSpline; /** * @param brightnessSensor * The sensor used to detect changes in the ambient brightness. Loading Loading @@ -119,7 +126,8 @@ public class DisplayWhiteBalanceController implements @NonNull AmbientSensor.AmbientColorTemperatureSensor colorTemperatureSensor, @NonNull AmbientFilter colorTemperatureFilter, @NonNull DisplayWhiteBalanceThrottler throttler, float lowLightAmbientBrightnessThreshold, float lowLightAmbientColorTemperature, float[] lowLightAmbientBrightnesses, float[] lowLightAmbientBiases, float lowLightAmbientColorTemperature, float[] ambientColorTemperatures, float[] displayColorTemperatures) { validateArguments(brightnessSensor, brightnessFilter, colorTemperatureSensor, colorTemperatureFilter, throttler); Loading @@ -131,7 +139,6 @@ public class DisplayWhiteBalanceController implements mColorTemperatureSensor = colorTemperatureSensor; mColorTemperatureFilter = colorTemperatureFilter; mThrottler = throttler; mLowLightAmbientBrightnessThreshold = lowLightAmbientBrightnessThreshold; mLowLightAmbientColorTemperature = lowLightAmbientColorTemperature; mAmbientColorTemperature = -1.0f; mPendingAmbientColorTemperature = -1.0f; Loading @@ -139,10 +146,28 @@ public class DisplayWhiteBalanceController implements mAmbientColorTemperatureHistory = new History(HISTORY_SIZE); mAmbientColorTemperatureOverride = -1.0f; try { mLowLightAmbientBrightnessToBiasSpline = new Spline.LinearSpline( lowLightAmbientBrightnesses, lowLightAmbientBiases); } catch (Exception e) { Slog.e(TAG, "failed to create low light ambient brightness to bias spline.", e); mLowLightAmbientBrightnessToBiasSpline = null; } if (mLowLightAmbientBrightnessToBiasSpline != null) { if (mLowLightAmbientBrightnessToBiasSpline.interpolate(0.0f) != 0.0f || mLowLightAmbientBrightnessToBiasSpline.interpolate(Float.POSITIVE_INFINITY) != 1.0f) { Slog.d(TAG, "invalid low light ambient brightness to bias spline, " + "bias must begin at 0.0 and end at 1.0"); mLowLightAmbientBrightnessToBiasSpline = null; } } try { mAmbientToDisplayColorTemperatureSpline = new Spline.LinearSpline( ambientColorTemperatures, displayColorTemperatures); } catch (Exception e) { Slog.e(TAG, "failed to create ambient to display color temperature spline.", e); mAmbientToDisplayColorTemperatureSpline = null; } Loading Loading @@ -238,8 +263,6 @@ public class DisplayWhiteBalanceController implements mColorTemperatureSensor.dump(writer); mColorTemperatureFilter.dump(writer); mThrottler.dump(writer); writer.println(" mLowLightAmbientBrightnessThreshold=" + mLowLightAmbientBrightnessThreshold); writer.println(" mLowLightAmbientColorTemperature=" + mLowLightAmbientColorTemperature); writer.println(" mAmbientColorTemperature=" + mAmbientColorTemperature); writer.println(" mPendingAmbientColorTemperature=" + mPendingAmbientColorTemperature); Loading @@ -248,6 +271,8 @@ public class DisplayWhiteBalanceController implements writer.println(" mAmbientColorTemperatureOverride=" + mAmbientColorTemperatureOverride); writer.println(" mAmbientToDisplayColorTemperatureSpline=" + mAmbientToDisplayColorTemperatureSpline); writer.println(" mLowLightAmbientBrightnessToBiasSpline=" + mLowLightAmbientBrightnessToBiasSpline); } @Override // AmbientSensor.AmbientBrightnessSensor.Callbacks Loading Loading @@ -276,15 +301,13 @@ public class DisplayWhiteBalanceController implements mAmbientToDisplayColorTemperatureSpline.interpolate(ambientColorTemperature); } final float ambientBrightness = mBrightnessFilter.getEstimate(time); if (ambientBrightness < mLowLightAmbientBrightnessThreshold) { if (mLoggingEnabled) { Slog.d(TAG, "low light ambient brightness: " + ambientBrightness + " < " + mLowLightAmbientBrightnessThreshold + ", falling back to fixed ambient color temperature: " + ambientColorTemperature + " => " + mLowLightAmbientColorTemperature); } ambientColorTemperature = mLowLightAmbientColorTemperature; float ambientBrightness = mBrightnessFilter.getEstimate(time); if (mLowLightAmbientBrightnessToBiasSpline != null) { float bias = mLowLightAmbientBrightnessToBiasSpline.interpolate(ambientBrightness); ambientColorTemperature = bias * ambientColorTemperature + (1.0f - bias) * mLowLightAmbientColorTemperature; } if (mAmbientColorTemperatureOverride != -1.0f) { Loading services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java +8 −4 Original line number Diff line number Diff line Loading @@ -63,9 +63,12 @@ public class DisplayWhiteBalanceFactory { createColorTemperatureSensor(handler, sensorManager, resources); final AmbientFilter colorTemperatureFilter = createColorTemperatureFilter(resources); final DisplayWhiteBalanceThrottler throttler = createThrottler(resources); final float lowLightAmbientBrightnessThreshold = getFloat(resources, com.android.internal.R.dimen .config_displayWhiteBalanceLowLightAmbientBrightnessThreshold); final float[] displayWhiteBalanceLowLightAmbientBrightnesses = getFloatArray(resources, com.android.internal.R.array .config_displayWhiteBalanceLowLightAmbientBrightnesses); final float[] displayWhiteBalanceLowLightAmbientBiases = getFloatArray(resources, com.android.internal.R.array .config_displayWhiteBalanceLowLightAmbientBiases); final float lowLightAmbientColorTemperature = getFloat(resources, com.android.internal.R.dimen .config_displayWhiteBalanceLowLightAmbientColorTemperature); Loading @@ -75,7 +78,8 @@ public class DisplayWhiteBalanceFactory { com.android.internal.R.array.config_displayWhiteBalanceDisplayColorTemperatures); final DisplayWhiteBalanceController controller = new DisplayWhiteBalanceController( brightnessSensor, brightnessFilter, colorTemperatureSensor, colorTemperatureFilter, throttler, lowLightAmbientBrightnessThreshold, lowLightAmbientColorTemperature, throttler, displayWhiteBalanceLowLightAmbientBrightnesses, displayWhiteBalanceLowLightAmbientBiases, lowLightAmbientColorTemperature, ambientColorTemperatures, displayColorTempeartures); brightnessSensor.setCallbacks(controller); colorTemperatureSensor.setCallbacks(controller); Loading Loading
core/res/res/values/config.xml +22 −3 Original line number Diff line number Diff line Loading @@ -4018,9 +4018,28 @@ </array> <!-- See DisplayWhiteBalanceController. The ambient brightness threshold (in lux) beneath which we fall back to a fixed ambient color temperature. --> <item name="config_displayWhiteBalanceLowLightAmbientBrightnessThreshold" format="float" type="dimen">10.0</item> A float array containing a list of ambient brightnesses, in Lux. This array, together with config_displayWhiteBalanceLowLightAmbientBiases, is used to generate a lookup table used in DisplayWhiteBalanceController. This lookup table is used to map ambient brightness readings to a bias, where the bias is used to linearly interpolate between ambient color temperature and config_displayWhiteBalanceLowLightAmbientColorTemperature. This table is optional. If used, this array must, 1) Contain at least two entries 2) Be the same length as config_displayWhiteBalanceLowLightAmbientBiases. --> <array name ="config_displayWhiteBalanceLowLightAmbientBrightnesses"> <item>10.0</item> <item>10.0</item> </array> <!-- See DisplayWhiteBalanceController. An array containing a list of biases. See config_displayWhiteBalanceLowLightAmbientBrightnesses for additional details. This array must be in the range of [0.0, 1.0]. --> <array name ="config_displayWhiteBalanceLowLightAmbientBiases"> <item>0.0</item> <item>1.0</item> </array> <!-- See DisplayWhiteBalanceController. The ambient color temperature (in cct) to which we fall back when the ambient brightness Loading
core/res/res/values/symbols.xml +2 −1 Original line number Diff line number Diff line Loading @@ -3744,7 +3744,8 @@ <java-symbol type="array" name="config_displayWhiteBalanceBaseThresholds" /> <java-symbol type="array" name="config_displayWhiteBalanceIncreaseThresholds" /> <java-symbol type="array" name="config_displayWhiteBalanceDecreaseThresholds" /> <java-symbol type="dimen" name="config_displayWhiteBalanceLowLightAmbientBrightnessThreshold" /> <java-symbol type="array" name="config_displayWhiteBalanceLowLightAmbientBrightnesses" /> <java-symbol type="array" name="config_displayWhiteBalanceLowLightAmbientBiases" /> <java-symbol type="dimen" name="config_displayWhiteBalanceLowLightAmbientColorTemperature" /> <java-symbol type="array" name="config_displayWhiteBalanceAmbientColorTemperatures" /> <java-symbol type="array" name="config_displayWhiteBalanceDisplayColorTemperatures" /> Loading
services/core/java/com/android/server/display/whitebalance/AmbientFilter.java +3 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.display.whitebalance; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.server.display.utils.RollingBuffer; import java.io.PrintWriter; Loading Loading @@ -155,7 +156,8 @@ abstract class AmbientFilter { /** * A weighted average prioritising recent changes. */ static class WeightedMovingAverageAmbientFilter extends AmbientFilter { @VisibleForTesting public static class WeightedMovingAverageAmbientFilter extends AmbientFilter { // How long the latest ambient value change is predicted to last. private static final int PREDICTION_TIME = 100; // Milliseconds Loading
services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java +42 −19 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.util.Slog; import android.util.Spline; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import com.android.server.LocalServices; import com.android.server.display.color.ColorDisplayService.ColorDisplayServiceInternal; Loading Loading @@ -53,18 +54,21 @@ public class DisplayWhiteBalanceController implements private Callbacks mCallbacks; private AmbientSensor.AmbientBrightnessSensor mBrightnessSensor; private AmbientFilter mBrightnessFilter; @VisibleForTesting AmbientFilter mBrightnessFilter; private AmbientSensor.AmbientColorTemperatureSensor mColorTemperatureSensor; private AmbientFilter mColorTemperatureFilter; @VisibleForTesting AmbientFilter mColorTemperatureFilter; private DisplayWhiteBalanceThrottler mThrottler; // When the brightness drops below a certain threshold, it affects the color temperature // accuracy, so we fall back to a fixed ambient color temperature. private final float mLowLightAmbientBrightnessThreshold; private final float mLowLightAmbientColorTemperature; private float mAmbientColorTemperature; private float mPendingAmbientColorTemperature; @VisibleForTesting float mPendingAmbientColorTemperature; private float mLastAmbientColorTemperature; private ColorDisplayServiceInternal mColorDisplayServiceInternal; Loading @@ -79,6 +83,9 @@ public class DisplayWhiteBalanceController implements // A piecewise linear relationship between ambient and display color temperatures. private Spline.LinearSpline mAmbientToDisplayColorTemperatureSpline; // A piecewise linear relationship between low light brightness and low light bias. private Spline.LinearSpline mLowLightAmbientBrightnessToBiasSpline; /** * @param brightnessSensor * The sensor used to detect changes in the ambient brightness. Loading Loading @@ -119,7 +126,8 @@ public class DisplayWhiteBalanceController implements @NonNull AmbientSensor.AmbientColorTemperatureSensor colorTemperatureSensor, @NonNull AmbientFilter colorTemperatureFilter, @NonNull DisplayWhiteBalanceThrottler throttler, float lowLightAmbientBrightnessThreshold, float lowLightAmbientColorTemperature, float[] lowLightAmbientBrightnesses, float[] lowLightAmbientBiases, float lowLightAmbientColorTemperature, float[] ambientColorTemperatures, float[] displayColorTemperatures) { validateArguments(brightnessSensor, brightnessFilter, colorTemperatureSensor, colorTemperatureFilter, throttler); Loading @@ -131,7 +139,6 @@ public class DisplayWhiteBalanceController implements mColorTemperatureSensor = colorTemperatureSensor; mColorTemperatureFilter = colorTemperatureFilter; mThrottler = throttler; mLowLightAmbientBrightnessThreshold = lowLightAmbientBrightnessThreshold; mLowLightAmbientColorTemperature = lowLightAmbientColorTemperature; mAmbientColorTemperature = -1.0f; mPendingAmbientColorTemperature = -1.0f; Loading @@ -139,10 +146,28 @@ public class DisplayWhiteBalanceController implements mAmbientColorTemperatureHistory = new History(HISTORY_SIZE); mAmbientColorTemperatureOverride = -1.0f; try { mLowLightAmbientBrightnessToBiasSpline = new Spline.LinearSpline( lowLightAmbientBrightnesses, lowLightAmbientBiases); } catch (Exception e) { Slog.e(TAG, "failed to create low light ambient brightness to bias spline.", e); mLowLightAmbientBrightnessToBiasSpline = null; } if (mLowLightAmbientBrightnessToBiasSpline != null) { if (mLowLightAmbientBrightnessToBiasSpline.interpolate(0.0f) != 0.0f || mLowLightAmbientBrightnessToBiasSpline.interpolate(Float.POSITIVE_INFINITY) != 1.0f) { Slog.d(TAG, "invalid low light ambient brightness to bias spline, " + "bias must begin at 0.0 and end at 1.0"); mLowLightAmbientBrightnessToBiasSpline = null; } } try { mAmbientToDisplayColorTemperatureSpline = new Spline.LinearSpline( ambientColorTemperatures, displayColorTemperatures); } catch (Exception e) { Slog.e(TAG, "failed to create ambient to display color temperature spline.", e); mAmbientToDisplayColorTemperatureSpline = null; } Loading Loading @@ -238,8 +263,6 @@ public class DisplayWhiteBalanceController implements mColorTemperatureSensor.dump(writer); mColorTemperatureFilter.dump(writer); mThrottler.dump(writer); writer.println(" mLowLightAmbientBrightnessThreshold=" + mLowLightAmbientBrightnessThreshold); writer.println(" mLowLightAmbientColorTemperature=" + mLowLightAmbientColorTemperature); writer.println(" mAmbientColorTemperature=" + mAmbientColorTemperature); writer.println(" mPendingAmbientColorTemperature=" + mPendingAmbientColorTemperature); Loading @@ -248,6 +271,8 @@ public class DisplayWhiteBalanceController implements writer.println(" mAmbientColorTemperatureOverride=" + mAmbientColorTemperatureOverride); writer.println(" mAmbientToDisplayColorTemperatureSpline=" + mAmbientToDisplayColorTemperatureSpline); writer.println(" mLowLightAmbientBrightnessToBiasSpline=" + mLowLightAmbientBrightnessToBiasSpline); } @Override // AmbientSensor.AmbientBrightnessSensor.Callbacks Loading Loading @@ -276,15 +301,13 @@ public class DisplayWhiteBalanceController implements mAmbientToDisplayColorTemperatureSpline.interpolate(ambientColorTemperature); } final float ambientBrightness = mBrightnessFilter.getEstimate(time); if (ambientBrightness < mLowLightAmbientBrightnessThreshold) { if (mLoggingEnabled) { Slog.d(TAG, "low light ambient brightness: " + ambientBrightness + " < " + mLowLightAmbientBrightnessThreshold + ", falling back to fixed ambient color temperature: " + ambientColorTemperature + " => " + mLowLightAmbientColorTemperature); } ambientColorTemperature = mLowLightAmbientColorTemperature; float ambientBrightness = mBrightnessFilter.getEstimate(time); if (mLowLightAmbientBrightnessToBiasSpline != null) { float bias = mLowLightAmbientBrightnessToBiasSpline.interpolate(ambientBrightness); ambientColorTemperature = bias * ambientColorTemperature + (1.0f - bias) * mLowLightAmbientColorTemperature; } if (mAmbientColorTemperatureOverride != -1.0f) { Loading
services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java +8 −4 Original line number Diff line number Diff line Loading @@ -63,9 +63,12 @@ public class DisplayWhiteBalanceFactory { createColorTemperatureSensor(handler, sensorManager, resources); final AmbientFilter colorTemperatureFilter = createColorTemperatureFilter(resources); final DisplayWhiteBalanceThrottler throttler = createThrottler(resources); final float lowLightAmbientBrightnessThreshold = getFloat(resources, com.android.internal.R.dimen .config_displayWhiteBalanceLowLightAmbientBrightnessThreshold); final float[] displayWhiteBalanceLowLightAmbientBrightnesses = getFloatArray(resources, com.android.internal.R.array .config_displayWhiteBalanceLowLightAmbientBrightnesses); final float[] displayWhiteBalanceLowLightAmbientBiases = getFloatArray(resources, com.android.internal.R.array .config_displayWhiteBalanceLowLightAmbientBiases); final float lowLightAmbientColorTemperature = getFloat(resources, com.android.internal.R.dimen .config_displayWhiteBalanceLowLightAmbientColorTemperature); Loading @@ -75,7 +78,8 @@ public class DisplayWhiteBalanceFactory { com.android.internal.R.array.config_displayWhiteBalanceDisplayColorTemperatures); final DisplayWhiteBalanceController controller = new DisplayWhiteBalanceController( brightnessSensor, brightnessFilter, colorTemperatureSensor, colorTemperatureFilter, throttler, lowLightAmbientBrightnessThreshold, lowLightAmbientColorTemperature, throttler, displayWhiteBalanceLowLightAmbientBrightnesses, displayWhiteBalanceLowLightAmbientBiases, lowLightAmbientColorTemperature, ambientColorTemperatures, displayColorTempeartures); brightnessSensor.setCallbacks(controller); colorTemperatureSensor.setCallbacks(controller); Loading