From 28c6d985711f4f6e83a5948ec0ae7a4089229177 Mon Sep 17 00:00:00 2001 From: REAndroid Date: Tue, 27 Dec 2022 07:02:25 -0500 Subject: [PATCH] Update xml blocks * Fix FIRST_INT on attributes * Fix version editing on manifest * Make easy attribute creation --- .../lib/arsc/array/ResXmlAttributeArray.java | 8 +++ .../arsc/chunk/xml/AndroidManifestBlock.java | 55 +++++++++---------- .../lib/arsc/chunk/xml/ResXmlAttribute.java | 35 +++++++++++- .../lib/arsc/chunk/xml/ResXmlElement.java | 35 ++++++++++++ 4 files changed, 104 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/reandroid/lib/arsc/array/ResXmlAttributeArray.java b/src/main/java/com/reandroid/lib/arsc/array/ResXmlAttributeArray.java index 94e0e9c..a98a27b 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/ResXmlAttributeArray.java +++ b/src/main/java/com/reandroid/lib/arsc/array/ResXmlAttributeArray.java @@ -38,6 +38,14 @@ public class ResXmlAttributeArray extends BlockArray this.mAttributeStart=attributeStart; this.mAttributeCount=attributeCount; } + public ResXmlAttribute getFirstIntAttribute(){ + for(ResXmlAttribute attribute:listItems()){ + if(attribute.hasIntegerValue()){ + return attribute; + } + } + return null; + } public void sortAttributes(){ sort(this); } diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/AndroidManifestBlock.java b/src/main/java/com/reandroid/lib/arsc/chunk/xml/AndroidManifestBlock.java index ae781c7..22c104a 100644 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/AndroidManifestBlock.java +++ b/src/main/java/com/reandroid/lib/arsc/chunk/xml/AndroidManifestBlock.java @@ -115,7 +115,7 @@ public class AndroidManifestBlock extends ResXmlBlock{ return exist; } ResXmlElement result = manifestElement.createChildElement(TAG_uses_permission); - ResXmlAttribute attr = result.createAndroidAttribute(NAME_name, ID_name); + ResXmlAttribute attr = result.getOrCreateAndroidAttribute(NAME_name, ID_name); attr.setValueAsString(permissionName); return result; } @@ -145,8 +145,8 @@ public class AndroidManifestBlock extends ResXmlBlock{ public Integer getCompileSdkVersion(){ return getManifestAttributeInt(ID_compileSdkVersion); } - public boolean setCompileSdkVersion(int val){ - return setManifestAttributeInt(ID_compileSdkVersion, val); + public void setCompileSdkVersion(int val){ + setManifestAttributeInt(NAME_compileSdkVersion, ID_compileSdkVersion, val); } public String getCompileSdkVersionCodename(){ return getManifestAttributeString(ID_compileSdkVersionCodename); @@ -166,14 +166,14 @@ public class AndroidManifestBlock extends ResXmlBlock{ public Integer getVersionCode(){ return getManifestAttributeInt(ID_versionCode); } - public boolean setVersionCode(int val){ - return setManifestAttributeInt(ID_versionCode, val); + public void setVersionCode(int val){ + setManifestAttributeInt(NAME_versionCode, ID_versionCode, val); } public String getVersionName(){ return getManifestAttributeString(ID_versionName); } public boolean setVersionName(String packageName){ - return setManifestAttributeString(ID_versionName, packageName); + return setManifestAttributeString(NAME_versionName, ID_versionName, packageName); } private String getManifestAttributeString(int resourceId){ ResXmlElement manifest=getManifestElement(); @@ -186,29 +186,18 @@ public class AndroidManifestBlock extends ResXmlBlock{ } return attribute.getValueAsString(); } - private boolean setManifestAttributeString(int resourceId, String value){ - ResXmlElement manifestElement=getManifestElement(); - if(manifestElement==null){ - return false; - } - ResXmlAttribute attribute = manifestElement.searchAttributeByResourceId(resourceId); - if(attribute==null){ - return false; - } + private boolean setManifestAttributeString(String attributeName, int resourceId, String value){ + ResXmlElement manifestElement=getOrCreateManifestElement(); + ResXmlAttribute attribute = manifestElement + .getOrCreateAndroidAttribute(attributeName, resourceId); attribute.setValueAsString(value); return true; } - private boolean setManifestAttributeInt(int resId, int value){ - ResXmlElement manifestElement=getManifestElement(); - if(manifestElement==null){ - return false; - } - ResXmlAttribute attribute= manifestElement.searchAttributeByResourceId(resId); - if(attribute==null){ - return false; - } - attribute.setValueAsIntegerDec(value); - return true; + private void setManifestAttributeInt(String attributeName, int resourceId, int value){ + ResXmlElement manifestElement=getOrCreateManifestElement(); + ResXmlAttribute attribute = manifestElement + .getOrCreateAndroidAttribute(attributeName, resourceId); + attribute.setValueAsInteger(value); } private Integer getManifestAttributeInt(int resourceId){ ResXmlElement manifestElement=getManifestElement(); @@ -216,10 +205,10 @@ public class AndroidManifestBlock extends ResXmlBlock{ return null; } ResXmlAttribute attribute= manifestElement.searchAttributeByResourceId(resourceId); - if(attribute==null || attribute.getValueType()!=ValueType.INT_DEC){ + if(attribute==null || !attribute.hasIntegerValue()){ return null; } - return attribute.getRawValue(); + return attribute.getValueAsInteger(); } public ResXmlElement getApplicationElement(){ ResXmlElement manifestElement=getManifestElement(); @@ -238,6 +227,16 @@ public class AndroidManifestBlock extends ResXmlBlock{ } return manifestElement; } + private ResXmlElement getOrCreateManifestElement(){ + ResXmlElement manifestElement=getResXmlElement(); + if(manifestElement==null){ + manifestElement=createRootElement(TAG_manifest); + } + if(!TAG_manifest.equals(manifestElement.getTag())){ + manifestElement.setTag(TAG_manifest); + } + return manifestElement; + } @Override public String toString(){ StringBuilder builder=new StringBuilder(); diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlAttribute.java b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlAttribute.java index 8357e58..6dac718 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlAttribute.java +++ b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlAttribute.java @@ -15,6 +15,7 @@ */ package com.reandroid.lib.arsc.chunk.xml; +import com.reandroid.lib.arsc.array.ResXmlAttributeArray; import com.reandroid.lib.arsc.array.ResXmlIDArray; import com.reandroid.lib.arsc.base.Block; import com.reandroid.lib.arsc.container.FixedBlockContainer; @@ -142,9 +143,11 @@ import java.util.Set; return ValueType.valueOf(getValueTypeByte()); } public void setValueType(ValueType valueType){ + byte b=0; if(valueType!=null){ - setValueTypeByte(valueType.getByte()); + b=valueType.getByte(); } + setValueTypeByte(b); } public String getFullName(){ String name=getName(); @@ -301,6 +304,36 @@ import java.util.Set; setRawValue(ref); setValueStringReference(-1); } + public boolean hasIntegerValue(){ + ValueType valueType=getValueType(); + return valueType==ValueType.INT_DEC + ||valueType==ValueType.FIRST_INT; + } + public Integer getValueAsInteger(){ + if(hasIntegerValue()){ + return getRawValue(); + } + return null; + } + public void setValueAsInteger(int val){ + setValueType(ValueType.INT_DEC); + ResXmlAttributeArray array=getParentResXmlAttributeArray(); + if(array!=null && array.getFirstIntAttribute()==this){ + setValueType(ValueType.FIRST_INT); + } + setRawValue(val); + setValueStringReference(-1); + } + private ResXmlAttributeArray getParentResXmlAttributeArray(){ + Block parent=this; + while(parent!=null){ + if(parent instanceof ResXmlAttributeArray){ + return (ResXmlAttributeArray)parent; + } + parent=parent.getParent(); + } + return null; + } public void setValueAsIntegerDec(int val){ setValueType(ValueType.INT_DEC); setRawValue(val); diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlElement.java b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlElement.java index fe5b1ca..34ec844 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlElement.java +++ b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlElement.java @@ -107,6 +107,28 @@ import java.util.*; } return resXmlElement; } + public ResXmlAttribute getOrCreateAndroidAttribute(String name, int resourceId){ + return getOrCreateAttribute(NS_ANDROID_URI, NS_ANDROID_PREFIX, name, resourceId); + } + public ResXmlAttribute getOrCreateAttribute(String uri, String prefix, String name, int resourceId){ + ResXmlAttribute attribute=searchAttribute(name, resourceId); + if(attribute==null){ + attribute = createAttribute(name, resourceId); + if(uri!=null){ + ResXmlElement root = getRootResXmlElement(); + ResXmlStartNamespace ns = root.getOrCreateNamespace(uri, prefix); + attribute.setNamespaceReference(ns.getUriReference()); + } + } + return attribute; + } + public ResXmlAttribute getOrCreateAttribute(String name, int resourceId){ + ResXmlAttribute attribute=searchAttribute(name, resourceId); + if(attribute==null){ + attribute=createAttribute(name, resourceId); + } + return attribute; + } public ResXmlAttribute createAndroidAttribute(String name, int resourceId){ ResXmlAttribute attribute=createAttribute(name, resourceId); ResXmlStartNamespace ns = getOrCreateNamespace(NS_ANDROID_URI, NS_ANDROID_PREFIX); @@ -133,6 +155,12 @@ import java.util.*; } return null; } + private ResXmlAttribute searchAttribute(String name, int resourceId){ + if(resourceId==0){ + return searchAttributeByName(name); + } + return searchAttributeByResourceId(resourceId); + } public ResXmlAttribute searchAttributeByName(String name){ ResXmlStartElement startElement=getStartElement(); if(startElement!=null){ @@ -266,6 +294,13 @@ import java.util.*; } return results; } + public ResXmlElement getRootResXmlElement(){ + ResXmlElement parent=getParentResXmlElement(); + if(parent!=null){ + return parent.getRootResXmlElement(); + } + return this; + } public ResXmlElement getParentResXmlElement(){ Block parent=getParent(); while (parent!=null){