Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e62097f1 authored by Danny Baumann's avatar Danny Baumann Committed by Steve Kondik
Browse files

Increase brightness faster if ambient light is brightening quickly.

The point of doing this is when going from indoors to bright sunlight,
the brightness adjustment currently leaves one with looking at an
unreadable display for a couple of seconds. Increase responsiveness in
that scenario to ramp up brightness faster.

Change-Id: Idf8ca8ebcdcea06746b0c4f3ab94d2ddddafb32e
parent e3575760
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -115,6 +115,9 @@
    <!-- PlatLogo -->
    <!-- PlatLogo -->
    <java-symbol type="drawable" name="platlogo_cm" />
    <java-symbol type="drawable" name="platlogo_cm" />


    <!-- Automatic brightness enhancements -->
    <java-symbol type="integer" name="config_autoBrightnessBrighteningLightFastDebounce"/>

    <!-- LiveDisplay -->
    <!-- LiveDisplay -->
    <java-symbol type="string" name="live_display_title" />
    <java-symbol type="string" name="live_display_title" />
    <java-symbol type="string" name="live_display_hint" />
    <java-symbol type="string" name="live_display_hint" />
+1 −0
Original line number Original line Diff line number Diff line
@@ -1061,6 +1061,7 @@
         when adapting to brighter or darker environments.  This parameter controls how quickly
         when adapting to brighter or darker environments.  This parameter controls how quickly
         brightness changes occur in response to an observed change in light level that exceeds the
         brightness changes occur in response to an observed change in light level that exceeds the
         hysteresis threshold. -->
         hysteresis threshold. -->
    <integer name="config_autoBrightnessBrighteningLightFastDebounce">500</integer>
    <integer name="config_autoBrightnessBrighteningLightDebounce">4000</integer>
    <integer name="config_autoBrightnessBrighteningLightDebounce">4000</integer>
    <integer name="config_autoBrightnessDarkeningLightDebounce">8000</integer>
    <integer name="config_autoBrightnessDarkeningLightDebounce">8000</integer>


+22 −9
Original line number Original line Diff line number Diff line
@@ -61,6 +61,11 @@ class AutomaticBrightnessController {
    private static final float BRIGHTENING_LIGHT_HYSTERESIS = 0.10f;
    private static final float BRIGHTENING_LIGHT_HYSTERESIS = 0.10f;
    private static final float DARKENING_LIGHT_HYSTERESIS = 0.20f;
    private static final float DARKENING_LIGHT_HYSTERESIS = 0.20f;


    // Threshold (in lux) to select between normal and fast debounce time.
    // If the difference between last sample and weighted value is larger than this value,
    // fast debounce is used.
    private static final float BRIGHTENING_FAST_THRESHOLD = 1000f;

    // How long the current sensor reading is assumed to be valid beyond the current time.
    // How long the current sensor reading is assumed to be valid beyond the current time.
    // This provides a bit of prediction, as well as ensures that the weight for the last sample is
    // This provides a bit of prediction, as well as ensures that the weight for the last sample is
    // non-zero, which in turn ensures that the total weight is non-zero.
    // non-zero, which in turn ensures that the total weight is non-zero.
@@ -119,6 +124,7 @@ class AutomaticBrightnessController {
    // when adapting to brighter or darker environments.  This parameter controls how quickly
    // when adapting to brighter or darker environments.  This parameter controls how quickly
    // brightness changes occur in response to an observed change in light level that exceeds the
    // brightness changes occur in response to an observed change in light level that exceeds the
    // hysteresis threshold.
    // hysteresis threshold.
    private final long mBrighteningLightFastDebounceConfig;
    private final long mBrighteningLightDebounceConfig;
    private final long mBrighteningLightDebounceConfig;
    private final long mDarkeningLightDebounceConfig;
    private final long mDarkeningLightDebounceConfig;


@@ -204,7 +210,8 @@ class AutomaticBrightnessController {
            SensorManager sensorManager, Spline autoBrightnessSpline, int lightSensorWarmUpTime,
            SensorManager sensorManager, Spline autoBrightnessSpline, int lightSensorWarmUpTime,
            int brightnessMin, int brightnessMax, float dozeScaleFactor,
            int brightnessMin, int brightnessMax, float dozeScaleFactor,
            int lightSensorRate, long brighteningLightDebounceConfig,
            int lightSensorRate, long brighteningLightDebounceConfig,
            long darkeningLightDebounceConfig, boolean resetAmbientLuxAfterWarmUpConfig,
            long brighteningLightFastDebounceConfig, long darkeningLightDebounceConfig,
            boolean resetAmbientLuxAfterWarmUpConfig,
            int ambientLightHorizon, LiveDisplayController ldc) {
            int ambientLightHorizon, LiveDisplayController ldc) {
        mContext = context;
        mContext = context;
        mCallbacks = callbacks;
        mCallbacks = callbacks;
@@ -217,6 +224,7 @@ class AutomaticBrightnessController {
        mDozeScaleFactor = dozeScaleFactor;
        mDozeScaleFactor = dozeScaleFactor;
        mLightSensorRate = lightSensorRate;
        mLightSensorRate = lightSensorRate;
        mBrighteningLightDebounceConfig = brighteningLightDebounceConfig;
        mBrighteningLightDebounceConfig = brighteningLightDebounceConfig;
        mBrighteningLightFastDebounceConfig = brighteningLightFastDebounceConfig;
        mDarkeningLightDebounceConfig = darkeningLightDebounceConfig;
        mDarkeningLightDebounceConfig = darkeningLightDebounceConfig;
        mResetAmbientLuxAfterWarmUpConfig = resetAmbientLuxAfterWarmUpConfig;
        mResetAmbientLuxAfterWarmUpConfig = resetAmbientLuxAfterWarmUpConfig;
        mLiveDisplay = ldc;
        mLiveDisplay = ldc;
@@ -268,6 +276,7 @@ class AutomaticBrightnessController {
        pw.println("  mScreenBrightnessRangeMaximum=" + mScreenBrightnessRangeMaximum);
        pw.println("  mScreenBrightnessRangeMaximum=" + mScreenBrightnessRangeMaximum);
        pw.println("  mLightSensorWarmUpTimeConfig=" + mLightSensorWarmUpTimeConfig);
        pw.println("  mLightSensorWarmUpTimeConfig=" + mLightSensorWarmUpTimeConfig);
        pw.println("  mBrighteningLightDebounceConfig=" + mBrighteningLightDebounceConfig);
        pw.println("  mBrighteningLightDebounceConfig=" + mBrighteningLightDebounceConfig);
        pw.println("  mBrighteningLightFastDebounceConfig=" + mBrighteningLightFastDebounceConfig);
        pw.println("  mDarkeningLightDebounceConfig=" + mDarkeningLightDebounceConfig);
        pw.println("  mDarkeningLightDebounceConfig=" + mDarkeningLightDebounceConfig);
        pw.println("  mResetAmbientLuxAfterWarmUpConfig=" + mResetAmbientLuxAfterWarmUpConfig);
        pw.println("  mResetAmbientLuxAfterWarmUpConfig=" + mResetAmbientLuxAfterWarmUpConfig);


@@ -315,6 +324,7 @@ class AutomaticBrightnessController {
    private void handleLightSensorEvent(long time, float lux) {
    private void handleLightSensorEvent(long time, float lux) {
        mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX);
        mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX);


        if (DEBUG) Slog.d(TAG, "handleLightSensorEvent: time=" + time + ", lux=" + lux);
        applyLightSensorMeasurement(time, lux);
        applyLightSensorMeasurement(time, lux);
        updateAmbientLux(time);
        updateAmbientLux(time);
    }
    }
@@ -382,7 +392,7 @@ class AutomaticBrightnessController {
        return x * (x * 0.5f + mWeightingIntercept);
        return x * (x * 0.5f + mWeightingIntercept);
    }
    }


    private long nextAmbientLightBrighteningTransition(long time) {
    private long nextAmbientLightBrighteningTransition(long time, float ambientLux) {
        final int N = mAmbientLightRingBuffer.size();
        final int N = mAmbientLightRingBuffer.size();
        long earliestValidTime = time;
        long earliestValidTime = time;
        for (int i = N - 1; i >= 0; i--) {
        for (int i = N - 1; i >= 0; i--) {
@@ -391,10 +401,13 @@ class AutomaticBrightnessController {
            }
            }
            earliestValidTime = mAmbientLightRingBuffer.getTime(i);
            earliestValidTime = mAmbientLightRingBuffer.getTime(i);
        }
        }
        return earliestValidTime + mBrighteningLightDebounceConfig;

        long debounceDelay = mLastObservedLux - ambientLux > BRIGHTENING_FAST_THRESHOLD
                ? mBrighteningLightFastDebounceConfig : mBrighteningLightDebounceConfig;
        return earliestValidTime + debounceDelay;
    }
    }


    private long nextAmbientLightDarkeningTransition(long time) {
    private long nextAmbientLightDarkeningTransition(long time, float ambientLux) {
        final int N = mAmbientLightRingBuffer.size();
        final int N = mAmbientLightRingBuffer.size();
        long earliestValidTime = time;
        long earliestValidTime = time;
        for (int i = N - 1; i >= 0; i--) {
        for (int i = N - 1; i >= 0; i--) {
@@ -438,13 +451,12 @@ class AutomaticBrightnessController {
            updateAutoBrightness(true);
            updateAutoBrightness(true);
        }
        }


        long nextBrightenTransition = nextAmbientLightBrighteningTransition(time);
        long nextDarkenTransition = nextAmbientLightDarkeningTransition(time);
        float ambientLux = calculateAmbientLux(time);
        float ambientLux = calculateAmbientLux(time);
        long nextBrightenTransition = nextAmbientLightBrighteningTransition(time, ambientLux);
        long nextDarkenTransition = nextAmbientLightDarkeningTransition(time, ambientLux);


        if (ambientLux >= mBrighteningLuxThreshold && nextBrightenTransition <= time
        if (ambientLux >= mBrighteningLuxThreshold && nextBrightenTransition <= time
                || ambientLux <= mDarkeningLuxThreshold && nextDarkenTransition <= time) {
                || ambientLux <= mDarkeningLuxThreshold && nextDarkenTransition <= time) {
            setAmbientLux(ambientLux);
            if (DEBUG) {
            if (DEBUG) {
                Slog.d(TAG, "updateAmbientLux: "
                Slog.d(TAG, "updateAmbientLux: "
                        + ((ambientLux > mAmbientLux) ? "Brightened" : "Darkened") + ": "
                        + ((ambientLux > mAmbientLux) ? "Brightened" : "Darkened") + ": "
@@ -452,9 +464,10 @@ class AutomaticBrightnessController {
                        + ", mAmbientLightRingBuffer=" + mAmbientLightRingBuffer
                        + ", mAmbientLightRingBuffer=" + mAmbientLightRingBuffer
                        + ", mAmbientLux=" + mAmbientLux);
                        + ", mAmbientLux=" + mAmbientLux);
            }
            }
            setAmbientLux(ambientLux);
            updateAutoBrightness(true);
            updateAutoBrightness(true);
            nextBrightenTransition = nextAmbientLightBrighteningTransition(time);
            nextBrightenTransition = nextAmbientLightBrighteningTransition(time, ambientLux);
            nextDarkenTransition = nextAmbientLightDarkeningTransition(time);
            nextDarkenTransition = nextAmbientLightDarkeningTransition(time, ambientLux);
        }
        }
        long nextTransitionTime = Math.min(nextDarkenTransition, nextBrightenTransition);
        long nextTransitionTime = Math.min(nextDarkenTransition, nextBrightenTransition);
        // If one of the transitions is ready to occur, but the total weighted ambient lux doesn't
        // If one of the transitions is ready to occur, but the total weighted ambient lux doesn't
+5 −3
Original line number Original line Diff line number Diff line
@@ -317,6 +317,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                com.android.internal.R.integer.config_autoBrightnessLightSensorRate);
                com.android.internal.R.integer.config_autoBrightnessLightSensorRate);
        long brighteningLightDebounce = resources.getInteger(
        long brighteningLightDebounce = resources.getInteger(
                com.android.internal.R.integer.config_autoBrightnessBrighteningLightDebounce);
                com.android.internal.R.integer.config_autoBrightnessBrighteningLightDebounce);
        long brighteningLightFastDebounce = resources.getInteger(
                com.android.internal.R.integer.config_autoBrightnessBrighteningLightFastDebounce);
        long darkeningLightDebounce = resources.getInteger(
        long darkeningLightDebounce = resources.getInteger(
                com.android.internal.R.integer.config_autoBrightnessDarkeningLightDebounce);
                com.android.internal.R.integer.config_autoBrightnessDarkeningLightDebounce);
        boolean autoBrightnessResetAmbientLuxAfterWarmUp = resources.getBoolean(
        boolean autoBrightnessResetAmbientLuxAfterWarmUp = resources.getBoolean(
@@ -359,9 +361,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                        handler.getLooper(), sensorManager, screenAutoBrightnessSpline,
                        handler.getLooper(), sensorManager, screenAutoBrightnessSpline,
                        lightSensorWarmUpTimeConfig, screenBrightnessRangeMinimum,
                        lightSensorWarmUpTimeConfig, screenBrightnessRangeMinimum,
                        mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate,
                        mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate,
                        brighteningLightDebounce, darkeningLightDebounce,
                        brighteningLightDebounce, brighteningLightFastDebounce,
                        autoBrightnessResetAmbientLuxAfterWarmUp, ambientLightHorizon,
                        darkeningLightDebounce, autoBrightnessResetAmbientLuxAfterWarmUp,
                        mLiveDisplayController);
                        ambientLightHorizon, mLiveDisplayController);
            }
            }
        }
        }