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

Commit da0f2d52 authored by Rupesh Bansal's avatar Rupesh Bansal
Browse files

Added AutoBrightnessFallbackStrategy

This is used as a fallback when the autobrightness is enabled, but the
lux has not become valid yet.

Bug: 338039567
Test: atest com.android.server.display.brightness
Test: Manually verifying the usage of AutoBrightnessFallbackStrategy
when expected

Change-Id: I64b53cc9f6275b101cf79934a5f3a8fcb45f0ae9
parent 281ea5ed
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1268,7 +1268,7 @@ public class DisplayDeviceConfig {
        return mAmbientLightSensor;
    }

    SensorData getScreenOffBrightnessSensor() {
    public SensorData getScreenOffBrightnessSensor() {
        return mScreenOffBrightnessSensor;
    }

+58 −58
Original line number Diff line number Diff line
@@ -851,6 +851,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call

        mHandler.postAtTime(() -> {
            boolean changed = false;

            if (mIsEnabled != isEnabled || mIsInTransition != isInTransition) {
                changed = true;
                mIsEnabled = isEnabled;
                mIsInTransition = isInTransition;
            }

            if (mDisplayDevice != device) {
                changed = true;
                mDisplayDevice = device;
@@ -875,11 +882,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                        mThermalBrightnessThrottlingDataId,
                        mUniqueDisplayId);
            }
            if (mIsEnabled != isEnabled || mIsInTransition != isInTransition) {
                changed = true;
                mIsEnabled = isEnabled;
                mIsInTransition = isInTransition;
            }

            mIsDisplayInternal = isDisplayInternal;
            // using local variables here, when mBrightnessThrottler is removed,
@@ -1113,20 +1115,19 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                    mBrightnessThrottler, mDisplayDeviceConfig.getAmbientHorizonShort(),
                    mDisplayDeviceConfig.getAmbientHorizonLong(), userLux, userNits,
                    mBrightnessClamperController);
            mDisplayBrightnessController.setAutomaticBrightnessController(
                    mAutomaticBrightnessController);

            mAutomaticBrightnessStrategy
                    .setAutomaticBrightnessController(mAutomaticBrightnessController);
            mDisplayBrightnessController.setUpAutoBrightness(
                    mAutomaticBrightnessController, mSensorManager, mDisplayDeviceConfig, mHandler,
                    defaultModeBrightnessMapper, mIsEnabled, mLeadDisplayId);
            mBrightnessEventRingBuffer =
                    new RingBuffer<>(BrightnessEvent.class, RINGBUFFER_MAX);

            if (!mFlags.isRefactorDisplayPowerControllerEnabled()) {
                if (mScreenOffBrightnessSensorController != null) {
                    mScreenOffBrightnessSensorController.stop();
                    mScreenOffBrightnessSensorController = null;
                }
                loadScreenOffBrightnessSensor();
            int[] sensorValueToLux = mDisplayDeviceConfig.getScreenOffBrightnessSensorValueToLux();
                int[] sensorValueToLux =
                        mDisplayDeviceConfig.getScreenOffBrightnessSensorValueToLux();
                if (mScreenOffBrightnessSensor != null && sensorValueToLux != null) {
                    mScreenOffBrightnessSensorController =
                            mInjector.getScreenOffBrightnessSensorController(
@@ -1137,6 +1138,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                                    sensorValueToLux,
                                    defaultModeBrightnessMapper);
                }
            }
        } else {
            mUseSoftwareAutoBrightnessConfig = false;
        }
@@ -1255,7 +1257,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
            mPowerState = null;
        }

        if (mScreenOffBrightnessSensorController != null) {
        if (!mFlags.isRefactorDisplayPowerControllerEnabled()
                && mScreenOffBrightnessSensorController != null) {
            mScreenOffBrightnessSensorController.stop();
        }

@@ -1351,6 +1354,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
        if (displayBrightnessState.getBrightnessEvent() != null) {
            mTempBrightnessEvent.copyFrom(displayBrightnessState.getBrightnessEvent());
        }
        if (!mFlags.isRefactorDisplayPowerControllerEnabled()) {
            // Set up the ScreenOff controller used when coming out of SCREEN_OFF and the ALS sensor
            // doesn't yet have a valid lux value to use with auto-brightness.
            if (mScreenOffBrightnessSensorController != null) {
@@ -1361,6 +1365,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
                        && !mDisplayBrightnessController.isAllowAutoBrightnessWhileDozingConfig()))
                        && mLeadDisplayId == Layout.NO_LEAD_DISPLAY);
            }
        }

        // Take note if the short term model was already active before applying the current
        // request changes.
@@ -1392,15 +1397,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
        boolean updateScreenBrightnessSetting =
                displayBrightnessState.shouldUpdateScreenBrightnessSetting();
        float currentBrightnessSetting = mDisplayBrightnessController.getCurrentBrightness();
        // Apply auto-brightness.
        // All the conditions inside this if block will be moved to AutomaticBrightnessStrategy
        if (mFlags.isRefactorDisplayPowerControllerEnabled()
                && displayBrightnessState.getBrightnessReason().getReason()
                        == BrightnessReason.REASON_AUTOMATIC) {
            if (mScreenOffBrightnessSensorController != null) {
                mScreenOffBrightnessSensorController.setLightSensorEnabled(false);
            }
        }

        if (!mFlags.isRefactorDisplayPowerControllerEnabled()) {
            // AutomaticBrightnessStrategy has higher priority than OffloadBrightnessStrategy
@@ -1473,21 +1469,25 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
            mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE_DEFAULT);
        }

        if (!mFlags.isRefactorDisplayPowerControllerEnabled()) {
            // The ALS is not available yet - use the screen off sensor to determine the initial
            // brightness
        if (Float.isNaN(brightnessState) && mAutomaticBrightnessStrategy.isAutoBrightnessEnabled()
            if (Float.isNaN(brightnessState)
                    && mAutomaticBrightnessStrategy.isAutoBrightnessEnabled()
                    && mScreenOffBrightnessSensorController != null) {
                rawBrightnessState =
                        mScreenOffBrightnessSensorController.getAutomaticScreenBrightness();
                brightnessState = rawBrightnessState;
                if (BrightnessUtils.isValidBrightnessValue(brightnessState)) {
                    brightnessState = clampScreenBrightness(brightnessState);
                updateScreenBrightnessSetting = mDisplayBrightnessController.getCurrentBrightness()
                    updateScreenBrightnessSetting =
                            mDisplayBrightnessController.getCurrentBrightness()
                                    != brightnessState;
                    mBrightnessReasonTemp.setReason(
                            BrightnessReason.REASON_SCREEN_OFF_BRIGHTNESS_SENSOR);
                }
            }
        }

        // Apply manual brightness.
        if (Float.isNaN(brightnessState)) {
+13 −7
Original line number Diff line number Diff line
@@ -25,8 +25,6 @@ import android.os.Handler;
import android.os.PowerManager;
import android.util.IndentingPrintWriter;

import com.android.internal.annotations.VisibleForTesting;

import java.io.PrintWriter;

/**
@@ -79,7 +77,10 @@ public class ScreenOffBrightnessSensorController implements SensorEventListener
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

    void setLightSensorEnabled(boolean enabled) {
    /**
     * Changes the state of the associated light sensor
     */
    public void setLightSensorEnabled(boolean enabled) {
        if (enabled && !mRegistered) {
            // Wait until we get an event from the sensor indicating ready.
            mRegistered = mSensorManager.registerListener(this, mLightSensor,
@@ -92,11 +93,17 @@ public class ScreenOffBrightnessSensorController implements SensorEventListener
        }
    }

    void stop() {
    /**
     * Stops the associated sensor, and cleans up the state
     */
    public void stop() {
        setLightSensorEnabled(false);
    }

    float getAutomaticScreenBrightness() {
    /**
     * Gets the automatic screen brightness based on the ambient lux
     */
    public float getAutomaticScreenBrightness() {
        if (mLastSensorValue < 0 || mLastSensorValue >= mSensorValueToLux.length
                || (!mRegistered
                && mClock.uptimeMillis() - mSensorDisableTime > SENSOR_VALUE_VALID_TIME_MILLIS)) {
@@ -121,8 +128,7 @@ public class ScreenOffBrightnessSensorController implements SensorEventListener
    }

    /** Functional interface for providing time. */
    @VisibleForTesting
    interface Clock {
    public interface Clock {
        /**
         * Returns current time in milliseconds since boot, not counting time spent in deep sleep.
         */
+53 −8
Original line number Diff line number Diff line
@@ -18,7 +18,9 @@ package com.android.server.display.brightness;

import android.annotation.Nullable;
import android.content.Context;
import android.hardware.SensorManager;
import android.hardware.display.DisplayManagerInternal;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.PowerManager;
import android.util.IndentingPrintWriter;
@@ -31,6 +33,8 @@ import com.android.server.display.AutomaticBrightnessController;
import com.android.server.display.BrightnessMappingStrategy;
import com.android.server.display.BrightnessSetting;
import com.android.server.display.DisplayBrightnessState;
import com.android.server.display.DisplayDeviceConfig;
import com.android.server.display.brightness.strategy.AutoBrightnessFallbackStrategy;
import com.android.server.display.brightness.strategy.AutomaticBrightnessStrategy2;
import com.android.server.display.brightness.strategy.DisplayBrightnessStrategy;
import com.android.server.display.feature.DisplayManagerFlags;
@@ -103,7 +107,8 @@ public final class DisplayBrightnessController {
    // The controller for the automatic brightness level.
    // TODO(b/265415257): Move to the automatic brightness strategy
    @Nullable
    private AutomaticBrightnessController mAutomaticBrightnessController;
    @VisibleForTesting
    AutomaticBrightnessController mAutomaticBrightnessController;

    /**
     * The constructor of DisplayBrightnessController.
@@ -332,14 +337,16 @@ public final class DisplayBrightnessController {
    }

    /**
     * Set the {@link AutomaticBrightnessController} which is needed to perform nit-to-float-scale
     * conversion.
     * @param automaticBrightnessController The ABC
     * Sets up the auto brightness and the relevant state for the associated display
     */
    public void setAutomaticBrightnessController(
            AutomaticBrightnessController automaticBrightnessController) {
        mAutomaticBrightnessController = automaticBrightnessController;
        loadNitBasedBrightnessSetting();
    public void setUpAutoBrightness(AutomaticBrightnessController automaticBrightnessController,
            SensorManager sensorManager,
            DisplayDeviceConfig displayDeviceConfig, Handler handler,
            BrightnessMappingStrategy brightnessMappingStrategy, boolean isEnabled,
            int leadDisplayId) {
        setAutomaticBrightnessController(automaticBrightnessController);
        setUpAutoBrightnessFallbackStrategy(sensorManager, displayDeviceConfig, handler,
                brightnessMappingStrategy, isEnabled, leadDisplayId);
    }

    /**
@@ -404,6 +411,17 @@ public final class DisplayBrightnessController {
        if (mBrightnessSetting != null) {
            mBrightnessSetting.unregisterListener(mBrightnessSettingListener);
        }
        AutoBrightnessFallbackStrategy autoBrightnessFallbackStrategy =
                getAutoBrightnessFallbackStrategy();
        if (autoBrightnessFallbackStrategy != null) {
            autoBrightnessFallbackStrategy.stop();
        }
    }

    private AutoBrightnessFallbackStrategy getAutoBrightnessFallbackStrategy() {
        synchronized (mLock) {
            return mDisplayBrightnessStrategySelector.getAutoBrightnessFallbackStrategy();
        }
    }

    /**
@@ -483,6 +501,33 @@ public final class DisplayBrightnessController {
        }
    }

    /**
     * Set the {@link AutomaticBrightnessController} which is needed to perform nit-to-float-scale
     * conversion.
     * @param automaticBrightnessController The ABC
     */
    @VisibleForTesting
    void setAutomaticBrightnessController(
            AutomaticBrightnessController automaticBrightnessController) {
        mAutomaticBrightnessController = automaticBrightnessController;
        getAutomaticBrightnessStrategy()
                .setAutomaticBrightnessController(automaticBrightnessController);
        loadNitBasedBrightnessSetting();
    }

    private void setUpAutoBrightnessFallbackStrategy(SensorManager sensorManager,
            DisplayDeviceConfig displayDeviceConfig, Handler handler,
            BrightnessMappingStrategy brightnessMappingStrategy, boolean isEnabled,
            int leadDisplayId) {
        AutoBrightnessFallbackStrategy autoBrightnessFallbackStrategy =
                getAutoBrightnessFallbackStrategy();
        if (autoBrightnessFallbackStrategy != null) {
            autoBrightnessFallbackStrategy.setupAutoBrightnessFallbackSensor(
                    sensorManager, displayDeviceConfig, handler, brightnessMappingStrategy,
                    isEnabled, leadDisplayId);
        }
    }

    /**
     * TODO(b/253226419): Remove once auto-brightness is a fully-functioning strategy.
     */
+32 −4
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.view.Display;

import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.display.brightness.strategy.AutoBrightnessFallbackStrategy;
import com.android.server.display.brightness.strategy.AutomaticBrightnessStrategy;
import com.android.server.display.brightness.strategy.AutomaticBrightnessStrategy2;
import com.android.server.display.brightness.strategy.BoostBrightnessStrategy;
@@ -81,10 +82,14 @@ public class DisplayBrightnessStrategySelector {
    @Nullable
    private final OffloadBrightnessStrategy mOffloadBrightnessStrategy;

    @Nullable
    private final AutoBrightnessFallbackStrategy mAutoBrightnessFallbackStrategy;

    // A collective representation of all the strategies that the selector is aware of. This is
    // non null, but the strategies this is tracking can be null
    @NonNull
    private final DisplayBrightnessStrategy[] mDisplayBrightnessStrategies;
    @VisibleForTesting
    final DisplayBrightnessStrategy[] mDisplayBrightnessStrategies;

    @NonNull
    private final DisplayManagerFlags mDisplayManagerFlags;
@@ -120,6 +125,9 @@ public class DisplayBrightnessStrategySelector {
        mAutomaticBrightnessStrategy =
                (mDisplayManagerFlags.isRefactorDisplayPowerControllerEnabled())
                        ? mAutomaticBrightnessStrategy1 : mAutomaticBrightnessStrategy2;
        mAutoBrightnessFallbackStrategy = (mDisplayManagerFlags
                .isRefactorDisplayPowerControllerEnabled())
                ? injector.getAutoBrightnessFallbackStrategy() : null;
        if (flags.isDisplayOffloadEnabled()) {
            mOffloadBrightnessStrategy = injector
                    .getOffloadBrightnessStrategy(mDisplayManagerFlags);
@@ -129,7 +137,8 @@ public class DisplayBrightnessStrategySelector {
        mDisplayBrightnessStrategies = new DisplayBrightnessStrategy[]{mInvalidBrightnessStrategy,
                mScreenOffBrightnessStrategy, mDozeBrightnessStrategy, mFollowerBrightnessStrategy,
                mBoostBrightnessStrategy, mOverrideBrightnessStrategy, mTemporaryBrightnessStrategy,
                mAutomaticBrightnessStrategy1, mOffloadBrightnessStrategy};
                mAutomaticBrightnessStrategy1, mOffloadBrightnessStrategy,
                mAutoBrightnessFallbackStrategy};
        mAllowAutoBrightnessWhileDozingConfig = context.getResources().getBoolean(
                R.bool.config_allowAutoBrightnessWhileDozing);
        mOldBrightnessStrategyName = mInvalidBrightnessStrategy.getName();
@@ -168,6 +177,8 @@ public class DisplayBrightnessStrategySelector {
                && mOffloadBrightnessStrategy != null && BrightnessUtils.isValidBrightnessValue(
                mOffloadBrightnessStrategy.getOffloadScreenBrightness())) {
            displayBrightnessStrategy = mOffloadBrightnessStrategy;
        } else if (isAutoBrightnessFallbackStrategyValid()) {
            displayBrightnessStrategy = mAutoBrightnessFallbackStrategy;
        }

        if (mDisplayManagerFlags.isRefactorDisplayPowerControllerEnabled()) {
@@ -210,6 +221,11 @@ public class DisplayBrightnessStrategySelector {
        return mAllowAutoBrightnessWhileDozingConfig;
    }

    @Nullable
    public AutoBrightnessFallbackStrategy getAutoBrightnessFallbackStrategy() {
        return mAutoBrightnessFallbackStrategy;
    }

    /**
     * Dumps the state of this class.
     */
@@ -229,6 +245,13 @@ public class DisplayBrightnessStrategySelector {
        }
    }

    private boolean isAutoBrightnessFallbackStrategyValid() {
        return mDisplayManagerFlags.isRefactorDisplayPowerControllerEnabled()
                && mAutoBrightnessFallbackStrategy != null
                && getAutomaticBrightnessStrategy().shouldUseAutoBrightness()
                && mAutoBrightnessFallbackStrategy.isValid();
    }

    private boolean isAutomaticBrightnessStrategyValid(
            StrategySelectionRequest strategySelectionRequest) {
        mAutomaticBrightnessStrategy1.setAutoBrightnessState(
@@ -250,7 +273,8 @@ public class DisplayBrightnessStrategySelector {
                selectedDisplayBrightnessStrategy,
                strategySelectionRequest.getLastUserSetScreenBrightness(),
                strategySelectionRequest.isUserSetBrightnessChanged(),
                isAllowAutoBrightnessWhileDozingConfig());
                isAllowAutoBrightnessWhileDozingConfig(),
                getAutomaticBrightnessStrategy().shouldUseAutoBrightness());
    }

    private void postProcess(StrategySelectionNotifyRequest strategySelectionNotifyRequest) {
@@ -319,5 +343,9 @@ public class DisplayBrightnessStrategySelector {
                DisplayManagerFlags displayManagerFlags) {
            return new OffloadBrightnessStrategy(displayManagerFlags);
        }

        AutoBrightnessFallbackStrategy getAutoBrightnessFallbackStrategy() {
            return new AutoBrightnessFallbackStrategy(/* injector= */ null);
        }
    }
}
Loading