From 76b0364c5b5562c6a0d178d2bbe5b220f48aaca9 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 28 Sep 2025 14:22:42 +0400 Subject: [PATCH] fix(YouTube - Hide end screen cards): Hide new type of end screen card (#6027) --- .../patches/HideEndScreenCardsPatch.java | 24 ++++++++++++++ .../patches/HideEndscreenCardsPatch.java | 14 --------- patches/api/patches.api | 4 +-- .../hide/endscreencards/Fingerprints.kt | 21 +++++++++++++ ...rdsPatch.kt => HideEndScreenCardsPatch.kt} | 31 +++++++++++++++---- .../resources/addresources/values/strings.xml | 2 +- 6 files changed, 73 insertions(+), 23 deletions(-) create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndScreenCardsPatch.java delete mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndscreenCardsPatch.java rename patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/{HideEndscreenCardsPatch.kt => HideEndScreenCardsPatch.kt} (70%) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndScreenCardsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndScreenCardsPatch.java new file mode 100644 index 000000000..03668aa73 --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndScreenCardsPatch.java @@ -0,0 +1,24 @@ +package app.revanced.extension.youtube.patches; + +import android.view.View; + +import app.revanced.extension.shared.Utils; +import app.revanced.extension.youtube.settings.Settings; + +@SuppressWarnings("unused") +public class HideEndScreenCardsPatch { + + /** + * Injection point. + */ + public static void hideEndScreenCardView(View view) { + Utils.hideViewUnderCondition(Settings.HIDE_ENDSCREEN_CARDS, view); + } + + /** + * Injection point. + */ + public static boolean hideEndScreenCards() { + return Settings.HIDE_ENDSCREEN_CARDS.get(); + } +} \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndscreenCardsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndscreenCardsPatch.java deleted file mode 100644 index 89261d119..000000000 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndscreenCardsPatch.java +++ /dev/null @@ -1,14 +0,0 @@ -package app.revanced.extension.youtube.patches; - -import android.view.View; - -import app.revanced.extension.youtube.settings.Settings; - -@SuppressWarnings("unused") -public class HideEndscreenCardsPatch { - //Used by app.revanced.patches.youtube.layout.hideendscreencards.bytecode.patch.HideEndscreenCardsPatch - public static void hideEndscreen(View view) { - if (!Settings.HIDE_ENDSCREEN_CARDS.get()) return; - view.setVisibility(View.GONE); - } -} \ No newline at end of file diff --git a/patches/api/patches.api b/patches/api/patches.api index ae0c1a588..33b6ea28d 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1411,8 +1411,8 @@ public final class app/revanced/patches/youtube/layout/formfactor/ChangeFormFact public static final fun getChangeFormFactorPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatchKt { - public static final fun getHideEndscreenCardsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +public final class app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatchKt { + public static final fun getHideEndScreenCardsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } public final class app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatchKt { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt index 59d859e80..d39a639fa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt @@ -1,8 +1,13 @@ package app.revanced.patches.youtube.layout.hide.endscreencards import app.revanced.patcher.fingerprint +import app.revanced.util.containsLiteralInstruction +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction import app.revanced.util.literal +import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.FieldReference internal val layoutCircleFingerprint = fingerprint { returns("Landroid/view/View;") @@ -38,3 +43,19 @@ internal val layoutVideoFingerprint = fingerprint { ) literal { layoutVideo } } + +internal val showEndscreenCardsFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + parameters("L") + custom { method, classDef -> + classDef.methods.count() == 5 + && method.containsLiteralInstruction(0) + && method.containsLiteralInstruction(5) + && method.containsLiteralInstruction(8) + && method.indexOfFirstInstruction { + val reference = getReference() + reference?.type == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" + } >= 0 + } +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt similarity index 70% rename from patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt rename to patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt index d0dce4bd5..d09de1d2f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.layout.hide.endscreencards import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch @@ -11,6 +12,8 @@ import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.playservice.is_19_43_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -22,7 +25,7 @@ internal var layoutIcon = -1L internal var layoutVideo = -1L private set -private val hideEndscreenCardsResourcePatch = resourcePatch { +private val hideEndScreenCardsResourcePatch = resourcePatch { dependsOn( settingsPatch, resourceMappingPatch, @@ -30,7 +33,7 @@ private val hideEndscreenCardsResourcePatch = resourcePatch { ) execute { - addResources("youtube", "layout.hide.endscreencards.hideEndscreenCardsResourcePatch") + addResources("youtube", "layout.hide.endscreencards.hideEndScreenCardsResourcePatch") PreferenceScreen.PLAYER.addPreferences( SwitchPreference("revanced_hide_endscreen_cards"), @@ -45,16 +48,17 @@ private val hideEndscreenCardsResourcePatch = resourcePatch { } private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/HideEndscreenCardsPatch;" + "Lapp/revanced/extension/youtube/patches/HideEndScreenCardsPatch;" @Suppress("unused") -val hideEndscreenCardsPatch = bytecodePatch( +val hideEndScreenCardsPatch = bytecodePatch( name = "Hide end screen cards", description = "Adds an option to hide suggested video cards at the end of videos.", ) { dependsOn( sharedExtensionPatch, - hideEndscreenCardsResourcePatch, + hideEndScreenCardsResourcePatch, + versionCheckPatch ) compatibleWith( @@ -78,9 +82,24 @@ val hideEndscreenCardsPatch = bytecodePatch( addInstruction( insertIndex, - "invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideEndscreen(Landroid/view/View;)V", + "invoke-static { v$viewRegister }, " + + "$EXTENSION_CLASS_DESCRIPTOR->hideEndScreenCardView(Landroid/view/View;)V", ) } } + + if (is_19_43_or_greater) { + showEndscreenCardsFingerprint.method.addInstructionsWithLabels( + 0, + """ + invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->hideEndScreenCards()Z + move-result v0 + if-eqz v0, :show + return-void + :show + nop + """ + ) + } } } diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index f151ae14d..e7fe5167b 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -859,7 +859,7 @@ To show the Audio track menu, change \'Spoof video streams\' to iPadOS" Previous & Next buttons are hidden Previous & Next buttons are shown - + Hide end screen cards End screen cards are hidden End screen cards are shown