Loading services/core/java/com/android/server/display/BrightnessMappingStrategy.java +22 −13 Original line number Diff line number Diff line Loading @@ -23,12 +23,14 @@ import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIG import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; import android.annotation.Nullable; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.res.Resources; import android.content.res.TypedArray; import android.hardware.display.BrightnessConfiguration; import android.hardware.display.BrightnessCorrection; import android.os.PowerManager; import android.os.UserHandle; import android.provider.Settings; import android.util.LongArray; import android.util.MathUtils; import android.util.Pair; Loading Loading @@ -80,45 +82,50 @@ public abstract class BrightnessMappingStrategy { * Creates a BrightnessMapping strategy. We do not create a simple mapping strategy for idle * mode. * * @param resources * @param context * @param displayDeviceConfig * @param mode The auto-brightness mode. Different modes use different brightness curves * @param displayWhiteBalanceController * @return the BrightnessMappingStrategy */ @Nullable static BrightnessMappingStrategy create(Resources resources, static BrightnessMappingStrategy create(Context context, DisplayDeviceConfig displayDeviceConfig, @AutomaticBrightnessController.AutomaticBrightnessMode int mode, DisplayWhiteBalanceController displayWhiteBalanceController) { @Nullable DisplayWhiteBalanceController displayWhiteBalanceController) { // Display independent, mode dependent values float[] brightnessLevelsNits = null; float[] brightnessLevels = null; float[] luxLevels = null; int preset = Settings.System.getIntForUser(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_FOR_ALS, Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_NORMAL, UserHandle.USER_CURRENT); switch (mode) { case AUTO_BRIGHTNESS_MODE_DEFAULT -> { brightnessLevelsNits = displayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(); luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(mode); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(mode); luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(mode, preset); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(mode, preset); } case AUTO_BRIGHTNESS_MODE_IDLE -> { brightnessLevelsNits = getFloatArray(resources.obtainTypedArray( brightnessLevelsNits = getFloatArray(context.getResources().obtainTypedArray( com.android.internal.R.array.config_autoBrightnessDisplayValuesNitsIdle)); luxLevels = getLuxLevels(resources.getIntArray( luxLevels = getLuxLevels(context.getResources().getIntArray( com.android.internal.R.array.config_autoBrightnessLevelsIdle)); } case AUTO_BRIGHTNESS_MODE_DOZE -> { luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(mode); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(mode); luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(mode, preset); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(mode, preset); } } // Display independent, mode independent values float autoBrightnessAdjustmentMaxGamma = resources.getFraction( float autoBrightnessAdjustmentMaxGamma = context.getResources().getFraction( com.android.internal.R.fraction.config_autoBrightnessAdjustmentMaxGamma, 1, 1); long shortTermModelTimeout = resources.getInteger( long shortTermModelTimeout = context.getResources().getInteger( com.android.internal.R.integer.config_autoBrightnessShortTermModelTimeout); // Display dependent values - used for physical mapping strategy nits -> brightness Loading Loading @@ -823,6 +830,8 @@ public abstract class BrightnessMappingStrategy { private float mAutoBrightnessAdjustment; private float mUserLux; private float mUserBrightness; @Nullable private final DisplayWhiteBalanceController mDisplayWhiteBalanceController; @AutomaticBrightnessController.AutomaticBrightnessMode Loading @@ -838,7 +847,7 @@ public abstract class BrightnessMappingStrategy { public PhysicalMappingStrategy(BrightnessConfiguration config, float[] nits, float[] brightness, float maxGamma, @AutomaticBrightnessController.AutomaticBrightnessMode int mode, DisplayWhiteBalanceController displayWhiteBalanceController) { @Nullable DisplayWhiteBalanceController displayWhiteBalanceController) { Preconditions.checkArgument(nits.length != 0 && brightness.length != 0, "Nits and brightness arrays must not be empty!"); Loading services/core/java/com/android/server/display/DisplayDeviceConfig.java +7 −30 Original line number Diff line number Diff line Loading @@ -1590,26 +1590,15 @@ public class DisplayDeviceConfig { return mAutoBrightnessBrighteningLightDebounceIdle; } /** * @param mode The auto-brightness mode * @return The default auto-brightness brightening ambient lux levels for the specified mode * and the normal brightness preset */ public float[] getAutoBrightnessBrighteningLevelsLux( @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { if (mDisplayBrightnessMapping == null) { return null; } return mDisplayBrightnessMapping.getLuxArray(mode); } /** * @param mode The auto-brightness mode * @param preset The brightness preset. Presets are used on devices that allow users to choose * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening ambient lux levels for the specified mode and preset * @return The default auto-brightness brightening ambient lux levels for the specified mode * and preset */ public float[] getAutoBrightnessBrighteningLevelsLux(String mode, String preset) { public float[] getAutoBrightnessBrighteningLevelsLux( @AutomaticBrightnessController.AutomaticBrightnessMode int mode, int preset) { if (mDisplayBrightnessMapping == null) { return null; } Loading @@ -1626,26 +1615,14 @@ public class DisplayDeviceConfig { return mDisplayBrightnessMapping.getNitsArray(); } /** * @param mode The auto-brightness mode * @return The default auto-brightness brightening levels for the specified mode and the normal * brightness preset */ public float[] getAutoBrightnessBrighteningLevels( @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { if (mDisplayBrightnessMapping == null) { return null; } return mDisplayBrightnessMapping.getBrightnessArray(mode); } /** * @param mode The auto-brightness mode * @param preset The brightness preset. Presets are used on devices that allow users to choose * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening backlight levels for the specified mode and preset * @return The default auto-brightness brightening levels for the specified mode and preset */ public float[] getAutoBrightnessBrighteningLevels(String mode, String preset) { public float[] getAutoBrightnessBrighteningLevels( @AutomaticBrightnessController.AutomaticBrightnessMode int mode, int preset) { if (mDisplayBrightnessMapping == null) { return null; } Loading services/core/java/com/android/server/display/DisplayPowerController.java +16 −19 Original line number Diff line number Diff line Loading @@ -735,7 +735,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mCdsi = null; } setUpAutoBrightness(resources, handler); setUpAutoBrightness(context, handler); mColorFadeEnabled = !ActivityManager.isLowRamDeviceStatic() && !resources.getBoolean( Loading Loading @@ -1075,7 +1075,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call loadBrightnessRampRates(); loadProximitySensor(); loadNitsRange(mContext.getResources()); setUpAutoBrightness(mContext.getResources(), mHandler); setUpAutoBrightness(mContext, mHandler); reloadReduceBrightColours(); setAnimatorRampSpeeds(/* isIdleMode= */ false); mBrightnessRangeController.loadFromConfig(hbmMetadata, token, info, mDisplayDeviceConfig); Loading Loading @@ -1145,7 +1145,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call handleBrightnessModeChange(); } private void setUpAutoBrightness(Resources resources, Handler handler) { private void setUpAutoBrightness(Context context, Handler handler) { mUseSoftwareAutoBrightnessConfig = mDisplayDeviceConfig.isAutoBrightnessAvailable(); if (!mUseSoftwareAutoBrightnessConfig) { Loading @@ -1155,21 +1155,19 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call SparseArray<BrightnessMappingStrategy> brightnessMappers = new SparseArray<>(); BrightnessMappingStrategy defaultModeBrightnessMapper = mInjector.getDefaultModeBrightnessMapper(resources, mDisplayDeviceConfig, mInjector.getDefaultModeBrightnessMapper(context, mDisplayDeviceConfig, mDisplayWhiteBalanceController); brightnessMappers.append(AUTO_BRIGHTNESS_MODE_DEFAULT, defaultModeBrightnessMapper); final boolean isIdleScreenBrightnessEnabled = resources.getBoolean( final boolean isIdleScreenBrightnessEnabled = context.getResources().getBoolean( R.bool.config_enableIdleScreenBrightnessMode); if (isIdleScreenBrightnessEnabled) { BrightnessMappingStrategy idleModeBrightnessMapper = BrightnessMappingStrategy.create(resources, mDisplayDeviceConfig, AUTO_BRIGHTNESS_MODE_IDLE, mDisplayWhiteBalanceController); BrightnessMappingStrategy.create(context, mDisplayDeviceConfig, AUTO_BRIGHTNESS_MODE_IDLE, mDisplayWhiteBalanceController); if (idleModeBrightnessMapper != null) { brightnessMappers.append(AUTO_BRIGHTNESS_MODE_IDLE, idleModeBrightnessMapper); brightnessMappers.append(AUTO_BRIGHTNESS_MODE_IDLE, idleModeBrightnessMapper); } } Loading @@ -1181,7 +1179,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } if (defaultModeBrightnessMapper != null) { final float dozeScaleFactor = resources.getFraction( final float dozeScaleFactor = context.getResources().getFraction( com.android.internal.R.fraction.config_screenAutoBrightnessDozeScaleFactor, 1, 1); Loading Loading @@ -1265,14 +1263,14 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call .getAutoBrightnessBrighteningLightDebounceIdle(); long darkeningLightDebounceIdle = mDisplayDeviceConfig .getAutoBrightnessDarkeningLightDebounceIdle(); boolean autoBrightnessResetAmbientLuxAfterWarmUp = resources.getBoolean( boolean autoBrightnessResetAmbientLuxAfterWarmUp = context.getResources().getBoolean( com.android.internal.R.bool.config_autoBrightnessResetAmbientLuxAfterWarmUp); int lightSensorWarmUpTimeConfig = resources.getInteger( int lightSensorWarmUpTimeConfig = context.getResources().getInteger( com.android.internal.R.integer.config_lightSensorWarmupTime); int lightSensorRate = resources.getInteger( int lightSensorRate = context.getResources().getInteger( com.android.internal.R.integer.config_autoBrightnessLightSensorRate); int initialLightSensorRate = resources.getInteger( int initialLightSensorRate = context.getResources().getInteger( com.android.internal.R.integer.config_autoBrightnessInitialLightSensorRate); if (initialLightSensorRate == -1) { initialLightSensorRate = lightSensorRate; Loading Loading @@ -3645,12 +3643,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call userNits); } BrightnessMappingStrategy getDefaultModeBrightnessMapper(Resources resources, BrightnessMappingStrategy getDefaultModeBrightnessMapper(Context context, DisplayDeviceConfig displayDeviceConfig, DisplayWhiteBalanceController displayWhiteBalanceController) { return BrightnessMappingStrategy.create(resources, displayDeviceConfig, AUTO_BRIGHTNESS_MODE_DEFAULT, displayWhiteBalanceController); return BrightnessMappingStrategy.create(context, displayDeviceConfig, AUTO_BRIGHTNESS_MODE_DEFAULT, displayWhiteBalanceController); } HysteresisLevels getHysteresisLevels(float[] brighteningThresholdsPercentages, Loading services/core/java/com/android/server/display/DisplayPowerController2.java +31 −16 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ 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_DOZE; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; import static com.android.server.display.config.DisplayBrightnessMappingConfig.autoBrightnessPresetToString; import android.animation.Animator; import android.animation.ObjectAnimator; Loading Loading @@ -624,7 +625,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mCdsi = null; } setUpAutoBrightness(resources, handler); setUpAutoBrightness(context, handler); mColorFadeEnabled = mInjector.isColorFadeEnabled() && !resources.getBoolean( Loading Loading @@ -905,7 +906,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal // updated here. loadBrightnessRampRates(); loadNitsRange(mContext.getResources()); setUpAutoBrightness(mContext.getResources(), mHandler); setUpAutoBrightness(mContext, mHandler); reloadReduceBrightColours(); setAnimatorRampSpeeds(/* isIdleMode= */ false); Loading Loading @@ -976,10 +977,15 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mContext.getContentResolver().registerContentObserver( Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE), false /*notifyForDescendants*/, mSettingsObserver, UserHandle.USER_ALL); if (mFlags.areAutoBrightnessModesEnabled()) { mContext.getContentResolver().registerContentObserver( Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FOR_ALS), /* notifyForDescendants= */ false, mSettingsObserver, UserHandle.USER_CURRENT); } handleBrightnessModeChange(); } private void setUpAutoBrightness(Resources resources, Handler handler) { private void setUpAutoBrightness(Context context, Handler handler) { mUseSoftwareAutoBrightnessConfig = mDisplayDeviceConfig.isAutoBrightnessAvailable(); if (!mUseSoftwareAutoBrightnessConfig) { Loading @@ -989,16 +995,16 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal SparseArray<BrightnessMappingStrategy> brightnessMappers = new SparseArray<>(); BrightnessMappingStrategy defaultModeBrightnessMapper = mInjector.getDefaultModeBrightnessMapper(resources, mDisplayDeviceConfig, mInjector.getDefaultModeBrightnessMapper(context, mDisplayDeviceConfig, mDisplayWhiteBalanceController); brightnessMappers.append(AUTO_BRIGHTNESS_MODE_DEFAULT, defaultModeBrightnessMapper); final boolean isIdleScreenBrightnessEnabled = resources.getBoolean( final boolean isIdleScreenBrightnessEnabled = context.getResources().getBoolean( R.bool.config_enableIdleScreenBrightnessMode); if (isIdleScreenBrightnessEnabled) { BrightnessMappingStrategy idleModeBrightnessMapper = BrightnessMappingStrategy.create(resources, mDisplayDeviceConfig, BrightnessMappingStrategy.create(context, mDisplayDeviceConfig, AUTO_BRIGHTNESS_MODE_IDLE, mDisplayWhiteBalanceController); if (idleModeBrightnessMapper != null) { Loading @@ -1008,7 +1014,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal } BrightnessMappingStrategy dozeModeBrightnessMapper = BrightnessMappingStrategy.create(resources, mDisplayDeviceConfig, BrightnessMappingStrategy.create(context, mDisplayDeviceConfig, AUTO_BRIGHTNESS_MODE_DOZE, mDisplayWhiteBalanceController); if (mFlags.areAutoBrightnessModesEnabled() && dozeModeBrightnessMapper != null) { brightnessMappers.put(AUTO_BRIGHTNESS_MODE_DOZE, dozeModeBrightnessMapper); Loading @@ -1022,7 +1028,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal } if (defaultModeBrightnessMapper != null) { final float dozeScaleFactor = resources.getFraction( final float dozeScaleFactor = context.getResources().getFraction( R.fraction.config_screenAutoBrightnessDozeScaleFactor, 1, 1); Loading Loading @@ -1106,14 +1112,14 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal .getAutoBrightnessBrighteningLightDebounceIdle(); long darkeningLightDebounceIdle = mDisplayDeviceConfig .getAutoBrightnessDarkeningLightDebounceIdle(); boolean autoBrightnessResetAmbientLuxAfterWarmUp = resources.getBoolean( boolean autoBrightnessResetAmbientLuxAfterWarmUp = context.getResources().getBoolean( R.bool.config_autoBrightnessResetAmbientLuxAfterWarmUp); int lightSensorWarmUpTimeConfig = resources.getInteger( int lightSensorWarmUpTimeConfig = context.getResources().getInteger( R.integer.config_lightSensorWarmupTime); int lightSensorRate = resources.getInteger( int lightSensorRate = context.getResources().getInteger( R.integer.config_autoBrightnessLightSensorRate); int initialLightSensorRate = resources.getInteger( int initialLightSensorRate = context.getResources().getInteger( R.integer.config_autoBrightnessInitialLightSensorRate); if (initialLightSensorRate == -1) { initialLightSensorRate = lightSensorRate; Loading Loading @@ -2999,6 +3005,16 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal public void onChange(boolean selfChange, Uri uri) { if (uri.equals(Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE))) { handleBrightnessModeChange(); } else if (uri.equals(Settings.System.getUriFor( Settings.System.SCREEN_BRIGHTNESS_FOR_ALS))) { int preset = Settings.System.getIntForUser(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_FOR_ALS, Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_NORMAL, UserHandle.USER_CURRENT); Slog.i(mTag, "Setting up auto-brightness for preset " + autoBrightnessPresetToString(preset)); setUpAutoBrightness(mContext, mHandler); sendUpdatePowerState(); } else { handleSettingsChange(false /* userSwitch */); } Loading Loading @@ -3117,12 +3133,11 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal userNits); } BrightnessMappingStrategy getDefaultModeBrightnessMapper(Resources resources, BrightnessMappingStrategy getDefaultModeBrightnessMapper(Context context, DisplayDeviceConfig displayDeviceConfig, DisplayWhiteBalanceController displayWhiteBalanceController) { return BrightnessMappingStrategy.create(resources, displayDeviceConfig, AUTO_BRIGHTNESS_MODE_DEFAULT, displayWhiteBalanceController); return BrightnessMappingStrategy.create(context, displayDeviceConfig, AUTO_BRIGHTNESS_MODE_DEFAULT, displayWhiteBalanceController); } HysteresisLevels getHysteresisLevels(float[] brighteningThresholdsPercentages, Loading services/core/java/com/android/server/display/config/DisplayBrightnessMappingConfig.java +32 −29 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIG import android.content.Context; import android.os.PowerManager; import android.provider.Settings; import android.util.Spline; import com.android.internal.display.BrightnessSynchronizer; Loading @@ -38,9 +39,9 @@ import java.util.Map; */ public class DisplayBrightnessMappingConfig { private static final String DEFAULT_BRIGHTNESS_PRESET_NAME = "normal"; private static final String DEFAULT_BRIGHTNESS_MAPPING_KEY = AutoBrightnessModeName._default.getRawName() + "_" + DEFAULT_BRIGHTNESS_PRESET_NAME; AutoBrightnessModeName._default.getRawName() + "_" + AutoBrightnessSettingName.normal.getRawName(); /** * Array of desired screen brightness in nits corresponding to the lux values Loading Loading @@ -150,24 +151,17 @@ public class DisplayBrightnessMappingConfig { } } /** * @param mode The auto-brightness mode * @return The default auto-brightness brightening ambient lux levels for the specified mode * and the normal brightness preset */ public float[] getLuxArray(@AutomaticBrightnessController.AutomaticBrightnessMode int mode) { return mBrightnessLevelsLuxMap.get( autoBrightnessModeToString(mode) + "_" + DEFAULT_BRIGHTNESS_PRESET_NAME); } /** * @param mode The auto-brightness mode * @param preset The brightness preset. Presets are used on devices that allow users to choose * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening ambient lux levels for the specified mode and preset * @return The default auto-brightness brightening ambient lux levels for the specified mode * and preset */ public float[] getLuxArray(String mode, String preset) { return mBrightnessLevelsLuxMap.get(mode + "_" + preset); public float[] getLuxArray(@AutomaticBrightnessController.AutomaticBrightnessMode int mode, int preset) { return mBrightnessLevelsLuxMap.get( autoBrightnessModeToString(mode) + "_" + autoBrightnessPresetToString(preset)); } /** Loading @@ -177,25 +171,16 @@ public class DisplayBrightnessMappingConfig { return mBrightnessLevelsNits; } /** * @param mode The auto-brightness mode * @return The default auto-brightness brightening levels for the specified mode and the normal * brightness preset */ public float[] getBrightnessArray( @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { return mBrightnessLevelsMap.get( autoBrightnessModeToString(mode) + "_" + DEFAULT_BRIGHTNESS_PRESET_NAME); } /** * @param mode The auto-brightness mode * @param preset The brightness preset. Presets are used on devices that allow users to choose * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening ambient lux levels for the specified mode and preset * @return The default auto-brightness brightening levels for the specified mode and preset */ public float[] getBrightnessArray(String mode, String preset) { return mBrightnessLevelsMap.get(mode + "_" + preset); public float[] getBrightnessArray( @AutomaticBrightnessController.AutomaticBrightnessMode int mode, int preset) { return mBrightnessLevelsMap.get( autoBrightnessModeToString(mode) + "_" + autoBrightnessPresetToString(preset)); } @Override Loading Loading @@ -247,6 +232,24 @@ public class DisplayBrightnessMappingConfig { } } /** * @param preset The brightness preset. Presets are used on devices that allow users to choose * from a set of predefined options in display auto-brightness settings. * @return The string representing the preset */ public static String autoBrightnessPresetToString(int preset) { return switch (preset) { case Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_DIM -> AutoBrightnessSettingName.dim.getRawName(); case Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_NORMAL -> AutoBrightnessSettingName.normal.getRawName(); case Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_BRIGHT -> AutoBrightnessSettingName.bright.getRawName(); default -> throw new IllegalArgumentException( "Unknown auto-brightness preset value: " + preset); }; } private float[] brightnessArrayIntToFloat(int[] brightnessInt, Spline backlightToBrightnessSpline) { float[] brightnessFloat = new float[brightnessInt.length]; Loading Loading
services/core/java/com/android/server/display/BrightnessMappingStrategy.java +22 −13 Original line number Diff line number Diff line Loading @@ -23,12 +23,14 @@ import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIG import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; import android.annotation.Nullable; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.res.Resources; import android.content.res.TypedArray; import android.hardware.display.BrightnessConfiguration; import android.hardware.display.BrightnessCorrection; import android.os.PowerManager; import android.os.UserHandle; import android.provider.Settings; import android.util.LongArray; import android.util.MathUtils; import android.util.Pair; Loading Loading @@ -80,45 +82,50 @@ public abstract class BrightnessMappingStrategy { * Creates a BrightnessMapping strategy. We do not create a simple mapping strategy for idle * mode. * * @param resources * @param context * @param displayDeviceConfig * @param mode The auto-brightness mode. Different modes use different brightness curves * @param displayWhiteBalanceController * @return the BrightnessMappingStrategy */ @Nullable static BrightnessMappingStrategy create(Resources resources, static BrightnessMappingStrategy create(Context context, DisplayDeviceConfig displayDeviceConfig, @AutomaticBrightnessController.AutomaticBrightnessMode int mode, DisplayWhiteBalanceController displayWhiteBalanceController) { @Nullable DisplayWhiteBalanceController displayWhiteBalanceController) { // Display independent, mode dependent values float[] brightnessLevelsNits = null; float[] brightnessLevels = null; float[] luxLevels = null; int preset = Settings.System.getIntForUser(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_FOR_ALS, Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_NORMAL, UserHandle.USER_CURRENT); switch (mode) { case AUTO_BRIGHTNESS_MODE_DEFAULT -> { brightnessLevelsNits = displayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(); luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(mode); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(mode); luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(mode, preset); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(mode, preset); } case AUTO_BRIGHTNESS_MODE_IDLE -> { brightnessLevelsNits = getFloatArray(resources.obtainTypedArray( brightnessLevelsNits = getFloatArray(context.getResources().obtainTypedArray( com.android.internal.R.array.config_autoBrightnessDisplayValuesNitsIdle)); luxLevels = getLuxLevels(resources.getIntArray( luxLevels = getLuxLevels(context.getResources().getIntArray( com.android.internal.R.array.config_autoBrightnessLevelsIdle)); } case AUTO_BRIGHTNESS_MODE_DOZE -> { luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(mode); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(mode); luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(mode, preset); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(mode, preset); } } // Display independent, mode independent values float autoBrightnessAdjustmentMaxGamma = resources.getFraction( float autoBrightnessAdjustmentMaxGamma = context.getResources().getFraction( com.android.internal.R.fraction.config_autoBrightnessAdjustmentMaxGamma, 1, 1); long shortTermModelTimeout = resources.getInteger( long shortTermModelTimeout = context.getResources().getInteger( com.android.internal.R.integer.config_autoBrightnessShortTermModelTimeout); // Display dependent values - used for physical mapping strategy nits -> brightness Loading Loading @@ -823,6 +830,8 @@ public abstract class BrightnessMappingStrategy { private float mAutoBrightnessAdjustment; private float mUserLux; private float mUserBrightness; @Nullable private final DisplayWhiteBalanceController mDisplayWhiteBalanceController; @AutomaticBrightnessController.AutomaticBrightnessMode Loading @@ -838,7 +847,7 @@ public abstract class BrightnessMappingStrategy { public PhysicalMappingStrategy(BrightnessConfiguration config, float[] nits, float[] brightness, float maxGamma, @AutomaticBrightnessController.AutomaticBrightnessMode int mode, DisplayWhiteBalanceController displayWhiteBalanceController) { @Nullable DisplayWhiteBalanceController displayWhiteBalanceController) { Preconditions.checkArgument(nits.length != 0 && brightness.length != 0, "Nits and brightness arrays must not be empty!"); Loading
services/core/java/com/android/server/display/DisplayDeviceConfig.java +7 −30 Original line number Diff line number Diff line Loading @@ -1590,26 +1590,15 @@ public class DisplayDeviceConfig { return mAutoBrightnessBrighteningLightDebounceIdle; } /** * @param mode The auto-brightness mode * @return The default auto-brightness brightening ambient lux levels for the specified mode * and the normal brightness preset */ public float[] getAutoBrightnessBrighteningLevelsLux( @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { if (mDisplayBrightnessMapping == null) { return null; } return mDisplayBrightnessMapping.getLuxArray(mode); } /** * @param mode The auto-brightness mode * @param preset The brightness preset. Presets are used on devices that allow users to choose * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening ambient lux levels for the specified mode and preset * @return The default auto-brightness brightening ambient lux levels for the specified mode * and preset */ public float[] getAutoBrightnessBrighteningLevelsLux(String mode, String preset) { public float[] getAutoBrightnessBrighteningLevelsLux( @AutomaticBrightnessController.AutomaticBrightnessMode int mode, int preset) { if (mDisplayBrightnessMapping == null) { return null; } Loading @@ -1626,26 +1615,14 @@ public class DisplayDeviceConfig { return mDisplayBrightnessMapping.getNitsArray(); } /** * @param mode The auto-brightness mode * @return The default auto-brightness brightening levels for the specified mode and the normal * brightness preset */ public float[] getAutoBrightnessBrighteningLevels( @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { if (mDisplayBrightnessMapping == null) { return null; } return mDisplayBrightnessMapping.getBrightnessArray(mode); } /** * @param mode The auto-brightness mode * @param preset The brightness preset. Presets are used on devices that allow users to choose * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening backlight levels for the specified mode and preset * @return The default auto-brightness brightening levels for the specified mode and preset */ public float[] getAutoBrightnessBrighteningLevels(String mode, String preset) { public float[] getAutoBrightnessBrighteningLevels( @AutomaticBrightnessController.AutomaticBrightnessMode int mode, int preset) { if (mDisplayBrightnessMapping == null) { return null; } Loading
services/core/java/com/android/server/display/DisplayPowerController.java +16 −19 Original line number Diff line number Diff line Loading @@ -735,7 +735,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mCdsi = null; } setUpAutoBrightness(resources, handler); setUpAutoBrightness(context, handler); mColorFadeEnabled = !ActivityManager.isLowRamDeviceStatic() && !resources.getBoolean( Loading Loading @@ -1075,7 +1075,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call loadBrightnessRampRates(); loadProximitySensor(); loadNitsRange(mContext.getResources()); setUpAutoBrightness(mContext.getResources(), mHandler); setUpAutoBrightness(mContext, mHandler); reloadReduceBrightColours(); setAnimatorRampSpeeds(/* isIdleMode= */ false); mBrightnessRangeController.loadFromConfig(hbmMetadata, token, info, mDisplayDeviceConfig); Loading Loading @@ -1145,7 +1145,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call handleBrightnessModeChange(); } private void setUpAutoBrightness(Resources resources, Handler handler) { private void setUpAutoBrightness(Context context, Handler handler) { mUseSoftwareAutoBrightnessConfig = mDisplayDeviceConfig.isAutoBrightnessAvailable(); if (!mUseSoftwareAutoBrightnessConfig) { Loading @@ -1155,21 +1155,19 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call SparseArray<BrightnessMappingStrategy> brightnessMappers = new SparseArray<>(); BrightnessMappingStrategy defaultModeBrightnessMapper = mInjector.getDefaultModeBrightnessMapper(resources, mDisplayDeviceConfig, mInjector.getDefaultModeBrightnessMapper(context, mDisplayDeviceConfig, mDisplayWhiteBalanceController); brightnessMappers.append(AUTO_BRIGHTNESS_MODE_DEFAULT, defaultModeBrightnessMapper); final boolean isIdleScreenBrightnessEnabled = resources.getBoolean( final boolean isIdleScreenBrightnessEnabled = context.getResources().getBoolean( R.bool.config_enableIdleScreenBrightnessMode); if (isIdleScreenBrightnessEnabled) { BrightnessMappingStrategy idleModeBrightnessMapper = BrightnessMappingStrategy.create(resources, mDisplayDeviceConfig, AUTO_BRIGHTNESS_MODE_IDLE, mDisplayWhiteBalanceController); BrightnessMappingStrategy.create(context, mDisplayDeviceConfig, AUTO_BRIGHTNESS_MODE_IDLE, mDisplayWhiteBalanceController); if (idleModeBrightnessMapper != null) { brightnessMappers.append(AUTO_BRIGHTNESS_MODE_IDLE, idleModeBrightnessMapper); brightnessMappers.append(AUTO_BRIGHTNESS_MODE_IDLE, idleModeBrightnessMapper); } } Loading @@ -1181,7 +1179,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } if (defaultModeBrightnessMapper != null) { final float dozeScaleFactor = resources.getFraction( final float dozeScaleFactor = context.getResources().getFraction( com.android.internal.R.fraction.config_screenAutoBrightnessDozeScaleFactor, 1, 1); Loading Loading @@ -1265,14 +1263,14 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call .getAutoBrightnessBrighteningLightDebounceIdle(); long darkeningLightDebounceIdle = mDisplayDeviceConfig .getAutoBrightnessDarkeningLightDebounceIdle(); boolean autoBrightnessResetAmbientLuxAfterWarmUp = resources.getBoolean( boolean autoBrightnessResetAmbientLuxAfterWarmUp = context.getResources().getBoolean( com.android.internal.R.bool.config_autoBrightnessResetAmbientLuxAfterWarmUp); int lightSensorWarmUpTimeConfig = resources.getInteger( int lightSensorWarmUpTimeConfig = context.getResources().getInteger( com.android.internal.R.integer.config_lightSensorWarmupTime); int lightSensorRate = resources.getInteger( int lightSensorRate = context.getResources().getInteger( com.android.internal.R.integer.config_autoBrightnessLightSensorRate); int initialLightSensorRate = resources.getInteger( int initialLightSensorRate = context.getResources().getInteger( com.android.internal.R.integer.config_autoBrightnessInitialLightSensorRate); if (initialLightSensorRate == -1) { initialLightSensorRate = lightSensorRate; Loading Loading @@ -3645,12 +3643,11 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call userNits); } BrightnessMappingStrategy getDefaultModeBrightnessMapper(Resources resources, BrightnessMappingStrategy getDefaultModeBrightnessMapper(Context context, DisplayDeviceConfig displayDeviceConfig, DisplayWhiteBalanceController displayWhiteBalanceController) { return BrightnessMappingStrategy.create(resources, displayDeviceConfig, AUTO_BRIGHTNESS_MODE_DEFAULT, displayWhiteBalanceController); return BrightnessMappingStrategy.create(context, displayDeviceConfig, AUTO_BRIGHTNESS_MODE_DEFAULT, displayWhiteBalanceController); } HysteresisLevels getHysteresisLevels(float[] brighteningThresholdsPercentages, Loading
services/core/java/com/android/server/display/DisplayPowerController2.java +31 −16 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ 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_DOZE; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; import static com.android.server.display.config.DisplayBrightnessMappingConfig.autoBrightnessPresetToString; import android.animation.Animator; import android.animation.ObjectAnimator; Loading Loading @@ -624,7 +625,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mCdsi = null; } setUpAutoBrightness(resources, handler); setUpAutoBrightness(context, handler); mColorFadeEnabled = mInjector.isColorFadeEnabled() && !resources.getBoolean( Loading Loading @@ -905,7 +906,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal // updated here. loadBrightnessRampRates(); loadNitsRange(mContext.getResources()); setUpAutoBrightness(mContext.getResources(), mHandler); setUpAutoBrightness(mContext, mHandler); reloadReduceBrightColours(); setAnimatorRampSpeeds(/* isIdleMode= */ false); Loading Loading @@ -976,10 +977,15 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal mContext.getContentResolver().registerContentObserver( Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE), false /*notifyForDescendants*/, mSettingsObserver, UserHandle.USER_ALL); if (mFlags.areAutoBrightnessModesEnabled()) { mContext.getContentResolver().registerContentObserver( Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_FOR_ALS), /* notifyForDescendants= */ false, mSettingsObserver, UserHandle.USER_CURRENT); } handleBrightnessModeChange(); } private void setUpAutoBrightness(Resources resources, Handler handler) { private void setUpAutoBrightness(Context context, Handler handler) { mUseSoftwareAutoBrightnessConfig = mDisplayDeviceConfig.isAutoBrightnessAvailable(); if (!mUseSoftwareAutoBrightnessConfig) { Loading @@ -989,16 +995,16 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal SparseArray<BrightnessMappingStrategy> brightnessMappers = new SparseArray<>(); BrightnessMappingStrategy defaultModeBrightnessMapper = mInjector.getDefaultModeBrightnessMapper(resources, mDisplayDeviceConfig, mInjector.getDefaultModeBrightnessMapper(context, mDisplayDeviceConfig, mDisplayWhiteBalanceController); brightnessMappers.append(AUTO_BRIGHTNESS_MODE_DEFAULT, defaultModeBrightnessMapper); final boolean isIdleScreenBrightnessEnabled = resources.getBoolean( final boolean isIdleScreenBrightnessEnabled = context.getResources().getBoolean( R.bool.config_enableIdleScreenBrightnessMode); if (isIdleScreenBrightnessEnabled) { BrightnessMappingStrategy idleModeBrightnessMapper = BrightnessMappingStrategy.create(resources, mDisplayDeviceConfig, BrightnessMappingStrategy.create(context, mDisplayDeviceConfig, AUTO_BRIGHTNESS_MODE_IDLE, mDisplayWhiteBalanceController); if (idleModeBrightnessMapper != null) { Loading @@ -1008,7 +1014,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal } BrightnessMappingStrategy dozeModeBrightnessMapper = BrightnessMappingStrategy.create(resources, mDisplayDeviceConfig, BrightnessMappingStrategy.create(context, mDisplayDeviceConfig, AUTO_BRIGHTNESS_MODE_DOZE, mDisplayWhiteBalanceController); if (mFlags.areAutoBrightnessModesEnabled() && dozeModeBrightnessMapper != null) { brightnessMappers.put(AUTO_BRIGHTNESS_MODE_DOZE, dozeModeBrightnessMapper); Loading @@ -1022,7 +1028,7 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal } if (defaultModeBrightnessMapper != null) { final float dozeScaleFactor = resources.getFraction( final float dozeScaleFactor = context.getResources().getFraction( R.fraction.config_screenAutoBrightnessDozeScaleFactor, 1, 1); Loading Loading @@ -1106,14 +1112,14 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal .getAutoBrightnessBrighteningLightDebounceIdle(); long darkeningLightDebounceIdle = mDisplayDeviceConfig .getAutoBrightnessDarkeningLightDebounceIdle(); boolean autoBrightnessResetAmbientLuxAfterWarmUp = resources.getBoolean( boolean autoBrightnessResetAmbientLuxAfterWarmUp = context.getResources().getBoolean( R.bool.config_autoBrightnessResetAmbientLuxAfterWarmUp); int lightSensorWarmUpTimeConfig = resources.getInteger( int lightSensorWarmUpTimeConfig = context.getResources().getInteger( R.integer.config_lightSensorWarmupTime); int lightSensorRate = resources.getInteger( int lightSensorRate = context.getResources().getInteger( R.integer.config_autoBrightnessLightSensorRate); int initialLightSensorRate = resources.getInteger( int initialLightSensorRate = context.getResources().getInteger( R.integer.config_autoBrightnessInitialLightSensorRate); if (initialLightSensorRate == -1) { initialLightSensorRate = lightSensorRate; Loading Loading @@ -2999,6 +3005,16 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal public void onChange(boolean selfChange, Uri uri) { if (uri.equals(Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE))) { handleBrightnessModeChange(); } else if (uri.equals(Settings.System.getUriFor( Settings.System.SCREEN_BRIGHTNESS_FOR_ALS))) { int preset = Settings.System.getIntForUser(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_FOR_ALS, Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_NORMAL, UserHandle.USER_CURRENT); Slog.i(mTag, "Setting up auto-brightness for preset " + autoBrightnessPresetToString(preset)); setUpAutoBrightness(mContext, mHandler); sendUpdatePowerState(); } else { handleSettingsChange(false /* userSwitch */); } Loading Loading @@ -3117,12 +3133,11 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal userNits); } BrightnessMappingStrategy getDefaultModeBrightnessMapper(Resources resources, BrightnessMappingStrategy getDefaultModeBrightnessMapper(Context context, DisplayDeviceConfig displayDeviceConfig, DisplayWhiteBalanceController displayWhiteBalanceController) { return BrightnessMappingStrategy.create(resources, displayDeviceConfig, AUTO_BRIGHTNESS_MODE_DEFAULT, displayWhiteBalanceController); return BrightnessMappingStrategy.create(context, displayDeviceConfig, AUTO_BRIGHTNESS_MODE_DEFAULT, displayWhiteBalanceController); } HysteresisLevels getHysteresisLevels(float[] brighteningThresholdsPercentages, Loading
services/core/java/com/android/server/display/config/DisplayBrightnessMappingConfig.java +32 −29 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIG import android.content.Context; import android.os.PowerManager; import android.provider.Settings; import android.util.Spline; import com.android.internal.display.BrightnessSynchronizer; Loading @@ -38,9 +39,9 @@ import java.util.Map; */ public class DisplayBrightnessMappingConfig { private static final String DEFAULT_BRIGHTNESS_PRESET_NAME = "normal"; private static final String DEFAULT_BRIGHTNESS_MAPPING_KEY = AutoBrightnessModeName._default.getRawName() + "_" + DEFAULT_BRIGHTNESS_PRESET_NAME; AutoBrightnessModeName._default.getRawName() + "_" + AutoBrightnessSettingName.normal.getRawName(); /** * Array of desired screen brightness in nits corresponding to the lux values Loading Loading @@ -150,24 +151,17 @@ public class DisplayBrightnessMappingConfig { } } /** * @param mode The auto-brightness mode * @return The default auto-brightness brightening ambient lux levels for the specified mode * and the normal brightness preset */ public float[] getLuxArray(@AutomaticBrightnessController.AutomaticBrightnessMode int mode) { return mBrightnessLevelsLuxMap.get( autoBrightnessModeToString(mode) + "_" + DEFAULT_BRIGHTNESS_PRESET_NAME); } /** * @param mode The auto-brightness mode * @param preset The brightness preset. Presets are used on devices that allow users to choose * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening ambient lux levels for the specified mode and preset * @return The default auto-brightness brightening ambient lux levels for the specified mode * and preset */ public float[] getLuxArray(String mode, String preset) { return mBrightnessLevelsLuxMap.get(mode + "_" + preset); public float[] getLuxArray(@AutomaticBrightnessController.AutomaticBrightnessMode int mode, int preset) { return mBrightnessLevelsLuxMap.get( autoBrightnessModeToString(mode) + "_" + autoBrightnessPresetToString(preset)); } /** Loading @@ -177,25 +171,16 @@ public class DisplayBrightnessMappingConfig { return mBrightnessLevelsNits; } /** * @param mode The auto-brightness mode * @return The default auto-brightness brightening levels for the specified mode and the normal * brightness preset */ public float[] getBrightnessArray( @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { return mBrightnessLevelsMap.get( autoBrightnessModeToString(mode) + "_" + DEFAULT_BRIGHTNESS_PRESET_NAME); } /** * @param mode The auto-brightness mode * @param preset The brightness preset. Presets are used on devices that allow users to choose * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening ambient lux levels for the specified mode and preset * @return The default auto-brightness brightening levels for the specified mode and preset */ public float[] getBrightnessArray(String mode, String preset) { return mBrightnessLevelsMap.get(mode + "_" + preset); public float[] getBrightnessArray( @AutomaticBrightnessController.AutomaticBrightnessMode int mode, int preset) { return mBrightnessLevelsMap.get( autoBrightnessModeToString(mode) + "_" + autoBrightnessPresetToString(preset)); } @Override Loading Loading @@ -247,6 +232,24 @@ public class DisplayBrightnessMappingConfig { } } /** * @param preset The brightness preset. Presets are used on devices that allow users to choose * from a set of predefined options in display auto-brightness settings. * @return The string representing the preset */ public static String autoBrightnessPresetToString(int preset) { return switch (preset) { case Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_DIM -> AutoBrightnessSettingName.dim.getRawName(); case Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_NORMAL -> AutoBrightnessSettingName.normal.getRawName(); case Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_BRIGHT -> AutoBrightnessSettingName.bright.getRawName(); default -> throw new IllegalArgumentException( "Unknown auto-brightness preset value: " + preset); }; } private float[] brightnessArrayIntToFloat(int[] brightnessInt, Spline backlightToBrightnessSpline) { float[] brightnessFloat = new float[brightnessInt.length]; Loading