Allow sensors to be specified per display

Add a field in display device configurations that allows sensors to be stored.
Read the sensor type and name through dpc.

Bug: 128782163
Test: manual
Change-Id: I4cd778fca085b398b21457104a6a58ad0dae46e2
This commit is contained in:
Fiona Campbell
2021-04-07 17:19:20 +01:00
parent 0dd99e0c3c
commit 79ec034fdd
4 changed files with 103 additions and 23 deletions

View File

@@ -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.
*/

View File

@@ -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<Sensor> 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<Sensor> 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:");

View File

@@ -48,6 +48,9 @@
<xs:element type="nonNegativeDecimal" name="screenBrightnessRampSlowIncrease">
<xs:annotation name="final"/>
</xs:element>
<xs:element type="sensorDetails" name="lightSensor">
<xs:annotation name="final"/>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
@@ -119,4 +122,18 @@
<xs:minInclusive value="0.0"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="sensorDetails">
<xs:sequence>
<xs:element type="xs:string" name="type" minOccurs="0" maxOccurs="1">
<xs:annotation name="nullable" />
<xs:annotation name="final"/>
</xs:element>
<xs:element type="xs:string" name="name" minOccurs="0" maxOccurs="1">
<xs:annotation name="nullable" />
<xs:annotation name="final"/>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>

View File

@@ -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;