From d1e5682d023e7556c09b2ee757282cefd26c9dd1 Mon Sep 17 00:00:00 2001 From: REAndroid Date: Thu, 4 May 2023 19:46:11 +0200 Subject: [PATCH] encode arrays with name attribute --- .../apk/xmlencoder/ValuesEncoder.java | 22 +++++++++++++++++-- .../apk/xmlencoder/XMLValuesEncoderStyle.java | 20 +++++++++++------ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/reandroid/apk/xmlencoder/ValuesEncoder.java b/src/main/java/com/reandroid/apk/xmlencoder/ValuesEncoder.java index 3d8612b..378ef1f 100644 --- a/src/main/java/com/reandroid/apk/xmlencoder/ValuesEncoder.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/ValuesEncoder.java @@ -71,7 +71,11 @@ class ValuesEncoder { type=getType(xmlDocument, type); XMLValuesEncoder encoder; if(isBag(xmlDocument, type)){ - encoder=getBagEncoder(type); + if("array".equals(type) && hasNameAttributes(xmlDocument)){ + encoder = getBagEncoder("style"); + }else{ + encoder = getBagEncoder(type); + } }else{ encoder=getEncoder(type); } @@ -99,13 +103,27 @@ class ValuesEncoder { XMLElement documentElement=xmlDocument.getDocumentElement(); int count=documentElement.getChildesCount(); for(int i=0;i0){ return true; } } return false; } + private boolean hasNameAttributes(XMLDocument xmlDocument){ + XMLElement documentElement=xmlDocument.getDocumentElement(); + int count=documentElement.getChildesCount(); + for(int i=0;i0){ + XMLElement child = element.getChildAt(0); + if(child.getAttributeValue("name") != null){ + return true; + } + } + } + return false; + } private String getType(XMLDocument xmlDocument, String def){ XMLElement documentElement=xmlDocument.getDocumentElement(); if(documentElement.getChildesCount()==0){ diff --git a/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderStyle.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderStyle.java index 17ecd8d..3c1f559 100644 --- a/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderStyle.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderStyle.java @@ -35,15 +35,21 @@ class XMLValuesEncoderStyle extends XMLValuesEncoderBag{ XMLElement child=parentElement.getChildAt(i); ResValueMap item = itemArray.get(i); String name=child.getAttributeValue("name"); - int id=decodeUnknownAttributeHex(name); - if(id!=0){ + Integer id = decodeUnknownAttributeHex(name); + if(id != null){ item.setName(id); String value = child.getTextContent(); ValueDecoder.EncodeResult encodeResult = ValueDecoder.encodeNullReference(value); if(encodeResult!=null){ item.setTypeAndData(encodeResult.valueType, encodeResult.value); }else if(ValueDecoder.isReference(value)){ - item.setTypeAndData(ValueType.REFERENCE, + ValueType valueType; + if(value.charAt(0) == '?'){ + valueType = ValueType.ATTRIBUTE; + }else { + valueType = ValueType.REFERENCE; + } + item.setTypeAndData(valueType, getMaterials().resolveReference(value)); }else { encodeResult = ValueDecoder.encodeGuessAny(value); @@ -65,13 +71,13 @@ class XMLValuesEncoderStyle extends XMLValuesEncoderBag{ encodeChild(child, attributeEntry, item); } } - private int decodeUnknownAttributeHex(String name){ - if(name.length()==0||name.charAt(0)!='@'){ - return 0; + private Integer decodeUnknownAttributeHex(String name){ + if(name.length()==0||(name.charAt(0)!='@' && name.charAt(0)!='?')){ + return null; } name=name.substring(1); if(!ValueDecoder.isHex(name)){ - return 0; + return null; } return ValueDecoder.parseHex(name); }