Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit af320436 authored by Piotr Wilczyński's avatar Piotr Wilczyński
Browse files

Back up the smooth display setting

- Convert "Smooth display" and "Force peak refresh rate" to a boolean. If they are a boolean, they can be backed up without being device-specific.
- Back up "Smooth display" and add a validator
- Upgrade the 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
Change-Id: Ib2cb2dd100f06f5452083b7606109a486e795a0e
parent be82b851
Loading
Loading
Loading
Loading
+11 −39
Original line number Diff line number Diff line
@@ -16,17 +16,18 @@

package com.android.settings.development;

import static com.android.internal.display.RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE;

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;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;

import com.android.internal.display.RefreshRateSettingsUtils;
import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;
@@ -34,12 +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;

    @VisibleForTesting
    float mPeakRefreshRate;

@@ -48,17 +43,8 @@ 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 =
                RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(context);
        Log.d(TAG, "DEFAULT_REFRESH_RATE : " + DEFAULT_REFRESH_RATE
            + " mPeakRefreshRate : " + mPeakRefreshRate);
    }
@@ -99,34 +85,20 @@ public class ForcePeakRefreshRatePreferenceController extends DeveloperOptionsPr
    @Override
    protected void onDeveloperOptionsSwitchDisabled() {
        super.onDeveloperOptionsSwitchDisabled();
        Settings.System.putFloat(mContext.getContentResolver(),
            Settings.System.MIN_REFRESH_RATE, NO_CONFIG);
        Settings.System.putInt(mContext.getContentResolver(),
                Settings.System.FORCE_PEAK_REFRESH_RATE, 0);

        ((SwitchPreference) mPreference).setChecked(false);
    }

    @VisibleForTesting
    void forcePeakRefreshRate(boolean enable) {
        final float peakRefreshRate = enable ? mPeakRefreshRate : NO_CONFIG;
        Settings.System.putFloat(mContext.getContentResolver(),
            Settings.System.MIN_REFRESH_RATE, peakRefreshRate);
        Settings.System.putInt(mContext.getContentResolver(),
                Settings.System.FORCE_PEAK_REFRESH_RATE, enable ? 1 : 0);
    }

    boolean isForcePeakRefreshRateEnabled() {
        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 Settings.System.getInt(mContext.getContentResolver(),
                Settings.System.FORCE_PEAK_REFRESH_RATE, 0) == 1;
    }
}
+10 −47
Original line number Diff line number Diff line
@@ -16,18 +16,20 @@

package com.android.settings.display;

import static com.android.internal.display.RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE;

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;
import androidx.preference.PreferenceScreen;

import com.android.internal.display.RefreshRateSettingsUtils;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
@@ -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";
@@ -65,17 +65,8 @@ 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 =
                RefreshRateSettingsUtils.findHighestRefreshRateForDefaultDisplay(context);
        Log.d(
                TAG,
                "DEFAULT_REFRESH_RATE : "
@@ -107,21 +98,15 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl

    @Override
    public boolean isChecked() {
        final float peakRefreshRate =
                Settings.System.getFloat(
                        mContext.getContentResolver(),
                        Settings.System.PEAK_REFRESH_RATE,
                        getDefaultPeakRefreshRate());
        return Math.round(peakRefreshRate) == Math.round(mPeakRefreshRate);
        return Settings.System.getInt(mContext.getContentResolver(), Settings.System.SMOOTH_DISPLAY,
                0) == 1;
    }

    @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);
        Log.d(TAG, "setChecked to : " + isChecked);
        return Settings.System.putInt(
                mContext.getContentResolver(), Settings.System.SMOOTH_DISPLAY, isChecked ? 1 : 0);
    }

    @Override
@@ -139,17 +124,6 @@ public class PeakRefreshRatePreferenceController extends TogglePreferenceControl
        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
            implements DeviceConfig.OnPropertiesChangedListener, Executor {
        public void startListening() {
@@ -192,15 +166,4 @@ 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;
    }
}
+8 −14
Original line number Diff line number Diff line
@@ -16,8 +16,8 @@

package com.android.settings.development;

import static com.android.settings.development.ForcePeakRefreshRatePreferenceController.DEFAULT_REFRESH_RATE;
import static com.android.settings.development.ForcePeakRefreshRatePreferenceController.NO_CONFIG;
import static com.android.internal.display.RefreshRateSettingsUtils.DEFAULT_REFRESH_RATE;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.verify;
@@ -38,8 +38,6 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;

import android.util.Log;

@RunWith(RobolectricTestRunner.class)
public class ForcePeakRefreshRatePreferenceControllerTest {

@@ -63,22 +61,18 @@ public class ForcePeakRefreshRatePreferenceControllerTest {

    @Test
    public void onPreferenceChange_preferenceChecked_shouldEnableForcePeak() {
        mController.mPeakRefreshRate = 88f;

        mController.onPreferenceChange(mPreference, true);

        assertThat(Settings.System.getFloat(mContext.getContentResolver(),
                Settings.System.MIN_REFRESH_RATE, NO_CONFIG)).isEqualTo(88f);
        assertThat(Settings.System.getInt(mContext.getContentResolver(),
                Settings.System.FORCE_PEAK_REFRESH_RATE, -1)).isEqualTo(1);
    }

    @Test
    public void onPreferenceChange_preferenceUnchecked_shouldDisableForcePeak() {
        mController.mPeakRefreshRate = 88f;

        mController.onPreferenceChange(mPreference, false);

        assertThat(Settings.System.getFloat(mContext.getContentResolver(),
                Settings.System.MIN_REFRESH_RATE, NO_CONFIG)).isEqualTo(NO_CONFIG);
        assertThat(Settings.System.getInt(mContext.getContentResolver(),
                Settings.System.FORCE_PEAK_REFRESH_RATE, -1)).isEqualTo(0);
    }

    @Test
@@ -125,8 +119,8 @@ public class ForcePeakRefreshRatePreferenceControllerTest {
    public void onDeveloperOptionsDisabled_shouldDisablePreference() {
        mController.onDeveloperOptionsSwitchDisabled();

        assertThat(Settings.System.getFloat(mContext.getContentResolver(),
                Settings.System.MIN_REFRESH_RATE, -1f)).isEqualTo(NO_CONFIG);
        assertThat(Settings.System.getInt(mContext.getContentResolver(),
                Settings.System.FORCE_PEAK_REFRESH_RATE, -1)).isEqualTo(0);
        assertThat(mPreference.isChecked()).isFalse();
        assertThat(mPreference.isEnabled()).isFalse();
    }
+15 −33
Original line number Diff line number Diff line
@@ -16,15 +16,14 @@

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 android.content.Context;
import android.provider.Settings;
import android.view.Display;

import androidx.preference.SwitchPreference;

@@ -70,23 +69,21 @@ public class PeakRefreshRatePreferenceControllerTest {
    }

    @Test
    public void setChecked_enableSmoothDisplay_setCurrentRefreshRate() {
        mController.mPeakRefreshRate = 88f;
    public void setChecked_enableSmoothDisplay() {
        mController.setChecked(true);

        assertThat(Settings.System.getFloat(mContext.getContentResolver(),
                Settings.System.PEAK_REFRESH_RATE, DEFAULT_REFRESH_RATE))
                .isEqualTo(88.0f);
        assertThat(Settings.System.getInt(mContext.getContentResolver(),
                Settings.System.SMOOTH_DISPLAY, -1))
                .isEqualTo(1);
    }

    @Test
    public void setChecked_disableSmoothDisplay_setDefaultRefreshRate() {
        mController.mPeakRefreshRate = 88f;
    public void setChecked_disableSmoothDisplay() {
        mController.setChecked(false);

        assertThat(Settings.System.getFloat(mContext.getContentResolver(),
                Settings.System.PEAK_REFRESH_RATE, DEFAULT_REFRESH_RATE))
                .isEqualTo(DEFAULT_REFRESH_RATE);
        assertThat(Settings.System.getInt(mContext.getContentResolver(),
                Settings.System.SMOOTH_DISPLAY, -1))
                .isEqualTo(0);
    }

    @Test
@@ -103,36 +100,21 @@ public class PeakRefreshRatePreferenceControllerTest {
        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() {
        mController.mPeakRefreshRate = 88f;

        Settings.System.putFloat(
        Settings.System.putInt(
                mContext.getContentResolver(),
                Settings.System.PEAK_REFRESH_RATE,
                mController.mPeakRefreshRate);
                Settings.System.SMOOTH_DISPLAY,
                1);
    }

    private void disableSmoothDisplayPreference() {
        mController.mPeakRefreshRate = 88f;

        Settings.System.putFloat(
        Settings.System.putInt(
                mContext.getContentResolver(),
                Settings.System.PEAK_REFRESH_RATE,
                DEFAULT_REFRESH_RATE);
                Settings.System.SMOOTH_DISPLAY,
                0);
    }
}