Skip to content

Commit

Permalink
feat: make resource mapping patch aware of types (#77)
Browse files Browse the repository at this point in the history
  • Loading branch information
bogadana committed Jun 29, 2022
1 parent 7519895 commit 188491a
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -63,4 +63,4 @@ class CreateButtonRemoverPatch : BytecodePatch(

return PatchResultSuccess()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,26 @@ import org.w3c.dom.Element
@Version("0.0.1")
class ResourceIdMappingProviderResourcePatch : ResourcePatch() {
companion object {
internal lateinit var resourceMappings: Map<String, Long>
internal lateinit var resourceMappings: List<ResourceElement>
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()
}
}
}

data class ResourceElement(val type: String, val name: String, val id: Long)

0 comments on commit 188491a

Please sign in to comment.