fix(youtube/sponsorblock): vote button and new segment button still showing when end screen overlay appears

This commit is contained in:
inotia00 2023-07-05 20:54:32 +09:00
parent 2bc99c0e99
commit 8e664f5eda
7 changed files with 115 additions and 115 deletions

View File

@ -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)
)

View File

@ -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="
)
)

View File

@ -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 == "<init>" }
)

View File

@ -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=")
)

View File

@ -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.fingerprints.YouTubeControlsOverlayFingerprint
import app.revanced.patches.youtube.utils.playercontrols.fingerprints.BottomControlsInflateFingerprint 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.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.PlayerControlsVisibilityFingerprint
import app.revanced.patches.youtube.utils.playercontrols.fingerprints.PlayerControlsVisibilityModelFingerprint 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.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.playercontrols.fingerprints.UserScrubbingFingerprint
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch
import app.revanced.util.bytecode.getStringIndex import app.revanced.util.bytecode.getStringIndex
@ -43,80 +43,77 @@ class PlayerControlsPatch : BytecodePatch(
listOf( listOf(
BottomControlsInflateFingerprint, BottomControlsInflateFingerprint,
ControlsLayoutInflateFingerprint, ControlsLayoutInflateFingerprint,
FullscreenEngagementSpeedEduVisibleParentFingerprint,
PlayerControlsVisibilityModelFingerprint, PlayerControlsVisibilityModelFingerprint,
SpeedEduVisibleParentFingerprint,
YouTubeControlsOverlayFingerprint YouTubeControlsOverlayFingerprint
) )
) { ) {
override fun execute(context: BytecodeContext): PatchResult { override fun execute(context: BytecodeContext): PatchResult {
val playerControlsVisibilityModelClassDef = fun MutableMethod.findReference(targetString: String): Reference {
PlayerControlsVisibilityModelFingerprint.result?.classDef val targetIndex = getStringIndex(targetString) + 2
?: return PlayerControlsVisibilityModelFingerprint.toErrorResult()
SeekEDUVisibleFingerprint.resolve(context, playerControlsVisibilityModelClassDef)
seekEDUVisibleResult =
SeekEDUVisibleFingerprint.result ?: return SeekEDUVisibleFingerprint.toErrorResult()
UserScrubbingFingerprint.resolve(context, playerControlsVisibilityModelClassDef)
userScrubbingResult =
UserScrubbingFingerprint.result ?: return UserScrubbingFingerprint.toErrorResult()
val controlsOverlayClassDef =
YouTubeControlsOverlayFingerprint.result?.classDef
?: return YouTubeControlsOverlayFingerprint.toErrorResult()
PlayerControlsVisibilityFingerprint.resolve(context, controlsOverlayClassDef)
playerControlsVisibilityResult = PlayerControlsVisibilityFingerprint.result
?: return PlayerControlsVisibilityFingerprint.toErrorResult()
controlsLayoutInflateResult = ControlsLayoutInflateFingerprint.result
?: return ControlsLayoutInflateFingerprint.toErrorResult()
inflateResult = BottomControlsInflateFingerprint.result
?: return BottomControlsInflateFingerprint.toErrorResult()
SpeedEduVisibleParentFingerprint.result?.let { parentResult ->
var speedIndex = 0
parentResult.mutableMethod.apply {
val targetIndex = getStringIndex(", isSpeedmasterEDUVisible=") + 2
val targetRegister = getInstruction<Instruction35c>(targetIndex).registerD val targetRegister = getInstruction<Instruction35c>(targetIndex).registerD
val instructions = implementation!!.instructions val instructions = implementation!!.instructions
for ((index, instruction) in instructions.withIndex()) { for ((index, instruction) in instructions.withIndex()) {
if (instruction.opcode != Opcode.IGET_BOOLEAN) continue if (instruction.opcode != Opcode.IGET_BOOLEAN) continue
if (getInstruction<TwoRegisterInstruction>(index).registerA == targetRegister) { if (getInstruction<TwoRegisterInstruction>(index).registerA == targetRegister)
speedEDUVisibleReference = return getInstruction<ReferenceInstruction>(index).reference
getInstruction<ReferenceInstruction>(index).reference
speedIndex = index
break
} }
} throw PatchResultError("Reference not found: $targetString")
if (speedIndex == 0) return PatchResultError("SpeedEduVisibleParent Instruction not found!")
} }
SpeedEduVisibleFingerprint.also { PlayerControlsVisibilityModelFingerprint.result?.classDef?.let { classDef ->
seekEDUVisibleMutableMethod =
SeekEDUVisibleFingerprint.also {
it.resolve(
context,
classDef
)
}.result?.mutableMethod ?: return SeekEDUVisibleFingerprint.toErrorResult()
userScrubbingMutableMethod =
UserScrubbingFingerprint.also {
it.resolve(
context,
classDef
)
}.result?.mutableMethod ?: return UserScrubbingFingerprint.toErrorResult()
} ?: return PlayerControlsVisibilityModelFingerprint.toErrorResult()
YouTubeControlsOverlayFingerprint.result?.classDef?.let { classDef ->
playerControlsVisibilityMutableMethod =
PlayerControlsVisibilityFingerprint.also {
it.resolve(
context,
classDef
)
}.result?.mutableMethod ?: return PlayerControlsVisibilityFingerprint.toErrorResult()
} ?: return YouTubeControlsOverlayFingerprint.toErrorResult()
controlsLayoutInflateResult =
ControlsLayoutInflateFingerprint.result
?: return ControlsLayoutInflateFingerprint.toErrorResult()
inflateResult =
BottomControlsInflateFingerprint.result
?: return BottomControlsInflateFingerprint.toErrorResult()
FullscreenEngagementSpeedEduVisibleParentFingerprint.result?.let { parentResult ->
parentResult.mutableMethod.apply {
fullscreenEngagementViewVisibleReference = findReference(", isFullscreenEngagementViewVisible=")
speedEDUVisibleReference = findReference(", isSpeedmasterEDUVisible=")
}
fullscreenEngagementSpeedEduVisibleMutableMethod =
FullscreenEngagementSpeedEduVisibleFingerprint.also {
it.resolve( it.resolve(
context, context,
parentResult.classDef parentResult.classDef
) )
}.result?.mutableMethod?.let { }.result?.mutableMethod?: return FullscreenEngagementSpeedEduVisibleFingerprint.toErrorResult()
it.implementation!!.instructions.apply { } ?: return FullscreenEngagementSpeedEduVisibleParentFingerprint.toErrorResult()
for ((index, instruction) in withIndex()) {
if (instruction.opcode != Opcode.IPUT_BOOLEAN) continue
if (it.getInstruction<ReferenceInstruction>(index).reference == speedEDUVisibleReference) {
speedEDUVisibleMutableMethod = it
speedEDUVisibleIndex = index
speedEDUVisibleRegister =
it.getInstruction<TwoRegisterInstruction>(index).registerA
break
}
}
}
if (speedEDUVisibleIndex == 0) return PatchResultError("SpeedEduVisibleFingerprint Instruction not found!")
} ?: return SpeedEduVisibleFingerprint.toErrorResult()
} ?: return SpeedEduVisibleParentFingerprint.toErrorResult()
return PatchResultSuccess() return PatchResultSuccess()
} }
@ -124,28 +121,40 @@ class PlayerControlsPatch : BytecodePatch(
internal companion object { internal companion object {
lateinit var controlsLayoutInflateResult: MethodFingerprintResult lateinit var controlsLayoutInflateResult: MethodFingerprintResult
lateinit var inflateResult: 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 lateinit var speedEDUVisibleReference: Reference
private var speedEDUVisibleRegister: Int = 1 private fun injectFullscreenEngagementSpeedEduViewVisibilityCall(
private var speedEDUVisibleIndex: Int = 0 reference: Reference,
descriptor: String
) {
fullscreenEngagementSpeedEduVisibleMutableMethod.apply {
for ((index, instruction) in implementation!!.instructions.withIndex()) {
if (instruction.opcode != Opcode.IPUT_BOOLEAN) continue
if (getInstruction<ReferenceInstruction>(index).reference != reference) continue
private fun injectSpeedEduVisibilityCall(descriptor: String) { val register = getInstruction<TwoRegisterInstruction>(index).registerA
speedEDUVisibleMutableMethod.addInstruction(
speedEDUVisibleIndex, addInstruction(
"invoke-static {v$speedEDUVisibleRegister}, $descriptor->changeVisibilityNegatedImmediate(Z)V" index,
"invoke-static {v$register}, $descriptor->changeVisibilityNegatedImmediate(Z)V"
) )
break;
}
}
} }
private fun MethodFingerprintResult.injectVisibilityCall( private fun MutableMethod.injectVisibilityCall(
descriptor: String, descriptor: String,
fieldName: String fieldName: String
) { ) {
mutableMethod.addInstruction( addInstruction(
0, 0,
"invoke-static {p1}, $descriptor->$fieldName(Z)V" "invoke-static {p1}, $descriptor->$fieldName(Z)V"
) )
@ -166,13 +175,15 @@ class PlayerControlsPatch : BytecodePatch(
} }
fun injectVisibility(descriptor: String) { fun injectVisibility(descriptor: String) {
playerControlsVisibilityResult.injectVisibilityCall(descriptor, "changeVisibility") playerControlsVisibilityMutableMethod.injectVisibilityCall(descriptor, "changeVisibility")
seekEDUVisibleResult.injectVisibilityCall( seekEDUVisibleMutableMethod.injectVisibilityCall(
descriptor, descriptor,
"changeVisibilityNegatedImmediate" "changeVisibilityNegatedImmediate"
) )
userScrubbingResult.injectVisibilityCall(descriptor, "changeVisibilityNegatedImmediate") userScrubbingMutableMethod.injectVisibilityCall(descriptor, "changeVisibilityNegatedImmediate")
injectSpeedEduVisibilityCall(descriptor)
injectFullscreenEngagementSpeedEduViewVisibilityCall(fullscreenEngagementViewVisibleReference, descriptor)
injectFullscreenEngagementSpeedEduViewVisibilityCall(speedEDUVisibleReference, descriptor)
} }
fun initializeSB(descriptor: String) { fun initializeSB(descriptor: String) {

View File

@ -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")
)

View File

@ -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
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.InsetOverlayViewLayout 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.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.PlayerControllerFingerprint
import app.revanced.patches.youtube.utils.sponsorblock.bytecode.fingerprints.RectangleFieldInvalidatorFingerprint import app.revanced.patches.youtube.utils.sponsorblock.bytecode.fingerprints.RectangleFieldInvalidatorFingerprint
import app.revanced.patches.youtube.utils.videoid.general.patch.VideoIdPatch 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") @Version("0.0.1")
class SponsorBlockBytecodePatch : BytecodePatch( class SponsorBlockBytecodePatch : BytecodePatch(
listOf( listOf(
EndScreenEngagementPanelsFingerprint,
PlayerControllerFingerprint, PlayerControllerFingerprint,
TotalTimeFingerprint, TotalTimeFingerprint,
YouTubeControlsOverlayFingerprint YouTubeControlsOverlayFingerprint
@ -148,13 +146,6 @@ class SponsorBlockBytecodePatch : BytecodePatch(
PlayerControlsPatch.injectVisibility("$INTEGRATIONS_BUTTON_CLASS_DESCRIPTOR/ui/$it;") 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 * Append the new time to the player layout
*/ */