diff options
15 files changed, 304 insertions, 39 deletions
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index 0321e1dfee78..97f6899ff141 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -1669,6 +1669,46 @@ public final class DisplayManager { } /** + * Gets the mapping between the doze brightness sensor values and brightness values. The doze + * brightness sensor is a light sensor used to determine the brightness while the device is + * dozing. Light sensor values are typically integers in the rage of 0-4. The returned values + * are between {@link PowerManager#BRIGHTNESS_MIN} and {@link PowerManager#BRIGHTNESS_MAX}, or + * -1 meaning that the current brightness should be kept. + * <p> + * Requires the {@link android.Manifest.permission#CONTROL_DISPLAY_BRIGHTNESS} + * permission. + * </p> + * + * @param displayId The ID of the display + * + * @hide + */ + @RequiresPermission(Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS) + @Nullable + public float[] getDozeBrightnessSensorValueToBrightness(int displayId) { + return mGlobal.getDozeBrightnessSensorValueToBrightness(displayId); + } + + /** + * Gets the default doze brightness. + * The returned values are between {@link PowerManager#BRIGHTNESS_MIN} and + * {@link PowerManager#BRIGHTNESS_MAX}. + * <p> + * Requires the {@link android.Manifest.permission#CONTROL_DISPLAY_BRIGHTNESS} + * permission. + * </p> + * + * @param displayId The ID of the display + * + * @hide + */ + @RequiresPermission(Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS) + @FloatRange(from = 0f, to = 1f) + public float getDefaultDozeBrightness(int displayId) { + return mGlobal.getDefaultDozeBrightness(displayId); + } + + /** * Listens for changes in available display devices. */ public interface DisplayListener { diff --git a/core/java/android/hardware/display/DisplayManagerGlobal.java b/core/java/android/hardware/display/DisplayManagerGlobal.java index e9cd37aedec9..cae33d05b6ed 100644 --- a/core/java/android/hardware/display/DisplayManagerGlobal.java +++ b/core/java/android/hardware/display/DisplayManagerGlobal.java @@ -21,6 +21,7 @@ import static android.hardware.display.DisplayManager.EventsMask; import static android.view.Display.HdrCapabilities.HdrType; import android.Manifest; +import android.annotation.FloatRange; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -1226,6 +1227,32 @@ public final class DisplayManagerGlobal { } } + /** + * @see DisplayManager#getDozeBrightnessSensorValueToBrightness + */ + @RequiresPermission(Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS) + @Nullable + public float[] getDozeBrightnessSensorValueToBrightness(int displayId) { + try { + return mDm.getDozeBrightnessSensorValueToBrightness(displayId); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + + /** + * @see DisplayManager#getDefaultDozeBrightness + */ + @RequiresPermission(Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS) + @FloatRange(from = 0f, to = 1f) + public float getDefaultDozeBrightness(int displayId) { + try { + return mDm.getDefaultDozeBrightness(displayId); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + private final class DisplayManagerCallback extends IDisplayManagerCallback.Stub { @Override public void onDisplayEvent(int displayId, @DisplayEvent int event) { diff --git a/core/java/android/hardware/display/IDisplayManager.aidl b/core/java/android/hardware/display/IDisplayManager.aidl index 77277ee7bb08..f3c21e9f7a43 100644 --- a/core/java/android/hardware/display/IDisplayManager.aidl +++ b/core/java/android/hardware/display/IDisplayManager.aidl @@ -246,4 +246,12 @@ interface IDisplayManager { // Restricts display modes to specified modeIds. @EnforcePermission("RESTRICT_DISPLAY_MODES") void requestDisplayModes(in IBinder token, int displayId, in @nullable int[] modeIds); + + // Get the mapping between the doze brightness sensor values and brightness values + @EnforcePermission("CONTROL_DISPLAY_BRIGHTNESS") + float[] getDozeBrightnessSensorValueToBrightness(int displayId); + + // Get the default doze brightness + @EnforcePermission("CONTROL_DISPLAY_BRIGHTNESS") + float getDefaultDozeBrightness(int displayId); } diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 406a1a6795ab..026013c34e30 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -564,8 +564,7 @@ public final class PowerManager { BRIGHTNESS_CONSTRAINT_TYPE_MINIMUM, BRIGHTNESS_CONSTRAINT_TYPE_MAXIMUM, BRIGHTNESS_CONSTRAINT_TYPE_DEFAULT, - BRIGHTNESS_CONSTRAINT_TYPE_DIM, - BRIGHTNESS_CONSTRAINT_TYPE_DOZE + BRIGHTNESS_CONSTRAINT_TYPE_DIM }) @Retention(RetentionPolicy.SOURCE) public @interface BrightnessConstraint{} @@ -594,12 +593,6 @@ public final class PowerManager { public static final int BRIGHTNESS_CONSTRAINT_TYPE_DIM = 3; /** - * Brightness constraint type: minimum allowed value. - * @hide - */ - public static final int BRIGHTNESS_CONSTRAINT_TYPE_DOZE = 4; - - /** * @hide */ @IntDef(prefix = { "WAKE_REASON_" }, value = { diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 7f7e6347b2f7..30f23bfc9753 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -287,7 +287,8 @@ <integer name="doze_small_icon_alpha">222</integer><!-- 87% of 0xff --> <!-- Doze: Table that translates sensor values from the doze_brightness_sensor_type sensor - to brightness values; -1 means keeping the current brightness. --> + to brightness values in the integer scale [1, 255]; -1 means keeping the current + brightness. --> <integer-array name="config_doze_brightness_sensor_to_brightness"> <item>-1</item> <!-- 0: OFF --> <item>2</item> <!-- 1: NIGHT --> diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java index f5231ae0abe6..7a055d1d7e5c 100644 --- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java +++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java @@ -619,6 +619,15 @@ import javax.xml.datatype.DatatypeConfigurationException; * </idleScreenRefreshRateTimeout> * <supportsVrr>true</supportsVrr> * + * <dozeBrightnessSensorValueToBrightness> + * <item>-1</item> <!-- 0: OFF --> + * <item>0.003937008</item> <!-- 1: NIGHT --> + * <item>0.015748031</item> <!-- 2: LOW --> + * <item>0.102362205</item> <!-- 3: HIGH --> + * <item>0.106299213</item> <!-- 4: SUN --> + * </dozeBrightnessSensorValueToBrightness> + * <defaultDozeBrightness>0.235</defaultDozeBrightness> + * * </displayConfiguration> * } * </pre> @@ -638,6 +647,10 @@ public class DisplayDeviceConfig { public static final int DEFAULT_LOW_REFRESH_RATE = 60; + // Float.NaN (used as invalid for brightness) cannot be stored in config.xml + // so -2 is used instead + public static final float INVALID_BRIGHTNESS_IN_CONFIG = -2f; + @VisibleForTesting static final float BRIGHTNESS_DEFAULT = 0.5f; private static final String ETC_DIR = "etc"; @@ -656,10 +669,6 @@ public class DisplayDeviceConfig { private static final int INTERPOLATION_DEFAULT = 0; private static final int INTERPOLATION_LINEAR = 1; - // Float.NaN (used as invalid for brightness) cannot be stored in config.xml - // so -2 is used instead - private static final float INVALID_BRIGHTNESS_IN_CONFIG = -2f; - // Length of the ambient light horizon used to calculate the long term estimate of ambient // light. private static final int AMBIENT_LIGHT_LONG_HORIZON_MILLIS = 10000; @@ -670,6 +679,11 @@ public class DisplayDeviceConfig { // Invalid value of AutoBrightness brightening and darkening light debounce private static final int INVALID_AUTO_BRIGHTNESS_LIGHT_DEBOUNCE = -1; + @VisibleForTesting + static final float HDR_PERCENT_OF_SCREEN_REQUIRED_DEFAULT = 0.5f; + + private static final int KEEP_CURRENT_BRIGHTNESS = -1; + private final Context mContext; // The details of the ambient light sensor associated with this display. @@ -877,6 +891,10 @@ public class DisplayDeviceConfig { private boolean mVrrSupportEnabled; + @Nullable + private float[] mDozeBrightnessSensorValueToBrightness; + private float mDefaultDozeBrightness; + private final DisplayManagerFlags mFlags; @VisibleForTesting @@ -1592,6 +1610,24 @@ public class DisplayDeviceConfig { return mVrrSupportEnabled; } + /** + * While the device is dozing, a designated light sensor is used to determine the brightness. + * @return The mapping between doze brightness sensor values and brightness values. The value + * -1 means that the current brightness should be kept. + */ + @Nullable + public float[] getDozeBrightnessSensorValueToBrightness() { + return mDozeBrightnessSensorValueToBrightness; + } + + /** + * @return The default doze brightness to use while no other doze brightness is available. Can + * be {@link PowerManager#BRIGHTNESS_INVALID_FLOAT} if undefined. + */ + public float getDefaultDozeBrightness() { + return mDefaultDozeBrightness; + } + @Override public String toString() { return "DisplayDeviceConfig{" @@ -1689,6 +1725,9 @@ public class DisplayDeviceConfig { ? mEvenDimmerBrightnessData.toString() : "null") + "\n" + "mVrrSupported= " + mVrrSupportEnabled + "\n" + + "mDozeBrightnessSensorValueToBrightness= " + + Arrays.toString(mDozeBrightnessSensorValueToBrightness) + "\n" + + "mDefaultDozeBrightness= " + mDefaultDozeBrightness + "\n" + "}"; } @@ -1783,6 +1822,7 @@ public class DisplayDeviceConfig { loadBrightnessCapForWearBedtimeMode(config); loadIdleScreenRefreshRateTimeoutConfigs(config); mVrrSupportEnabled = config.getSupportsVrr(); + loadDozeBrightness(config); } else { Slog.w(TAG, "DisplayDeviceConfig file is null"); } @@ -1811,6 +1851,7 @@ public class DisplayDeviceConfig { loadRefreshRateSetting(null); loadBrightnessCapForWearBedtimeModeFromConfigXml(); loadIdleScreenRefreshRateTimeoutConfigs(null); + loadDozeBrightness(null); mLoadedFrom = "<config.xml>"; } @@ -2745,6 +2786,37 @@ public class DisplayDeviceConfig { } } + private void loadDozeBrightness(DisplayConfiguration config) { + if (mFlags.isDozeBrightnessFloatEnabled() && config != null + && config.getDozeBrightnessSensorValueToBrightness() != null) { + List<BigDecimal> values = config.getDozeBrightnessSensorValueToBrightness().getItem(); + mDozeBrightnessSensorValueToBrightness = new float[values.size()]; + for (int i = 0; i < values.size(); i++) { + float backlight = values.get(i).floatValue(); + if (backlight != KEEP_CURRENT_BRIGHTNESS) { + mDozeBrightnessSensorValueToBrightness[i] = + getBrightnessFromBacklight(backlight); + } else { + mDozeBrightnessSensorValueToBrightness[i] = KEEP_CURRENT_BRIGHTNESS; + } + } + } + + if (mFlags.isDozeBrightnessFloatEnabled() && config != null + && config.getDefaultDozeBrightness() != null) { + float backlight = config.getDefaultDozeBrightness().floatValue(); + mDefaultDozeBrightness = getBrightnessFromBacklight(backlight); + } else { + mDefaultDozeBrightness = mContext.getResources().getFloat( + com.android.internal.R.dimen.config_screenBrightnessDozeFloat); + if (mDefaultDozeBrightness == INVALID_BRIGHTNESS_IN_CONFIG) { + mDefaultDozeBrightness = BrightnessSynchronizer.brightnessIntToFloat( + mContext.getResources().getInteger( + com.android.internal.R.integer.config_screenBrightnessDoze)); + } + } + } + private void validateIdleScreenRefreshRateTimeoutConfig( IdleScreenRefreshRateTimeout idleScreenRefreshRateTimeoutConfig) { IdleScreenRefreshRateTimeoutLuxThresholds idleScreenRefreshRateTimeoutLuxThresholds = diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 2f3584cf7cef..b3a6c1c1e20a 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -4726,6 +4726,32 @@ public final class DisplayManagerService extends SystemService { DisplayManagerService.this.mDisplayModeDirector.requestDisplayModes( token, displayId, modeIds); } + + @EnforcePermission(android.Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS) + @Override // Binder call + public float[] getDozeBrightnessSensorValueToBrightness(int displayId) { + getDozeBrightnessSensorValueToBrightness_enforcePermission(); + DisplayDeviceConfig ddc = + mDisplayDeviceConfigProvider.getDisplayDeviceConfig(displayId); + if (ddc == null) { + throw new IllegalArgumentException( + "Display ID does not have a config: " + displayId); + } + return ddc.getDozeBrightnessSensorValueToBrightness(); + } + + @EnforcePermission(android.Manifest.permission.CONTROL_DISPLAY_BRIGHTNESS) + @Override // Binder call + public float getDefaultDozeBrightness(int displayId) { + getDefaultDozeBrightness_enforcePermission(); + DisplayDeviceConfig ddc = + mDisplayDeviceConfigProvider.getDisplayDeviceConfig(displayId); + if (ddc == null) { + throw new IllegalArgumentException( + "Display ID does not have a config for doze-default: " + displayId); + } + return ddc.getDefaultDozeBrightness(); + } } private static boolean isValidBrightness(float brightness) { diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 58309c2c751a..5c1e783c0f52 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -272,7 +272,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private final SettingsObserver mSettingsObserver; // The doze screen brightness. - private final float mScreenBrightnessDozeConfig; + private float mScreenBrightnessDozeConfig; // True if auto-brightness should be used. private boolean mUseSoftwareAutoBrightnessConfig; @@ -550,7 +550,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // DOZE AND DIM SETTINGS mScreenBrightnessDozeConfig = BrightnessUtils.clampAbsoluteBrightness( - pm.getBrightnessConstraint(PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DOZE)); + mDisplayDeviceConfig.getDefaultDozeBrightness()); loadBrightnessRampRates(); mSkipScreenOnBrightnessRamp = resources.getBoolean( R.bool.config_skipScreenOnBrightnessRamp); @@ -932,6 +932,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call HighBrightnessModeMetadata hbmMetadata) { // All properties that depend on the associated DisplayDevice and the DDC must be // updated here. + mScreenBrightnessDozeConfig = BrightnessUtils.clampAbsoluteBrightness( + mDisplayDeviceConfig.getDefaultDozeBrightness()); loadBrightnessRampRates(); loadNitsRange(mContext.getResources()); setUpAutoBrightness(mContext, mHandler); diff --git a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java index 3ce7d2a676b0..e1934b0df3f1 100644 --- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java @@ -154,6 +154,10 @@ public class DisplayManagerFlags { Flags::useFusionProxSensor ); + private final FlagState mDozeBrightnessFloat = new FlagState( + Flags.FLAG_DOZE_BRIGHTNESS_FLOAT, + Flags::dozeBrightnessFloat); + private final FlagState mOffloadControlsDozeAutoBrightness = new FlagState( Flags.FLAG_OFFLOAD_CONTROLS_DOZE_AUTO_BRIGHTNESS, Flags::offloadControlsDozeAutoBrightness @@ -347,6 +351,10 @@ public class DisplayManagerFlags { return mUseFusionProxSensor.getName(); } + public boolean isDozeBrightnessFloatEnabled() { + return mDozeBrightnessFloat.isEnabled(); + } + /** * @return Whether DisplayOffload should control auto-brightness in doze */ @@ -415,6 +423,7 @@ public class DisplayManagerFlags { pw.println(" " + mRefactorDisplayPowerController); pw.println(" " + mResolutionBackupRestore); pw.println(" " + mUseFusionProxSensor); + pw.println(" " + mDozeBrightnessFloat); pw.println(" " + mOffloadControlsDozeAutoBrightness); pw.println(" " + mPeakRefreshRatePhysicalLimit); pw.println(" " + mIgnoreAppPreferredRefreshRate); diff --git a/services/core/java/com/android/server/display/feature/display_flags.aconfig b/services/core/java/com/android/server/display/feature/display_flags.aconfig index fd3af2383e1b..ac5f97fc3661 100644 --- a/services/core/java/com/android/server/display/feature/display_flags.aconfig +++ b/services/core/java/com/android/server/display/feature/display_flags.aconfig @@ -246,6 +246,14 @@ flag { } flag { + name: "doze_brightness_float" + namespace: "display_manager" + description: "Define doze brightness in the float scale [0, 1]." + bug: "343796384" + is_fixed_read_only: true +} + +flag { name: "offload_controls_doze_auto_brightness" namespace: "display_manager" description: "Allows the registered DisplayOffloader to control if auto-brightness is used in doze" diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index ce0120c245d6..6fe1ccde7a4a 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -33,6 +33,7 @@ import static android.os.PowerManagerInternal.wakefulnessToString; import static com.android.internal.util.LatencyTracker.ACTION_TURN_ON_SCREEN; import static com.android.server.deviceidle.Flags.disableWakelocksInLightIdle; +import static com.android.server.display.DisplayDeviceConfig.INVALID_BRIGHTNESS_IN_CONFIG; import android.annotation.IntDef; import android.annotation.NonNull; @@ -239,9 +240,6 @@ public final class PowerManagerService extends SystemService // This should perhaps be a setting. private static final int SCREEN_BRIGHTNESS_BOOST_TIMEOUT = 5 * 1000; - // Float.NaN cannot be stored in config.xml so -2 is used instead - private static final float INVALID_BRIGHTNESS_IN_CONFIG = -2f; - // How long a partial wake lock must be held until we consider it a long wake lock. static final long MIN_LONG_WAKE_CHECK_INTERVAL = 60*1000; @@ -619,7 +617,6 @@ public final class PowerManagerService extends SystemService public final float mScreenBrightnessMinimum; public final float mScreenBrightnessMaximum; public final float mScreenBrightnessDefault; - public final float mScreenBrightnessDoze; public final float mScreenBrightnessDim; // Value we store for tracking face down behavior. @@ -1219,8 +1216,6 @@ public final class PowerManagerService extends SystemService .config_screenBrightnessSettingMaximumFloat); final float def = mContext.getResources().getFloat(com.android.internal.R.dimen .config_screenBrightnessSettingDefaultFloat); - final float doze = mContext.getResources().getFloat(com.android.internal.R.dimen - .config_screenBrightnessDozeFloat); final float dim = mContext.getResources().getFloat(com.android.internal.R.dimen .config_screenBrightnessDimFloat); @@ -1240,13 +1235,6 @@ public final class PowerManagerService extends SystemService mScreenBrightnessMaximum = max; mScreenBrightnessDefault = def; } - if (doze == INVALID_BRIGHTNESS_IN_CONFIG) { - mScreenBrightnessDoze = BrightnessSynchronizer.brightnessIntToFloat( - mContext.getResources().getInteger(com.android.internal.R.integer - .config_screenBrightnessDoze)); - } else { - mScreenBrightnessDoze = doze; - } if (dim == INVALID_BRIGHTNESS_IN_CONFIG) { mScreenBrightnessDim = BrightnessSynchronizer.brightnessIntToFloat( mContext.getResources().getInteger(com.android.internal.R.integer @@ -6090,8 +6078,6 @@ public final class PowerManagerService extends SystemService return mScreenBrightnessDefault; case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DIM: return mScreenBrightnessDim; - case PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DOZE: - return mScreenBrightnessDoze; default: return PowerManager.BRIGHTNESS_INVALID_FLOAT; } diff --git a/services/core/xsd/display-device-config/display-device-config.xsd b/services/core/xsd/display-device-config/display-device-config.xsd index ec7406ae6219..4231149336ec 100644 --- a/services/core/xsd/display-device-config/display-device-config.xsd +++ b/services/core/xsd/display-device-config/display-device-config.xsd @@ -179,6 +179,19 @@ <xs:element name="supportsVrr" type="xs:boolean" minOccurs="0"> <xs:annotation name="final"/> </xs:element> + <!-- Table that translates doze brightness sensor values to brightness values in + the float scale [0, 1]; -1 means the current brightness should be kept. + The following formula should be used for conversion between nits and the float + scale: float = (nits - minNits) / (maxNits - minNits). minNits and maxNits are + defined in screenBrightnessMap. --> + <xs:element type="float-array" name="dozeBrightnessSensorValueToBrightness"> + <xs:annotation name="final"/> + </xs:element> + <!-- The default screen brightness in the scale [0, 1] to use while the device is + dozing. --> + <xs:element type="nonNegativeDecimal" name="defaultDozeBrightness"> + <xs:annotation name="final"/> + </xs:element> </xs:sequence> </xs:complexType> </xs:element> @@ -859,6 +872,12 @@ </xs:sequence> </xs:complexType> + <xs:complexType name="float-array"> + <xs:sequence> + <xs:element name="item" type="nonNegativeDecimal" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + <xs:complexType name="usiVersion"> <xs:element name="majorVersion" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1"> diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt index 68d74cf723e1..cec2787ca51f 100644 --- a/services/core/xsd/display-device-config/schema/current.txt +++ b/services/core/xsd/display-device-config/schema/current.txt @@ -125,9 +125,11 @@ package com.android.server.display.config { method public final java.math.BigInteger getAmbientLightHorizonLong(); method public final java.math.BigInteger getAmbientLightHorizonShort(); method public com.android.server.display.config.AutoBrightness getAutoBrightness(); + method public final java.math.BigDecimal getDefaultDozeBrightness(); method @Nullable public final com.android.server.display.config.DensityMapping getDensityMapping(); method @NonNull public final com.android.server.display.config.Thresholds getDisplayBrightnessChangeThresholds(); method public final com.android.server.display.config.Thresholds getDisplayBrightnessChangeThresholdsIdle(); + method public final com.android.server.display.config.FloatArray getDozeBrightnessSensorValueToBrightness(); method public final com.android.server.display.config.EvenDimmerMode getEvenDimmer(); method @Nullable public final com.android.server.display.config.HdrBrightnessConfig getHdrBrightnessConfig(); method public com.android.server.display.config.HighBrightnessMode getHighBrightnessMode(); @@ -163,9 +165,11 @@ package com.android.server.display.config { method public final void setAmbientLightHorizonLong(java.math.BigInteger); method public final void setAmbientLightHorizonShort(java.math.BigInteger); method public void setAutoBrightness(com.android.server.display.config.AutoBrightness); + method public final void setDefaultDozeBrightness(java.math.BigDecimal); method public final void setDensityMapping(@Nullable com.android.server.display.config.DensityMapping); method public final void setDisplayBrightnessChangeThresholds(@NonNull com.android.server.display.config.Thresholds); method public final void setDisplayBrightnessChangeThresholdsIdle(com.android.server.display.config.Thresholds); + method public final void setDozeBrightnessSensorValueToBrightness(com.android.server.display.config.FloatArray); method public final void setEvenDimmer(com.android.server.display.config.EvenDimmerMode); method public final void setHdrBrightnessConfig(@Nullable com.android.server.display.config.HdrBrightnessConfig); method public void setHighBrightnessMode(com.android.server.display.config.HighBrightnessMode); @@ -214,6 +218,11 @@ package com.android.server.display.config { method public void setTransitionPoint(java.math.BigDecimal); } + public class FloatArray { + ctor public FloatArray(); + method public java.util.List<java.math.BigDecimal> getItem(); + } + public class HbmTiming { ctor public HbmTiming(); method @NonNull public final java.math.BigInteger getTimeMaxSecs_all(); diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java index 343792336247..d4506831d9c2 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java @@ -965,6 +965,51 @@ public final class DisplayDeviceConfigTest { assertThat(supportedModeData.vsyncRate).isEqualTo(240); } + @Test + public void testDozeBrightness_Ddc() throws IOException { + when(mFlags.isDozeBrightnessFloatEnabled()).thenReturn(true); + setupDisplayDeviceConfigFromDisplayConfigFile(); + + assertArrayEquals(new float[]{ -1, 0.1f, 0.2f, 0.3f, 0.4f }, + mDisplayDeviceConfig.getDozeBrightnessSensorValueToBrightness(), SMALL_DELTA); + assertEquals(0.25f, mDisplayDeviceConfig.getDefaultDozeBrightness(), SMALL_DELTA); + } + + @Test + public void testDefaultDozeBrightness_FallBackToConfigXmlFloat() throws IOException { + setupDisplayDeviceConfigFromConfigResourceFile(); + when(mFlags.isDozeBrightnessFloatEnabled()).thenReturn(true); + when(mResources.getFloat(com.android.internal.R.dimen.config_screenBrightnessDozeFloat)) + .thenReturn(0.31f); + when(mResources.getInteger(com.android.internal.R.integer.config_screenBrightnessDoze)) + .thenReturn(90); + + // Empty display config file + setupDisplayDeviceConfigFromDisplayConfigFile( + "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" + + "<displayConfiguration />\n"); + + assertEquals(0.31f, mDisplayDeviceConfig.getDefaultDozeBrightness(), ZERO_DELTA); + } + + @Test + public void testDefaultDozeBrightness_FallBackToConfigXmlInt() throws IOException { + setupDisplayDeviceConfigFromConfigResourceFile(); + when(mFlags.isDozeBrightnessFloatEnabled()).thenReturn(true); + when(mResources.getFloat(com.android.internal.R.dimen.config_screenBrightnessDozeFloat)) + .thenReturn(DisplayDeviceConfig.INVALID_BRIGHTNESS_IN_CONFIG); + when(mResources.getInteger(com.android.internal.R.integer.config_screenBrightnessDoze)) + .thenReturn(90); + + // Empty display config file + setupDisplayDeviceConfigFromDisplayConfigFile( + "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" + + "<displayConfiguration />\n"); + + assertEquals(brightnessIntToFloat(90), + mDisplayDeviceConfig.getDefaultDozeBrightness(), ZERO_DELTA); + } + private String getValidLuxThrottling() { return "<luxThrottling>\n" + " <brightnessLimitMap>\n" @@ -1708,6 +1753,16 @@ public final class DisplayDeviceConfigTest { + "</point>" + "</luxThresholds>" + "</idleScreenRefreshRateTimeout>" + + "<dozeBrightnessSensorValueToBrightness>\n" + + "<item>-1</item>\n" + + "<item>0.1</item>\n" + + "<item>0.2</item>\n" + + "<item>0.3</item>\n" + + "<item>0.4</item>\n" + + "</dozeBrightnessSensorValueToBrightness>\n" + + "<defaultDozeBrightness>" + + "0.25" + + "</defaultDozeBrightness>\n" + "</displayConfiguration>\n"; } 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 5c291569b8d8..624c8971d36f 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -117,6 +117,7 @@ public final class DisplayPowerControllerTest { private static final String SECOND_FOLLOWER_UNIQUE_DISPLAY_ID = "unique_id_789"; private static final float PROX_SENSOR_MAX_RANGE = 5; private static final float DOZE_SCALE_FACTOR = 0.34f; + private static final float DEFAULT_DOZE_BRIGHTNESS = 0.121f; private static final float BRIGHTNESS_RAMP_RATE_MINIMUM = 0.0f; private static final float BRIGHTNESS_RAMP_RATE_FAST_DECREASE = 0.3f; @@ -2051,9 +2052,6 @@ public final class DisplayPowerControllerTest { @Test public void testDefaultDozeBrightness() { - float brightness = 0.121f; - when(mPowerManagerMock.getBrightnessConstraint( - PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DOZE)).thenReturn(brightness); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing, false); mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID); @@ -2069,15 +2067,25 @@ public final class DisplayPowerControllerTest { mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); advanceTime(1); // Run updatePowerState - verify(mHolder.animator).animateTo(eq(brightness), /* linearSecondTarget= */ anyFloat(), - eq(BRIGHTNESS_RAMP_RATE_FAST_INCREASE), eq(false)); + verify(mHolder.animator).animateTo(eq(DEFAULT_DOZE_BRIGHTNESS), + /* linearSecondTarget= */ anyFloat(), eq(BRIGHTNESS_RAMP_RATE_FAST_INCREASE), + eq(false)); + + // The display device changes and the default doze brightness changes + setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class), + mHolder.config, /* isEnabled= */ true); + when(mHolder.config.getDefaultDozeBrightness()).thenReturn(DEFAULT_DOZE_BRIGHTNESS / 2); + mHolder.dpc.onDisplayChanged(mHolder.hbmMetadata, Layout.NO_LEAD_DISPLAY); + + advanceTime(1); // Run updatePowerState + + verify(mHolder.animator).animateTo(eq(DEFAULT_DOZE_BRIGHTNESS / 2), + /* linearSecondTarget= */ anyFloat(), eq(BRIGHTNESS_RAMP_RATE_FAST_INCREASE), + eq(false)); } @Test public void testDefaultDozeBrightness_ShouldNotBeUsedIfAutoBrightnessAllowedInDoze() { - float brightness = 0.121f; - when(mPowerManagerMock.getBrightnessConstraint( - PowerManager.BRIGHTNESS_CONSTRAINT_TYPE_DOZE)).thenReturn(brightness); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing, true); mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID); @@ -2093,7 +2101,7 @@ public final class DisplayPowerControllerTest { mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); advanceTime(1); // Run updatePowerState - verify(mHolder.animator, never()).animateTo(eq(brightness), + verify(mHolder.animator, never()).animateTo(eq(DEFAULT_DOZE_BRIGHTNESS), /* linearSecondTarget= */ anyFloat(), /* rate= */ anyFloat(), /* ignoreAnimationLimits= */ anyBoolean()); } @@ -2151,6 +2159,8 @@ public final class DisplayPowerControllerTest { new SensorData(Sensor.STRING_TYPE_LIGHT, null)); when(displayDeviceConfigMock.getScreenOffBrightnessSensorValueToLux()) .thenReturn(new int[0]); + when(displayDeviceConfigMock.getDefaultDozeBrightness()) + .thenReturn(DEFAULT_DOZE_BRIGHTNESS); when(displayDeviceConfigMock.getBrightnessRampFastDecrease()) .thenReturn(BRIGHTNESS_RAMP_RATE_FAST_DECREASE); |