From f0b1155d20c371654c4ce6e2160592a5e9b71bd5 Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Fri, 28 Mar 2025 19:36:39 +0900 Subject: [PATCH] fix(YouTube - Change form factor): No user dialog shown when changing settings --- .../ReVancedPreferenceFragment.java | 73 +++++++++++++------ 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java b/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java index d183dbae2..af2864f36 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java +++ b/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java @@ -65,6 +65,7 @@ import app.revanced.extension.shared.settings.EnumSetting; import app.revanced.extension.shared.settings.Setting; import app.revanced.extension.shared.utils.Logger; import app.revanced.extension.shared.utils.ResourceUtils; +import app.revanced.extension.shared.utils.StringRef; import app.revanced.extension.shared.utils.Utils; import app.revanced.extension.youtube.patches.video.CustomPlaybackSpeedPatch; import app.revanced.extension.youtube.settings.Settings; @@ -141,11 +142,8 @@ public class ReVancedPreferenceFragment extends PreferenceFragment { if (!settingImportInProgress && !showingUserDialogMessage) { final Context context = getActivity(); - if (setting.userDialogMessage != null && - mPreference instanceof SwitchPreference switchPreference && - setting.defaultValue instanceof Boolean defaultValue && - switchPreference.isChecked() != defaultValue) { - showSettingUserDialogConfirmation(context, switchPreference, (BooleanSetting) setting); + if (setting.userDialogMessage != null && !prefIsSetToDefault(mPreference, setting)) { + showSettingUserDialogConfirmation(context, mPreference, setting); } else if (setting.rebootApp) { showRestartDialog(context); } @@ -155,25 +153,56 @@ public class ReVancedPreferenceFragment extends PreferenceFragment { } }; - private void showSettingUserDialogConfirmation(Context context, SwitchPreference switchPreference, BooleanSetting setting) { + /** + * @return If the preference is currently set to the default value of the Setting. + */ + private boolean prefIsSetToDefault(Preference pref, Setting setting) { + Object defaultValue = setting.defaultValue; + if (pref instanceof SwitchPreference switchPref) { + return switchPref.isChecked() == (Boolean) defaultValue; + } + String defaultValueString = defaultValue.toString(); + if (pref instanceof EditTextPreference editPreference) { + return editPreference.getText().equals(defaultValueString); + } + if (pref instanceof ListPreference listPref) { + return listPref.getValue().equals(defaultValueString); + } + + throw new IllegalStateException("Must override method to handle " + + "preference type: " + pref.getClass()); + } + + private void showSettingUserDialogConfirmation(Context context, Preference pref, Setting setting) { Utils.verifyOnMainThread(); - showingUserDialogMessage = true; - assert setting.userDialogMessage != null; - new AlertDialog.Builder(context) - .setTitle(str("revanced_extended_confirm_user_dialog_title")) - .setMessage(setting.userDialogMessage.toString()) - .setPositiveButton(android.R.string.ok, (dialog, id) -> { - if (setting.rebootApp) { - showRestartDialog(context); - } - }) - .setNegativeButton(android.R.string.cancel, (dialog, id) -> { - switchPreference.setChecked(setting.defaultValue); // Recursive call that resets the Setting value. - }) - .setOnDismissListener(dialog -> showingUserDialogMessage = false) - .setCancelable(false) - .show(); + final StringRef userDialogMessage = setting.userDialogMessage; + if (context != null && userDialogMessage != null) { + showingUserDialogMessage = true; + + new AlertDialog.Builder(context) + .setTitle(str("revanced_extended_confirm_user_dialog_title")) + .setMessage(userDialogMessage.toString()) + .setPositiveButton(android.R.string.ok, (dialog, id) -> { + if (setting.rebootApp) { + showRestartDialog(context); + } + }) + .setNegativeButton(android.R.string.cancel, (dialog, id) -> { + // Restore whatever the setting was before the change. + if (setting instanceof BooleanSetting booleanSetting && + pref instanceof SwitchPreference switchPreference) { + switchPreference.setChecked(booleanSetting.defaultValue); + } else if (setting instanceof EnumSetting enumSetting && + pref instanceof ListPreference listPreference) { + listPreference.setValue(enumSetting.defaultValue.toString()); + updateListPreferenceSummary(listPreference, setting); + } + }) + .setOnDismissListener(dialog -> showingUserDialogMessage = false) + .setCancelable(false) + .show(); + } } static PreferenceManager mPreferenceManager;