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

Commit 94f0e8d4 authored by Rupesh Bansal's avatar Rupesh Bansal Committed by Android (Google) Code Review
Browse files

Merge "Added AutoBrightnessFallbackStrategy" into main

parents 929ab9fd da0f2d52
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