mirror of
https://github.com/inotia00/revanced-patches.git
synced 2025-05-02 23:54:33 +02:00
fix(youtube/sponsorblock): vote button and new segment button still showing when end screen overlay appears
This commit is contained in:
parent
2bc99c0e99
commit
8e664f5eda
@ -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)
|
||||||
|
)
|
@ -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="
|
||||||
|
)
|
||||||
|
)
|
@ -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>" }
|
|
||||||
)
|
|
@ -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=")
|
|
||||||
)
|
|
@ -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()
|
val targetRegister = getInstruction<Instruction35c>(targetIndex).registerD
|
||||||
|
|
||||||
SeekEDUVisibleFingerprint.resolve(context, playerControlsVisibilityModelClassDef)
|
val instructions = implementation!!.instructions
|
||||||
seekEDUVisibleResult =
|
for ((index, instruction) in instructions.withIndex()) {
|
||||||
SeekEDUVisibleFingerprint.result ?: return SeekEDUVisibleFingerprint.toErrorResult()
|
if (instruction.opcode != Opcode.IGET_BOOLEAN) continue
|
||||||
|
|
||||||
UserScrubbingFingerprint.resolve(context, playerControlsVisibilityModelClassDef)
|
if (getInstruction<TwoRegisterInstruction>(index).registerA == targetRegister)
|
||||||
userScrubbingResult =
|
return getInstruction<ReferenceInstruction>(index).reference
|
||||||
UserScrubbingFingerprint.result ?: return UserScrubbingFingerprint.toErrorResult()
|
}
|
||||||
|
throw PatchResultError("Reference not found: $targetString")
|
||||||
|
}
|
||||||
|
|
||||||
val controlsOverlayClassDef =
|
PlayerControlsVisibilityModelFingerprint.result?.classDef?.let { classDef ->
|
||||||
YouTubeControlsOverlayFingerprint.result?.classDef
|
seekEDUVisibleMutableMethod =
|
||||||
?: return YouTubeControlsOverlayFingerprint.toErrorResult()
|
SeekEDUVisibleFingerprint.also {
|
||||||
|
it.resolve(
|
||||||
|
context,
|
||||||
|
classDef
|
||||||
|
)
|
||||||
|
}.result?.mutableMethod ?: return SeekEDUVisibleFingerprint.toErrorResult()
|
||||||
|
|
||||||
PlayerControlsVisibilityFingerprint.resolve(context, controlsOverlayClassDef)
|
userScrubbingMutableMethod =
|
||||||
playerControlsVisibilityResult = PlayerControlsVisibilityFingerprint.result
|
UserScrubbingFingerprint.also {
|
||||||
?: return PlayerControlsVisibilityFingerprint.toErrorResult()
|
it.resolve(
|
||||||
|
context,
|
||||||
|
classDef
|
||||||
|
)
|
||||||
|
}.result?.mutableMethod ?: return UserScrubbingFingerprint.toErrorResult()
|
||||||
|
} ?: return PlayerControlsVisibilityModelFingerprint.toErrorResult()
|
||||||
|
|
||||||
controlsLayoutInflateResult = ControlsLayoutInflateFingerprint.result
|
YouTubeControlsOverlayFingerprint.result?.classDef?.let { classDef ->
|
||||||
?: return ControlsLayoutInflateFingerprint.toErrorResult()
|
playerControlsVisibilityMutableMethod =
|
||||||
inflateResult = BottomControlsInflateFingerprint.result
|
PlayerControlsVisibilityFingerprint.also {
|
||||||
?: return BottomControlsInflateFingerprint.toErrorResult()
|
it.resolve(
|
||||||
|
context,
|
||||||
|
classDef
|
||||||
|
)
|
||||||
|
}.result?.mutableMethod ?: return PlayerControlsVisibilityFingerprint.toErrorResult()
|
||||||
|
} ?: return YouTubeControlsOverlayFingerprint.toErrorResult()
|
||||||
|
|
||||||
SpeedEduVisibleParentFingerprint.result?.let { parentResult ->
|
controlsLayoutInflateResult =
|
||||||
var speedIndex = 0
|
ControlsLayoutInflateFingerprint.result
|
||||||
|
?: return ControlsLayoutInflateFingerprint.toErrorResult()
|
||||||
|
|
||||||
|
inflateResult =
|
||||||
|
BottomControlsInflateFingerprint.result
|
||||||
|
?: return BottomControlsInflateFingerprint.toErrorResult()
|
||||||
|
|
||||||
|
FullscreenEngagementSpeedEduVisibleParentFingerprint.result?.let { parentResult ->
|
||||||
parentResult.mutableMethod.apply {
|
parentResult.mutableMethod.apply {
|
||||||
val targetIndex = getStringIndex(", isSpeedmasterEDUVisible=") + 2
|
fullscreenEngagementViewVisibleReference = findReference(", isFullscreenEngagementViewVisible=")
|
||||||
val targetRegister = getInstruction<Instruction35c>(targetIndex).registerD
|
speedEDUVisibleReference = findReference(", isSpeedmasterEDUVisible=")
|
||||||
|
|
||||||
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 (speedIndex == 0) return PatchResultError("SpeedEduVisibleParent Instruction not found!")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SpeedEduVisibleFingerprint.also {
|
fullscreenEngagementSpeedEduVisibleMutableMethod =
|
||||||
it.resolve(
|
FullscreenEngagementSpeedEduVisibleFingerprint.also {
|
||||||
context,
|
it.resolve(
|
||||||
parentResult.classDef
|
context,
|
||||||
)
|
parentResult.classDef
|
||||||
}.result?.mutableMethod?.let {
|
)
|
||||||
it.implementation!!.instructions.apply {
|
}.result?.mutableMethod?: return FullscreenEngagementSpeedEduVisibleFingerprint.toErrorResult()
|
||||||
for ((index, instruction) in withIndex()) {
|
} ?: return FullscreenEngagementSpeedEduVisibleParentFingerprint.toErrorResult()
|
||||||
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) {
|
||||||
|
@ -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")
|
|
||||||
)
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user