Merge "Revert "Back up the smooth display setting"" into udc-d1-dev

This commit is contained in:
Piotr Wilczyński
2023-04-27 16:06:37 +00:00
committed by Android (Google) Code Review
4 changed files with 133 additions and 44 deletions

View File

@@ -16,18 +16,17 @@
package com.android.settings.development; package com.android.settings.development;
import static com.android.internal.display.RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE;
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;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference; import androidx.preference.SwitchPreference;
import com.android.internal.display.RefreshRateSettingsUtils;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController; import com.android.settingslib.development.DeveloperOptionsPreferenceController;
@@ -35,6 +34,12 @@ 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
static float NO_CONFIG = 0f;
@VisibleForTesting @VisibleForTesting
float mPeakRefreshRate; float mPeakRefreshRate;
@@ -43,8 +48,17 @@ public class ForcePeakRefreshRatePreferenceController extends DeveloperOptionsPr
public ForcePeakRefreshRatePreferenceController(Context context) { public ForcePeakRefreshRatePreferenceController(Context context) {
super(context); super(context);
mPeakRefreshRate =
RefreshRateSettingsUtils.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);
} }
@@ -85,20 +99,34 @@ public class ForcePeakRefreshRatePreferenceController extends DeveloperOptionsPr
@Override @Override
protected void onDeveloperOptionsSwitchDisabled() { protected void onDeveloperOptionsSwitchDisabled() {
super.onDeveloperOptionsSwitchDisabled(); super.onDeveloperOptionsSwitchDisabled();
Settings.System.putInt(mContext.getContentResolver(), Settings.System.putFloat(mContext.getContentResolver(),
Settings.System.FORCE_PEAK_REFRESH_RATE, 0); Settings.System.MIN_REFRESH_RATE, NO_CONFIG);
((SwitchPreference) mPreference).setChecked(false); ((SwitchPreference) mPreference).setChecked(false);
} }
@VisibleForTesting @VisibleForTesting
void forcePeakRefreshRate(boolean enable) { void forcePeakRefreshRate(boolean enable) {
Settings.System.putInt(mContext.getContentResolver(), final float peakRefreshRate = enable ? mPeakRefreshRate : NO_CONFIG;
Settings.System.FORCE_PEAK_REFRESH_RATE, enable ? 1 : 0); Settings.System.putFloat(mContext.getContentResolver(),
Settings.System.MIN_REFRESH_RATE, peakRefreshRate);
} }
boolean isForcePeakRefreshRateEnabled() { boolean isForcePeakRefreshRateEnabled() {
return Settings.System.getInt(mContext.getContentResolver(), final float peakRefreshRate = Settings.System.getFloat(mContext.getContentResolver(),
Settings.System.FORCE_PEAK_REFRESH_RATE, 0) == 1; 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;
} }
} }

View File

@@ -16,20 +16,18 @@
package com.android.settings.display; package com.android.settings.display;
import static com.android.internal.display.RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE;
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;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.internal.display.RefreshRateSettingsUtils;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController; import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -41,6 +39,8 @@ 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";
@@ -65,8 +65,17 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl
updateState(mPreference); updateState(mPreference);
} }
}; };
mPeakRefreshRate =
RefreshRateSettingsUtils.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 : "
@@ -97,15 +106,21 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl
@Override @Override
public boolean isChecked() { public boolean isChecked() {
return Settings.System.getInt(mContext.getContentResolver(), Settings.System.SMOOTH_DISPLAY, final float peakRefreshRate =
0) == 1; Settings.System.getFloat(
mContext.getContentResolver(),
Settings.System.PEAK_REFRESH_RATE,
getDefaultPeakRefreshRate());
return Math.round(peakRefreshRate) == Math.round(mPeakRefreshRate);
} }
@Override @Override
public boolean setChecked(boolean isChecked) { public boolean setChecked(boolean isChecked) {
Log.d(TAG, "setChecked to : " + isChecked); final float peakRefreshRate = isChecked ? mPeakRefreshRate : DEFAULT_REFRESH_RATE;
return Settings.System.putInt( Log.d(TAG, "setChecked to : " + peakRefreshRate);
mContext.getContentResolver(), Settings.System.SMOOTH_DISPLAY, isChecked ? 1 : 0);
return Settings.System.putFloat(
mContext.getContentResolver(), Settings.System.PEAK_REFRESH_RATE, peakRefreshRate);
} }
@Override @Override
@@ -123,6 +138,17 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl
mDeviceConfigDisplaySettings.stopListening(); mDeviceConfigDisplaySettings.stopListening();
} }
@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;
}
private class DeviceConfigDisplaySettings private class DeviceConfigDisplaySettings
implements DeviceConfig.OnPropertiesChangedListener, Executor { implements DeviceConfig.OnPropertiesChangedListener, Executor {
public void startListening() { public void startListening() {
@@ -165,4 +191,15 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl
} }
} }
} }
private float getDefaultPeakRefreshRate() {
float defaultPeakRefreshRate = mDeviceConfigDisplaySettings.getDefaultPeakRefreshRate();
if (defaultPeakRefreshRate == INVALIDATE_REFRESH_RATE) {
defaultPeakRefreshRate = (float) mContext.getResources().getInteger(
com.android.internal.R.integer.config_defaultPeakRefreshRate);
}
Log.d(TAG, "DeviceConfig getDefaultPeakRefreshRate : " + defaultPeakRefreshRate);
return defaultPeakRefreshRate;
}
} }

View File

@@ -16,8 +16,8 @@
package com.android.settings.development; package com.android.settings.development;
import static com.android.internal.display.RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE; import static com.android.settings.development.ForcePeakRefreshRatePreferenceController.DEFAULT_REFRESH_RATE;
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,6 +38,8 @@ 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 {
@@ -61,18 +63,22 @@ public class ForcePeakRefreshRatePreferenceControllerTest {
@Test @Test
public void onPreferenceChange_preferenceChecked_shouldEnableForcePeak() { public void onPreferenceChange_preferenceChecked_shouldEnableForcePeak() {
mController.mPeakRefreshRate = 88f;
mController.onPreferenceChange(mPreference, true); mController.onPreferenceChange(mPreference, true);
assertThat(Settings.System.getInt(mContext.getContentResolver(), assertThat(Settings.System.getFloat(mContext.getContentResolver(),
Settings.System.FORCE_PEAK_REFRESH_RATE, -1)).isEqualTo(1); Settings.System.MIN_REFRESH_RATE, NO_CONFIG)).isEqualTo(88f);
} }
@Test @Test
public void onPreferenceChange_preferenceUnchecked_shouldDisableForcePeak() { public void onPreferenceChange_preferenceUnchecked_shouldDisableForcePeak() {
mController.mPeakRefreshRate = 88f;
mController.onPreferenceChange(mPreference, false); mController.onPreferenceChange(mPreference, false);
assertThat(Settings.System.getInt(mContext.getContentResolver(), assertThat(Settings.System.getFloat(mContext.getContentResolver(),
Settings.System.FORCE_PEAK_REFRESH_RATE, -1)).isEqualTo(0); Settings.System.MIN_REFRESH_RATE, NO_CONFIG)).isEqualTo(NO_CONFIG);
} }
@Test @Test
@@ -119,8 +125,8 @@ public class ForcePeakRefreshRatePreferenceControllerTest {
public void onDeveloperOptionsDisabled_shouldDisablePreference() { public void onDeveloperOptionsDisabled_shouldDisablePreference() {
mController.onDeveloperOptionsSwitchDisabled(); mController.onDeveloperOptionsSwitchDisabled();
assertThat(Settings.System.getInt(mContext.getContentResolver(), assertThat(Settings.System.getFloat(mContext.getContentResolver(),
Settings.System.FORCE_PEAK_REFRESH_RATE, -1)).isEqualTo(0); Settings.System.MIN_REFRESH_RATE, -1f)).isEqualTo(NO_CONFIG);
assertThat(mPreference.isChecked()).isFalse(); assertThat(mPreference.isChecked()).isFalse();
assertThat(mPreference.isEnabled()).isFalse(); assertThat(mPreference.isEnabled()).isFalse();
} }

View File

@@ -16,14 +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.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 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;
@@ -69,21 +70,23 @@ public class PeakRefreshRatePreferenceControllerTest {
} }
@Test @Test
public void setChecked_enableSmoothDisplay() { public void setChecked_enableSmoothDisplay_setCurrentRefreshRate() {
mController.mPeakRefreshRate = 88f;
mController.setChecked(true); mController.setChecked(true);
assertThat(Settings.System.getInt(mContext.getContentResolver(), assertThat(Settings.System.getFloat(mContext.getContentResolver(),
Settings.System.SMOOTH_DISPLAY, -1)) Settings.System.PEAK_REFRESH_RATE, DEFAULT_REFRESH_RATE))
.isEqualTo(1); .isEqualTo(88.0f);
} }
@Test @Test
public void setChecked_disableSmoothDisplay() { public void setChecked_disableSmoothDisplay_setDefaultRefreshRate() {
mController.mPeakRefreshRate = 88f;
mController.setChecked(false); mController.setChecked(false);
assertThat(Settings.System.getInt(mContext.getContentResolver(), assertThat(Settings.System.getFloat(mContext.getContentResolver(),
Settings.System.SMOOTH_DISPLAY, -1)) Settings.System.PEAK_REFRESH_RATE, DEFAULT_REFRESH_RATE))
.isEqualTo(0); .isEqualTo(DEFAULT_REFRESH_RATE);
} }
@Test @Test
@@ -100,21 +103,36 @@ public class PeakRefreshRatePreferenceControllerTest {
assertThat(mController.isChecked()).isFalse(); assertThat(mController.isChecked()).isFalse();
} }
@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);
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);
}
private void enableSmoothDisplayPreference() { private void enableSmoothDisplayPreference() {
mController.mPeakRefreshRate = 88f; mController.mPeakRefreshRate = 88f;
Settings.System.putInt( Settings.System.putFloat(
mContext.getContentResolver(), mContext.getContentResolver(),
Settings.System.SMOOTH_DISPLAY, Settings.System.PEAK_REFRESH_RATE,
1); mController.mPeakRefreshRate);
} }
private void disableSmoothDisplayPreference() { private void disableSmoothDisplayPreference() {
mController.mPeakRefreshRate = 88f; mController.mPeakRefreshRate = 88f;
Settings.System.putInt( Settings.System.putFloat(
mContext.getContentResolver(), mContext.getContentResolver(),
Settings.System.SMOOTH_DISPLAY, Settings.System.PEAK_REFRESH_RATE,
0); DEFAULT_REFRESH_RATE);
} }
} }