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 00000000..41f65315 --- /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 00000000..a0d5bf01 --- /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 00000000..8953ed68 --- /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 00000000..c4984e79 --- /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