From 176a63a1db61df4fb463d2f5101b88d68c40c818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wilczy=C5=84ski?= Date: Tue, 26 Sep 2023 09:52:21 +0000 Subject: [PATCH] Back up peak refresh rate and min refresh rate It's possible that in the future the peak refresh rate setting will have multiple values (e.g. 90, 120). For that reason, we shouldn't convert it to a boolean like in the previous CLs (ag/24604787, ag/24604847). - set peak/min refresh rate to infinity if it's the highest refresh rate so that when we restore the setting on another device, we also choose the highest refresh rate - back up peak/min refresh rate and add validators - upgrade settings in SettingsProvider - create a utils class - RefreshRateSettingsUtils Bug: 211737588 Test: atest DisplayModeDirectorTest Test: atest ForcePeakRefreshRatePreferenceControllerTest Test: atest PeakRefreshRatePreferenceControllerTest Test: atest SettingsBackupTest Test: atest SettingsProviderTest Test: atest RefreshRateSettingsUtilsTest Change-Id: Ie1d8cfc76e42c7d98c4a36743463ccaf3ca5d483 --- ...cePeakRefreshRatePreferenceController.java | 36 ++++------------ .../PeakRefreshRatePreferenceController.java | 39 ++++++------------ ...akRefreshRatePreferenceControllerTest.java | 7 ++-- ...akRefreshRatePreferenceControllerTest.java | 41 ++++++++++++------- 4 files changed, 49 insertions(+), 74 deletions(-) diff --git a/src/com/android/settings/development/ForcePeakRefreshRatePreferenceController.java b/src/com/android/settings/development/ForcePeakRefreshRatePreferenceController.java index d5d40254fa8..a967888b0f6 100644 --- a/src/com/android/settings/development/ForcePeakRefreshRatePreferenceController.java +++ b/src/com/android/settings/development/ForcePeakRefreshRatePreferenceController.java @@ -16,11 +16,12 @@ package com.android.settings.development; +import static com.android.internal.display.RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE; +import static com.android.internal.display.RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay; + import android.content.Context; -import android.hardware.display.DisplayManager; import android.provider.Settings; import android.util.Log; -import android.view.Display; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; @@ -34,9 +35,6 @@ import com.android.settingslib.development.DeveloperOptionsPreferenceController; public class ForcePeakRefreshRatePreferenceController extends DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin { - @VisibleForTesting - static float DEFAULT_REFRESH_RATE = 60f; - @VisibleForTesting static float NO_CONFIG = 0f; @@ -48,17 +46,7 @@ public class ForcePeakRefreshRatePreferenceController extends DeveloperOptionsPr public ForcePeakRefreshRatePreferenceController(Context context) { super(context); - - final DisplayManager dm = context.getSystemService(DisplayManager.class); - final Display display = dm.getDisplay(Display.DEFAULT_DISPLAY); - - if (display == null) { - Log.w(TAG, "No valid default display device"); - mPeakRefreshRate = DEFAULT_REFRESH_RATE; - } else { - mPeakRefreshRate = findPeakRefreshRate(display.getSupportedModes()); - } - + mPeakRefreshRate = findHighestRefreshRateForDefaultDisplay(context); Log.d(TAG, "DEFAULT_REFRESH_RATE : " + DEFAULT_REFRESH_RATE + " mPeakRefreshRate : " + mPeakRefreshRate); } @@ -107,7 +95,7 @@ public class ForcePeakRefreshRatePreferenceController extends DeveloperOptionsPr @VisibleForTesting void forcePeakRefreshRate(boolean enable) { - final float peakRefreshRate = enable ? mPeakRefreshRate : NO_CONFIG; + final float peakRefreshRate = enable ? Float.POSITIVE_INFINITY : NO_CONFIG; Settings.System.putFloat(mContext.getContentResolver(), Settings.System.MIN_REFRESH_RATE, peakRefreshRate); } @@ -116,17 +104,7 @@ public class ForcePeakRefreshRatePreferenceController extends DeveloperOptionsPr final float peakRefreshRate = Settings.System.getFloat(mContext.getContentResolver(), Settings.System.MIN_REFRESH_RATE, NO_CONFIG); - return peakRefreshRate >= mPeakRefreshRate; - } - - private float findPeakRefreshRate(Display.Mode[] modes) { - float peakRefreshRate = DEFAULT_REFRESH_RATE; - for (Display.Mode mode : modes) { - if (Math.round(mode.getRefreshRate()) > peakRefreshRate) { - peakRefreshRate = mode.getRefreshRate(); - } - } - - return peakRefreshRate; + return Math.round(peakRefreshRate) == Math.round(mPeakRefreshRate) + || Float.isInfinite(peakRefreshRate); } } diff --git a/src/com/android/settings/display/PeakRefreshRatePreferenceController.java b/src/com/android/settings/display/PeakRefreshRatePreferenceController.java index dfcc601fff3..c24ad22e363 100644 --- a/src/com/android/settings/display/PeakRefreshRatePreferenceController.java +++ b/src/com/android/settings/display/PeakRefreshRatePreferenceController.java @@ -16,13 +16,15 @@ package com.android.settings.display; +import static com.android.internal.display.RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE; +import static com.android.internal.display.RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay; + import android.content.Context; import android.hardware.display.DisplayManager; import android.os.Handler; import android.provider.DeviceConfig; import android.provider.Settings; import android.util.Log; -import android.view.Display; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; @@ -39,8 +41,6 @@ import java.util.concurrent.Executor; public class PeakRefreshRatePreferenceController extends TogglePreferenceController implements LifecycleObserver, OnStart, OnStop { - @VisibleForTesting static float DEFAULT_REFRESH_RATE = 60f; - @VisibleForTesting float mPeakRefreshRate; private static final String TAG = "RefreshRatePrefCtr"; @@ -48,7 +48,7 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl private final Handler mHandler; private final IDeviceConfigChange mOnDeviceConfigChange; - private final DeviceConfigDisplaySettings mDeviceConfigDisplaySettings; + private DeviceConfigDisplaySettings mDeviceConfigDisplaySettings; private Preference mPreference; private interface IDeviceConfigChange { @@ -65,17 +65,7 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl updateState(mPreference); } }; - - 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"); - mPeakRefreshRate = DEFAULT_REFRESH_RATE; - } else { - mPeakRefreshRate = findPeakRefreshRate(display.getSupportedModes()); - } - + mPeakRefreshRate = findHighestRefreshRateForDefaultDisplay(context); Log.d( TAG, "DEFAULT_REFRESH_RATE : " @@ -111,12 +101,13 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl mContext.getContentResolver(), Settings.System.PEAK_REFRESH_RATE, getDefaultPeakRefreshRate()); - return Math.round(peakRefreshRate) == Math.round(mPeakRefreshRate); + return Math.round(peakRefreshRate) == Math.round(mPeakRefreshRate) + || Float.isInfinite(peakRefreshRate); } @Override public boolean setChecked(boolean isChecked) { - final float peakRefreshRate = isChecked ? mPeakRefreshRate : DEFAULT_REFRESH_RATE; + final float peakRefreshRate = isChecked ? Float.POSITIVE_INFINITY : DEFAULT_REFRESH_RATE; Log.d(TAG, "setChecked to : " + peakRefreshRate); return Settings.System.putFloat( @@ -139,17 +130,13 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl } @VisibleForTesting - float findPeakRefreshRate(Display.Mode[] modes) { - float peakRefreshRate = DEFAULT_REFRESH_RATE; - for (Display.Mode mode : modes) { - if (Math.round(mode.getRefreshRate()) > peakRefreshRate) { - peakRefreshRate = mode.getRefreshRate(); - } - } - return peakRefreshRate; + void injectDeviceConfigDisplaySettings( + DeviceConfigDisplaySettings deviceConfigDisplaySettings) { + mDeviceConfigDisplaySettings = deviceConfigDisplaySettings; } - private class DeviceConfigDisplaySettings + @VisibleForTesting + class DeviceConfigDisplaySettings implements DeviceConfig.OnPropertiesChangedListener, Executor { public void startListening() { DeviceConfig.addOnPropertiesChangedListener( diff --git a/tests/robotests/src/com/android/settings/development/ForcePeakRefreshRatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/ForcePeakRefreshRatePreferenceControllerTest.java index 2e93d5ef9ca..c5cc8564cd7 100644 --- a/tests/robotests/src/com/android/settings/development/ForcePeakRefreshRatePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/ForcePeakRefreshRatePreferenceControllerTest.java @@ -16,8 +16,9 @@ package com.android.settings.development; -import static com.android.settings.development.ForcePeakRefreshRatePreferenceController.DEFAULT_REFRESH_RATE; +import static com.android.internal.display.RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE; import static com.android.settings.development.ForcePeakRefreshRatePreferenceController.NO_CONFIG; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.verify; @@ -38,8 +39,6 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; -import android.util.Log; - @RunWith(RobolectricTestRunner.class) public class ForcePeakRefreshRatePreferenceControllerTest { @@ -68,7 +67,7 @@ public class ForcePeakRefreshRatePreferenceControllerTest { mController.onPreferenceChange(mPreference, true); assertThat(Settings.System.getFloat(mContext.getContentResolver(), - Settings.System.MIN_REFRESH_RATE, NO_CONFIG)).isEqualTo(88f); + Settings.System.MIN_REFRESH_RATE, NO_CONFIG)).isPositiveInfinity(); } @Test diff --git a/tests/robotests/src/com/android/settings/display/PeakRefreshRatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/PeakRefreshRatePreferenceControllerTest.java index aaeeea4f368..8b2c4454a18 100644 --- a/tests/robotests/src/com/android/settings/display/PeakRefreshRatePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/PeakRefreshRatePreferenceControllerTest.java @@ -16,21 +16,24 @@ package com.android.settings.display; +import static com.android.internal.display.RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE; 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 static org.mockito.Mockito.when; + import android.content.Context; import android.provider.Settings; -import android.view.Display; import androidx.preference.SwitchPreference; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @@ -42,10 +45,16 @@ public class PeakRefreshRatePreferenceControllerTest { private PeakRefreshRatePreferenceController mController; private SwitchPreference mPreference; + @Mock + private PeakRefreshRatePreferenceController.DeviceConfigDisplaySettings + mDeviceConfigDisplaySettings; + @Before public void setUp() { + MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; mController = new PeakRefreshRatePreferenceController(mContext, "key"); + mController.injectDeviceConfigDisplaySettings(mDeviceConfigDisplaySettings); mPreference = new SwitchPreference(RuntimeEnvironment.application); } @@ -70,13 +79,13 @@ public class PeakRefreshRatePreferenceControllerTest { } @Test - public void setChecked_enableSmoothDisplay_setCurrentRefreshRate() { + public void setChecked_enableSmoothDisplay_setRefreshRateToInfinity() { mController.mPeakRefreshRate = 88f; mController.setChecked(true); assertThat(Settings.System.getFloat(mContext.getContentResolver(), Settings.System.PEAK_REFRESH_RATE, DEFAULT_REFRESH_RATE)) - .isEqualTo(88.0f); + .isPositiveInfinity(); } @Test @@ -104,18 +113,20 @@ public class PeakRefreshRatePreferenceControllerTest { } @Test - public void findPeakRefreshRate_moreThanOneHigherThanDefault() { - Display.Mode lower = new Display.Mode(0, 0, 0, DEFAULT_REFRESH_RATE - 1); - Display.Mode def = new Display.Mode(0, 0, 0, DEFAULT_REFRESH_RATE); - Display.Mode higher = new Display.Mode(0, 0, 0, DEFAULT_REFRESH_RATE + 1); - Display.Mode higher1 = new Display.Mode(0, 0, 0, DEFAULT_REFRESH_RATE + 2); + public void isChecked_default_returnTrue() { + mController.mPeakRefreshRate = 88f; + when(mDeviceConfigDisplaySettings.getDefaultPeakRefreshRate()) + .thenReturn(mController.mPeakRefreshRate); - assertThat(mController.findPeakRefreshRate( - new Display.Mode[] {lower, def, higher, higher1})) - .isEqualTo(DEFAULT_REFRESH_RATE + 2); - assertThat(mController.findPeakRefreshRate( - new Display.Mode[] {lower, def, higher1, higher})) - .isEqualTo(DEFAULT_REFRESH_RATE + 2); + assertThat(mController.isChecked()).isTrue(); + } + + @Test + public void isChecked_default_returnFalse() { + mController.mPeakRefreshRate = 88f; + when(mDeviceConfigDisplaySettings.getDefaultPeakRefreshRate()).thenReturn(60f); + + assertThat(mController.isChecked()).isFalse(); } private void enableSmoothDisplayPreference() {