fix(Spotify - Hide premium navbar): Support latest version
This commit is contained in:
parent
96382cf498
commit
b87005de0c
|
@ -1,51 +1,32 @@
|
||||||
package app.revanced.patches.spotify.navbar
|
package app.revanced.patches.spotify.navbar
|
||||||
|
|
||||||
|
import app.revanced.extensions.exception
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch
|
import app.revanced.patches.spotify.navbar.fingerprints.AddNavBarItemFingerprint
|
||||||
import app.revanced.patches.spotify.navbar.fingerprints.AddPremiumNavbarTabFingerprint
|
|
||||||
import app.revanced.patches.spotify.navbar.fingerprints.AddPremiumNavbarTabParentFingerprint
|
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction
|
|
||||||
|
|
||||||
@Patch(
|
@Patch(
|
||||||
name = "Hide premium navbar",
|
name = "Hide premium navbar",
|
||||||
description = "Removes the premium tab from the navbar.",
|
description = "Removes the premium tab from the navbar.",
|
||||||
dependencies = [ResourceMappingPatch::class],
|
dependencies = [PremiumNavbarTabResourcePatch::class],
|
||||||
compatiblePackages = [CompatiblePackage("com.spotify.music")]
|
compatiblePackages = [CompatiblePackage("com.spotify.music")]
|
||||||
)
|
)
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object PremiumNavbarTabPatch : BytecodePatch(setOf(AddPremiumNavbarTabParentFingerprint)) {
|
object PremiumNavbarTabPatch : BytecodePatch(
|
||||||
override fun execute(context: BytecodeContext) {
|
setOf(AddNavBarItemFingerprint)
|
||||||
val parentResult = AddPremiumNavbarTabParentFingerprint.result!!
|
) {
|
||||||
AddPremiumNavbarTabFingerprint.resolve(context, parentResult.classDef)
|
// If the navigation bar item is the premium tab, do not add it.
|
||||||
|
override fun execute(context: BytecodeContext) = AddNavBarItemFingerprint.result?.mutableMethod?.addInstructions(
|
||||||
val result = AddPremiumNavbarTabFingerprint.result!!
|
0,
|
||||||
|
"""
|
||||||
val method = result.mutableMethod
|
const v1, ${PremiumNavbarTabResourcePatch.premiumTabId}
|
||||||
val methodInstructions = method.implementation!!.instructions
|
if-ne p5, v1, :continue
|
||||||
val lastInstructionIdx = methodInstructions.size - 1
|
return-void
|
||||||
|
:continue
|
||||||
val premiumTabId =
|
nop
|
||||||
ResourceMappingPatch.resourceMappings.single { it.type == "id" && it.name == "premium_tab" }.id
|
"""
|
||||||
|
) ?: throw AddNavBarItemFingerprint.exception
|
||||||
var removeAmount = 2
|
|
||||||
// 2nd const remove method
|
|
||||||
for ((i, instruction) in methodInstructions.asReversed().withIndex()) {
|
|
||||||
if (instruction.opcode.ordinal != Opcode.CONST.ordinal) continue
|
|
||||||
if ((instruction as WideLiteralInstruction).wideLiteral != premiumTabId) continue
|
|
||||||
|
|
||||||
val findThreshold = 10
|
|
||||||
val constIndex = lastInstructionIdx - i
|
|
||||||
val invokeInstruction = methodInstructions.subList(constIndex, constIndex + findThreshold).first {
|
|
||||||
it.opcode.ordinal == Opcode.INVOKE_VIRTUAL_RANGE.ordinal
|
|
||||||
}
|
|
||||||
method.removeInstruction(methodInstructions.indexOf(invokeInstruction))
|
|
||||||
|
|
||||||
if (--removeAmount == 0) break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package app.revanced.patches.spotify.navbar
|
||||||
|
|
||||||
|
import app.revanced.patcher.data.ResourceContext
|
||||||
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
|
import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch
|
||||||
|
|
||||||
|
@Patch(dependencies = [ResourceMappingPatch::class])
|
||||||
|
object PremiumNavbarTabResourcePatch : ResourcePatch() {
|
||||||
|
internal var showBottomNavigationItemsTextId = -1L
|
||||||
|
internal var premiumTabId = -1L
|
||||||
|
|
||||||
|
override fun execute(context: ResourceContext) {
|
||||||
|
premiumTabId = ResourceMappingPatch.resourceMappings.single {
|
||||||
|
it.type == "id" && it.name == "premium_tab"
|
||||||
|
}.id
|
||||||
|
|
||||||
|
showBottomNavigationItemsTextId = ResourceMappingPatch.resourceMappings.single {
|
||||||
|
it.type == "bool" && it.name == "show_bottom_navigation_items_text"
|
||||||
|
}.id
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package app.revanced.patches.spotify.navbar.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patches.spotify.navbar.PremiumNavbarTabResourcePatch
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
|
|
||||||
|
object AddNavBarItemFingerprint : LiteralValueFingerprint(
|
||||||
|
returnType = "V",
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
literalSupplier = { PremiumNavbarTabResourcePatch.showBottomNavigationItemsTextId },
|
||||||
|
)
|
|
@ -1,7 +0,0 @@
|
||||||
package app.revanced.patches.spotify.navbar.fingerprints
|
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
|
||||||
|
|
||||||
object AddPremiumNavbarTabFingerprint : MethodFingerprint(
|
|
||||||
parameters = listOf("L", "L", "L", "L", "L", "L")
|
|
||||||
)
|
|
|
@ -1,7 +0,0 @@
|
||||||
package app.revanced.patches.spotify.navbar.fingerprints
|
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
|
||||||
|
|
||||||
object AddPremiumNavbarTabParentFingerprint : MethodFingerprint(
|
|
||||||
strings = listOf("com.samsung.android.samsungaccount.action.REQUEST_AUTHCODE")
|
|
||||||
)
|
|
Loading…
Reference in a new issue