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

Commit 53a504df authored by Fiona Campbell's avatar Fiona Campbell
Browse files

Add transition point to low lux modifier

- Add transition point to brightness low lux modifier
- Pass in nits -> brightness splines from ddc.
- Only activate even dimmer if autobrightness is on.

Bug: 179428400
Test: atest DisplayServiceTests
Change-Id: I37c2ddca6c111c11b90525222d22a77ccfd3665f
parent 960937f0
Loading
Loading
Loading
Loading
+42 −4
Original line number Diff line number Diff line
@@ -1097,13 +1097,34 @@ public class DisplayDeviceConfig {
        return mBrightnessToBacklightSpline.interpolate(brightness);
    }

    private float getBrightnessFromBacklight(float brightness) {
    /**
     * Calculates the screen brightness value - as used among the system from the HAL backlight
     * level
     * @param backlight value from 0-1 HAL scale
     * @return brightness value from 0-1 framework scale
     */
    public float getBrightnessFromBacklight(float backlight) {
        if (mLowBrightnessData != null) {
            return mLowBrightnessData.mBacklightToBrightness.interpolate(brightness);
            return mLowBrightnessData.mBacklightToBrightness.interpolate(backlight);
        }
        return mBacklightToBrightnessSpline.interpolate(brightness);
        return mBacklightToBrightnessSpline.interpolate(backlight);
    }

    /**
     *
     * @return low brightness mode transition point
     */
    public float getLowBrightnessTransitionPoint() {
        if (mLowBrightnessData == null) {
            return PowerManager.BRIGHTNESS_MIN;
        }
        return mLowBrightnessData.mTransitionPoint;
    }

    /**
     *
     * @return HAL backlight mapping to framework brightness
     */
    private Spline getBacklightToBrightnessSpline() {
        if (mLowBrightnessData != null) {
            return mLowBrightnessData.mBacklightToBrightness;
@@ -1133,7 +1154,12 @@ public class DisplayDeviceConfig {
        return mBacklightToNitsSpline.interpolate(backlight);
    }

    private float getBacklightFromNits(float nits) {
    /**
     *
     * @param nits - display brightness
     * @return corresponding HAL backlight value
     */
    public float getBacklightFromNits(float nits) {
        if (mLowBrightnessData != null) {
            return mLowBrightnessData.mNitsToBacklight.interpolate(nits);
        }
@@ -1147,6 +1173,18 @@ public class DisplayDeviceConfig {
        return mNitsToBacklightSpline;
    }

    /**
     *
     * @param lux - ambient brightness
     * @return minimum allowed nits, given the lux.
     */
    public float getMinNitsFromLux(float lux) {
        if (mLowBrightnessData == null) {
            return INVALID_NITS;
        }
        return mLowBrightnessData.mMinLuxToNits.interpolate(lux);
    }

    /**
     * @return true if there is sdrHdrRatioMap, false otherwise.
     */
+5 −3
Original line number Diff line number Diff line
@@ -1426,12 +1426,14 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                && (mAutomaticBrightnessStrategy.getAutoBrightnessAdjustmentChanged()
                || userSetBrightnessChanged);

        mBrightnessRangeController.setAutoBrightnessEnabled(
                mAutomaticBrightnessStrategy.isAutoBrightnessEnabled()
        final int autoBrightnessState = mAutomaticBrightnessStrategy.isAutoBrightnessEnabled()
                ? AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED
                : mAutomaticBrightnessStrategy.isAutoBrightnessDisabledDueToDisplayOff()
                        ? AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE
                        : AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED);
                        : AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED;

        mBrightnessRangeController.setAutoBrightnessEnabled(autoBrightnessState);
        mBrightnessClamperController.setAutoBrightnessState(autoBrightnessState);

        boolean updateScreenBrightnessSetting =
                displayBrightnessState.shouldUpdateScreenBrightnessSetting();
+20 −3
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ public class BrightnessClamperController {
    private float mCustomAnimationRate = DisplayBrightnessState.CUSTOM_ANIMATION_RATE_NOT_SET;
    @Nullable
    private Type mClamperType = null;
    private int mAutoBrightnessState = -1;

    private boolean mClamperApplied = false;

@@ -94,7 +95,8 @@ public class BrightnessClamperController {

        mClampers = injector.getClampers(handler, clamperChangeListenerInternal, data, flags,
                context);
        mModifiers = injector.getModifiers(flags, context, handler, clamperChangeListener);
        mModifiers = injector.getModifiers(flags, context, handler, clamperChangeListener,
                data.mDisplayDeviceConfig);
        mOnPropertiesChangedListener =
                properties -> mClampers.forEach(BrightnessClamper::onDeviceConfigChanged);
        start();
@@ -197,6 +199,19 @@ public class BrightnessClamperController {
        mModifiers.forEach(modifier -> modifier.onAmbientLuxChange(ambientLux));
    }

    /**
     * Sets the autobrightness state for clampers that need to be aware of the state.
     * @param state autobrightness state
     */
    public void setAutoBrightnessState(int state) {
        if (state == mAutoBrightnessState) {
            return;
        }
        mModifiers.forEach(modifier -> modifier.setAutoBrightnessState(state));
        mAutoBrightnessState = state;
        recalculateBrightnessCap();
    }

    // Called in DisplayControllerHandler
    private void recalculateBrightnessCap() {
        float brightnessCap = PowerManager.BRIGHTNESS_MAX;
@@ -265,12 +280,14 @@ public class BrightnessClamperController {
        }

        List<BrightnessStateModifier> getModifiers(DisplayManagerFlags flags, Context context,
                Handler handler, ClamperChangeListener listener) {
                Handler handler, ClamperChangeListener listener,
                DisplayDeviceConfig displayDeviceConfig) {
            List<BrightnessStateModifier> modifiers = new ArrayList<>();
            modifiers.add(new DisplayDimModifier(context));
            modifiers.add(new BrightnessLowPowerModeModifier());
            if (flags.isEvenDimmerEnabled()) {
                modifiers.add(new BrightnessLowLuxModifier(handler, listener, context));
                modifiers.add(new BrightnessLowLuxModifier(handler, listener, context,
                        displayDeviceConfig));
            }
            return modifiers;
        }
+49 −25
Original line number Diff line number Diff line
@@ -16,13 +16,14 @@

package com.android.server.display.brightness.clamper;

import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED;

import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.hardware.display.DisplayManagerInternal;
import android.net.Uri;
import android.os.Handler;
import android.os.PowerManager;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.Slog;
@@ -30,6 +31,7 @@ import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.display.BrightnessSynchronizer;
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.DisplayDeviceConfig;
import com.android.server.display.brightness.BrightnessReason;
import com.android.server.display.utils.DebugUtils;

@@ -45,19 +47,23 @@ public class BrightnessLowLuxModifier extends BrightnessModifier {
    // 'adb shell setprop persist.log.tag.BrightnessLowLuxModifier DEBUG && adb reboot'
    private static final String TAG = "BrightnessLowLuxModifier";
    private static final boolean DEBUG = DebugUtils.isDebuggable(TAG);
    private static final float MIN_NITS = 2.0f;
    private static final float MIN_NITS_DEFAULT = 0.2f;
    private final SettingsObserver mSettingsObserver;
    private final ContentResolver mContentResolver;
    private final Handler mHandler;
    private final BrightnessClamperController.ClamperChangeListener mChangeListener;
    private int mReason;
    private float mBrightnessLowerBound;
    private float mMinNitsAllowed;
    private boolean mIsActive;
    private boolean mAutoBrightnessEnabled;
    private float mAmbientLux;
    private final DisplayDeviceConfig mDisplayDeviceConfig;

    @VisibleForTesting
    BrightnessLowLuxModifier(Handler handler,
            BrightnessClamperController.ClamperChangeListener listener, Context context) {
            BrightnessClamperController.ClamperChangeListener listener, Context context,
            DisplayDeviceConfig displayDeviceConfig) {
        super();

        mChangeListener = listener;
@@ -67,6 +73,8 @@ public class BrightnessLowLuxModifier extends BrightnessModifier {
        mHandler.post(() -> {
            start();
        });

        mDisplayDeviceConfig = displayDeviceConfig;
    }

    /**
@@ -78,41 +86,45 @@ public class BrightnessLowLuxModifier extends BrightnessModifier {
        int userId = UserHandle.USER_CURRENT;
        float settingNitsLowerBound = Settings.Secure.getFloatForUser(
                mContentResolver, Settings.Secure.EVEN_DIMMER_MIN_NITS,
                /* def= */ MIN_NITS, userId);
                /* def= */ MIN_NITS_DEFAULT, userId);

        boolean isActive = Settings.Secure.getFloatForUser(mContentResolver,
                Settings.Secure.EVEN_DIMMER_ACTIVATED,
                /* def= */ 0, userId) == 1.0f;
                /* def= */ 0, userId) == 1.0f && mAutoBrightnessEnabled;

        // TODO: luxBasedNitsLowerBound = mMinLuxToNitsSpline(currentLux);
        float luxBasedNitsLowerBound = 2.0f;
        float luxBasedNitsLowerBound = mDisplayDeviceConfig.getMinNitsFromLux(mAmbientLux);

        final float nitsLowerBound = isActive ? Math.max(settingNitsLowerBound,
                 luxBasedNitsLowerBound) : MIN_NITS;
        final int reason;
        float minNitsAllowed = -1f; // undefined, if setting is off.
        final float minBrightnessAllowed;

        final int reason = settingNitsLowerBound > luxBasedNitsLowerBound
        if (isActive) {
            minNitsAllowed = Math.max(settingNitsLowerBound,
                    luxBasedNitsLowerBound);
            minBrightnessAllowed = getBrightnessFromNits(minNitsAllowed);
            reason = settingNitsLowerBound > luxBasedNitsLowerBound
                    ? BrightnessReason.MODIFIER_MIN_USER_SET_LOWER_BOUND
                    : BrightnessReason.MODIFIER_MIN_LUX;
        } else {
            minBrightnessAllowed = mDisplayDeviceConfig.getLowBrightnessTransitionPoint();
            reason = 0;
        }

        // TODO: brightnessLowerBound = nitsToBrightnessSpline(nitsLowerBound);
        final float brightnessLowerBound = PowerManager.BRIGHTNESS_MIN;

        if (mBrightnessLowerBound != brightnessLowerBound
        if (mBrightnessLowerBound != minBrightnessAllowed
                || mReason != reason
                || mIsActive != isActive) {
            mIsActive = isActive;
            mReason = reason;
            if (DEBUG) {
                Slog.i(TAG, "isActive: " + isActive
                        + ", brightnessLowerBound: " + brightnessLowerBound
                        + ", minBrightnessAllowed: " + minBrightnessAllowed
                        + ", mAmbientLux: " + mAmbientLux
                        + ", mReason: " + (
                        mReason == BrightnessReason.MODIFIER_MIN_USER_SET_LOWER_BOUND ? "minSetting"
                                : "lux")
                        + ", nitsLowerBound: " + nitsLowerBound
                        + ", mReason: " + (mReason)
                        + ", minNitsAllowed: " + minNitsAllowed
                );
            }
            mBrightnessLowerBound = brightnessLowerBound;
            mMinNitsAllowed = minNitsAllowed;
            mBrightnessLowerBound = minBrightnessAllowed;
            mChangeListener.onChanged();
        }
    }
@@ -176,12 +188,24 @@ public class BrightnessLowLuxModifier extends BrightnessModifier {
        recalculateLowerBound();
    }

    @Override
    public void setAutoBrightnessState(int state) {
        mAutoBrightnessEnabled = state == AUTO_BRIGHTNESS_ENABLED;
    }

    @Override
    public void dump(PrintWriter pw) {
        pw.println("BrightnessLowLuxModifier:");
        pw.println("  mIsActive=" + mIsActive);
        pw.println("  mBrightnessLowerBound=" + mBrightnessLowerBound);
        pw.println("  mReason=" + mReason);
        pw.println("  mAmbientLux=" + mAmbientLux);
        pw.println("  mMinNitsAllowed=" + mMinNitsAllowed);
    }

    private float getBrightnessFromNits(float nits) {
        return mDisplayDeviceConfig.getBrightnessFromBacklight(
                mDisplayDeviceConfig.getBacklightFromNits(nits));
    }

    private final class SettingsObserver extends ContentObserver {
+5 −0
Original line number Diff line number Diff line
@@ -73,4 +73,9 @@ abstract class BrightnessModifier implements BrightnessStateModifier {
    public void onAmbientLuxChange(float ambientLux) {
        // do nothing
    }

    @Override
    public void setAutoBrightnessState(int state) {
        // do nothing
    }
}
Loading