diff --git a/CHANGELOG.md b/CHANGELOG.md index d9c388b3..e59371ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +## [2.201.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v2.201.1-dev.1...v2.201.1-dev.2) (2023-11-23) + + +### Bug Fixes + +* **Spotify - Hide premium navbar:** Support latest version ([b87005d](https://github.com/ReVanced/revanced-patches/commit/b87005de0c40293f85d3997f43b353a87a925156)) + +## [2.201.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v2.201.0...v2.201.1-dev.1) (2023-11-23) + + +### Bug Fixes + +* **YouTube - Hide layout components:** Clarify custom filter usage ([cc16db5](https://github.com/ReVanced/revanced-patches/commit/cc16db56d1c9925852265fcebb459d9620cd1b92)) + # [2.201.0](https://github.com/ReVanced/revanced-patches/compare/v2.200.0...v2.201.0) (2023-11-23) diff --git a/gradle.properties b/gradle.properties index 954aa8b2..e4b541af 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 2.201.0 +version = 2.201.1-dev.2 diff --git a/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt b/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt index f17c0dbe..4f88d893 100644 --- a/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt +++ b/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt @@ -1,51 +1,32 @@ package app.revanced.patches.spotify.navbar +import app.revanced.extensions.exception 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.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch -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 +import app.revanced.patches.spotify.navbar.fingerprints.AddNavBarItemFingerprint @Patch( name = "Hide premium navbar", description = "Removes the premium tab from the navbar.", - dependencies = [ResourceMappingPatch::class], + dependencies = [PremiumNavbarTabResourcePatch::class], compatiblePackages = [CompatiblePackage("com.spotify.music")] ) @Suppress("unused") -object PremiumNavbarTabPatch : BytecodePatch(setOf(AddPremiumNavbarTabParentFingerprint)) { - override fun execute(context: BytecodeContext) { - val parentResult = AddPremiumNavbarTabParentFingerprint.result!! - AddPremiumNavbarTabFingerprint.resolve(context, parentResult.classDef) - - val result = AddPremiumNavbarTabFingerprint.result!! - - val method = result.mutableMethod - val methodInstructions = method.implementation!!.instructions - val lastInstructionIdx = methodInstructions.size - 1 - - val premiumTabId = - ResourceMappingPatch.resourceMappings.single { it.type == "id" && it.name == "premium_tab" }.id - - 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 - } - } -} \ No newline at end of file +object PremiumNavbarTabPatch : BytecodePatch( + setOf(AddNavBarItemFingerprint) +) { + // If the navigation bar item is the premium tab, do not add it. + override fun execute(context: BytecodeContext) = AddNavBarItemFingerprint.result?.mutableMethod?.addInstructions( + 0, + """ + const v1, ${PremiumNavbarTabResourcePatch.premiumTabId} + if-ne p5, v1, :continue + return-void + :continue + nop + """ + ) ?: throw AddNavBarItemFingerprint.exception +} diff --git a/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabResourcePatch.kt b/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabResourcePatch.kt new file mode 100644 index 00000000..d1093325 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabResourcePatch.kt @@ -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 + } +} diff --git a/src/main/kotlin/app/revanced/patches/spotify/navbar/fingerprints/AddNavBarItemFingerprint.kt b/src/main/kotlin/app/revanced/patches/spotify/navbar/fingerprints/AddNavBarItemFingerprint.kt new file mode 100644 index 00000000..41f2ca76 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/spotify/navbar/fingerprints/AddNavBarItemFingerprint.kt @@ -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 }, +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/spotify/navbar/fingerprints/AddPremiumNavbarTabFingerprint.kt b/src/main/kotlin/app/revanced/patches/spotify/navbar/fingerprints/AddPremiumNavbarTabFingerprint.kt deleted file mode 100644 index ba403848..00000000 --- a/src/main/kotlin/app/revanced/patches/spotify/navbar/fingerprints/AddPremiumNavbarTabFingerprint.kt +++ /dev/null @@ -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") -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/spotify/navbar/fingerprints/AddPremiumNavbarTabParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/spotify/navbar/fingerprints/AddPremiumNavbarTabParentFingerprint.kt deleted file mode 100644 index 7589e2b2..00000000 --- a/src/main/kotlin/app/revanced/patches/spotify/navbar/fingerprints/AddPremiumNavbarTabParentFingerprint.kt +++ /dev/null @@ -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") -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index 5e449daf..aaa02265 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -406,7 +406,7 @@ object HideLayoutComponentsPatch : BytecodePatch( StringResource("revanced_custom_filter_strings_title", "Custom filter"), StringResource( "revanced_custom_filter_strings_summary", - "List of components to filter separated by new line" + "List of component path builder strings to filter separated by new line" ), inputType = InputType.TEXT_MULTI_LINE )