diff --git a/app/src/main/java/app/revanced/integrations/patches/ButtonsPatch.java b/app/src/main/java/app/revanced/integrations/patches/ButtonsPatch.java new file mode 100644 index 00000000..c010e7a3 --- /dev/null +++ b/app/src/main/java/app/revanced/integrations/patches/ButtonsPatch.java @@ -0,0 +1,60 @@ +package app.revanced.integrations.patches; + +import app.revanced.integrations.settings.SettingsEnum; +import app.revanced.integrations.utils.LogHelper; + +final class ButtonsPatch extends Filter { + private final BlockRule actionButtonsRule; + private final BlockRule dislikeRule; + private final BlockRule actionBarRule; + + private final BlockRule[] rules; + + public ButtonsPatch() { + BlockRule like = new BlockRule(SettingsEnum.HIDE_LIKE_BUTTON, "|like_button"); + dislikeRule = new BlockRule(SettingsEnum.HIDE_DISLIKE_BUTTON, "dislike_button"); + BlockRule download = new BlockRule(SettingsEnum.HIDE_DOWNLOAD_BUTTON, "download_button"); + actionButtonsRule = new BlockRule(SettingsEnum.HIDE_ACTION_BUTTON, "ContainerType|video_action_button"); + BlockRule playlist = new BlockRule(SettingsEnum.HIDE_PLAYLIST_BUTTON, "save_to_playlist_button"); + rules = new BlockRule[]{like, dislikeRule, download, actionButtonsRule, playlist}; + + actionBarRule = new BlockRule(null, "video_action_bar"); + + this.pathRegister.registerAll( + like, + dislikeRule, + download, + playlist + ); + } + + private boolean hideActionBar() { + for (BlockRule rule : rules) if (!rule.isEnabled()) return false; + return true; + } + + @Override + public boolean filter(final String path, final String identifier) { + if (hideActionBar() && actionBarRule.check(identifier).isBlocked()) return true; + + var currentIsActionButton = actionButtonsRule.check(path).isBlocked(); + + if (dislikeRule.check(path).isBlocked()) ActionButton.doNotBlockCounter = 4; + + if (currentIsActionButton && ActionButton.doNotBlockCounter-- > 0) { + if (SettingsEnum.HIDE_SHARE_BUTTON.getBoolean()) { + LogHelper.debug(ButtonsPatch.class, "Hiding share button"); + return true; + } else return false; + } + + if ((currentIsActionButton && ActionButton.doNotBlockCounter <= 0 && actionButtonsRule.isEnabled()) || pathRegister.contains(path)) { + LogHelper.debug(ButtonsPatch.class, "Blocked: " + path); + return true; + } else return false; + } + + static class ActionButton { + public static int doNotBlockCounter = 4; + } +} diff --git a/app/src/main/java/app/revanced/integrations/patches/CommentsPatch.java b/app/src/main/java/app/revanced/integrations/patches/CommentsPatch.java new file mode 100644 index 00000000..b318cd99 --- /dev/null +++ b/app/src/main/java/app/revanced/integrations/patches/CommentsPatch.java @@ -0,0 +1,31 @@ +package app.revanced.integrations.patches; + +import app.revanced.integrations.settings.SettingsEnum; +import app.revanced.integrations.utils.LogHelper; + +final class CommentsPatch extends Filter { + + public CommentsPatch() { + var comments = new BlockRule(SettingsEnum.HIDE_COMMENTS_SECTION, "video_metadata_carousel", "_comments"); + var previewComment = new BlockRule( + SettingsEnum.HIDE_PREVIEW_COMMENT, + "carousel_item", + "comments_entry_point_teaser", + "comments_entry_point_simplebox" + ); + + this.pathRegister.registerAll( + comments, + previewComment + ); + } + + @Override + boolean filter(String path, String _identifier) { + if (!pathRegister.contains(path)) return false; + + LogHelper.debug(CommentsPatch.class, "Blocked: " + path); + + return true; + } +} diff --git a/app/src/main/java/app/revanced/integrations/patches/GeneralAdsPatch.java b/app/src/main/java/app/revanced/integrations/patches/GeneralAdsPatch.java new file mode 100644 index 00000000..4c6c4309 --- /dev/null +++ b/app/src/main/java/app/revanced/integrations/patches/GeneralAdsPatch.java @@ -0,0 +1,139 @@ +package app.revanced.integrations.patches; + +import android.view.View; + +import app.revanced.integrations.adremover.AdRemoverAPI; +import app.revanced.integrations.settings.SettingsEnum; +import app.revanced.integrations.utils.LogHelper; +import app.revanced.integrations.utils.ReVancedUtils; + +public final class GeneralAdsPatch extends Filter { + private final String[] IGNORE = { + "home_video_with_context", + "related_video_with_context", + "comment_thread", // skip blocking anything in the comments + "download_", + "library_recent_shelf", + "menu", + "root", + "-count", + "-space", + "-button", + "playlist_add_to_option_wrapper" // do not block on "add to playlist" flyout menu + }; + + private final BlockRule custom = new CustomBlockRule( + SettingsEnum.ADREMOVER_CUSTOM_ENABLED, + SettingsEnum.ADREMOVER_CUSTOM_REMOVAL + ); + + public GeneralAdsPatch() { + var communityPosts = new BlockRule(SettingsEnum.ADREMOVER_COMMUNITY_POSTS_REMOVAL, "post_base_wrapper"); + var communityGuidelines = new BlockRule(SettingsEnum.ADREMOVER_COMMUNITY_GUIDELINES_REMOVAL, "community_guidelines"); + var compactBanner = new BlockRule(SettingsEnum.ADREMOVER_COMPACT_BANNER_REMOVAL, "compact_banner"); + var inFeedSurvey = new BlockRule(SettingsEnum.ADREMOVER_FEED_SURVEY_REMOVAL, "in_feed_survey"); + var medicalPanel = new BlockRule(SettingsEnum.ADREMOVER_MEDICAL_PANEL_REMOVAL, "medical_panel"); + var paidContent = new BlockRule(SettingsEnum.ADREMOVER_PAID_CONTENT_REMOVAL, "paid_content_overlay"); + var merchandise = new BlockRule(SettingsEnum.ADREMOVER_MERCHANDISE_REMOVAL, "product_carousel"); + var infoPanel = new BlockRule(SettingsEnum.ADREMOVER_INFO_PANEL_REMOVAL, "publisher_transparency_panel", "single_item_information_panel"); + var suggestions = new BlockRule(SettingsEnum.ADREMOVER_SUGGESTIONS_REMOVAL, "horizontal_video_shelf"); + var latestPosts = new BlockRule(SettingsEnum.ADREMOVER_HIDE_LATEST_POSTS, "post_shelf"); + var channelGuidelines = new BlockRule(SettingsEnum.ADREMOVER_HIDE_CHANNEL_GUIDELINES, "channel_guidelines_entry_banner"); + var artistCard = new BlockRule(SettingsEnum.HIDE_ARTIST_CARD, "official_card"); + var selfSponsor = new BlockRule(SettingsEnum.ADREMOVER_SELF_SPONSOR_REMOVAL, "cta_shelf_card"); + var chapterTeaser = new BlockRule(SettingsEnum.ADREMOVER_CHAPTER_TEASER_REMOVAL, "expandable_metadata"); + var graySeparator = new BlockRule(SettingsEnum.ADREMOVER_GRAY_SEPARATOR, + "cell_divider" // layout residue (gray line above the buttoned ad), + ); + var buttonedAd = new BlockRule(SettingsEnum.ADREMOVER_BUTTONED_REMOVAL, + "video_display_full_buttoned_layout", + "full_width_square_image_layout", + "_ad_with", + "landscape_image_wide_button_layout" // add with "open outside button" + ); + var generalAds = new BlockRule( + SettingsEnum.ADREMOVER_GENERAL_ADS_REMOVAL, + "ads_video_with_context", + "banner_text_icon", + "watch_metadata_app_promo", + "video_display_full_layout" + ); + var movieAds = new BlockRule( + SettingsEnum.ADREMOVER_MOVIE_REMOVAL, + "browsy_bar", + "compact_movie", + "horizontal_movie_shelf", + "movie_and_show_upsell_card" + ); + + this.pathRegister.registerAll( + generalAds, + buttonedAd, + communityPosts, + paidContent, + suggestions, + latestPosts, + movieAds, + chapterTeaser, + communityGuidelines, + compactBanner, + inFeedSurvey, + medicalPanel, + merchandise, + infoPanel, + channelGuidelines, + artistCard, + selfSponsor + ); + + var carouselAd = new BlockRule(SettingsEnum.ADREMOVER_GENERAL_ADS_REMOVAL, + "carousel_ad" + ); + var shorts = new BlockRule(SettingsEnum.ADREMOVER_SHORTS_REMOVAL, + "reels_player_overlay", + "shorts_shelf", + "inline_shorts" + ); + + this.identifierRegister.registerAll( + shorts, + graySeparator, + carouselAd + ); + } + + public boolean filter(final String path, final String identifier) { + BlockResult result; + + if (custom.isEnabled() && custom.check(path).isBlocked()) + result = BlockResult.CUSTOM; + else if (ReVancedUtils.containsAny(path, IGNORE)) + result = BlockResult.IGNORED; + else if (pathRegister.contains(path) || identifierRegister.contains(identifier)) + result = BlockResult.DEFINED; + else + result = BlockResult.UNBLOCKED; + + LogHelper.debug( + GeneralAdsPatch.class, + String.format("%s (ID: %s): %s", result.message, identifier, path) + ); + + return result.filter; + } + + private enum BlockResult { + UNBLOCKED(false, "Unblocked"), + IGNORED(false, "Ignored"), + DEFINED(true, "Blocked"), + CUSTOM(true, "Custom"); + + final Boolean filter; + final String message; + + BlockResult(boolean filter, String message) { + this.filter = filter; + this.message = message; + } + } +} diff --git a/app/src/main/java/app/revanced/integrations/patches/LithoFilterPatch.java b/app/src/main/java/app/revanced/integrations/patches/LithoFilterPatch.java index ed89b88a..fd72fb17 100644 --- a/app/src/main/java/app/revanced/integrations/patches/LithoFilterPatch.java +++ b/app/src/main/java/app/revanced/integrations/patches/LithoFilterPatch.java @@ -138,215 +138,3 @@ public final class LithoFilterPatch { } } -final class CommentsPatch extends Filter { - - public CommentsPatch() { - var comments = new BlockRule(SettingsEnum.HIDE_COMMENTS_SECTION, "video_metadata_carousel", "_comments"); - var previewComment = new BlockRule( - SettingsEnum.HIDE_PREVIEW_COMMENT, - "carousel_item", - "comments_entry_point_teaser", - "comments_entry_point_simplebox" - ); - - this.pathRegister.registerAll( - comments, - previewComment - ); - } - - @Override - boolean filter(String path, String _identifier) { - if (!pathRegister.contains(path)) return false; - - LogHelper.debug(CommentsPatch.class, "Blocked: " + path); - - return true; - } -} - -final class ButtonsPatch extends Filter { - private final BlockRule actionButtonsRule; - private final BlockRule dislikeRule; - private final BlockRule actionBarRule; - - private final BlockRule[] rules; - - public ButtonsPatch() { - BlockRule like = new BlockRule(SettingsEnum.HIDE_LIKE_BUTTON, "|like_button"); - dislikeRule = new BlockRule(SettingsEnum.HIDE_DISLIKE_BUTTON, "dislike_button"); - BlockRule download = new BlockRule(SettingsEnum.HIDE_DOWNLOAD_BUTTON, "download_button"); - actionButtonsRule = new BlockRule(SettingsEnum.HIDE_ACTION_BUTTON, "ContainerType|video_action_button"); - BlockRule playlist = new BlockRule(SettingsEnum.HIDE_PLAYLIST_BUTTON, "save_to_playlist_button"); - rules = new BlockRule[]{like, dislikeRule, download, actionButtonsRule, playlist}; - - actionBarRule = new BlockRule(null, "video_action_bar"); - - this.pathRegister.registerAll( - like, - dislikeRule, - download, - playlist - ); - } - - private boolean hideActionBar() { - for (BlockRule rule : rules) if (!rule.isEnabled()) return false; - return true; - } - - @Override - public boolean filter(final String path, final String identifier) { - if (hideActionBar() && actionBarRule.check(identifier).isBlocked()) return true; - - var currentIsActionButton = actionButtonsRule.check(path).isBlocked(); - - if (dislikeRule.check(path).isBlocked()) ActionButton.doNotBlockCounter = 4; - - if (currentIsActionButton && ActionButton.doNotBlockCounter-- > 0) { - if (SettingsEnum.HIDE_SHARE_BUTTON.getBoolean()) { - LogHelper.debug(ButtonsPatch.class, "Hiding share button"); - return true; - } else return false; - } - - if ((currentIsActionButton && ActionButton.doNotBlockCounter <= 0 && actionButtonsRule.isEnabled()) || pathRegister.contains(path)) { - LogHelper.debug(ButtonsPatch.class, "Blocked: " + path); - return true; - } else return false; - } - - static class ActionButton { - public static int doNotBlockCounter = 4; - } -} - -final class GeneralAdsPatch extends Filter { - private final String[] IGNORE = { - "home_video_with_context", - "related_video_with_context", - "comment_thread", // skip blocking anything in the comments - "download_", - "library_recent_shelf", - "menu", - "root", - "-count", - "-space", - "-button", - "playlist_add_to_option_wrapper" // do not block on "add to playlist" flyout menu - }; - - private final BlockRule custom = new CustomBlockRule( - SettingsEnum.ADREMOVER_CUSTOM_ENABLED, - SettingsEnum.ADREMOVER_CUSTOM_REMOVAL - ); - - public GeneralAdsPatch() { - var communityPosts = new BlockRule(SettingsEnum.ADREMOVER_COMMUNITY_POSTS_REMOVAL, "post_base_wrapper"); - var communityGuidelines = new BlockRule(SettingsEnum.ADREMOVER_COMMUNITY_GUIDELINES_REMOVAL, "community_guidelines"); - var compactBanner = new BlockRule(SettingsEnum.ADREMOVER_COMPACT_BANNER_REMOVAL, "compact_banner"); - var inFeedSurvey = new BlockRule(SettingsEnum.ADREMOVER_FEED_SURVEY_REMOVAL, "in_feed_survey"); - var medicalPanel = new BlockRule(SettingsEnum.ADREMOVER_MEDICAL_PANEL_REMOVAL, "medical_panel"); - var paidContent = new BlockRule(SettingsEnum.ADREMOVER_PAID_CONTENT_REMOVAL, "paid_content_overlay"); - var merchandise = new BlockRule(SettingsEnum.ADREMOVER_MERCHANDISE_REMOVAL, "product_carousel"); - var infoPanel = new BlockRule(SettingsEnum.ADREMOVER_INFO_PANEL_REMOVAL, "publisher_transparency_panel", "single_item_information_panel"); - var suggestions = new BlockRule(SettingsEnum.ADREMOVER_SUGGESTIONS_REMOVAL, "horizontal_video_shelf"); - var latestPosts = new BlockRule(SettingsEnum.ADREMOVER_HIDE_LATEST_POSTS, "post_shelf"); - var channelGuidelines = new BlockRule(SettingsEnum.ADREMOVER_HIDE_CHANNEL_GUIDELINES, "channel_guidelines_entry_banner"); - var artistCard = new BlockRule(SettingsEnum.HIDE_ARTIST_CARD, "official_card"); - var selfSponsor = new BlockRule(SettingsEnum.ADREMOVER_SELF_SPONSOR_REMOVAL, "cta_shelf_card"); - var chapterTeaser = new BlockRule(SettingsEnum.ADREMOVER_CHAPTER_TEASER_REMOVAL, "expandable_metadata"); - var graySeparator = new BlockRule(SettingsEnum.ADREMOVER_GRAY_SEPARATOR, - "cell_divider" // layout residue (gray line above the buttoned ad), - ); - var buttonedAd = new BlockRule(SettingsEnum.ADREMOVER_BUTTONED_REMOVAL, - "video_display_full_buttoned_layout", - "full_width_square_image_layout", - "_ad_with" - ); - var generalAds = new BlockRule( - SettingsEnum.ADREMOVER_GENERAL_ADS_REMOVAL, - "ads_video_with_context", - "banner_text_icon", - "watch_metadata_app_promo", - "video_display_full_layout" - ); - var movieAds = new BlockRule( - SettingsEnum.ADREMOVER_MOVIE_REMOVAL, - "browsy_bar", - "compact_movie", - "horizontal_movie_shelf", - "movie_and_show_upsell_card" - ); - - this.pathRegister.registerAll( - generalAds, - buttonedAd, - communityPosts, - paidContent, - suggestions, - latestPosts, - movieAds, - chapterTeaser, - communityGuidelines, - compactBanner, - inFeedSurvey, - medicalPanel, - merchandise, - infoPanel, - channelGuidelines, - artistCard, - selfSponsor - ); - - var carouselAd = new BlockRule(SettingsEnum.ADREMOVER_GENERAL_ADS_REMOVAL, - "carousel_ad" - ); - var shorts = new BlockRule(SettingsEnum.ADREMOVER_SHORTS_REMOVAL, - "reels_player_overlay", - "shorts_shelf", - "inline_shorts" - ); - - this.identifierRegister.registerAll( - shorts, - graySeparator, - carouselAd - ); - } - - public boolean filter(final String path, final String identifier) { - BlockResult result; - - if (custom.isEnabled() && custom.check(path).isBlocked()) - result = BlockResult.CUSTOM; - else if (ReVancedUtils.containsAny(path, IGNORE)) - result = BlockResult.IGNORED; - else if (pathRegister.contains(path) || identifierRegister.contains(identifier)) - result = BlockResult.DEFINED; - else - result = BlockResult.UNBLOCKED; - - LogHelper.debug( - GeneralAdsPatch.class, - String.format("%s (ID: %s): %s", result.message, identifier, path) - ); - - return result.filter; - } - - private enum BlockResult { - UNBLOCKED(false, "Unblocked"), - IGNORED(false, "Ignored"), - DEFINED(true, "Blocked"), - CUSTOM(true, "Custom"); - - final Boolean filter; - final String message; - - BlockResult(boolean filter, String message) { - this.filter = filter; - this.message = message; - } - } -}