diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/SearchViewController.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/SearchViewController.java index b5aadc0ce..65b581d1e 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/SearchViewController.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/SearchViewController.java @@ -192,7 +192,7 @@ public class SearchViewController { if (isSearchActive) { closeSearch(); } else { - activity.onBackPressed(); + fragment.toolbarBackButtonPressed(); } } catch (Exception ex) { Logger.printException(() -> "navigation click failure", ex); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java index 525a163e3..d24ecc438 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java @@ -74,6 +74,11 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment { */ private final List> allPreferences = new ArrayList<>(); + /** + * Used to navigate to a PreferenceScreen when a search result category is clicked. + */ + private final Deque searchNavigationStack = new ArrayDeque<>(); + @SuppressLint("UseCompatLoadingForDrawables") public static Drawable getBackButtonDrawable() { final int backButtonResource = getResourceIdentifier(ThemeHelper.isDarkTheme() @@ -187,6 +192,21 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment { } } + public void navigateToScreen(PreferenceScreen subScreen) { + searchNavigationStack.push(preferenceScreen); + + setPreferenceScreen(subScreen); + } + + public void toolbarBackButtonPressed() { + if (searchNavigationStack.isEmpty()) { + getActivity().onBackPressed(); + return; + } + + setPreferenceScreen(searchNavigationStack.pop()); + } + /** * Recursively collects all preferences from the screen or group. * @param includeDepth Menu depth to start including preferences. @@ -236,7 +256,7 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment { } // Navigation path -> Category - Map categoryMap = new HashMap<>(); + Map categoryMap = new HashMap<>(); String queryLower = Utils.removePunctuationToLowercase(query); Pattern queryPattern = Pattern.compile(Pattern.quote(Utils.removePunctuationToLowercase(query)), @@ -247,8 +267,8 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment { data.applyHighlighting(queryLower, queryPattern); String navigationPath = data.navigationPath; - PreferenceCategory group = categoryMap.computeIfAbsent(navigationPath, key -> { - PreferenceCategory newGroup = new PreferenceCategory(preferenceScreen.getContext()); + ClickablePreferenceCategory group = categoryMap.computeIfAbsent(navigationPath, key -> { + ClickablePreferenceCategory newGroup = new ClickablePreferenceCategory(this, data.parentScreen); newGroup.setTitle(navigationPath); preferenceScreen.addPreference(newGroup); return newGroup; @@ -401,6 +421,21 @@ class AbstractPreferenceSearchData { return spannable; } + private static PreferenceScreen getParentScreen(Preference preference) { + while (true) { + preference = preference.getParent(); + + if (preference instanceof PreferenceScreen screen) { + return screen; + } + + if (preference == null) { + return null; + } + } + } + + final PreferenceScreen parentScreen; final T preference; final String key; final String navigationPath; @@ -412,6 +447,7 @@ class AbstractPreferenceSearchData { String searchTitle; AbstractPreferenceSearchData(T pref) { + parentScreen = getParentScreen(pref); preference = pref; key = Utils.removePunctuationToLowercase(pref.getKey()); navigationPath = getPreferenceNavigationString(pref); @@ -602,3 +638,30 @@ class ListPreferenceSearchData extends AbstractPreferenceSearchData { + fragment.navigateToScreen(subScreen); + return true; + }); + } + } + + @Override + public boolean isEnabled() { + return true; + } + + @Override + public boolean isSelectable() { + return true; + } +} +