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

Commit 93cd4f3c authored by Oleg Petsjonkin's avatar Oleg Petsjonkin Committed by Oleg Petšjonkin
Browse files

Moving dim handling to DisplayDimModifier

Bug: b/263362199
Test: atest DisplayDimModifierTest
Change-Id: I717faaa91f9c0ce09c109e28ef577c1791c8d1e4
parent 0d4e74d5
Loading
Loading
Loading
Loading
+2 −33
Original line number Diff line number Diff line
@@ -254,13 +254,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
    // The doze screen brightness.
    private final float mScreenBrightnessDozeConfig;

    // The dim screen brightness.
    private final float mScreenBrightnessDimConfig;

    // The minimum dim amount to use if the screen brightness is already below
    // mScreenBrightnessDimConfig.
    private final float mScreenBrightnessMinimumDimAmount;

    // True if auto-brightness should be used.
    private boolean mUseSoftwareAutoBrightnessConfig;

@@ -529,11 +522,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
        // DOZE AND DIM SETTINGS
        mScreenBrightnessDozeConfig = BrightnessUtils.clampAbsoluteBrightness(
                pm.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DOZE));
        mScreenBrightnessDimConfig = BrightnessUtils.clampAbsoluteBrightness(
                pm.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DIM));
        mScreenBrightnessMinimumDimAmount = resources.getFloat(
                R.dimen.config_screenBrightnessMinimumDimAmountFloat);

        loadBrightnessRampRates();
        mSkipScreenOnBrightnessRamp = resources.getBoolean(
                R.bool.config_skipScreenOnBrightnessRamp);
@@ -565,7 +553,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
                mUniqueDisplayId,
                mThermalBrightnessThrottlingDataId,
                mDisplayDeviceConfig
        ));
        ), mContext);
        // Seed the cached brightness
        saveBrightnessInfo(getScreenBrightnessSetting());
        mAutomaticBrightnessStrategy =
@@ -1426,6 +1414,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
        // Note throttling effectively changes the allowed brightness range, so, similarly to HBM,
        // we broadcast this change through setting.
        final float unthrottledBrightnessState = brightnessState;

        if (mBrightnessThrottler.isThrottled()) {
            mTempBrightnessEvent.setThermalMax(mBrightnessThrottler.getBrightnessCap());
            brightnessState = Math.min(brightnessState, mBrightnessThrottler.getBrightnessCap());
@@ -1449,25 +1438,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
            mDisplayBrightnessController.updateScreenBrightnessSetting(brightnessState);
        }

        // Apply dimming by at least some minimum amount when user activity
        // timeout is about to expire.
        if (mPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) {
            if (brightnessState > PowerManager.BRIGHTNESS_MIN) {
                brightnessState = Math.max(
                        Math.min(brightnessState - mScreenBrightnessMinimumDimAmount,
                                mScreenBrightnessDimConfig),
                        PowerManager.BRIGHTNESS_MIN);
                mBrightnessReasonTemp.addModifier(BrightnessReason.MODIFIER_DIMMED);
            }
            if (!mAppliedDimming) {
                slowChange = false;
            }
            mAppliedDimming = true;
        } else if (mAppliedDimming) {
            slowChange = false;
            mAppliedDimming = false;
        }

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

@@ -2366,7 +2336,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal
        pw.println();
        pw.println("Display Power Controller Configuration:");
        pw.println("  mScreenBrightnessDozeConfig=" + mScreenBrightnessDozeConfig);
        pw.println("  mScreenBrightnessDimConfig=" + mScreenBrightnessDimConfig);
        pw.println("  mUseSoftwareAutoBrightnessConfig=" + mUseSoftwareAutoBrightnessConfig);
        pw.println("  mSkipScreenOnBrightnessRamp=" + mSkipScreenOnBrightnessRamp);
        pw.println("  mColorFadeFadesConfig=" + mColorFadeFadesConfig);
+6 −3
Original line number Diff line number Diff line
@@ -20,6 +20,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.DisplayManagerInternal;
import android.os.Handler;
import android.os.HandlerExecutor;
@@ -61,13 +62,13 @@ public class BrightnessClamperController {
    private Type mClamperType = null;

    public BrightnessClamperController(Handler handler,
            ClamperChangeListener clamperChangeListener, DisplayDeviceData data) {
        this(new Injector(), handler, clamperChangeListener, data);
            ClamperChangeListener clamperChangeListener, DisplayDeviceData data, Context context) {
        this(new Injector(), handler, clamperChangeListener, data, context);
    }

    @VisibleForTesting
    BrightnessClamperController(Injector injector, Handler handler,
            ClamperChangeListener clamperChangeListener, DisplayDeviceData data) {
            ClamperChangeListener clamperChangeListener, DisplayDeviceData data, Context context) {
        mDeviceConfigParameterProvider = injector.getDeviceConfigParameterProvider();
        mHandler = handler;
        mClamperChangeListenerExternal = clamperChangeListener;
@@ -85,6 +86,7 @@ public class BrightnessClamperController {
            mClampers.add(
                    new BrightnessThermalClamper(handler, clamperChangeListenerInternal, data));
        }
        mModifiers.add(new DisplayDimModifier(context));
        mModifiers.add(new BrightnessLowPowerModeModifier());
        start();
    }
@@ -111,6 +113,7 @@ public class BrightnessClamperController {
        for (int i = 0; i < mModifiers.size(); i++) {
            mModifiers.get(i).apply(request, builder);
        }

        return builder.build();
    }

+19 −26
Original line number Diff line number Diff line
@@ -18,44 +18,37 @@ package com.android.server.display.brightness.clamper;

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

import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.brightness.BrightnessReason;

import java.io.PrintWriter;

class BrightnessLowPowerModeModifier implements BrightnessModifier {
class BrightnessLowPowerModeModifier extends BrightnessModifier {

    @Override
    boolean shouldApply(DisplayManagerInternal.DisplayPowerRequest request) {
        return request.lowPowerMode;
    }

    private boolean mAppliedLowPower = false;

    @Override
    public void apply(DisplayManagerInternal.DisplayPowerRequest request,
            DisplayBrightnessState.Builder stateBuilder) {
        // If low power mode is enabled, scale brightness by screenLowPowerBrightnessFactor
        // as long as it is above the minimum threshold.
        if (request.lowPowerMode) {
            float value = stateBuilder.getBrightness();
            if (value > PowerManager.BRIGHTNESS_MIN) {
    float getBrightnessAdjusted(float currentBrightness,
            DisplayManagerInternal.DisplayPowerRequest request) {
        final float brightnessFactor =
                Math.min(request.screenLowPowerBrightnessFactor, 1);
                final float lowPowerBrightnessFloat = Math.max((value * brightnessFactor),
                        PowerManager.BRIGHTNESS_MIN);
                stateBuilder.setBrightness(lowPowerBrightnessFloat);
                stateBuilder.getBrightnessReason().addModifier(BrightnessReason.MODIFIER_LOW_POWER);
            }
            if (!mAppliedLowPower) {
                stateBuilder.setIsSlowChange(false);
            }
            mAppliedLowPower = true;
        } else if (mAppliedLowPower) {
            stateBuilder.setIsSlowChange(false);
            mAppliedLowPower = false;
        return Math.max((currentBrightness * brightnessFactor), PowerManager.BRIGHTNESS_MIN);
    }

    @Override
    int getModifier() {
        return BrightnessReason.MODIFIER_LOW_POWER;
    }

    @Override
    public void dump(PrintWriter pw) {
        pw.println("BrightnessLowPowerModeModifier:");
        pw.println("  mAppliedLowPower=" + mAppliedLowPower);
        IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "    ");
        super.dump(ipw);
    }
}
+33 −3
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.display.brightness.clamper;

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

import com.android.server.display.DisplayBrightnessState;

@@ -25,10 +26,39 @@ import java.io.PrintWriter;
/**
 * Modifies current brightness based on request
 */
interface BrightnessModifier {
abstract class BrightnessModifier {

    private boolean mApplied = false;

    abstract boolean shouldApply(DisplayManagerInternal.DisplayPowerRequest request);

    abstract float getBrightnessAdjusted(float currentBrightness,
            DisplayManagerInternal.DisplayPowerRequest request);

    abstract int getModifier();

    void apply(DisplayManagerInternal.DisplayPowerRequest request,
            DisplayBrightnessState.Builder builder);
            DisplayBrightnessState.Builder stateBuilder) {
        // If low power mode is enabled, scale brightness by screenLowPowerBrightnessFactor
        // as long as it is above the minimum threshold.
        if (shouldApply(request)) {
            float value = stateBuilder.getBrightness();
            if (value > PowerManager.BRIGHTNESS_MIN) {
                stateBuilder.setBrightness(getBrightnessAdjusted(value, request));
                stateBuilder.getBrightnessReason().addModifier(getModifier());
            }
            if (!mApplied) {
                stateBuilder.setIsSlowChange(false);
            }
            mApplied = true;
        } else if (mApplied) {
            stateBuilder.setIsSlowChange(false);
            mApplied = false;
        }
    }

    void dump(PrintWriter pw);
    void dump(PrintWriter pw) {
        pw.println("BrightnessModifier:");
        pw.println("  mApplied=" + mApplied);
    }
}
+79 −0
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.content.Context;
import android.content.res.Resources;
import android.hardware.display.DisplayManagerInternal;
import android.os.PowerManager;
import android.util.IndentingPrintWriter;

import com.android.internal.R;
import com.android.server.display.brightness.BrightnessReason;
import com.android.server.display.brightness.BrightnessUtils;

import java.io.PrintWriter;
import java.util.Objects;

class DisplayDimModifier extends BrightnessModifier {

    // The dim screen brightness.
    private final float mScreenBrightnessDimConfig;

    // The minimum dim amount to use if the screen brightness is already below
    // mScreenBrightnessDimConfig.
    private final float mScreenBrightnessMinimumDimAmount;

    DisplayDimModifier(Context context) {
        PowerManager pm = Objects.requireNonNull(context.getSystemService(PowerManager.class));
        Resources resources = context.getResources();

        mScreenBrightnessDimConfig = BrightnessUtils.clampAbsoluteBrightness(
                pm.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DIM));
        mScreenBrightnessMinimumDimAmount = resources.getFloat(
                R.dimen.config_screenBrightnessMinimumDimAmountFloat);
    }


    @Override
    boolean shouldApply(DisplayManagerInternal.DisplayPowerRequest request) {
        return request.policy == DisplayManagerInternal.DisplayPowerRequest.POLICY_DIM;
    }

    @Override
    float getBrightnessAdjusted(float currentBrightness,
            DisplayManagerInternal.DisplayPowerRequest request) {
        return Math.max(
                Math.min(currentBrightness - mScreenBrightnessMinimumDimAmount,
                        mScreenBrightnessDimConfig),
                PowerManager.BRIGHTNESS_MIN);
    }

    @Override
    int getModifier() {
        return BrightnessReason.MODIFIER_DIMMED;
    }

    @Override
    public void dump(PrintWriter pw) {
        pw.println("DisplayDimModifier:");
        pw.println("  mScreenBrightnessDimConfig=" + mScreenBrightnessDimConfig);
        pw.println("  mScreenBrightnessMinimumDimAmount=" + mScreenBrightnessMinimumDimAmount);
        IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "    ");
        super.dump(ipw);
    }
}
Loading