diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml index aab4b0072f7..3c388770331 100644 --- a/res/values/cm_strings.xml +++ b/res/values/cm_strings.xml @@ -64,6 +64,9 @@ Show pattern dots + + Peak refresh rate + Locate the fingerprint sensor on the front of your tablet. Locate the fingerprint sensor on the front of your device. diff --git a/res/values/lineage_config.xml b/res/values/lineage_config.xml index d718e740ec8..ec0d46865ae 100644 --- a/res/values/lineage_config.xml +++ b/res/values/lineage_config.xml @@ -25,4 +25,7 @@ com.android.localtransport/.LocalTransport + + + false diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml index 03f602b2aaa..60665309a9a 100644 --- a/res/xml/display_settings.xml +++ b/res/xml/display_settings.xml @@ -171,6 +171,12 @@ android:summary="@string/display_white_balance_summary" settings:controller="com.android.settings.display.DisplayWhiteBalancePreferenceController"/> + + 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(); + Arrays.sort(modes, (mode1, mode2) -> + Float.compare(mode2.getRefreshRate(), mode1.getRefreshRate())); + 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; + } +}