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

Commit b4201fcd authored by Piotr Wilczyński's avatar Piotr Wilczyński
Browse files

Initial doze brightness in manual brightness mode

If there's an offload session, the initial doze brightness should be the current brightness setting * doze scale factor.

Don't use the doze scale factor for auto-brightness if there's a designated doze curve - the doze curve specifies exactly what values we want, so we shouldn't scale them.

Provide methods for the offload chip to get the current brightness setting and the brightness that will be used for doze.

Bug: 327398808
Test: adb logcat | grep -i "brightnessEvent"
Test: atest AutomaticBrightnessControllerTest
Test: atest DisplayPowerControllerTest
Change-Id: Ia51f0a21bc7cf2b4991b40b52c21cb6c0ec225aa
parent e5ba94cf
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -778,6 +778,16 @@ public abstract class DisplayManagerInternal {
         */
        float[] getAutoBrightnessLuxLevels(int mode);

        /**
         * @return The current brightness setting
         */
        float getBrightness();

        /**
         * @return The brightness value that is used when the device is in doze
         */
        float getDozeBrightness();

        /** Returns whether displayoffload supports the given display state. */
        static boolean isSupportedOffloadState(int displayState) {
            return Display.isSuspendedState(displayState);
+4 −1
Original line number Diff line number Diff line
@@ -1608,7 +1608,10 @@
    <fraction name="config_autoBrightnessAdjustmentMaxGamma">300%</fraction>

    <!-- If we allow automatic adjustment of screen brightness while dozing, how many times we want
         to reduce it to preserve the battery. Value of 100% means no scaling. -->
         to reduce it to preserve the battery. Value of 100% means no scaling. Not used if there is
         a designated auto-brightness doze mapping defined in Display Device Config.
         Also used to scale the brightness for the doze mode when auto-brightness is disabled if
         there is an offload session present. -->
    <fraction name="config_screenAutoBrightnessDozeScaleFactor">100%</fraction>

    <!-- When the screen is turned on, the previous estimate of the ambient light level at the time
+10 −6
Original line number Diff line number Diff line
@@ -403,15 +403,14 @@ public class AutomaticBrightnessController {
            brightnessEvent.setRecommendedBrightness(mScreenAutoBrightness);
            brightnessEvent.setFlags(brightnessEvent.getFlags()
                    | (!mAmbientLuxValid ? BrightnessEvent.FLAG_INVALID_LUX : 0)
                    | (mDisplayPolicy == DisplayPowerRequest.POLICY_DOZE
                        ? BrightnessEvent.FLAG_DOZE_SCALE : 0));
                    | (shouldApplyDozeScaleFactor() ? BrightnessEvent.FLAG_DOZE_SCALE : 0));
            brightnessEvent.setAutoBrightnessMode(getMode());
        }

        if (!mAmbientLuxValid) {
            return PowerManager.BRIGHTNESS_INVALID_FLOAT;
        }
        if (mDisplayPolicy == DisplayPowerRequest.POLICY_DOZE) {
        if (shouldApplyDozeScaleFactor()) {
            return mScreenAutoBrightness * mDozeScaleFactor;
        }
        return mScreenAutoBrightness;
@@ -434,7 +433,7 @@ public class AutomaticBrightnessController {

        float brightness = mCurrentBrightnessMapper.getBrightness(mLastObservedLux,
                mForegroundAppPackageName, mForegroundAppCategory);
        if (mDisplayPolicy == DisplayPowerRequest.POLICY_DOZE) {
        if (shouldApplyDozeScaleFactor()) {
            brightness *= mDozeScaleFactor;
        }

@@ -443,8 +442,7 @@ public class AutomaticBrightnessController {
            brightnessEvent.setRecommendedBrightness(brightness);
            brightnessEvent.setFlags(brightnessEvent.getFlags()
                    | (mLastObservedLux == INVALID_LUX ? BrightnessEvent.FLAG_INVALID_LUX : 0)
                    | (mDisplayPolicy == DisplayPowerRequest.POLICY_DOZE
                    ? BrightnessEvent.FLAG_DOZE_SCALE : 0));
                    | (shouldApplyDozeScaleFactor() ? BrightnessEvent.FLAG_DOZE_SCALE : 0));
            brightnessEvent.setAutoBrightnessMode(getMode());
        }
        return brightness;
@@ -1263,6 +1261,12 @@ public class AutomaticBrightnessController {
        }
    }

    private boolean shouldApplyDozeScaleFactor() {
        // Don't apply the doze scale factor if we have a designated brightness curve for doze
        return mDisplayPolicy == DisplayPowerRequest.POLICY_DOZE
                && getMode() != AUTO_BRIGHTNESS_MODE_DOZE;
    }

    private class ShortTermModel {
        // When the short term model is invalidated, we don't necessarily reset it (i.e. clear the
        // user's adjustment) immediately, but wait for a drastic enough change in the ambient
+10 −0
Original line number Diff line number Diff line
@@ -113,4 +113,14 @@ public class DisplayOffloadSessionImpl implements DisplayManagerInternal.Display
            Trace.traceEnd(Trace.TRACE_TAG_POWER);
        }
    }

    @Override
    public float getBrightness() {
        return mDisplayPowerController.getScreenBrightnessSetting();
    }

    @Override
    public float getDozeBrightness() {
        return mDisplayPowerController.getDozeBrightnessForOffload();
    }
}
+29 −16
Original line number Diff line number Diff line
@@ -487,6 +487,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call

    private DisplayOffloadSession mDisplayOffloadSession;

    // Used to scale the brightness in doze mode
    private float mDozeScaleFactor;

    /**
     * Creates the display power controller.
     */
@@ -547,6 +550,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
        loadBrightnessRampRates();
        mSkipScreenOnBrightnessRamp = resources.getBoolean(
                R.bool.config_skipScreenOnBrightnessRamp);
        mDozeScaleFactor = context.getResources().getFraction(
                R.fraction.config_screenAutoBrightnessDozeScaleFactor,
                1, 1);

        Runnable modeChangeCallback = () -> {
            sendUpdatePowerState();
@@ -1042,10 +1048,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
        }

        if (defaultModeBrightnessMapper != null) {
            final float dozeScaleFactor = context.getResources().getFraction(
                    R.fraction.config_screenAutoBrightnessDozeScaleFactor,
                    1, 1);

            // Ambient Lux - Active Mode Brightness Thresholds
            float[] ambientBrighteningThresholds =
                    mDisplayDeviceConfig.getAmbientBrighteningPercentages();
@@ -1156,7 +1158,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
            mAutomaticBrightnessController = mInjector.getAutomaticBrightnessController(
                    this, handler.getLooper(), mSensorManager, mLightSensor,
                    brightnessMappers, lightSensorWarmUpTimeConfig, PowerManager.BRIGHTNESS_MIN,
                    PowerManager.BRIGHTNESS_MAX, dozeScaleFactor, lightSensorRate,
                    PowerManager.BRIGHTNESS_MAX, mDozeScaleFactor, lightSensorRate,
                    initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce,
                    brighteningLightDebounceIdle, darkeningLightDebounceIdle,
                    autoBrightnessResetAmbientLuxAfterWarmUp, ambientBrightnessThresholds,
@@ -1473,17 +1475,22 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
            mAutomaticBrightnessStrategy.setAutoBrightnessApplied(false);
        }

        // If there's an offload session and auto-brightness is on, we need to set the initial doze
        // brightness using the doze auto-brightness curve before the offload session starts
        // controlling the brightness.
        if (Float.isNaN(brightnessState) && mFlags.areAutoBrightnessModesEnabled()
                && mFlags.isDisplayOffloadEnabled()
                && mPowerRequest.policy == POLICY_DOZE
                && mDisplayOffloadSession != null
                && mAutomaticBrightnessController != null
        // If there's an offload session, we need to set the initial doze brightness before
        // the offload session starts controlling the brightness.
        if (Float.isNaN(brightnessState) && mFlags.isDisplayOffloadEnabled()
                && mPowerRequest.policy == POLICY_DOZE && mDisplayOffloadSession != null) {
            if (mAutomaticBrightnessController != null
                    && mAutomaticBrightnessStrategy.shouldUseAutoBrightness()) {
                // Use the auto-brightness curve and the last observed lux
                rawBrightnessState = mAutomaticBrightnessController
                    .getAutomaticScreenBrightnessBasedOnLastObservedLux(mTempBrightnessEvent);
                        .getAutomaticScreenBrightnessBasedOnLastObservedLux(
                                mTempBrightnessEvent);
            } else {
                rawBrightnessState = getDozeBrightnessForOffload();
                mTempBrightnessEvent.setFlags(mTempBrightnessEvent.getFlags()
                        | BrightnessEvent.FLAG_DOZE_SCALE);
            }

            if (BrightnessUtils.isValidBrightnessValue(rawBrightnessState)) {
                brightnessState = clampScreenBrightness(rawBrightnessState);
                mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE_INITIAL);
@@ -2443,6 +2450,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
        return mDisplayBrightnessController.getScreenBrightnessSetting();
    }

    @Override
    public float getDozeBrightnessForOffload() {
        return mDisplayBrightnessController.getCurrentBrightness() * mDozeScaleFactor;
    }

    @Override
    public void setBrightness(float brightness) {
        mDisplayBrightnessController.setBrightness(clampScreenBrightness(brightness));
@@ -2596,6 +2608,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
        }
        pw.println("  mDisplayBlanksAfterDozeConfig=" + mDisplayBlanksAfterDozeConfig);
        pw.println("  mBrightnessBucketsInDozeConfig=" + mBrightnessBucketsInDozeConfig);
        pw.println("  mDozeScaleFactor=" + mDozeScaleFactor);
        mHandler.runWithScissors(() -> dumpLocal(pw), 1000);
    }

Loading