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

Commit 37a5f990 authored by Oleg Petšjonkin's avatar Oleg Petšjonkin Committed by Android (Google) Code Review
Browse files

Merge "Enabling BrightnessThermalClamper and cleanup DisplayPowerController2" into main

parents 44bb1fda cceb8706
Loading
Loading
Loading
Loading
+34 −4
Original line number Diff line number Diff line
@@ -29,6 +29,8 @@ import java.util.Objects;
public final class DisplayBrightnessState {
    private final float mBrightness;
    private final float mSdrBrightness;

    private final float mMaxBrightness;
    private final BrightnessReason mBrightnessReason;
    private final String mDisplayBrightnessStrategyName;
    private final boolean mShouldUseAutoBrightness;
@@ -42,6 +44,7 @@ public final class DisplayBrightnessState {
        mDisplayBrightnessStrategyName = builder.getDisplayBrightnessStrategyName();
        mShouldUseAutoBrightness = builder.getShouldUseAutoBrightness();
        mIsSlowChange = builder.isSlowChange();
        mMaxBrightness = builder.getMaxBrightness();
    }

    /**
@@ -87,6 +90,15 @@ public final class DisplayBrightnessState {
        return mIsSlowChange;
    }

    /**
     * @return maximum allowed brightness
     */
    public float getMaxBrightness() {
        return mMaxBrightness;
    }



    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder("DisplayBrightnessState:");
@@ -98,8 +110,8 @@ public final class DisplayBrightnessState {
        stringBuilder.append(getBrightnessReason());
        stringBuilder.append("\n    shouldUseAutoBrightness:");
        stringBuilder.append(getShouldUseAutoBrightness());
        stringBuilder.append("\n    isSlowChange:");
        stringBuilder.append(mIsSlowChange);
        stringBuilder.append("\n    isSlowChange:").append(mIsSlowChange);
        stringBuilder.append("\n    maxBrightness:").append(mMaxBrightness);
        return stringBuilder.toString();
    }

@@ -124,13 +136,14 @@ public final class DisplayBrightnessState {
                && TextUtils.equals(mDisplayBrightnessStrategyName,
                        otherState.getDisplayBrightnessStrategyName())
                && mShouldUseAutoBrightness == otherState.getShouldUseAutoBrightness()
                && mIsSlowChange == otherState.isSlowChange();
                && mIsSlowChange == otherState.isSlowChange()
                && mMaxBrightness == otherState.getMaxBrightness();
    }

    @Override
    public int hashCode() {
        return Objects.hash(mBrightness, mSdrBrightness, mBrightnessReason,
                mShouldUseAutoBrightness, mIsSlowChange);
                mShouldUseAutoBrightness, mIsSlowChange, mMaxBrightness);
    }

    /**
@@ -150,6 +163,7 @@ public final class DisplayBrightnessState {
        private String mDisplayBrightnessStrategyName;
        private boolean mShouldUseAutoBrightness;
        private boolean mIsSlowChange;
        private float mMaxBrightness;

        /**
         * Create a builder starting with the values from the specified {@link
@@ -165,6 +179,7 @@ public final class DisplayBrightnessState {
            builder.setDisplayBrightnessStrategyName(state.getDisplayBrightnessStrategyName());
            builder.setShouldUseAutoBrightness(state.getShouldUseAutoBrightness());
            builder.setIsSlowChange(state.isSlowChange());
            builder.setMaxBrightness(state.getMaxBrightness());
            return builder;
        }

@@ -273,6 +288,21 @@ public final class DisplayBrightnessState {
            return mIsSlowChange;
        }

        /**
         * See {@link DisplayBrightnessState#getMaxBrightness()}.
         */
        public Builder setMaxBrightness(float maxBrightness) {
            this.mMaxBrightness = maxBrightness;
            return this;
        }

        /**
         * See {@link DisplayBrightnessState#getMaxBrightness()}.
         */
        public float getMaxBrightness() {
            return mMaxBrightness;
        }

        /**
         * This is used to construct an immutable DisplayBrightnessState object from its builder
         */
+26 −34
Original line number Diff line number Diff line
@@ -1424,29 +1424,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
        // we broadcast this change through setting.
        final float unthrottledBrightnessState = brightnessState;

        if (mBrightnessThrottler.isThrottled()) {
            mTempBrightnessEvent.setThermalMax(mBrightnessThrottler.getBrightnessCap());
            brightnessState = Math.min(brightnessState, mBrightnessThrottler.getBrightnessCap());
            mBrightnessReasonTemp.addModifier(BrightnessReason.MODIFIER_THROTTLED);
            if (!mAppliedThrottling) {
                // Brightness throttling is needed, so do so quickly.
                // Later, when throttling is removed, we let other mechanisms decide on speed.
                slowChange = false;
            }
            mAppliedThrottling = true;
        } else if (mAppliedThrottling) {
            mAppliedThrottling = false;
        }

        if (updateScreenBrightnessSetting) {
            // Tell the rest of the system about the new brightness in case we had to change it
            // for things like auto-brightness or high-brightness-mode. Note that we do this
            // before applying the low power or dim transformations so that the slider
            // accurately represents the full possible range, even if they range changes what
            // it means in absolute terms.
            mDisplayBrightnessController.updateScreenBrightnessSetting(brightnessState);
        }

        DisplayBrightnessState clampedState = mBrightnessClamperController.clamp(mPowerRequest,
                brightnessState, slowChange);

@@ -1454,13 +1431,23 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
        slowChange = clampedState.isSlowChange();
        mBrightnessReasonTemp.addModifier(clampedState.getBrightnessReason().getModifier());

        if (updateScreenBrightnessSetting) {
            // Tell the rest of the system about the new brightness in case we had to change it
            // for things like auto-brightness or high-brightness-mode. Note that we do this
            // only considering maxBrightness (ignroing brightness modifiers like low power or dim)
            // so that the slider accurately represents the full possible range,
            // even if they range changes what it means in absolute terms.
            mDisplayBrightnessController.updateScreenBrightnessSetting(
                    Math.min(unthrottledBrightnessState, clampedState.getMaxBrightness()));
        }

        // The current brightness to use has been calculated at this point, and HbmController should
        // be notified so that it can accurately calculate HDR or HBM levels. We specifically do it
        // here instead of having HbmController listen to the brightness setting because certain
        // brightness sources (such as an app override) are not saved to the setting, but should be
        // reflected in HBM calculations.
        mBrightnessRangeController.onBrightnessChanged(brightnessState, unthrottledBrightnessState,
                mBrightnessThrottler.getBrightnessMaxReason());
                mBrightnessClamperController.getBrightnessMaxReason());

        // Animate the screen brightness when the screen is on or dozing.
        // Skip the animation when the screen is off or suspended.
@@ -1562,9 +1549,10 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal

            // We save the brightness info *after* the brightness setting has been changed and
            // adjustments made so that the brightness info reflects the latest value.
            brightnessAdjusted = saveBrightnessInfo(getScreenBrightnessSetting(), animateValue);
            brightnessAdjusted = saveBrightnessInfo(getScreenBrightnessSetting(),
                    animateValue, clampedState);
        } else {
            brightnessAdjusted = saveBrightnessInfo(getScreenBrightnessSetting());
            brightnessAdjusted = saveBrightnessInfo(getScreenBrightnessSetting(), clampedState);
        }

        // Only notify if the brightness adjustment is not temporary (i.e. slider has been released)
@@ -1783,17 +1771,21 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
    }

    private boolean saveBrightnessInfo(float brightness) {
        return saveBrightnessInfo(brightness, brightness);
        return saveBrightnessInfo(brightness, /* state= */ null);
    }

    private boolean saveBrightnessInfo(float brightness, @Nullable DisplayBrightnessState state) {
        return saveBrightnessInfo(brightness, brightness, state);
    }

    private boolean saveBrightnessInfo(float brightness, float adjustedBrightness) {
    private boolean saveBrightnessInfo(float brightness, float adjustedBrightness,
            @Nullable DisplayBrightnessState state) {
        synchronized (mCachedBrightnessInfo) {
            float stateMax = state != null ? state.getMaxBrightness() : PowerManager.BRIGHTNESS_MAX;
            final float minBrightness = Math.min(
                    mBrightnessRangeController.getCurrentBrightnessMin(),
                    mBrightnessThrottler.getBrightnessCap());
                    mBrightnessRangeController.getCurrentBrightnessMin(), stateMax);
            final float maxBrightness = Math.min(
                    mBrightnessRangeController.getCurrentBrightnessMax(),
                    mBrightnessThrottler.getBrightnessCap());
                    mBrightnessRangeController.getCurrentBrightnessMax(), stateMax);
            boolean changed = false;

            changed |=
@@ -1816,7 +1808,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
                            mBrightnessRangeController.getTransitionPoint());
            changed |=
                    mCachedBrightnessInfo.checkAndSetInt(mCachedBrightnessInfo.brightnessMaxReason,
                            mBrightnessThrottler.getBrightnessMaxReason());
                            mBrightnessClamperController.getBrightnessMaxReason());

            return changed;
        }
@@ -2669,7 +2661,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
                    event.getHbmMode() == BrightnessInfo.HIGH_BRIGHTNESS_MODE_SUNLIGHT,
                    event.getHbmMode() == BrightnessInfo.HIGH_BRIGHTNESS_MODE_HDR,
                    (modifier & BrightnessReason.MODIFIER_LOW_POWER) > 0,
                    mBrightnessThrottler.getBrightnessMaxReason(),
                    mBrightnessClamperController.getBrightnessMaxReason(),
                    (modifier & BrightnessReason.MODIFIER_DIMMED) > 0,
                    event.isRbcEnabled(),
                    (flags & BrightnessEvent.FLAG_INVALID_LUX) > 0,
+60 −12
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static com.android.server.display.brightness.clamper.BrightnessClamper.Ty
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.hardware.display.BrightnessInfo;
import android.hardware.display.DisplayManagerInternal;
import android.os.Handler;
import android.os.HandlerExecutor;
@@ -28,11 +29,13 @@ import android.os.PowerManager;
import android.provider.DeviceConfig;
import android.provider.DeviceConfigInterface;
import android.util.IndentingPrintWriter;
import android.util.Slog;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.DisplayDeviceConfig;
import com.android.server.display.DisplayDeviceConfig.ThermalBrightnessThrottlingData;
import com.android.server.display.brightness.BrightnessReason;
import com.android.server.display.feature.DeviceConfigParameterProvider;

import java.io.PrintWriter;
@@ -44,22 +47,21 @@ import java.util.concurrent.Executor;
 * Clampers controller, all in DisplayControllerHandler
 */
public class BrightnessClamperController {

    private static final boolean THERMAL_ENABLED = false;
    private static final String TAG = "BrightnessClamperController";

    private final DeviceConfigParameterProvider mDeviceConfigParameterProvider;
    private final Handler mHandler;
    private final ClamperChangeListener mClamperChangeListenerExternal;

    private final Executor mExecutor;
    private final List<BrightnessClamper<? super DisplayDeviceData>> mClampers = new ArrayList<>();
    private final List<BrightnessClamper<? super DisplayDeviceData>> mClampers;

    private final List<BrightnessModifier> mModifiers = new ArrayList<>();
    private final DeviceConfig.OnPropertiesChangedListener mOnPropertiesChangedListener =
            properties -> mClampers.forEach(BrightnessClamper::onDeviceConfigChanged);
    private final List<BrightnessModifier> mModifiers;
    private final DeviceConfig.OnPropertiesChangedListener mOnPropertiesChangedListener;
    private float mBrightnessCap = PowerManager.BRIGHTNESS_MAX;
    @Nullable
    private Type mClamperType = null;
    private boolean mClamperApplied = false;

    public BrightnessClamperController(Handler handler,
            ClamperChangeListener clamperChangeListener, DisplayDeviceData data, Context context) {
@@ -82,12 +84,10 @@ public class BrightnessClamperController {
            }
        };

        if (THERMAL_ENABLED) {
            mClampers.add(
                    new BrightnessThermalClamper(handler, clamperChangeListenerInternal, data));
        }
        mModifiers.add(new DisplayDimModifier(context));
        mModifiers.add(new BrightnessLowPowerModeModifier());
        mClampers = injector.getClampers(handler, clamperChangeListenerInternal, data);
        mModifiers = injector.getModifiers(context);
        mOnPropertiesChangedListener =
                properties -> mClampers.forEach(BrightnessClamper::onDeviceConfigChanged);
        start();
    }

@@ -109,6 +109,17 @@ public class BrightnessClamperController {
        DisplayBrightnessState.Builder builder = DisplayBrightnessState.builder();
        builder.setIsSlowChange(slowChange);
        builder.setBrightness(cappedBrightness);
        builder.setMaxBrightness(mBrightnessCap);

        if (mClamperType != null) {
            builder.getBrightnessReason().addModifier(BrightnessReason.MODIFIER_THROTTLED);
            if (!mClamperApplied) {
                builder.setIsSlowChange(false);
            }
            mClamperApplied = true;
        } else {
            mClamperApplied = false;
        }

        for (int i = 0; i < mModifiers.size(); i++) {
            mModifiers.get(i).apply(request, builder);
@@ -117,6 +128,28 @@ public class BrightnessClamperController {
        return builder.build();
    }

    /**
     * See BrightnessThrottler.getBrightnessMaxReason:
     * used in:
     * 1) DPC2.CachedBrightnessInfo to determine changes
     * 2) DPC2.logBrightnessEvent
     * 3) HBMController - for logging
     * Method is called in mHandler thread (DisplayControllerHandler), in the same thread
     * recalculateBrightnessCap and DPC2.updatePowerStateInternal are called.
     * Should be moved to DisplayBrightnessState OR derived from DisplayBrightnessState
     * TODO: b/263362199
     */
    @BrightnessInfo.BrightnessMaxReason public int getBrightnessMaxReason() {
        if (mClamperType == null) {
            return BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE;
        } else if (mClamperType == Type.THERMAL) {
            return BrightnessInfo.BRIGHTNESS_MAX_REASON_THERMAL;
        } else {
            Slog.wtf(TAG, "BrightnessMaxReason not mapped for type=" + mClamperType);
            return BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE;
        }
    }

    /**
     * Used to dump ClampersController state.
     */
@@ -184,6 +217,21 @@ public class BrightnessClamperController {
        DeviceConfigParameterProvider getDeviceConfigParameterProvider() {
            return new DeviceConfigParameterProvider(DeviceConfigInterface.REAL);
        }

        List<BrightnessClamper<? super DisplayDeviceData>> getClampers(Handler handler,
                ClamperChangeListener clamperChangeListener, DisplayDeviceData data) {
            List<BrightnessClamper<? super DisplayDeviceData>> clampers = new ArrayList<>();
            clampers.add(
                    new BrightnessThermalClamper(handler, clamperChangeListener, data));
            return clampers;
        }

        List<BrightnessModifier> getModifiers(Context context) {
            List<BrightnessModifier> modifiers = new ArrayList<>();
            modifiers.add(new DisplayDimModifier(context));
            modifiers.add(new BrightnessLowPowerModeModifier());
            return modifiers;
        }
    }

    /**
+3 −1
Original line number Diff line number Diff line
@@ -88,7 +88,9 @@ public class DisplayBrightnessStateTest {
                .append("\n    shouldUseAutoBrightness:")
                .append(displayBrightnessState.getShouldUseAutoBrightness())
                .append("\n    isSlowChange:")
                .append(displayBrightnessState.isSlowChange());
                .append(displayBrightnessState.isSlowChange())
                .append("\n    maxBrightness:")
                .append(displayBrightnessState.getMaxBrightness());
        return sb.toString();
    }
}
+260 −0

File added.

Preview size limit exceeded, changes collapsed.