diff --git a/res/values/config.xml b/res/values/config.xml index 876af371986..746d3e7d85e 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -459,4 +459,7 @@ false + + + false diff --git a/res/values/strings.xml b/res/values/strings.xml index 369115cdd4b..0d1f3d740a5 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2746,6 +2746,10 @@ Display white balance + + Smooth Display + + Automatically raises the refresh rate from 60 to 90 Hz for some content. Increases battery usage. Screen attention diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml index d463a845adf..30dad017496 100644 --- a/res/xml/display_settings.xml +++ b/res/xml/display_settings.xml @@ -97,6 +97,12 @@ android:summary="@string/display_white_balance_summary" settings:controller="com.android.settings.display.DisplayWhiteBalancePreferenceController" /> + + DEFAULT_REFRESH_RATE ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + } else { + return UNSUPPORTED_ON_DEVICE; + } + } + + @Override + public boolean isChecked() { + final float peakRefreshRate = + Settings.System.getFloat( + mContext.getContentResolver(), + Settings.System.PEAK_REFRESH_RATE, + getDefaultPeakRefreshRate()); + return peakRefreshRate == mPeakRefreshRate; + } + + @Override + public boolean setChecked(boolean isChecked) { + final float peakRefreshRate = isChecked ? mPeakRefreshRate : DEFAULT_REFRESH_RATE; + Log.d(TAG, "setChecked to : " + peakRefreshRate); + + return Settings.System.putFloat( + mContext.getContentResolver(), Settings.System.PEAK_REFRESH_RATE, peakRefreshRate); + } + + @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(mPreference); + } + } + + @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/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml index c7173bc61d8..ff17891fef0 100644 --- a/tests/robotests/res/values-mcc999/config.xml +++ b/tests/robotests/res/values-mcc999/config.xml @@ -68,6 +68,7 @@ true false false + false false diff --git a/tests/robotests/res/values/config.xml b/tests/robotests/res/values/config.xml index 3f1c9f1ccde..d315a6609ab 100644 --- a/tests/robotests/res/values/config.xml +++ b/tests/robotests/res/values/config.xml @@ -20,6 +20,7 @@ true true true + true diff --git a/tests/robotests/src/com/android/settings/display/PeakRefreshRatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/PeakRefreshRatePreferenceControllerTest.java new file mode 100644 index 00000000000..cae7d896916 --- /dev/null +++ b/tests/robotests/src/com/android/settings/display/PeakRefreshRatePreferenceControllerTest.java @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.settings.display; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; +import static com.android.settings.display.PeakRefreshRatePreferenceController.DEFAULT_REFRESH_RATE; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.provider.Settings; + +import androidx.preference.SwitchPreference; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(RobolectricTestRunner.class) +public class PeakRefreshRatePreferenceControllerTest { + + private Context mContext; + private PeakRefreshRatePreferenceController mController; + private SwitchPreference mPreference; + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + mController = new PeakRefreshRatePreferenceController(mContext, "key"); + mPreference = new SwitchPreference(RuntimeEnvironment.application); + } + + @Test + @Config(qualifiers = "mcc999") + public void getAvailabilityStatus_withConfigNoShow_returnUnsupported() { + assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); + } + + @Test + public void getAvailabilityStatus_refreshRateLargerThanDefault_returnAvailable() { + mController.mPeakRefreshRate = DEFAULT_REFRESH_RATE + 1; + + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); + } + + @Test + public void getAvailabilityStatus_refreshRateEqualToDefault_returnUnsupported() { + mController.mPeakRefreshRate = DEFAULT_REFRESH_RATE; + + assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); + } + + @Test + public void setChecked_enableSmoothDisplay_setCurrentRefreshRate() { + mController.mPeakRefreshRate = 88f; + mController.setChecked(true); + + assertThat(Settings.System.getFloat(mContext.getContentResolver(), + Settings.System.PEAK_REFRESH_RATE, DEFAULT_REFRESH_RATE)) + .isEqualTo(88.0f); + } + + @Test + public void setChecked_disableSmoothDisplay_setDefaultRefreshRate() { + mController.mPeakRefreshRate = 88f; + mController.setChecked(false); + + assertThat(Settings.System.getFloat(mContext.getContentResolver(), + Settings.System.PEAK_REFRESH_RATE, DEFAULT_REFRESH_RATE)) + .isEqualTo(DEFAULT_REFRESH_RATE); + } + + @Test + public void isChecked_enableSmoothDisplay_returnTrue() { + enableSmoothDisplayPreference(); + + assertThat(mController.isChecked()).isTrue(); + } + + @Test + public void isChecked_disableSmoothDisplay_returnFalse() { + disableSmoothDisplayPreference(); + + assertThat(mController.isChecked()).isFalse(); + } + + private void enableSmoothDisplayPreference() { + mController.mPeakRefreshRate = 88f; + + Settings.System.putFloat( + mContext.getContentResolver(), + Settings.System.PEAK_REFRESH_RATE, + mController.mPeakRefreshRate); + } + + private void disableSmoothDisplayPreference() { + mController.mPeakRefreshRate = 88f; + + Settings.System.putFloat( + mContext.getContentResolver(), + Settings.System.PEAK_REFRESH_RATE, + DEFAULT_REFRESH_RATE); + } +}