feat: hide-premium-nav-bar patch (#589)

This commit is contained in:
Tim Wüstenhagen 2022-09-23 02:05:41 +02:00 committed by GitHub
parent e7cb532ec9
commit 18114168d7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 92 additions and 0 deletions

View file

@ -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

View file

@ -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")
)

View file

@ -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"),
)

View file

@ -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()
}
}