From d6531a09c9cdccc5274fb1e875f3ab33a091f59c Mon Sep 17 00:00:00 2001 From: inotia00 Date: Tue, 20 Jun 2023 17:31:48 +0900 Subject: [PATCH] feat(music): add `enable-dismiss-queue` patch --- .../fingerprints/DismissQueueFingerprint.kt | 15 ++++++ .../dismissqueue/patch/DismissQueuePatch.kt | 51 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/main/kotlin/app/revanced/patches/music/layout/dismissqueue/fingerprints/DismissQueueFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/music/layout/dismissqueue/patch/DismissQueuePatch.kt diff --git a/src/main/kotlin/app/revanced/patches/music/layout/dismissqueue/fingerprints/DismissQueueFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/layout/dismissqueue/fingerprints/DismissQueueFingerprint.kt new file mode 100644 index 000000000..1fbacdee7 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/layout/dismissqueue/fingerprints/DismissQueueFingerprint.kt @@ -0,0 +1,15 @@ +package app.revanced.patches.music.layout.dismissqueue.fingerprints + +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import app.revanced.util.bytecode.isWide32LiteralExists +import org.jf.dexlib2.Opcode + +object DismissQueueFingerprint : MethodFingerprint( + returnType = "V", + opcodes = listOf( + Opcode.CONST_WIDE_32, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT + ), + customFingerprint = { it, _ -> it.isWide32LiteralExists(45413042) } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/layout/dismissqueue/patch/DismissQueuePatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/dismissqueue/patch/DismissQueuePatch.kt new file mode 100644 index 000000000..1d7366b5c --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/layout/dismissqueue/patch/DismissQueuePatch.kt @@ -0,0 +1,51 @@ +package app.revanced.patches.music.layout.dismissqueue.patch + +import app.revanced.extensions.toErrorResult +import app.revanced.patcher.annotation.Description +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.annotation.Version +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchResult +import app.revanced.patcher.patch.PatchResultSuccess +import app.revanced.patcher.patch.annotations.DependsOn +import app.revanced.patcher.patch.annotations.Patch +import app.revanced.patches.music.layout.dismissqueue.fingerprints.DismissQueueFingerprint +import app.revanced.patches.music.utils.settings.resource.patch.MusicSettingsPatch +import app.revanced.patches.shared.annotation.YouTubeMusicCompatibility +import app.revanced.util.enum.CategoryType +import app.revanced.util.integrations.Constants.MUSIC_LAYOUT +import org.jf.dexlib2.iface.instruction.OneRegisterInstruction + +@Patch +@Name("enable-dismiss-queue") +@Description("Add dismiss queue to flyout menu. (YT Music v6.04.51+)") +@DependsOn([MusicSettingsPatch::class]) +@YouTubeMusicCompatibility +@Version("0.0.1") +class DismissQueuePatch : BytecodePatch( + listOf(DismissQueueFingerprint) +) { + override fun execute(context: BytecodeContext): PatchResult { + + DismissQueueFingerprint.result?.let { + it.mutableMethod.apply { + val insertIndex = it.scanResult.patternScanResult!!.endIndex + val targetRegister = getInstruction(insertIndex).registerA + + addInstructions( + insertIndex + 1, """ + invoke-static {v$targetRegister}, $MUSIC_LAYOUT->enableDismissQueue(Z)Z + move-result v$targetRegister + """ + ) + } + } ?: return DismissQueueFingerprint.toErrorResult() + + MusicSettingsPatch.addMusicPreference(CategoryType.LAYOUT, "revanced_enable_dismiss_queue", "true") + + return PatchResultSuccess() + } +} \ No newline at end of file