diff options
author | Long Ling <longling@google.com> | 2019-08-17 18:02:46 -0700 |
---|---|---|
committer | Long Ling <longling@google.com> | 2019-08-21 13:42:03 -0700 |
commit | 86ce8f764b72c42dcca6f9871282749187b08c1d (patch) | |
tree | f183865c73d40692c02f25346b46a6071fe006ac | |
parent | 6f13f122134f8c866a74c769ac0c6a86cc79acae (diff) | |
download | base-86ce8f764b72c42dcca6f9871282749187b08c1d.tar.gz |
DO NOT MERGE DMD: Support minimum refresh rate
Bug: 139685237
Change-Id: Ib41dee351276d70733fffa18620455e4e6f9ddfc
3 files changed, 61 insertions, 24 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index bf8b0066cb64..a40eb3a91814 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -3477,6 +3477,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. * * If this isn't set, the system falls back to a device specific default. diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 88bda9d64084..170f05c67e27 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -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 ); diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 5331aadec093..97fd02f53513 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -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; + } } } } |