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

Commit fa91faa0 authored by Fiona Campbell's avatar Fiona Campbell
Browse files

LowMinBrightness Mappings

- Create lowBrightness data object for ddc to use
- Read in low min brightness splines from ddc
- Call dimming method in LDA

Bug: 179428400
Test: atest DisplayServiceTests
Change-Id: If33d0164c2ca7179cb80c31f4c762e53f70b174c
parent 61977a66
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -53,6 +53,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;
@@ -249,6 +250,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;
@@ -284,7 +286,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,
@@ -294,7 +297,7 @@ public class AutomaticBrightnessController {
                screenBrightnessThresholds, ambientBrightnessThresholdsIdle,
                screenBrightnessThresholdsIdle, context, brightnessModeController,
                brightnessThrottler, ambientLightHorizonShort, ambientLightHorizonLong, userLux,
                userNits
                userNits, brightnessClamperController
        );
    }

@@ -310,9 +313,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;
@@ -355,7 +359,8 @@ public class AutomaticBrightnessController {
        mPendingForegroundAppPackageName = null;
        mForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED;
        mPendingForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED;
        mBrightnessRangeController = brightnessModeController;
        mBrightnessRangeController = brightnessRangeController;
        mBrightnessClamperController = brightnessClamperController;
        mBrightnessThrottler = brightnessThrottler;
        mBrightnessMappingStrategyMap = brightnessMappingStrategyMap;

@@ -787,7 +792,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