Loading services/core/java/com/android/server/display/AutomaticBrightnessController.java +8 −11 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.display; package com.android.server.display; import static com.android.server.display.config.DisplayBrightnessMappingConfig.autoBrightnessModeToString; import android.annotation.IntDef; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; Loading Loading @@ -72,12 +74,14 @@ public class AutomaticBrightnessController { @IntDef(prefix = { "AUTO_BRIGHTNESS_MODE_" }, value = { @IntDef(prefix = { "AUTO_BRIGHTNESS_MODE_" }, value = { AUTO_BRIGHTNESS_MODE_DEFAULT, AUTO_BRIGHTNESS_MODE_DEFAULT, AUTO_BRIGHTNESS_MODE_IDLE, AUTO_BRIGHTNESS_MODE_IDLE, AUTO_BRIGHTNESS_MODE_DOZE }) }) @Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE) public @interface AutomaticBrightnessMode{} public @interface AutomaticBrightnessMode{} public static final int AUTO_BRIGHTNESS_MODE_DEFAULT = 0; public static final int AUTO_BRIGHTNESS_MODE_DEFAULT = 0; public static final int AUTO_BRIGHTNESS_MODE_IDLE = 1; public static final int AUTO_BRIGHTNESS_MODE_IDLE = 1; public static final int AUTO_BRIGHTNESS_MODE_DOZE = 2; // How long the current sensor reading is assumed to be valid beyond the current time. // 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 // This provides a bit of prediction, as well as ensures that the weight for the last sample is Loading Loading @@ -616,12 +620,13 @@ public class AutomaticBrightnessController { pw.println(" mPendingForegroundAppPackageName=" + mPendingForegroundAppPackageName); pw.println(" mPendingForegroundAppPackageName=" + mPendingForegroundAppPackageName); pw.println(" mForegroundAppCategory=" + mForegroundAppCategory); pw.println(" mForegroundAppCategory=" + mForegroundAppCategory); pw.println(" mPendingForegroundAppCategory=" + mPendingForegroundAppCategory); pw.println(" mPendingForegroundAppCategory=" + mPendingForegroundAppCategory); pw.println(" Current mode=" + mCurrentBrightnessMapper.getMode()); pw.println(" Current mode=" + autoBrightnessModeToString(mCurrentBrightnessMapper.getMode())); pw.println(); pw.println(); for (int i = 0; i < mBrightnessMappingStrategyMap.size(); i++) { for (int i = 0; i < mBrightnessMappingStrategyMap.size(); i++) { pw.println(" Mapper for mode " + modeToString(mBrightnessMappingStrategyMap.keyAt(i)) pw.println(" Mapper for mode " + "="); + autoBrightnessModeToString(mBrightnessMappingStrategyMap.keyAt(i)) + "="); mBrightnessMappingStrategyMap.valueAt(i).dump(pw, mBrightnessMappingStrategyMap.valueAt(i).dump(pw, mBrightnessRangeController.getNormalBrightnessMax()); mBrightnessRangeController.getNormalBrightnessMax()); } } Loading Loading @@ -1224,14 +1229,6 @@ 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 { private class ShortTermModel { // When the short term model is invalidated, we don't necessarily reset it (i.e. clear the // 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 // user's adjustment) immediately, but wait for a drastic enough change in the ambient Loading services/core/java/com/android/server/display/BrightnessMappingStrategy.java +7 −2 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.display; import static android.text.TextUtils.formatSimple; 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_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.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; import android.annotation.Nullable; import android.annotation.Nullable; Loading Loading @@ -98,8 +99,8 @@ public abstract class BrightnessMappingStrategy { switch (mode) { switch (mode) { case AUTO_BRIGHTNESS_MODE_DEFAULT -> { case AUTO_BRIGHTNESS_MODE_DEFAULT -> { brightnessLevelsNits = displayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(); brightnessLevelsNits = displayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(); luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(); luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(mode); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(mode); } } case AUTO_BRIGHTNESS_MODE_IDLE -> { case AUTO_BRIGHTNESS_MODE_IDLE -> { brightnessLevelsNits = getFloatArray(resources.obtainTypedArray( brightnessLevelsNits = getFloatArray(resources.obtainTypedArray( Loading @@ -107,6 +108,10 @@ public abstract class BrightnessMappingStrategy { luxLevels = getLuxLevels(resources.getIntArray( luxLevels = getLuxLevels(resources.getIntArray( com.android.internal.R.array.config_autoBrightnessLevelsIdle)); com.android.internal.R.array.config_autoBrightnessLevelsIdle)); } } case AUTO_BRIGHTNESS_MODE_DOZE -> { luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(mode); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(mode); } } } // Display independent, mode independent values // Display independent, mode independent values Loading services/core/java/com/android/server/display/DisplayDeviceConfig.java +22 −14 Original line number Original line Diff line number Diff line Loading @@ -1591,25 +1591,29 @@ public class DisplayDeviceConfig { } } /** /** * @return The default auto-brightness brightening ambient lux levels * @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() { public float[] getAutoBrightnessBrighteningLevelsLux( @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { if (mDisplayBrightnessMapping == null) { if (mDisplayBrightnessMapping == null) { return null; return null; } } return mDisplayBrightnessMapping.getLuxArray(); return mDisplayBrightnessMapping.getLuxArray(mode); } } /** /** * @param mode The auto-brightness mode * @param mode The auto-brightness mode * @param setting The brightness setting * @param preset The brightness preset. Presets are used on devices that allow users to choose * @return Auto brightness brightening ambient lux levels for the specified mode and setting * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening ambient lux levels for the specified mode and preset */ */ public float[] getAutoBrightnessBrighteningLevelsLux(String mode, String setting) { public float[] getAutoBrightnessBrighteningLevelsLux(String mode, String preset) { if (mDisplayBrightnessMapping == null) { if (mDisplayBrightnessMapping == null) { return null; return null; } } return mDisplayBrightnessMapping.getLuxArray(mode, setting); return mDisplayBrightnessMapping.getLuxArray(mode, preset); } } /** /** Loading @@ -1623,25 +1627,29 @@ public class DisplayDeviceConfig { } } /** /** * @return The default auto-brightness brightening levels * @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() { public float[] getAutoBrightnessBrighteningLevels( @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { if (mDisplayBrightnessMapping == null) { if (mDisplayBrightnessMapping == null) { return null; return null; } } return mDisplayBrightnessMapping.getBrightnessArray(); return mDisplayBrightnessMapping.getBrightnessArray(mode); } } /** /** * @param mode The auto-brightness mode * @param mode The auto-brightness mode * @param setting The brightness setting * @param preset The brightness preset. Presets are used on devices that allow users to choose * @return Auto brightness brightening backlight levels for the specified mode and setting * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening backlight levels for the specified mode and preset */ */ public float[] getAutoBrightnessBrighteningLevels(String mode, String setting) { public float[] getAutoBrightnessBrighteningLevels(String mode, String preset) { if (mDisplayBrightnessMapping == null) { if (mDisplayBrightnessMapping == null) { return null; return null; } } return mDisplayBrightnessMapping.getBrightnessArray(mode, setting); return mDisplayBrightnessMapping.getBrightnessArray(mode, preset); } } /** /** Loading services/core/java/com/android/server/display/DisplayPowerController2.java +15 −0 Original line number Original line Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.server.display; 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_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.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; import android.animation.Animator; import android.animation.Animator; Loading Loading @@ -1006,6 +1007,13 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal } } } } BrightnessMappingStrategy dozeModeBrightnessMapper = BrightnessMappingStrategy.create(resources, mDisplayDeviceConfig, AUTO_BRIGHTNESS_MODE_DOZE, mDisplayWhiteBalanceController); if (mFlags.areAutoBrightnessModesEnabled() && dozeModeBrightnessMapper != null) { brightnessMappers.put(AUTO_BRIGHTNESS_MODE_DOZE, dozeModeBrightnessMapper); } float userLux = BrightnessMappingStrategy.INVALID_LUX; float userLux = BrightnessMappingStrategy.INVALID_LUX; float userNits = BrightnessMappingStrategy.INVALID_NITS; float userNits = BrightnessMappingStrategy.INVALID_NITS; if (mAutomaticBrightnessController != null) { if (mAutomaticBrightnessController != null) { Loading Loading @@ -1349,6 +1357,13 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal animateScreenStateChange(state, mDisplayStateController.shouldPerformScreenOffTransition()); animateScreenStateChange(state, mDisplayStateController.shouldPerformScreenOffTransition()); state = mPowerState.getScreenState(); state = mPowerState.getScreenState(); // Switch to doze auto-brightness mode if needed if (mFlags.areAutoBrightnessModesEnabled() && mAutomaticBrightnessController != null && !mAutomaticBrightnessController.isInIdleMode()) { setAutomaticScreenBrightnessMode(Display.isDozeState(state) ? AUTO_BRIGHTNESS_MODE_DOZE : AUTO_BRIGHTNESS_MODE_DEFAULT); } final boolean userSetBrightnessChanged = mDisplayBrightnessController final boolean userSetBrightnessChanged = mDisplayBrightnessController .updateUserSetScreenBrightness(); .updateUserSetScreenBrightness(); Loading services/core/java/com/android/server/display/config/DisplayBrightnessMappingConfig.java +65 −23 Original line number Original line Diff line number Diff line Loading @@ -16,11 +16,16 @@ package com.android.server.display.config; package com.android.server.display.config; 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 android.content.Context; import android.content.Context; import android.os.PowerManager; import android.os.PowerManager; import android.util.Spline; import android.util.Spline; import com.android.internal.display.BrightnessSynchronizer; import com.android.internal.display.BrightnessSynchronizer; import com.android.server.display.AutomaticBrightnessController; import com.android.server.display.DisplayDeviceConfig; import com.android.server.display.DisplayDeviceConfig; import com.android.server.display.feature.DisplayManagerFlags; import com.android.server.display.feature.DisplayManagerFlags; Loading @@ -33,7 +38,9 @@ import java.util.Map; */ */ public class DisplayBrightnessMappingConfig { public class DisplayBrightnessMappingConfig { private static final String DEFAULT_BRIGHTNESS_MAPPING_KEY = "default_normal"; private static final String DEFAULT_BRIGHTNESS_PRESET_NAME = "normal"; private static final String DEFAULT_BRIGHTNESS_MAPPING_KEY = AutoBrightnessModeName._default.getRawName() + "_" + DEFAULT_BRIGHTNESS_PRESET_NAME; /** /** * Array of desired screen brightness in nits corresponding to the lux values * Array of desired screen brightness in nits corresponding to the lux values Loading @@ -45,19 +52,22 @@ public class DisplayBrightnessMappingConfig { /** /** * Map of arrays of desired screen brightness corresponding to the lux values * Map of arrays of desired screen brightness corresponding to the lux values * in mBrightnessLevelsLuxMap, indexed by the auto-brightness mode and the brightness setting. * in mBrightnessLevelsLuxMap, indexed by the auto-brightness mode and the brightness preset. * The brightness values must be non-negative and non-decreasing. They must be between * The brightness values must be non-negative and non-decreasing. They must be between * {@link PowerManager.BRIGHTNESS_MIN} and {@link PowerManager.BRIGHTNESS_MAX}. * {@link PowerManager.BRIGHTNESS_MIN} and {@link PowerManager.BRIGHTNESS_MAX}. * * * The keys are a concatenation of the auto-brightness mode and the brightness setting * The keys are a concatenation of the auto-brightness mode and the brightness preset separated * separated by an underscore, e.g. default_normal, default_dim, default_bright, doze_normal, * by an underscore, e.g. default_normal, default_dim, default_bright, doze_normal, doze_dim, * doze_dim, doze_bright. * doze_bright. * * The presets are used on devices that allow users to choose from a set of predefined options * in display auto-brightness settings. */ */ private final Map<String, float[]> mBrightnessLevelsMap = new HashMap<>(); private final Map<String, float[]> mBrightnessLevelsMap = new HashMap<>(); /** /** * Map of arrays of light sensor lux values to define our levels for auto-brightness support, * Map of arrays of light sensor lux values to define our levels for auto-brightness support, * indexed by the auto-brightness mode and the brightness setting. * indexed by the auto-brightness mode and the brightness preset. * * * The first lux value in every array is always 0. * The first lux value in every array is always 0. * * Loading @@ -69,9 +79,12 @@ public class DisplayBrightnessMappingConfig { * Spline interpolation is used to determine the auto-brightness values for lux levels between * Spline interpolation is used to determine the auto-brightness values for lux levels between * these control points. * these control points. * * * The keys are a concatenation of the auto-brightness mode and the brightness setting * The keys are a concatenation of the auto-brightness mode and the brightness preset separated * separated by an underscore, e.g. default_normal, default_dim, default_bright, doze_normal, * by an underscore, e.g. default_normal, default_dim, default_bright, doze_normal, doze_dim, * doze_dim, doze_bright. * doze_bright. * * The presets are used on devices that allow users to choose from a set of predefined options * in display auto-brightness settings. */ */ private final Map<String, float[]> mBrightnessLevelsLuxMap = new HashMap<>(); private final Map<String, float[]> mBrightnessLevelsLuxMap = new HashMap<>(); Loading Loading @@ -138,19 +151,23 @@ public class DisplayBrightnessMappingConfig { } } /** /** * @return The default auto-brightness brightening ambient lux levels * @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() { public float[] getLuxArray(@AutomaticBrightnessController.AutomaticBrightnessMode int mode) { return mBrightnessLevelsLuxMap.get(DEFAULT_BRIGHTNESS_MAPPING_KEY); return mBrightnessLevelsLuxMap.get( autoBrightnessModeToString(mode) + "_" + DEFAULT_BRIGHTNESS_PRESET_NAME); } } /** /** * @param mode The auto-brightness mode * @param mode The auto-brightness mode * @param setting The brightness setting * @param preset The brightness preset. Presets are used on devices that allow users to choose * @return Auto brightness brightening ambient lux levels for the specified mode and setting * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening ambient lux levels for the specified mode and preset */ */ public float[] getLuxArray(String mode, String setting) { public float[] getLuxArray(String mode, String preset) { return mBrightnessLevelsLuxMap.get(mode + "_" + setting); return mBrightnessLevelsLuxMap.get(mode + "_" + preset); } } /** /** Loading @@ -161,19 +178,24 @@ public class DisplayBrightnessMappingConfig { } } /** /** * @return The default auto-brightness brightening levels * @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() { public float[] getBrightnessArray( return mBrightnessLevelsMap.get(DEFAULT_BRIGHTNESS_MAPPING_KEY); @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { return mBrightnessLevelsMap.get( autoBrightnessModeToString(mode) + "_" + DEFAULT_BRIGHTNESS_PRESET_NAME); } } /** /** * @param mode The auto-brightness mode * @param mode The auto-brightness mode * @param setting The brightness setting * @param preset The brightness preset. Presets are used on devices that allow users to choose * @return Auto brightness brightening ambient lux levels for the specified mode and setting * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening ambient lux levels for the specified mode and preset */ */ public float[] getBrightnessArray(String mode, String setting) { public float[] getBrightnessArray(String mode, String preset) { return mBrightnessLevelsMap.get(mode + "_" + setting); return mBrightnessLevelsMap.get(mode + "_" + preset); } } @Override @Override Loading Loading @@ -205,6 +227,26 @@ public class DisplayBrightnessMappingConfig { + ", mBrightnessLevelsMap= " + brightnessLevelsMapString; + ", mBrightnessLevelsMap= " + brightnessLevelsMapString; } } /** * @param mode The auto-brightness mode * @return The string representing the mode */ public static String autoBrightnessModeToString( @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { switch (mode) { case AUTO_BRIGHTNESS_MODE_DEFAULT -> { return AutoBrightnessModeName._default.getRawName(); } case AUTO_BRIGHTNESS_MODE_IDLE -> { return AutoBrightnessModeName.idle.getRawName(); } case AUTO_BRIGHTNESS_MODE_DOZE -> { return AutoBrightnessModeName.doze.getRawName(); } default -> throw new IllegalArgumentException("Unknown auto-brightness mode: " + mode); } } private float[] brightnessArrayIntToFloat(int[] brightnessInt, private float[] brightnessArrayIntToFloat(int[] brightnessInt, Spline backlightToBrightnessSpline) { Spline backlightToBrightnessSpline) { float[] brightnessFloat = new float[brightnessInt.length]; float[] brightnessFloat = new float[brightnessInt.length]; Loading Loading
services/core/java/com/android/server/display/AutomaticBrightnessController.java +8 −11 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.display; package com.android.server.display; import static com.android.server.display.config.DisplayBrightnessMappingConfig.autoBrightnessModeToString; import android.annotation.IntDef; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; Loading Loading @@ -72,12 +74,14 @@ public class AutomaticBrightnessController { @IntDef(prefix = { "AUTO_BRIGHTNESS_MODE_" }, value = { @IntDef(prefix = { "AUTO_BRIGHTNESS_MODE_" }, value = { AUTO_BRIGHTNESS_MODE_DEFAULT, AUTO_BRIGHTNESS_MODE_DEFAULT, AUTO_BRIGHTNESS_MODE_IDLE, AUTO_BRIGHTNESS_MODE_IDLE, AUTO_BRIGHTNESS_MODE_DOZE }) }) @Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE) public @interface AutomaticBrightnessMode{} public @interface AutomaticBrightnessMode{} public static final int AUTO_BRIGHTNESS_MODE_DEFAULT = 0; public static final int AUTO_BRIGHTNESS_MODE_DEFAULT = 0; public static final int AUTO_BRIGHTNESS_MODE_IDLE = 1; public static final int AUTO_BRIGHTNESS_MODE_IDLE = 1; public static final int AUTO_BRIGHTNESS_MODE_DOZE = 2; // How long the current sensor reading is assumed to be valid beyond the current time. // 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 // This provides a bit of prediction, as well as ensures that the weight for the last sample is Loading Loading @@ -616,12 +620,13 @@ public class AutomaticBrightnessController { pw.println(" mPendingForegroundAppPackageName=" + mPendingForegroundAppPackageName); pw.println(" mPendingForegroundAppPackageName=" + mPendingForegroundAppPackageName); pw.println(" mForegroundAppCategory=" + mForegroundAppCategory); pw.println(" mForegroundAppCategory=" + mForegroundAppCategory); pw.println(" mPendingForegroundAppCategory=" + mPendingForegroundAppCategory); pw.println(" mPendingForegroundAppCategory=" + mPendingForegroundAppCategory); pw.println(" Current mode=" + mCurrentBrightnessMapper.getMode()); pw.println(" Current mode=" + autoBrightnessModeToString(mCurrentBrightnessMapper.getMode())); pw.println(); pw.println(); for (int i = 0; i < mBrightnessMappingStrategyMap.size(); i++) { for (int i = 0; i < mBrightnessMappingStrategyMap.size(); i++) { pw.println(" Mapper for mode " + modeToString(mBrightnessMappingStrategyMap.keyAt(i)) pw.println(" Mapper for mode " + "="); + autoBrightnessModeToString(mBrightnessMappingStrategyMap.keyAt(i)) + "="); mBrightnessMappingStrategyMap.valueAt(i).dump(pw, mBrightnessMappingStrategyMap.valueAt(i).dump(pw, mBrightnessRangeController.getNormalBrightnessMax()); mBrightnessRangeController.getNormalBrightnessMax()); } } Loading Loading @@ -1224,14 +1229,6 @@ 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 { private class ShortTermModel { // When the short term model is invalidated, we don't necessarily reset it (i.e. clear the // 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 // user's adjustment) immediately, but wait for a drastic enough change in the ambient Loading
services/core/java/com/android/server/display/BrightnessMappingStrategy.java +7 −2 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.display; import static android.text.TextUtils.formatSimple; 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_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.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; import android.annotation.Nullable; import android.annotation.Nullable; Loading Loading @@ -98,8 +99,8 @@ public abstract class BrightnessMappingStrategy { switch (mode) { switch (mode) { case AUTO_BRIGHTNESS_MODE_DEFAULT -> { case AUTO_BRIGHTNESS_MODE_DEFAULT -> { brightnessLevelsNits = displayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(); brightnessLevelsNits = displayDeviceConfig.getAutoBrightnessBrighteningLevelsNits(); luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(); luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(mode); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(mode); } } case AUTO_BRIGHTNESS_MODE_IDLE -> { case AUTO_BRIGHTNESS_MODE_IDLE -> { brightnessLevelsNits = getFloatArray(resources.obtainTypedArray( brightnessLevelsNits = getFloatArray(resources.obtainTypedArray( Loading @@ -107,6 +108,10 @@ public abstract class BrightnessMappingStrategy { luxLevels = getLuxLevels(resources.getIntArray( luxLevels = getLuxLevels(resources.getIntArray( com.android.internal.R.array.config_autoBrightnessLevelsIdle)); com.android.internal.R.array.config_autoBrightnessLevelsIdle)); } } case AUTO_BRIGHTNESS_MODE_DOZE -> { luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(mode); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(mode); } } } // Display independent, mode independent values // Display independent, mode independent values Loading
services/core/java/com/android/server/display/DisplayDeviceConfig.java +22 −14 Original line number Original line Diff line number Diff line Loading @@ -1591,25 +1591,29 @@ public class DisplayDeviceConfig { } } /** /** * @return The default auto-brightness brightening ambient lux levels * @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() { public float[] getAutoBrightnessBrighteningLevelsLux( @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { if (mDisplayBrightnessMapping == null) { if (mDisplayBrightnessMapping == null) { return null; return null; } } return mDisplayBrightnessMapping.getLuxArray(); return mDisplayBrightnessMapping.getLuxArray(mode); } } /** /** * @param mode The auto-brightness mode * @param mode The auto-brightness mode * @param setting The brightness setting * @param preset The brightness preset. Presets are used on devices that allow users to choose * @return Auto brightness brightening ambient lux levels for the specified mode and setting * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening ambient lux levels for the specified mode and preset */ */ public float[] getAutoBrightnessBrighteningLevelsLux(String mode, String setting) { public float[] getAutoBrightnessBrighteningLevelsLux(String mode, String preset) { if (mDisplayBrightnessMapping == null) { if (mDisplayBrightnessMapping == null) { return null; return null; } } return mDisplayBrightnessMapping.getLuxArray(mode, setting); return mDisplayBrightnessMapping.getLuxArray(mode, preset); } } /** /** Loading @@ -1623,25 +1627,29 @@ public class DisplayDeviceConfig { } } /** /** * @return The default auto-brightness brightening levels * @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() { public float[] getAutoBrightnessBrighteningLevels( @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { if (mDisplayBrightnessMapping == null) { if (mDisplayBrightnessMapping == null) { return null; return null; } } return mDisplayBrightnessMapping.getBrightnessArray(); return mDisplayBrightnessMapping.getBrightnessArray(mode); } } /** /** * @param mode The auto-brightness mode * @param mode The auto-brightness mode * @param setting The brightness setting * @param preset The brightness preset. Presets are used on devices that allow users to choose * @return Auto brightness brightening backlight levels for the specified mode and setting * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening backlight levels for the specified mode and preset */ */ public float[] getAutoBrightnessBrighteningLevels(String mode, String setting) { public float[] getAutoBrightnessBrighteningLevels(String mode, String preset) { if (mDisplayBrightnessMapping == null) { if (mDisplayBrightnessMapping == null) { return null; return null; } } return mDisplayBrightnessMapping.getBrightnessArray(mode, setting); return mDisplayBrightnessMapping.getBrightnessArray(mode, preset); } } /** /** Loading
services/core/java/com/android/server/display/DisplayPowerController2.java +15 −0 Original line number Original line Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.server.display; 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_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.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; import android.animation.Animator; import android.animation.Animator; Loading Loading @@ -1006,6 +1007,13 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal } } } } BrightnessMappingStrategy dozeModeBrightnessMapper = BrightnessMappingStrategy.create(resources, mDisplayDeviceConfig, AUTO_BRIGHTNESS_MODE_DOZE, mDisplayWhiteBalanceController); if (mFlags.areAutoBrightnessModesEnabled() && dozeModeBrightnessMapper != null) { brightnessMappers.put(AUTO_BRIGHTNESS_MODE_DOZE, dozeModeBrightnessMapper); } float userLux = BrightnessMappingStrategy.INVALID_LUX; float userLux = BrightnessMappingStrategy.INVALID_LUX; float userNits = BrightnessMappingStrategy.INVALID_NITS; float userNits = BrightnessMappingStrategy.INVALID_NITS; if (mAutomaticBrightnessController != null) { if (mAutomaticBrightnessController != null) { Loading Loading @@ -1349,6 +1357,13 @@ final class DisplayPowerController2 implements AutomaticBrightnessController.Cal animateScreenStateChange(state, mDisplayStateController.shouldPerformScreenOffTransition()); animateScreenStateChange(state, mDisplayStateController.shouldPerformScreenOffTransition()); state = mPowerState.getScreenState(); state = mPowerState.getScreenState(); // Switch to doze auto-brightness mode if needed if (mFlags.areAutoBrightnessModesEnabled() && mAutomaticBrightnessController != null && !mAutomaticBrightnessController.isInIdleMode()) { setAutomaticScreenBrightnessMode(Display.isDozeState(state) ? AUTO_BRIGHTNESS_MODE_DOZE : AUTO_BRIGHTNESS_MODE_DEFAULT); } final boolean userSetBrightnessChanged = mDisplayBrightnessController final boolean userSetBrightnessChanged = mDisplayBrightnessController .updateUserSetScreenBrightness(); .updateUserSetScreenBrightness(); Loading
services/core/java/com/android/server/display/config/DisplayBrightnessMappingConfig.java +65 −23 Original line number Original line Diff line number Diff line Loading @@ -16,11 +16,16 @@ package com.android.server.display.config; package com.android.server.display.config; 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 android.content.Context; import android.content.Context; import android.os.PowerManager; import android.os.PowerManager; import android.util.Spline; import android.util.Spline; import com.android.internal.display.BrightnessSynchronizer; import com.android.internal.display.BrightnessSynchronizer; import com.android.server.display.AutomaticBrightnessController; import com.android.server.display.DisplayDeviceConfig; import com.android.server.display.DisplayDeviceConfig; import com.android.server.display.feature.DisplayManagerFlags; import com.android.server.display.feature.DisplayManagerFlags; Loading @@ -33,7 +38,9 @@ import java.util.Map; */ */ public class DisplayBrightnessMappingConfig { public class DisplayBrightnessMappingConfig { private static final String DEFAULT_BRIGHTNESS_MAPPING_KEY = "default_normal"; private static final String DEFAULT_BRIGHTNESS_PRESET_NAME = "normal"; private static final String DEFAULT_BRIGHTNESS_MAPPING_KEY = AutoBrightnessModeName._default.getRawName() + "_" + DEFAULT_BRIGHTNESS_PRESET_NAME; /** /** * Array of desired screen brightness in nits corresponding to the lux values * Array of desired screen brightness in nits corresponding to the lux values Loading @@ -45,19 +52,22 @@ public class DisplayBrightnessMappingConfig { /** /** * Map of arrays of desired screen brightness corresponding to the lux values * Map of arrays of desired screen brightness corresponding to the lux values * in mBrightnessLevelsLuxMap, indexed by the auto-brightness mode and the brightness setting. * in mBrightnessLevelsLuxMap, indexed by the auto-brightness mode and the brightness preset. * The brightness values must be non-negative and non-decreasing. They must be between * The brightness values must be non-negative and non-decreasing. They must be between * {@link PowerManager.BRIGHTNESS_MIN} and {@link PowerManager.BRIGHTNESS_MAX}. * {@link PowerManager.BRIGHTNESS_MIN} and {@link PowerManager.BRIGHTNESS_MAX}. * * * The keys are a concatenation of the auto-brightness mode and the brightness setting * The keys are a concatenation of the auto-brightness mode and the brightness preset separated * separated by an underscore, e.g. default_normal, default_dim, default_bright, doze_normal, * by an underscore, e.g. default_normal, default_dim, default_bright, doze_normal, doze_dim, * doze_dim, doze_bright. * doze_bright. * * The presets are used on devices that allow users to choose from a set of predefined options * in display auto-brightness settings. */ */ private final Map<String, float[]> mBrightnessLevelsMap = new HashMap<>(); private final Map<String, float[]> mBrightnessLevelsMap = new HashMap<>(); /** /** * Map of arrays of light sensor lux values to define our levels for auto-brightness support, * Map of arrays of light sensor lux values to define our levels for auto-brightness support, * indexed by the auto-brightness mode and the brightness setting. * indexed by the auto-brightness mode and the brightness preset. * * * The first lux value in every array is always 0. * The first lux value in every array is always 0. * * Loading @@ -69,9 +79,12 @@ public class DisplayBrightnessMappingConfig { * Spline interpolation is used to determine the auto-brightness values for lux levels between * Spline interpolation is used to determine the auto-brightness values for lux levels between * these control points. * these control points. * * * The keys are a concatenation of the auto-brightness mode and the brightness setting * The keys are a concatenation of the auto-brightness mode and the brightness preset separated * separated by an underscore, e.g. default_normal, default_dim, default_bright, doze_normal, * by an underscore, e.g. default_normal, default_dim, default_bright, doze_normal, doze_dim, * doze_dim, doze_bright. * doze_bright. * * The presets are used on devices that allow users to choose from a set of predefined options * in display auto-brightness settings. */ */ private final Map<String, float[]> mBrightnessLevelsLuxMap = new HashMap<>(); private final Map<String, float[]> mBrightnessLevelsLuxMap = new HashMap<>(); Loading Loading @@ -138,19 +151,23 @@ public class DisplayBrightnessMappingConfig { } } /** /** * @return The default auto-brightness brightening ambient lux levels * @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() { public float[] getLuxArray(@AutomaticBrightnessController.AutomaticBrightnessMode int mode) { return mBrightnessLevelsLuxMap.get(DEFAULT_BRIGHTNESS_MAPPING_KEY); return mBrightnessLevelsLuxMap.get( autoBrightnessModeToString(mode) + "_" + DEFAULT_BRIGHTNESS_PRESET_NAME); } } /** /** * @param mode The auto-brightness mode * @param mode The auto-brightness mode * @param setting The brightness setting * @param preset The brightness preset. Presets are used on devices that allow users to choose * @return Auto brightness brightening ambient lux levels for the specified mode and setting * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening ambient lux levels for the specified mode and preset */ */ public float[] getLuxArray(String mode, String setting) { public float[] getLuxArray(String mode, String preset) { return mBrightnessLevelsLuxMap.get(mode + "_" + setting); return mBrightnessLevelsLuxMap.get(mode + "_" + preset); } } /** /** Loading @@ -161,19 +178,24 @@ public class DisplayBrightnessMappingConfig { } } /** /** * @return The default auto-brightness brightening levels * @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() { public float[] getBrightnessArray( return mBrightnessLevelsMap.get(DEFAULT_BRIGHTNESS_MAPPING_KEY); @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { return mBrightnessLevelsMap.get( autoBrightnessModeToString(mode) + "_" + DEFAULT_BRIGHTNESS_PRESET_NAME); } } /** /** * @param mode The auto-brightness mode * @param mode The auto-brightness mode * @param setting The brightness setting * @param preset The brightness preset. Presets are used on devices that allow users to choose * @return Auto brightness brightening ambient lux levels for the specified mode and setting * from a set of predefined options in display auto-brightness settings. * @return Auto brightness brightening ambient lux levels for the specified mode and preset */ */ public float[] getBrightnessArray(String mode, String setting) { public float[] getBrightnessArray(String mode, String preset) { return mBrightnessLevelsMap.get(mode + "_" + setting); return mBrightnessLevelsMap.get(mode + "_" + preset); } } @Override @Override Loading Loading @@ -205,6 +227,26 @@ public class DisplayBrightnessMappingConfig { + ", mBrightnessLevelsMap= " + brightnessLevelsMapString; + ", mBrightnessLevelsMap= " + brightnessLevelsMapString; } } /** * @param mode The auto-brightness mode * @return The string representing the mode */ public static String autoBrightnessModeToString( @AutomaticBrightnessController.AutomaticBrightnessMode int mode) { switch (mode) { case AUTO_BRIGHTNESS_MODE_DEFAULT -> { return AutoBrightnessModeName._default.getRawName(); } case AUTO_BRIGHTNESS_MODE_IDLE -> { return AutoBrightnessModeName.idle.getRawName(); } case AUTO_BRIGHTNESS_MODE_DOZE -> { return AutoBrightnessModeName.doze.getRawName(); } default -> throw new IllegalArgumentException("Unknown auto-brightness mode: " + mode); } } private float[] brightnessArrayIntToFloat(int[] brightnessInt, private float[] brightnessArrayIntToFloat(int[] brightnessInt, Spline backlightToBrightnessSpline) { Spline backlightToBrightnessSpline) { float[] brightnessFloat = new float[brightnessInt.length]; float[] brightnessFloat = new float[brightnessInt.length]; Loading