From cbccb46e639003adbed941f9b88c41b4c9998729 Mon Sep 17 00:00:00 2001
From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
Date: Thu, 4 Apr 2024 00:21:51 +0400
Subject: [PATCH] fix(YouTube - Navigation bar hook): Handle if search is
 active but hidden behind a maximized player

---
 .../patches/AlternativeThumbnailsPatch.java   |  8 +++---
 .../components/KeywordContentFilter.java      | 25 +++++++++++--------
 .../patches/components/ShortsFilter.java      | 17 +++++++++----
 .../youtube/shared/NavigationBar.java         |  7 +++---
 4 files changed, 36 insertions(+), 21 deletions(-)

diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/AlternativeThumbnailsPatch.java b/app/src/main/java/app/revanced/integrations/youtube/patches/AlternativeThumbnailsPatch.java
index 1e0d2e1e..888649f6 100644
--- a/app/src/main/java/app/revanced/integrations/youtube/patches/AlternativeThumbnailsPatch.java
+++ b/app/src/main/java/app/revanced/integrations/youtube/patches/AlternativeThumbnailsPatch.java
@@ -163,12 +163,14 @@ public final class AlternativeThumbnailsPatch {
     }
 
     private static EnumSetting<ThumbnailOption> optionSettingForCurrentNavigation() {
-        if (NavigationBar.isSearchBarActive()) { // Must check search first.
-            return ALT_THUMBNAIL_SEARCH;
-        }
+        // Must check player type first, as search bar can be active behind the player.
         if (PlayerType.getCurrent().isMaximizedOrFullscreen()) {
             return ALT_THUMBNAIL_PLAYER;
         }
+        // Must check second, as search can be from any tab.
+        if (NavigationBar.isSearchBarActive()) {
+            return ALT_THUMBNAIL_SEARCH;
+        }
         if (NavigationButton.HOME.isSelected()) {
             return ALT_THUMBNAIL_HOME;
         }
diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/components/KeywordContentFilter.java b/app/src/main/java/app/revanced/integrations/youtube/patches/components/KeywordContentFilter.java
index 7858bb74..ed6e63f0 100644
--- a/app/src/main/java/app/revanced/integrations/youtube/patches/components/KeywordContentFilter.java
+++ b/app/src/main/java/app/revanced/integrations/youtube/patches/components/KeywordContentFilter.java
@@ -122,24 +122,27 @@ final class KeywordContentFilter extends Filter {
     }
 
     private static boolean hideKeywordSettingIsActive() {
-        if (NavigationBar.isSearchBarActive()) {
-            // Must check first. Search bar can be active with almost any tab.
-            logNavigationState("Search");
-            return Settings.HIDE_KEYWORD_CONTENT_SEARCH.get();
-        } else if (PlayerType.getCurrent().isMaximizedOrFullscreen()) {
+        // Must check player type first, as search bar can be active behind the player.
+        if (PlayerType.getCurrent().isMaximizedOrFullscreen()) {
             // For now, consider the under video results the same as the home feed.
             logNavigationState("Player active");
             return Settings.HIDE_KEYWORD_CONTENT_HOME.get();
-        } else if (NavigationButton.HOME.isSelected()) {
+        }
+        // Must check second, as search can be from any tab.
+        if (NavigationBar.isSearchBarActive()) {
+            logNavigationState("Search");
+            return Settings.HIDE_KEYWORD_CONTENT_SEARCH.get();
+        }
+        if (NavigationButton.HOME.isSelected()) {
             logNavigationState("Home tab");
             return Settings.HIDE_KEYWORD_CONTENT_HOME.get();
-        } else if (NavigationButton.SUBSCRIPTIONS.isSelected()) {
+        }
+        if (NavigationButton.SUBSCRIPTIONS.isSelected()) {
             logNavigationState("Subscription tab");
             return Settings.HIDE_SUBSCRIPTIONS_BUTTON.get();
-        } else {
-            // User is in the Library or Notifications tab.
-            logNavigationState("Ignored tab");
         }
+        // User is in the Library or Notifications tab.
+        logNavigationState("Ignored tab");
         return false;
     }
 
@@ -195,6 +198,7 @@ final class KeywordContentFilter extends Filter {
 
     private synchronized void parseKeywords() { // Must be synchronized since Litho is multi-threaded.
         String rawKeywords = Settings.HIDE_KEYWORD_CONTENT_PHRASES.get();
+        //noinspection StringEquality
         if (rawKeywords == lastKeywordPhrasesParsed) {
             Logger.printDebug(() -> "Using previously initialized search");
             return; // Another thread won the race, and search is already initialized.
@@ -265,6 +269,7 @@ final class KeywordContentFilter extends Filter {
         if (!hideKeywordSettingIsActive()) return false;
 
         // Field is intentionally compared using reference equality.
+        //noinspection StringEquality
         if (Settings.HIDE_KEYWORD_CONTENT_PHRASES.get() != lastKeywordPhrasesParsed) {
             // User changed the keywords.
             parseKeywords();
diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/components/ShortsFilter.java b/app/src/main/java/app/revanced/integrations/youtube/patches/components/ShortsFilter.java
index 8c3dbf26..5b32d7a1 100644
--- a/app/src/main/java/app/revanced/integrations/youtube/patches/components/ShortsFilter.java
+++ b/app/src/main/java/app/revanced/integrations/youtube/patches/components/ShortsFilter.java
@@ -219,12 +219,19 @@ public final class ShortsFilter extends Filter {
     }
 
     private static boolean shouldHideShortsFeedItems() {
-        if (NavigationBar.isSearchBarActive()) { // Must check search first.
-            return Settings.HIDE_SHORTS_SEARCH.get();
-        } else if (PlayerType.getCurrent().isMaximizedOrFullscreen()
-                || NavigationBar.NavigationButton.HOME.isSelected()) {
+        // Must check player type first, as search bar can be active behind the player.
+        if (PlayerType.getCurrent().isMaximizedOrFullscreen()) {
+            // For now, consider the under video results the same as the home feed.
             return Settings.HIDE_SHORTS_HOME.get();
-        } else if (NavigationBar.NavigationButton.SUBSCRIPTIONS.isSelected()) {
+        }
+        // Must check second, as search can be from any tab.
+        if (NavigationBar.isSearchBarActive()) {
+            return Settings.HIDE_SHORTS_SEARCH.get();
+        }
+        if (NavigationBar.NavigationButton.HOME.isSelected()) {
+            return Settings.HIDE_SHORTS_HOME.get();
+        }
+        if (NavigationBar.NavigationButton.SUBSCRIPTIONS.isSelected()) {
             return Settings.HIDE_SHORTS_SUBSCRIPTIONS.get();
         }
         return false;
diff --git a/app/src/main/java/app/revanced/integrations/youtube/shared/NavigationBar.java b/app/src/main/java/app/revanced/integrations/youtube/shared/NavigationBar.java
index 4cec2680..2655a60d 100644
--- a/app/src/main/java/app/revanced/integrations/youtube/shared/NavigationBar.java
+++ b/app/src/main/java/app/revanced/integrations/youtube/shared/NavigationBar.java
@@ -27,14 +27,15 @@ public final class NavigationBar {
     }
 
     /**
-     * @return If the search bar is on screen.
+     * @return If the search bar is on screen.  This includes if the player
+     *         is on screen and the search results are behind the player (and not visible).
+     *         Detecting the search is covered by the player can be done by checking {@link PlayerType#isMaximizedOrFullscreen()}.
      */
     public static boolean isSearchBarActive() {
         View searchbarResults = searchBarResultsRef.get();
         return searchbarResults != null && searchbarResults.getParent() != null;
     }
 
-
     /**
      * Last YT navigation enum loaded.  Not necessarily the active navigation tab.
      */
@@ -44,7 +45,7 @@ public final class NavigationBar {
     /**
      * Injection point.
      */
-    public static void setLastAppNavigationEnum(@Nullable Enum ytNavigationEnumName) {
+    public static void setLastAppNavigationEnum(@Nullable Enum<?> ytNavigationEnumName) {
         if (ytNavigationEnumName != null) {
             lastYTNavigationEnumName = ytNavigationEnumName.name();
         }