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
This commit is contained in:
Piotr Wilczyński
2023-09-26 09:52:21 +00:00
parent b7f8c15ff0
commit 176a63a1db
4 changed files with 49 additions and 74 deletions

View File

@@ -16,11 +16,12 @@
package com.android.settings.development; 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.content.Context;
import android.hardware.display.DisplayManager;
import android.provider.Settings; import android.provider.Settings;
import android.util.Log; import android.util.Log;
import android.view.Display;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference; import androidx.preference.Preference;
@@ -34,9 +35,6 @@ import com.android.settingslib.development.DeveloperOptionsPreferenceController;
public class ForcePeakRefreshRatePreferenceController extends DeveloperOptionsPreferenceController public class ForcePeakRefreshRatePreferenceController extends DeveloperOptionsPreferenceController
implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin { implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
@VisibleForTesting
static float DEFAULT_REFRESH_RATE = 60f;
@VisibleForTesting @VisibleForTesting
static float NO_CONFIG = 0f; static float NO_CONFIG = 0f;
@@ -48,17 +46,7 @@ public class ForcePeakRefreshRatePreferenceController extends DeveloperOptionsPr
public ForcePeakRefreshRatePreferenceController(Context context) { public ForcePeakRefreshRatePreferenceController(Context context) {
super(context); super(context);
mPeakRefreshRate = findHighestRefreshRateForDefaultDisplay(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());
}
Log.d(TAG, "DEFAULT_REFRESH_RATE : " + DEFAULT_REFRESH_RATE Log.d(TAG, "DEFAULT_REFRESH_RATE : " + DEFAULT_REFRESH_RATE
+ " mPeakRefreshRate : " + mPeakRefreshRate); + " mPeakRefreshRate : " + mPeakRefreshRate);
} }
@@ -107,7 +95,7 @@ public class ForcePeakRefreshRatePreferenceController extends DeveloperOptionsPr
@VisibleForTesting @VisibleForTesting
void forcePeakRefreshRate(boolean enable) { 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.putFloat(mContext.getContentResolver(),
Settings.System.MIN_REFRESH_RATE, peakRefreshRate); Settings.System.MIN_REFRESH_RATE, peakRefreshRate);
} }
@@ -116,17 +104,7 @@ public class ForcePeakRefreshRatePreferenceController extends DeveloperOptionsPr
final float peakRefreshRate = Settings.System.getFloat(mContext.getContentResolver(), final float peakRefreshRate = Settings.System.getFloat(mContext.getContentResolver(),
Settings.System.MIN_REFRESH_RATE, NO_CONFIG); Settings.System.MIN_REFRESH_RATE, NO_CONFIG);
return peakRefreshRate >= mPeakRefreshRate; return Math.round(peakRefreshRate) == Math.round(mPeakRefreshRate)
} || Float.isInfinite(peakRefreshRate);
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;
} }
} }

View File

@@ -16,13 +16,15 @@
package com.android.settings.display; 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.content.Context;
import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager;
import android.os.Handler; import android.os.Handler;
import android.provider.DeviceConfig; import android.provider.DeviceConfig;
import android.provider.Settings; import android.provider.Settings;
import android.util.Log; import android.util.Log;
import android.view.Display;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference; import androidx.preference.Preference;
@@ -39,8 +41,6 @@ import java.util.concurrent.Executor;
public class PeakRefreshRatePreferenceController extends TogglePreferenceController public class PeakRefreshRatePreferenceController extends TogglePreferenceController
implements LifecycleObserver, OnStart, OnStop { implements LifecycleObserver, OnStart, OnStop {
@VisibleForTesting static float DEFAULT_REFRESH_RATE = 60f;
@VisibleForTesting float mPeakRefreshRate; @VisibleForTesting float mPeakRefreshRate;
private static final String TAG = "RefreshRatePrefCtr"; private static final String TAG = "RefreshRatePrefCtr";
@@ -48,7 +48,7 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl
private final Handler mHandler; private final Handler mHandler;
private final IDeviceConfigChange mOnDeviceConfigChange; private final IDeviceConfigChange mOnDeviceConfigChange;
private final DeviceConfigDisplaySettings mDeviceConfigDisplaySettings; private DeviceConfigDisplaySettings mDeviceConfigDisplaySettings;
private Preference mPreference; private Preference mPreference;
private interface IDeviceConfigChange { private interface IDeviceConfigChange {
@@ -65,17 +65,7 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl
updateState(mPreference); updateState(mPreference);
} }
}; };
mPeakRefreshRate = findHighestRefreshRateForDefaultDisplay(context);
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());
}
Log.d( Log.d(
TAG, TAG,
"DEFAULT_REFRESH_RATE : " "DEFAULT_REFRESH_RATE : "
@@ -111,12 +101,13 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl
mContext.getContentResolver(), mContext.getContentResolver(),
Settings.System.PEAK_REFRESH_RATE, Settings.System.PEAK_REFRESH_RATE,
getDefaultPeakRefreshRate()); getDefaultPeakRefreshRate());
return Math.round(peakRefreshRate) == Math.round(mPeakRefreshRate); return Math.round(peakRefreshRate) == Math.round(mPeakRefreshRate)
|| Float.isInfinite(peakRefreshRate);
} }
@Override @Override
public boolean setChecked(boolean isChecked) { 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); Log.d(TAG, "setChecked to : " + peakRefreshRate);
return Settings.System.putFloat( return Settings.System.putFloat(
@@ -139,17 +130,13 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl
} }
@VisibleForTesting @VisibleForTesting
float findPeakRefreshRate(Display.Mode[] modes) { void injectDeviceConfigDisplaySettings(
float peakRefreshRate = DEFAULT_REFRESH_RATE; DeviceConfigDisplaySettings deviceConfigDisplaySettings) {
for (Display.Mode mode : modes) { mDeviceConfigDisplaySettings = deviceConfigDisplaySettings;
if (Math.round(mode.getRefreshRate()) > peakRefreshRate) {
peakRefreshRate = mode.getRefreshRate();
}
}
return peakRefreshRate;
} }
private class DeviceConfigDisplaySettings @VisibleForTesting
class DeviceConfigDisplaySettings
implements DeviceConfig.OnPropertiesChangedListener, Executor { implements DeviceConfig.OnPropertiesChangedListener, Executor {
public void startListening() { public void startListening() {
DeviceConfig.addOnPropertiesChangedListener( DeviceConfig.addOnPropertiesChangedListener(

View File

@@ -16,8 +16,9 @@
package com.android.settings.development; 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.android.settings.development.ForcePeakRefreshRatePreferenceController.NO_CONFIG;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
@@ -38,8 +39,6 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import android.util.Log;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class ForcePeakRefreshRatePreferenceControllerTest { public class ForcePeakRefreshRatePreferenceControllerTest {
@@ -68,7 +67,7 @@ public class ForcePeakRefreshRatePreferenceControllerTest {
mController.onPreferenceChange(mPreference, true); mController.onPreferenceChange(mPreference, true);
assertThat(Settings.System.getFloat(mContext.getContentResolver(), assertThat(Settings.System.getFloat(mContext.getContentResolver(),
Settings.System.MIN_REFRESH_RATE, NO_CONFIG)).isEqualTo(88f); Settings.System.MIN_REFRESH_RATE, NO_CONFIG)).isPositiveInfinity();
} }
@Test @Test

View File

@@ -16,21 +16,24 @@
package com.android.settings.display; 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.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; 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 com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.provider.Settings; import android.provider.Settings;
import android.view.Display;
import androidx.preference.SwitchPreference; import androidx.preference.SwitchPreference;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
@@ -42,10 +45,16 @@ public class PeakRefreshRatePreferenceControllerTest {
private PeakRefreshRatePreferenceController mController; private PeakRefreshRatePreferenceController mController;
private SwitchPreference mPreference; private SwitchPreference mPreference;
@Mock
private PeakRefreshRatePreferenceController.DeviceConfigDisplaySettings
mDeviceConfigDisplaySettings;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application; mContext = RuntimeEnvironment.application;
mController = new PeakRefreshRatePreferenceController(mContext, "key"); mController = new PeakRefreshRatePreferenceController(mContext, "key");
mController.injectDeviceConfigDisplaySettings(mDeviceConfigDisplaySettings);
mPreference = new SwitchPreference(RuntimeEnvironment.application); mPreference = new SwitchPreference(RuntimeEnvironment.application);
} }
@@ -70,13 +79,13 @@ public class PeakRefreshRatePreferenceControllerTest {
} }
@Test @Test
public void setChecked_enableSmoothDisplay_setCurrentRefreshRate() { public void setChecked_enableSmoothDisplay_setRefreshRateToInfinity() {
mController.mPeakRefreshRate = 88f; mController.mPeakRefreshRate = 88f;
mController.setChecked(true); mController.setChecked(true);
assertThat(Settings.System.getFloat(mContext.getContentResolver(), assertThat(Settings.System.getFloat(mContext.getContentResolver(),
Settings.System.PEAK_REFRESH_RATE, DEFAULT_REFRESH_RATE)) Settings.System.PEAK_REFRESH_RATE, DEFAULT_REFRESH_RATE))
.isEqualTo(88.0f); .isPositiveInfinity();
} }
@Test @Test
@@ -104,18 +113,20 @@ public class PeakRefreshRatePreferenceControllerTest {
} }
@Test @Test
public void findPeakRefreshRate_moreThanOneHigherThanDefault() { public void isChecked_default_returnTrue() {
Display.Mode lower = new Display.Mode(0, 0, 0, DEFAULT_REFRESH_RATE - 1); mController.mPeakRefreshRate = 88f;
Display.Mode def = new Display.Mode(0, 0, 0, DEFAULT_REFRESH_RATE); when(mDeviceConfigDisplaySettings.getDefaultPeakRefreshRate())
Display.Mode higher = new Display.Mode(0, 0, 0, DEFAULT_REFRESH_RATE + 1); .thenReturn(mController.mPeakRefreshRate);
Display.Mode higher1 = new Display.Mode(0, 0, 0, DEFAULT_REFRESH_RATE + 2);
assertThat(mController.findPeakRefreshRate( assertThat(mController.isChecked()).isTrue();
new Display.Mode[] {lower, def, higher, higher1})) }
.isEqualTo(DEFAULT_REFRESH_RATE + 2);
assertThat(mController.findPeakRefreshRate( @Test
new Display.Mode[] {lower, def, higher1, higher})) public void isChecked_default_returnFalse() {
.isEqualTo(DEFAULT_REFRESH_RATE + 2); mController.mPeakRefreshRate = 88f;
when(mDeviceConfigDisplaySettings.getDefaultPeakRefreshRate()).thenReturn(60f);
assertThat(mController.isChecked()).isFalse();
} }
private void enableSmoothDisplayPreference() { private void enableSmoothDisplayPreference() {