summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLong Ling <longling@google.com>2019-08-17 18:02:46 -0700
committerLong Ling <longling@google.com>2019-08-21 13:42:03 -0700
commit86ce8f764b72c42dcca6f9871282749187b08c1d (patch)
treef183865c73d40692c02f25346b46a6071fe006ac
parent6f13f122134f8c866a74c769ac0c6a86cc79acae (diff)
downloadbase-86ce8f764b72c42dcca6f9871282749187b08c1d.tar.gz
DO NOT MERGE DMD: Support minimum refresh rate
Bug: 139685237 Change-Id: Ib41dee351276d70733fffa18620455e4e6f9ddfc
-rw-r--r--core/java/android/provider/Settings.java8
-rw-r--r--core/tests/coretests/src/android/provider/SettingsBackupTest.java1
-rw-r--r--services/core/java/com/android/server/display/DisplayModeDirector.java76
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;
+ }
}
}
}