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.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()
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
fun MutableMethod.findReference(targetString: String): Reference {
val targetIndex = getStringIndex(targetString) + 2
val targetRegister = getInstruction<Instruction35c>(targetIndex).registerD
val instructions = implementation!!.instructions
for ((index, instruction) in instructions.withIndex()) {
if (instruction.opcode != Opcode.IGET_BOOLEAN) continue
if (getInstruction<TwoRegisterInstruction>(index).registerA == targetRegister) {
speedEDUVisibleReference =
getInstruction<ReferenceInstruction>(index).reference
speedIndex = index
break
if (getInstruction<TwoRegisterInstruction>(index).registerA == targetRegister)
return getInstruction<ReferenceInstruction>(index).reference
}
}
if (speedIndex == 0) return PatchResultError("SpeedEduVisibleParent Instruction not found!")
throw PatchResultError("Reference not found: $targetString")
}
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(
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<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()
}.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<ReferenceInstruction>(index).reference != reference) continue
private fun injectSpeedEduVisibilityCall(descriptor: String) {
speedEDUVisibleMutableMethod.addInstruction(
speedEDUVisibleIndex,
"invoke-static {v$speedEDUVisibleRegister}, $descriptor->changeVisibilityNegatedImmediate(Z)V"
val register = getInstruction<TwoRegisterInstruction>(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) {

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.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
*/