From 05b678936af84ec087bdd38e837637847fbf1379 Mon Sep 17 00:00:00 2001 From: Jacky Wang Date: Fri, 10 Jan 2025 16:29:09 +0800 Subject: [PATCH] [Catalyst] Prevent flicker on "Use Data Saver" Fix: 383632913 Flag: com.android.settings.flags.catalyst Test: manual Change-Id: I9aa9544c4749e543f5a923d166e4268af595a500 --- .../datausage/DataSaverMainSwitchPreference.kt | 3 +++ .../android/settings/widget/MainSwitchBarMetadata.kt | 10 ++++++++++ .../android/settings/widget/MainSwitchBarPreference.kt | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/datausage/DataSaverMainSwitchPreference.kt b/src/com/android/settings/datausage/DataSaverMainSwitchPreference.kt index 9127659b8e6..e73fe948c74 100644 --- a/src/com/android/settings/datausage/DataSaverMainSwitchPreference.kt +++ b/src/com/android/settings/datausage/DataSaverMainSwitchPreference.kt @@ -36,6 +36,9 @@ class DataSaverMainSwitchPreference : MainSwitchBarMetadata, PreferenceLifecycle override val title get() = R.string.data_saver_switch_title + override val disableWidgetOnCheckedChanged: Boolean + get() = false + override fun storage(context: Context) = createDataStore(context) override fun getReadPermissions(context: Context) = diff --git a/src/com/android/settings/widget/MainSwitchBarMetadata.kt b/src/com/android/settings/widget/MainSwitchBarMetadata.kt index f55cfd03789..4fc89bc19b6 100644 --- a/src/com/android/settings/widget/MainSwitchBarMetadata.kt +++ b/src/com/android/settings/widget/MainSwitchBarMetadata.kt @@ -27,6 +27,16 @@ import com.android.settingslib.preference.TwoStatePreferenceBinding interface MainSwitchBarMetadata : TwoStatePreference, TwoStatePreferenceBinding, PreferenceBindingPlaceholder { + /** + * Disable main switch bar when user toggles the switch. By this way, user cannot toggle again + * before last operation is done. + * + * Side-effect: If the underlying operation is completed quickly, this will causes UI flicker. + * Override and return `false` to get rid of the flicker. + */ + val disableWidgetOnCheckedChanged: Boolean + get() = true + override fun createWidget(context: Context) = MainSwitchBarPreference(context, this) override fun bind(preference: Preference, metadata: PreferenceMetadata) { diff --git a/src/com/android/settings/widget/MainSwitchBarPreference.kt b/src/com/android/settings/widget/MainSwitchBarPreference.kt index b3b341c75a9..a23409a8cc8 100644 --- a/src/com/android/settings/widget/MainSwitchBarPreference.kt +++ b/src/com/android/settings/widget/MainSwitchBarPreference.kt @@ -80,7 +80,7 @@ class MainSwitchBarPreference(context: Context, private val metadata: MainSwitch override fun onCheckedChanged(buttonView: CompoundButton, isChecked: Boolean) { // prevent user from toggling the switch before data store operation is done - isEnabled = false + if (metadata.disableWidgetOnCheckedChanged) isEnabled = false // once data store is updated, isEnabled will be reset due to rebind persistBoolean(isChecked) }