From 99aa6e7fe0f53429df87b97d845d11339ab5aab3 Mon Sep 17 00:00:00 2001 From: Marin Shalamanov Date: Thu, 29 Oct 2020 13:46:41 +0100 Subject: [PATCH] Add flag for match content frame rate Add new Settings.Secure.MATCH_CONTENT_FRAME_RATE to store user's preferred refresh rate switching type. Bug: 161776333 Test: 1. adb shell settings put secure match_content_frame_rate [0|1|2] 2. Verify the setting is correctly propagated: adb shell dumpsys display | grep mModeSwitchingType adb shell dumpsys SurfaceFlinger | grep allowGroupSwitching 3. reboot and verify the setting is persisted Change-Id: I95b3f3f550f3e49f3bc6858185a7f7af1d55a4a7 --- core/java/android/provider/Settings.java | 17 ++++++++++++++++- .../settings/backup/SecureSettings.java | 1 + .../validators/SecureSettingsValidators.java | 3 +++ .../server/display/DisplayModeDirector.java | 18 ++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index f31e70a871696..d22b62b06ba4d 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -7760,6 +7760,21 @@ public final class Settings { public static final String MINIMAL_POST_PROCESSING_ALLOWED = "minimal_post_processing_allowed"; + /** + * User's preference for refresh rate switching. + * + *

Values: + * 0 - Never switch refresh rates. + * 1 - Switch refresh rates only when it can be done seamlessly. (Default behaviour) + * 2 - Always prefer refresh rate switching even if it's going to have visual interruptions + * for the user. + * + * @see android.view.Surface#setFrameRate + * @hide + */ + public static final String MATCH_CONTENT_FRAME_RATE = + "match_content_frame_rate"; + /** * INCALL_POWER_BUTTON_BEHAVIOR value for "turn off screen". * @hide @@ -10708,7 +10723,7 @@ public final class Settings { * 0 = Disabled * 1 = Enabled * - * Most readers of this setting should simply check if value == 1 to determined the + * Most readers of this setting should simply check if value == 1 to determine the * enabled state. * @hide * @deprecated To be removed. diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java index b9e30fb950c60..ffbc7f4cecf32 100644 --- a/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java +++ b/packages/SettingsProvider/src/android/provider/settings/backup/SecureSettings.java @@ -89,6 +89,7 @@ public class SecureSettings { Settings.Secure.RTT_CALLING_MODE, Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR, Settings.Secure.MINIMAL_POST_PROCESSING_ALLOWED, + Settings.Secure.MATCH_CONTENT_FRAME_RATE, Settings.Secure.NIGHT_DISPLAY_CUSTOM_START_TIME, Settings.Secure.NIGHT_DISPLAY_CUSTOM_END_TIME, Settings.Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE, diff --git a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java index 721bf730a3437..46c42fc8fdd62 100644 --- a/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java +++ b/packages/SettingsProvider/src/android/provider/settings/validators/SecureSettingsValidators.java @@ -135,6 +135,9 @@ public class SecureSettingsValidators { Secure.INCALL_POWER_BUTTON_BEHAVIOR, new DiscreteValueValidator(new String[] {"1", "2"})); VALIDATORS.put(Secure.MINIMAL_POST_PROCESSING_ALLOWED, BOOLEAN_VALIDATOR); + VALIDATORS.put( + Secure.MATCH_CONTENT_FRAME_RATE, + new DiscreteValueValidator(new String[] {"0", "1", "2"})); VALIDATORS.put(Secure.NIGHT_DISPLAY_CUSTOM_START_TIME, NON_NEGATIVE_INTEGER_VALIDATOR); VALIDATORS.put(Secure.NIGHT_DISPLAY_CUSTOM_END_TIME, NON_NEGATIVE_INTEGER_VALIDATOR); VALIDATORS.put(Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE, NON_NEGATIVE_INTEGER_VALIDATOR); diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index c013145b52690..1aced07e0997e 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -931,6 +931,8 @@ public class DisplayModeDirector { Settings.System.getUriFor(Settings.System.MIN_REFRESH_RATE); private final Uri mLowPowerModeSetting = Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE); + private final Uri mMatchContentFrameRateSetting = + Settings.Secure.getUriFor(Settings.Secure.MATCH_CONTENT_FRAME_RATE); private final Context mContext; private float mDefaultPeakRefreshRate; @@ -953,6 +955,8 @@ public class DisplayModeDirector { UserHandle.USER_SYSTEM); cr.registerContentObserver(mLowPowerModeSetting, false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); + cr.registerContentObserver(mMatchContentFrameRateSetting, false /*notifyDescendants*/, + this); Float deviceConfigDefaultPeakRefresh = mDeviceConfigDisplaySettings.getDefaultPeakRefreshRate(); @@ -963,6 +967,7 @@ public class DisplayModeDirector { synchronized (mLock) { updateRefreshRateSettingLocked(); updateLowPowerModeSettingLocked(); + updateModeSwitchingTypeSettingLocked(); } } @@ -988,6 +993,8 @@ public class DisplayModeDirector { updateRefreshRateSettingLocked(); } else if (mLowPowerModeSetting.equals(uri)) { updateLowPowerModeSettingLocked(); + } else if (mMatchContentFrameRateSetting.equals(uri)) { + updateModeSwitchingTypeSettingLocked(); } } } @@ -1050,6 +1057,17 @@ public class DisplayModeDirector { mBrightnessObserver.onRefreshRateSettingChangedLocked(minRefreshRate, maxRefreshRate); } + private void updateModeSwitchingTypeSettingLocked() { + final ContentResolver cr = mContext.getContentResolver(); + int switchingType = Settings.Secure.getIntForUser( + cr, Settings.Secure.MATCH_CONTENT_FRAME_RATE, mModeSwitchingType /*default*/, + cr.getUserId()); + if (switchingType != mModeSwitchingType) { + mModeSwitchingType = switchingType; + notifyDesiredDisplayModeSpecsChangedLocked(); + } + } + public void dumpLocked(PrintWriter pw) { pw.println(" SettingsObserver"); pw.println(" mDefaultRefreshRate: " + mDefaultRefreshRate);