From ac9be9760c9965e54df196b227a310d64ead4bf5 Mon Sep 17 00:00:00 2001 From: MarcaD <152095496+MarcaDian@users.noreply.github.com> Date: Wed, 14 May 2025 10:03:33 +0300 Subject: [PATCH] feat(YouTube - Hide player components): Hide related video overlay in fullscreen (#4938) --- .../patches/HideRelatedVideoOverlayPatch.java | 13 +++ .../extension/youtube/settings/Settings.java | 2 +- patches/api/patches.api | 4 + .../hide/relatedvideooverlay/Fingerprints.kt | 18 ++++ .../HideRelatedVideoOverlayPatch.kt | 83 +++++++++++++++++++ .../resources/addresources/values/strings.xml | 5 ++ 6 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideRelatedVideoOverlayPatch.java create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideRelatedVideoOverlayPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideRelatedVideoOverlayPatch.java new file mode 100644 index 000000000..423a7951c --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideRelatedVideoOverlayPatch.java @@ -0,0 +1,13 @@ +package app.revanced.extension.youtube.patches; + +import app.revanced.extension.youtube.settings.Settings; + +@SuppressWarnings("unused") +public final class HideRelatedVideoOverlayPatch { + /** + * Injection point. + */ + public static boolean hideRelatedVideoOverlay() { + return Settings.HIDE_RELATED_VIDEO_OVERLAY.get(); + } +} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index 29debf67e..bcabefb31 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -139,6 +139,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting HIDE_EMERGENCY_BOX = new BooleanSetting("revanced_hide_emergency_box", TRUE); public static final BooleanSetting HIDE_ENDSCREEN_CARDS = new BooleanSetting("revanced_hide_endscreen_cards", FALSE); public static final BooleanSetting HIDE_END_SCREEN_SUGGESTED_VIDEO = new BooleanSetting("revanced_end_screen_suggested_video", FALSE, true); + public static final BooleanSetting HIDE_RELATED_VIDEO_OVERLAY = new BooleanSetting("revanced_hide_related_video_overlay", FALSE, true); public static final BooleanSetting HIDE_HIDE_CHANNEL_GUIDELINES = new BooleanSetting("revanced_hide_channel_guidelines", TRUE); public static final BooleanSetting HIDE_INFO_PANELS = new BooleanSetting("revanced_hide_info_panels", TRUE); public static final BooleanSetting HIDE_INFO_CARDS = new BooleanSetting("revanced_hide_info_cards", FALSE); @@ -478,4 +479,3 @@ public class Settings extends BaseSettings { // endregion } } - diff --git a/patches/api/patches.api b/patches/api/patches.api index 7268c398e..f8acb38ca 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1220,6 +1220,10 @@ public final class app/revanced/patches/youtube/layout/hide/player/flyoutmenupan public static final fun getHidePlayerFlyoutMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatchKt { + public static final fun getHideRelatedVideoOverlayPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatchKt { public static final fun getDisableRollingNumberAnimationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt new file mode 100644 index 000000000..0ca129863 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt @@ -0,0 +1,18 @@ +package app.revanced.patches.youtube.layout.hide.relatedvideooverlay + +import app.revanced.patcher.fingerprint +import app.revanced.util.literal + +internal val relatedEndScreenResultsParentFingerprint = fingerprint { + returns("V") + literal{ appRelatedEndScreenResults } +} + +internal val relatedEndScreenResultsFingerprint = fingerprint { + returns("V") + parameters( + "I", + "Z", + "I", + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt new file mode 100644 index 000000000..06ffc0ca5 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt @@ -0,0 +1,83 @@ +package app.revanced.patches.youtube.layout.hide.relatedvideooverlay + +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 +import app.revanced.patches.all.misc.resources.addResources +import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.shared.misc.mapping.get +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.settings.PreferenceScreen +import app.revanced.patches.youtube.misc.settings.settingsPatch +import app.revanced.patcher.util.smali.ExternalLabel + +internal var appRelatedEndScreenResults = -1L + private set + +private val hideRelatedVideoOverlayResourcePatch = resourcePatch { + dependsOn( + resourceMappingPatch, + ) + + execute { + appRelatedEndScreenResults = resourceMappings[ + "layout", + "app_related_endscreen_results", + ] + } +} + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/HideRelatedVideoOverlayPatch;" + +@Suppress("unused") +val hideRelatedVideoOverlayPatch = bytecodePatch( + name = "Hide related video overlay", + description = "Adds an option to hide the related video overlay shown when swiping up in fullscreen.", +) { + dependsOn( + settingsPatch, + sharedExtensionPatch, + addResourcesPatch, + hideRelatedVideoOverlayResourcePatch, + ) + + compatibleWith( + "com.google.android.youtube"( + "19.16.39", + "19.25.37", + "19.34.42", + "19.43.41", + "19.47.53", + "20.07.39", + "20.12.46", + ) + ) + + execute { + addResources("youtube", "layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch") + + PreferenceScreen.PLAYER.addPreferences( + SwitchPreference("revanced_hide_related_video_overlay") + ) + + relatedEndScreenResultsFingerprint.match( + relatedEndScreenResultsParentFingerprint.originalClassDef + ).method.apply { + addInstructionsWithLabels( + 0, + """ + invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->hideRelatedVideoOverlay()Z + move-result v0 + if-eqz v0, :show + return-void + """, + ExternalLabel("show", getInstruction(0)) + ) + } + } +} diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index 98ce9cb16..4ae843521 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -855,6 +855,11 @@ Autoplay can be changed in YouTube settings: Settings → Playback → Autoplay next video" End screen suggested video is shown + + Hide related video overlay in fullscreen + Related video overlay is hidden + Related video overlay is shown + Hide video timestamp Timestamp is hidden