From 56fbd8cce0110f1185c47e587104270e51991fa2 Mon Sep 17 00:00:00 2001 From: AndnixSH <40742924+AndnixSH@users.noreply.github.com> Date: Fri, 15 Aug 2025 12:00:55 +0200 Subject: [PATCH] feat(YouTube): Add `Disable sign in to TV popup` patch (#5639) --- .../patches/DisableSignInToTvPopupPatch.java | 14 ++++ .../extension/youtube/settings/Settings.java | 1 + patches/api/patches.api | 4 ++ .../DisableSignInToTvPatchPopup.kt | 68 +++++++++++++++++++ .../hide/signintotvpopup/Fingerprints.kt | 12 ++++ .../resources/addresources/values/strings.xml | 5 ++ 6 files changed, 104 insertions(+) create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableSignInToTvPopupPatch.java create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableSignInToTvPopupPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableSignInToTvPopupPatch.java new file mode 100644 index 000000000..f6298ce8b --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableSignInToTvPopupPatch.java @@ -0,0 +1,14 @@ +package app.revanced.extension.youtube.patches; + +import app.revanced.extension.youtube.settings.Settings; + +@SuppressWarnings("unused") +public class DisableSignInToTvPopupPatch { + + /** + * Injection point. + */ + public static boolean disableSignInToTvPopup() { + return Settings.DISABLE_SIGNIN_TO_TV_POPUP.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 1798b3b85..c9be65624 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 @@ -256,6 +256,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting GRADIENT_LOADING_SCREEN = new BooleanSetting("revanced_gradient_loading_screen", FALSE, true); public static final EnumSetting SPLASH_SCREEN_ANIMATION_STYLE = new EnumSetting<>("revanced_splash_screen_animation_style", SplashScreenAnimationStyle.FPS_60_ONE_SECOND, true); public static final EnumSetting HEADER_LOGO = new EnumSetting<>("revanced_header_logo", HeaderLogo.DEFAULT, true); + public static final BooleanSetting DISABLE_SIGNIN_TO_TV_POPUP = new BooleanSetting("revanced_disable_signin_to_tv_popup", FALSE); public static final BooleanSetting REMOVE_VIEWER_DISCRETION_DIALOG = new BooleanSetting("revanced_remove_viewer_discretion_dialog", FALSE, "revanced_remove_viewer_discretion_dialog_user_dialog_message"); diff --git a/patches/api/patches.api b/patches/api/patches.api index db1bb7e8e..835beeb59 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1357,6 +1357,10 @@ public final class app/revanced/patches/youtube/layout/hide/shorts/HideShortsCom public static final fun getHideShortsComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopupKt { + public static final fun getDisableSignInToTvPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatchKt { public static final fun getDisableSuggestedVideoEndScreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt new file mode 100644 index 000000000..1a591c315 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt @@ -0,0 +1,68 @@ +package app.revanced.patches.youtube.layout.hide.signintotvpopup + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.patch.bytecodePatch +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 + +internal var mdx_seamless_tv_sign_in_drawer_fragment_title_id = -1L + private set + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/DisableSignInToTvPopupPatch;" + +val disableSignInToTvPopupPatch = bytecodePatch( + name = "Disable sign in to TV popup", + description = "Adds an option to disable the popup asking to sign into a TV on the same local network.", +) { + dependsOn( + settingsPatch, + sharedExtensionPatch, + addResourcesPatch, + resourceMappingPatch + ) + + compatibleWith( + "com.google.android.youtube"( + "19.34.42", + "19.43.41", + "19.47.53", + "20.07.39", + "20.12.46", + "20.13.41", + ) + ) + + execute { + addResources("youtube", "layout.hide.signintotv.disableSignInToTvPopupPatch") + + PreferenceScreen.MISC.addPreferences( + SwitchPreference("revanced_disable_signin_to_tv_popup"), + ) + + mdx_seamless_tv_sign_in_drawer_fragment_title_id = resourceMappings[ + "string", + "mdx_seamless_tv_sign_in_drawer_fragment_title", + ] + + signInToTvPopupFingerprint.method.addInstructionsWithLabels( + 0, + """ + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableSignInToTvPopup()Z + move-result v0 + if-eqz v0, :allow_sign_in_popup + const/4 v0, 0x0 + return v0 + :allow_sign_in_popup + nop + """ + ) + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt new file mode 100644 index 000000000..c79d4ed26 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.youtube.layout.hide.signintotvpopup + +import app.revanced.patcher.fingerprint +import app.revanced.util.literal + +internal val signInToTvPopupFingerprint = fingerprint { + returns("Z") + parameters("Ljava/lang/String;", "Z", "L") + literal { + mdx_seamless_tv_sign_in_drawer_fragment_title_id + } +} \ No newline at end of file diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index e4d8ad112..8e5377d27 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -515,6 +515,11 @@ This feature is only available for older devices" Dialog will be shown This does not bypass the age restriction. It just accepts it automatically. + + Disable Sign in to TV popup + Sign in to TV popup is disabled + Sign in to TV popup is enabled + Disable double tap chapter skip Double tap can never trigger a skip to the next/previous chapter