diff options
8 files changed, 104 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java index d1374a5ab9dc..bf30b2ec803e 100644 --- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java +++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java @@ -384,6 +384,10 @@ import javax.xml.datatype.DatatypeConfigurationException; * </point> * </supportedModes> * </proxSensor> + * <tempSensor> + * <type>DISPLAY</type> + * <name>VIRTUAL-SKIN-DISPLAY</name> + * </tempSensor> * * <ambientLightHorizonLong>10001</ambientLightHorizonLong> * <ambientLightHorizonShort>2001</ambientLightHorizonShort> @@ -625,6 +629,12 @@ public class DisplayDeviceConfig { @Nullable private SensorData mProximitySensor; + // The details of the temperature sensor associated with this display. + // Throttling will be based on thermal status of this sensor. + // For empty values default back to sensor of TYPE_SKIN. + @NonNull + private SensorData mTempSensor; + private final List<RefreshRateLimitation> mRefreshRateLimitations = new ArrayList<>(2 /*initialCapacity*/); @@ -1489,6 +1499,13 @@ public class DisplayDeviceConfig { return mProximitySensor; } + /** + * @return temperature sensor data associated with the display. + */ + public SensorData getTempSensor() { + return mTempSensor; + } + boolean isAutoBrightnessAvailable() { return mAutoBrightnessAvailable; } @@ -1871,6 +1888,7 @@ public class DisplayDeviceConfig { + "mAmbientLightSensor=" + mAmbientLightSensor + ", mScreenOffBrightnessSensor=" + mScreenOffBrightnessSensor + ", mProximitySensor=" + mProximitySensor + + ", mTempSensor=" + mTempSensor + ", mRefreshRateLimitations= " + Arrays.toString(mRefreshRateLimitations.toArray()) + ", mDensityMapping= " + mDensityMapping + ", mAutoBrightnessBrighteningLightDebounce= " @@ -1972,6 +1990,7 @@ public class DisplayDeviceConfig { mContext.getResources()); mScreenOffBrightnessSensor = SensorData.loadScreenOffBrightnessSensorConfig(config); mProximitySensor = SensorData.loadProxSensorConfig(config); + mTempSensor = SensorData.loadTempSensorConfig(mFlags, config); loadAmbientHorizonFromDdc(config); loadBrightnessChangeThresholds(config); loadAutoBrightnessConfigValues(config); @@ -1999,6 +2018,7 @@ public class DisplayDeviceConfig { loadBrightnessRampsFromConfigXml(); mAmbientLightSensor = SensorData.loadAmbientLightSensorConfig(mContext.getResources()); mProximitySensor = SensorData.loadSensorUnspecifiedConfig(); + mTempSensor = SensorData.loadTempSensorUnspecifiedConfig(); loadBrightnessChangeThresholdsFromXml(); loadAutoBrightnessConfigsFromConfigXml(); loadAutoBrightnessAvailableFromConfigXml(); @@ -2026,6 +2046,7 @@ public class DisplayDeviceConfig { setSimpleMappingStrategyValues(); mAmbientLightSensor = SensorData.loadAmbientLightSensorConfig(mContext.getResources()); mProximitySensor = SensorData.loadSensorUnspecifiedConfig(); + mTempSensor = SensorData.loadTempSensorUnspecifiedConfig(); loadAutoBrightnessAvailableFromConfigXml(); } diff --git a/services/core/java/com/android/server/display/config/SensorData.java b/services/core/java/com/android/server/display/config/SensorData.java index 3bb35bf7c49f..8e716f8380b6 100644 --- a/services/core/java/com/android/server/display/config/SensorData.java +++ b/services/core/java/com/android/server/display/config/SensorData.java @@ -22,6 +22,7 @@ import android.content.res.Resources; import android.text.TextUtils; import com.android.internal.annotations.VisibleForTesting; +import com.android.server.display.feature.DisplayManagerFlags; import java.util.ArrayList; import java.util.Collections; @@ -32,6 +33,9 @@ import java.util.List; */ public class SensorData { + public static final String TEMPERATURE_TYPE_DISPLAY = "DISPLAY"; + public static final String TEMPERATURE_TYPE_SKIN = "SKIN"; + @Nullable public final String type; @Nullable @@ -143,6 +147,32 @@ public class SensorData { } /** + * Loads temperature sensor data for no config case. (Type: SKIN, Name: null) + */ + public static SensorData loadTempSensorUnspecifiedConfig() { + return new SensorData(TEMPERATURE_TYPE_SKIN, null); + } + + /** + * Loads temperature sensor data from given display config. + * If empty or null config given default to (Type: SKIN, Name: null) + */ + public static SensorData loadTempSensorConfig(DisplayManagerFlags flags, + DisplayConfiguration config) { + SensorDetails sensorDetails = config.getTempSensor(); + if (!flags.isSensorBasedBrightnessThrottlingEnabled() || sensorDetails == null) { + return new SensorData(TEMPERATURE_TYPE_SKIN, null); + } + String name = sensorDetails.getName(); + String type = sensorDetails.getType(); + if (TextUtils.isEmpty(type) || TextUtils.isEmpty(name)) { + type = TEMPERATURE_TYPE_SKIN; + name = null; + } + return new SensorData(type, name); + } + + /** * Loads sensor unspecified config, this means system should use default sensor. * See also {@link com.android.server.display.utils.SensorUtils} */ 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 1ae255933f66..516d4b1d4125 100644 --- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java @@ -121,6 +121,11 @@ public class DisplayManagerFlags { Flags::refreshRateVotingTelemetry ); + private final FlagState mSensorBasedBrightnessThrottling = new FlagState( + Flags.FLAG_SENSOR_BASED_BRIGHTNESS_THROTTLING, + Flags::sensorBasedBrightnessThrottling + ); + /** * @return {@code true} if 'port' is allowed in display layout configuration file. */ @@ -247,6 +252,10 @@ public class DisplayManagerFlags { return mRefreshRateVotingTelemetry.isEnabled(); } + public boolean isSensorBasedBrightnessThrottlingEnabled() { + return mSensorBasedBrightnessThrottling.isEnabled(); + } + /** * dumps all flagstates * @param pw printWriter @@ -270,6 +279,7 @@ public class DisplayManagerFlags { pw.println(" " + mAutoBrightnessModesFlagState); pw.println(" " + mFastHdrTransitions); pw.println(" " + mRefreshRateVotingTelemetry); + pw.println(" " + mSensorBasedBrightnessThrottling); } private static class FlagState { 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 c2f52b5ad8a0..63ab3a95822f 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 @@ -184,3 +184,11 @@ flag { bug: "310029108" is_fixed_read_only: true } + +flag { + name: "sensor_based_brightness_throttling" + namespace: "display_manager" + description: "Feature flag for enabling brightness throttling using sensor from config." + bug: "294900859" + is_fixed_read_only: true +} diff --git a/services/core/java/com/android/server/display/utils/SensorUtils.java b/services/core/java/com/android/server/display/utils/SensorUtils.java index 8b9fe1083187..c63473a4b3d7 100644 --- a/services/core/java/com/android/server/display/utils/SensorUtils.java +++ b/services/core/java/com/android/server/display/utils/SensorUtils.java @@ -16,9 +16,11 @@ package com.android.server.display.utils; +import android.annotation.NonNull; import android.annotation.Nullable; import android.hardware.Sensor; import android.hardware.SensorManager; +import android.os.Temperature; import android.text.TextUtils; import com.android.server.display.config.SensorData; @@ -70,4 +72,17 @@ public class SensorUtils { return null; } + /** + * Convert string temperature type to its corresponding integer value. + */ + public static int getSensorTemperatureType(@NonNull SensorData tempSensor) { + if (tempSensor.type.equalsIgnoreCase(SensorData.TEMPERATURE_TYPE_DISPLAY)) { + return Temperature.TYPE_DISPLAY; + } else if (tempSensor.type.equalsIgnoreCase(SensorData.TEMPERATURE_TYPE_SKIN)) { + return Temperature.TYPE_SKIN; + } + throw new IllegalArgumentException( + "tempSensor doesn't support type: " + tempSensor.type); + } + } 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 a46916553abc..b38a2f9558e9 100644 --- a/services/core/xsd/display-device-config/display-device-config.xsd +++ b/services/core/xsd/display-device-config/display-device-config.xsd @@ -117,6 +117,9 @@ <xs:element type="sensorDetails" name="proxSensor"> <xs:annotation name="final"/> </xs:element> + <xs:element type="sensorDetails" name="tempSensor"> + <xs:annotation name="final"/> + </xs:element> <!-- Length of the ambient light horizon used to calculate the long & short term estimates of ambient light in milliseconds.--> diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt index 79ea274e2fca..b329db4a2076 100644 --- a/services/core/xsd/display-device-config/schema/current.txt +++ b/services/core/xsd/display-device-config/schema/current.txt @@ -133,6 +133,7 @@ package com.android.server.display.config { method public final java.math.BigDecimal getScreenBrightnessRampSlowIncreaseIdle(); method public final com.android.server.display.config.SensorDetails getScreenOffBrightnessSensor(); method public final com.android.server.display.config.IntegerArray getScreenOffBrightnessSensorValueToLux(); + method public final com.android.server.display.config.SensorDetails getTempSensor(); method @NonNull public final com.android.server.display.config.ThermalThrottling getThermalThrottling(); method public final com.android.server.display.config.UsiVersion getUsiVersion(); method public final void setAmbientBrightnessChangeThresholds(@NonNull com.android.server.display.config.Thresholds); @@ -167,6 +168,7 @@ package com.android.server.display.config { method public final void setScreenBrightnessRampSlowIncreaseIdle(java.math.BigDecimal); method public final void setScreenOffBrightnessSensor(com.android.server.display.config.SensorDetails); method public final void setScreenOffBrightnessSensorValueToLux(com.android.server.display.config.IntegerArray); + method public final void setTempSensor(com.android.server.display.config.SensorDetails); method public final void setThermalThrottling(@NonNull com.android.server.display.config.ThermalThrottling); method public final void setUsiVersion(com.android.server.display.config.UsiVersion); } 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 b29fc8828f58..2867041511b5 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java @@ -20,6 +20,7 @@ package com.android.server.display; import static com.android.internal.display.BrightnessSynchronizer.brightnessIntToFloat; 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.config.SensorData.TEMPERATURE_TYPE_SKIN; import static com.android.server.display.config.SensorData.SupportedMode; import static com.android.server.display.utils.DeviceConfigParsingUtils.ambientBrightnessThresholdsIntToFloat; import static com.android.server.display.utils.DeviceConfigParsingUtils.displayBrightnessThresholdsIntToFloat; @@ -106,6 +107,7 @@ public final class DisplayDeviceConfigTest { MockitoAnnotations.initMocks(this); when(mContext.getResources()).thenReturn(mResources); when(mFlags.areAutoBrightnessModesEnabled()).thenReturn(true); + when(mFlags.isSensorBasedBrightnessThrottlingEnabled()).thenReturn(true); mockDeviceConfigs(); } @@ -143,6 +145,8 @@ public final class DisplayDeviceConfigTest { assertEquals("", mDisplayDeviceConfig.getAmbientLightSensor().name); assertNull(mDisplayDeviceConfig.getProximitySensor().type); assertNull(mDisplayDeviceConfig.getProximitySensor().name); + assertEquals(TEMPERATURE_TYPE_SKIN, mDisplayDeviceConfig.getTempSensor().type); + assertNull(mDisplayDeviceConfig.getTempSensor().name); assertTrue(mDisplayDeviceConfig.isAutoBrightnessAvailable()); } @@ -592,6 +596,13 @@ public final class DisplayDeviceConfigTest { } @Test + public void testTempSensorFromDisplayConfig() throws IOException { + setupDisplayDeviceConfigFromDisplayConfigFile(); + assertEquals("DISPLAY", mDisplayDeviceConfig.getTempSensor().type); + assertEquals("VIRTUAL-SKIN-DISPLAY", mDisplayDeviceConfig.getTempSensor().name); + } + + @Test public void testBlockingZoneThresholdsFromDisplayConfig() throws IOException { setupDisplayDeviceConfigFromDisplayConfigFile(); @@ -1356,6 +1367,10 @@ public final class DisplayDeviceConfigTest { + "<name>Test Binned Brightness Sensor</name>\n" + "</screenOffBrightnessSensor>\n" + proxSensor + + "<tempSensor>\n" + + "<type>DISPLAY</type>\n" + + "<name>VIRTUAL-SKIN-DISPLAY</name>\n" + + "</tempSensor>\n" + "<ambientBrightnessChangeThresholds>\n" + "<brighteningThresholds>\n" + "<minimum>10</minimum>\n" |