From ece8076f7cefd752b97515014bc50fe4fd80171e Mon Sep 17 00:00:00 2001
From: MarcaD <152095496+MarcaDian@users.noreply.github.com>
Date: Sun, 21 Sep 2025 16:19:29 +0300
Subject: [PATCH] fix(YouTube - Settings): Use an overlay to show search
results (#5806)
Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
---
.../music/settings/GoogleApiActivityHook.java | 87 ---
.../music/settings/MusicActivityHook.java | 126 ++++
.../extension/music/settings/Settings.java | 1 -
.../preference/MusicPreferenceFragment.java | 80 +++
.../ReVancedPreferenceFragment.java | 38 -
.../search/MusicSearchResultsAdapter.java | 28 +
.../search/MusicSearchViewController.java | 71 ++
.../extension/shared/GmsCoreSupport.java | 17 +-
.../app/revanced/extension/shared/Utils.java | 477 ++-----------
.../extension/shared/checks/Check.java | 11 +-
.../shared/settings/BaseActivityHook.java | 33 +-
.../shared/settings/BaseSettings.java | 3 +
.../extension/shared/settings/Setting.java | 102 ++-
.../AbstractPreferenceFragment.java | 9 +-
.../preference/BulletPointPreference.java | 78 +++
.../BulletPointSwitchPreference.java | 45 ++
.../preference/ColorPickerPreference.java | 349 +++++-----
.../settings/preference/ColorPickerView.java | 283 ++++++--
...olorPickerWithOpacitySliderPreference.java | 34 +
.../CustomDialogListPreference.java | 133 +++-
.../preference/ImportExportPreference.java | 27 +-
.../preference/ReVancedAboutPreference.java | 5 +-
.../ResettableEditTextPreference.java | 4 +-
.../preference/ToolbarPreferenceFragment.java | 2 +-
.../preference/UrlLinkPreference.java | 2 +-
.../settings/search/BaseSearchResultItem.java | 365 ++++++++++
.../search/BaseSearchResultsAdapter.java | 621 +++++++++++++++++
.../search/BaseSearchViewController.java | 653 ++++++++++++++++++
.../settings/search/SearchHistoryManager.java | 377 ++++++++++
.../extension/shared/ui/ColorDot.java | 61 ++
.../extension/shared/ui/CustomDialog.java | 472 +++++++++++++
.../shared/ui/SheetBottomDialog.java | 463 +++++++++++++
...ivityHook.java => TikTokActivityHook.java} | 18 +-
.../preference/DownloadPathPreference.java | 2 +-
.../ReVancedTikTokAboutPreference.java | 2 +-
...ent.java => TikTokPreferenceFragment.java} | 2 +-
...ivityHook.java => TwitchActivityHook.java} | 47 +-
.../preference/CustomPreferenceCategory.java | 1 +
...ent.java => TwitchPreferenceFragment.java} | 4 +-
.../patches/AlternativeThumbnailsPatch.java | 61 +-
.../youtube/patches/ChangeStartPagePatch.java | 7 +
...WatchHistoryDomainNameResolutionPatch.java | 3 +-
.../youtube/patches/DownloadsPatch.java | 4 +-
.../HidePlayerOverlayButtonsPatch.java | 10 +-
.../youtube/patches/MiniplayerPatch.java | 64 +-
.../patches/SeekbarThumbnailsPatch.java | 7 +
.../announcements/AnnouncementsPatch.java | 3 +-
.../PlayerFlyoutMenuItemsFilter.java | 8 +
.../speed/CustomPlaybackSpeedPatch.java | 569 ++++++---------
.../patches/theme/SeekbarColorPatch.java | 5 +-
.../ReturnYouTubeDislikeAboutPreference.java | 2 +-
.../settings/SearchViewController.java | 414 -----------
.../extension/youtube/settings/Settings.java | 122 ++--
...vityHook.java => YouTubeActivityHook.java} | 65 +-
...ativeThumbnailsAboutDeArrowPreference.java | 1 +
.../ExternalDownloaderPreference.java | 9 +-
.../ReVancedPreferenceFragment.java | 483 -------------
...oofStreamingDataSideEffectsPreference.java | 4 +-
.../preference/YouTubePreferenceFragment.java | 80 +++
.../search/YouTubeSearchResultsAdapter.java | 28 +
.../search/YouTubeSearchViewController.java | 70 ++
.../SegmentPlaybackController.java | 25 +-
.../sponsorblock/SponsorBlockSettings.java | 58 +-
.../sponsorblock/SponsorBlockUtils.java | 24 +-
.../sponsorblock/objects/SegmentCategory.java | 224 +++---
.../SegmentCategoryListPreference.java | 371 ----------
.../objects/SegmentCategoryPreference.java | 165 +++++
.../sponsorblock/objects/SponsorSegment.java | 9 +-
.../sponsorblock/ui/NewSegmentLayout.java | 14 +-
.../sponsorblock/ui/SkipSponsorButton.java | 7 +-
.../ui/SponsorBlockAboutPreference.java | 2 +-
.../ui/SponsorBlockPreferenceGroup.java | 321 ++++-----
.../SponsorBlockStatsPreferenceCategory.java | 30 +-
.../ui/SponsorBlockViewController.java | 17 +-
.../SwipeControlsConfigurationProvider.kt | 11 +-
.../videoplayer/PlayerControlButton.java | 11 +-
.../videoplayer/VideoQualityDialogButton.java | 200 ++----
.../music/misc/settings/SettingsPatch.kt | 66 +-
.../shared/misc/settings/SettingsPatch.kt | 13 +-
.../tiktok/misc/settings/SettingsPatch.kt | 2 +-
.../twitch/misc/settings/SettingsPatch.kt | 2 +-
.../swipecontrols/SwipeControlsPatch.kt | 4 +-
.../hide/general/HideLayoutComponentsPatch.kt | 10 +-
.../youtube/misc/settings/SettingsPatch.kt | 189 +++--
.../youtube/video/speed/PlaybackSpeedPatch.kt | 2 +-
.../resources/addresources/values/arrays.xml | 30 +-
.../resources/addresources/values/strings.xml | 26 +-
.../revanced_settings_circle_background.xml | 8 -
.../revanced_settings_custom_checkmark.xml | 2 +-
.../revanced_settings_search_remove.xml | 9 +
.../layout/revanced_color_dot_widget.xml | 8 +-
.../revanced_custom_list_item_checked.xml | 4 +-
.../revanced_music_settings_with_toolbar.xml | 40 --
...evanced_preference_search_history_item.xml | 50 ++
...anced_preference_search_history_screen.xml | 132 ++++
.../revanced_preference_search_no_result.xml | 57 ++
...evanced_preference_search_result_color.xml | 47 ++
..._preference_search_result_group_header.xml | 19 +
...revanced_preference_search_result_list.xml | 38 +
...anced_preference_search_result_regular.xml | 38 +
...anced_preference_search_result_switch.xml} | 46 +-
.../revanced_search_suggestion_item.xml | 31 -
.../settings/music/values/styles.xml | 5 +
.../{host => youtube}/values/styles.xml | 0
104 files changed, 6066 insertions(+), 3453 deletions(-)
delete mode 100644 extensions/music/src/main/java/app/revanced/extension/music/settings/GoogleApiActivityHook.java
create mode 100644 extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java
create mode 100644 extensions/music/src/main/java/app/revanced/extension/music/settings/preference/MusicPreferenceFragment.java
delete mode 100644 extensions/music/src/main/java/app/revanced/extension/music/settings/preference/ReVancedPreferenceFragment.java
create mode 100644 extensions/music/src/main/java/app/revanced/extension/music/settings/search/MusicSearchResultsAdapter.java
create mode 100644 extensions/music/src/main/java/app/revanced/extension/music/settings/search/MusicSearchViewController.java
create mode 100644 extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/BulletPointPreference.java
create mode 100644 extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/BulletPointSwitchPreference.java
create mode 100644 extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ColorPickerWithOpacitySliderPreference.java
rename extensions/{youtube/src/main/java/app/revanced/extension/youtube => shared/library/src/main/java/app/revanced/extension/shared}/settings/preference/UrlLinkPreference.java (95%)
create mode 100644 extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultItem.java
create mode 100644 extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java
create mode 100644 extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchViewController.java
create mode 100644 extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/SearchHistoryManager.java
create mode 100644 extensions/shared/library/src/main/java/app/revanced/extension/shared/ui/ColorDot.java
create mode 100644 extensions/shared/library/src/main/java/app/revanced/extension/shared/ui/CustomDialog.java
create mode 100644 extensions/shared/library/src/main/java/app/revanced/extension/shared/ui/SheetBottomDialog.java
rename extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/{AdPersonalizationActivityHook.java => TikTokActivityHook.java} (86%)
rename extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/preference/{ReVancedPreferenceFragment.java => TikTokPreferenceFragment.java} (97%)
rename extensions/twitch/src/main/java/app/revanced/extension/twitch/settings/{AppCompatActivityHook.java => TwitchActivityHook.java} (70%)
rename extensions/twitch/src/main/java/app/revanced/extension/twitch/settings/preference/{ReVancedPreferenceFragment.java => TwitchPreferenceFragment.java} (82%)
delete mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/SearchViewController.java
rename extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/{LicenseActivityHook.java => YouTubeActivityHook.java} (66%)
delete mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java
create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/YouTubePreferenceFragment.java
create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/search/YouTubeSearchResultsAdapter.java
create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/search/YouTubeSearchViewController.java
delete mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/SegmentCategoryListPreference.java
create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/SegmentCategoryPreference.java
delete mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_circle_background.xml
create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_search_remove.xml
delete mode 100644 patches/src/main/resources/settings/layout/revanced_music_settings_with_toolbar.xml
create mode 100644 patches/src/main/resources/settings/layout/revanced_preference_search_history_item.xml
create mode 100644 patches/src/main/resources/settings/layout/revanced_preference_search_history_screen.xml
create mode 100644 patches/src/main/resources/settings/layout/revanced_preference_search_no_result.xml
create mode 100644 patches/src/main/resources/settings/layout/revanced_preference_search_result_color.xml
create mode 100644 patches/src/main/resources/settings/layout/revanced_preference_search_result_group_header.xml
create mode 100644 patches/src/main/resources/settings/layout/revanced_preference_search_result_list.xml
create mode 100644 patches/src/main/resources/settings/layout/revanced_preference_search_result_regular.xml
rename patches/src/main/resources/settings/layout/{revanced_preference_with_icon_no_search_result.xml => revanced_preference_search_result_switch.xml} (56%)
delete mode 100644 patches/src/main/resources/settings/layout/revanced_search_suggestion_item.xml
rename patches/src/main/resources/settings/{host => youtube}/values/styles.xml (100%)
diff --git a/extensions/music/src/main/java/app/revanced/extension/music/settings/GoogleApiActivityHook.java b/extensions/music/src/main/java/app/revanced/extension/music/settings/GoogleApiActivityHook.java
deleted file mode 100644
index 336ea890f..000000000
--- a/extensions/music/src/main/java/app/revanced/extension/music/settings/GoogleApiActivityHook.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package app.revanced.extension.music.settings;
-
-import android.app.Activity;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-import android.preference.PreferenceFragment;
-import android.view.View;
-
-import app.revanced.extension.music.settings.preference.ReVancedPreferenceFragment;
-import app.revanced.extension.shared.Logger;
-import app.revanced.extension.shared.Utils;
-import app.revanced.extension.shared.settings.BaseActivityHook;
-
-/**
- * Hooks GoogleApiActivity to inject a custom ReVancedPreferenceFragment with a toolbar.
- */
-public class GoogleApiActivityHook extends BaseActivityHook {
- /**
- * Injection point
- *
- * Creates an instance of GoogleApiActivityHook for use in static initialization.
- */
- @SuppressWarnings("unused")
- public static GoogleApiActivityHook createInstance() {
- // Must touch the Music settings to ensure the class is loaded and
- // the values can be found when setting the UI preferences.
- // Logging anything under non debug ensures this is set.
- Logger.printInfo(() -> "Permanent repeat enabled: " + Settings.PERMANENT_REPEAT.get());
-
- // YT Music always uses dark mode.
- Utils.setIsDarkModeEnabled(true);
-
- return new GoogleApiActivityHook();
- }
-
- /**
- * Sets the fixed theme for the activity.
- */
- @Override
- protected void customizeActivityTheme(Activity activity) {
- // Override the default YouTube Music theme to increase start padding of list items.
- // Custom style located in resources/music/values/style.xml
- activity.setTheme(Utils.getResourceIdentifier("Theme.ReVanced.YouTubeMusic.Settings", "style"));
- }
-
- /**
- * Returns the resource ID for the YouTube Music settings layout.
- */
- @Override
- protected int getContentViewResourceId() {
- return Utils.getResourceIdentifier("revanced_music_settings_with_toolbar", "layout");
- }
-
- /**
- * Returns the fixed background color for the toolbar.
- */
- @Override
- protected int getToolbarBackgroundColor() {
- return Utils.getResourceColor("ytm_color_black");
- }
-
- /**
- * Returns the navigation icon with a color filter applied.
- */
- @Override
- protected Drawable getNavigationIcon() {
- Drawable navigationIcon = ReVancedPreferenceFragment.getBackButtonDrawable();
- navigationIcon.setColorFilter(Utils.getAppForegroundColor(), PorterDuff.Mode.SRC_IN);
- return navigationIcon;
- }
-
- /**
- * Returns the click listener that finishes the activity when the navigation icon is clicked.
- */
- @Override
- protected View.OnClickListener getNavigationClickListener(Activity activity) {
- return view -> activity.finish();
- }
-
- /**
- * Creates a new ReVancedPreferenceFragment for the activity.
- */
- @Override
- protected PreferenceFragment createPreferenceFragment() {
- return new ReVancedPreferenceFragment();
- }
-}
diff --git a/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java b/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java
new file mode 100644
index 000000000..bb19d2497
--- /dev/null
+++ b/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java
@@ -0,0 +1,126 @@
+package app.revanced.extension.music.settings;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.preference.PreferenceFragment;
+import android.view.View;
+import android.widget.Toolbar;
+
+import app.revanced.extension.music.settings.preference.MusicPreferenceFragment;
+import app.revanced.extension.music.settings.search.MusicSearchViewController;
+import app.revanced.extension.shared.Logger;
+import app.revanced.extension.shared.Utils;
+import app.revanced.extension.shared.settings.BaseActivityHook;
+
+/**
+ * Hooks GoogleApiActivity to inject a custom {@link MusicPreferenceFragment} with a toolbar and search.
+ */
+public class MusicActivityHook extends BaseActivityHook {
+
+ @SuppressLint("StaticFieldLeak")
+ public static MusicSearchViewController searchViewController;
+
+ /**
+ * Injection point.
+ */
+ @SuppressWarnings("unused")
+ public static void initialize(Activity parentActivity) {
+ // Must touch the Music settings to ensure the class is loaded and
+ // the values can be found when setting the UI preferences.
+ // Logging anything under non debug ensures this is set.
+ Logger.printInfo(() -> "Permanent repeat enabled: " + Settings.PERMANENT_REPEAT.get());
+
+ // YT Music always uses dark mode.
+ Utils.setIsDarkModeEnabled(true);
+
+ BaseActivityHook.initialize(new MusicActivityHook(), parentActivity);
+ }
+
+ /**
+ * Sets the fixed theme for the activity.
+ */
+ @Override
+ protected void customizeActivityTheme(Activity activity) {
+ // Override the default YouTube Music theme to increase start padding of list items.
+ // Custom style located in resources/music/values/style.xml
+ activity.setTheme(Utils.getResourceIdentifierOrThrow(
+ "Theme.ReVanced.YouTubeMusic.Settings", "style"));
+ }
+
+ /**
+ * Returns the resource ID for the YouTube Music settings layout.
+ */
+ @Override
+ protected int getContentViewResourceId() {
+ return LAYOUT_REVANCED_SETTINGS_WITH_TOOLBAR;
+ }
+
+ /**
+ * Returns the fixed background color for the toolbar.
+ */
+ @Override
+ protected int getToolbarBackgroundColor() {
+ return Utils.getResourceColor("ytm_color_black");
+ }
+
+ /**
+ * Returns the navigation icon with a color filter applied.
+ */
+ @Override
+ protected Drawable getNavigationIcon() {
+ Drawable navigationIcon = MusicPreferenceFragment.getBackButtonDrawable();
+ navigationIcon.setColorFilter(Utils.getAppForegroundColor(), PorterDuff.Mode.SRC_IN);
+ return navigationIcon;
+ }
+
+ /**
+ * Returns the click listener that finishes the activity when the navigation icon is clicked.
+ */
+ @Override
+ protected View.OnClickListener getNavigationClickListener(Activity activity) {
+ return view -> {
+ if (searchViewController != null && searchViewController.isSearchActive()) {
+ searchViewController.closeSearch();
+ } else {
+ activity.finish();
+ }
+ };
+ }
+
+ /**
+ * Adds search view components to the toolbar for {@link MusicPreferenceFragment}.
+ *
+ * @param activity The activity hosting the toolbar.
+ * @param toolbar The configured toolbar.
+ * @param fragment The PreferenceFragment associated with the activity.
+ */
+ @Override
+ protected void onPostToolbarSetup(Activity activity, Toolbar toolbar, PreferenceFragment fragment) {
+ if (fragment instanceof MusicPreferenceFragment) {
+ searchViewController = MusicSearchViewController.addSearchViewComponents(
+ activity, toolbar, (MusicPreferenceFragment) fragment);
+ }
+ }
+
+ /**
+ * Creates a new {@link MusicPreferenceFragment} for the activity.
+ */
+ @Override
+ protected PreferenceFragment createPreferenceFragment() {
+ return new MusicPreferenceFragment();
+ }
+
+ /**
+ * Injection point.
+ *
+ * Overrides {@link Activity#finish()} of the injection Activity.
+ *
+ * @return if the original activity finish method should be allowed to run.
+ */
+ @SuppressWarnings("unused")
+ public static boolean handleFinish() {
+ return MusicSearchViewController.handleFinish(searchViewController);
+ }
+}
diff --git a/extensions/music/src/main/java/app/revanced/extension/music/settings/Settings.java b/extensions/music/src/main/java/app/revanced/extension/music/settings/Settings.java
index 832118829..4feb13d9c 100644
--- a/extensions/music/src/main/java/app/revanced/extension/music/settings/Settings.java
+++ b/extensions/music/src/main/java/app/revanced/extension/music/settings/Settings.java
@@ -2,7 +2,6 @@ package app.revanced.extension.music.settings;
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
-
import static app.revanced.extension.shared.settings.Setting.parent;
import app.revanced.extension.shared.settings.BaseSettings;
diff --git a/extensions/music/src/main/java/app/revanced/extension/music/settings/preference/MusicPreferenceFragment.java b/extensions/music/src/main/java/app/revanced/extension/music/settings/preference/MusicPreferenceFragment.java
new file mode 100644
index 000000000..1ebae16df
--- /dev/null
+++ b/extensions/music/src/main/java/app/revanced/extension/music/settings/preference/MusicPreferenceFragment.java
@@ -0,0 +1,80 @@
+package app.revanced.extension.music.settings.preference;
+
+import android.app.Dialog;
+import android.preference.PreferenceScreen;
+import android.widget.Toolbar;
+
+import app.revanced.extension.music.settings.MusicActivityHook;
+import app.revanced.extension.shared.Logger;
+import app.revanced.extension.shared.Utils;
+import app.revanced.extension.shared.settings.preference.ToolbarPreferenceFragment;
+
+/**
+ * Preference fragment for ReVanced settings.
+ */
+@SuppressWarnings("deprecation")
+public class MusicPreferenceFragment extends ToolbarPreferenceFragment {
+ /**
+ * The main PreferenceScreen used to display the current set of preferences.
+ */
+ private PreferenceScreen preferenceScreen;
+
+ /**
+ * Initializes the preference fragment.
+ */
+ @Override
+ protected void initialize() {
+ super.initialize();
+
+ try {
+ preferenceScreen = getPreferenceScreen();
+ Utils.sortPreferenceGroups(preferenceScreen);
+ setPreferenceScreenToolbar(preferenceScreen);
+ } catch (Exception ex) {
+ Logger.printException(() -> "initialize failure", ex);
+ }
+ }
+
+ /**
+ * Called when the fragment starts.
+ */
+ @Override
+ public void onStart() {
+ super.onStart();
+ try {
+ // Initialize search controller if needed
+ if (MusicActivityHook.searchViewController != null) {
+ // Trigger search data collection after fragment is ready.
+ MusicActivityHook.searchViewController.initializeSearchData();
+ }
+ } catch (Exception ex) {
+ Logger.printException(() -> "onStart failure", ex);
+ }
+ }
+
+ /**
+ * Sets toolbar for all nested preference screens.
+ */
+ @Override
+ protected void customizeToolbar(Toolbar toolbar) {
+ MusicActivityHook.setToolbarLayoutParams(toolbar);
+ }
+
+ /**
+ * Perform actions after toolbar setup.
+ */
+ @Override
+ protected void onPostToolbarSetup(Toolbar toolbar, Dialog preferenceScreenDialog) {
+ if (MusicActivityHook.searchViewController != null
+ && MusicActivityHook.searchViewController.isSearchActive()) {
+ toolbar.post(() -> MusicActivityHook.searchViewController.closeSearch());
+ }
+ }
+
+ /**
+ * Returns the preference screen for external access by SearchViewController.
+ */
+ public PreferenceScreen getPreferenceScreenForSearch() {
+ return preferenceScreen;
+ }
+}
diff --git a/extensions/music/src/main/java/app/revanced/extension/music/settings/preference/ReVancedPreferenceFragment.java b/extensions/music/src/main/java/app/revanced/extension/music/settings/preference/ReVancedPreferenceFragment.java
deleted file mode 100644
index 67ca69ba4..000000000
--- a/extensions/music/src/main/java/app/revanced/extension/music/settings/preference/ReVancedPreferenceFragment.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package app.revanced.extension.music.settings.preference;
-
-import android.widget.Toolbar;
-
-import app.revanced.extension.music.settings.GoogleApiActivityHook;
-import app.revanced.extension.shared.Logger;
-import app.revanced.extension.shared.Utils;
-import app.revanced.extension.shared.settings.preference.ToolbarPreferenceFragment;
-
-/**
- * Preference fragment for ReVanced settings.
- */
-@SuppressWarnings({"deprecation", "NewApi"})
-public class ReVancedPreferenceFragment extends ToolbarPreferenceFragment {
-
- /**
- * Initializes the preference fragment.
- */
- @Override
- protected void initialize() {
- super.initialize();
-
- try {
- Utils.sortPreferenceGroups(getPreferenceScreen());
- setPreferenceScreenToolbar(getPreferenceScreen());
- } catch (Exception ex) {
- Logger.printException(() -> "initialize failure", ex);
- }
- }
-
- /**
- * Sets toolbar for all nested preference screens.
- */
- @Override
- protected void customizeToolbar(Toolbar toolbar) {
- GoogleApiActivityHook.setToolbarLayoutParams(toolbar);
- }
-}
diff --git a/extensions/music/src/main/java/app/revanced/extension/music/settings/search/MusicSearchResultsAdapter.java b/extensions/music/src/main/java/app/revanced/extension/music/settings/search/MusicSearchResultsAdapter.java
new file mode 100644
index 000000000..65ccd4ea1
--- /dev/null
+++ b/extensions/music/src/main/java/app/revanced/extension/music/settings/search/MusicSearchResultsAdapter.java
@@ -0,0 +1,28 @@
+package app.revanced.extension.music.settings.search;
+
+import android.content.Context;
+import android.preference.PreferenceScreen;
+
+import app.revanced.extension.shared.settings.search.BaseSearchResultsAdapter;
+import app.revanced.extension.shared.settings.search.BaseSearchViewController;
+import app.revanced.extension.shared.settings.search.BaseSearchResultItem;
+
+import java.util.List;
+
+/**
+ * Music-specific search results adapter.
+ */
+@SuppressWarnings("deprecation")
+public class MusicSearchResultsAdapter extends BaseSearchResultsAdapter {
+
+ public MusicSearchResultsAdapter(Context context, List items,
+ BaseSearchViewController.BasePreferenceFragment fragment,
+ BaseSearchViewController searchViewController) {
+ super(context, items, fragment, searchViewController);
+ }
+
+ @Override
+ protected PreferenceScreen getMainPreferenceScreen() {
+ return fragment.getPreferenceScreenForSearch();
+ }
+}
diff --git a/extensions/music/src/main/java/app/revanced/extension/music/settings/search/MusicSearchViewController.java b/extensions/music/src/main/java/app/revanced/extension/music/settings/search/MusicSearchViewController.java
new file mode 100644
index 000000000..6681a2f02
--- /dev/null
+++ b/extensions/music/src/main/java/app/revanced/extension/music/settings/search/MusicSearchViewController.java
@@ -0,0 +1,71 @@
+package app.revanced.extension.music.settings.search;
+
+import android.app.Activity;
+import android.preference.Preference;
+import android.preference.PreferenceScreen;
+import android.view.View;
+import android.widget.Toolbar;
+
+import app.revanced.extension.music.settings.preference.MusicPreferenceFragment;
+import app.revanced.extension.shared.settings.search.*;
+
+/**
+ * Music-specific search view controller implementation.
+ */
+@SuppressWarnings("deprecation")
+public class MusicSearchViewController extends BaseSearchViewController {
+
+ public static MusicSearchViewController addSearchViewComponents(Activity activity, Toolbar toolbar,
+ MusicPreferenceFragment fragment) {
+ return new MusicSearchViewController(activity, toolbar, fragment);
+ }
+
+ private MusicSearchViewController(Activity activity, Toolbar toolbar, MusicPreferenceFragment fragment) {
+ super(activity, toolbar, new PreferenceFragmentAdapter(fragment));
+ }
+
+ @Override
+ protected BaseSearchResultsAdapter createSearchResultsAdapter() {
+ return new MusicSearchResultsAdapter(activity, filteredSearchItems, fragment, this);
+ }
+
+ @Override
+ protected boolean isSpecialPreferenceGroup(Preference preference) {
+ // Music doesn't have SponsorBlock, so no special groups.
+ return false;
+ }
+
+ @Override
+ protected void setupSpecialPreferenceListeners(BaseSearchResultItem item) {
+ // Music doesn't have special preferences.
+ // This method can be empty or handle music-specific preferences if any.
+ }
+
+ // Static method for handling Activity finish
+ public static boolean handleFinish(MusicSearchViewController searchViewController) {
+ if (searchViewController != null && searchViewController.isSearchActive()) {
+ searchViewController.closeSearch();
+ return true;
+ }
+ return false;
+ }
+
+ // Adapter to wrap MusicPreferenceFragment to BasePreferenceFragment interface.
+ private record PreferenceFragmentAdapter(MusicPreferenceFragment fragment) implements BasePreferenceFragment {
+
+ @Override
+ public PreferenceScreen getPreferenceScreenForSearch() {
+ return fragment.getPreferenceScreenForSearch();
+ }
+
+ @Override
+ public View getView() {
+ return fragment.getView();
+ }
+
+ @Override
+ public Activity getActivity() {
+ return fragment.getActivity();
+ }
+ }
+}
diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java
index 3f9f0af11..978ee7131 100644
--- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java
+++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java
@@ -27,6 +27,7 @@ import java.util.Locale;
import app.revanced.extension.shared.requests.Requester;
import app.revanced.extension.shared.requests.Route;
+import app.revanced.extension.shared.ui.CustomDialog;
@SuppressWarnings("unused")
public class GmsCoreSupport {
@@ -80,17 +81,17 @@ public class GmsCoreSupport {
// Otherwise, if device is in dark mode the dialog is shown with wrong color scheme.
Utils.runOnMainThreadDelayed(() -> {
// Create the custom dialog.
- Pair