[XML] handle type '^attr-private'

This commit is contained in:
REAndroid 2023-02-14 06:15:23 -05:00
parent 37df67c027
commit 6a83ddd59d
6 changed files with 34 additions and 5 deletions

View File

@ -241,7 +241,7 @@ import java.util.*;
xmlDocument.save(file, false);
}
private XMLElement decodeValue(EntryStore entryStore, Entry entry){
XMLElement element=new XMLElement(entry.getTypeName());
XMLElement element=new XMLElement(XmlHelper.toXMLTagName(entry.getTypeName()));
int resourceId= entry.getResourceId();
XMLAttribute attribute=new XMLAttribute("name", entry.getName());
element.addAttribute(attribute);

View File

@ -30,4 +30,11 @@ public class XmlHelper {
element.setSpannableText(stringItem.getXml());
}
}
public static String toXMLTagName(String typeName){
// e.g ^attr-private
if(typeName.length()>0 && typeName.charAt(0)=='^'){
typeName = typeName.substring(1);
}
return typeName;
}
}

View File

@ -50,8 +50,16 @@
.get(0);
}
public Entry getAttributeBlock(String refString){
String packageName = null;
String type = "attr";
Entry entry = getAttributeBlock(type, refString);
if(entry == null){
type = "^attr-private";
entry = getAttributeBlock(type, refString);
}
return entry;
}
private Entry getAttributeBlock(String type, String refString){
String packageName = null;
String name = refString;
int i=refString.lastIndexOf(':');
if(i>=0){

View File

@ -128,6 +128,9 @@ package com.reandroid.apk.xmlencoder;
return name;
}
public static String sanitizeType(String type){
if(type.startsWith("^attr")){
return type;
}
Matcher matcher=PATTERN_TYPE.matcher(type);
if(!matcher.find()){
return "";

View File

@ -44,7 +44,9 @@ class ValuesEncoder {
this.commonEncoder=new XMLValuesEncoderCommon(materials);
Map<String, XMLValuesEncoderBag> mapBag=new HashMap<>();
mapBag.put("attr", new XMLValuesEncoderAttr(materials));
XMLValuesEncoderAttr encoderAttr = new XMLValuesEncoderAttr(materials);
mapBag.put("attr", encoderAttr);
mapBag.put("^attr-private", encoderAttr);
mapBag.put("plurals", new XMLValuesEncoderPlurals(materials));
mapBag.put("array", new XMLValuesEncoderArray(materials));
mapBag.put("style", new XMLValuesEncoderStyle(materials));
@ -79,6 +81,9 @@ class ValuesEncoder {
if(type.startsWith("attr")){
return true;
}
if(type.startsWith("^attr")){
return true;
}
if(type.startsWith("style")){
return true;
}
@ -117,6 +122,9 @@ class ValuesEncoder {
if(type.endsWith("-array")){
return "array";
}
if(type.startsWith("attr-private")){
return "^attr-private";
}
if(type.equals("item")){
return def;
}

View File

@ -17,6 +17,7 @@ package com.reandroid.apk.xmlencoder;
import com.reandroid.arsc.array.ResValueMapArray;
import com.reandroid.arsc.decoder.ValueDecoder;
import com.reandroid.arsc.value.EntryHeaderMap;
import com.reandroid.arsc.value.ResTableMapEntry;
import com.reandroid.arsc.value.ResValueMap;
import com.reandroid.arsc.value.ValueType;
@ -42,8 +43,10 @@ class XMLValuesEncoderAttr extends XMLValuesEncoderBag{
void encodeChildes(XMLElement parentElement, ResTableMapEntry mapEntry){
encodeAttributes(parentElement, mapEntry);
encodeEnumOrFlag(parentElement, mapEntry);
// TODO: re-check if this is necessary
mapEntry.getHeader().setPublic(true);
EntryHeaderMap header = mapEntry.getHeader();
boolean is_public = !mapEntry.getParentEntry()
.getTypeName().contains("private");
header.setPublic(is_public);
}
private void encodeAttributes(XMLElement parentElement, ResTableMapEntry mapEntry){
ResValueMapArray mapArray = mapEntry.getValue();