Merge "Persist the nit brightness for the default display" into tm-qpr-dev

This commit is contained in:
TreeHugger Robot
2023-03-09 15:11:20 +00:00
committed by Android (Google) Code Review
8 changed files with 158 additions and 16 deletions

View File

@@ -6092,4 +6092,8 @@
<!-- Whether to show weather on the lock screen by default. --> <!-- Whether to show weather on the lock screen by default. -->
<bool name="config_lockscreenWeatherEnabledByDefault">false</bool> <bool name="config_lockscreenWeatherEnabledByDefault">false</bool>
<!-- Whether we should persist the brightness value in nits for the default display even if
the underlying display device changes. -->
<bool name="config_persistBrightnessNitsForDefaultDisplay">false</bool>
</resources> </resources>

View File

@@ -2282,6 +2282,7 @@
<java-symbol type="bool" name="config_preventImeStartupUnlessTextEditor" /> <java-symbol type="bool" name="config_preventImeStartupUnlessTextEditor" />
<java-symbol type="array" name="config_nonPreemptibleInputMethods" /> <java-symbol type="array" name="config_nonPreemptibleInputMethods" />
<java-symbol type="bool" name="config_enhancedConfirmationModeEnabled" /> <java-symbol type="bool" name="config_enhancedConfirmationModeEnabled" />
<java-symbol type="bool" name="config_persistBrightnessNitsForDefaultDisplay" />
<java-symbol type="layout" name="resolver_list" /> <java-symbol type="layout" name="resolver_list" />
<java-symbol type="id" name="resolver_list" /> <java-symbol type="id" name="resolver_list" />

View File

@@ -1127,6 +1127,14 @@ class AutomaticBrightnessController {
} }
} }
public float convertToFloatScale(float nits) {
if (mCurrentBrightnessMapper != null) {
return mCurrentBrightnessMapper.convertToFloatScale(nits);
} else {
return PowerManager.BRIGHTNESS_INVALID_FLOAT;
}
}
public void recalculateSplines(boolean applyAdjustment, float[] adjustment) { public void recalculateSplines(boolean applyAdjustment, float[] adjustment) {
mCurrentBrightnessMapper.recalculateSplines(applyAdjustment, adjustment); mCurrentBrightnessMapper.recalculateSplines(applyAdjustment, adjustment);

View File

@@ -321,6 +321,14 @@ public abstract class BrightnessMappingStrategy {
*/ */
public abstract float convertToNits(float brightness); public abstract float convertToNits(float brightness);
/**
* Converts the provided nit value to a float scale value if possible.
*
* Returns {@link PowerManager.BRIGHTNESS_INVALID_FLOAT} if there's no available mapping for
* the nits to float scale.
*/
public abstract float convertToFloatScale(float nits);
/** /**
* Adds a user interaction data point to the brightness mapping. * Adds a user interaction data point to the brightness mapping.
* *
@@ -670,6 +678,11 @@ public abstract class BrightnessMappingStrategy {
return -1.0f; return -1.0f;
} }
@Override
public float convertToFloatScale(float nits) {
return PowerManager.BRIGHTNESS_INVALID_FLOAT;
}
@Override @Override
public void addUserDataPoint(float lux, float brightness) { public void addUserDataPoint(float lux, float brightness) {
float unadjustedBrightness = getUnadjustedBrightness(lux); float unadjustedBrightness = getUnadjustedBrightness(lux);
@@ -912,6 +925,11 @@ public abstract class BrightnessMappingStrategy {
return mBrightnessToNitsSpline.interpolate(brightness); return mBrightnessToNitsSpline.interpolate(brightness);
} }
@Override
public float convertToFloatScale(float nits) {
return mNitsToBrightnessSpline.interpolate(nits);
}
@Override @Override
public void addUserDataPoint(float lux, float brightness) { public void addUserDataPoint(float lux, float brightness) {
float unadjustedBrightness = getUnadjustedBrightness(lux); float unadjustedBrightness = getUnadjustedBrightness(lux);

View File

@@ -117,6 +117,23 @@ public class BrightnessSetting {
} }
} }
/**
* @return The brightness for the default display in nits. Used when the underlying display
* device has changed but we want to persist the nit value.
*/
float getBrightnessNitsForDefaultDisplay() {
return mPersistentDataStore.getBrightnessNitsForDefaultDisplay();
}
/**
* Set brightness in nits for the default display. Used when we want to persist the nit value
* even if the underlying display device changes.
* @param nits The brightness value in nits
*/
void setBrightnessNitsForDefaultDisplay(float nits) {
mPersistentDataStore.setBrightnessNitsForDefaultDisplay(nits);
}
private void notifyListeners(float brightness) { private void notifyListeners(float brightness) {
for (BrightnessSettingListener l : mListeners) { for (BrightnessSettingListener l : mListeners) {
l.onBrightnessChanged(brightness); l.onBrightnessChanged(brightness);

View File

@@ -233,6 +233,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// True if should use light sensor to automatically determine doze screen brightness. // True if should use light sensor to automatically determine doze screen brightness.
private final boolean mAllowAutoBrightnessWhileDozingConfig; private final boolean mAllowAutoBrightnessWhileDozingConfig;
// True if we want to persist the brightness value in nits even if the underlying display
// device changes.
private final boolean mPersistBrightnessNitsForDefaultDisplay;
// True if the brightness config has changed and the short-term model needs to be reset // True if the brightness config has changed and the short-term model needs to be reset
private boolean mShouldResetShortTermModel; private boolean mShouldResetShortTermModel;
@@ -583,6 +587,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mAllowAutoBrightnessWhileDozingConfig = resources.getBoolean( mAllowAutoBrightnessWhileDozingConfig = resources.getBoolean(
com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing); com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing);
mPersistBrightnessNitsForDefaultDisplay = resources.getBoolean(
com.android.internal.R.bool.config_persistBrightnessNitsForDefaultDisplay);
mDisplayDeviceConfig = logicalDisplay.getPrimaryDisplayDeviceLocked() mDisplayDeviceConfig = logicalDisplay.getPrimaryDisplayDeviceLocked()
.getDisplayDeviceConfig(); .getDisplayDeviceConfig();
@@ -651,7 +658,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
loadProximitySensor(); loadProximitySensor();
mCurrentScreenBrightnessSetting = getScreenBrightnessSetting(); loadNitBasedBrightnessSetting();
mScreenBrightnessForVr = getScreenBrightnessForVrSetting(); mScreenBrightnessForVr = getScreenBrightnessForVrSetting();
mAutoBrightnessAdjustment = getAutoBrightnessAdjustmentSetting(); mAutoBrightnessAdjustment = getAutoBrightnessAdjustmentSetting();
mTemporaryScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT; mTemporaryScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
@@ -829,6 +836,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mDisplayStatsId = mUniqueDisplayId.hashCode(); mDisplayStatsId = mUniqueDisplayId.hashCode();
mDisplayDeviceConfig = config; mDisplayDeviceConfig = config;
loadFromDisplayDeviceConfig(token, info, hbmMetadata); loadFromDisplayDeviceConfig(token, info, hbmMetadata);
loadNitBasedBrightnessSetting();
/// Since the underlying display-device changed, we really don't know the /// Since the underlying display-device changed, we really don't know the
// last command that was sent to change it's state. Lets assume it is unknown so // last command that was sent to change it's state. Lets assume it is unknown so
@@ -2498,10 +2506,33 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
return clampScreenBrightnessForVr(brightnessFloat); return clampScreenBrightnessForVr(brightnessFloat);
} }
private void loadNitBasedBrightnessSetting() {
if (mDisplayId == Display.DEFAULT_DISPLAY && mPersistBrightnessNitsForDefaultDisplay) {
float brightnessNitsForDefaultDisplay =
mBrightnessSetting.getBrightnessNitsForDefaultDisplay();
if (brightnessNitsForDefaultDisplay >= 0) {
float brightnessForDefaultDisplay = convertToFloatScale(
brightnessNitsForDefaultDisplay);
if (isValidBrightnessValue(brightnessForDefaultDisplay)) {
mBrightnessSetting.setBrightness(brightnessForDefaultDisplay);
mCurrentScreenBrightnessSetting = brightnessForDefaultDisplay;
return;
}
}
}
mCurrentScreenBrightnessSetting = getScreenBrightnessSetting();
}
void setBrightness(float brightnessValue) { void setBrightness(float brightnessValue) {
// Update the setting, which will eventually call back into DPC to have us actually update // Update the setting, which will eventually call back into DPC to have us actually update
// the display with the new value. // the display with the new value.
mBrightnessSetting.setBrightness(brightnessValue); mBrightnessSetting.setBrightness(brightnessValue);
if (mDisplayId == Display.DEFAULT_DISPLAY && mPersistBrightnessNitsForDefaultDisplay) {
float nits = convertToNits(brightnessValue);
if (nits >= 0) {
mBrightnessSetting.setBrightnessNitsForDefaultDisplay(nits);
}
}
} }
void onBootCompleted() { void onBootCompleted() {
@@ -2514,7 +2545,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
return; return;
} }
setCurrentScreenBrightness(brightnessValue); setCurrentScreenBrightness(brightnessValue);
mBrightnessSetting.setBrightness(brightnessValue); setBrightness(brightnessValue);
} }
private void setCurrentScreenBrightness(float brightnessValue) { private void setCurrentScreenBrightness(float brightnessValue) {
@@ -2593,6 +2624,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
return mAutomaticBrightnessController.convertToNits(brightness); return mAutomaticBrightnessController.convertToNits(brightness);
} }
private float convertToFloatScale(float nits) {
if (mAutomaticBrightnessController == null) {
return PowerManager.BRIGHTNESS_INVALID_FLOAT;
}
return mAutomaticBrightnessController.convertToFloatScale(nits);
}
@GuardedBy("mLock") @GuardedBy("mLock")
private void updatePendingProximityRequestsLocked() { private void updatePendingProximityRequestsLocked() {
mWaitingForNegativeProximity |= mPendingWaitForNegativeProximityLocked; mWaitingForNegativeProximity |= mPendingWaitForNegativeProximityLocked;
@@ -2690,25 +2728,27 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
pw.println(" mScreenBrightnessForVrRangeMaximum=" + mScreenBrightnessForVrRangeMaximum); pw.println(" mScreenBrightnessForVrRangeMaximum=" + mScreenBrightnessForVrRangeMaximum);
pw.println(" mScreenBrightnessForVrDefault=" + mScreenBrightnessForVrDefault); pw.println(" mScreenBrightnessForVrDefault=" + mScreenBrightnessForVrDefault);
pw.println(" mUseSoftwareAutoBrightnessConfig=" + mUseSoftwareAutoBrightnessConfig); pw.println(" mUseSoftwareAutoBrightnessConfig=" + mUseSoftwareAutoBrightnessConfig);
pw.println(" mAllowAutoBrightnessWhileDozingConfig=" + pw.println(" mAllowAutoBrightnessWhileDozingConfig="
mAllowAutoBrightnessWhileDozingConfig); + mAllowAutoBrightnessWhileDozingConfig);
pw.println(" mPersistBrightnessNitsForDefaultDisplay="
+ mPersistBrightnessNitsForDefaultDisplay);
pw.println(" mSkipScreenOnBrightnessRamp=" + mSkipScreenOnBrightnessRamp); pw.println(" mSkipScreenOnBrightnessRamp=" + mSkipScreenOnBrightnessRamp);
pw.println(" mColorFadeFadesConfig=" + mColorFadeFadesConfig); pw.println(" mColorFadeFadesConfig=" + mColorFadeFadesConfig);
pw.println(" mColorFadeEnabled=" + mColorFadeEnabled); pw.println(" mColorFadeEnabled=" + mColorFadeEnabled);
synchronized (mCachedBrightnessInfo) { synchronized (mCachedBrightnessInfo) {
pw.println(" mCachedBrightnessInfo.brightness=" + pw.println(" mCachedBrightnessInfo.brightness="
mCachedBrightnessInfo.brightness.value); + mCachedBrightnessInfo.brightness.value);
pw.println(" mCachedBrightnessInfo.adjustedBrightness=" + pw.println(" mCachedBrightnessInfo.adjustedBrightness="
mCachedBrightnessInfo.adjustedBrightness.value); + mCachedBrightnessInfo.adjustedBrightness.value);
pw.println(" mCachedBrightnessInfo.brightnessMin=" + pw.println(" mCachedBrightnessInfo.brightnessMin="
mCachedBrightnessInfo.brightnessMin.value); + mCachedBrightnessInfo.brightnessMin.value);
pw.println(" mCachedBrightnessInfo.brightnessMax=" + pw.println(" mCachedBrightnessInfo.brightnessMax="
mCachedBrightnessInfo.brightnessMax.value); + mCachedBrightnessInfo.brightnessMax.value);
pw.println(" mCachedBrightnessInfo.hbmMode=" + mCachedBrightnessInfo.hbmMode.value); pw.println(" mCachedBrightnessInfo.hbmMode=" + mCachedBrightnessInfo.hbmMode.value);
pw.println(" mCachedBrightnessInfo.hbmTransitionPoint=" + pw.println(" mCachedBrightnessInfo.hbmTransitionPoint="
mCachedBrightnessInfo.hbmTransitionPoint.value); + mCachedBrightnessInfo.hbmTransitionPoint.value);
pw.println(" mCachedBrightnessInfo.brightnessMaxReason =" + pw.println(" mCachedBrightnessInfo.brightnessMaxReason ="
mCachedBrightnessInfo.brightnessMaxReason.value); + mCachedBrightnessInfo.brightnessMaxReason.value);
} }
pw.println(" mDisplayBlanksAfterDozeConfig=" + mDisplayBlanksAfterDozeConfig); pw.println(" mDisplayBlanksAfterDozeConfig=" + mDisplayBlanksAfterDozeConfig);
pw.println(" mBrightnessBucketsInDozeConfig=" + mBrightnessBucketsInDozeConfig); pw.println(" mBrightnessBucketsInDozeConfig=" + mBrightnessBucketsInDozeConfig);

View File

@@ -94,6 +94,7 @@ import java.util.Objects;
* &lt;/brightness-curve> * &lt;/brightness-curve>
* &lt;/brightness-configuration> * &lt;/brightness-configuration>
* &lt;/brightness-configurations> * &lt;/brightness-configurations>
* &lt;brightness-nits-for-default-display>600&lt;/brightness-nits-for-default-display>
* &lt;/display-manager-state> * &lt;/display-manager-state>
* </code> * </code>
* *
@@ -130,6 +131,9 @@ final class PersistentDataStore {
private static final String TAG_RESOLUTION_HEIGHT = "resolution-height"; private static final String TAG_RESOLUTION_HEIGHT = "resolution-height";
private static final String TAG_REFRESH_RATE = "refresh-rate"; private static final String TAG_REFRESH_RATE = "refresh-rate";
private static final String TAG_BRIGHTNESS_NITS_FOR_DEFAULT_DISPLAY =
"brightness-nits-for-default-display";
// Remembered Wifi display devices. // Remembered Wifi display devices.
private ArrayList<WifiDisplay> mRememberedWifiDisplays = new ArrayList<WifiDisplay>(); private ArrayList<WifiDisplay> mRememberedWifiDisplays = new ArrayList<WifiDisplay>();
@@ -137,6 +141,8 @@ final class PersistentDataStore {
private final HashMap<String, DisplayState> mDisplayStates = private final HashMap<String, DisplayState> mDisplayStates =
new HashMap<String, DisplayState>(); new HashMap<String, DisplayState>();
private float mBrightnessNitsForDefaultDisplay = -1;
// Display values which should be stable across the device's lifetime. // Display values which should be stable across the device's lifetime.
private final StableDeviceValues mStableDeviceValues = new StableDeviceValues(); private final StableDeviceValues mStableDeviceValues = new StableDeviceValues();
@@ -312,6 +318,19 @@ final class PersistentDataStore {
return false; return false;
} }
public float getBrightnessNitsForDefaultDisplay() {
return mBrightnessNitsForDefaultDisplay;
}
public boolean setBrightnessNitsForDefaultDisplay(float nits) {
if (nits != mBrightnessNitsForDefaultDisplay) {
mBrightnessNitsForDefaultDisplay = nits;
setDirty();
return true;
}
return false;
}
public boolean setUserPreferredRefreshRate(DisplayDevice displayDevice, float refreshRate) { public boolean setUserPreferredRefreshRate(DisplayDevice displayDevice, float refreshRate) {
final String displayDeviceUniqueId = displayDevice.getUniqueId(); final String displayDeviceUniqueId = displayDevice.getUniqueId();
if (!displayDevice.hasStableUniqueId() || displayDeviceUniqueId == null) { if (!displayDevice.hasStableUniqueId() || displayDeviceUniqueId == null) {
@@ -513,6 +532,10 @@ final class PersistentDataStore {
if (parser.getName().equals(TAG_BRIGHTNESS_CONFIGURATIONS)) { if (parser.getName().equals(TAG_BRIGHTNESS_CONFIGURATIONS)) {
mGlobalBrightnessConfigurations.loadFromXml(parser); mGlobalBrightnessConfigurations.loadFromXml(parser);
} }
if (parser.getName().equals(TAG_BRIGHTNESS_NITS_FOR_DEFAULT_DISPLAY)) {
String value = parser.nextText();
mBrightnessNitsForDefaultDisplay = Float.parseFloat(value);
}
} }
} }
@@ -592,6 +615,9 @@ final class PersistentDataStore {
serializer.startTag(null, TAG_BRIGHTNESS_CONFIGURATIONS); serializer.startTag(null, TAG_BRIGHTNESS_CONFIGURATIONS);
mGlobalBrightnessConfigurations.saveToXml(serializer); mGlobalBrightnessConfigurations.saveToXml(serializer);
serializer.endTag(null, TAG_BRIGHTNESS_CONFIGURATIONS); serializer.endTag(null, TAG_BRIGHTNESS_CONFIGURATIONS);
serializer.startTag(null, TAG_BRIGHTNESS_NITS_FOR_DEFAULT_DISPLAY);
serializer.text(Float.toString(mBrightnessNitsForDefaultDisplay));
serializer.endTag(null, TAG_BRIGHTNESS_NITS_FOR_DEFAULT_DISPLAY);
serializer.endTag(null, TAG_DISPLAY_MANAGER_STATE); serializer.endTag(null, TAG_DISPLAY_MANAGER_STATE);
serializer.endDocument(); serializer.endDocument();
} }
@@ -615,6 +641,7 @@ final class PersistentDataStore {
mStableDeviceValues.dump(pw, " "); mStableDeviceValues.dump(pw, " ");
pw.println(" GlobalBrightnessConfigurations:"); pw.println(" GlobalBrightnessConfigurations:");
mGlobalBrightnessConfigurations.dump(pw, " "); mGlobalBrightnessConfigurations.dump(pw, " ");
pw.println(" mBrightnessNitsForDefaultDisplay=" + mBrightnessNitsForDefaultDisplay);
} }
private static final class DisplayState { private static final class DisplayState {

View File

@@ -377,6 +377,33 @@ public class PersistentDataStoreTest {
assertTrue(Float.isNaN(mDataStore.getBrightness(testDisplayDevice))); assertTrue(Float.isNaN(mDataStore.getBrightness(testDisplayDevice)));
} }
@Test
public void testStoreAndRestoreBrightnessNitsForDefaultDisplay() {
float brightnessNitsForDefaultDisplay = 190;
mDataStore.loadIfNeeded();
mDataStore.setBrightnessNitsForDefaultDisplay(brightnessNitsForDefaultDisplay);
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
mInjector.setWriteStream(baos);
mDataStore.saveIfNeeded();
mTestLooper.dispatchAll();
assertTrue(mInjector.wasWriteSuccessful());
TestInjector newInjector = new TestInjector();
PersistentDataStore newDataStore = new PersistentDataStore(newInjector);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
newInjector.setReadStream(bais);
newDataStore.loadIfNeeded();
assertEquals(brightnessNitsForDefaultDisplay,
mDataStore.getBrightnessNitsForDefaultDisplay(), 0);
assertEquals(brightnessNitsForDefaultDisplay,
newDataStore.getBrightnessNitsForDefaultDisplay(), 0);
}
@Test
public void testInitialBrightnessNitsForDefaultDisplay() {
mDataStore.loadIfNeeded();
assertEquals(-1, mDataStore.getBrightnessNitsForDefaultDisplay(), 0);
}
public class TestInjector extends PersistentDataStore.Injector { public class TestInjector extends PersistentDataStore.Injector {
private InputStream mReadStream; private InputStream mReadStream;