From 7164f729f4b64a050f8371ad17f457d2b30c1650 Mon Sep 17 00:00:00 2001 From: inotia00 Date: Tue, 5 Sep 2023 12:52:08 +0900 Subject: [PATCH] fix(youtube/overlay-button): overlay button not hidden when scrubbing seekbar --- .../QuickSeekVisibleFingerprint.kt | 16 +++++++++ .../patch/PlayerControlsPatch.kt | 33 +++++++++++++++---- 2 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/QuickSeekVisibleFingerprint.kt 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 new file mode 100644 index 000000000..75549afb0 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/QuickSeekVisibleFingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.youtube.utils.playercontrols.fingerprints + +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction + +object QuickSeekVisibleFingerprint : MethodFingerprint( + returnType = "V", + parameters = listOf("Z"), + opcodes = listOf(Opcode.OR_INT_LIT16), + customFingerprint = { methodDef, _ -> + methodDef.implementation!!.instructions.any { + ((it as? NarrowLiteralInstruction)?.narrowLiteral == 128) + } + } +) \ 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 128722965..bf0bfda06 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 @@ -17,6 +17,7 @@ import app.revanced.patches.youtube.utils.playercontrols.fingerprints.Fullscreen 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.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.patch.SharedResourceIdPatch @@ -42,19 +43,34 @@ class PlayerControlsPatch : BytecodePatch( fun MutableMethod.findReference(targetString: String): Reference { val targetIndex = getStringIndex(targetString) + 2 - val targetRegister = getInstruction(targetIndex).registerD + val targetOpcode = getInstruction(targetIndex).opcode - val instructions = implementation!!.instructions - for ((index, instruction) in instructions.withIndex()) { - if (instruction.opcode != Opcode.IGET_BOOLEAN) continue + if (targetOpcode == Opcode.INVOKE_VIRTUAL) { + val targetRegister = getInstruction(targetIndex).registerD - if (getInstruction(index).registerA == targetRegister) - return getInstruction(index).reference + val instructions = implementation!!.instructions + for ((index, instruction) in instructions.withIndex()) { + if (instruction.opcode != Opcode.IGET_BOOLEAN) continue + + if (getInstruction(index).registerA == targetRegister) + return getInstruction(index).reference + } + } else if (targetOpcode == Opcode.IGET_BOOLEAN) { + return getInstruction(targetIndex).reference } + throw PatchException("Reference not found: $targetString") } PlayerControlsVisibilityModelFingerprint.result?.classDef?.let { classDef -> + quickSeekVisibleMutableMethod = + QuickSeekVisibleFingerprint.also { + it.resolve( + context, + classDef + ) + }.result?.mutableMethod ?: throw QuickSeekVisibleFingerprint.exception + seekEDUVisibleMutableMethod = SeekEDUVisibleFingerprint.also { it.resolve( @@ -115,6 +131,7 @@ class PlayerControlsPatch : BytecodePatch( lateinit var inflateResult: MethodFingerprintResult lateinit var playerControlsVisibilityMutableMethod: MutableMethod + lateinit var quickSeekVisibleMutableMethod: MutableMethod lateinit var seekEDUVisibleMutableMethod: MutableMethod lateinit var userScrubbingMutableMethod: MutableMethod @@ -171,6 +188,10 @@ class PlayerControlsPatch : BytecodePatch( descriptor, "changeVisibility" ) + quickSeekVisibleMutableMethod.injectVisibilityCall( + descriptor, + "changeVisibilityNegatedImmediate" + ) seekEDUVisibleMutableMethod.injectVisibilityCall( descriptor, "changeVisibilityNegatedImmediate"