From 30fc242496162dd775f7d1b0a4c51321e50c1bac Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Thu, 4 Apr 2024 10:32:38 +0900 Subject: [PATCH] fix(YouTube/Overlay buttons): various bugs that have not been fixed for a long time --- .../general/OverlayButtonsPatch.kt | 3 +- .../collapsebutton/CollapseButtonPatch.kt | 24 +- .../fingerprints/LiveChatFingerprint.kt | 10 - .../PreviousNextButtonPatch.kt | 2 +- ...layerControlsVisibilityModelFingerprint.kt | 2 +- .../NewThumbnailPreviewPatch.kt | 2 +- .../ThumbnailPreviewConfigFingerprint.kt | 2 +- .../PlayerButtonsResourcesFingerprint.kt | 9 + .../playercontrols/PlayerControlsPatch.kt | 229 +++++------------- ...ementSpeedEduVisibleToStringFingerprint.kt | 14 -- ... => PlayerButtonsVisibilityFingerprint.kt} | 11 +- .../PlayerControlsPatchFingerprint.kt | 16 ++ .../QuickSeekVisibleFingerprint.kt | 11 - .../fingerprints/SeekEDUVisibleFingerprint.kt | 11 - .../fingerprints/UserScrubbingFingerprint.kt | 11 - .../utils/resourceid/SharedResourceIdPatch.kt | 2 - .../sponsorblock/SponsorBlockBytecodePatch.kt | 3 +- 17 files changed, 110 insertions(+), 252 deletions(-) delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/fingerprints/LiveChatFingerprint.kt rename src/main/kotlin/app/revanced/patches/youtube/{utils => player/previousnextbutton}/fingerprints/PlayerControlsVisibilityModelFingerprint.kt (80%) rename src/main/kotlin/app/revanced/patches/youtube/{utils => seekbar/thumbnailpreview}/fingerprints/ThumbnailPreviewConfigFingerprint.kt (75%) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerButtonsResourcesFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleToStringFingerprint.kt rename src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/{FullscreenEngagementSpeedEduVisibleFingerprint.kt => PlayerButtonsVisibilityFingerprint.kt} (50%) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/PlayerControlsPatchFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/QuickSeekVisibleFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/SeekEDUVisibleFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/UserScrubbingFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/general/OverlayButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/general/OverlayButtonsPatch.kt index a4e220c41..8d0f30b93 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/general/OverlayButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/general/OverlayButtonsPatch.kt @@ -66,8 +66,7 @@ object OverlayButtonsPatch : BaseResourcePatch( "ExternalDownload;", "SpeedDialog;" ).forEach { className -> - PlayerControlsPatch.initializeControl("$OVERLAY_BUTTONS_PATH/$className") - PlayerControlsPatch.injectVisibility("$OVERLAY_BUTTONS_PATH/$className") + PlayerControlsPatch.hookOverlayButtons("$OVERLAY_BUTTONS_PATH/$className") } /** diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/CollapseButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/CollapseButtonPatch.kt index 924e2f2ff..2916d2f35 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/CollapseButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/CollapseButtonPatch.kt @@ -2,41 +2,29 @@ package app.revanced.patches.youtube.player.collapsebutton import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patches.youtube.player.collapsebutton.fingerprints.LiveChatFingerprint +import app.revanced.patches.youtube.utils.fingerprints.PlayerButtonsResourcesFingerprint import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR -import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.findMutableMethodOf import app.revanced.util.patch.BaseBytecodePatch import app.revanced.util.resultOrThrow import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21c import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction35c @Suppress("unused") object CollapseButtonPatch : BaseBytecodePatch( name = "Hide collapse button", description = "Adds an option to hide the collapse button in the video player.", - dependencies = setOf( - SettingsPatch::class, - SharedResourceIdPatch::class - ), + dependencies = setOf(SettingsPatch::class), compatiblePackages = COMPATIBLE_PACKAGE, - fingerprints = setOf(LiveChatFingerprint) + fingerprints = setOf(PlayerButtonsResourcesFingerprint) ) { override fun execute(context: BytecodeContext) { - LiveChatFingerprint.resultOrThrow().let { - val endIndex = it.scanResult.patternScanResult!!.endIndex - val instructions = it.mutableMethod.getInstruction(endIndex) - val imageButtonClass = context - .findClass((instructions as BuilderInstruction21c).reference.toString())!! - .mutableClass - - for (method in imageButtonClass.methods) { - imageButtonClass.findMutableMethodOf(method).apply { + PlayerButtonsResourcesFingerprint.resultOrThrow().mutableClass.apply { + for (method in methods) { + findMutableMethodOf(method).apply { var jumpInstruction = true implementation!!.instructions.forEachIndexed { index, instructions -> diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/fingerprints/LiveChatFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/fingerprints/LiveChatFingerprint.kt deleted file mode 100644 index ccd641ca9..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/fingerprints/LiveChatFingerprint.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.revanced.patches.youtube.player.collapsebutton.fingerprints - -import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.LiveChatButton -import app.revanced.util.fingerprint.LiteralValueFingerprint -import com.android.tools.smali.dexlib2.Opcode - -internal object LiveChatFingerprint : LiteralValueFingerprint( - opcodes = listOf(Opcode.NEW_INSTANCE), - literalSupplier = { LiveChatButton } -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/previousnextbutton/PreviousNextButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/previousnextbutton/PreviousNextButtonPatch.kt index 8bea46b8f..e45f03687 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/previousnextbutton/PreviousNextButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/previousnextbutton/PreviousNextButtonPatch.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.player.previousnextbutton import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patches.youtube.utils.fingerprints.PlayerControlsVisibilityModelFingerprint +import app.revanced.patches.youtube.player.previousnextbutton.fingerprints.PlayerControlsVisibilityModelFingerprint import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerControlsVisibilityModelFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/previousnextbutton/fingerprints/PlayerControlsVisibilityModelFingerprint.kt similarity index 80% rename from src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerControlsVisibilityModelFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/player/previousnextbutton/fingerprints/PlayerControlsVisibilityModelFingerprint.kt index 25a7fce73..f4efdb6bf 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerControlsVisibilityModelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/previousnextbutton/fingerprints/PlayerControlsVisibilityModelFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.utils.fingerprints +package app.revanced.patches.youtube.player.previousnextbutton.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode diff --git a/src/main/kotlin/app/revanced/patches/youtube/seekbar/thumbnailpreview/NewThumbnailPreviewPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/seekbar/thumbnailpreview/NewThumbnailPreviewPatch.kt index f1396f9d7..4ae3f5f3e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/seekbar/thumbnailpreview/NewThumbnailPreviewPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/seekbar/thumbnailpreview/NewThumbnailPreviewPatch.kt @@ -1,7 +1,7 @@ package app.revanced.patches.youtube.seekbar.thumbnailpreview import app.revanced.patcher.data.BytecodeContext -import app.revanced.patches.youtube.utils.fingerprints.ThumbnailPreviewConfigFingerprint +import app.revanced.patches.youtube.seekbar.thumbnailpreview.fingerprints.ThumbnailPreviewConfigFingerprint import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.SEEKBAR_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/ThumbnailPreviewConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/seekbar/thumbnailpreview/fingerprints/ThumbnailPreviewConfigFingerprint.kt similarity index 75% rename from src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/ThumbnailPreviewConfigFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/seekbar/thumbnailpreview/fingerprints/ThumbnailPreviewConfigFingerprint.kt index 60c0b8d95..a2a3255ca 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/ThumbnailPreviewConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/seekbar/thumbnailpreview/fingerprints/ThumbnailPreviewConfigFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.utils.fingerprints +package app.revanced.patches.youtube.seekbar.thumbnailpreview.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerButtonsResourcesFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerButtonsResourcesFingerprint.kt new file mode 100644 index 000000000..d2dc7c79a --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerButtonsResourcesFingerprint.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.youtube.utils.fingerprints + +import app.revanced.util.fingerprint.LiteralValueFingerprint + +internal object PlayerButtonsResourcesFingerprint : LiteralValueFingerprint( + returnType = "I", + parameters = listOf("Landroid/content/res/Resources;"), + literalSupplier = { 17694721 } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/PlayerControlsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/PlayerControlsPatch.kt index 2e95d688a..941f39c28 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/PlayerControlsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/PlayerControlsPatch.kt @@ -3,214 +3,115 @@ package app.revanced.patches.youtube.utils.playercontrols import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.fingerprint.MethodFingerprintResult import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.youtube.utils.fingerprints.PlayerControlsVisibilityModelFingerprint -import app.revanced.patches.youtube.utils.fingerprints.ThumbnailPreviewConfigFingerprint import app.revanced.patches.youtube.utils.fingerprints.YouTubeControlsOverlayFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH import app.revanced.patches.youtube.utils.playercontrols.fingerprints.BottomControlsInflateFingerprint import app.revanced.patches.youtube.utils.playercontrols.fingerprints.ControlsLayoutInflateFingerprint -import app.revanced.patches.youtube.utils.playercontrols.fingerprints.FullscreenEngagementSpeedEduVisibleFingerprint -import app.revanced.patches.youtube.utils.playercontrols.fingerprints.FullscreenEngagementSpeedEduVisibleToStringFingerprint +import app.revanced.patches.youtube.utils.fingerprints.PlayerButtonsResourcesFingerprint +import app.revanced.patches.youtube.utils.playercontrols.fingerprints.PlayerButtonsVisibilityFingerprint +import app.revanced.patches.youtube.utils.playercontrols.fingerprints.PlayerControlsPatchFingerprint import app.revanced.patches.youtube.utils.playercontrols.fingerprints.PlayerControlsVisibilityFingerprint -import app.revanced.patches.youtube.utils.playercontrols.fingerprints.QuickSeekVisibleFingerprint -import app.revanced.patches.youtube.utils.playercontrols.fingerprints.SeekEDUVisibleFingerprint -import app.revanced.patches.youtube.utils.playercontrols.fingerprints.UserScrubbingFingerprint import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch -import app.revanced.util.getStringInstructionIndex -import app.revanced.util.getTargetIndexWithReference import app.revanced.util.resultOrThrow -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.Reference @Patch(dependencies = [SharedResourceIdPatch::class]) object PlayerControlsPatch : BytecodePatch( setOf( + PlayerButtonsResourcesFingerprint, + PlayerControlsPatchFingerprint, BottomControlsInflateFingerprint, ControlsLayoutInflateFingerprint, - FullscreenEngagementSpeedEduVisibleToStringFingerprint, - PlayerControlsVisibilityModelFingerprint, - ThumbnailPreviewConfigFingerprint, YouTubeControlsOverlayFingerprint ) ) { + private const val INTEGRATIONS_CLASS_DESCRIPTOR = + "$UTILS_PATH/PlayerControlsPatch;" + + private lateinit var changeVisibilityMethod: MutableMethod + private lateinit var initializeOverlayButtonsMethod: MutableMethod + private lateinit var initializeSponsorBlockButtonsMethod: MutableMethod + override fun execute(context: BytecodeContext) { - val playerControlsVisibilityModelClass = - PlayerControlsVisibilityModelFingerprint.resultOrThrow().mutableClass - - val youTubeControlsOverlayClass = - YouTubeControlsOverlayFingerprint.resultOrThrow().mutableClass - - QuickSeekVisibleFingerprint.resolve(context, playerControlsVisibilityModelClass) - SeekEDUVisibleFingerprint.resolve(context, playerControlsVisibilityModelClass) - UserScrubbingFingerprint.resolve(context, playerControlsVisibilityModelClass) - - PlayerControlsVisibilityFingerprint.resolve(context, youTubeControlsOverlayClass) - - quickSeekVisibleMutableMethod = QuickSeekVisibleFingerprint.resultOrThrow().mutableMethod - - seekEDUVisibleMutableMethod = SeekEDUVisibleFingerprint.resultOrThrow().mutableMethod - - userScrubbingMutableMethod = UserScrubbingFingerprint.resultOrThrow().mutableMethod - - playerControlsVisibilityMutableMethod = PlayerControlsVisibilityFingerprint.resultOrThrow().mutableMethod - - controlsLayoutInflateResult = ControlsLayoutInflateFingerprint.resultOrThrow() - - inflateResult = BottomControlsInflateFingerprint.resultOrThrow() - - FullscreenEngagementSpeedEduVisibleToStringFingerprint.resultOrThrow().let { - FullscreenEngagementSpeedEduVisibleFingerprint.resolve(context, it.classDef) - fullscreenEngagementSpeedEduVisibleMutableMethod = FullscreenEngagementSpeedEduVisibleFingerprint.resultOrThrow().mutableMethod - + // new method + PlayerButtonsVisibilityFingerprint.resolve( + context, + PlayerButtonsResourcesFingerprint.resultOrThrow().mutableClass + ) + PlayerButtonsVisibilityFingerprint.resultOrThrow().let { it.mutableMethod.apply { - fullscreenEngagementViewVisibleReference = - findReference(", isFullscreenEngagementViewVisible=") - speedEDUVisibleReference = findReference(", isSpeedmasterEDUVisible=") - } - } - - ThumbnailPreviewConfigFingerprint.resultOrThrow().let { - it.mutableMethod.apply { - bigBoardsVisibilityMutableMethod = this + val viewIndex = it.scanResult.patternScanResult!!.startIndex + 1 + val viewRegister = getInstruction(viewIndex).registerA addInstruction( - 0, - "const/4 v0, 0x1" + viewIndex + 1, + "invoke-static {p1, p2, v$viewRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->changeVisibility(ZZLandroid/view/View;)V" ) } } - } - private lateinit var controlsLayoutInflateResult: MethodFingerprintResult - private lateinit var inflateResult: MethodFingerprintResult + // legacy method + PlayerControlsVisibilityFingerprint.resolve( + context, + YouTubeControlsOverlayFingerprint.resultOrThrow().mutableClass + ) + PlayerControlsVisibilityFingerprint.resultOrThrow().mutableMethod.addInstruction( + 0, + "invoke-static {p1}, $INTEGRATIONS_CLASS_DESCRIPTOR->changeVisibility(Z)V" + ) - private lateinit var bigBoardsVisibilityMutableMethod: MutableMethod - private lateinit var playerControlsVisibilityMutableMethod: MutableMethod - private lateinit var quickSeekVisibleMutableMethod: MutableMethod - private lateinit var seekEDUVisibleMutableMethod: MutableMethod - private lateinit var userScrubbingMutableMethod: MutableMethod + mapOf( + BottomControlsInflateFingerprint to "initializeOverlayButtons", + ControlsLayoutInflateFingerprint to "initializeSponsorBlockButtons" + ).forEach { (fingerprint, methodName) -> + fingerprint.resultOrThrow().let { + it.mutableMethod.apply { + val endIndex = it.scanResult.patternScanResult!!.endIndex + val viewRegister = getInstruction(endIndex).registerA - private lateinit var fullscreenEngagementSpeedEduVisibleMutableMethod: MutableMethod - private lateinit var fullscreenEngagementViewVisibleReference: Reference - private lateinit var speedEDUVisibleReference: Reference - - private fun MutableMethod.findReference(targetString: String): Reference { - val stringIndex = getStringInstructionIndex(targetString) - if (stringIndex > 0) { - val appendIndex = getTargetIndexWithReference( - stringIndex, - "Ljava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder;" - ) - if (appendIndex > 0) { - val booleanRegister = getInstruction(appendIndex).registerD - - for (index in appendIndex downTo 0) { - val opcode = getInstruction(index).opcode - if (opcode != Opcode.IGET_BOOLEAN) - continue - - val register = getInstruction(index).registerA - if (register != booleanRegister) - continue - - return getInstruction(index).reference + addInstruction( + endIndex + 1, + "invoke-static {v$viewRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V" + ) } } } - throw PatchException("Reference not found: $targetString") - } + PlayerControlsPatchFingerprint.resultOrThrow().let { + changeVisibilityMethod = it.mutableMethod - private fun injectBigBoardsVisibilityCall(descriptor: String) { - bigBoardsVisibilityMutableMethod.addInstruction( - 1, - "invoke-static {v0}, $descriptor->changeVisibilityNegatedImmediate(Z)V" - ) - } + initializeOverlayButtonsMethod = + it.mutableClass.methods.find { method -> method.name == "initializeOverlayButtons" }!! - private fun injectFullscreenEngagementSpeedEduViewVisibilityCall( - reference: Reference, - descriptor: String - ) { - fullscreenEngagementSpeedEduVisibleMutableMethod.apply { - val index = getTargetIndexWithReference(reference.toString()) - val register = getInstruction(index).registerA - - addInstruction( - index, - "invoke-static {v$register}, $descriptor->changeVisibilityNegatedImmediate(Z)V" - ) + initializeSponsorBlockButtonsMethod = + it.mutableClass.methods.find { method -> method.name == "initializeSponsorBlockButtons" }!! } } - private fun MutableMethod.injectVisibilityCall( - descriptor: String, - fieldName: String - ) { + private fun MutableMethod.initializeHook(classDescriptor: String) = addInstruction( 0, - "invoke-static {p1}, $descriptor->$fieldName(Z)V" + "invoke-static {p0}, $classDescriptor->initialize(Landroid/view/View;)V" ) + + private fun changeVisibilityHook(classDescriptor: String) = + changeVisibilityMethod.addInstruction( + 0, + "invoke-static {p0, p1}, $classDescriptor->changeVisibility(ZZ)V" + ) + + internal fun hookOverlayButtons(classDescriptor: String) { + initializeOverlayButtonsMethod.initializeHook(classDescriptor) + changeVisibilityHook(classDescriptor) } - private fun MethodFingerprintResult.injectCalls( - descriptor: String - ) { - mutableMethod.apply { - val endIndex = scanResult.patternScanResult!!.endIndex - val viewRegister = getInstruction(endIndex).registerA - - addInstruction( - endIndex + 1, - "invoke-static {v$viewRegister}, $descriptor->initialize(Landroid/view/View;)V" - ) - } - } - - internal fun injectVisibility(descriptor: String) { - playerControlsVisibilityMutableMethod.injectVisibilityCall( - descriptor, - "changeVisibility" - ) - quickSeekVisibleMutableMethod.injectVisibilityCall( - descriptor, - "changeVisibilityNegatedImmediate" - ) - seekEDUVisibleMutableMethod.injectVisibilityCall( - descriptor, - "changeVisibilityNegatedImmediate" - ) - userScrubbingMutableMethod.injectVisibilityCall( - descriptor, - "changeVisibilityNegatedImmediate" - ) - - injectBigBoardsVisibilityCall(descriptor) - - injectFullscreenEngagementSpeedEduViewVisibilityCall( - fullscreenEngagementViewVisibleReference, - descriptor - ) - injectFullscreenEngagementSpeedEduViewVisibilityCall( - speedEDUVisibleReference, - descriptor - ) - } - - internal fun initializeSB(descriptor: String) { - controlsLayoutInflateResult.injectCalls(descriptor) - } - - internal fun initializeControl(descriptor: String) { - inflateResult.injectCalls(descriptor) + internal fun hookSponsorBlockButtons(classDescriptor: String) { + initializeSponsorBlockButtonsMethod.initializeHook(classDescriptor) + changeVisibilityHook(classDescriptor) } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleToStringFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleToStringFingerprint.kt deleted file mode 100644 index fe476c10b..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleToStringFingerprint.kt +++ /dev/null @@ -1,14 +0,0 @@ -package app.revanced.patches.youtube.utils.playercontrols.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.AccessFlags - -internal object FullscreenEngagementSpeedEduVisibleToStringFingerprint : MethodFingerprint( - returnType = "Ljava/lang/String;", - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - strings = listOf( - ", isSpeedmasterEDUVisible=", - ", isFullscreenEngagementViewVisible=" - ) -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/PlayerButtonsVisibilityFingerprint.kt similarity index 50% rename from src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/PlayerButtonsVisibilityFingerprint.kt index 91cfb508b..b1902637f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/PlayerButtonsVisibilityFingerprint.kt @@ -5,8 +5,13 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal object FullscreenEngagementSpeedEduVisibleFingerprint : MethodFingerprint( +internal object PlayerButtonsVisibilityFingerprint : MethodFingerprint( returnType = "V", - accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - opcodes = listOf(Opcode.IPUT_BOOLEAN) + accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, + opcodes = listOf( + Opcode.IGET_OBJECT, + Opcode.IGET_OBJECT, + Opcode.INVOKE_INTERFACE + ), + parameters = listOf("Z", "Z") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/PlayerControlsPatchFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/PlayerControlsPatchFingerprint.kt new file mode 100644 index 000000000..7d4b1231d --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/PlayerControlsPatchFingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.youtube.utils.playercontrols.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH +import com.android.tools.smali.dexlib2.AccessFlags + +internal object PlayerControlsPatchFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PRIVATE or AccessFlags.STATIC, + parameters = listOf("Z", "Z"), + customFingerprint = { methodDef, _ -> + methodDef.definingClass == "$UTILS_PATH/PlayerControlsPatch;" + && methodDef.name == "changeVisibility" + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/QuickSeekVisibleFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/QuickSeekVisibleFingerprint.kt deleted file mode 100644 index ee206a0f1..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/QuickSeekVisibleFingerprint.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.youtube.utils.playercontrols.fingerprints - -import app.revanced.util.fingerprint.LiteralValueFingerprint -import com.android.tools.smali.dexlib2.Opcode - -internal object QuickSeekVisibleFingerprint : LiteralValueFingerprint( - returnType = "V", - parameters = listOf("Z"), - opcodes = listOf(Opcode.OR_INT_LIT16), - literalSupplier = { 128 } -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/SeekEDUVisibleFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/SeekEDUVisibleFingerprint.kt deleted file mode 100644 index 39e8dc89d..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/SeekEDUVisibleFingerprint.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.youtube.utils.playercontrols.fingerprints - -import app.revanced.util.fingerprint.LiteralValueFingerprint -import com.android.tools.smali.dexlib2.Opcode - -internal object SeekEDUVisibleFingerprint : LiteralValueFingerprint( - returnType = "V", - parameters = listOf("Z"), - opcodes = listOf(Opcode.OR_INT_LIT8), - literalSupplier = { 32 } -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/UserScrubbingFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/UserScrubbingFingerprint.kt deleted file mode 100644 index 0371c68a9..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/UserScrubbingFingerprint.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.youtube.utils.playercontrols.fingerprints - -import app.revanced.util.fingerprint.LiteralValueFingerprint -import com.android.tools.smali.dexlib2.Opcode - -internal object UserScrubbingFingerprint : LiteralValueFingerprint( - returnType = "V", - parameters = listOf("Z"), - opcodes = listOf(Opcode.OR_INT_LIT8), - literalSupplier = { 64 } -) \ 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 b95e9eb02..659c5897c 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 @@ -55,7 +55,6 @@ object SharedResourceIdPatch : ResourcePatch() { var InlineTimeBarPlayedNotHighlightedColor = -1L var InsetOverlayViewLayout = -1L var InterstitialsContainer = -1L - var LiveChatButton = -1L var MenuItemView = -1L var MusicAppDeeplinkButtonView = -1L var PosterArtWidthDefault = -1L @@ -134,7 +133,6 @@ object SharedResourceIdPatch : ResourcePatch() { getId(COLOR, "inline_time_bar_played_not_highlighted_color") InsetOverlayViewLayout = getId(ID, "inset_overlay_view_layout") InterstitialsContainer = getId(ID, "interstitials_container") - LiveChatButton = getId(ID, "live_chat_overlay_button") MenuItemView = getId(ID, "menu_item_view") MusicAppDeeplinkButtonView = getId(ID, "music_app_deeplink_button_view") PosterArtWidthDefault = getId(DIMEN, "poster_art_width_default") diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/SponsorBlockBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/SponsorBlockBytecodePatch.kt index d49f7a2f2..32610bbc3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/SponsorBlockBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/SponsorBlockBytecodePatch.kt @@ -109,8 +109,7 @@ object SponsorBlockBytecodePatch : BytecodePatch( // Voting & Shield button arrayOf("CreateSegmentButtonController;", "VotingButtonController;").forEach { className -> - PlayerControlsPatch.initializeSB("$INTEGRATIONS_SPONSOR_BLOCK_UI_PATH/$className") - PlayerControlsPatch.injectVisibility("$INTEGRATIONS_SPONSOR_BLOCK_UI_PATH/$className") + PlayerControlsPatch.hookSponsorBlockButtons("$INTEGRATIONS_SPONSOR_BLOCK_UI_PATH/$className") } // Append timestamp