DO NOT MERGE DMD: Support minimum refresh rate

Bug: 139685237
Change-Id: Ib41dee351276d70733fffa18620455e4e6f9ddfc
This commit is contained in:
Long Ling
2019-08-17 18:02:46 -07:00
parent 6f13f12213
commit 86ce8f764b
3 changed files with 61 additions and 24 deletions

View File

@@ -3476,6 +3476,14 @@ public final class Settings {
}
};
/**
* The user selected min refresh rate in frames per second.
*
* If this isn't set, 0 will be used.
* @hide
*/
public static final String MIN_REFRESH_RATE = "min_refresh_rate";
/**
* The user selected peak refresh rate in frames per second.
*

View File

@@ -93,6 +93,7 @@ public class SettingsBackupTest {
Settings.System.VOLUME_VOICE, // deprecated since API 2?
Settings.System.WHEN_TO_MAKE_WIFI_CALLS, // bug?
Settings.System.WINDOW_ORIENTATION_LISTENER_LOG, // used for debugging only
Settings.System.MIN_REFRESH_RATE, // depends on hardware capabilities
Settings.System.PEAK_REFRESH_RATE // depends on hardware capabilities
);

View File

@@ -525,8 +525,10 @@ public class DisplayModeDirector {
}
private final class SettingsObserver extends ContentObserver {
private final Uri mRefreshRateSetting =
private final Uri mPeakRefreshRateSetting =
Settings.System.getUriFor(Settings.System.PEAK_REFRESH_RATE);
private final Uri mMinRefreshRateSetting =
Settings.System.getUriFor(Settings.System.MIN_REFRESH_RATE);
private final Uri mLowPowerModeSetting =
Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE);
@@ -542,7 +544,9 @@ public class DisplayModeDirector {
public void observe() {
final ContentResolver cr = mContext.getContentResolver();
cr.registerContentObserver(mRefreshRateSetting, false /*notifyDescendants*/, this,
cr.registerContentObserver(mPeakRefreshRateSetting, false /*notifyDescendants*/, this,
UserHandle.USER_SYSTEM);
cr.registerContentObserver(mMinRefreshRateSetting, false /*notifyDescendants*/, this,
UserHandle.USER_SYSTEM);
cr.registerContentObserver(mLowPowerModeSetting, false /*notifyDescendants*/, this,
UserHandle.USER_SYSTEM);
@@ -576,7 +580,8 @@ public class DisplayModeDirector {
@Override
public void onChange(boolean selfChange, Uri uri, int userId) {
synchronized (mLock) {
if (mRefreshRateSetting.equals(uri)) {
if (mPeakRefreshRateSetting.equals(uri)
|| mMinRefreshRateSetting.equals(uri)) {
updateRefreshRateSettingLocked();
} else if (mLowPowerModeSetting.equals(uri)) {
updateLowPowerModeSettingLocked();
@@ -594,15 +599,22 @@ public class DisplayModeDirector {
vote = null;
}
updateVoteLocked(Vote.PRIORITY_LOW_POWER_MODE, vote);
mBrightnessObserver.onLowPowerModeEnabled(inLowPowerMode);
mBrightnessObserver.onLowPowerModeEnabledLocked(inLowPowerMode);
}
private void updateRefreshRateSettingLocked() {
float minRefreshRate = Settings.System.getFloat(mContext.getContentResolver(),
Settings.System.MIN_REFRESH_RATE, 0f);
float peakRefreshRate = Settings.System.getFloat(mContext.getContentResolver(),
Settings.System.PEAK_REFRESH_RATE, mDefaultPeakRefreshRate);
Vote vote = Vote.forRefreshRates(0f, peakRefreshRate);
if (peakRefreshRate < minRefreshRate) {
peakRefreshRate = minRefreshRate;
}
Vote vote = Vote.forRefreshRates(minRefreshRate, peakRefreshRate);
updateVoteLocked(Vote.PRIORITY_USER_SETTING_REFRESH_RATE, vote);
mBrightnessObserver.onPeakRefreshRateEnabled(peakRefreshRate > 60f);
mBrightnessObserver.onRefreshRateSettingChangedLocked(minRefreshRate, peakRefreshRate);
}
public void dumpLocked(PrintWriter pw) {
@@ -781,10 +793,10 @@ public class DisplayModeDirector {
private final ScreenStateReceiver mScreenStateReceiver;
// Enable light sensor only when mShouldObserveAmbientChange is true, screen is on, peak
// refresh rate enabled and low power mode off. After initialization, these states will
// refresh rate changeable and low power mode off. After initialization, these states will
// be updated from the same handler thread.
private boolean mScreenOn = false;
private boolean mPeakRefreshRateEnabled = false;
private boolean mRefreshRateChangeable = false;
private boolean mLowPowerModeEnabled = false;
BrightnessObserver(Context context, Handler handler) {
@@ -817,14 +829,19 @@ public class DisplayModeDirector {
mDeviceConfigDisplaySettings.startListening();
}
public void onPeakRefreshRateEnabled(boolean b) {
if (mPeakRefreshRateEnabled != b) {
mPeakRefreshRateEnabled = b;
public void onRefreshRateSettingChangedLocked(float min, float max) {
boolean changeable = (max - min > 1f && max > 60f);
if (mRefreshRateChangeable != changeable) {
mRefreshRateChangeable = changeable;
updateSensorStatus();
if (!changeable) {
// Revoke previous vote from BrightnessObserver
updateVoteLocked(Vote.PRIORITY_LOW_BRIGHTNESS, null);
}
}
}
public void onLowPowerModeEnabled(boolean b) {
public void onLowPowerModeEnabledLocked(boolean b) {
if (mLowPowerModeEnabled != b) {
mLowPowerModeEnabled = b;
updateSensorStatus();
@@ -862,7 +879,9 @@ public class DisplayModeDirector {
@Override
public void onChange(boolean selfChange, Uri uri, int userId) {
synchronized (mLock) {
onBrightnessChangedLocked();
if (mRefreshRateChangeable) {
onBrightnessChangedLocked();
}
}
}
@@ -920,10 +939,11 @@ public class DisplayModeDirector {
mScreenStateReceiver.unregister();
}
updateSensorStatus();
synchronized (mLock) {
onBrightnessChangedLocked();
if (mRefreshRateChangeable) {
updateSensorStatus();
synchronized (mLock) {
onBrightnessChangedLocked();
}
}
}
@@ -991,7 +1011,7 @@ public class DisplayModeDirector {
}
if (mShouldObserveAmbientChange && mScreenOn && !mLowPowerModeEnabled
&& mPeakRefreshRateEnabled) {
&& mRefreshRateChangeable) {
mSensorManager.registerListener(mLightSensorListener,
mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler);
} else {
@@ -1081,6 +1101,8 @@ public class DisplayModeDirector {
private final class ScreenStateReceiver extends BroadcastReceiver {
final Context mContext;
boolean mRegistered;
public ScreenStateReceiver(Context context) {
mContext = context;
}
@@ -1091,15 +1113,21 @@ public class DisplayModeDirector {
}
public void register() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
mContext.registerReceiver(this, filter, null, mHandler);
if (!mRegistered) {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
mContext.registerReceiver(this, filter, null, mHandler);
mRegistered = true;
}
}
public void unregister() {
mContext.unregisterReceiver(this);
if (mRegistered) {
mContext.unregisterReceiver(this);
mRegistered = false;
}
}
}
}