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; } }