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

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

Merge "Add transition point to low lux modifier" into main

parents d1442c12 53a504df
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
@@ -1336,12 +1336,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