From 1e4cf284c39d26dbeb52bce7c1f864e96f68c126 Mon Sep 17 00:00:00 2001 From: inotia00 Date: Sun, 9 Apr 2023 00:36:14 +0900 Subject: [PATCH] refactor: improve weak fingerprints --- .../SupportsNextPreviousFingerprint.kt | 16 ++++++++++++++ .../patch/HidePreviousNextButtonPatch.kt | 22 ++++++++----------- .../fingerprints/ProgressColorFingerprint.kt | 10 +++++++++ .../seekbarcolor/patch/SeekbarColorPatch.kt | 21 ++++++++---------- .../fingerprints/SeekEDUVisibleFingerprint.kt | 16 ++++++++++++++ .../fingerprints/UserScrubbingFingerprint.kt | 16 ++++++++++++++ .../patch/PlayerControlsPatch.kt | 12 ++++------ 7 files changed, 80 insertions(+), 33 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/player/previousnextbutton/fingerprints/SupportsNextPreviousFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/seekbarcolor/fingerprints/ProgressColorFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/fingerprints/SeekEDUVisibleFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/fingerprints/UserScrubbingFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/player/previousnextbutton/fingerprints/SupportsNextPreviousFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/player/previousnextbutton/fingerprints/SupportsNextPreviousFingerprint.kt new file mode 100644 index 000000000..044220533 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/player/previousnextbutton/fingerprints/SupportsNextPreviousFingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.youtube.layout.player.previousnextbutton.fingerprints + +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.Opcode +import org.jf.dexlib2.iface.instruction.NarrowLiteralInstruction + +object SupportsNextPreviousFingerprint : MethodFingerprint( + returnType = "V", + parameters = listOf("Z"), + opcodes = listOf(Opcode.OR_INT_LIT8), + customFingerprint = { methodDef -> + methodDef.implementation!!.instructions.any { + ((it as? NarrowLiteralInstruction)?.narrowLiteral == 64) + } + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/player/previousnextbutton/patch/HidePreviousNextButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/player/previousnextbutton/patch/HidePreviousNextButtonPatch.kt index dd832b289..994adb08a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/player/previousnextbutton/patch/HidePreviousNextButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/player/previousnextbutton/patch/HidePreviousNextButtonPatch.kt @@ -6,7 +6,6 @@ import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Version import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.addInstructions -import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchResult @@ -15,6 +14,7 @@ import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.Patch import app.revanced.patches.shared.annotation.YouTubeCompatibility import app.revanced.patches.shared.fingerprints.ControlsOverlayStyleFingerprint +import app.revanced.patches.youtube.layout.player.previousnextbutton.fingerprints.SupportsNextPreviousFingerprint import app.revanced.patches.youtube.misc.settings.resource.patch.SettingsPatch import app.revanced.util.integrations.Constants.PLAYER @@ -29,18 +29,14 @@ class HidePreviousNextButtonPatch : BytecodePatch( ) { override fun execute(context: BytecodeContext): PatchResult { - val controlsOverlayStyleClassDef = ControlsOverlayStyleFingerprint.result?.classDef?: return ControlsOverlayStyleFingerprint.toErrorResult() - - val previousNextButtonVisibleFingerprint = - object : MethodFingerprint(returnType = "V", parameters = listOf("Z"), customFingerprint = { it.name == "j" }) {} - previousNextButtonVisibleFingerprint.resolve(context, controlsOverlayStyleClassDef) - previousNextButtonVisibleFingerprint.result?.mutableMethod?.addInstructions( - 0, """ - invoke-static {p1}, $PLAYER->hidePreviousNextButton(Z)Z - move-result p1 - """ - )?: return previousNextButtonVisibleFingerprint.toErrorResult() - + ControlsOverlayStyleFingerprint.result?.let { parentResult -> + SupportsNextPreviousFingerprint.also { it.resolve(context, parentResult.classDef) }.result?.mutableMethod?.addInstructions( + 0, """ + invoke-static {p1}, $PLAYER->hidePreviousNextButton(Z)Z + move-result p1 + """ + ) ?: return SupportsNextPreviousFingerprint.toErrorResult() + } ?: return ControlsOverlayStyleFingerprint.toErrorResult() /* * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/seekbarcolor/fingerprints/ProgressColorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/seekbarcolor/fingerprints/ProgressColorFingerprint.kt new file mode 100644 index 000000000..03a94cd19 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/seekbarcolor/fingerprints/ProgressColorFingerprint.kt @@ -0,0 +1,10 @@ +package app.revanced.patches.youtube.layout.seekbar.seekbarcolor.fingerprints + +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.Opcode + +object ProgressColorFingerprint : MethodFingerprint( + returnType = "V", + parameters = listOf("I"), + opcodes = listOf(Opcode.OR_INT_LIT8) +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/seekbarcolor/patch/SeekbarColorPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/seekbarcolor/patch/SeekbarColorPatch.kt index 5bd621b07..a38f4ad3d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/seekbarcolor/patch/SeekbarColorPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/seekbarcolor/patch/SeekbarColorPatch.kt @@ -6,7 +6,6 @@ import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Version import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.addInstructions -import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchResult @@ -15,6 +14,7 @@ import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.Patch import app.revanced.patches.shared.annotation.YouTubeCompatibility import app.revanced.patches.shared.fingerprints.ControlsOverlayStyleFingerprint +import app.revanced.patches.youtube.layout.seekbar.seekbarcolor.fingerprints.ProgressColorFingerprint import app.revanced.patches.youtube.layout.seekbar.seekbarcolor.fingerprints.SeekbarColorFingerprint import app.revanced.patches.youtube.misc.resourceid.patch.SharedResourceIdPatch import app.revanced.patches.youtube.misc.settings.resource.patch.SettingsPatch @@ -57,17 +57,14 @@ class SeekbarColorPatch : BytecodePatch( } } ?: return SeekbarColorFingerprint.toErrorResult() - val controlsOverlayStyleClassDef = ControlsOverlayStyleFingerprint.result?.classDef?: return ControlsOverlayStyleFingerprint.toErrorResult() - - val progressColorFingerprint = - object : MethodFingerprint(returnType = "V", parameters = listOf("I"), customFingerprint = { it.name == "e" }) {} - progressColorFingerprint.resolve(context, controlsOverlayStyleClassDef) - progressColorFingerprint.result?.mutableMethod?.addInstructions( - 0, """ - invoke-static {p1}, $SEEKBAR->enableCustomSeekbarColor(I)I - move-result p1 - """ - )?: return progressColorFingerprint.toErrorResult() + ControlsOverlayStyleFingerprint.result?.let { parentResult -> + ProgressColorFingerprint.also { it.resolve(context, parentResult.classDef) }.result?.mutableMethod?.addInstructions( + 0, """ + invoke-static {p1}, $SEEKBAR->enableCustomSeekbarColor(I)I + move-result p1 + """ + ) ?: return ProgressColorFingerprint.toErrorResult() + } ?: return ControlsOverlayStyleFingerprint.toErrorResult() /* * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/fingerprints/SeekEDUVisibleFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/fingerprints/SeekEDUVisibleFingerprint.kt new file mode 100644 index 000000000..98c865270 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/fingerprints/SeekEDUVisibleFingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.youtube.misc.playercontrols.fingerprints + +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.Opcode +import org.jf.dexlib2.iface.instruction.NarrowLiteralInstruction + +object SeekEDUVisibleFingerprint : MethodFingerprint( + returnType = "V", + parameters = listOf("Z"), + opcodes = listOf(Opcode.OR_INT_LIT8), + customFingerprint = { methodDef -> + methodDef.implementation!!.instructions.any { + ((it as? NarrowLiteralInstruction)?.narrowLiteral == 32) + } + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/fingerprints/UserScrubbingFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/fingerprints/UserScrubbingFingerprint.kt new file mode 100644 index 000000000..0bd52a32c --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/fingerprints/UserScrubbingFingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.youtube.misc.playercontrols.fingerprints + +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.Opcode +import org.jf.dexlib2.iface.instruction.NarrowLiteralInstruction + +object UserScrubbingFingerprint : MethodFingerprint( + returnType = "V", + parameters = listOf("Z"), + opcodes = listOf(Opcode.OR_INT_LIT8), + customFingerprint = { methodDef -> + methodDef.implementation!!.instructions.any { + ((it as? NarrowLiteralInstruction)?.narrowLiteral == 64) + } + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/patch/PlayerControlsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/patch/PlayerControlsPatch.kt index 50062248f..c440f29cb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/patch/PlayerControlsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/patch/PlayerControlsPatch.kt @@ -36,15 +36,11 @@ class PlayerControlsPatch : BytecodePatch( val playerControlsVisibilityModelClassDef = PlayerControlsVisibilityModelFingerprint.result?.classDef?: return PlayerControlsVisibilityModelFingerprint.toErrorResult() - val seekEDUVisibleFingerprint = - object : MethodFingerprint(returnType = "V", parameters = listOf("Z"), customFingerprint = { it.name == "l" }) {} - seekEDUVisibleFingerprint.resolve(context, playerControlsVisibilityModelClassDef) - seekEDUVisibleResult = seekEDUVisibleFingerprint.result?: return seekEDUVisibleFingerprint.toErrorResult() + SeekEDUVisibleFingerprint.resolve(context, playerControlsVisibilityModelClassDef) + seekEDUVisibleResult = SeekEDUVisibleFingerprint.result?: return SeekEDUVisibleFingerprint.toErrorResult() - val userScrubbingFingerprint = - object : MethodFingerprint(returnType = "V", parameters = listOf("Z"), customFingerprint = { it.name == "o" }) {} - userScrubbingFingerprint.resolve(context, playerControlsVisibilityModelClassDef) - userScrubbingResult = userScrubbingFingerprint.result?: return userScrubbingFingerprint.toErrorResult() + UserScrubbingFingerprint.resolve(context, playerControlsVisibilityModelClassDef) + userScrubbingResult = UserScrubbingFingerprint.result?: return UserScrubbingFingerprint.toErrorResult() playerControlsVisibilityResult = PlayerControlsVisibilityFingerprint.result?: return PlayerControlsVisibilityFingerprint.toErrorResult() controlsLayoutInflateResult = ControlsLayoutInflateFingerprint.result?: return ControlsLayoutInflateFingerprint.toErrorResult()