From cb78f8e6d025759773a01ffd4e4fba04ffd105b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20W=C3=BCstenhagen?= <34846003+juztim@users.noreply.github.com> Date: Fri, 23 Sep 2022 02:05:41 +0200 Subject: [PATCH] feat: `hide-premium-nav-bar` patch (#589) --- .../PremiumNavbarTabCompatibility.kt | 9 +++ .../AddPremiumNavbarTabFingerprint.kt | 13 +++++ .../DebugMenuActivityFingerprint.kt | 14 +++++ .../patch/PremiumNavbarTabPatch.kt | 56 +++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/annotations/PremiumNavbarTabCompatibility.kt create mode 100644 src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/fingerprints/AddPremiumNavbarTabFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/fingerprints/DebugMenuActivityFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/patch/PremiumNavbarTabPatch.kt diff --git a/src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/annotations/PremiumNavbarTabCompatibility.kt b/src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/annotations/PremiumNavbarTabCompatibility.kt new file mode 100644 index 000000000..41f65315b --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/annotations/PremiumNavbarTabCompatibility.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.spotify.premium_navbar_tab.annotations + +import app.revanced.patcher.annotation.Compatibility +import app.revanced.patcher.annotation.Package + +@Compatibility([Package("com.spotify.music")]) +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +internal annotation class PremiumNavbarTabCompatibility diff --git a/src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/fingerprints/AddPremiumNavbarTabFingerprint.kt b/src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/fingerprints/AddPremiumNavbarTabFingerprint.kt new file mode 100644 index 000000000..a0d5bf018 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/fingerprints/AddPremiumNavbarTabFingerprint.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.spotify.premium_navbar_tab.fingerprints + +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.annotation.Version +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import app.revanced.patches.spotify.premium_navbar_tab.annotations.PremiumNavbarTabCompatibility + +@Name("premium-navbar-fingerprint") +@Version("0.0.1") +@PremiumNavbarTabCompatibility +object AddPremiumNavbarTabFingerprint : MethodFingerprint( + parameters = listOf("L", "L", "L", "L", "L", "L") +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/fingerprints/DebugMenuActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/fingerprints/DebugMenuActivityFingerprint.kt new file mode 100644 index 000000000..8953ed687 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/fingerprints/DebugMenuActivityFingerprint.kt @@ -0,0 +1,14 @@ +package app.revanced.patches.spotify.premium_navbar_tab.fingerprints + +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.annotation.Version +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import app.revanced.patches.spotify.premium_navbar_tab.annotations.PremiumNavbarTabCompatibility + +@Name("debug-menu-activity-fingerprint") +@Version("0.0.1") +@PremiumNavbarTabCompatibility +object DebugMenuActivityFingerprint : MethodFingerprint( + strings = listOf("com.spotify.app.music.debugtools.menu.DebugMenuActivity"), + parameters = listOf("L", "L"), +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/patch/PremiumNavbarTabPatch.kt b/src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/patch/PremiumNavbarTabPatch.kt new file mode 100644 index 000000000..c4984e79c --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/spotify/premium_navbar_tab/patch/PremiumNavbarTabPatch.kt @@ -0,0 +1,56 @@ +package app.revanced.patches.spotify.premium_navbar_tab.patch + +import app.revanced.patcher.annotation.Description +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.annotation.Version +import app.revanced.patcher.data.impl.BytecodeData +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.removeInstruction +import app.revanced.patcher.extensions.replaceInstruction +import app.revanced.patcher.fingerprint.method.utils.MethodFingerprintUtils.resolve +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.patcher.patch.impl.BytecodePatch +import app.revanced.patches.spotify.premium_navbar_tab.annotations.PremiumNavbarTabCompatibility +import app.revanced.patches.spotify.premium_navbar_tab.fingerprints.AddPremiumNavbarTabFingerprint +import app.revanced.patches.spotify.premium_navbar_tab.fingerprints.DebugMenuActivityFingerprint +import app.revanced.patches.youtube.misc.mapping.patch.ResourceIdMappingProviderResourcePatch +import org.jf.dexlib2.Opcode +import org.jf.dexlib2.iface.instruction.OneRegisterInstruction + +@Patch +@Name("hide-premium-nav-bar") +@Description("Removes the premium tab from the navbar.") +@PremiumNavbarTabCompatibility +@Version("0.0.1") +@DependsOn([ResourceIdMappingProviderResourcePatch::class]) +class PremiumNavbarTabPatch : BytecodePatch( + listOf( + DebugMenuActivityFingerprint + ) +) { + override fun execute(data: BytecodeData): PatchResult { + val parentResult = DebugMenuActivityFingerprint.result!! + AddPremiumNavbarTabFingerprint.resolve(data, parentResult.classDef) + + val result = AddPremiumNavbarTabFingerprint.result!! + val method = result.mutableMethod + + val premiumTabId = ResourceIdMappingProviderResourcePatch.resourceMappings.single{it.type == "id" && it.name == "premium_tab"}.id.toInt() + + val methodInstructions = method.implementation!!.instructions + + for ((i, instruction) in methodInstructions.asReversed().withIndex()) { + if (instruction.opcode.ordinal != Opcode.CONST.ordinal) continue + if ((instruction as OneRegisterInstruction).registerA != premiumTabId) continue + val constIdx = methodInstructions.size - i + val methodIdx = constIdx + 8 + method.removeInstruction(methodIdx) + break + } + + return PatchResultSuccess() + } +} \ No newline at end of file