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/FullscreenEngagementSpeedEduVisibleFingerprint.kt new file mode 100644 index 000000000..47dd1d801 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleFingerprint.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.youtube.utils.playercontrols.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.AccessFlags +import org.jf.dexlib2.Opcode + +object FullscreenEngagementSpeedEduVisibleFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, + opcodes = listOf(Opcode.IPUT_BOOLEAN) +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleParentFingerprint.kt new file mode 100644 index 000000000..49408e607 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleParentFingerprint.kt @@ -0,0 +1,14 @@ +package app.revanced.patches.youtube.utils.playercontrols.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.AccessFlags + +object FullscreenEngagementSpeedEduVisibleParentFingerprint : 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/SpeedEduVisibleFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/SpeedEduVisibleFingerprint.kt deleted file mode 100644 index 87d0c4724..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/SpeedEduVisibleFingerprint.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.revanced.patches.youtube.utils.playercontrols.fingerprints - -import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint -import org.jf.dexlib2.Opcode - -object SpeedEduVisibleFingerprint : MethodFingerprint( - returnType = "V", - opcodes = listOf(Opcode.IPUT_BOOLEAN), - customFingerprint = { methodDef, _ -> methodDef.name == "" } -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/SpeedEduVisibleParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/SpeedEduVisibleParentFingerprint.kt deleted file mode 100644 index 65700c921..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/SpeedEduVisibleParentFingerprint.kt +++ /dev/null @@ -1,8 +0,0 @@ -package app.revanced.patches.youtube.utils.playercontrols.fingerprints - -import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint - -object SpeedEduVisibleParentFingerprint : MethodFingerprint( - returnType = "L", - strings = listOf(", isSpeedmasterEDUVisible=") -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/patch/PlayerControlsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/patch/PlayerControlsPatch.kt index d12c9a100..4520232d1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/patch/PlayerControlsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/patch/PlayerControlsPatch.kt @@ -19,11 +19,11 @@ import app.revanced.patches.youtube.utils.annotations.YouTubeCompatibility import app.revanced.patches.youtube.utils.fingerprints.YouTubeControlsOverlayFingerprint 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.FullscreenEngagementSpeedEduVisibleParentFingerprint import app.revanced.patches.youtube.utils.playercontrols.fingerprints.PlayerControlsVisibilityFingerprint import app.revanced.patches.youtube.utils.playercontrols.fingerprints.PlayerControlsVisibilityModelFingerprint import app.revanced.patches.youtube.utils.playercontrols.fingerprints.SeekEDUVisibleFingerprint -import app.revanced.patches.youtube.utils.playercontrols.fingerprints.SpeedEduVisibleFingerprint -import app.revanced.patches.youtube.utils.playercontrols.fingerprints.SpeedEduVisibleParentFingerprint import app.revanced.patches.youtube.utils.playercontrols.fingerprints.UserScrubbingFingerprint import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch import app.revanced.util.bytecode.getStringIndex @@ -43,80 +43,77 @@ class PlayerControlsPatch : BytecodePatch( listOf( BottomControlsInflateFingerprint, ControlsLayoutInflateFingerprint, + FullscreenEngagementSpeedEduVisibleParentFingerprint, PlayerControlsVisibilityModelFingerprint, - SpeedEduVisibleParentFingerprint, YouTubeControlsOverlayFingerprint ) ) { override fun execute(context: BytecodeContext): PatchResult { - val playerControlsVisibilityModelClassDef = - PlayerControlsVisibilityModelFingerprint.result?.classDef - ?: return PlayerControlsVisibilityModelFingerprint.toErrorResult() + fun MutableMethod.findReference(targetString: String): Reference { + val targetIndex = getStringIndex(targetString) + 2 + val targetRegister = getInstruction(targetIndex).registerD - SeekEDUVisibleFingerprint.resolve(context, playerControlsVisibilityModelClassDef) - seekEDUVisibleResult = - SeekEDUVisibleFingerprint.result ?: return SeekEDUVisibleFingerprint.toErrorResult() + val instructions = implementation!!.instructions + for ((index, instruction) in instructions.withIndex()) { + if (instruction.opcode != Opcode.IGET_BOOLEAN) continue - UserScrubbingFingerprint.resolve(context, playerControlsVisibilityModelClassDef) - userScrubbingResult = - UserScrubbingFingerprint.result ?: return UserScrubbingFingerprint.toErrorResult() + if (getInstruction(index).registerA == targetRegister) + return getInstruction(index).reference + } + throw PatchResultError("Reference not found: $targetString") + } - val controlsOverlayClassDef = - YouTubeControlsOverlayFingerprint.result?.classDef - ?: return YouTubeControlsOverlayFingerprint.toErrorResult() + PlayerControlsVisibilityModelFingerprint.result?.classDef?.let { classDef -> + seekEDUVisibleMutableMethod = + SeekEDUVisibleFingerprint.also { + it.resolve( + context, + classDef + ) + }.result?.mutableMethod ?: return SeekEDUVisibleFingerprint.toErrorResult() - PlayerControlsVisibilityFingerprint.resolve(context, controlsOverlayClassDef) - playerControlsVisibilityResult = PlayerControlsVisibilityFingerprint.result - ?: return PlayerControlsVisibilityFingerprint.toErrorResult() + userScrubbingMutableMethod = + UserScrubbingFingerprint.also { + it.resolve( + context, + classDef + ) + }.result?.mutableMethod ?: return UserScrubbingFingerprint.toErrorResult() + } ?: return PlayerControlsVisibilityModelFingerprint.toErrorResult() - controlsLayoutInflateResult = ControlsLayoutInflateFingerprint.result - ?: return ControlsLayoutInflateFingerprint.toErrorResult() - inflateResult = BottomControlsInflateFingerprint.result - ?: return BottomControlsInflateFingerprint.toErrorResult() + YouTubeControlsOverlayFingerprint.result?.classDef?.let { classDef -> + playerControlsVisibilityMutableMethod = + PlayerControlsVisibilityFingerprint.also { + it.resolve( + context, + classDef + ) + }.result?.mutableMethod ?: return PlayerControlsVisibilityFingerprint.toErrorResult() + } ?: return YouTubeControlsOverlayFingerprint.toErrorResult() - SpeedEduVisibleParentFingerprint.result?.let { parentResult -> - var speedIndex = 0 + controlsLayoutInflateResult = + ControlsLayoutInflateFingerprint.result + ?: return ControlsLayoutInflateFingerprint.toErrorResult() + + inflateResult = + BottomControlsInflateFingerprint.result + ?: return BottomControlsInflateFingerprint.toErrorResult() + + FullscreenEngagementSpeedEduVisibleParentFingerprint.result?.let { parentResult -> parentResult.mutableMethod.apply { - val targetIndex = getStringIndex(", isSpeedmasterEDUVisible=") + 2 - val targetRegister = getInstruction(targetIndex).registerD - - val instructions = implementation!!.instructions - for ((index, instruction) in instructions.withIndex()) { - if (instruction.opcode != Opcode.IGET_BOOLEAN) continue - - if (getInstruction(index).registerA == targetRegister) { - speedEDUVisibleReference = - getInstruction(index).reference - speedIndex = index - break - } - } - if (speedIndex == 0) return PatchResultError("SpeedEduVisibleParent Instruction not found!") + fullscreenEngagementViewVisibleReference = findReference(", isFullscreenEngagementViewVisible=") + speedEDUVisibleReference = findReference(", isSpeedmasterEDUVisible=") } - SpeedEduVisibleFingerprint.also { - it.resolve( - context, - parentResult.classDef - ) - }.result?.mutableMethod?.let { - it.implementation!!.instructions.apply { - for ((index, instruction) in withIndex()) { - if (instruction.opcode != Opcode.IPUT_BOOLEAN) continue - - if (it.getInstruction(index).reference == speedEDUVisibleReference) { - speedEDUVisibleMutableMethod = it - speedEDUVisibleIndex = index - speedEDUVisibleRegister = - it.getInstruction(index).registerA - break - } - } - } - if (speedEDUVisibleIndex == 0) return PatchResultError("SpeedEduVisibleFingerprint Instruction not found!") - } ?: return SpeedEduVisibleFingerprint.toErrorResult() - } ?: return SpeedEduVisibleParentFingerprint.toErrorResult() + fullscreenEngagementSpeedEduVisibleMutableMethod = + FullscreenEngagementSpeedEduVisibleFingerprint.also { + it.resolve( + context, + parentResult.classDef + ) + }.result?.mutableMethod?: return FullscreenEngagementSpeedEduVisibleFingerprint.toErrorResult() + } ?: return FullscreenEngagementSpeedEduVisibleParentFingerprint.toErrorResult() return PatchResultSuccess() } @@ -124,28 +121,40 @@ class PlayerControlsPatch : BytecodePatch( internal companion object { lateinit var controlsLayoutInflateResult: MethodFingerprintResult lateinit var inflateResult: MethodFingerprintResult - lateinit var playerControlsVisibilityResult: MethodFingerprintResult - lateinit var seekEDUVisibleResult: MethodFingerprintResult - lateinit var userScrubbingResult: MethodFingerprintResult - lateinit var speedEDUVisibleMutableMethod: MutableMethod + lateinit var playerControlsVisibilityMutableMethod: MutableMethod + lateinit var seekEDUVisibleMutableMethod: MutableMethod + lateinit var userScrubbingMutableMethod: MutableMethod + + lateinit var fullscreenEngagementSpeedEduVisibleMutableMethod: MutableMethod + lateinit var fullscreenEngagementViewVisibleReference: Reference lateinit var speedEDUVisibleReference: Reference - private var speedEDUVisibleRegister: Int = 1 - private var speedEDUVisibleIndex: Int = 0 + private fun injectFullscreenEngagementSpeedEduViewVisibilityCall( + reference: Reference, + descriptor: String + ) { + fullscreenEngagementSpeedEduVisibleMutableMethod.apply { + for ((index, instruction) in implementation!!.instructions.withIndex()) { + if (instruction.opcode != Opcode.IPUT_BOOLEAN) continue + if (getInstruction(index).reference != reference) continue - private fun injectSpeedEduVisibilityCall(descriptor: String) { - speedEDUVisibleMutableMethod.addInstruction( - speedEDUVisibleIndex, - "invoke-static {v$speedEDUVisibleRegister}, $descriptor->changeVisibilityNegatedImmediate(Z)V" - ) + val register = getInstruction(index).registerA + + addInstruction( + index, + "invoke-static {v$register}, $descriptor->changeVisibilityNegatedImmediate(Z)V" + ) + break; + } + } } - private fun MethodFingerprintResult.injectVisibilityCall( + private fun MutableMethod.injectVisibilityCall( descriptor: String, fieldName: String ) { - mutableMethod.addInstruction( + addInstruction( 0, "invoke-static {p1}, $descriptor->$fieldName(Z)V" ) @@ -166,13 +175,15 @@ class PlayerControlsPatch : BytecodePatch( } fun injectVisibility(descriptor: String) { - playerControlsVisibilityResult.injectVisibilityCall(descriptor, "changeVisibility") - seekEDUVisibleResult.injectVisibilityCall( + playerControlsVisibilityMutableMethod.injectVisibilityCall(descriptor, "changeVisibility") + seekEDUVisibleMutableMethod.injectVisibilityCall( descriptor, "changeVisibilityNegatedImmediate" ) - userScrubbingResult.injectVisibilityCall(descriptor, "changeVisibilityNegatedImmediate") - injectSpeedEduVisibilityCall(descriptor) + userScrubbingMutableMethod.injectVisibilityCall(descriptor, "changeVisibilityNegatedImmediate") + + injectFullscreenEngagementSpeedEduViewVisibilityCall(fullscreenEngagementViewVisibleReference, descriptor) + injectFullscreenEngagementSpeedEduViewVisibilityCall(speedEDUVisibleReference, descriptor) } fun initializeSB(descriptor: String) { diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/bytecode/fingerprints/EndScreenEngagementPanelsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/bytecode/fingerprints/EndScreenEngagementPanelsFingerprint.kt deleted file mode 100644 index 672534fe9..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/bytecode/fingerprints/EndScreenEngagementPanelsFingerprint.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.revanced.patches.youtube.utils.sponsorblock.bytecode.fingerprints - -import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint -import org.jf.dexlib2.Opcode - -object EndScreenEngagementPanelsFingerprint : MethodFingerprint( - returnType = "V", - opcodes = listOf(Opcode.CONST_WIDE_16), - strings = listOf("ITEM_COUNT") -) diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/bytecode/patch/SponsorBlockBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/bytecode/patch/SponsorBlockBytecodePatch.kt index bc25bdb92..9b75548b0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/bytecode/patch/SponsorBlockBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/bytecode/patch/SponsorBlockBytecodePatch.kt @@ -24,7 +24,6 @@ import app.revanced.patches.youtube.utils.playercontrols.patch.PlayerControlsPat import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.InsetOverlayViewLayout import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.TotalTime -import app.revanced.patches.youtube.utils.sponsorblock.bytecode.fingerprints.EndScreenEngagementPanelsFingerprint import app.revanced.patches.youtube.utils.sponsorblock.bytecode.fingerprints.PlayerControllerFingerprint import app.revanced.patches.youtube.utils.sponsorblock.bytecode.fingerprints.RectangleFieldInvalidatorFingerprint import app.revanced.patches.youtube.utils.videoid.general.patch.VideoIdPatch @@ -56,7 +55,6 @@ import org.jf.dexlib2.iface.reference.MethodReference @Version("0.0.1") class SponsorBlockBytecodePatch : BytecodePatch( listOf( - EndScreenEngagementPanelsFingerprint, PlayerControllerFingerprint, TotalTimeFingerprint, YouTubeControlsOverlayFingerprint @@ -148,13 +146,6 @@ class SponsorBlockBytecodePatch : BytecodePatch( PlayerControlsPatch.injectVisibility("$INTEGRATIONS_BUTTON_CLASS_DESCRIPTOR/ui/$it;") } - EndScreenEngagementPanelsFingerprint.result?.mutableMethod?.let { - it.addInstruction( - it.implementation!!.instructions.size - 1, - "invoke-static {}, $INTEGRATIONS_BUTTON_CLASS_DESCRIPTOR/ui/SponsorBlockViewController;->endOfVideoReached()V" - ) - } - /** * Append the new time to the player layout */