From 48cd0e54749b00a60d8f9fddbff71cc72d08d740 Mon Sep 17 00:00:00 2001 From: inotia00 Date: Tue, 20 Jun 2023 17:32:50 +0900 Subject: [PATCH] feat(music): add `enable-new-layout` patch --- .../fingerprints/NewLayoutFingerprint.kt | 10 ++++ .../layout/newlayout/patch/NewLayoutPatch.kt | 51 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/main/kotlin/app/revanced/patches/music/layout/newlayout/fingerprints/NewLayoutFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/music/layout/newlayout/patch/NewLayoutPatch.kt diff --git a/src/main/kotlin/app/revanced/patches/music/layout/newlayout/fingerprints/NewLayoutFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/layout/newlayout/fingerprints/NewLayoutFingerprint.kt new file mode 100644 index 000000000..410079289 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/layout/newlayout/fingerprints/NewLayoutFingerprint.kt @@ -0,0 +1,10 @@ +package app.revanced.patches.music.layout.newlayout.fingerprints + +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import app.revanced.util.bytecode.isWide32LiteralExists + +object NewLayoutFingerprint : MethodFingerprint( + returnType = "Z", + parameters = listOf(), + customFingerprint = { it, _ -> it.isWide32LiteralExists(45399578) } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/layout/newlayout/patch/NewLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/newlayout/patch/NewLayoutPatch.kt new file mode 100644 index 000000000..ee5b7cd55 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/layout/newlayout/patch/NewLayoutPatch.kt @@ -0,0 +1,51 @@ +package app.revanced.patches.music.layout.newlayout.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.newlayout.fingerprints.NewLayoutFingerprint +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-new-layout") +@Description("Enable new player layouts. (YT Music v5.47.51+)") +@DependsOn([MusicSettingsPatch::class]) +@YouTubeMusicCompatibility +@Version("0.0.1") +class NewLayoutPatch : BytecodePatch( + listOf(NewLayoutFingerprint) +) { + override fun execute(context: BytecodeContext): PatchResult { + + NewLayoutFingerprint.result?.let { + it.mutableMethod.apply { + val insertIndex = implementation!!.instructions.size - 1 + val targetRegister = getInstruction(insertIndex).registerA + + addInstructions( + insertIndex, """ + invoke-static {v$targetRegister}, $MUSIC_LAYOUT->enableNewLayout(Z)Z + move-result v$targetRegister + """ + ) + } + } ?: return NewLayoutFingerprint.toErrorResult() + + MusicSettingsPatch.addMusicPreference(CategoryType.LAYOUT, "revanced_enable_new_layout", "false") + + return PatchResultSuccess() + } +} \ No newline at end of file