diff options
| author | 2023-10-18 10:16:31 +0000 | |
|---|---|---|
| committer | 2023-12-14 14:16:39 +0000 | |
| commit | d1afa65ddbbca6439f735289637edd3468877e68 (patch) | |
| tree | 40592899056d7d109524316ff37a9735d28fa8f8 | |
| parent | 03b9c9c67811fdf2ba18d3916322fa3f0e41a866 (diff) | |
Make auto-brightness modes generic
Bug: 288481949
Bug: 293613040
Test: adb shell dumpsys display
Test: atest AutomaticBrightnessControllerTest
Test: atest BrightnessMappingStrategyTest
Test: atest DisplayManagerServiceTest
Test: atest DisplayPowerControllerTest
Test: atest DisplayPowerController2Test
Change-Id: Ie54af4fc38d179b290ce2f5021435a912db6c32a
12 files changed, 507 insertions, 515 deletions
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index 80c3a270efdf..33c7e3ffe8c5 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -16,6 +16,8 @@ package com.android.server.display; +import android.annotation.IntDef; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityTaskManager; import android.app.ActivityTaskManager.RootTaskInfo; @@ -40,6 +42,7 @@ import android.os.Trace; import android.util.EventLog; import android.util.MathUtils; import android.util.Slog; +import android.util.SparseArray; import android.util.TimeUtils; import com.android.internal.annotations.VisibleForTesting; @@ -49,6 +52,8 @@ import com.android.server.EventLogTags; import com.android.server.display.brightness.BrightnessEvent; import java.io.PrintWriter; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** * Manages the associated display brightness when in auto-brightness mode. This is also @@ -64,6 +69,16 @@ public class AutomaticBrightnessController { public static final int AUTO_BRIGHTNESS_DISABLED = 2; public static final int AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE = 3; + @IntDef(prefix = { "AUTO_BRIGHTNESS_MODE_" }, value = { + AUTO_BRIGHTNESS_MODE_DEFAULT, + AUTO_BRIGHTNESS_MODE_IDLE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AutomaticBrightnessMode{} + + public static final int AUTO_BRIGHTNESS_MODE_DEFAULT = 0; + public static final int AUTO_BRIGHTNESS_MODE_IDLE = 1; + // How long the current sensor reading is assumed to be valid beyond the current time. // This provides a bit of prediction, as well as ensures that the weight for the last sample is // non-zero, which in turn ensures that the total weight is non-zero. @@ -91,10 +106,11 @@ public class AutomaticBrightnessController { private final Sensor mLightSensor; // The mapper to translate ambient lux to screen brightness in the range [0, 1.0]. - @Nullable + @NonNull private BrightnessMappingStrategy mCurrentBrightnessMapper; - private final BrightnessMappingStrategy mInteractiveModeBrightnessMapper; - private final BrightnessMappingStrategy mIdleModeBrightnessMapper; + + // A map of Brightness Mapping Strategies indexed by AutomaticBrightnessMode + private final SparseArray<BrightnessMappingStrategy> mBrightnessMappingStrategyMap; // The minimum and maximum screen brightnesses. private final float mScreenBrightnessRangeMinimum; @@ -251,7 +267,7 @@ public class AutomaticBrightnessController { AutomaticBrightnessController(Callbacks callbacks, Looper looper, SensorManager sensorManager, Sensor lightSensor, - BrightnessMappingStrategy interactiveModeBrightnessMapper, + SparseArray<BrightnessMappingStrategy> brightnessMappingStrategyMap, int lightSensorWarmUpTime, float brightnessMin, float brightnessMax, float dozeScaleFactor, int lightSensorRate, int initialLightSensorRate, long brighteningLightDebounceConfig, long darkeningLightDebounceConfig, @@ -261,26 +277,25 @@ public class AutomaticBrightnessController { HysteresisLevels ambientBrightnessThresholdsIdle, HysteresisLevels screenBrightnessThresholdsIdle, Context context, BrightnessRangeController brightnessModeController, - BrightnessThrottler brightnessThrottler, - BrightnessMappingStrategy idleModeBrightnessMapper, int ambientLightHorizonShort, - int ambientLightHorizonLong, float userLux, float userBrightness) { + BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort, + int ambientLightHorizonLong, float userLux, float userNits) { this(new Injector(), callbacks, looper, sensorManager, lightSensor, - interactiveModeBrightnessMapper, - lightSensorWarmUpTime, brightnessMin, brightnessMax, dozeScaleFactor, - lightSensorRate, initialLightSensorRate, brighteningLightDebounceConfig, - darkeningLightDebounceConfig, brighteningLightDebounceConfigIdle, - darkeningLightDebounceConfigIdle, resetAmbientLuxAfterWarmUpConfig, - ambientBrightnessThresholds, screenBrightnessThresholds, - ambientBrightnessThresholdsIdle, screenBrightnessThresholdsIdle, context, - brightnessModeController, brightnessThrottler, idleModeBrightnessMapper, - ambientLightHorizonShort, ambientLightHorizonLong, userLux, userBrightness + brightnessMappingStrategyMap, lightSensorWarmUpTime, brightnessMin, brightnessMax, + dozeScaleFactor, lightSensorRate, initialLightSensorRate, + brighteningLightDebounceConfig, darkeningLightDebounceConfig, + brighteningLightDebounceConfigIdle, darkeningLightDebounceConfigIdle, + resetAmbientLuxAfterWarmUpConfig, ambientBrightnessThresholds, + screenBrightnessThresholds, ambientBrightnessThresholdsIdle, + screenBrightnessThresholdsIdle, context, brightnessModeController, + brightnessThrottler, ambientLightHorizonShort, ambientLightHorizonLong, userLux, + userNits ); } @VisibleForTesting AutomaticBrightnessController(Injector injector, Callbacks callbacks, Looper looper, SensorManager sensorManager, Sensor lightSensor, - BrightnessMappingStrategy interactiveModeBrightnessMapper, + SparseArray<BrightnessMappingStrategy> brightnessMappingStrategyMap, int lightSensorWarmUpTime, float brightnessMin, float brightnessMax, float dozeScaleFactor, int lightSensorRate, int initialLightSensorRate, long brighteningLightDebounceConfig, long darkeningLightDebounceConfig, @@ -290,15 +305,14 @@ public class AutomaticBrightnessController { HysteresisLevels ambientBrightnessThresholdsIdle, HysteresisLevels screenBrightnessThresholdsIdle, Context context, BrightnessRangeController brightnessModeController, - BrightnessThrottler brightnessThrottler, - BrightnessMappingStrategy idleModeBrightnessMapper, int ambientLightHorizonShort, - int ambientLightHorizonLong, float userLux, float userBrightness) { + BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort, + int ambientLightHorizonLong, float userLux, float userNits) { mInjector = injector; mClock = injector.createClock(); mContext = context; mCallbacks = callbacks; mSensorManager = sensorManager; - mCurrentBrightnessMapper = interactiveModeBrightnessMapper; + mCurrentBrightnessMapper = brightnessMappingStrategyMap.get(AUTO_BRIGHTNESS_MODE_DEFAULT); mScreenBrightnessRangeMinimum = brightnessMin; mScreenBrightnessRangeMaximum = brightnessMax; mLightSensorWarmUpTimeConfig = lightSensorWarmUpTime; @@ -337,13 +351,12 @@ public class AutomaticBrightnessController { mPendingForegroundAppCategory = ApplicationInfo.CATEGORY_UNDEFINED; mBrightnessRangeController = brightnessModeController; mBrightnessThrottler = brightnessThrottler; - mInteractiveModeBrightnessMapper = interactiveModeBrightnessMapper; - mIdleModeBrightnessMapper = idleModeBrightnessMapper; - // Initialize to active (normal) screen brightness mode - switchToInteractiveScreenBrightnessMode(); + mBrightnessMappingStrategyMap = brightnessMappingStrategyMap; // Use the given short-term model - setScreenBrightnessByUser(userLux, userBrightness); + if (userNits != BrightnessMappingStrategy.INVALID_NITS) { + setScreenBrightnessByUser(userLux, getBrightnessFromNits(userNits)); + } } /** @@ -358,11 +371,8 @@ public class AutomaticBrightnessController { if (mLoggingEnabled == loggingEnabled) { return false; } - if (mInteractiveModeBrightnessMapper != null) { - mInteractiveModeBrightnessMapper.setLoggingEnabled(loggingEnabled); - } - if (mIdleModeBrightnessMapper != null) { - mIdleModeBrightnessMapper.setLoggingEnabled(loggingEnabled); + for (int i = 0; i < mBrightnessMappingStrategyMap.size(); i++) { + mBrightnessMappingStrategyMap.valueAt(i).setLoggingEnabled(loggingEnabled); } mLoggingEnabled = loggingEnabled; return true; @@ -389,8 +399,7 @@ public class AutomaticBrightnessController { | (!mAmbientLuxValid ? BrightnessEvent.FLAG_INVALID_LUX : 0) | (mDisplayPolicy == DisplayPowerRequest.POLICY_DOZE ? BrightnessEvent.FLAG_DOZE_SCALE : 0) - | (mCurrentBrightnessMapper.isForIdleMode() - ? BrightnessEvent.FLAG_IDLE_CURVE : 0)); + | (isInIdleMode() ? BrightnessEvent.FLAG_IDLE_CURVE : 0)); } if (!mAmbientLuxValid) { @@ -464,15 +473,13 @@ public class AutomaticBrightnessController { // Used internally to establish whether we have deviated from the default config. public boolean isDefaultConfig() { - if (isInIdleMode()) { - return false; - } - return mInteractiveModeBrightnessMapper.isDefaultConfig(); + return mCurrentBrightnessMapper.getMode() == AUTO_BRIGHTNESS_MODE_DEFAULT + && mCurrentBrightnessMapper.isDefaultConfig(); } // Called from APIs to get the configuration. public BrightnessConfiguration getDefaultConfig() { - return mInteractiveModeBrightnessMapper.getDefaultConfig(); + return mBrightnessMappingStrategyMap.get(AUTO_BRIGHTNESS_MODE_DEFAULT).getDefaultConfig(); } /** @@ -527,8 +534,7 @@ public class AutomaticBrightnessController { } private boolean setScreenBrightnessByUser(float lux, float brightness) { - if (lux == BrightnessMappingStrategy.NO_USER_LUX - || brightness == BrightnessMappingStrategy.NO_USER_BRIGHTNESS) { + if (lux == BrightnessMappingStrategy.INVALID_LUX || Float.isNaN(brightness)) { return false; } mCurrentBrightnessMapper.addUserDataPoint(lux, brightness); @@ -543,7 +549,8 @@ public class AutomaticBrightnessController { public boolean setBrightnessConfiguration(BrightnessConfiguration configuration, boolean shouldResetShortTermModel) { - if (mInteractiveModeBrightnessMapper.setBrightnessConfiguration(configuration)) { + if (mBrightnessMappingStrategyMap.get(AUTO_BRIGHTNESS_MODE_DEFAULT) + .setBrightnessConfiguration(configuration)) { if (!isInIdleMode() && shouldResetShortTermModel) { resetShortTermModel(); } @@ -553,7 +560,7 @@ public class AutomaticBrightnessController { } public boolean isInIdleMode() { - return mCurrentBrightnessMapper.isForIdleMode(); + return mCurrentBrightnessMapper.getMode() == AUTO_BRIGHTNESS_MODE_IDLE; } public void dump(PrintWriter pw) { @@ -595,12 +602,6 @@ public class AutomaticBrightnessController { pw.println(" mAmbientLightRingBuffer=" + mAmbientLightRingBuffer); pw.println(" mScreenAutoBrightness=" + mScreenAutoBrightness); pw.println(" mDisplayPolicy=" + DisplayPowerRequest.policyToString(mDisplayPolicy)); - pw.println(" mShortTermModelTimeout(active)=" - + mInteractiveModeBrightnessMapper.getShortTermModelTimeout()); - if (mIdleModeBrightnessMapper != null) { - pw.println(" mShortTermModelTimeout(idle)=" - + mIdleModeBrightnessMapper.getShortTermModelTimeout()); - } pw.println(" mShortTermModel="); mShortTermModel.dump(pw); pw.println(" mPausedShortTermModel="); @@ -615,15 +616,14 @@ public class AutomaticBrightnessController { pw.println(" mPendingForegroundAppPackageName=" + mPendingForegroundAppPackageName); pw.println(" mForegroundAppCategory=" + mForegroundAppCategory); pw.println(" mPendingForegroundAppCategory=" + mPendingForegroundAppCategory); - pw.println(" Idle mode active=" + mCurrentBrightnessMapper.isForIdleMode()); + pw.println(" Current mode=" + mCurrentBrightnessMapper.getMode()); pw.println(); - pw.println(" mInteractiveMapper="); - mInteractiveModeBrightnessMapper.dump(pw, - mBrightnessRangeController.getNormalBrightnessMax()); - if (mIdleModeBrightnessMapper != null) { - pw.println(" mIdleMapper="); - mIdleModeBrightnessMapper.dump(pw, mBrightnessRangeController.getNormalBrightnessMax()); + for (int i = 0; i < mBrightnessMappingStrategyMap.size(); i++) { + pw.println(" Mapper for mode " + modeToString(mBrightnessMappingStrategyMap.keyAt(i)) + + "="); + mBrightnessMappingStrategyMap.valueAt(i).dump(pw, + mBrightnessRangeController.getNormalBrightnessMax()); } pw.println(); @@ -1117,68 +1117,58 @@ public class AutomaticBrightnessController { updateAutoBrightness(true /* sendUpdate */, false /* isManuallySet */); } - void switchToIdleMode() { - if (mIdleModeBrightnessMapper == null) { - return; - } - if (mCurrentBrightnessMapper.isForIdleMode()) { - return; - } - Slog.i(TAG, "Switching to Idle Screen Brightness Mode"); + private void switchModeAndShortTermModels(@AutomaticBrightnessMode int mode) { // Stash short term model ShortTermModel tempShortTermModel = new ShortTermModel(); tempShortTermModel.set(mCurrentBrightnessMapper.getUserLux(), mCurrentBrightnessMapper.getUserBrightness(), /* valid= */ true); - + mHandler.removeMessages(MSG_INVALIDATE_PAUSED_SHORT_TERM_MODEL); // Send delayed timeout mHandler.sendEmptyMessageAtTime(MSG_INVALIDATE_PAUSED_SHORT_TERM_MODEL, mClock.uptimeMillis() + mCurrentBrightnessMapper.getShortTermModelTimeout()); - Slog.i(TAG, "mPreviousShortTermModel" + mPausedShortTermModel); + Slog.i(TAG, "mPreviousShortTermModel: " + mPausedShortTermModel); // new brightness mapper - mCurrentBrightnessMapper = mIdleModeBrightnessMapper; + mCurrentBrightnessMapper = mBrightnessMappingStrategyMap.get(mode); // if previous stm has been invalidated, and lux has drastically changed, just use // the new, reset stm. // if previous stm is still valid then revalidate it - if (mPausedShortTermModel != null && !mPausedShortTermModel.maybeReset(mAmbientLux)) { - setScreenBrightnessByUser(mPausedShortTermModel.mAnchor, - mPausedShortTermModel.mBrightness); + if (mPausedShortTermModel != null) { + if (!mPausedShortTermModel.maybeReset(mAmbientLux)) { + setScreenBrightnessByUser(mPausedShortTermModel.mAnchor, + mPausedShortTermModel.mBrightness); + } + mPausedShortTermModel.copyFrom(tempShortTermModel); } - mPausedShortTermModel.copyFrom(tempShortTermModel); update(); } - void switchToInteractiveScreenBrightnessMode() { - if (!mCurrentBrightnessMapper.isForIdleMode()) { + void switchMode(@AutomaticBrightnessMode int mode) { + if (!mBrightnessMappingStrategyMap.contains(mode)) { return; } - Slog.i(TAG, "Switching to Interactive Screen Brightness Mode"); - ShortTermModel tempShortTermModel = new ShortTermModel(); - tempShortTermModel.set(mCurrentBrightnessMapper.getUserLux(), - mCurrentBrightnessMapper.getUserBrightness(), /* valid= */ true); - mHandler.removeMessages(MSG_INVALIDATE_PAUSED_SHORT_TERM_MODEL); - // Send delayed timeout - mHandler.sendEmptyMessageAtTime(MSG_INVALIDATE_PAUSED_SHORT_TERM_MODEL, - mClock.uptimeMillis() - + mCurrentBrightnessMapper.getShortTermModelTimeout()); - Slog.i(TAG, "mPreviousShortTermModel" + mPausedShortTermModel.toString()); - - // restore interactive mapper. - mCurrentBrightnessMapper = mInteractiveModeBrightnessMapper; - - // if previous stm has been invalidated, and lux has drastically changed, just use - // the new, reset stm. - // if previous stm is still valid then revalidate it - if (!mPausedShortTermModel.maybeReset(mAmbientLux)) { - setScreenBrightnessByUser(mPausedShortTermModel.mAnchor, - mPausedShortTermModel.mBrightness); + if (mCurrentBrightnessMapper.getMode() == mode) { + return; + } + Slog.i(TAG, "Switching to mode " + mode); + if (mode == AUTO_BRIGHTNESS_MODE_IDLE + || mCurrentBrightnessMapper.getMode() == AUTO_BRIGHTNESS_MODE_IDLE) { + switchModeAndShortTermModels(mode); + } else { + resetShortTermModel(); + mCurrentBrightnessMapper = mBrightnessMappingStrategyMap.get(mode); } - mPausedShortTermModel.copyFrom(tempShortTermModel); + } - update(); + float getUserLux() { + return mCurrentBrightnessMapper.getUserLux(); + } + + float getUserNits() { + return convertToNits(mCurrentBrightnessMapper.getUserBrightness()); } /** @@ -1187,14 +1177,11 @@ public class AutomaticBrightnessController { * passing the brightness value to follower displays. * * @param brightness The float scale value - * @return The nit value or -1f if no conversion is possible. + * @return The nit value or {@link BrightnessMappingStrategy.INVALID_NITS} if no conversion is + * possible. */ public float convertToNits(float brightness) { - if (mCurrentBrightnessMapper != null) { - return mCurrentBrightnessMapper.convertToNits(brightness); - } else { - return -1.0f; - } + return mCurrentBrightnessMapper.convertToNits(brightness); } /** @@ -1203,14 +1190,11 @@ public class AutomaticBrightnessController { * {@link com.android.server.display.BrightnessTracker}. * * @param brightness The float scale value - * @return The nit value or -1f if no conversion is possible. + * @return The nit value or {@link BrightnessMappingStrategy.INVALID_NITS} if no conversion is + * possible. */ public float convertToAdjustedNits(float brightness) { - if (mCurrentBrightnessMapper != null) { - return mCurrentBrightnessMapper.convertToAdjustedNits(brightness); - } else { - return -1.0f; - } + return mCurrentBrightnessMapper.convertToAdjustedNits(brightness); } /** @@ -1221,12 +1205,8 @@ public class AutomaticBrightnessController { * @return The float scale value or {@link PowerManager.BRIGHTNESS_INVALID_FLOAT} if no * conversion is possible. */ - public float convertToFloatScale(float nits) { - if (mCurrentBrightnessMapper != null) { - return mCurrentBrightnessMapper.convertToFloatScale(nits); - } else { - return PowerManager.BRIGHTNESS_INVALID_FLOAT; - } + public float getBrightnessFromNits(float nits) { + return mCurrentBrightnessMapper.getBrightnessFromNits(nits); } public void recalculateSplines(boolean applyAdjustment, float[] adjustment) { @@ -1244,19 +1224,27 @@ public class AutomaticBrightnessController { } } + private String modeToString(@AutomaticBrightnessMode int mode) { + return switch (mode) { + case AUTO_BRIGHTNESS_MODE_DEFAULT -> "default"; + case AUTO_BRIGHTNESS_MODE_IDLE -> "idle"; + default -> Integer.toString(mode); + }; + } + 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 // light. // The anchor determines what were the light levels when the user has set their preference, // and we use a relative threshold to determine when to revert to the OEM curve. - private float mAnchor = BrightnessMappingStrategy.NO_USER_LUX; - private float mBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS; + private float mAnchor = BrightnessMappingStrategy.INVALID_LUX; + private float mBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT; private boolean mIsValid = false; private void reset() { - mAnchor = BrightnessMappingStrategy.NO_USER_LUX; - mBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS; + mAnchor = BrightnessMappingStrategy.INVALID_LUX; + mBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT; mIsValid = false; } @@ -1279,10 +1267,8 @@ public class AutomaticBrightnessController { private boolean maybeReset(float currentLux) { // If the short term model was invalidated and the change is drastic enough, reset it. // Otherwise, we revalidate it. - if (!mIsValid && mAnchor != -1) { - if (mCurrentBrightnessMapper != null - && mCurrentBrightnessMapper.shouldResetShortTermModel( - currentLux, mAnchor)) { + if (!mIsValid && mAnchor != BrightnessMappingStrategy.INVALID_LUX) { + if (mCurrentBrightnessMapper.shouldResetShortTermModel(currentLux, mAnchor)) { resetShortTermModel(); } else { mIsValid = true; @@ -1304,7 +1290,7 @@ public class AutomaticBrightnessController { } public String toString() { - return " mAnchor: " + mAnchor + return "mAnchor: " + mAnchor + "\n mBrightness: " + mBrightness + "\n mIsValid: " + mIsValid; } diff --git a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java index d848f4b6cce5..acd253b38b3d 100644 --- a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java +++ b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java @@ -18,6 +18,9 @@ package com.android.server.display; import static android.text.TextUtils.formatSimple; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; + import android.annotation.Nullable; import android.content.pm.ApplicationInfo; import android.content.res.Resources; @@ -57,8 +60,8 @@ import java.util.Objects; public abstract class BrightnessMappingStrategy { private static final String TAG = "BrightnessMappingStrategy"; - public static final float NO_USER_LUX = -1; - public static final float NO_USER_BRIGHTNESS = -1; + public static final float INVALID_LUX = -1; + public static final float INVALID_NITS = -1; private static final float LUX_GRAD_SMOOTHING = 0.25f; private static final float MAX_GRAD = 1.0f; @@ -74,75 +77,48 @@ public abstract class BrightnessMappingStrategy { private static final Plog PLOG = Plog.createSystemPlog(TAG); /** - * Creates a BrightnessMappingStrategy for active (normal) mode. - * @param resources - * @param displayDeviceConfig - * @param displayWhiteBalanceController - * @return the BrightnessMappingStrategy - */ - @Nullable - public static BrightnessMappingStrategy create(Resources resources, - DisplayDeviceConfig displayDeviceConfig, - DisplayWhiteBalanceController displayWhiteBalanceController) { - return create(resources, displayDeviceConfig, /* isForIdleMode= */ false, - displayWhiteBalanceController); - } - - /** - * Creates a BrightnessMappingStrategy for idle screen brightness mode. - * @param resources - * @param displayDeviceConfig - * @param displayWhiteBalanceController - * @return the BrightnessMappingStrategy - */ - @Nullable - public static BrightnessMappingStrategy createForIdleMode(Resources resources, - DisplayDeviceConfig displayDeviceConfig, DisplayWhiteBalanceController - displayWhiteBalanceController) { - return create(resources, displayDeviceConfig, /* isForIdleMode= */ true, - displayWhiteBalanceController); - } - - /** - * Creates a BrightnessMapping strategy for either active or idle screen brightness mode. - * We do not create a simple mapping strategy for idle mode. + * Creates a BrightnessMapping strategy. We do not create a simple mapping strategy for idle + * mode. * * @param resources * @param displayDeviceConfig - * @param isForIdleMode determines whether the configurations loaded are for idle screen - * brightness mode or active screen brightness mode. + * @param mode The auto-brightness mode. Different modes use different brightness curves * @param displayWhiteBalanceController * @return the BrightnessMappingStrategy */ @Nullable - private static BrightnessMappingStrategy create(Resources resources, - DisplayDeviceConfig displayDeviceConfig, boolean isForIdleMode, + static BrightnessMappingStrategy create(Resources resources, + DisplayDeviceConfig displayDeviceConfig, + @AutomaticBrightnessController.AutomaticBrightnessMode int mode, DisplayWhiteBalanceController displayWhiteBalanceController) { // Display independent, mode dependent values - float[] brightnessLevelsNits; + float[] brightnessLevelsNits = null; float[] brightnessLevels = null; - float[] luxLevels; - if (isForIdleMode) { - brightnessLevelsNits = getFloatArray(resources.obtainTypedArray( - com.android.internal.R.array.config_autoBrightnessDisplayValuesNitsIdle)); - luxLevels = getLuxLevels(resources.getIntArray( - com.android.internal.R.array.config_autoBrightnessLevelsIdle)); - } else { - brightnessLevelsNits = displayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(); - luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(); - - brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(); - if (brightnessLevels == null || brightnessLevels.length == 0) { - // Load the old configuration in the range [0, 255]. The values need to be - // normalized to the range [0, 1]. - int[] brightnessLevelsInt = resources.getIntArray( - com.android.internal.R.array.config_autoBrightnessLcdBacklightValues); - brightnessLevels = new float[brightnessLevelsInt.length]; - for (int i = 0; i < brightnessLevels.length; i++) { - brightnessLevels[i] = normalizeAbsoluteBrightness(brightnessLevelsInt[i]); + float[] luxLevels = null; + switch (mode) { + case AUTO_BRIGHTNESS_MODE_DEFAULT: + brightnessLevelsNits = displayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(); + luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(); + + brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(); + if (brightnessLevels == null || brightnessLevels.length == 0) { + // Load the old configuration in the range [0, 255]. The values need to be + // normalized to the range [0, 1]. + int[] brightnessLevelsInt = resources.getIntArray( + com.android.internal.R.array.config_autoBrightnessLcdBacklightValues); + brightnessLevels = new float[brightnessLevelsInt.length]; + for (int i = 0; i < brightnessLevels.length; i++) { + brightnessLevels[i] = normalizeAbsoluteBrightness(brightnessLevelsInt[i]); + } } - } + break; + case AUTO_BRIGHTNESS_MODE_IDLE: + brightnessLevelsNits = getFloatArray(resources.obtainTypedArray( + com.android.internal.R.array.config_autoBrightnessDisplayValuesNitsIdle)); + luxLevels = getLuxLevels(resources.getIntArray( + com.android.internal.R.array.config_autoBrightnessLevelsIdle)); + break; } // Display independent, mode independent values @@ -158,17 +134,16 @@ public abstract class BrightnessMappingStrategy { if (isValidMapping(nitsRange, brightnessRange) && isValidMapping(luxLevels, brightnessLevelsNits)) { - BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder( luxLevels, brightnessLevelsNits); builder.setShortTermModelTimeoutMillis(shortTermModelTimeout); builder.setShortTermModelLowerLuxMultiplier(SHORT_TERM_MODEL_THRESHOLD_RATIO); builder.setShortTermModelUpperLuxMultiplier(SHORT_TERM_MODEL_THRESHOLD_RATIO); return new PhysicalMappingStrategy(builder.build(), nitsRange, brightnessRange, - autoBrightnessAdjustmentMaxGamma, isForIdleMode, displayWhiteBalanceController); + autoBrightnessAdjustmentMaxGamma, mode, displayWhiteBalanceController); } else if (isValidMapping(luxLevels, brightnessLevels)) { return new SimpleMappingStrategy(luxLevels, brightnessLevels, - autoBrightnessAdjustmentMaxGamma, shortTermModelTimeout); + autoBrightnessAdjustmentMaxGamma, shortTermModelTimeout, mode); } else { return null; } @@ -334,7 +309,7 @@ public abstract class BrightnessMappingStrategy { /** * Converts the provided brightness value to nits if possible. * - * Returns -1.0f if there's no available mapping for the brightness to nits. + * Returns {@link INVALID_NITS} if there's no available mapping for the brightness to nits. */ public abstract float convertToNits(float brightness); @@ -342,7 +317,7 @@ public abstract class BrightnessMappingStrategy { * Converts the provided brightness value to nits if possible. Adjustments, such as RBC are * applied. * - * Returns -1.0f if there's no available mapping for the brightness to nits. + * Returns {@link INVALID_NITS} if there's no available mapping for the brightness to nits. */ public abstract float convertToAdjustedNits(float brightness); @@ -352,7 +327,7 @@ public abstract class BrightnessMappingStrategy { * Returns {@link PowerManager.BRIGHTNESS_INVALID_FLOAT} if there's no available mapping for * the nits to float scale. */ - public abstract float convertToFloatScale(float nits); + public abstract float getBrightnessFromNits(float nits); /** * Adds a user interaction data point to the brightness mapping. @@ -407,17 +382,18 @@ public abstract class BrightnessMappingStrategy { */ public abstract void dump(PrintWriter pw, float hbmTransition); - /** - * We can designate a mapping strategy to be used for idle screen brightness mode. - * @return whether this mapping strategy is to be used for idle screen brightness mode. - */ - public abstract boolean isForIdleMode(); - abstract float getUserLux(); abstract float getUserBrightness(); /** + * @return The auto-brightness mode of this mapping strategy. Different modes use different + * brightness curves. + */ + @AutomaticBrightnessController.AutomaticBrightnessMode + abstract int getMode(); + + /** * Check if the short term model should be reset given the anchor lux the last * brightness change was made at and the current ambient lux. */ @@ -596,7 +572,7 @@ public abstract class BrightnessMappingStrategy { if (mLoggingEnabled) { PLOG.logCurve("gamma adjusted curve", newLux, newBrightness); } - if (userLux != -1) { + if (userLux != INVALID_LUX) { Pair<float[], float[]> curve = insertControlPoint(newLux, newBrightness, userLux, userBrightness); newLux = curve.first; @@ -624,6 +600,9 @@ public abstract class BrightnessMappingStrategy { // Brightness control points normalized to [0, 1] private final float[] mBrightness; + @AutomaticBrightnessController.AutomaticBrightnessMode + private final int mMode; + private Spline mSpline; private float mMaxGamma; private float mAutoBrightnessAdjustment; @@ -632,7 +611,7 @@ public abstract class BrightnessMappingStrategy { private long mShortTermModelTimeout; private SimpleMappingStrategy(float[] lux, float[] brightness, float maxGamma, - long timeout) { + long timeout, @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { Preconditions.checkArgument(lux.length != 0 && brightness.length != 0, "Lux and brightness arrays must not be empty!"); Preconditions.checkArgument(lux.length == brightness.length, @@ -651,13 +630,14 @@ public abstract class BrightnessMappingStrategy { mMaxGamma = maxGamma; mAutoBrightnessAdjustment = 0; - mUserLux = NO_USER_LUX; - mUserBrightness = NO_USER_BRIGHTNESS; + mUserLux = INVALID_LUX; + mUserBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT; if (mLoggingEnabled) { PLOG.start("simple mapping strategy"); } computeSpline(); mShortTermModelTimeout = timeout; + mMode = mode; } @Override @@ -704,16 +684,16 @@ public abstract class BrightnessMappingStrategy { @Override public float convertToNits(float brightness) { - return -1.0f; + return INVALID_NITS; } @Override public float convertToAdjustedNits(float brightness) { - return -1.0f; + return INVALID_NITS; } @Override - public float convertToFloatScale(float nits) { + public float getBrightnessFromNits(float nits) { return PowerManager.BRIGHTNESS_INVALID_FLOAT; } @@ -741,22 +721,22 @@ public abstract class BrightnessMappingStrategy { @Override public void clearUserDataPoints() { - if (mUserLux != -1) { + if (mUserLux != INVALID_LUX) { if (mLoggingEnabled) { Slog.d(TAG, "clearUserDataPoints: " + mAutoBrightnessAdjustment + " => 0"); PLOG.start("clear user data points") .logPoint("user data point", mUserLux, mUserBrightness); } mAutoBrightnessAdjustment = 0; - mUserLux = -1; - mUserBrightness = -1; + mUserLux = INVALID_LUX; + mUserBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT; computeSpline(); } } @Override public boolean hasUserDataPoints() { - return mUserLux != -1; + return mUserLux != INVALID_LUX; } @Override @@ -782,11 +762,12 @@ public abstract class BrightnessMappingStrategy { pw.println(" mAutoBrightnessAdjustment=" + mAutoBrightnessAdjustment); pw.println(" mUserLux=" + mUserLux); pw.println(" mUserBrightness=" + mUserBrightness); + pw.println(" mShortTermModelTimeout=" + mShortTermModelTimeout); } @Override - public boolean isForIdleMode() { - return false; + int getMode() { + return mMode; } @Override @@ -854,9 +835,11 @@ public abstract class BrightnessMappingStrategy { private float mAutoBrightnessAdjustment; private float mUserLux; private float mUserBrightness; - private final boolean mIsForIdleMode; private final DisplayWhiteBalanceController mDisplayWhiteBalanceController; + @AutomaticBrightnessController.AutomaticBrightnessMode + private final int mMode; + // Previous short-term models and the times that they were computed stored for debugging // purposes private List<Spline> mPreviousBrightnessSplines = new ArrayList<>(); @@ -865,7 +848,8 @@ public abstract class BrightnessMappingStrategy { private static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS"); public PhysicalMappingStrategy(BrightnessConfiguration config, float[] nits, - float[] brightness, float maxGamma, boolean isForIdleMode, + float[] brightness, float maxGamma, + @AutomaticBrightnessController.AutomaticBrightnessMode int mode, DisplayWhiteBalanceController displayWhiteBalanceController) { Preconditions.checkArgument(nits.length != 0 && brightness.length != 0, @@ -878,11 +862,11 @@ public abstract class BrightnessMappingStrategy { Preconditions.checkArrayElementsInRange(brightness, PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, "brightness"); - mIsForIdleMode = isForIdleMode; + mMode = mode; mMaxGamma = maxGamma; mAutoBrightnessAdjustment = 0; - mUserLux = NO_USER_LUX; - mUserBrightness = NO_USER_BRIGHTNESS; + mUserLux = INVALID_LUX; + mUserBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT; mDisplayWhiteBalanceController = displayWhiteBalanceController; mNits = nits; @@ -982,7 +966,7 @@ public abstract class BrightnessMappingStrategy { } @Override - public float convertToFloatScale(float nits) { + public float getBrightnessFromNits(float nits) { return mNitsToBrightnessSpline.interpolate(nits); } @@ -1024,15 +1008,15 @@ public abstract class BrightnessMappingStrategy { .logPoint("user data point", mUserLux, mUserBrightness); } mAutoBrightnessAdjustment = 0; - mUserLux = -1; - mUserBrightness = -1; + mUserLux = INVALID_LUX; + mUserBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT; computeSpline(); } } @Override public boolean hasUserDataPoints() { - return mUserLux != -1; + return mUserLux != INVALID_LUX; } @Override @@ -1072,6 +1056,7 @@ public abstract class BrightnessMappingStrategy { pw.println(" mUserBrightness=" + mUserBrightness); pw.println(" mDefaultConfig=" + mDefaultConfig); pw.println(" mBrightnessRangeAdjustmentApplied=" + mBrightnessRangeAdjustmentApplied); + pw.println(" shortTermModelTimeout=" + getShortTermModelTimeout()); pw.println(" Previous short-term models (oldest to newest): "); for (int i = 0; i < mPreviousBrightnessSplines.size(); i++) { @@ -1086,8 +1071,8 @@ public abstract class BrightnessMappingStrategy { } @Override - public boolean isForIdleMode() { - return mIsForIdleMode; + int getMode() { + return mMode; } @Override diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 2ab15e639d68..e38d08ff2a1a 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -2880,7 +2880,9 @@ public final class DisplayManagerService extends SystemService { final DisplayPowerControllerInterface displayPowerController = mDisplayPowerControllers.get(displayId); if (displayPowerController != null) { - displayPowerController.setAutomaticScreenBrightnessMode(enabled); + displayPowerController.setAutomaticScreenBrightnessMode(enabled + ? AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE + : AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT); } } } diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index f09fcea69a88..b6c10788c306 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -16,6 +16,9 @@ package com.android.server.display; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; + import android.animation.Animator; import android.animation.ObjectAnimator; import android.annotation.NonNull; @@ -53,7 +56,6 @@ import android.os.Trace; import android.os.UserHandle; import android.provider.Settings; import android.util.FloatProperty; -import android.util.Log; import android.util.MathUtils; import android.util.MutableFloat; import android.util.MutableInt; @@ -498,15 +500,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private Sensor mLightSensor; private Sensor mScreenOffBrightnessSensor; - // The mappers between ambient lux, display backlight values, and display brightness. - // We will switch between the idle mapper and active mapper in AutomaticBrightnessController. - // Mapper used for active (normal) screen brightness mode - @Nullable - private BrightnessMappingStrategy mInteractiveModeBrightnessMapper; - // Mapper used for idle screen brightness mode - @Nullable - private BrightnessMappingStrategy mIdleModeBrightnessMapper; - // The current brightness configuration. @Nullable private BrightnessConfiguration mBrightnessConfiguration; @@ -609,7 +602,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting, Runnable onBrightnessChangeRunnable, HighBrightnessModeMetadata hbmMetadata, boolean bootCompleted, DisplayManagerFlags flags) { - + mFlags = flags; mInjector = injector != null ? injector : new Injector(); mClock = mInjector.getClock(); mLogicalDisplay = logicalDisplay; @@ -767,8 +760,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mPendingAutoBrightnessAdjustment = PowerManager.BRIGHTNESS_INVALID_FLOAT; mBootCompleted = bootCompleted; - - mFlags = flags; } private void applyReduceBrightColorsSplineAdjustment() { @@ -780,13 +771,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (mAutomaticBrightnessController == null) { return; } - if ((!mAutomaticBrightnessController.isInIdleMode() - && mInteractiveModeBrightnessMapper == null) - || (mAutomaticBrightnessController.isInIdleMode() - && mIdleModeBrightnessMapper == null)) { - Log.w(mTag, "No brightness mapping available to recalculate splines for this mode"); - return; - } float[] adjustedNits = new float[mNitsRange.length]; for (int i = 0; i < mNitsRange.length; i++) { @@ -848,10 +832,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call public void setBrightnessToFollow(float leadDisplayBrightness, float nits, float ambientLux, boolean slowChange) { mBrightnessRangeController.onAmbientLuxChange(ambientLux); - if (nits < 0) { + if (nits == BrightnessMappingStrategy.INVALID_NITS) { mBrightnessToFollow = leadDisplayBrightness; } else { - float brightness = convertToFloatScale(nits); + float brightness = getBrightnessFromNits(nits); if (isValidBrightnessValue(brightness)) { mBrightnessToFollow = brightness; } else { @@ -876,7 +860,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call synchronized (mLock) { mDisplayBrightnessFollowers.remove(follower.getDisplayId()); mHandler.postAtTime(() -> follower.setBrightnessToFollow( - PowerManager.BRIGHTNESS_INVALID_FLOAT, /* nits= */ -1, + PowerManager.BRIGHTNESS_INVALID_FLOAT, BrightnessMappingStrategy.INVALID_NITS, /* ambientLux= */ 0, /* slowChange= */ false), mClock.uptimeMillis()); } } @@ -886,7 +870,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call for (int i = 0; i < mDisplayBrightnessFollowers.size(); i++) { DisplayPowerControllerInterface follower = mDisplayBrightnessFollowers.valueAt(i); mHandler.postAtTime(() -> follower.setBrightnessToFollow( - PowerManager.BRIGHTNESS_INVALID_FLOAT, /* nits= */ -1, + PowerManager.BRIGHTNESS_INVALID_FLOAT, BrightnessMappingStrategy.INVALID_NITS, /* ambientLux= */ 0, /* slowChange= */ false), mClock.uptimeMillis()); } mDisplayBrightnessFollowers.clear(); @@ -1168,24 +1152,35 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call return; } - float userLux = BrightnessMappingStrategy.NO_USER_LUX; - float userNits = -1; - if (mInteractiveModeBrightnessMapper != null) { - userLux = mInteractiveModeBrightnessMapper.getUserLux(); - float userBrightness = mInteractiveModeBrightnessMapper.getUserBrightness(); - userNits = mInteractiveModeBrightnessMapper.convertToNits(userBrightness); - } + SparseArray<BrightnessMappingStrategy> brightnessMappers = new SparseArray<>(); + + BrightnessMappingStrategy defaultModeBrightnessMapper = + mInjector.getDefaultModeBrightnessMapper(resources, mDisplayDeviceConfig, + mDisplayWhiteBalanceController); + brightnessMappers.append(AUTO_BRIGHTNESS_MODE_DEFAULT, + defaultModeBrightnessMapper); final boolean isIdleScreenBrightnessEnabled = resources.getBoolean( R.bool.config_enableIdleScreenBrightnessMode); - mInteractiveModeBrightnessMapper = mInjector.getInteractiveModeBrightnessMapper(resources, - mDisplayDeviceConfig, mDisplayWhiteBalanceController); if (isIdleScreenBrightnessEnabled) { - mIdleModeBrightnessMapper = BrightnessMappingStrategy.createForIdleMode(resources, - mDisplayDeviceConfig, mDisplayWhiteBalanceController); + BrightnessMappingStrategy idleModeBrightnessMapper = + BrightnessMappingStrategy.create(resources, mDisplayDeviceConfig, + AUTO_BRIGHTNESS_MODE_IDLE, + mDisplayWhiteBalanceController); + if (idleModeBrightnessMapper != null) { + brightnessMappers.append(AUTO_BRIGHTNESS_MODE_IDLE, + idleModeBrightnessMapper); + } + } + + float userLux = BrightnessMappingStrategy.INVALID_LUX; + float userNits = BrightnessMappingStrategy.INVALID_NITS; + if (mAutomaticBrightnessController != null) { + userLux = mAutomaticBrightnessController.getUserLux(); + userNits = mAutomaticBrightnessController.getUserNits(); } - if (mInteractiveModeBrightnessMapper != null) { + if (defaultModeBrightnessMapper != null) { final float dozeScaleFactor = resources.getFraction( com.android.internal.R.fraction.config_screenAutoBrightnessDozeScaleFactor, 1, 1); @@ -1297,25 +1292,17 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call if (mAutomaticBrightnessController != null) { mAutomaticBrightnessController.stop(); } - float userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS; - if (userNits >= 0) { - userBrightness = mInteractiveModeBrightnessMapper.convertToFloatScale(userNits); - if (Float.isNaN(userBrightness)) { - userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS; - } - } mAutomaticBrightnessController = mInjector.getAutomaticBrightnessController( this, handler.getLooper(), mSensorManager, mLightSensor, - mInteractiveModeBrightnessMapper, lightSensorWarmUpTimeConfig, - PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, dozeScaleFactor, - lightSensorRate, initialLightSensorRate, brighteningLightDebounce, - darkeningLightDebounce, brighteningLightDebounceIdle, - darkeningLightDebounceIdle, autoBrightnessResetAmbientLuxAfterWarmUp, - ambientBrightnessThresholds, screenBrightnessThresholds, - ambientBrightnessThresholdsIdle, screenBrightnessThresholdsIdle, mContext, - mBrightnessRangeController, mBrightnessThrottler, mIdleModeBrightnessMapper, - mDisplayDeviceConfig.getAmbientHorizonShort(), - mDisplayDeviceConfig.getAmbientHorizonLong(), userLux, userBrightness); + brightnessMappers, lightSensorWarmUpTimeConfig, PowerManager.BRIGHTNESS_MIN, + PowerManager.BRIGHTNESS_MAX, dozeScaleFactor, lightSensorRate, + initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce, + brighteningLightDebounceIdle, darkeningLightDebounceIdle, + autoBrightnessResetAmbientLuxAfterWarmUp, ambientBrightnessThresholds, + screenBrightnessThresholds, ambientBrightnessThresholdsIdle, + screenBrightnessThresholdsIdle, mContext, mBrightnessRangeController, + mBrightnessThrottler, mDisplayDeviceConfig.getAmbientHorizonShort(), + mDisplayDeviceConfig.getAmbientHorizonLong(), userLux, userNits); mBrightnessEventRingBuffer = new RingBuffer<>(BrightnessEvent.class, RINGBUFFER_MAX); @@ -1334,7 +1321,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mHandler, SystemClock::uptimeMillis, sensorValueToLux, - mInteractiveModeBrightnessMapper); + defaultModeBrightnessMapper); } } else { mUseSoftwareAutoBrightnessConfig = false; @@ -1377,13 +1364,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } @Override - public void setAutomaticScreenBrightnessMode(boolean isIdle) { + public void setAutomaticScreenBrightnessMode( + @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { + boolean isIdle = mode == AUTO_BRIGHTNESS_MODE_IDLE; if (mAutomaticBrightnessController != null) { - if (isIdle) { - mAutomaticBrightnessController.switchToIdleMode(); - } else { - mAutomaticBrightnessController.switchToInteractiveScreenBrightnessMode(); - } + mAutomaticBrightnessController.switchMode(mode); setAnimatorRampSpeeds(isIdle); } @@ -2809,7 +2794,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call float brightnessNitsForDefaultDisplay = mBrightnessSetting.getBrightnessNitsForDefaultDisplay(); if (brightnessNitsForDefaultDisplay >= 0) { - float brightnessForDefaultDisplay = convertToFloatScale( + float brightnessForDefaultDisplay = getBrightnessFromNits( brightnessNitsForDefaultDisplay); if (isValidBrightnessValue(brightnessForDefaultDisplay)) { mBrightnessSetting.setBrightness(brightnessForDefaultDisplay); @@ -2943,23 +2928,23 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private float convertToNits(float brightness) { if (mAutomaticBrightnessController == null) { - return -1f; + return BrightnessMappingStrategy.INVALID_NITS; } return mAutomaticBrightnessController.convertToNits(brightness); } private float convertToAdjustedNits(float brightness) { if (mAutomaticBrightnessController == null) { - return -1f; + return BrightnessMappingStrategy.INVALID_NITS; } return mAutomaticBrightnessController.convertToAdjustedNits(brightness); } - private float convertToFloatScale(float nits) { + private float getBrightnessFromNits(float nits) { if (mAutomaticBrightnessController == null) { return PowerManager.BRIGHTNESS_INVALID_FLOAT; } - return mAutomaticBrightnessController.convertToFloatScale(nits); + return mAutomaticBrightnessController.getBrightnessFromNits(nits); } @GuardedBy("mLock") @@ -3634,7 +3619,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call AutomaticBrightnessController getAutomaticBrightnessController( AutomaticBrightnessController.Callbacks callbacks, Looper looper, SensorManager sensorManager, Sensor lightSensor, - BrightnessMappingStrategy interactiveModeBrightnessMapper, + SparseArray<BrightnessMappingStrategy> brightnessMappingStrategyMap, int lightSensorWarmUpTime, float brightnessMin, float brightnessMax, float dozeScaleFactor, int lightSensorRate, int initialLightSensorRate, long brighteningLightDebounceConfig, long darkeningLightDebounceConfig, @@ -3644,27 +3629,27 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call HysteresisLevels screenBrightnessThresholds, HysteresisLevels ambientBrightnessThresholdsIdle, HysteresisLevels screenBrightnessThresholdsIdle, Context context, - BrightnessRangeController brightnessRangeController, - BrightnessThrottler brightnessThrottler, - BrightnessMappingStrategy idleModeBrightnessMapper, int ambientLightHorizonShort, - int ambientLightHorizonLong, float userLux, float userBrightness) { + BrightnessRangeController brightnessModeController, + BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort, + int ambientLightHorizonLong, float userLux, float userNits) { return new AutomaticBrightnessController(callbacks, looper, sensorManager, lightSensor, - interactiveModeBrightnessMapper, lightSensorWarmUpTime, brightnessMin, + brightnessMappingStrategyMap, lightSensorWarmUpTime, brightnessMin, brightnessMax, dozeScaleFactor, lightSensorRate, initialLightSensorRate, brighteningLightDebounceConfig, darkeningLightDebounceConfig, brighteningLightDebounceConfigIdle, darkeningLightDebounceConfigIdle, resetAmbientLuxAfterWarmUpConfig, ambientBrightnessThresholds, screenBrightnessThresholds, ambientBrightnessThresholdsIdle, - screenBrightnessThresholdsIdle, context, brightnessRangeController, - brightnessThrottler, idleModeBrightnessMapper, ambientLightHorizonShort, - ambientLightHorizonLong, userLux, userBrightness); + screenBrightnessThresholdsIdle, context, brightnessModeController, + brightnessThrottler, ambientLightHorizonShort, ambientLightHorizonLong, userLux, + userNits); } - BrightnessMappingStrategy getInteractiveModeBrightnessMapper(Resources resources, + BrightnessMappingStrategy getDefaultModeBrightnessMapper(Resources resources, DisplayDeviceConfig displayDeviceConfig, DisplayWhiteBalanceController displayWhiteBalanceController) { return BrightnessMappingStrategy.create(resources, - displayDeviceConfig, displayWhiteBalanceController); + displayDeviceConfig, AUTO_BRIGHTNESS_MODE_DEFAULT, + displayWhiteBalanceController); } HysteresisLevels getHysteresisLevels(float[] brighteningThresholdsPercentages, diff --git a/services/core/java/com/android/server/display/DisplayPowerController2.java b/services/core/java/com/android/server/display/DisplayPowerController2.java index 5310e43eaf1b..810c183a16a0 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController2.java +++ b/services/core/java/com/android/server/display/DisplayPowerController2.java @@ -16,6 +16,9 @@ package com.android.server.display; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; + import android.animation.Animator; import android.animation.ObjectAnimator; import android.annotation.Nullable; @@ -52,7 +55,6 @@ import android.os.UserHandle; import android.provider.Settings; import android.util.FloatProperty; import android.util.IndentingPrintWriter; -import android.util.Log; import android.util.MathUtils; import android.util.MutableFloat; import android.util.MutableInt; @@ -442,15 +444,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal private Sensor mLightSensor; private Sensor mScreenOffBrightnessSensor; - // The mappers between ambient lux, display backlight values, and display brightness. - // We will switch between the idle mapper and active mapper in AutomaticBrightnessController. - // Mapper used for active (normal) screen brightness mode - @Nullable - private BrightnessMappingStrategy mInteractiveModeBrightnessMapper; - // Mapper used for idle screen brightness mode - @Nullable - private BrightnessMappingStrategy mIdleModeBrightnessMapper; - private boolean mIsRbcActive; // Animators. @@ -490,7 +483,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal BrightnessTracker brightnessTracker, BrightnessSetting brightnessSetting, Runnable onBrightnessChangeRunnable, HighBrightnessModeMetadata hbmMetadata, boolean bootCompleted, DisplayManagerFlags flags) { - + mFlags = flags; mInjector = injector != null ? injector : new Injector(); mClock = mInjector.getClock(); mLogicalDisplay = logicalDisplay; @@ -636,7 +629,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal R.bool.config_displayBrightnessBucketsInDoze); mBootCompleted = bootCompleted; - mFlags = flags; } private void applyReduceBrightColorsSplineAdjustment() { @@ -648,13 +640,6 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal if (mAutomaticBrightnessController == null) { return; } - if ((!mAutomaticBrightnessController.isInIdleMode() - && mInteractiveModeBrightnessMapper == null) - || (mAutomaticBrightnessController.isInIdleMode() - && mIdleModeBrightnessMapper == null)) { - Log.w(mTag, "No brightness mapping available to recalculate splines for this mode"); - return; - } float[] adjustedNits = new float[mNitsRange.length]; for (int i = 0; i < mNitsRange.length; i++) { @@ -987,24 +972,35 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal return; } - float userLux = BrightnessMappingStrategy.NO_USER_LUX; - float userNits = -1; - if (mInteractiveModeBrightnessMapper != null) { - userLux = mInteractiveModeBrightnessMapper.getUserLux(); - float userBrightness = mInteractiveModeBrightnessMapper.getUserBrightness(); - userNits = mInteractiveModeBrightnessMapper.convertToNits(userBrightness); - } + SparseArray<BrightnessMappingStrategy> brightnessMappers = new SparseArray<>(); + + BrightnessMappingStrategy defaultModeBrightnessMapper = + mInjector.getDefaultModeBrightnessMapper(resources, mDisplayDeviceConfig, + mDisplayWhiteBalanceController); + brightnessMappers.append(AUTO_BRIGHTNESS_MODE_DEFAULT, + defaultModeBrightnessMapper); final boolean isIdleScreenBrightnessEnabled = resources.getBoolean( R.bool.config_enableIdleScreenBrightnessMode); - mInteractiveModeBrightnessMapper = mInjector.getInteractiveModeBrightnessMapper(resources, - mDisplayDeviceConfig, mDisplayWhiteBalanceController); if (isIdleScreenBrightnessEnabled) { - mIdleModeBrightnessMapper = BrightnessMappingStrategy.createForIdleMode(resources, - mDisplayDeviceConfig, mDisplayWhiteBalanceController); + BrightnessMappingStrategy idleModeBrightnessMapper = + BrightnessMappingStrategy.create(resources, mDisplayDeviceConfig, + AUTO_BRIGHTNESS_MODE_IDLE, + mDisplayWhiteBalanceController); + if (idleModeBrightnessMapper != null) { + brightnessMappers.append(AUTO_BRIGHTNESS_MODE_IDLE, + idleModeBrightnessMapper); + } + } + + float userLux = BrightnessMappingStrategy.INVALID_LUX; + float userNits = BrightnessMappingStrategy.INVALID_NITS; + if (mAutomaticBrightnessController != null) { + userLux = mAutomaticBrightnessController.getUserLux(); + userNits = mAutomaticBrightnessController.getUserNits(); } - if (mInteractiveModeBrightnessMapper != null) { + if (defaultModeBrightnessMapper != null) { final float dozeScaleFactor = resources.getFraction( R.fraction.config_screenAutoBrightnessDozeScaleFactor, 1, 1); @@ -1116,25 +1112,17 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal if (mAutomaticBrightnessController != null) { mAutomaticBrightnessController.stop(); } - float userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS; - if (userNits >= 0) { - userBrightness = mInteractiveModeBrightnessMapper.convertToFloatScale(userNits); - if (Float.isNaN(userBrightness)) { - userBrightness = BrightnessMappingStrategy.NO_USER_BRIGHTNESS; - } - } mAutomaticBrightnessController = mInjector.getAutomaticBrightnessController( this, handler.getLooper(), mSensorManager, mLightSensor, - mInteractiveModeBrightnessMapper, lightSensorWarmUpTimeConfig, - PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, dozeScaleFactor, - lightSensorRate, initialLightSensorRate, brighteningLightDebounce, - darkeningLightDebounce, brighteningLightDebounceIdle, - darkeningLightDebounceIdle, autoBrightnessResetAmbientLuxAfterWarmUp, - ambientBrightnessThresholds, screenBrightnessThresholds, - ambientBrightnessThresholdsIdle, screenBrightnessThresholdsIdle, mContext, - mBrightnessRangeController, mBrightnessThrottler, mIdleModeBrightnessMapper, - mDisplayDeviceConfig.getAmbientHorizonShort(), - mDisplayDeviceConfig.getAmbientHorizonLong(), userLux, userBrightness); + brightnessMappers, lightSensorWarmUpTimeConfig, PowerManager.BRIGHTNESS_MIN, + PowerManager.BRIGHTNESS_MAX, dozeScaleFactor, lightSensorRate, + initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce, + brighteningLightDebounceIdle, darkeningLightDebounceIdle, + autoBrightnessResetAmbientLuxAfterWarmUp, ambientBrightnessThresholds, + screenBrightnessThresholds, ambientBrightnessThresholdsIdle, + screenBrightnessThresholdsIdle, mContext, mBrightnessRangeController, + mBrightnessThrottler, mDisplayDeviceConfig.getAmbientHorizonShort(), + mDisplayDeviceConfig.getAmbientHorizonLong(), userLux, userNits); mDisplayBrightnessController.setAutomaticBrightnessController( mAutomaticBrightnessController); @@ -1157,7 +1145,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mHandler, SystemClock::uptimeMillis, sensorValueToLux, - mInteractiveModeBrightnessMapper); + defaultModeBrightnessMapper); } } else { mUseSoftwareAutoBrightnessConfig = false; @@ -1200,13 +1188,11 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal } @Override - public void setAutomaticScreenBrightnessMode(boolean isIdle) { + public void setAutomaticScreenBrightnessMode( + @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { + boolean isIdle = mode == AUTO_BRIGHTNESS_MODE_IDLE; if (mAutomaticBrightnessController != null) { - if (isIdle) { - mAutomaticBrightnessController.switchToIdleMode(); - } else { - mAutomaticBrightnessController.switchToInteractiveScreenBrightnessMode(); - } + mAutomaticBrightnessController.switchMode(mode); setAnimatorRampSpeeds(isIdle); } Message msg = mHandler.obtainMessage(); @@ -2350,10 +2336,10 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal public void setBrightnessToFollow(float leadDisplayBrightness, float nits, float ambientLux, boolean slowChange) { mBrightnessRangeController.onAmbientLuxChange(ambientLux); - if (nits < 0) { + if (nits == BrightnessMappingStrategy.INVALID_NITS) { mDisplayBrightnessController.setBrightnessToFollow(leadDisplayBrightness, slowChange); } else { - float brightness = mDisplayBrightnessController.convertToFloatScale(nits); + float brightness = mDisplayBrightnessController.getBrightnessFromNits(nits); if (BrightnessUtils.isValidBrightnessValue(brightness)) { mDisplayBrightnessController.setBrightnessToFollow(brightness, slowChange); } else { @@ -2420,7 +2406,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal synchronized (mLock) { mDisplayBrightnessFollowers.remove(follower.getDisplayId()); mHandler.postAtTime(() -> follower.setBrightnessToFollow( - PowerManager.BRIGHTNESS_INVALID_FLOAT, /* nits= */ -1, + PowerManager.BRIGHTNESS_INVALID_FLOAT, BrightnessMappingStrategy.INVALID_NITS, /* ambientLux= */ 0, /* slowChange= */ false), mClock.uptimeMillis()); } } @@ -2430,7 +2416,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal for (int i = 0; i < mDisplayBrightnessFollowers.size(); i++) { DisplayPowerControllerInterface follower = mDisplayBrightnessFollowers.valueAt(i); mHandler.postAtTime(() -> follower.setBrightnessToFollow( - PowerManager.BRIGHTNESS_INVALID_FLOAT, /* nits= */ -1, + PowerManager.BRIGHTNESS_INVALID_FLOAT, BrightnessMappingStrategy.INVALID_NITS, /* ambientLux= */ 0, /* slowChange= */ false), mClock.uptimeMillis()); } mDisplayBrightnessFollowers.clear(); @@ -3011,7 +2997,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal AutomaticBrightnessController getAutomaticBrightnessController( AutomaticBrightnessController.Callbacks callbacks, Looper looper, SensorManager sensorManager, Sensor lightSensor, - BrightnessMappingStrategy interactiveModeBrightnessMapper, + SparseArray<BrightnessMappingStrategy> brightnessMappingStrategyMap, int lightSensorWarmUpTime, float brightnessMin, float brightnessMax, float dozeScaleFactor, int lightSensorRate, int initialLightSensorRate, long brighteningLightDebounceConfig, long darkeningLightDebounceConfig, @@ -3022,26 +3008,26 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal HysteresisLevels ambientBrightnessThresholdsIdle, HysteresisLevels screenBrightnessThresholdsIdle, Context context, BrightnessRangeController brightnessModeController, - BrightnessThrottler brightnessThrottler, - BrightnessMappingStrategy idleModeBrightnessMapper, int ambientLightHorizonShort, - int ambientLightHorizonLong, float userLux, float userBrightness) { + BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort, + int ambientLightHorizonLong, float userLux, float userNits) { return new AutomaticBrightnessController(callbacks, looper, sensorManager, lightSensor, - interactiveModeBrightnessMapper, lightSensorWarmUpTime, brightnessMin, + brightnessMappingStrategyMap, lightSensorWarmUpTime, brightnessMin, brightnessMax, dozeScaleFactor, lightSensorRate, initialLightSensorRate, brighteningLightDebounceConfig, darkeningLightDebounceConfig, brighteningLightDebounceConfigIdle, darkeningLightDebounceConfigIdle, resetAmbientLuxAfterWarmUpConfig, ambientBrightnessThresholds, screenBrightnessThresholds, ambientBrightnessThresholdsIdle, screenBrightnessThresholdsIdle, context, brightnessModeController, - brightnessThrottler, idleModeBrightnessMapper, ambientLightHorizonShort, - ambientLightHorizonLong, userLux, userBrightness); + brightnessThrottler, ambientLightHorizonShort, ambientLightHorizonLong, userLux, + userNits); } - BrightnessMappingStrategy getInteractiveModeBrightnessMapper(Resources resources, + BrightnessMappingStrategy getDefaultModeBrightnessMapper(Resources resources, DisplayDeviceConfig displayDeviceConfig, DisplayWhiteBalanceController displayWhiteBalanceController) { return BrightnessMappingStrategy.create(resources, - displayDeviceConfig, displayWhiteBalanceController); + displayDeviceConfig, AUTO_BRIGHTNESS_MODE_DEFAULT, + displayWhiteBalanceController); } HysteresisLevels getHysteresisLevels(float[] brighteningThresholdsPercentages, diff --git a/services/core/java/com/android/server/display/DisplayPowerControllerInterface.java b/services/core/java/com/android/server/display/DisplayPowerControllerInterface.java index 72079a4c82fe..c27918430254 100644 --- a/services/core/java/com/android/server/display/DisplayPowerControllerInterface.java +++ b/services/core/java/com/android/server/display/DisplayPowerControllerInterface.java @@ -69,9 +69,10 @@ public interface DisplayPowerControllerInterface { /** * Used to decide the associated AutomaticBrightnessController's BrightnessMode - * @param isIdle Flag which represents if the Idle BrightnessMode is to be set + * @param mode The auto-brightness mode */ - void setAutomaticScreenBrightnessMode(boolean isIdle); + void setAutomaticScreenBrightnessMode( + @AutomaticBrightnessController.AutomaticBrightnessMode int mode); /** * Used to enable/disable the logging of the WhileBalance associated entities diff --git a/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java b/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java index 617befbbd17d..3bb798689ea6 100644 --- a/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java +++ b/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java @@ -27,6 +27,7 @@ import android.view.Display; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; 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.brightness.strategy.AutomaticBrightnessStrategy; @@ -359,11 +360,12 @@ public final class DisplayBrightnessController { * passing the brightness value to follower displays. * * @param brightness The float scale value - * @return The nit value or -1f if no conversion is possible. + * @return The nit value or {@link BrightnessMappingStrategy.INVALID_NITS} if no conversion is + * possible. */ public float convertToNits(float brightness) { if (mAutomaticBrightnessController == null) { - return -1f; + return BrightnessMappingStrategy.INVALID_NITS; } return mAutomaticBrightnessController.convertToNits(brightness); } @@ -374,11 +376,12 @@ public final class DisplayBrightnessController { * {@link com.android.server.display.BrightnessTracker}. * * @param brightness The float scale value - * @return The nit value or -1f if no conversion is possible. + * @return The nit value or {@link BrightnessMappingStrategy.INVALID_NITS} if no conversion is + * possible. */ public float convertToAdjustedNits(float brightness) { if (mAutomaticBrightnessController == null) { - return -1f; + return BrightnessMappingStrategy.INVALID_NITS; } return mAutomaticBrightnessController.convertToAdjustedNits(brightness); } @@ -391,11 +394,11 @@ public final class DisplayBrightnessController { * @return The float scale value or {@link PowerManager.BRIGHTNESS_INVALID_FLOAT} if no * conversion is possible. */ - public float convertToFloatScale(float nits) { + public float getBrightnessFromNits(float nits) { if (mAutomaticBrightnessController == null) { return PowerManager.BRIGHTNESS_INVALID_FLOAT; } - return mAutomaticBrightnessController.convertToFloatScale(nits); + return mAutomaticBrightnessController.getBrightnessFromNits(nits); } /** @@ -497,7 +500,7 @@ public final class DisplayBrightnessController { float brightnessNitsForDefaultDisplay = mBrightnessSetting.getBrightnessNitsForDefaultDisplay(); if (brightnessNitsForDefaultDisplay >= 0) { - float brightnessForDefaultDisplay = convertToFloatScale( + float brightnessForDefaultDisplay = getBrightnessFromNits( brightnessNitsForDefaultDisplay); if (BrightnessUtils.isValidBrightnessValue(brightnessForDefaultDisplay)) { mBrightnessSetting.setBrightness(brightnessForDefaultDisplay); diff --git a/services/tests/displayservicetests/src/com/android/server/display/AutomaticBrightnessControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/AutomaticBrightnessControllerTest.java index 2bdebe26e551..418b78cd696b 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/AutomaticBrightnessControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/AutomaticBrightnessControllerTest.java @@ -17,6 +17,8 @@ package com.android.server.display; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; @@ -39,7 +41,9 @@ import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest; import android.os.Handler; +import android.os.PowerManager; import android.os.test.TestLooper; +import android.util.SparseArray; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; @@ -98,8 +102,8 @@ public class AutomaticBrightnessControllerTest { mLightSensor = TestUtils.createSensor(Sensor.TYPE_LIGHT, "Light Sensor"); mContext = InstrumentationRegistry.getContext(); - setupController(BrightnessMappingStrategy.NO_USER_LUX, - BrightnessMappingStrategy.NO_USER_BRIGHTNESS, /* applyDebounce= */ false, + setupController(BrightnessMappingStrategy.INVALID_LUX, + BrightnessMappingStrategy.INVALID_NITS, /* applyDebounce= */ false, /* useHorizon= */ true); } @@ -112,11 +116,19 @@ public class AutomaticBrightnessControllerTest { } } - private void setupController(float userLux, float userBrightness, boolean applyDebounce, + private void setupController(float userLux, float userNits, boolean applyDebounce, boolean useHorizon) { mClock = new OffsettableClock.Stopped(); mTestLooper = new TestLooper(mClock::now); + when(mBrightnessMappingStrategy.getMode()).thenReturn(AUTO_BRIGHTNESS_MODE_DEFAULT); + when(mIdleBrightnessMappingStrategy.getMode()).thenReturn(AUTO_BRIGHTNESS_MODE_IDLE); + + SparseArray<BrightnessMappingStrategy> brightnessMappingStrategyMap = new SparseArray<>(); + brightnessMappingStrategyMap.append(AUTO_BRIGHTNESS_MODE_DEFAULT, + mBrightnessMappingStrategy); + brightnessMappingStrategyMap.append(AUTO_BRIGHTNESS_MODE_IDLE, + mIdleBrightnessMappingStrategy); mController = new AutomaticBrightnessController( new AutomaticBrightnessController.Injector() { @Override @@ -131,7 +143,7 @@ public class AutomaticBrightnessControllerTest { }, // pass in test looper instead, pass in offsettable clock () -> { }, mTestLooper.getLooper(), mSensorManager, mLightSensor, - mBrightnessMappingStrategy, LIGHT_SENSOR_WARMUP_TIME, BRIGHTNESS_MIN_FLOAT, + brightnessMappingStrategyMap, LIGHT_SENSOR_WARMUP_TIME, BRIGHTNESS_MIN_FLOAT, BRIGHTNESS_MAX_FLOAT, DOZE_SCALE_FACTOR, LIGHT_SENSOR_RATE, INITIAL_LIGHT_SENSOR_RATE, applyDebounce ? BRIGHTENING_LIGHT_DEBOUNCE_CONFIG : 0, applyDebounce ? DARKENING_LIGHT_DEBOUNCE_CONFIG : 0, @@ -141,8 +153,8 @@ public class AutomaticBrightnessControllerTest { mAmbientBrightnessThresholds, mScreenBrightnessThresholds, mAmbientBrightnessThresholdsIdle, mScreenBrightnessThresholdsIdle, mContext, mBrightnessRangeController, mBrightnessThrottler, - mIdleBrightnessMappingStrategy, useHorizon ? AMBIENT_LIGHT_HORIZON_SHORT : 1, - useHorizon ? AMBIENT_LIGHT_HORIZON_LONG : 10000, userLux, userBrightness + useHorizon ? AMBIENT_LIGHT_HORIZON_SHORT : 1, + useHorizon ? AMBIENT_LIGHT_HORIZON_LONG : 10000, userLux, userNits ); when(mBrightnessRangeController.getCurrentBrightnessMax()).thenReturn( @@ -326,8 +338,7 @@ public class AutomaticBrightnessControllerTest { when(mBrightnessMappingStrategy.getShortTermModelTimeout()).thenReturn(2000L); - mController.switchToIdleMode(); - when(mIdleBrightnessMappingStrategy.isForIdleMode()).thenReturn(true); + mController.switchMode(AUTO_BRIGHTNESS_MODE_IDLE); when(mBrightnessMappingStrategy.shouldResetShortTermModel( 123f, 0.5f)).thenReturn(true); @@ -337,7 +348,7 @@ public class AutomaticBrightnessControllerTest { mBrightnessMappingStrategy.getShortTermModelTimeout() + 1000); mTestLooper.dispatchAll(); - mController.switchToInteractiveScreenBrightnessMode(); + mController.switchMode(AUTO_BRIGHTNESS_MODE_DEFAULT); mTestLooper.moveTimeForward(4000); mTestLooper.dispatchAll(); @@ -371,15 +382,14 @@ public class AutomaticBrightnessControllerTest { when(mBrightnessMappingStrategy.getUserBrightness()).thenReturn(0.51f); when(mBrightnessMappingStrategy.getUserLux()).thenReturn(123.0f); - mController.switchToIdleMode(); - when(mIdleBrightnessMappingStrategy.isForIdleMode()).thenReturn(true); + mController.switchMode(AUTO_BRIGHTNESS_MODE_IDLE); // Time does not move forward, since clock is doesn't increment naturally. mTestLooper.dispatchAll(); // Sensor reads 100000 lux, listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 678910)); - mController.switchToInteractiveScreenBrightnessMode(); + mController.switchMode(AUTO_BRIGHTNESS_MODE_DEFAULT); // Verify short term model is not reset. verify(mBrightnessMappingStrategy, never()).clearUserDataPoints(); @@ -410,10 +420,11 @@ public class AutomaticBrightnessControllerTest { when(mBrightnessMappingStrategy.getUserBrightness()).thenReturn(0.5f); when(mBrightnessMappingStrategy.getUserLux()).thenReturn(123f); - mController.switchToIdleMode(); - when(mIdleBrightnessMappingStrategy.isForIdleMode()).thenReturn(true); - when(mIdleBrightnessMappingStrategy.getUserBrightness()).thenReturn(-1f); - when(mIdleBrightnessMappingStrategy.getUserLux()).thenReturn(-1f); + mController.switchMode(AUTO_BRIGHTNESS_MODE_IDLE); + when(mIdleBrightnessMappingStrategy.getUserBrightness()).thenReturn( + PowerManager.BRIGHTNESS_INVALID_FLOAT); + when(mIdleBrightnessMappingStrategy.getUserLux()).thenReturn( + BrightnessMappingStrategy.INVALID_LUX); when(mBrightnessMappingStrategy.shouldResetShortTermModel( 123f, 0.5f)).thenReturn(true); @@ -423,7 +434,7 @@ public class AutomaticBrightnessControllerTest { mBrightnessMappingStrategy.getShortTermModelTimeout() + 1000); mTestLooper.dispatchAll(); - mController.switchToInteractiveScreenBrightnessMode(); + mController.switchMode(AUTO_BRIGHTNESS_MODE_DEFAULT); mTestLooper.moveTimeForward(4000); mTestLooper.dispatchAll(); @@ -456,10 +467,11 @@ public class AutomaticBrightnessControllerTest { when(mBrightnessMappingStrategy.getUserBrightness()).thenReturn(0.5f); when(mBrightnessMappingStrategy.getUserLux()).thenReturn(123f); - mController.switchToIdleMode(); - when(mIdleBrightnessMappingStrategy.isForIdleMode()).thenReturn(true); - when(mIdleBrightnessMappingStrategy.getUserBrightness()).thenReturn(-1f); - when(mIdleBrightnessMappingStrategy.getUserLux()).thenReturn(-1f); + mController.switchMode(AUTO_BRIGHTNESS_MODE_IDLE); + when(mIdleBrightnessMappingStrategy.getUserBrightness()).thenReturn( + PowerManager.BRIGHTNESS_INVALID_FLOAT); + when(mIdleBrightnessMappingStrategy.getUserLux()).thenReturn( + BrightnessMappingStrategy.INVALID_LUX); when(mBrightnessMappingStrategy.shouldResetShortTermModel( 123f, 0.5f)).thenReturn(true); @@ -469,7 +481,7 @@ public class AutomaticBrightnessControllerTest { // Do not fast-forward time. mTestLooper.dispatchAll(); - mController.switchToInteractiveScreenBrightnessMode(); + mController.switchMode(AUTO_BRIGHTNESS_MODE_DEFAULT); // Do not fast-forward time mTestLooper.dispatchAll(); @@ -492,22 +504,25 @@ public class AutomaticBrightnessControllerTest { // Sensor reads 123 lux, listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 123)); when(mBrightnessMappingStrategy.getShortTermModelTimeout()).thenReturn(2000L); - when(mBrightnessMappingStrategy.getUserBrightness()).thenReturn(-1.0f); - when(mBrightnessMappingStrategy.getUserLux()).thenReturn(-1.0f); + when(mBrightnessMappingStrategy.getUserBrightness()).thenReturn( + PowerManager.BRIGHTNESS_INVALID_FLOAT); + when(mBrightnessMappingStrategy.getUserLux()).thenReturn( + BrightnessMappingStrategy.INVALID_LUX); // No user brightness interaction. - mController.switchToIdleMode(); - when(mIdleBrightnessMappingStrategy.isForIdleMode()).thenReturn(true); - when(mIdleBrightnessMappingStrategy.getUserBrightness()).thenReturn(-1.0f); - when(mIdleBrightnessMappingStrategy.getUserLux()).thenReturn(-1.0f); + mController.switchMode(AUTO_BRIGHTNESS_MODE_IDLE); + when(mIdleBrightnessMappingStrategy.getUserBrightness()).thenReturn( + PowerManager.BRIGHTNESS_INVALID_FLOAT); + when(mIdleBrightnessMappingStrategy.getUserLux()).thenReturn( + BrightnessMappingStrategy.INVALID_LUX); // Sensor reads 1000 lux, listener.onSensorChanged(TestUtils.createSensorEvent(mLightSensor, 1000)); // Do not fast-forward time. mTestLooper.dispatchAll(); - mController.switchToInteractiveScreenBrightnessMode(); + mController.switchMode(AUTO_BRIGHTNESS_MODE_DEFAULT); // Do not fast-forward time mTestLooper.dispatchAll(); @@ -541,12 +556,12 @@ public class AutomaticBrightnessControllerTest { verify(mBrightnessMappingStrategy, times(3)).getBrightness(anyFloat(), any(), anyInt()); // Now let's do the same for idle mode - mController.switchToIdleMode(); - // Called once for init, and once when switching, + mController.switchMode(AUTO_BRIGHTNESS_MODE_IDLE); + // Called once when switching, // setAmbientLux() is called twice and once in updateAutoBrightness(), // nextAmbientLightBrighteningTransition() and nextAmbientLightDarkeningTransition() are // called twice each. - verify(mBrightnessMappingStrategy, times(9)).isForIdleMode(); + verify(mBrightnessMappingStrategy, times(8)).getMode(); // Called when switching. verify(mBrightnessMappingStrategy, times(1)).getShortTermModelTimeout(); verify(mBrightnessMappingStrategy, times(1)).getUserBrightness(); @@ -826,7 +841,6 @@ public class AutomaticBrightnessControllerTest { @Test public void testResetShortTermModelWhenConfigChanges() { - when(mBrightnessMappingStrategy.isForIdleMode()).thenReturn(false); when(mBrightnessMappingStrategy.setBrightnessConfiguration(any())).thenReturn(true); mController.configure(AUTO_BRIGHTNESS_ENABLED, null /* configuration= */, @@ -847,8 +861,10 @@ public class AutomaticBrightnessControllerTest { verify(mBrightnessMappingStrategy, never()).addUserDataPoint(anyFloat(), anyFloat()); float userLux = 1000; + float userNits = 500; float userBrightness = 0.3f; - setupController(userLux, userBrightness, /* applyDebounce= */ true, + when(mBrightnessMappingStrategy.getBrightnessFromNits(userNits)).thenReturn(userBrightness); + setupController(userLux, userNits, /* applyDebounce= */ true, /* useHorizon= */ false); verify(mBrightnessMappingStrategy).addUserDataPoint(userLux, userBrightness); } @@ -856,8 +872,8 @@ public class AutomaticBrightnessControllerTest { @Test public void testBrighteningLightDebounce() throws Exception { clearInvocations(mSensorManager); - setupController(BrightnessMappingStrategy.NO_USER_LUX, - BrightnessMappingStrategy.NO_USER_BRIGHTNESS, /* applyDebounce= */ true, + setupController(BrightnessMappingStrategy.INVALID_LUX, + BrightnessMappingStrategy.INVALID_NITS, /* applyDebounce= */ true, /* useHorizon= */ false); ArgumentCaptor<SensorEventListener> listenerCaptor = @@ -897,8 +913,8 @@ public class AutomaticBrightnessControllerTest { .thenReturn(10000f); when(mAmbientBrightnessThresholds.getDarkeningThreshold(anyFloat())) .thenReturn(10000f); - setupController(BrightnessMappingStrategy.NO_USER_LUX, - BrightnessMappingStrategy.NO_USER_BRIGHTNESS, /* applyDebounce= */ true, + setupController(BrightnessMappingStrategy.INVALID_LUX, + BrightnessMappingStrategy.INVALID_NITS, /* applyDebounce= */ true, /* useHorizon= */ false); ArgumentCaptor<SensorEventListener> listenerCaptor = @@ -934,12 +950,11 @@ public class AutomaticBrightnessControllerTest { @Test public void testBrighteningLightDebounceIdle() throws Exception { clearInvocations(mSensorManager); - setupController(BrightnessMappingStrategy.NO_USER_LUX, - BrightnessMappingStrategy.NO_USER_BRIGHTNESS, /* applyDebounce= */ true, + setupController(BrightnessMappingStrategy.INVALID_LUX, + BrightnessMappingStrategy.INVALID_NITS, /* applyDebounce= */ true, /* useHorizon= */ false); - mController.switchToIdleMode(); - when(mIdleBrightnessMappingStrategy.isForIdleMode()).thenReturn(true); + mController.switchMode(AUTO_BRIGHTNESS_MODE_IDLE); ArgumentCaptor<SensorEventListener> listenerCaptor = ArgumentCaptor.forClass(SensorEventListener.class); @@ -972,12 +987,11 @@ public class AutomaticBrightnessControllerTest { .thenReturn(10000f); when(mAmbientBrightnessThresholdsIdle.getDarkeningThreshold(anyFloat())) .thenReturn(10000f); - setupController(BrightnessMappingStrategy.NO_USER_LUX, - BrightnessMappingStrategy.NO_USER_BRIGHTNESS, /* applyDebounce= */ true, + setupController(BrightnessMappingStrategy.INVALID_LUX, + BrightnessMappingStrategy.INVALID_NITS, /* applyDebounce= */ true, /* useHorizon= */ false); - mController.switchToIdleMode(); - when(mIdleBrightnessMappingStrategy.isForIdleMode()).thenReturn(true); + mController.switchMode(AUTO_BRIGHTNESS_MODE_IDLE); ArgumentCaptor<SensorEventListener> listenerCaptor = ArgumentCaptor.forClass(SensorEventListener.class); diff --git a/services/tests/displayservicetests/src/com/android/server/display/BrightnessMappingStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/BrightnessMappingStrategyTest.java index a2e80f0d9b9b..189d9bbfe806 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/BrightnessMappingStrategyTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/BrightnessMappingStrategyTest.java @@ -16,6 +16,9 @@ package com.android.server.display; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; @@ -172,7 +175,9 @@ public class BrightnessMappingStrategyTest { public void testSimpleStrategyMappingAtControlPoints_IntConfig() { Resources res = createResources(DISPLAY_LEVELS_INT); DisplayDeviceConfig ddc = createDdc(); - BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, + mMockDwbc); assertNotNull("BrightnessMappingStrategy should not be null", simple); for (int i = 0; i < LUX_LEVELS.length; i++) { final float expectedLevel = MathUtils.map(PowerManager.BRIGHTNESS_OFF + 1, @@ -187,7 +192,9 @@ public class BrightnessMappingStrategyTest { public void testSimpleStrategyMappingBetweenControlPoints_IntConfig() { Resources res = createResources(DISPLAY_LEVELS_INT); DisplayDeviceConfig ddc = createDdc(); - BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, + mMockDwbc); assertNotNull("BrightnessMappingStrategy should not be null", simple); for (int i = 1; i < LUX_LEVELS.length; i++) { final float lux = (LUX_LEVELS[i - 1] + LUX_LEVELS[i]) / 2; @@ -203,7 +210,9 @@ public class BrightnessMappingStrategyTest { Resources res = createResources(EMPTY_INT_ARRAY); DisplayDeviceConfig ddc = createDdc(EMPTY_FLOAT_ARRAY, EMPTY_FLOAT_ARRAY, LUX_LEVELS, EMPTY_FLOAT_ARRAY, DISPLAY_LEVELS); - BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, + mMockDwbc); assertNotNull("BrightnessMappingStrategy should not be null", simple); for (int i = 0; i < LUX_LEVELS.length; i++) { assertEquals(DISPLAY_LEVELS[i], simple.getBrightness(LUX_LEVELS[i]), @@ -216,7 +225,9 @@ public class BrightnessMappingStrategyTest { Resources res = createResources(EMPTY_INT_ARRAY); DisplayDeviceConfig ddc = createDdc(EMPTY_FLOAT_ARRAY, EMPTY_FLOAT_ARRAY, LUX_LEVELS, EMPTY_FLOAT_ARRAY, DISPLAY_LEVELS); - BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + BrightnessMappingStrategy simple = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, + mMockDwbc); assertNotNull("BrightnessMappingStrategy should not be null", simple); for (int i = 1; i < LUX_LEVELS.length; i++) { final float lux = (LUX_LEVELS[i - 1] + LUX_LEVELS[i]) / 2; @@ -230,7 +241,8 @@ public class BrightnessMappingStrategyTest { public void testSimpleStrategyIgnoresNewConfiguration() { Resources res = createResources(DISPLAY_LEVELS_INT); DisplayDeviceConfig ddc = createDdc(); - BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc); final float[] lux = { 0f, 1f }; final float[] nits = { 0, PowerManager.BRIGHTNESS_ON }; @@ -245,7 +257,8 @@ public class BrightnessMappingStrategyTest { public void testSimpleStrategyIgnoresNullConfiguration() { Resources res = createResources(DISPLAY_LEVELS_INT); DisplayDeviceConfig ddc = createDdc(); - BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc); strategy.setBrightnessConfiguration(null); final int n = DISPLAY_LEVELS_INT.length; @@ -261,7 +274,8 @@ public class BrightnessMappingStrategyTest { DisplayDeviceConfig ddc = createDdc(DISPLAY_RANGE_NITS, DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT, LUX_LEVELS, DISPLAY_LEVELS_NITS); - BrightnessMappingStrategy physical = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + BrightnessMappingStrategy physical = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc); assertNotNull("BrightnessMappingStrategy should not be null", physical); for (int i = 0; i < LUX_LEVELS.length; i++) { final float expectedLevel = MathUtils.map(DISPLAY_RANGE_NITS[0], DISPLAY_RANGE_NITS[1], @@ -279,7 +293,8 @@ public class BrightnessMappingStrategyTest { Resources res = createResources(EMPTY_INT_ARRAY); DisplayDeviceConfig ddc = createDdc(DISPLAY_RANGE_NITS, BACKLIGHT_RANGE_ZERO_TO_ONE, LUX_LEVELS, DISPLAY_LEVELS_NITS); - BrightnessMappingStrategy physical = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + BrightnessMappingStrategy physical = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc); assertNotNull("BrightnessMappingStrategy should not be null", physical); Spline brightnessToNits = Spline.createSpline(BACKLIGHT_RANGE_ZERO_TO_ONE, DISPLAY_RANGE_NITS); @@ -297,7 +312,8 @@ public class BrightnessMappingStrategyTest { Resources res = createResources(EMPTY_INT_ARRAY); DisplayDeviceConfig ddc = createDdc(DISPLAY_RANGE_NITS, DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT, LUX_LEVELS, DISPLAY_LEVELS_NITS); - BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc); final float[] lux = {0f, 1f}; final float[] nits = { @@ -323,7 +339,8 @@ public class BrightnessMappingStrategyTest { Resources res = createResources(EMPTY_INT_ARRAY); DisplayDeviceConfig ddc = createDdc(DISPLAY_RANGE_NITS, DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT, LUX_LEVELS, DISPLAY_LEVELS_NITS); - BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc); float[] adjustedNits50p = new float[DISPLAY_RANGE_NITS.length]; for (int i = 0; i < DISPLAY_RANGE_NITS.length; i++) { adjustedNits50p[i] = DISPLAY_RANGE_NITS[i] * 0.5f; @@ -367,7 +384,8 @@ public class BrightnessMappingStrategyTest { Resources res = createResources(DISPLAY_LEVELS_INT); DisplayDeviceConfig ddc = createDdc(DISPLAY_RANGE_NITS, DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT, LUX_LEVELS, DISPLAY_LEVELS_NITS); - BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc); assertTrue(strategy instanceof BrightnessMappingStrategy.PhysicalMappingStrategy); } @@ -381,14 +399,16 @@ public class BrightnessMappingStrategyTest { Resources res = createResources(EMPTY_INT_ARRAY); DisplayDeviceConfig ddc = createDdc(DISPLAY_RANGE_NITS, DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT, lux, DISPLAY_LEVELS_NITS); - BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc); assertNull(strategy); // And make sure we get the same result even if it's monotone but not increasing. lux[idx] = lux[idx + 1]; ddc = createDdc(DISPLAY_RANGE_NITS, DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT, lux, DISPLAY_LEVELS_NITS); - strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + strategy = BrightnessMappingStrategy.create(res, ddc, AUTO_BRIGHTNESS_MODE_DEFAULT, + mMockDwbc); assertNull(strategy); } @@ -402,11 +422,13 @@ public class BrightnessMappingStrategyTest { Resources res = createResources(EMPTY_INT_ARRAY); DisplayDeviceConfig ddc = createDdc(DISPLAY_RANGE_NITS, DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT, lux, DISPLAY_LEVELS_NITS); - BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc); assertNull(strategy); res = createResources(DISPLAY_LEVELS_INT); - strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + strategy = BrightnessMappingStrategy.create(res, ddc, AUTO_BRIGHTNESS_MODE_DEFAULT, + mMockDwbc); assertNull(strategy); // Extra backlight level @@ -416,7 +438,8 @@ public class BrightnessMappingStrategyTest { res = createResources(backlight); ddc = createDdc(DISPLAY_RANGE_NITS, DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT, LUX_LEVELS, EMPTY_FLOAT_ARRAY); - strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + strategy = BrightnessMappingStrategy.create(res, ddc, AUTO_BRIGHTNESS_MODE_DEFAULT, + mMockDwbc); assertNull(strategy); // Extra nits level @@ -425,7 +448,8 @@ public class BrightnessMappingStrategyTest { res = createResources(EMPTY_INT_ARRAY); ddc = createDdc(DISPLAY_RANGE_NITS, DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT, LUX_LEVELS, nits); - strategy = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + strategy = BrightnessMappingStrategy.create(res, ddc, AUTO_BRIGHTNESS_MODE_DEFAULT, + mMockDwbc); assertNull(strategy); } @@ -433,15 +457,18 @@ public class BrightnessMappingStrategyTest { public void testPhysicalStrategyRequiresNitsMapping() { Resources res = createResources(EMPTY_INT_ARRAY /*brightnessLevelsBacklight*/); DisplayDeviceConfig ddc = createDdc(EMPTY_FLOAT_ARRAY /*nitsRange*/); - BrightnessMappingStrategy physical = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + BrightnessMappingStrategy physical = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc); assertNull(physical); res = createResources(EMPTY_INT_ARRAY /*brightnessLevelsBacklight*/); - physical = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + physical = BrightnessMappingStrategy.create(res, ddc, AUTO_BRIGHTNESS_MODE_DEFAULT, + mMockDwbc); assertNull(physical); res = createResources(EMPTY_INT_ARRAY /*brightnessLevelsBacklight*/); - physical = BrightnessMappingStrategy.create(res, ddc, mMockDwbc); + physical = BrightnessMappingStrategy.create(res, ddc, AUTO_BRIGHTNESS_MODE_DEFAULT, + mMockDwbc); assertNull(physical); } @@ -450,10 +477,12 @@ public class BrightnessMappingStrategyTest { Resources res = createResources(EMPTY_INT_ARRAY /*brightnessLevelsBacklight*/); DisplayDeviceConfig ddc = createDdc(DISPLAY_RANGE_NITS, BACKLIGHT_RANGE_ZERO_TO_ONE, LUX_LEVELS, DISPLAY_LEVELS_NITS); - assertStrategyAdaptsToUserDataPoints(BrightnessMappingStrategy.create(res, ddc, mMockDwbc)); + assertStrategyAdaptsToUserDataPoints(BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc)); ddc = createDdc(DISPLAY_RANGE_NITS, BACKLIGHT_RANGE_ZERO_TO_ONE); res = createResources(DISPLAY_LEVELS_INT); - assertStrategyAdaptsToUserDataPoints(BrightnessMappingStrategy.create(res, ddc, mMockDwbc)); + assertStrategyAdaptsToUserDataPoints(BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc)); } @Test @@ -463,7 +492,8 @@ public class BrightnessMappingStrategyTest { // Create an idle mode bms // This will fail if it tries to fetch the wrong configuration. - BrightnessMappingStrategy bms = BrightnessMappingStrategy.createForIdleMode(res, ddc, + BrightnessMappingStrategy bms = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_IDLE, mMockDwbc); assertNotNull("BrightnessMappingStrategy should not be null", bms); @@ -652,7 +682,7 @@ public class BrightnessMappingStrategyTest { DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT, GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS); BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources, ddc, - mMockDwbc); + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc); // Let's start with a validity check: assertEquals(y1, strategy.getBrightness(x1), 0.0001f /* tolerance */); assertEquals(y2, strategy.getBrightness(x2), 0.0001f /* tolerance */); @@ -683,7 +713,7 @@ public class BrightnessMappingStrategyTest { DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT, GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS); BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources, ddc, - mMockDwbc); + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc); // Validity check: assertEquals(y1, strategy.getBrightness(x1), 0.0001f /* tolerance */); assertEquals(y2, strategy.getBrightness(x2), 0.0001f /* tolerance */); @@ -711,7 +741,7 @@ public class BrightnessMappingStrategyTest { DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT, GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS); BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources, ddc, - mMockDwbc); + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc); assertEquals(0.0f, strategy.getAutoBrightnessAdjustment(), /* delta= */ 0.0001f); strategy.addUserDataPoint(/* lux= */ 2500, /* brightness= */ 1.0f); assertEquals(+1.0f, strategy.getAutoBrightnessAdjustment(), /* delta= */ 0.0001f); @@ -735,7 +765,7 @@ public class BrightnessMappingStrategyTest { DISPLAY_LEVELS_RANGE_BACKLIGHT_FLOAT, GAMMA_CORRECTION_LUX, GAMMA_CORRECTION_NITS); BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(resources, ddc, - mMockDwbc); + AUTO_BRIGHTNESS_MODE_DEFAULT, mMockDwbc); // Validity, as per tradition: assertEquals(y0, strategy.getBrightness(x0), 0.0001f /* tolerance */); assertEquals(y2, strategy.getBrightness(x2), 0.0001f /* tolerance */); @@ -757,4 +787,14 @@ public class BrightnessMappingStrategyTest { assertEquals(1.0f, strategy.getBrightness(x4), 0.0001f /* tolerance */); assertEquals(adjustment, strategy.getAutoBrightnessAdjustment(), 0.0001f /* tolerance */); } + + @Test + public void testGetMode() { + Resources res = createResourcesIdle(LUX_LEVELS_IDLE, DISPLAY_LEVELS_NITS_IDLE); + DisplayDeviceConfig ddc = createDdc(DISPLAY_RANGE_NITS, BACKLIGHT_RANGE_ZERO_TO_ONE); + BrightnessMappingStrategy strategy = BrightnessMappingStrategy.create(res, ddc, + AUTO_BRIGHTNESS_MODE_IDLE, + mMockDwbc); + assertEquals(AUTO_BRIGHTNESS_MODE_IDLE, strategy.getMode()); + } } diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java index 693cafefa2c0..821507c50258 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerController2Test.java @@ -18,6 +18,7 @@ package com.android.server.display; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; @@ -28,7 +29,6 @@ import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; @@ -62,6 +62,7 @@ import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.provider.Settings; import android.testing.TestableContext; import android.util.FloatProperty; +import android.util.SparseArray; import android.view.Display; import android.view.DisplayInfo; @@ -357,7 +358,7 @@ public final class DisplayPowerController2Test { float followerBrightness = 0.4f; float nits = 300; when(mHolder.automaticBrightnessController.convertToNits(leadBrightness)).thenReturn(nits); - when(followerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(followerBrightness); when(mHolder.brightnessSetting.getBrightness()).thenReturn(leadBrightness); listener.onBrightnessChanged(leadBrightness); @@ -372,7 +373,7 @@ public final class DisplayPowerController2Test { float brightness = 0.6f; nits = 600; when(mHolder.automaticBrightnessController.convertToNits(brightness)).thenReturn(nits); - when(followerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(brightness); when(mHolder.brightnessSetting.getBrightness()).thenReturn(brightness); listener.onBrightnessChanged(brightness); @@ -404,7 +405,7 @@ public final class DisplayPowerController2Test { float brightness = 0.3f; when(mHolder.automaticBrightnessController.convertToNits(brightness)).thenReturn(300f); - when(followerDpc.automaticBrightnessController.convertToFloatScale(anyFloat())) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(anyFloat())) .thenReturn(PowerManager.BRIGHTNESS_INVALID_FLOAT); when(mHolder.brightnessSetting.getBrightness()).thenReturn(brightness); listener.onBrightnessChanged(brightness); @@ -466,7 +467,7 @@ public final class DisplayPowerController2Test { float brightness = 0.3f; when(mHolder.automaticBrightnessController.convertToNits(anyFloat())).thenReturn(-1f); - when(followerDpc.automaticBrightnessController.convertToFloatScale(anyFloat())) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(anyFloat())) .thenReturn(PowerManager.BRIGHTNESS_INVALID_FLOAT); when(mHolder.brightnessSetting.getBrightness()).thenReturn(brightness); listener.onBrightnessChanged(brightness); @@ -500,7 +501,7 @@ public final class DisplayPowerController2Test { when(mHolder.automaticBrightnessController.convertToNits(rawLeadBrightness)) .thenReturn(nits); when(mHolder.automaticBrightnessController.getAmbientLux()).thenReturn(ambientLux); - when(followerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(followerBrightness); mHolder.dpc.addDisplayBrightnessFollower(followerDpc.dpc); @@ -534,7 +535,7 @@ public final class DisplayPowerController2Test { when(mHolder.automaticBrightnessController.convertToNits(rawLeadBrightness)) .thenReturn(nits); when(mHolder.automaticBrightnessController.getAmbientLux()).thenReturn(ambientLux); - when(followerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(followerBrightness); mHolder.dpc.updateBrightness(); @@ -592,9 +593,9 @@ public final class DisplayPowerController2Test { float brightness = 0.6f; float nits = 600; when(mHolder.automaticBrightnessController.convertToNits(brightness)).thenReturn(nits); - when(followerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(brightness); - when(secondFollowerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(secondFollowerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(brightness); when(mHolder.brightnessSetting.getBrightness()).thenReturn(brightness); listener.onBrightnessChanged(brightness); @@ -625,9 +626,9 @@ public final class DisplayPowerController2Test { brightness = 0.7f; nits = 700; when(mHolder.automaticBrightnessController.convertToNits(brightness)).thenReturn(nits); - when(followerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(brightness); - when(secondFollowerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(secondFollowerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(brightness); when(mHolder.brightnessSetting.getBrightness()).thenReturn(brightness); listener.onBrightnessChanged(brightness); @@ -697,9 +698,9 @@ public final class DisplayPowerController2Test { float brightness = 0.6f; float nits = 600; when(mHolder.automaticBrightnessController.convertToNits(brightness)).thenReturn(nits); - when(followerHolder.automaticBrightnessController.convertToFloatScale(nits)) + when(followerHolder.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(brightness); - when(secondFollowerHolder.automaticBrightnessController.convertToFloatScale(nits)) + when(secondFollowerHolder.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(brightness); when(mHolder.brightnessSetting.getBrightness()).thenReturn(brightness); listener.onBrightnessChanged(brightness); @@ -1122,7 +1123,7 @@ public final class DisplayPowerController2Test { float newBrightness = 0.4f; when(mHolder.brightnessSetting.getBrightnessNitsForDefaultDisplay()).thenReturn(nits); - when(mHolder.automaticBrightnessController.convertToFloatScale(nits)) + when(mHolder.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(newBrightness); // New display device setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class), @@ -1139,12 +1140,9 @@ public final class DisplayPowerController2Test { @Test public void testShortTermModelPersistsWhenDisplayDeviceChanges() { float lux = 2000; - float brightness = 0.4f; float nits = 500; - when(mHolder.brightnessMappingStrategy.getUserLux()).thenReturn(lux); - when(mHolder.brightnessMappingStrategy.getUserBrightness()).thenReturn(brightness); - when(mHolder.brightnessMappingStrategy.convertToNits(brightness)).thenReturn(nits); - when(mHolder.brightnessMappingStrategy.convertToFloatScale(nits)).thenReturn(brightness); + when(mHolder.automaticBrightnessController.getUserLux()).thenReturn(lux); + when(mHolder.automaticBrightnessController.getUserNits()).thenReturn(nits); DisplayPowerRequest dpr = new DisplayPowerRequest(); mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); advanceTime(1); @@ -1161,7 +1159,7 @@ public final class DisplayPowerController2Test { any(Looper.class), eq(mSensorManagerMock), /* lightSensor= */ any(), - eq(mHolder.brightnessMappingStrategy), + /* brightnessMappingStrategyMap= */ any(SparseArray.class), /* lightSensorWarmUpTime= */ anyInt(), /* brightnessMin= */ anyFloat(), /* brightnessMax= */ anyFloat(), @@ -1180,11 +1178,10 @@ public final class DisplayPowerController2Test { eq(mContext), any(BrightnessRangeController.class), any(BrightnessThrottler.class), - /* idleModeBrightnessMapper= */ isNull(), /* ambientLightHorizonShort= */ anyInt(), /* ambientLightHorizonLong= */ anyInt(), eq(lux), - eq(brightness) + eq(nits) ); } @@ -1217,7 +1214,7 @@ public final class DisplayPowerController2Test { public void testDwbcCallsHappenOnHandler() { mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID); - mHolder.dpc.setAutomaticScreenBrightnessMode(true); + mHolder.dpc.setAutomaticScreenBrightnessMode(AUTO_BRIGHTNESS_MODE_IDLE); verify(mDisplayWhiteBalanceControllerMock, never()).setStrongModeEnabled(true); // dispatch handler looper @@ -1380,7 +1377,7 @@ public final class DisplayPowerController2Test { BRIGHTNESS_RAMP_DECREASE_MAX); // switch to idle mode - mHolder.dpc.setAutomaticScreenBrightnessMode(/* idle= */ true); + mHolder.dpc.setAutomaticScreenBrightnessMode(AUTO_BRIGHTNESS_MODE_IDLE); advanceTime(1); // A second time, when switching to idle mode. @@ -1409,7 +1406,7 @@ public final class DisplayPowerController2Test { BRIGHTNESS_RAMP_DECREASE_MAX); // switch to idle mode - mHolder.dpc.setAutomaticScreenBrightnessMode(/* idle= */ true); + mHolder.dpc.setAutomaticScreenBrightnessMode(AUTO_BRIGHTNESS_MODE_IDLE); advanceTime(1); // A second time, when switching to idle mode. @@ -1435,7 +1432,7 @@ public final class DisplayPowerController2Test { mHolder.config, /* isEnabled= */ true); // switch to idle mode - mHolder.dpc.setAutomaticScreenBrightnessMode(true); + mHolder.dpc.setAutomaticScreenBrightnessMode(AUTO_BRIGHTNESS_MODE_IDLE); // A second time when switching to idle mode. verify(mHolder.animator, times(2)).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX, @@ -1461,7 +1458,7 @@ public final class DisplayPowerController2Test { mHolder.config, /* isEnabled= */ true); // switch to idle mode - mHolder.dpc.setAutomaticScreenBrightnessMode(true); + mHolder.dpc.setAutomaticScreenBrightnessMode(AUTO_BRIGHTNESS_MODE_IDLE); verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX_IDLE, BRIGHTNESS_RAMP_DECREASE_MAX_IDLE); @@ -1837,7 +1834,7 @@ public final class DisplayPowerController2Test { AutomaticBrightnessController getAutomaticBrightnessController( AutomaticBrightnessController.Callbacks callbacks, Looper looper, SensorManager sensorManager, Sensor lightSensor, - BrightnessMappingStrategy interactiveModeBrightnessMapper, + SparseArray<BrightnessMappingStrategy> brightnessMappingStrategyMap, int lightSensorWarmUpTime, float brightnessMin, float brightnessMax, float dozeScaleFactor, int lightSensorRate, int initialLightSensorRate, long brighteningLightDebounceConfig, long darkeningLightDebounceConfig, @@ -1848,15 +1845,13 @@ public final class DisplayPowerController2Test { HysteresisLevels ambientBrightnessThresholdsIdle, HysteresisLevels screenBrightnessThresholdsIdle, Context context, BrightnessRangeController brightnessRangeController, - BrightnessThrottler brightnessThrottler, - BrightnessMappingStrategy idleModeBrightnessMapper, - int ambientLightHorizonShort, int ambientLightHorizonLong, float userLux, - float userBrightness) { + BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort, + int ambientLightHorizonLong, float userLux, float userNits) { return mAutomaticBrightnessController; } @Override - BrightnessMappingStrategy getInteractiveModeBrightnessMapper(Resources resources, + BrightnessMappingStrategy getDefaultModeBrightnessMapper(Resources resources, DisplayDeviceConfig displayDeviceConfig, DisplayWhiteBalanceController displayWhiteBalanceController) { return mBrightnessMappingStrategy; diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java index b22799377872..a5ee1cb23a09 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -18,6 +18,7 @@ package com.android.server.display; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; @@ -28,7 +29,6 @@ import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; @@ -62,6 +62,7 @@ import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.provider.Settings; import android.testing.TestableContext; import android.util.FloatProperty; +import android.util.SparseArray; import android.view.Display; import android.view.DisplayInfo; @@ -357,7 +358,7 @@ public final class DisplayPowerControllerTest { float followerBrightness = 0.4f; float nits = 300; when(mHolder.automaticBrightnessController.convertToNits(leadBrightness)).thenReturn(nits); - when(followerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(followerBrightness); when(mHolder.brightnessSetting.getBrightness()).thenReturn(leadBrightness); listener.onBrightnessChanged(leadBrightness); @@ -375,7 +376,7 @@ public final class DisplayPowerControllerTest { float brightness = 0.6f; nits = 600; when(mHolder.automaticBrightnessController.convertToNits(brightness)).thenReturn(nits); - when(followerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(brightness); when(mHolder.brightnessSetting.getBrightness()).thenReturn(brightness); listener.onBrightnessChanged(brightness); @@ -408,7 +409,7 @@ public final class DisplayPowerControllerTest { float brightness = 0.3f; when(mHolder.automaticBrightnessController.convertToNits(brightness)).thenReturn(300f); - when(followerDpc.automaticBrightnessController.convertToFloatScale(anyFloat())) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(anyFloat())) .thenReturn(PowerManager.BRIGHTNESS_INVALID_FLOAT); when(mHolder.brightnessSetting.getBrightness()).thenReturn(brightness); listener.onBrightnessChanged(brightness); @@ -472,7 +473,7 @@ public final class DisplayPowerControllerTest { float brightness = 0.3f; when(mHolder.automaticBrightnessController.convertToNits(anyFloat())).thenReturn(-1f); - when(followerDpc.automaticBrightnessController.convertToFloatScale(anyFloat())) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(anyFloat())) .thenReturn(PowerManager.BRIGHTNESS_INVALID_FLOAT); when(mHolder.brightnessSetting.getBrightness()).thenReturn(brightness); listener.onBrightnessChanged(brightness); @@ -507,7 +508,7 @@ public final class DisplayPowerControllerTest { when(mHolder.automaticBrightnessController.convertToNits(rawLeadBrightness)) .thenReturn(nits); when(mHolder.automaticBrightnessController.getAmbientLux()).thenReturn(ambientLux); - when(followerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(followerBrightness); mHolder.dpc.addDisplayBrightnessFollower(followerDpc.dpc); @@ -541,7 +542,7 @@ public final class DisplayPowerControllerTest { when(mHolder.automaticBrightnessController.convertToNits(rawLeadBrightness)) .thenReturn(nits); when(mHolder.automaticBrightnessController.getAmbientLux()).thenReturn(ambientLux); - when(followerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(followerBrightness); mHolder.dpc.updateBrightness(); @@ -600,9 +601,9 @@ public final class DisplayPowerControllerTest { float brightness = 0.6f; float nits = 600; when(mHolder.automaticBrightnessController.convertToNits(brightness)).thenReturn(nits); - when(followerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(brightness); - when(secondFollowerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(secondFollowerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(brightness); when(mHolder.brightnessSetting.getBrightness()).thenReturn(brightness); listener.onBrightnessChanged(brightness); @@ -633,9 +634,9 @@ public final class DisplayPowerControllerTest { brightness = 0.7f; nits = 700; when(mHolder.automaticBrightnessController.convertToNits(brightness)).thenReturn(nits); - when(followerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(followerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(brightness); - when(secondFollowerDpc.automaticBrightnessController.convertToFloatScale(nits)) + when(secondFollowerDpc.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(brightness); when(mHolder.brightnessSetting.getBrightness()).thenReturn(brightness); listener.onBrightnessChanged(brightness); @@ -706,9 +707,9 @@ public final class DisplayPowerControllerTest { float brightness = 0.6f; float nits = 600; when(mHolder.automaticBrightnessController.convertToNits(brightness)).thenReturn(nits); - when(followerHolder.automaticBrightnessController.convertToFloatScale(nits)) + when(followerHolder.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(brightness); - when(secondFollowerHolder.automaticBrightnessController.convertToFloatScale(nits)) + when(secondFollowerHolder.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(brightness); when(mHolder.brightnessSetting.getBrightness()).thenReturn(brightness); listener.onBrightnessChanged(brightness); @@ -1056,7 +1057,7 @@ public final class DisplayPowerControllerTest { float newBrightness = 0.4f; when(mHolder.brightnessSetting.getBrightnessNitsForDefaultDisplay()).thenReturn(nits); - when(mHolder.automaticBrightnessController.convertToFloatScale(nits)) + when(mHolder.automaticBrightnessController.getBrightnessFromNits(nits)) .thenReturn(newBrightness); // New display device setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class), @@ -1073,12 +1074,9 @@ public final class DisplayPowerControllerTest { @Test public void testShortTermModelPersistsWhenDisplayDeviceChanges() { float lux = 2000; - float brightness = 0.4f; float nits = 500; - when(mHolder.brightnessMappingStrategy.getUserLux()).thenReturn(lux); - when(mHolder.brightnessMappingStrategy.getUserBrightness()).thenReturn(brightness); - when(mHolder.brightnessMappingStrategy.convertToNits(brightness)).thenReturn(nits); - when(mHolder.brightnessMappingStrategy.convertToFloatScale(nits)).thenReturn(brightness); + when(mHolder.automaticBrightnessController.getUserLux()).thenReturn(lux); + when(mHolder.automaticBrightnessController.getUserNits()).thenReturn(nits); DisplayPowerRequest dpr = new DisplayPowerRequest(); mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); advanceTime(1); @@ -1095,7 +1093,7 @@ public final class DisplayPowerControllerTest { any(Looper.class), eq(mSensorManagerMock), /* lightSensor= */ any(), - eq(mHolder.brightnessMappingStrategy), + /* brightnessMappingStrategyMap= */ any(SparseArray.class), /* lightSensorWarmUpTime= */ anyInt(), /* brightnessMin= */ anyFloat(), /* brightnessMax= */ anyFloat(), @@ -1114,11 +1112,10 @@ public final class DisplayPowerControllerTest { eq(mContext), any(BrightnessRangeController.class), any(BrightnessThrottler.class), - /* idleModeBrightnessMapper= */ isNull(), /* ambientLightHorizonShort= */ anyInt(), /* ambientLightHorizonLong= */ anyInt(), eq(lux), - eq(brightness) + eq(nits) ); } @@ -1151,7 +1148,7 @@ public final class DisplayPowerControllerTest { public void testDwbcCallsHappenOnHandler() { mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID); - mHolder.dpc.setAutomaticScreenBrightnessMode(true); + mHolder.dpc.setAutomaticScreenBrightnessMode(AUTO_BRIGHTNESS_MODE_IDLE); verify(mDisplayWhiteBalanceControllerMock, never()).setStrongModeEnabled(true); // dispatch handler looper @@ -1291,7 +1288,7 @@ public final class DisplayPowerControllerTest { BRIGHTNESS_RAMP_DECREASE_MAX); // switch to idle - mHolder.dpc.setAutomaticScreenBrightnessMode(/* idle= */ true); + mHolder.dpc.setAutomaticScreenBrightnessMode(AUTO_BRIGHTNESS_MODE_IDLE); advanceTime(1); verify(mHolder.animator, times(2)).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX, @@ -1318,7 +1315,7 @@ public final class DisplayPowerControllerTest { BRIGHTNESS_RAMP_DECREASE_MAX); // switch to idle - mHolder.dpc.setAutomaticScreenBrightnessMode(/* idle= */ true); + mHolder.dpc.setAutomaticScreenBrightnessMode(AUTO_BRIGHTNESS_MODE_IDLE); advanceTime(1); verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX_IDLE, @@ -1345,7 +1342,7 @@ public final class DisplayPowerControllerTest { mHolder.config, /* isEnabled= */ true); // switch to idle mode - mHolder.dpc.setAutomaticScreenBrightnessMode(true); + mHolder.dpc.setAutomaticScreenBrightnessMode(AUTO_BRIGHTNESS_MODE_IDLE); // second time when switching to idle screen brightness mode verify(mHolder.animator, times(2)).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX, @@ -1370,7 +1367,7 @@ public final class DisplayPowerControllerTest { mHolder.config, /* isEnabled= */ true); // switch to idle mode - mHolder.dpc.setAutomaticScreenBrightnessMode(true); + mHolder.dpc.setAutomaticScreenBrightnessMode(AUTO_BRIGHTNESS_MODE_IDLE); verify(mHolder.animator).setAnimationTimeLimits(BRIGHTNESS_RAMP_INCREASE_MAX_IDLE, BRIGHTNESS_RAMP_DECREASE_MAX_IDLE); @@ -1653,7 +1650,7 @@ public final class DisplayPowerControllerTest { AutomaticBrightnessController getAutomaticBrightnessController( AutomaticBrightnessController.Callbacks callbacks, Looper looper, SensorManager sensorManager, Sensor lightSensor, - BrightnessMappingStrategy interactiveModeBrightnessMapper, + SparseArray<BrightnessMappingStrategy> brightnessMappingStrategyMap, int lightSensorWarmUpTime, float brightnessMin, float brightnessMax, float dozeScaleFactor, int lightSensorRate, int initialLightSensorRate, long brighteningLightDebounceConfig, long darkeningLightDebounceConfig, @@ -1664,15 +1661,13 @@ public final class DisplayPowerControllerTest { HysteresisLevels ambientBrightnessThresholdsIdle, HysteresisLevels screenBrightnessThresholdsIdle, Context context, BrightnessRangeController brightnessRangeController, - BrightnessThrottler brightnessThrottler, - BrightnessMappingStrategy idleModeBrightnessMapper, - int ambientLightHorizonShort, int ambientLightHorizonLong, float userLux, - float userBrightness) { + BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort, + int ambientLightHorizonLong, float userLux, float userNits) { return mAutomaticBrightnessController; } @Override - BrightnessMappingStrategy getInteractiveModeBrightnessMapper(Resources resources, + BrightnessMappingStrategy getDefaultModeBrightnessMapper(Resources resources, DisplayDeviceConfig displayDeviceConfig, DisplayWhiteBalanceController displayWhiteBalanceController) { return mBrightnessMappingStrategy; diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java index 52fa91f5fe0e..2d0c3fdb6352 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java @@ -293,21 +293,21 @@ public final class DisplayBrightnessControllerTest { } @Test - public void testConvertToFloatScale() { + public void testGetBrightnessFromNits() { float brightness = 0.5f; float nits = 300; // ABC is null assertEquals(PowerManager.BRIGHTNESS_INVALID_FLOAT, - mDisplayBrightnessController.convertToFloatScale(nits), /* delta= */ 0); + mDisplayBrightnessController.getBrightnessFromNits(nits), /* delta= */ 0); AutomaticBrightnessController automaticBrightnessController = mock(AutomaticBrightnessController.class); - when(automaticBrightnessController.convertToFloatScale(nits)).thenReturn(brightness); + when(automaticBrightnessController.getBrightnessFromNits(nits)).thenReturn(brightness); mDisplayBrightnessController.setAutomaticBrightnessController( automaticBrightnessController); - assertEquals(brightness, mDisplayBrightnessController.convertToFloatScale(nits), + assertEquals(brightness, mDisplayBrightnessController.getBrightnessFromNits(nits), /* delta= */ 0); } @@ -329,7 +329,7 @@ public final class DisplayBrightnessControllerTest { float brightness = 0.3f; AutomaticBrightnessController automaticBrightnessController = mock(AutomaticBrightnessController.class); - when(automaticBrightnessController.convertToFloatScale(nits)).thenReturn(brightness); + when(automaticBrightnessController.getBrightnessFromNits(nits)).thenReturn(brightness); when(mBrightnessSetting.getBrightnessNitsForDefaultDisplay()).thenReturn(nits); mDisplayBrightnessController.setAutomaticBrightnessController( automaticBrightnessController); @@ -340,7 +340,7 @@ public final class DisplayBrightnessControllerTest { // When the nits value is invalid, the brightness is resumed from where it was last set nits = -1; brightness = 0.4f; - when(automaticBrightnessController.convertToFloatScale(nits)).thenReturn(brightness); + when(automaticBrightnessController.getBrightnessFromNits(nits)).thenReturn(brightness); when(mBrightnessSetting.getBrightnessNitsForDefaultDisplay()).thenReturn(nits); when(mBrightnessSetting.getBrightness()).thenReturn(brightness); mDisplayBrightnessController.setAutomaticBrightnessController( |