From 188491a707abccc1164413f075d8a66c145a1455 Mon Sep 17 00:00:00 2001 From: bogadana <30848157+bogadana@users.noreply.github.com> Date: Thu, 30 Jun 2022 00:48:53 +0200 Subject: [PATCH] feat: make resource mapping patch aware of types (#77) --- .../bytecode/patch/GeneralBytecodeAdsPatch.kt | 4 ++-- .../createbutton/patch/CreateButtonRemoverPatch.kt | 8 ++++---- .../patch/ResourceIdMappingProviderResourcePatch.kt | 12 ++++++++---- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/general/bytecode/patch/GeneralBytecodeAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/general/bytecode/patch/GeneralBytecodeAdsPatch.kt index 3362e1a69..c09823be5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/general/bytecode/patch/GeneralBytecodeAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/general/bytecode/patch/GeneralBytecodeAdsPatch.kt @@ -62,8 +62,8 @@ class GeneralBytecodeAdsPatch : BytecodePatch( "endscreen_element_layout_icon", "promoted_video_item_land", "promoted_video_item_full_bleed", - ).map { - ResourceIdMappingProviderResourcePatch.resourceMappings[it]!! + ).map { name -> + ResourceIdMappingProviderResourcePatch.resourceMappings.first { it.name == name }.id } private val stringReferences = arrayOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/createbutton/patch/CreateButtonRemoverPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/createbutton/patch/CreateButtonRemoverPatch.kt index bd3e3ebc7..4d93d06e2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/createbutton/patch/CreateButtonRemoverPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/createbutton/patch/CreateButtonRemoverPatch.kt @@ -38,11 +38,11 @@ class CreateButtonRemoverPatch : BytecodePatch( // Get the required register which holds the view object we need to pass to the method hideCreateButton val implementation = result.mutableMethod.implementation!! - val imageOnlyLayout = ResourceIdMappingProviderResourcePatch.resourceMappings["image_only_tab"] - ?: return PatchResultError("Required resource could not be found in the map") + val imageOnlyLayout = + ResourceIdMappingProviderResourcePatch.resourceMappings.first { it.type == "layout" && it.name == "image_only_tab" } val imageOnlyLayoutConstIndex = - implementation.instructions.indexOfFirst { (it as? WideLiteralInstruction)?.wideLiteral == imageOnlyLayout } + implementation.instructions.indexOfFirst { (it as? WideLiteralInstruction)?.wideLiteral == imageOnlyLayout.id } val (instructionIndex, instruction) = implementation.instructions.drop(imageOnlyLayoutConstIndex).withIndex() .first { @@ -63,4 +63,4 @@ class CreateButtonRemoverPatch : BytecodePatch( return PatchResultSuccess() } -} \ No newline at end of file +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/mapping/patch/ResourceIdMappingProviderResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/mapping/patch/ResourceIdMappingProviderResourcePatch.kt index 2d247485b..4b0479919 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/mapping/patch/ResourceIdMappingProviderResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/mapping/patch/ResourceIdMappingProviderResourcePatch.kt @@ -15,22 +15,26 @@ import org.w3c.dom.Element @Version("0.0.1") class ResourceIdMappingProviderResourcePatch : ResourcePatch() { companion object { - internal lateinit var resourceMappings: Map + internal lateinit var resourceMappings: List private set } override fun execute(data: ResourceData): PatchResult { data.xmlEditor["res/values/public.xml"].use { editor -> - resourceMappings = buildMap { + resourceMappings = buildList { editor.file.documentElement.doRecursively { node -> if (node !is Element) return@doRecursively val nameAttribute = node.getAttribute("name") + val typeAttribute = node.getAttribute("type") if (node.nodeName != "public" || nameAttribute.startsWith("APKTOOL")) return@doRecursively - this[nameAttribute] = node.getAttribute("id").substring(2).toLong(16) + val id = node.getAttribute("id").substring(2).toLong(16) + add(ResourceElement(typeAttribute, nameAttribute, id)) } } } return PatchResultSuccess() } -} \ No newline at end of file +} + +data class ResourceElement(val type: String, val name: String, val id: Long)