diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml
index 5fa9af27360cc8b23e8fb55bd16573d67e48207b..1dc4b7e3dd76e11fc174e123acd6920affaa4273 100644
--- a/res/values/cm_strings.xml
+++ b/res/values/cm_strings.xml
@@ -121,6 +121,9 @@
Minimum refresh rate
+
+ Peak refresh rate
+
Navigation hint
Show navigation hint bar at the bottom of the screen
diff --git a/res/values/lineage_config.xml b/res/values/lineage_config.xml
index c4223fc0085bcdfc5debe2fa5831e5d6b851bc54..a44a28d8055b637100270d3e19596f4bd0d67ec1 100644
--- a/res/values/lineage_config.xml
+++ b/res/values/lineage_config.xml
@@ -31,4 +31,7 @@
false
+
+
+ false
diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml
index f407db94c33d624615f3aa9688f4c3291df9f2d1..925cbb909e64d293cb3d3e3b7c46e8209d661840 100644
--- a/res/xml/display_settings.xml
+++ b/res/xml/display_settings.xml
@@ -113,6 +113,12 @@
android:summary="@string/summary_placeholder"
settings:controller="com.android.settings.display.MinRefreshRatePreferenceController" />
+
+
mEntries = new ArrayList<>();
+ private List mValues = new ArrayList<>();
+
+ private interface IDeviceConfigChange {
+ void onDefaultRefreshRateChanged();
+ }
+
+ public PeakRefreshRateListPreferenceController(Context context, String key) {
+ super(context, key);
+ mHandler = new Handler(context.getMainLooper());
+ mDeviceConfigDisplaySettings = new DeviceConfigDisplaySettings();
+ mOnDeviceConfigChange =
+ new IDeviceConfigChange() {
+ public void onDefaultRefreshRateChanged() {
+ updateState(mListPreference);
+ }
+ };
+
+ final DisplayManager dm = mContext.getSystemService(DisplayManager.class);
+ final Display display = dm.getDisplay(Display.DEFAULT_DISPLAY);
+
+ if (display == null) {
+ Log.w(TAG, "No valid default display device");
+ } else {
+ Display.Mode mode = display.getMode();
+ Display.Mode[] modes = display.getSupportedModes();
+ for (Display.Mode m : modes) {
+ if (m.getPhysicalWidth() == mode.getPhysicalWidth() &&
+ m.getPhysicalHeight() == mode.getPhysicalHeight()) {
+ mEntries.add(String.format("%.02fHz", m.getRefreshRate())
+ .replaceAll("[\\.,]00", ""));
+ mValues.add(String.format(Locale.US, "%.02f", m.getRefreshRate()));
+ }
+ }
+ }
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+
+ mListPreference = screen.findPreference(getPreferenceKey());
+ mListPreference.setEntries(mEntries.toArray(new String[mEntries.size()]));
+ mListPreference.setEntryValues(mValues.toArray(new String[mValues.size()]));
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ if (mContext.getResources().getBoolean(R.bool.config_show_peak_refresh_rate_switch)) {
+ return AVAILABLE;
+ } else {
+ return UNSUPPORTED_ON_DEVICE;
+ }
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ final float currentValue = Settings.System.getFloat(mContext.getContentResolver(),
+ Settings.System.PEAK_REFRESH_RATE, getDefaultPeakRefreshRate());
+ int index = mListPreference.findIndexOfValue(
+ String.format(Locale.US, "%.02f", currentValue));
+ if (index < 0) index = 0;
+ mListPreference.setValueIndex(index);
+ mListPreference.setSummary(mListPreference.getEntries()[index]);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ Settings.System.putFloat(mContext.getContentResolver(), Settings.System.PEAK_REFRESH_RATE,
+ Float.valueOf((String) newValue));
+ updateState(preference);
+ return true;
+ }
+
+ @Override
+ public void onStart() {
+ mDeviceConfigDisplaySettings.startListening();
+ }
+
+ @Override
+ public void onStop() {
+ mDeviceConfigDisplaySettings.stopListening();
+ }
+
+ private float findPeakRefreshRate(Display.Mode[] modes) {
+ float peakRefreshRate = DEFAULT_REFRESH_RATE;
+ for (Display.Mode mode : modes) {
+ if (Math.round(mode.getRefreshRate()) > DEFAULT_REFRESH_RATE) {
+ peakRefreshRate = mode.getRefreshRate();
+ }
+ }
+ return peakRefreshRate;
+ }
+
+ private class DeviceConfigDisplaySettings
+ implements DeviceConfig.OnPropertiesChangedListener, Executor {
+ public void startListening() {
+ DeviceConfig.addOnPropertiesChangedListener(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ this /* Executor */,
+ this /* Listener */);
+ }
+
+ public void stopListening() {
+ DeviceConfig.removeOnPropertiesChangedListener(this);
+ }
+
+ public float getDefaultPeakRefreshRate() {
+ float defaultPeakRefreshRate =
+ DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_DISPLAY_MANAGER,
+ DisplayManager.DeviceConfig.KEY_PEAK_REFRESH_RATE_DEFAULT,
+ INVALIDATE_REFRESH_RATE);
+ Log.d(TAG, "DeviceConfig getDefaultPeakRefreshRate : " + defaultPeakRefreshRate);
+
+ return defaultPeakRefreshRate;
+ }
+
+ @Override
+ public void onPropertiesChanged(DeviceConfig.Properties properties) {
+ // Got notified if any property has been changed in NAMESPACE_DISPLAY_MANAGER. The
+ // KEY_PEAK_REFRESH_RATE_DEFAULT value could be added, changed, removed or unchanged.
+ // Just force a UI update for any case.
+ if (mOnDeviceConfigChange != null) {
+ mOnDeviceConfigChange.onDefaultRefreshRateChanged();
+ updateState(mListPreference);
+ }
+ }
+
+ @Override
+ public void execute(Runnable runnable) {
+ if (mHandler != null) {
+ mHandler.post(runnable);
+ }
+ }
+ }
+
+ private float getDefaultPeakRefreshRate() {
+ float defaultPeakRefreshRate = mDeviceConfigDisplaySettings.getDefaultPeakRefreshRate();
+ if (defaultPeakRefreshRate == INVALIDATE_REFRESH_RATE) {
+ defaultPeakRefreshRate = (float) mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_defaultPeakRefreshRate);
+ }
+
+ return defaultPeakRefreshRate;
+ }
+}
diff --git a/src/com/android/settings/security/screenlock/PinScramblePreferenceController.java b/src/com/android/settings/security/screenlock/PinScramblePreferenceController.java
index 6d7ae8a20cbcfa8ec8c8871a9ac4d612d81f6d2e..f4376c70b3eb460eae64f6f52b56a145f4ced5cd 100644
--- a/src/com/android/settings/security/screenlock/PinScramblePreferenceController.java
+++ b/src/com/android/settings/security/screenlock/PinScramblePreferenceController.java
@@ -18,6 +18,7 @@ package com.android.settings.security.screenlock;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
+import android.os.UserHandle;
import androidx.preference.Preference;
import androidx.preference.TwoStatePreference;
@@ -54,10 +55,10 @@ public class PinScramblePreferenceController extends AbstractPreferenceControlle
@Override
public void updateState(Preference preference) {
- ((TwoStatePreference) preference).setChecked(LineageSettings.System.getInt(
+ ((TwoStatePreference) preference).setChecked(LineageSettings.System.getIntForUser(
mContext.getContentResolver(),
LineageSettings.System.LOCKSCREEN_PIN_SCRAMBLE_LAYOUT,
- 0) == 1);
+ 0, UserHandle.USER_CURRENT) == 1);
}
private boolean isPinLock() {
@@ -69,10 +70,10 @@ public class PinScramblePreferenceController extends AbstractPreferenceControlle
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
- LineageSettings.System.putInt(
+ LineageSettings.System.putIntForUser(
mContext.getContentResolver(),
LineageSettings.System.LOCKSCREEN_PIN_SCRAMBLE_LAYOUT,
- (Boolean) newValue ? 1 : 0);
+ (Boolean) newValue ? 1 : 0, UserHandle.USER_CURRENT);
return true;
}
}