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

Commit 2997bdcd authored by petsjonkin's avatar petsjonkin
Browse files

Migrating BrightnessPowerClamper to BirhgnessStateModifier interface

Bug: b/381072504
Test: atest BrightnessPowerModifierTest, manual testing see https://b.corp.google.com/issues/381072504#comment2
Flag: EXEMPT refactoring

Change-Id: Ia36d620e5cca24f1b083ef256fe43986e9d5b3d6
parent 66e33150
Loading
Loading
Loading
Loading
+0 −78
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

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

import android.annotation.NonNull;
import android.os.Handler;
import android.os.PowerManager;

import com.android.server.display.DisplayBrightnessState;

import java.io.PrintWriter;

/**
 * Provides brightness range constraints
 */
abstract class BrightnessClamper<T> {

    protected float mBrightnessCap = PowerManager.BRIGHTNESS_MAX;

    protected boolean mIsActive = false;

    @NonNull
    protected final Handler mHandler;

    @NonNull
    protected final BrightnessClamperController.ClamperChangeListener mChangeListener;

    BrightnessClamper(Handler handler,
            BrightnessClamperController.ClamperChangeListener changeListener) {
        mHandler = handler;
        mChangeListener = changeListener;
    }

    float getBrightnessCap() {
        return mBrightnessCap;
    }

    float getCustomAnimationRate() {
        return DisplayBrightnessState.CUSTOM_ANIMATION_RATE_NOT_SET;
    }

    boolean isActive() {
        return mIsActive;
    }

    void dump(PrintWriter writer) {
        writer.println("BrightnessClamper:" + getType());
        writer.println(" mBrightnessCap: " + mBrightnessCap);
        writer.println(" mIsActive: " + mIsActive);
    }

    @NonNull
    abstract Type getType();

    abstract void onDeviceConfigChanged();

    abstract void onDisplayChanged(T displayData);

    abstract void stop();

    protected enum Type {
        POWER,
    }
}
+15 −110
Original line number Diff line number Diff line
@@ -18,8 +18,6 @@ package com.android.server.display.brightness.clamper;

import static android.view.Display.STATE_ON;

import static com.android.server.display.brightness.clamper.BrightnessClamper.Type;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
@@ -33,7 +31,6 @@ import android.os.PowerManager;
import android.provider.DeviceConfig;
import android.provider.DeviceConfigInterface;
import android.util.IndentingPrintWriter;
import android.util.Slog;
import android.util.Spline;

import com.android.internal.annotations.VisibleForTesting;
@@ -43,7 +40,6 @@ import com.android.server.display.DisplayDeviceConfig;
import com.android.server.display.DisplayDeviceConfig.PowerThrottlingConfigData;
import com.android.server.display.DisplayDeviceConfig.PowerThrottlingData;
import com.android.server.display.DisplayDeviceConfig.ThermalBrightnessThrottlingData;
import com.android.server.display.brightness.BrightnessReason;
import com.android.server.display.config.SensorData;
import com.android.server.display.feature.DeviceConfigParameterProvider;
import com.android.server.display.feature.DisplayManagerFlags;
@@ -65,7 +61,6 @@ public class BrightnessClamperController {

    private final ClamperChangeListener mClamperChangeListenerExternal;
    private final Executor mExecutor;
    private final List<BrightnessClamper<? super DisplayDeviceData>> mClampers;

    private final List<BrightnessStateModifier> mModifiers;

@@ -77,16 +72,6 @@ public class BrightnessClamperController {
    private ModifiersAggregatedState mModifiersAggregatedState = new ModifiersAggregatedState();

    private final DeviceConfig.OnPropertiesChangedListener mOnPropertiesChangedListener;
    private final DisplayManagerFlags mDisplayManagerFlags;
    private float mBrightnessCap = PowerManager.BRIGHTNESS_MAX;

    private float mCustomAnimationRate = DisplayBrightnessState.CUSTOM_ANIMATION_RATE_NOT_SET;
    @Nullable
    private BrightnessPowerClamper mPowerClamper;
    @Nullable
    private Type mClamperType = null;

    private boolean mClamperApplied = false;

    private final LightSensorController.LightSensorListener mLightSensorListener =
            new LightSensorController.LightSensorListener() {
@@ -109,7 +94,6 @@ public class BrightnessClamperController {
            DisplayManagerFlags flags, SensorManager sensorManager, float currentBrightness) {
        mDeviceConfigParameterProvider = injector.getDeviceConfigParameterProvider();
        mHandler = handler;
        mDisplayManagerFlags = flags;
        mLightSensorController = injector.getLightSensorController(sensorManager, context,
                mLightSensorListener, mHandler);

@@ -123,18 +107,8 @@ public class BrightnessClamperController {
            }
        };

        mClampers = injector.getClampers(handler, clamperChangeListenerInternal, data, flags,
                context, currentBrightness);
        if (mDisplayManagerFlags.isPowerThrottlingClamperEnabled()) {
            for (BrightnessClamper clamper: mClampers) {
                if (clamper.getType() == Type.POWER) {
                    mPowerClamper = (BrightnessPowerClamper) clamper;
                    break;
                }
            }
        }
        mModifiers = injector.getModifiers(flags, context, handler, clamperChangeListener,
                data);
        mModifiers = injector.getModifiers(flags, context, handler, clamperChangeListenerInternal,
                data, currentBrightness);

        mModifiers.forEach(m -> {
            if (m instanceof  DisplayDeviceDataListener l) {
@@ -151,7 +125,6 @@ public class BrightnessClamperController {
            }
        });
        mOnPropertiesChangedListener = properties -> {
            mClampers.forEach(BrightnessClamper::onDeviceConfigChanged);
            mDeviceConfigListeners.forEach(DeviceConfigListener::onDeviceConfigChanged);
        };
        mLightSensorController.configure(data.getAmbientLightSensor(), data.getDisplayId());
@@ -163,7 +136,6 @@ public class BrightnessClamperController {
     */
    public void onDisplayChanged(DisplayDeviceData data) {
        mLightSensorController.configure(data.getAmbientLightSensor(), data.getDisplayId());
        mClampers.forEach(clamper -> clamper.onDisplayChanged(data));
        mDisplayDeviceDataListeners.forEach(l -> l.onDisplayChanged(data));
        adjustLightSensorSubscription();
    }
@@ -175,24 +147,10 @@ public class BrightnessClamperController {
    public DisplayBrightnessState clamp(DisplayBrightnessState displayBrightnessState,
            DisplayManagerInternal.DisplayPowerRequest request,
            float brightnessValue, boolean slowChange, int displayState) {
        float cappedBrightness = Math.min(brightnessValue, mBrightnessCap);

        DisplayBrightnessState.Builder builder = DisplayBrightnessState.Builder.from(
                displayBrightnessState);
        builder.setIsSlowChange(slowChange);
        builder.setBrightness(cappedBrightness);
        builder.setMaxBrightness(mBrightnessCap);
        builder.setCustomAnimationRate(mCustomAnimationRate);
        builder.setBrightnessMaxReason(getBrightnessMaxReason());
        if (mClamperType != null) {
            builder.getBrightnessReason().addModifier(BrightnessReason.MODIFIER_THROTTLED);
            if (!mClamperApplied) {
                builder.setIsSlowChange(false);
            }
            mClamperApplied = true;
        } else {
            mClamperApplied = false;
        }
        builder.setBrightness(brightnessValue);

        if (displayState != STATE_ON) {
            mLightSensorController.stop();
@@ -204,27 +162,9 @@ public class BrightnessClamperController {
            mModifiers.get(i).apply(request, builder);
        }

        if (mDisplayManagerFlags.isPowerThrottlingClamperEnabled()) {
            if (mPowerClamper != null) {
                mPowerClamper.updateCurrentBrightness(cappedBrightness);
            }
        }

        return builder.build();
    }

    @BrightnessInfo.BrightnessMaxReason
    private int getBrightnessMaxReason() {
        if (mClamperType == null) {
            return BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE;
        } else if (mClamperType == Type.POWER) {
            return BrightnessInfo.BRIGHTNESS_MAX_REASON_POWER_IC;
        }  else {
            Slog.wtf(TAG, "BrightnessMaxReason not mapped for type=" + mClamperType);
            return BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE;
        }
    }

    /**
     * Called when the user switches.
     */
@@ -237,13 +177,8 @@ public class BrightnessClamperController {
     */
    public void dump(PrintWriter writer) {
        writer.println("BrightnessClamperController:");
        writer.println("----------------------------");
        writer.println("  mBrightnessCap: " + mBrightnessCap);
        writer.println("  mClamperType: " + mClamperType);
        writer.println("  mClamperApplied: " + mClamperApplied);
        IndentingPrintWriter ipw = new IndentingPrintWriter(writer, "    ");
        mLightSensorController.dump(ipw);
        mClampers.forEach(clamper -> clamper.dump(ipw));
        mModifiers.forEach(modifier -> modifier.dump(ipw));
    }

@@ -255,38 +190,16 @@ public class BrightnessClamperController {
        mDeviceConfigParameterProvider.removeOnPropertiesChangedListener(
                mOnPropertiesChangedListener);
        mLightSensorController.stop();
        mClampers.forEach(BrightnessClamper::stop);
        mModifiers.forEach(BrightnessStateModifier::stop);
    }


    // Called in DisplayControllerHandler
    private void recalculateBrightnessCap() {
        float brightnessCap = PowerManager.BRIGHTNESS_MAX;
        Type clamperType = null;
        float customAnimationRate = DisplayBrightnessState.CUSTOM_ANIMATION_RATE_NOT_SET;

        BrightnessClamper<?> minClamper = mClampers.stream()
                .filter(BrightnessClamper::isActive)
                .min((clamper1, clamper2) -> Float.compare(clamper1.getBrightnessCap(),
                        clamper2.getBrightnessCap())).orElse(null);

        if (minClamper != null) {
            brightnessCap = minClamper.getBrightnessCap();
            clamperType = minClamper.getType();
            customAnimationRate = minClamper.getCustomAnimationRate();
        }

        ModifiersAggregatedState newAggregatedState = new ModifiersAggregatedState();
        mStatefulModifiers.forEach((clamper) -> clamper.applyStateChange(newAggregatedState));

        if (mBrightnessCap != brightnessCap
                || mClamperType != clamperType
                || mCustomAnimationRate != customAnimationRate
                || needToNotifyExternalListener(mModifiersAggregatedState, newAggregatedState)) {
            mBrightnessCap = brightnessCap;
            mClamperType = clamperType;
            mCustomAnimationRate = customAnimationRate;
        if (needToNotifyExternalListener(mModifiersAggregatedState, newAggregatedState)) {
            mClamperChangeListenerExternal.onChanged();
        }
        mModifiersAggregatedState = newAggregatedState;
@@ -305,7 +218,7 @@ public class BrightnessClamperController {
    }

    private void start() {
        if (!mClampers.isEmpty() || !mDeviceConfigListeners.isEmpty()) {
        if (!mDeviceConfigListeners.isEmpty()) {
            mDeviceConfigParameterProvider.addOnPropertiesChangedListener(
                    mExecutor, mOnPropertiesChangedListener);
        }
@@ -336,31 +249,23 @@ public class BrightnessClamperController {
            return new DeviceConfigParameterProvider(DeviceConfigInterface.REAL);
        }

        List<BrightnessClamper<? super DisplayDeviceData>> getClampers(Handler handler,
                ClamperChangeListener clamperChangeListener, DisplayDeviceData data,
                DisplayManagerFlags flags, Context context, float currentBrightness) {
            List<BrightnessClamper<? super DisplayDeviceData>> clampers = new ArrayList<>();

            if (flags.isPowerThrottlingClamperEnabled()) {
                // Check if power-throttling config is present.
                PowerThrottlingConfigData configData = data.getPowerThrottlingConfigData();
                if (configData != null) {
                    clampers.add(new BrightnessPowerClamper(handler, clamperChangeListener,
                            data, currentBrightness));
                }
            }
            return clampers;
        }

        List<BrightnessStateModifier> getModifiers(DisplayManagerFlags flags, Context context,
                Handler handler, ClamperChangeListener listener,
                DisplayDeviceData data) {
                DisplayDeviceData data, float currentBrightness) {
            List<BrightnessStateModifier> modifiers = new ArrayList<>();
            modifiers.add(new BrightnessThermalModifier(handler, listener, data));
            if (flags.isBrightnessWearBedtimeModeClamperEnabled()) {
                modifiers.add(new BrightnessWearBedtimeModeModifier(handler, context,
                        listener, data));
            }
            if (flags.isPowerThrottlingClamperEnabled()) {
                // Check if power-throttling config is present.
                PowerThrottlingConfigData configData = data.getPowerThrottlingConfigData();
                if (configData != null) {
                    modifiers.add(new BrightnessPowerModifier(handler, listener,
                            data, currentBrightness));
                }
            }

            modifiers.add(new DisplayDimModifier(context));
            modifiers.add(new BrightnessLowPowerModeModifier());
@@ -393,7 +298,7 @@ public class BrightnessClamperController {
     * Config Data for clampers/modifiers
     */
    public static class DisplayDeviceData implements BrightnessThermalModifier.ThermalData,
            BrightnessPowerClamper.PowerData,
            BrightnessPowerModifier.PowerData,
            BrightnessWearBedtimeModeModifier.WearBedtimeModeData {
        @NonNull
        private final String mUniqueDisplayId;
+4 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

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

import static com.android.server.display.DisplayBrightnessState.CUSTOM_ANIMATION_RATE_NOT_SET;

import android.hardware.display.DisplayManagerInternal;
import android.os.PowerManager;

@@ -50,10 +52,12 @@ abstract class BrightnessModifier implements BrightnessStateModifier {
            }
            if (!mApplied) {
                stateBuilder.setIsSlowChange(false);
                stateBuilder.setCustomAnimationRate(CUSTOM_ANIMATION_RATE_NOT_SET);
            }
            mApplied = true;
        } else if (mApplied) {
            stateBuilder.setIsSlowChange(false);
            stateBuilder.setCustomAnimationRate(CUSTOM_ANIMATION_RATE_NOT_SET);
            mApplied = false;
        }
    }
+90 −74

File changed and moved.

Preview size limit exceeded, changes collapsed.

+1 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

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

import static com.android.server.display.brightness.clamper.BrightnessPowerClamper.PowerChangeListener;
import static com.android.server.display.brightness.clamper.BrightnessPowerModifier.PowerChangeListener;

import android.annotation.Nullable;
import android.hardware.power.stats.EnergyConsumer;
Loading