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