From 49797fe8d0c4a0981ef621a31356c4315ae3777b Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:14:31 +0100 Subject: [PATCH] fix(YouTube): Do not show restart prompt more than once if setting change is canceled --- .../AbstractPreferenceFragment.java | 37 ++++++++++++++----- ...oofStreamingDataSideEffectsPreference.java | 1 + 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java index 2aeab6134..17646fec9 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java @@ -22,12 +22,23 @@ import app.revanced.extension.shared.settings.Setting; @SuppressWarnings("deprecation") public abstract class AbstractPreferenceFragment extends PreferenceFragment { + /** * Indicates that if a preference changes, * to apply the change from the Setting to the UI component. */ public static boolean settingImportInProgress; + /** + * Prevents recursive calls during preference <-> UI syncing from showing extra dialogs. + */ + private static boolean updatingPreference; + + /** + * Used to prevent showing reboot dialog, if user cancels a setting user dialog. + */ + private static boolean showingUserDialogMessage; + /** * Confirm and restart dialog button text and title. * Set by subclasses if Strings cannot be added as a resource. @@ -35,13 +46,13 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment { @Nullable protected static String restartDialogButtonText, restartDialogTitle, confirmDialogTitle; - /** - * Used to prevent showing reboot dialog, if user cancels a setting user dialog. - */ - private boolean showingUserDialogMessage; - private final SharedPreferences.OnSharedPreferenceChangeListener listener = (sharedPreferences, str) -> { try { + if (updatingPreference) { + Logger.printDebug(() -> "Ignoring preference change as sync is in progress"); + return; + } + Setting setting = Setting.getSettingFromPath(Objects.requireNonNull(str)); if (setting == null) { return; @@ -63,10 +74,13 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment { } } + updatingPreference = true; // Apply 'Setting <- Preference', unless during importing when it needs to be 'Setting -> Preference'. + // Updating here can can cause a recursive call back into this same method. updatePreference(pref, setting, true, settingImportInProgress); // Update any other preference availability that may now be different. updateUIAvailability(); + updatingPreference = false; } catch (Exception ex) { Logger.printException(() -> "OnSharedPreferenceChangeListener failure", ex); } @@ -97,7 +111,9 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment { if (confirmDialogTitle == null) { confirmDialogTitle = str("revanced_settings_confirm_user_dialog_title"); } + showingUserDialogMessage = true; + new AlertDialog.Builder(context) .setTitle(confirmDialogTitle) .setMessage(Objects.requireNonNull(setting.userDialogMessage).toString()) @@ -141,14 +157,16 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment { * @return If the preference is currently set to the default value of the Setting. */ protected boolean prefIsSetToDefault(Preference pref, Setting setting) { + Object defaultValue = setting.defaultValue; if (pref instanceof SwitchPreference switchPref) { - return switchPref.isChecked() == (Boolean) setting.defaultValue; + return switchPref.isChecked() == (Boolean) defaultValue; } + String defaultValueString = defaultValue.toString(); if (pref instanceof EditTextPreference editPreference) { - return editPreference.getText().equals(setting.defaultValue.toString()); + return editPreference.getText().equals(defaultValueString); } if (pref instanceof ListPreference listPref) { - return listPref.getValue().equals(setting.defaultValue.toString()); + return listPref.getValue().equals(defaultValueString); } throw new IllegalStateException("Must override method to handle " @@ -255,7 +273,7 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment { } } - public static void showRestartDialog(@NonNull final Context context) { + public static void showRestartDialog(Context context) { Utils.verifyOnMainThread(); if (restartDialogTitle == null) { restartDialogTitle = str("revanced_settings_restart_title"); @@ -263,6 +281,7 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment { if (restartDialogButtonText == null) { restartDialogButtonText = str("revanced_settings_restart"); } + new AlertDialog.Builder(context) .setMessage(restartDialogTitle) .setPositiveButton(restartDialogButtonText, (dialog, id) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java index a0df8ce07..904103f92 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java @@ -73,6 +73,7 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference { if (currentClientType == clientType) { return; } + currentClientType = clientType; Logger.printDebug(() -> "Updating spoof stream side effects preference"); setEnabled(BaseSettings.SPOOF_VIDEO_STREAMS.get());