diff --git a/services/core/java/com/android/server/display/DisplayDeviceConfig.java b/services/core/java/com/android/server/display/DisplayDeviceConfig.java index 0071b2f558c4b..ace466acdaf9d 100644 --- a/services/core/java/com/android/server/display/DisplayDeviceConfig.java +++ b/services/core/java/com/android/server/display/DisplayDeviceConfig.java @@ -34,6 +34,7 @@ import com.android.server.display.config.HbmTiming; import com.android.server.display.config.HighBrightnessMode; import com.android.server.display.config.NitsMap; import com.android.server.display.config.Point; +import com.android.server.display.config.SensorDetails; import com.android.server.display.config.XmlParser; import org.xmlpull.v1.XmlPullParserException; @@ -75,6 +76,9 @@ public class DisplayDeviceConfig { private final Context mContext; + // The details of the ambient light sensor associated with this display. + private final SensorIdentifier mAmbientLightSensor = new SensorIdentifier(); + // Nits and backlight values that are loaded from either the display device config file, or // config.xml. These are the raw values and just used for the dumpsys private float[] mRawNits; @@ -249,6 +253,10 @@ public class DisplayDeviceConfig { return mBrightnessRampSlowIncrease; } + SensorIdentifier getAmbientLightSensor() { + return mAmbientLightSensor; + } + /** * @param quirkValue The quirk to test. * @return {@code true} if the specified quirk is present in this configuration, @@ -291,6 +299,7 @@ public class DisplayDeviceConfig { + ", mBrightnessRampFastIncrease=" + mBrightnessRampFastIncrease + ", mBrightnessRampSlowDecrease=" + mBrightnessRampSlowDecrease + ", mBrightnessRampSlowIncrease=" + mBrightnessRampSlowIncrease + + ", mAmbientLightSensor=" + mAmbientLightSensor + "}"; return str; } @@ -318,7 +327,7 @@ public class DisplayDeviceConfig { private static DisplayDeviceConfig getConfigFromPmValues(Context context) { DisplayDeviceConfig config = new DisplayDeviceConfig(context); - config.initFromPmValues(); + config.initFromDefaultValues(); return config; } @@ -342,6 +351,7 @@ public class DisplayDeviceConfig { loadHighBrightnessModeData(config); loadQuirks(config); loadBrightnessRamps(config); + loadAmbientLightSensorFromDdc(config); } else { Slog.w(TAG, "DisplayDeviceConfig file is null"); } @@ -357,9 +367,10 @@ public class DisplayDeviceConfig { loadBrightnessConstraintsFromConfigXml(); loadBrightnessMapFromConfigXml(); loadBrightnessRampsFromConfigXml(); + loadAmbientLightSensorFromConfigXml(); } - private void initFromPmValues() { + private void initFromDefaultValues() { // Set all to basic values mBacklightMinimum = PowerManager.BRIGHTNESS_MIN; mBacklightMaximum = PowerManager.BRIGHTNESS_MAX; @@ -369,6 +380,7 @@ public class DisplayDeviceConfig { mBrightnessRampSlowDecrease = PowerManager.BRIGHTNESS_MAX; mBrightnessRampSlowIncrease = PowerManager.BRIGHTNESS_MAX; setSimpleMappingStrategyValues(); + loadAmbientLightSensorFromConfigXml(); } private void loadBrightnessDefaultFromDdcXml(DisplayConfiguration config) { @@ -637,6 +649,33 @@ public class DisplayDeviceConfig { mBrightnessRampSlowDecrease = mBrightnessRampSlowIncrease; } + private void loadAmbientLightSensorFromConfigXml() { + mAmbientLightSensor.name = ""; + mAmbientLightSensor.type = mContext.getResources().getString( + com.android.internal.R.string.config_displayLightSensorType); + } + + private void loadAmbientLightSensorFromDdc(DisplayConfiguration config) { + final SensorDetails sensorDetails = config.getLightSensor(); + if (sensorDetails != null) { + mAmbientLightSensor.type = sensorDetails.getType(); + mAmbientLightSensor.name = sensorDetails.getName(); + } + } + + static class SensorIdentifier { + public String type; + public String name; + + @Override + public String toString() { + return "Sensor{" + + "type: \"" + type + "\"" + + ", name: \"" + name + "\"" + + "} "; + } + } + /** * Container for high brightness mode configuration data. */ diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 5cd0534c8e931..86e4fd00db7fb 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -368,6 +368,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // The controller for the automatic brightness level. private AutomaticBrightnessController mAutomaticBrightnessController; + private Sensor mLightSensor; + // The mapper between ambient lux, display backlight values, and display brightness. @Nullable private BrightnessMappingStrategy mBrightnessMapper; @@ -418,6 +420,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // True if this DisplayPowerController has been stopped and should no longer be running. private boolean mStopped; + private DisplayDeviceConfig mDisplayDeviceConfig; + /** * Creates the display power controller. */ @@ -478,12 +482,12 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing); - DisplayDeviceConfig displayDeviceConfig = logicalDisplay + mDisplayDeviceConfig = logicalDisplay .getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig(); - mBrightnessRampRateFastDecrease = displayDeviceConfig.getBrightnessRampFastDecrease(); - mBrightnessRampRateFastIncrease = displayDeviceConfig.getBrightnessRampFastIncrease(); - mBrightnessRampRateSlowDecrease = displayDeviceConfig.getBrightnessRampSlowDecrease(); - mBrightnessRampRateSlowIncrease = displayDeviceConfig.getBrightnessRampSlowIncrease(); + mBrightnessRampRateFastDecrease = mDisplayDeviceConfig.getBrightnessRampFastDecrease(); + mBrightnessRampRateFastIncrease = mDisplayDeviceConfig.getBrightnessRampFastIncrease(); + mBrightnessRampRateSlowDecrease = mDisplayDeviceConfig.getBrightnessRampSlowDecrease(); + mBrightnessRampRateSlowIncrease = mDisplayDeviceConfig.getBrightnessRampSlowIncrease(); mSkipScreenOnBrightnessRamp = resources.getBoolean( com.android.internal.R.bool.config_skipScreenOnBrightnessRamp); @@ -534,16 +538,12 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call + "config_autoBrightnessLightSensorRate (" + lightSensorRate + ")."); } - String lightSensorType = resources.getString( - com.android.internal.R.string.config_displayLightSensorType); - Sensor lightSensor = findDisplayLightSensor(lightSensorType); + loadAmbientLightSensor(); - final DisplayDeviceConfig ddc = - logicalDisplay.getPrimaryDisplayDeviceLocked().getDisplayDeviceConfig(); - mBrightnessMapper = BrightnessMappingStrategy.create(resources, ddc); + mBrightnessMapper = BrightnessMappingStrategy.create(resources, mDisplayDeviceConfig); if (mBrightnessMapper != null) { mAutomaticBrightnessController = new AutomaticBrightnessController(this, - handler.getLooper(), sensorManager, lightSensor, mBrightnessMapper, + handler.getLooper(), sensorManager, mLightSensor, mBrightnessMapper, lightSensorWarmUpTimeConfig, PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, dozeScaleFactor, lightSensorRate, initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce, @@ -597,8 +597,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mDisplayWhiteBalanceSettings = displayWhiteBalanceSettings; mDisplayWhiteBalanceController = displayWhiteBalanceController; - if (displayDeviceConfig != null && displayDeviceConfig.getNits() != null) { - mNitsRange = displayDeviceConfig.getNits(); + if (mDisplayDeviceConfig != null && mDisplayDeviceConfig.getNits() != null) { + mNitsRange = mDisplayDeviceConfig.getNits(); } else { Slog.w(TAG, "Screen brightness nits configuration is unavailable; falling back"); mNitsRange = BrightnessMappingStrategy.getFloatArray(context.getResources() @@ -638,17 +638,19 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mBrightnessMapper.recalculateSplines(mCdsi.isReduceBrightColorsActivated(), adjustedNits); } - private Sensor findDisplayLightSensor(String sensorType) { - if (!TextUtils.isEmpty(sensorType)) { - List sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL); - for (int i = 0; i < sensors.size(); i++) { - Sensor sensor = sensors.get(i); - if (sensorType.equals(sensor.getStringType())) { + private Sensor findSensor(String sensorType, String sensorName, int fallbackType) { + final boolean isNameSpecified = !TextUtils.isEmpty(sensorName); + final boolean isTypeSpecified = !TextUtils.isEmpty(sensorType); + List sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL); + if (isNameSpecified || isTypeSpecified) { + for (Sensor sensor : sensors) { + if ((!isNameSpecified || sensorName.equals(sensor.getName())) + && (!isTypeSpecified || sensorType.equals(sensor.getStringType()))) { return sensor; } } } - return mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); + return mSensorManager.getDefaultSensor(fallbackType); } /** @@ -767,6 +769,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // TODO: b/175821789 - Support high brightness on multiple (folding) displays mUniqueDisplayId = mLogicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId(); + mDisplayDeviceConfig = mLogicalDisplay.getPrimaryDisplayDeviceLocked() + .getDisplayDeviceConfig(); + loadAmbientLightSensor(); } /** @@ -1510,6 +1515,14 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mReportedScreenStateToPolicy = state; } + private void loadAmbientLightSensor() { + DisplayDeviceConfig.SensorIdentifier lightSensor = + mDisplayDeviceConfig.getAmbientLightSensor(); + String lightSensorName = lightSensor.name; + String lightSensorType = lightSensor.type; + mLightSensor = findSensor(lightSensorType, lightSensorName, Sensor.TYPE_LIGHT); + } + private float clampScreenBrightnessForVr(float value) { return MathUtils.constrain( value, mScreenBrightnessForVrRangeMinimum, @@ -1987,6 +2000,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call pw.println(); pw.println("Display Power Controller:"); pw.println(" mDisplayId=" + mDisplayId); + pw.println(" mLightSensor=" + mLightSensor); pw.println(); pw.println("Display Power Controller Locked State:"); 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 e4b961299f122..01834ddfbeac1 100644 --- a/services/core/xsd/display-device-config/display-device-config.xsd +++ b/services/core/xsd/display-device-config/display-device-config.xsd @@ -48,6 +48,9 @@ + + + @@ -119,4 +122,18 @@ + + + + + + + + + + + + + + diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt index eb3f1b7519635..a848f82a0cb6e 100644 --- a/services/core/xsd/display-device-config/schema/current.txt +++ b/services/core/xsd/display-device-config/schema/current.txt @@ -4,6 +4,7 @@ package com.android.server.display.config { public class DisplayConfiguration { ctor public DisplayConfiguration(); method public com.android.server.display.config.HighBrightnessMode getHighBrightnessMode(); + method public final com.android.server.display.config.SensorDetails getLightSensor(); method public com.android.server.display.config.DisplayQuirks getQuirks(); method @NonNull public final java.math.BigDecimal getScreenBrightnessDefault(); method @NonNull public final com.android.server.display.config.NitsMap getScreenBrightnessMap(); @@ -12,6 +13,7 @@ package com.android.server.display.config { method public final java.math.BigDecimal getScreenBrightnessRampSlowDecrease(); method public final java.math.BigDecimal getScreenBrightnessRampSlowIncrease(); method public void setHighBrightnessMode(com.android.server.display.config.HighBrightnessMode); + method public final void setLightSensor(com.android.server.display.config.SensorDetails); method public void setQuirks(com.android.server.display.config.DisplayQuirks); method public final void setScreenBrightnessDefault(@NonNull java.math.BigDecimal); method public final void setScreenBrightnessMap(@NonNull com.android.server.display.config.NitsMap); @@ -61,6 +63,14 @@ package com.android.server.display.config { method public final void setValue(@NonNull java.math.BigDecimal); } + public class SensorDetails { + ctor public SensorDetails(); + method @Nullable public final String getName(); + method @Nullable public final String getType(); + method public final void setName(@Nullable String); + method public final void setType(@Nullable String); + } + public class XmlParser { ctor public XmlParser(); method public static com.android.server.display.config.DisplayConfiguration read(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;