diff --git a/.gitignore b/.gitignore index ef26de6..eaddb96 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ .externalNativeBuild .cxx local.properties +.kotlin \ No newline at end of file diff --git a/README.md b/README.md index e2e5e2a..ff56ad9 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Compatibility & Patches ## Youtube Music -Youtube Music tested version: 7.11.50 +Youtube Music tested version: 7.11.50, 8.02.53 Patches: - HideMusicVideoAds - MinimizedPlayback @@ -10,7 +10,7 @@ Patches: - EnableExclusiveAudioPlayback ## Youtube -Youtube tested version: 19.29.37 +Youtube tested version: 19.29.37, 20.03.37 Patches: - VideoAds - BackgroundPlayback diff --git a/app/src/main/java/app/revanced/integrations/shared/Logger.java b/app/src/main/java/app/revanced/extension/shared/Logger.java similarity index 94% rename from app/src/main/java/app/revanced/integrations/shared/Logger.java rename to app/src/main/java/app/revanced/extension/shared/Logger.java index 2588505..da76913 100644 --- a/app/src/main/java/app/revanced/integrations/shared/Logger.java +++ b/app/src/main/java/app/revanced/extension/shared/Logger.java @@ -1,8 +1,8 @@ -package app.revanced.integrations.shared; +package app.revanced.extension.shared; -import static app.revanced.integrations.shared.settings.BaseSettings.DEBUG; -import static app.revanced.integrations.shared.settings.BaseSettings.DEBUG_STACKTRACE; -import static app.revanced.integrations.shared.settings.BaseSettings.DEBUG_TOAST_ON_ERROR; +import static app.revanced.extension.shared.settings.BaseSettings.DEBUG; +import static app.revanced.extension.shared.settings.BaseSettings.DEBUG_STACKTRACE; +import static app.revanced.extension.shared.settings.BaseSettings.DEBUG_TOAST_ON_ERROR; import android.util.Log; @@ -12,7 +12,7 @@ import java.io.PrintWriter; import java.io.StringWriter; -import app.revanced.integrations.shared.settings.BaseSettings; +import app.revanced.extension.shared.settings.BaseSettings; public class Logger { diff --git a/app/src/main/java/app/revanced/integrations/shared/Utils.java b/app/src/main/java/app/revanced/extension/shared/Utils.java similarity index 99% rename from app/src/main/java/app/revanced/integrations/shared/Utils.java rename to app/src/main/java/app/revanced/extension/shared/Utils.java index 281d89c..66ab8d8 100644 --- a/app/src/main/java/app/revanced/integrations/shared/Utils.java +++ b/app/src/main/java/app/revanced/extension/shared/Utils.java @@ -1,4 +1,4 @@ -package app.revanced.integrations.shared; +package app.revanced.extension.shared; import android.annotation.SuppressLint; import android.content.Context; diff --git a/app/src/main/java/app/revanced/integrations/shared/settings/BaseSettings.java b/app/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java similarity index 92% rename from app/src/main/java/app/revanced/integrations/shared/settings/BaseSettings.java rename to app/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java index aa24f15..ab74b5a 100644 --- a/app/src/main/java/app/revanced/integrations/shared/settings/BaseSettings.java +++ b/app/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java @@ -1,4 +1,4 @@ -package app.revanced.integrations.shared.settings; +package app.revanced.extension.shared.settings; import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; diff --git a/app/src/main/java/app/revanced/integrations/shared/settings/BooleanSetting.java b/app/src/main/java/app/revanced/extension/shared/settings/BooleanSetting.java similarity index 83% rename from app/src/main/java/app/revanced/integrations/shared/settings/BooleanSetting.java rename to app/src/main/java/app/revanced/extension/shared/settings/BooleanSetting.java index fe2910c..372a358 100644 --- a/app/src/main/java/app/revanced/integrations/shared/settings/BooleanSetting.java +++ b/app/src/main/java/app/revanced/extension/shared/settings/BooleanSetting.java @@ -1,4 +1,4 @@ -package app.revanced.integrations.shared.settings; +package app.revanced.extension.shared.settings; public class BooleanSetting extends Setting { diff --git a/app/src/main/java/app/revanced/integrations/shared/settings/Setting.java b/app/src/main/java/app/revanced/extension/shared/settings/Setting.java similarity index 84% rename from app/src/main/java/app/revanced/integrations/shared/settings/Setting.java rename to app/src/main/java/app/revanced/extension/shared/settings/Setting.java index b3ddaab..75471f1 100644 --- a/app/src/main/java/app/revanced/integrations/shared/settings/Setting.java +++ b/app/src/main/java/app/revanced/extension/shared/settings/Setting.java @@ -1,4 +1,4 @@ -package app.revanced.integrations.shared.settings; +package app.revanced.extension.shared.settings; public class Setting { T value; diff --git a/app/src/main/java/app/revanced/integrations/youtube/ByteTrieSearch.java b/app/src/main/java/app/revanced/extension/youtube/ByteTrieSearch.java similarity index 96% rename from app/src/main/java/app/revanced/integrations/youtube/ByteTrieSearch.java rename to app/src/main/java/app/revanced/extension/youtube/ByteTrieSearch.java index ef27382..7a1b073 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/ByteTrieSearch.java +++ b/app/src/main/java/app/revanced/extension/youtube/ByteTrieSearch.java @@ -1,4 +1,4 @@ -package app.revanced.integrations.youtube; +package app.revanced.extension.youtube; import androidx.annotation.NonNull; diff --git a/app/src/main/java/app/revanced/integrations/youtube/StringTrieSearch.java b/app/src/main/java/app/revanced/extension/youtube/StringTrieSearch.java similarity index 95% rename from app/src/main/java/app/revanced/integrations/youtube/StringTrieSearch.java rename to app/src/main/java/app/revanced/extension/youtube/StringTrieSearch.java index 618d9d6..fbff9be 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/StringTrieSearch.java +++ b/app/src/main/java/app/revanced/extension/youtube/StringTrieSearch.java @@ -1,4 +1,4 @@ -package app.revanced.integrations.youtube; +package app.revanced.extension.youtube; import androidx.annotation.NonNull; diff --git a/app/src/main/java/app/revanced/integrations/youtube/TrieSearch.java b/app/src/main/java/app/revanced/extension/youtube/TrieSearch.java similarity index 99% rename from app/src/main/java/app/revanced/integrations/youtube/TrieSearch.java rename to app/src/main/java/app/revanced/extension/youtube/TrieSearch.java index 12b385a..74fb468 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/TrieSearch.java +++ b/app/src/main/java/app/revanced/extension/youtube/TrieSearch.java @@ -1,4 +1,4 @@ -package app.revanced.integrations.youtube; +package app.revanced.extension.youtube; import androidx.annotation.NonNull; import androidx.annotation.Nullable; diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/components/AdsFilter.java b/app/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java similarity index 78% rename from app/src/main/java/app/revanced/integrations/youtube/patches/components/AdsFilter.java rename to app/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java index c5554e8..f79c2e8 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/patches/components/AdsFilter.java +++ b/app/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java @@ -1,4 +1,4 @@ -package app.revanced.integrations.youtube.patches.components; +package app.revanced.extension.youtube.patches.components; import android.app.Instrumentation; import android.view.KeyEvent; @@ -6,10 +6,11 @@ import androidx.annotation.Nullable; -import app.revanced.integrations.youtube.settings.Settings; -import app.revanced.integrations.shared.Logger; -import app.revanced.integrations.shared.Utils; -import app.revanced.integrations.youtube.StringTrieSearch; +import app.revanced.extension.youtube.settings.Settings; +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; +import app.revanced.extension.youtube.StringTrieSearch; +import kotlin.NotImplementedError; @SuppressWarnings("unused") public final class AdsFilter extends Filter { @@ -22,6 +23,9 @@ public final class AdsFilter extends Filter { private final StringTrieSearch exceptions = new StringTrieSearch(); + private final StringFilterGroup playerShoppingShelf; + private final ByteArrayFilterGroup playerShoppingShelfBuffer; + private final StringFilterGroup channelProfile; private final ByteArrayFilterGroup visitStoreButton; @@ -77,25 +81,29 @@ public AdsFilter() { "text_image_button_layout", "primetime_promo", "product_details", + "composite_concurrent_carousel_layout", "carousel_headered_layout", "full_width_portrait_image_layout", - "brand_video_shelf" + "brand_video_shelf", + "brand_video_singleton" ); -// final var movieAds = new StringFilterGroup( -// Settings.HIDE_MOVIES_SECTION, -// "browsy_bar", -// "compact_movie", -// "horizontal_movie_shelf", -// "movie_and_show_upsell_card", -// "compact_tvfilm_item", -// "offer_module_root" -// ); + final var movieAds = new StringFilterGroup( + Settings.HIDE_MOVIES_SECTION, + "browsy_bar", + "compact_movie", + "horizontal_movie_shelf", + "movie_and_show_upsell_card", + "compact_tvfilm_item", + "offer_module_root" + ); final var viewProducts = new StringFilterGroup( Settings.HIDE_PRODUCTS_BANNER, "product_item", - "products_in_video" + "products_in_video", + "shopping_overlay.eml", // Video player overlay shopping links. + "shopping_carousel.eml" // Channel profile shopping shelf. ); shoppingLinks = new StringFilterGroup( @@ -108,6 +116,16 @@ public AdsFilter() { "channel_profile.eml" ); + playerShoppingShelf = new StringFilterGroup( + null, + "horizontal_shelf.eml" + ); + + playerShoppingShelfBuffer = new ByteArrayFilterGroup( + Settings.HIDE_PLAYER_STORE_SHELF, + "shopping_item_card_list.eml" + ); + visitStoreButton = new ByteArrayFilterGroup( Settings.HIDE_VISIT_STORE_BUTTON, "header_store_button" @@ -137,14 +155,22 @@ public AdsFilter() { fullscreenAd, channelProfile, webLinkPanel, - shoppingLinks -// movieAds + shoppingLinks, + playerShoppingShelf, + movieAds ); } @Override boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBufferArray, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { + if (matchedGroup == playerShoppingShelf) { + if (contentIndex == 0 && playerShoppingShelfBuffer.check(protobufBufferArray).isFiltered()) { + return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + } + return false; + } + if (exceptions.matches(path)) return false; @@ -168,18 +194,15 @@ boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBuff return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); } -/* - */ -/** + /** * Hide the view, which shows ads in the homepage. * * @param view The view, which shows ads. - *//* - + */ public static void hideAdAttributionView(View view) { - Utils.hideViewBy0dpUnderCondition(Settings.HIDE_GENERAL_ADS, view); + throw new NotImplementedError(); +// Utils.hideViewBy0dpUnderCondition(Settings.HIDE_GENERAL_ADS, view); } -*/ /** * Close the fullscreen ad. @@ -217,4 +240,4 @@ private static void closeFullscreenAd() { }); }, 1000); } -} +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/components/Filter.java b/app/src/main/java/app/revanced/extension/youtube/patches/components/Filter.java similarity index 95% rename from app/src/main/java/app/revanced/integrations/youtube/patches/components/Filter.java rename to app/src/main/java/app/revanced/extension/youtube/patches/components/Filter.java index ed1c56c..42b86d5 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/patches/components/Filter.java +++ b/app/src/main/java/app/revanced/extension/youtube/patches/components/Filter.java @@ -1,4 +1,4 @@ -package app.revanced.integrations.youtube.patches.components; +package app.revanced.extension.youtube.patches.components; import androidx.annotation.Nullable; @@ -6,8 +6,8 @@ import java.util.Arrays; import java.util.List; -import app.revanced.integrations.shared.Logger; -import app.revanced.integrations.shared.settings.BaseSettings; +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.settings.BaseSettings; /** * Filters litho based components. diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/components/FilterGroup.java b/app/src/main/java/app/revanced/extension/youtube/patches/components/FilterGroup.java similarity index 96% rename from app/src/main/java/app/revanced/integrations/youtube/patches/components/FilterGroup.java rename to app/src/main/java/app/revanced/extension/youtube/patches/components/FilterGroup.java index 5cc1015..4e20bc8 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/patches/components/FilterGroup.java +++ b/app/src/main/java/app/revanced/extension/youtube/patches/components/FilterGroup.java @@ -1,10 +1,10 @@ -package app.revanced.integrations.youtube.patches.components; +package app.revanced.extension.youtube.patches.components; import androidx.annotation.NonNull; -import app.revanced.integrations.shared.Logger; -import app.revanced.integrations.shared.settings.BooleanSetting; -import app.revanced.integrations.youtube.ByteTrieSearch; +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.settings.BooleanSetting; +import app.revanced.extension.youtube.ByteTrieSearch; abstract class FilterGroup { final static class FilterGroupResult { diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/components/FilterGroupList.java b/app/src/main/java/app/revanced/extension/youtube/patches/components/FilterGroupList.java similarity index 91% rename from app/src/main/java/app/revanced/integrations/youtube/patches/components/FilterGroupList.java rename to app/src/main/java/app/revanced/extension/youtube/patches/components/FilterGroupList.java index 9babba0..ac0e23c 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/patches/components/FilterGroupList.java +++ b/app/src/main/java/app/revanced/extension/youtube/patches/components/FilterGroupList.java @@ -1,4 +1,4 @@ -package app.revanced.integrations.youtube.patches.components; +package app.revanced.extension.youtube.patches.components; import android.os.Build; @@ -8,9 +8,9 @@ import java.util.*; import java.util.function.Consumer; -import app.revanced.integrations.youtube.ByteTrieSearch; -import app.revanced.integrations.youtube.StringTrieSearch; -import app.revanced.integrations.youtube.TrieSearch; +import app.revanced.extension.youtube.ByteTrieSearch; +import app.revanced.extension.youtube.StringTrieSearch; +import app.revanced.extension.youtube.TrieSearch; abstract class FilterGroupList> implements Iterable { diff --git a/app/src/main/java/app/revanced/integrations/youtube/patches/components/LithoFilterPatch.java b/app/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java similarity index 97% rename from app/src/main/java/app/revanced/integrations/youtube/patches/components/LithoFilterPatch.java rename to app/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java index f6c0d03..e15f2e2 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/patches/components/LithoFilterPatch.java +++ b/app/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java @@ -1,4 +1,4 @@ -package app.revanced.integrations.youtube.patches.components; +package app.revanced.extension.youtube.patches.components; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -6,9 +6,9 @@ import java.nio.ByteBuffer; import java.util.List; -import app.revanced.integrations.shared.Logger; -import app.revanced.integrations.youtube.StringTrieSearch; -import app.revanced.integrations.youtube.settings.Settings; +import app.revanced.extension.shared.Logger; +import app.revanced.extension.youtube.StringTrieSearch; +import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") public final class LithoFilterPatch { diff --git a/app/src/main/java/app/revanced/integrations/youtube/settings/Settings.java b/app/src/main/java/app/revanced/extension/youtube/settings/Settings.java similarity index 78% rename from app/src/main/java/app/revanced/integrations/youtube/settings/Settings.java rename to app/src/main/java/app/revanced/extension/youtube/settings/Settings.java index 2db92f5..37989bb 100644 --- a/app/src/main/java/app/revanced/integrations/youtube/settings/Settings.java +++ b/app/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -1,13 +1,9 @@ -package app.revanced.integrations.youtube.settings; +package app.revanced.extension.youtube.settings; import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; -import app.revanced.integrations.shared.Logger; -import app.revanced.integrations.shared.settings.*; +import app.revanced.extension.shared.settings.*; @SuppressWarnings("deprecation") public class Settings extends BaseSettings { // Ads @@ -19,9 +15,13 @@ public class Settings extends BaseSettings { public static final BooleanSetting HIDE_MERCHANDISE_BANNERS = new BooleanSetting("revanced_hide_merchandise_banners", TRUE); public static final BooleanSetting HIDE_PAID_PROMOTION_LABEL = new BooleanSetting("revanced_hide_paid_promotion_label", TRUE); public static final BooleanSetting HIDE_PRODUCTS_BANNER = new BooleanSetting("revanced_hide_products_banner", TRUE); + public static final BooleanSetting HIDE_PLAYER_STORE_SHELF = new BooleanSetting("revanced_hide_player_store_shelf", TRUE); public static final BooleanSetting HIDE_SHOPPING_LINKS = new BooleanSetting("revanced_hide_shopping_links", TRUE); public static final BooleanSetting HIDE_SELF_SPONSOR = new BooleanSetting("revanced_hide_self_sponsor_ads", TRUE); public static final BooleanSetting HIDE_VIDEO_ADS = new BooleanSetting("revanced_hide_video_ads", TRUE, true); public static final BooleanSetting HIDE_VISIT_STORE_BUTTON = new BooleanSetting("revanced_hide_visit_store_button", TRUE); public static final BooleanSetting HIDE_WEB_SEARCH_RESULTS = new BooleanSetting("revanced_hide_web_search_results", TRUE); + // Uncategorized layout related settings. Do not add to this section, and instead move these out and categorize them. + public static final BooleanSetting HIDE_MOVIES_SECTION = new BooleanSetting("revanced_hide_movies_section", TRUE); + } \ No newline at end of file diff --git a/app/src/main/java/io/github/chsbuffer/revancedxposed/MusicHook.kt b/app/src/main/java/io/github/chsbuffer/revancedxposed/MusicHook.kt index 1d6e92b..f02b546 100644 --- a/app/src/main/java/io/github/chsbuffer/revancedxposed/MusicHook.kt +++ b/app/src/main/java/io/github/chsbuffer/revancedxposed/MusicHook.kt @@ -43,23 +43,13 @@ class MusicHook(app: Application, val lpparam: LoadPackageParam) : Cache(app) { getDexMethod("AllowExclusiveAudioPlaybackFingerprint") { dexkit.findMethod { matcher { + addCaller { + addEqString("probably_has_unlimited_entitlement") + } + returnType = "boolean" modifiers = Modifier.PUBLIC or Modifier.FINAL paramCount = 0 - opNames = listOf( - "invoke-virtual", - "move-result-object", - "check-cast", - "if-nez", - "iget-object", - "invoke-virtual", - "move-result", - "goto", - "invoke-virtual", - "move-result", - "return", - - ) } }.single() }.let { diff --git a/app/src/main/java/io/github/chsbuffer/revancedxposed/YoutubeHook.kt b/app/src/main/java/io/github/chsbuffer/revancedxposed/YoutubeHook.kt index 9dfb52d..9398425 100644 --- a/app/src/main/java/io/github/chsbuffer/revancedxposed/YoutubeHook.kt +++ b/app/src/main/java/io/github/chsbuffer/revancedxposed/YoutubeHook.kt @@ -4,8 +4,8 @@ import android.app.Application import android.content.ClipData import android.content.Intent import android.view.View -import app.revanced.integrations.shared.Utils -import app.revanced.integrations.youtube.patches.components.LithoFilterPatch +import app.revanced.extension.shared.Utils +import app.revanced.extension.youtube.patches.components.LithoFilterPatch import de.robv.android.xposed.XC_MethodHook import de.robv.android.xposed.XC_MethodReplacement import de.robv.android.xposed.XposedBridge @@ -304,6 +304,9 @@ class YoutubeHook(app: Application, val lpparam: LoadPackageParam) : Cache(app) matcher { addEqString("Component was not found %s because it was removed due to duplicate converter bindings.") } + matcher { + addEqString("Component was not found because it was removed due to duplicate converter bindings.") + } }.single() } val emptyComponentClass = getDexClass("emptyComponentClass") { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0ef657a..b10d3d4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] -agp = "8.7.2" +agp = "8.8.0" kotlin = "2.0.20" -dexkit = "2.0.2" +dexkit = "2.0.3" xposed = "82" annotation = "1.9.1" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index df97d72..cea7a79 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME