diff --git a/src/main/kotlin/app/revanced/patches/shared/captions/BaseAutoCaptionsPatch.kt b/src/main/kotlin/app/revanced/patches/shared/captions/BaseAutoCaptionsPatch.kt index 8731c5706..26502d3de 100644 --- a/src/main/kotlin/app/revanced/patches/shared/captions/BaseAutoCaptionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/captions/BaseAutoCaptionsPatch.kt @@ -5,8 +5,8 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patches.shared.captions.fingerprints.StartVideoInformerFingerprint import app.revanced.patches.shared.captions.fingerprints.SubtitleTrackFingerprint +import app.revanced.patches.shared.fingerprints.StartVideoInformerFingerprint import app.revanced.util.getWalkerMethod import app.revanced.util.indexOfFirstInstruction import app.revanced.util.resultOrThrow diff --git a/src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/StartVideoInformerFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/fingerprints/StartVideoInformerFingerprint.kt similarity index 88% rename from src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/StartVideoInformerFingerprint.kt rename to src/main/kotlin/app/revanced/patches/shared/fingerprints/StartVideoInformerFingerprint.kt index 4cf71adad..dec566143 100644 --- a/src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/StartVideoInformerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/fingerprints/StartVideoInformerFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.shared.captions.fingerprints +package app.revanced.patches.shared.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/PlayerComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/PlayerComponentsPatch.kt index 1ad0d5932..da75bbcbd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/PlayerComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/PlayerComponentsPatch.kt @@ -9,6 +9,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.patch.PatchException import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patches.shared.fingerprints.StartVideoInformerFingerprint import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.patches.youtube.player.components.fingerprints.CrowdfundingBoxFingerprint import app.revanced.patches.youtube.player.components.fingerprints.EngagementPanelControllerFingerprint @@ -20,6 +21,9 @@ import app.revanced.patches.youtube.player.components.fingerprints.InfoCardsInco import app.revanced.patches.youtube.player.components.fingerprints.LayoutCircleFingerprint import app.revanced.patches.youtube.player.components.fingerprints.LayoutIconFingerprint import app.revanced.patches.youtube.player.components.fingerprints.LayoutVideoFingerprint +import app.revanced.patches.youtube.player.components.fingerprints.LithoComponentOnClickListenerFingerprint +import app.revanced.patches.youtube.player.components.fingerprints.NoticeOnClickListenerFingerprint +import app.revanced.patches.youtube.player.components.fingerprints.OfflineActionsOnClickListenerFingerprint import app.revanced.patches.youtube.player.components.fingerprints.QuickSeekOverlayFingerprint import app.revanced.patches.youtube.player.components.fingerprints.SeekEduContainerFingerprint import app.revanced.patches.youtube.player.components.fingerprints.SuggestedActionsFingerprint @@ -67,7 +71,7 @@ object PlayerComponentsPatch : BaseBytecodePatch( SettingsPatch::class, SharedResourceIdPatch::class, SpeedOverlayPatch::class, - SuggestedVideoEndScreenPatch::class + SuggestedVideoEndScreenPatch::class, ), compatiblePackages = COMPATIBLE_PACKAGE, fingerprints = setOf( @@ -78,8 +82,12 @@ object PlayerComponentsPatch : BaseBytecodePatch( LayoutCircleFingerprint, LayoutIconFingerprint, LayoutVideoFingerprint, + LithoComponentOnClickListenerFingerprint, + NoticeOnClickListenerFingerprint, + OfflineActionsOnClickListenerFingerprint, QuickSeekOverlayFingerprint, SeekEduContainerFingerprint, + StartVideoInformerFingerprint, SuggestedActionsFingerprint, TouchAreaOnClickListenerFingerprint, WatermarkParentFingerprint, @@ -114,15 +122,45 @@ object PlayerComponentsPatch : BaseBytecodePatch( // region patch for disable auto player popup panels + fun MutableMethod.hookInitVideoPanel(initVideoPanel: Int) = + addInstructions( + 0, """ + const/4 v0, $initVideoPanel + invoke-static {v0}, $PLAYER_CLASS_DESCRIPTOR->setInitVideoPanel(Z)V + """ + ) + + arrayOf( + LithoComponentOnClickListenerFingerprint, + NoticeOnClickListenerFingerprint, + OfflineActionsOnClickListenerFingerprint, + StartVideoInformerFingerprint, + ).forEach { fingerprint -> + fingerprint.resultOrThrow().mutableMethod.apply { + if (fingerprint == StartVideoInformerFingerprint) { + hookInitVideoPanel(1) + } else { + val syntheticIndex = getTargetIndexOrThrow(Opcode.NEW_INSTANCE) + val syntheticReference = + getInstruction(syntheticIndex).reference.toString() + val syntheticClass = + context.findClass(syntheticReference)!!.mutableClass + + syntheticClass.methods.find { method -> method.name == "onClick" } + ?.hookInitVideoPanel(0) + ?: throw PatchException("Could not find onClick method in $syntheticReference") + } + } + } + EngagementPanelControllerFingerprint.resultOrThrow().let { it.mutableMethod.apply { addInstructionsWithLabels( 0, """ - invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->disableAutoPlayerPopupPanels()Z + move/from16 v0, p4 + invoke-static {v0}, $PLAYER_CLASS_DESCRIPTOR->disableAutoPlayerPopupPanels(Z)Z move-result v0 if-eqz v0, :shown - # The type of the fourth parameter is boolean. - if-eqz p4, :shown const/4 v0, 0x0 return-object v0 """, ExternalLabel("shown", getInstruction(0)) diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LithoComponentOnClickListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LithoComponentOnClickListenerFingerprint.kt new file mode 100644 index 000000000..628169860 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LithoComponentOnClickListenerFingerprint.kt @@ -0,0 +1,14 @@ +package app.revanced.patches.youtube.player.components.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ComponentLongClickListener +import app.revanced.util.fingerprint.LiteralValueFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +@Suppress("SpellCheckingInspection") +internal object LithoComponentOnClickListenerFingerprint : LiteralValueFingerprint( + returnType = "V", + accessFlags = AccessFlags.PRIVATE or AccessFlags.STATIC, + parameters = listOf("L"), + literalSupplier = { ComponentLongClickListener } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/NoticeOnClickListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/NoticeOnClickListenerFingerprint.kt new file mode 100644 index 000000000..6569ac7d7 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/NoticeOnClickListenerFingerprint.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.youtube.player.components.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Notice +import app.revanced.util.fingerprint.LiteralValueFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal object NoticeOnClickListenerFingerprint : LiteralValueFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, + literalSupplier = { Notice } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/OfflineActionsOnClickListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/OfflineActionsOnClickListenerFingerprint.kt new file mode 100644 index 000000000..932196b00 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/OfflineActionsOnClickListenerFingerprint.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.youtube.player.components.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.OfflineActionsVideoDeletedUndoSnackbarText +import app.revanced.util.fingerprint.LiteralValueFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal object OfflineActionsOnClickListenerFingerprint : LiteralValueFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("Ljava/lang/String;"), + literalSupplier = { OfflineActionsVideoDeletedUndoSnackbarText } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt index 7921980a9..38ed2c2b0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt @@ -38,6 +38,7 @@ object SharedResourceIdPatch : ResourcePatch() { var ChannelListSubMenu = -1L var CompactLink = -1L var CompactListItem = -1L + var ComponentLongClickListener = -1L var ControlsLayoutStub = -1L var DarkBackground = -1L var DarkSplashAnimation = -1L @@ -71,7 +72,9 @@ object SharedResourceIdPatch : ResourcePatch() { var ModernMiniPlayerForwardButton = -1L var ModernMiniPlayerRewindButton = -1L var MusicAppDeeplinkButtonView = -1L + var Notice = -1L var NotificationBigPictureIconWidth = -1L + var OfflineActionsVideoDeletedUndoSnackbarText = -1L var PlayerCollapseButton = -1L var PlayerVideoTitleView = -1L var PosterArtWidthDefault = -1L @@ -138,6 +141,7 @@ object SharedResourceIdPatch : ResourcePatch() { ChannelListSubMenu = getId(LAYOUT, "channel_list_sub_menu") CompactLink = getId(LAYOUT, "compact_link") CompactListItem = getId(LAYOUT, "compact_list_item") + ComponentLongClickListener = getId(ID, "component_long_click_listener") ControlsLayoutStub = getId(ID, "controls_layout_stub") DarkBackground = getId(ID, "dark_background") DarkSplashAnimation = getId(ID, "dark_splash_animation") @@ -173,7 +177,9 @@ object SharedResourceIdPatch : ResourcePatch() { ModernMiniPlayerForwardButton = getId(ID, "modern_miniplayer_forward_button") ModernMiniPlayerRewindButton = getId(ID, "modern_miniplayer_rewind_button") MusicAppDeeplinkButtonView = getId(ID, "music_app_deeplink_button_view") + Notice = getId(ID, "notice") NotificationBigPictureIconWidth = getId(DIMEN, "notification_big_picture_icon_width") + OfflineActionsVideoDeletedUndoSnackbarText = getId(STRING, "offline_actions_video_deleted_undo_snackbar_text") PlayerCollapseButton = getId(ID, "player_collapse_button") PlayerVideoTitleView = getId(ID, "player_video_title_view") PosterArtWidthDefault = getId(DIMEN, "poster_art_width_default")