[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); xmlDocument.save(file, false);
} }
private XMLElement decodeValue(EntryStore entryStore, Entry entry){ 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(); int resourceId= entry.getResourceId();
XMLAttribute attribute=new XMLAttribute("name", entry.getName()); XMLAttribute attribute=new XMLAttribute("name", entry.getName());
element.addAttribute(attribute); element.addAttribute(attribute);

View File

@ -30,4 +30,11 @@ public class XmlHelper {
element.setSpannableText(stringItem.getXml()); 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); .get(0);
} }
public Entry getAttributeBlock(String refString){ public Entry getAttributeBlock(String refString){
String packageName = null;
String type = "attr"; 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; String name = refString;
int i=refString.lastIndexOf(':'); int i=refString.lastIndexOf(':');
if(i>=0){ if(i>=0){

View File

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

View File

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

View File

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