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

Commit 5ac36395 authored by Fiona Campbell's avatar Fiona Campbell Committed by Android (Google) Code Review
Browse files

Merge "LowMinBrightness Mappings" into main

parents 64ecdd83 fa91faa0
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ import com.android.internal.display.BrightnessSynchronizer;
import com.android.internal.os.BackgroundThread;
import com.android.server.EventLogTags;
import com.android.server.display.brightness.BrightnessEvent;
import com.android.server.display.brightness.clamper.BrightnessClamperController;

import java.io.PrintWriter;
import java.lang.annotation.Retention;
@@ -252,6 +253,7 @@ public class AutomaticBrightnessController {

    // Controls Brightness range (including High Brightness Mode).
    private final BrightnessRangeController mBrightnessRangeController;
    private final BrightnessClamperController mBrightnessClamperController;

    // Throttles (caps) maximum allowed brightness
    private final BrightnessThrottler mBrightnessThrottler;
@@ -287,7 +289,8 @@ public class AutomaticBrightnessController {
            HysteresisLevels screenBrightnessThresholdsIdle, Context context,
            BrightnessRangeController brightnessModeController,
            BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort,
            int ambientLightHorizonLong, float userLux, float userNits) {
            int ambientLightHorizonLong, float userLux, float userNits,
            BrightnessClamperController brightnessClamperController) {
        this(new Injector(), callbacks, looper, sensorManager, lightSensor,
                brightnessMappingStrategyMap, lightSensorWarmUpTime, brightnessMin, brightnessMax,
                dozeScaleFactor, lightSensorRate, initialLightSensorRate,
@@ -297,7 +300,7 @@ public class AutomaticBrightnessController {
                screenBrightnessThresholds, ambientBrightnessThresholdsIdle,
                screenBrightnessThresholdsIdle, context, brightnessModeController,
                brightnessThrottler, ambientLightHorizonShort, ambientLightHorizonLong, userLux,
                userNits
                userNits, brightnessClamperController
        );
    }

@@ -313,9 +316,10 @@ public class AutomaticBrightnessController {
            HysteresisLevels screenBrightnessThresholds,
            HysteresisLevels ambientBrightnessThresholdsIdle,
            HysteresisLevels screenBrightnessThresholdsIdle, Context context,
            BrightnessRangeController brightnessModeController,
            BrightnessRangeController brightnessRangeController,
            BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort,
            int ambientLightHorizonLong, float userLux, float userNits) {
            int ambientLightHorizonLong, float userLux, float userNits,
            BrightnessClamperController brightnessClamperController) {
        mInjector = injector;
        mClock = injector.createClock();
        mContext = context;
@@ -358,7 +362,8 @@ public class AutomaticBrightnessController {
        mPendingForegroundAppPackageName = null;
        mForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED;
        mPendingForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED;
        mBrightnessRangeController = brightnessModeController;
        mBrightnessRangeController = brightnessRangeController;
        mBrightnessClamperController = brightnessClamperController;
        mBrightnessThrottler = brightnessThrottler;
        mBrightnessMappingStrategyMap = brightnessMappingStrategyMap;

@@ -791,7 +796,7 @@ public class AutomaticBrightnessController {
                    mAmbientBrightnessThresholds.getDarkeningThreshold(lux);
        }
        mBrightnessRangeController.onAmbientLuxChange(mAmbientLux);

        mBrightnessClamperController.onAmbientLuxChange(mAmbientLux);

        // If the short term model was invalidated and the change is drastic enough, reset it.
        mShortTermModel.maybeReset(mAmbientLux);
+51 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ import com.android.server.display.config.IdleScreenRefreshRateTimeout;
import com.android.server.display.config.IdleScreenRefreshRateTimeoutLuxThresholdPoint;
import com.android.server.display.config.IdleScreenRefreshRateTimeoutLuxThresholds;
import com.android.server.display.config.IntegerArray;
import com.android.server.display.config.LowBrightnessData;
import com.android.server.display.config.LuxThrottling;
import com.android.server.display.config.NitsMap;
import com.android.server.display.config.NonNegativeFloatToFloatPoint;
@@ -555,6 +556,24 @@ import javax.xml.datatype.DatatypeConfigurationException;
 *         <majorVersion>2</majorVersion>
 *         <minorVersion>0</minorVersion>
 *     </usiVersion>
 *     <lowBrightness enabled="true">
 *       <transitionPoint>0.1</transitionPoint>
 *
 *       <nits>0.2</nits>
 *       <nits>2.0</nits>
 *       <nits>500.0</nits>
 *       <nits>1000.0</nits>
 *
 *       <backlight>0</backlight>
 *       <backlight>0.0001</backlight>
 *       <backlight>0.5</backlight>
 *       <backlight>1.0</backlight>
 *
 *       <brightness>0</brightness>
 *       <brightness>0.1</brightness>
 *       <brightness>0.5</brightness>
 *       <brightness>1.0</brightness>
 *     </lowBrightness>
 *     <screenBrightnessCapForWearBedtimeMode>0.1</screenBrightnessCapForWearBedtimeMode>
 *     <idleScreenRefreshRateTimeout>
 *          <luxThresholds>
@@ -568,6 +587,8 @@ import javax.xml.datatype.DatatypeConfigurationException;
 *              </point>
 *          </luxThresholds>
 *     </idleScreenRefreshRateTimeout>
 *
 *
 *    </displayConfiguration>
 *  }
 *  </pre>
@@ -732,6 +753,7 @@ public class DisplayDeviceConfig {
    private Spline mBacklightToBrightnessSpline;
    private Spline mBacklightToNitsSpline;
    private Spline mNitsToBacklightSpline;

    private List<String> mQuirks;
    private boolean mIsHighBrightnessModeEnabled = false;
    private HighBrightnessModeData mHbmData;
@@ -872,6 +894,9 @@ public class DisplayDeviceConfig {
    @Nullable
    private HdrBrightnessData mHdrBrightnessData;

    @Nullable
    public LowBrightnessData mLowBrightnessData;

    /**
     * Maximum screen brightness setting when screen brightness capped in Wear Bedtime mode.
     */
@@ -1813,6 +1838,15 @@ public class DisplayDeviceConfig {
        return mHostUsiVersion;
    }

    /**
     *
     * @return true if low brightness mode is enabled
     */
    @VisibleForTesting
    public boolean getLbmEnabled() {
        return mLowBrightnessData != null;
    }

    /**
     * @return Maximum screen brightness setting when screen brightness capped in Wear Bedtime mode.
     */
@@ -1952,6 +1986,8 @@ public class DisplayDeviceConfig {
                + "mUsiVersion= " + mHostUsiVersion + "\n"
                + "mHdrBrightnessData= " + mHdrBrightnessData + "\n"
                + "mBrightnessCapForWearBedtimeMode= " + mBrightnessCapForWearBedtimeMode
                + "\n"
                + (mLowBrightnessData != null ? mLowBrightnessData.toString() : "")
                + "}";
    }

@@ -2002,6 +2038,9 @@ public class DisplayDeviceConfig {
                loadDensityMapping(config);
                loadBrightnessDefaultFromDdcXml(config);
                loadBrightnessConstraintsFromConfigXml();
                if (mFlags.isEvenDimmerEnabled()) {
                    mLowBrightnessData = LowBrightnessData.loadConfig(config);
                }
                loadBrightnessMap(config);
                loadThermalThrottlingConfig(config);
                loadPowerThrottlingConfigData(config);
@@ -2793,6 +2832,18 @@ public class DisplayDeviceConfig {
    // These splines are used to convert from the system brightness value to the HAL backlight
    // value
    private void createBacklightConversionSplines() {
        if (mLowBrightnessData != null) {
            mBrightnessToBacklightSpline = mLowBrightnessData.mBrightnessToBacklight;
            mBacklightToBrightnessSpline = mLowBrightnessData.mBacklightToBrightness;
            mBacklightToNitsSpline = mLowBrightnessData.mBacklightToNits;
            mNitsToBacklightSpline = mLowBrightnessData.mNitsToBacklight;

            mNits = mLowBrightnessData.mNits;
            mBrightness = mLowBrightnessData.mBrightness;
            mBacklight = mLowBrightnessData.mBacklight;
            return;
        }

        mBrightness = new float[mBacklight.length];
        for (int i = 0; i < mBrightness.length; i++) {
            mBrightness[i] = MathUtils.map(mBacklight[0],
+7 −3
Original line number Diff line number Diff line
@@ -1165,7 +1165,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                    screenBrightnessThresholds, ambientBrightnessThresholdsIdle,
                    screenBrightnessThresholdsIdle, mContext, mBrightnessRangeController,
                    mBrightnessThrottler, mDisplayDeviceConfig.getAmbientHorizonShort(),
                    mDisplayDeviceConfig.getAmbientHorizonLong(), userLux, userNits);
                    mDisplayDeviceConfig.getAmbientHorizonLong(), userLux, userNits,
                    mBrightnessClamperController);
            mDisplayBrightnessController.setAutomaticBrightnessController(
                    mAutomaticBrightnessController);

@@ -2479,6 +2480,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
    public void setBrightnessToFollow(float leadDisplayBrightness, float nits, float ambientLux,
            boolean slowChange) {
        mBrightnessRangeController.onAmbientLuxChange(ambientLux);
        mBrightnessClamperController.onAmbientLuxChange(ambientLux);
        if (nits == BrightnessMappingStrategy.INVALID_NITS) {
            mDisplayBrightnessController.setBrightnessToFollow(leadDisplayBrightness, slowChange);
        } else {
@@ -3176,7 +3178,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                HysteresisLevels screenBrightnessThresholdsIdle, Context context,
                BrightnessRangeController brightnessModeController,
                BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort,
                int ambientLightHorizonLong, float userLux, float userNits) {
                int ambientLightHorizonLong, float userLux, float userNits,
                BrightnessClamperController brightnessClamperController) {

            return new AutomaticBrightnessController(callbacks, looper, sensorManager, lightSensor,
                    brightnessMappingStrategyMap, lightSensorWarmUpTime, brightnessMin,
                    brightnessMax, dozeScaleFactor, lightSensorRate, initialLightSensorRate,
@@ -3186,7 +3190,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                    screenBrightnessThresholds, ambientBrightnessThresholdsIdle,
                    screenBrightnessThresholdsIdle, context, brightnessModeController,
                    brightnessThrottler, ambientLightHorizonShort, ambientLightHorizonLong, userLux,
                    userNits);
                    userNits, brightnessClamperController);
        }

        BrightnessMappingStrategy getDefaultModeBrightnessMapper(Context context,
+30 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.os.SystemProperties;
import android.os.Trace;
import android.util.DisplayUtils;
import android.util.LongSparseArray;
import android.util.MathUtils;
import android.util.Slog;
import android.util.SparseArray;
import android.view.Display;
@@ -78,6 +79,13 @@ final class LocalDisplayAdapter extends DisplayAdapter {
    private static final String UNIQUE_ID_PREFIX = "local:";

    private static final String PROPERTY_EMULATOR_CIRCULAR = "ro.boot.emulator.circular";
    // Min and max strengths for even dimmer feature.
    private static final float EVEN_DIMMER_MIN_STRENGTH = 0.0f;
    private static final float EVEN_DIMMER_MAX_STRENGTH = 70.0f; // not too dim yet.
    private static final float BRIGHTNESS_MIN = 0.0f;
    // The brightness at which we start using color matrices rather than backlight,
    // to dim the display
    private static final float BACKLIGHT_COLOR_TRANSITION_POINT = 0.1f;

    private final LongSparseArray<LocalDisplayDevice> mDevices = new LongSparseArray<>();

@@ -91,6 +99,8 @@ final class LocalDisplayAdapter extends DisplayAdapter {

    private Context mOverlayContext;

    private int mEvenDimmerStrength = -1;

    // Called with SyncRoot lock held.
    LocalDisplayAdapter(DisplayManagerService.SyncRoot syncRoot, Context context,
            Handler handler, Listener listener, DisplayManagerFlags flags,
@@ -928,6 +938,10 @@ final class LocalDisplayAdapter extends DisplayAdapter {
                            final float nits = backlightToNits(backlight);
                            final float sdrNits = backlightToNits(sdrBacklight);

                            if (getFeatureFlags().isEvenDimmerEnabled()) {
                                applyColorMatrixBasedDimming(brightnessState);
                            }

                            mBacklightAdapter.setBacklight(sdrBacklight, sdrNits, backlight, nits);
                            Trace.traceCounter(Trace.TRACE_TAG_POWER,
                                    "ScreenBrightness",
@@ -974,6 +988,22 @@ final class LocalDisplayAdapter extends DisplayAdapter {
                            }
                        }
                    }

                    private void applyColorMatrixBasedDimming(float brightnessState) {
                        int strength = (int) (MathUtils.constrainedMap(
                                EVEN_DIMMER_MAX_STRENGTH, EVEN_DIMMER_MIN_STRENGTH, // to this range
                                BRIGHTNESS_MIN, BACKLIGHT_COLOR_TRANSITION_POINT, // from this range
                                brightnessState) + 0.5); // map this (+ rounded up)

                        if (mEvenDimmerStrength < 0 // uninitialised
                                || MathUtils.abs(mEvenDimmerStrength - strength) > 1
                                || strength <= 1) {
                            mEvenDimmerStrength = strength;
                        }

                        // TODO: use `enabled` and `mRbcStrength` to set color matrices here
                        // TODO: boolean enabled = mEvenDimmerStrength > 0.0f;
                    }
                };
            }
            return null;
+7 −0
Original line number Diff line number Diff line
@@ -189,6 +189,13 @@ public class BrightnessClamperController {
        mModifiers.forEach(BrightnessStateModifier::stop);
    }

    /**
     * Notifies modifiers that ambient lux has changed.
     * @param ambientLux current lux, debounced
     */
    public void onAmbientLuxChange(float ambientLux) {
        mModifiers.forEach(modifier -> modifier.onAmbientLuxChange(ambientLux));
    }

    // Called in DisplayControllerHandler
    private void recalculateBrightnessCap() {
Loading