diff --git a/CHANGELOG.md b/CHANGELOG.md index aaa23f4f78..7f0964793d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +## [1.7.1-dev.4](https://github.com/ReVanced/revanced-integrations/compare/v1.7.1-dev.3...v1.7.1-dev.4) (2024-04-04) + + +### Bug Fixes + +* **YouTube - Hide load more button:** Include patch with `Hide layout components`, and hide button only in search feed ([#600](https://github.com/ReVanced/revanced-integrations/issues/600)) ([c420891](https://github.com/ReVanced/revanced-integrations/commit/c420891e3ef134f30af79cf2f30da3fa2fe5a455)) + +## [1.7.1-dev.3](https://github.com/ReVanced/revanced-integrations/compare/v1.7.1-dev.2...v1.7.1-dev.3) (2024-04-04) + + +### Bug Fixes + +* **YouTube - Player flyout menu:** Add hide Lock screen menu ([#609](https://github.com/ReVanced/revanced-integrations/issues/609)) ([b2fe105](https://github.com/ReVanced/revanced-integrations/commit/b2fe105199d4a5958676cbc8f9c701541e8ff24a)) + +## [1.7.1-dev.2](https://github.com/ReVanced/revanced-integrations/compare/v1.7.1-dev.1...v1.7.1-dev.2) (2024-04-03) + + +### Bug Fixes + +* **YouTube - Navigation bar hook:** Handle if search is active but hidden behind a maximized player ([cbccb46](https://github.com/ReVanced/revanced-integrations/commit/cbccb46e639003adbed941f9b88c41b4c9998729)) + ## [1.7.1-dev.1](https://github.com/ReVanced/revanced-integrations/compare/v1.7.0...v1.7.1-dev.1) (2024-04-01) 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 1e0d2e1eeb..888649f6f4 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 @@ private static Uri validateSettings() { } private static EnumSetting 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/HideLoadMoreButtonPatch.java b/app/src/main/java/app/revanced/integrations/youtube/patches/HideLoadMoreButtonPatch.java deleted file mode 100644 index fa3a0e70ef..0000000000 --- a/app/src/main/java/app/revanced/integrations/youtube/patches/HideLoadMoreButtonPatch.java +++ /dev/null @@ -1,14 +0,0 @@ -package app.revanced.integrations.youtube.patches; - -import android.view.View; - -import app.revanced.integrations.youtube.settings.Settings; -import app.revanced.integrations.shared.Utils; - -@SuppressWarnings("unused") -public class HideLoadMoreButtonPatch { - public static void hideLoadMoreButton(View view){ - if(!Settings.HIDE_LOAD_MORE_BUTTON.get()) return; - Utils.hideViewByLayoutParams(view); - } -} 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 7858bb7477..ed6e63f07f 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 @@ private static void logNavigationState(String state) { } 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 @@ private static boolean phrasesWillHideAllVideos(@NonNull String[] phrases) { 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 @@ boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBuff 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/LayoutComponentsFilter.java b/app/src/main/java/app/revanced/integrations/youtube/patches/components/LayoutComponentsFilter.java index f32ad545bc..8c52c2d893 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/patches/components/LayoutComponentsFilter.java +++ b/app/src/main/java/app/revanced/integrations/youtube/patches/components/LayoutComponentsFilter.java @@ -1,13 +1,17 @@ package app.revanced.integrations.youtube.patches.components; import android.os.Build; +import android.view.View; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; +import app.revanced.integrations.shared.Utils; import app.revanced.integrations.youtube.settings.Settings; import app.revanced.integrations.shared.Logger; import app.revanced.integrations.youtube.StringTrieSearch; +import app.revanced.integrations.youtube.shared.NavigationBar; +import app.revanced.integrations.youtube.shared.PlayerType; @SuppressWarnings("unused") public final class LayoutComponentsFilter extends Filter { @@ -322,7 +326,24 @@ public static boolean filterMixPlaylists(final Object conversionContext, @Nullab return true; } + /** + * Injection point. + */ public static boolean showWatermark() { return !Settings.HIDE_VIDEO_CHANNEL_WATERMARK.get(); } + + private static final boolean HIDE_SHOW_MORE_BUTTON_ENABLED = Settings.HIDE_SHOW_MORE_BUTTON.get(); + + /** + * Injection point. + */ + public static void hideShowMoreButton(View view) { + if (HIDE_SHOW_MORE_BUTTON_ENABLED + && NavigationBar.isSearchBarActive() + // Search bar can be active but behind the player. + && !PlayerType.getCurrent().isMaximizedOrFullscreen()) { + Utils.hideViewByLayoutParams(view); + } + } } diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java b/app/src/main/java/app/revanced/integrations/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java index 19ccfac5ce..7099bf2f5e 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java +++ b/app/src/main/java/app/revanced/integrations/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java @@ -57,6 +57,10 @@ public PlayerFlyoutMenuItemsFilter() { Settings.HIDE_MORE_INFO_MENU, "yt_outline_info_circle" ), + new ByteArrayFilterGroup( + Settings.HIDE_LOCK_SCREEN_MENU, + "yt_outline_lock" + ), new ByteArrayFilterGroup( Settings.HIDE_SPEED_MENU, "yt_outline_play_arrow_half_circle" @@ -75,15 +79,21 @@ public PlayerFlyoutMenuItemsFilter() { @Override boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBufferArray, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { + // Only 1 path callback was added, so the matched group must be the overflow menu. + if (contentIndex != 0) { + return false; // Overflow menu is always the start of the path. + } + // Shorts also use this player flyout panel - if (PlayerType.getCurrent().isNoneOrHidden() || exception.check(protobufBufferArray).isFiltered()) + if (PlayerType.getCurrent().isNoneOrHidden() || exception.check(protobufBufferArray).isFiltered()) { return false; + } - // Only 1 path callback was added, so the matched group must be the overflow menu. - if (contentIndex == 0 && flyoutFilterGroupList.check(protobufBufferArray).isFiltered()) { + if (flyoutFilterGroupList.check(protobufBufferArray).isFiltered()) { // Super class handles logging. return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); } + return false; } } 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 8c3dbf26be..5b32d7a1f6 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 @@ boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBuff } private static boolean shouldHideShortsFeedItems() { - if (NavigationBar.isSearchBarActive()) { // Must check search first. + // 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(); + } + // Must check second, as search can be from any tab. + if (NavigationBar.isSearchBarActive()) { return Settings.HIDE_SHORTS_SEARCH.get(); - } else if (PlayerType.getCurrent().isMaximizedOrFullscreen() - || NavigationBar.NavigationButton.HOME.isSelected()) { + } + if (NavigationBar.NavigationButton.HOME.isSelected()) { return Settings.HIDE_SHORTS_HOME.get(); - } else if (NavigationBar.NavigationButton.SUBSCRIPTIONS.isSelected()) { + } + if (NavigationBar.NavigationButton.SUBSCRIPTIONS.isSelected()) { return Settings.HIDE_SHORTS_SUBSCRIPTIONS.get(); } return false; diff --git a/app/src/main/java/app/revanced/integrations/youtube/settings/Settings.java b/app/src/main/java/app/revanced/integrations/youtube/settings/Settings.java index 1297d96589..714306f49d 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/settings/Settings.java +++ b/app/src/main/java/app/revanced/integrations/youtube/settings/Settings.java @@ -108,7 +108,8 @@ public class Settings extends BaseSettings { public static final BooleanSetting HIDE_KEYWORD_CONTENT_SEARCH = new BooleanSetting("revanced_hide_keyword_content_search", FALSE); public static final StringSetting HIDE_KEYWORD_CONTENT_PHRASES = new StringSetting("revanced_hide_keyword_content_phrases", "", parentsAny(HIDE_KEYWORD_CONTENT_HOME, HIDE_KEYWORD_CONTENT_SUBSCRIPTIONS, HIDE_KEYWORD_CONTENT_SEARCH)); - public static final BooleanSetting HIDE_LOAD_MORE_BUTTON = new BooleanSetting("revanced_hide_load_more_button", TRUE, true); + @Deprecated public static final BooleanSetting HIDE_LOAD_MORE_BUTTON = new BooleanSetting("revanced_hide_load_more_button", TRUE); + public static final BooleanSetting HIDE_SHOW_MORE_BUTTON = new BooleanSetting("revanced_hide_show_more_button", TRUE, true); public static final BooleanSetting HIDE_MEDICAL_PANELS = new BooleanSetting("revanced_hide_medical_panels", TRUE); public static final BooleanSetting HIDE_MIX_PLAYLISTS = new BooleanSetting("revanced_hide_mix_playlists", TRUE); public static final BooleanSetting HIDE_MOVIES_SECTION = new BooleanSetting("revanced_hide_movies_section", TRUE); @@ -198,6 +199,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting HIDE_HELP_MENU = new BooleanSetting("revanced_hide_player_flyout_help", TRUE); public static final BooleanSetting HIDE_SPEED_MENU = new BooleanSetting("revanced_hide_player_flyout_speed", FALSE); public static final BooleanSetting HIDE_MORE_INFO_MENU = new BooleanSetting("revanced_hide_player_flyout_more_info", TRUE); + public static final BooleanSetting HIDE_LOCK_SCREEN_MENU = new BooleanSetting("revanced_hide_player_flyout_lock_screen", FALSE); public static final BooleanSetting HIDE_AUDIO_TRACK_MENU = new BooleanSetting("revanced_hide_player_flyout_audio_track", FALSE); public static final BooleanSetting HIDE_WATCH_IN_VR_MENU = new BooleanSetting("revanced_hide_player_flyout_watch_in_vr", TRUE); @@ -218,7 +220,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting SPOOF_DEVICE_DIMENSIONS = new BooleanSetting("revanced_spoof_device_dimensions", FALSE, true); public static final BooleanSetting BYPASS_URL_REDIRECTS = new BooleanSetting("revanced_bypass_url_redirects", TRUE); public static final BooleanSetting ANNOUNCEMENTS = new BooleanSetting("revanced_announcements", TRUE); - @Deprecated + @Deprecated public static final StringSetting DEPRECATED_ANNOUNCEMENT_LAST_HASH = new StringSetting("revanced_announcement_last_hash", ""); public static final IntegerSetting ANNOUNCEMENT_LAST_ID = new IntegerSetting("revanced_announcement_last_id", -1); public static final BooleanSetting REMOVE_TRACKING_QUERY_PARAMETER = new BooleanSetting("revanced_remove_tracking_query_parameter", TRUE); @@ -383,6 +385,8 @@ public class Settings extends BaseSettings { HIDE_SHORTS_SEARCH.save(true); } + migrateOldSettingToNew(HIDE_LOAD_MORE_BUTTON, HIDE_SHOW_MORE_BUTTON); + // endregion } } 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 4cec2680af..2655a60d4e 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 static void searchBarResultsViewLoaded(View searchbarResults) { } /** - * @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 static boolean isSearchBarActive() { /** * Injection point. */ - public static void setLastAppNavigationEnum(@Nullable Enum ytNavigationEnumName) { + public static void setLastAppNavigationEnum(@Nullable Enum ytNavigationEnumName) { if (ytNavigationEnumName != null) { lastYTNavigationEnumName = ytNavigationEnumName.name(); } diff --git a/gradle.properties b/gradle.properties index bebd6a9bfa..1c3ea08afb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true android.useAndroidX = true -version = 1.7.1-dev.1 +version = 1.7.1-dev.4