create name creator for ResXmlAttribute

This commit is contained in:
REAndroid
2023-02-18 11:52:30 -05:00
parent 217a491940
commit 6738d973ec
3 changed files with 90 additions and 11 deletions

View File

@ -59,6 +59,10 @@ public class ResXmlIDArray extends BlockArray<ResXmlID> {
updateIdMap();
return mResIdMap.get(resId);
}
public void refreshIdMap(){
mUpdated = false;
updateIdMap();
}
private void updateIdMap(){
if(mUpdated){
return;

View File

@ -94,21 +94,23 @@
setNameReference(xmlID.getIndex());
}
public void setName(String name, int resourceId){
if(resourceId!=0){
setNameResourceID(resourceId);
unlink(mNameReference);
unLinkNameId(getResXmlID());
ResXmlString xmlString = getOrCreateAttributeName(name, resourceId);
if(xmlString==null){
return;
}
if(name==null){
name="";
}
ResXmlIDMap xmlIDMap = getResXmlIDMap();
setNameReference(xmlString.getIndex());
mNameReference = link(OFFSET_NAME);
linkNameId();
}
private ResXmlString getOrCreateAttributeName(String name, int resourceId){
StringPool<?> stringPool = getStringPool();
if(stringPool==null || xmlIDMap==null){
return;
if(stringPool==null){
return null;
}
ResXmlStringPool resXmlStringPool = (ResXmlStringPool) stringPool;
ResXmlString xmlString = resXmlStringPool.getOrCreateAttributeName(xmlIDMap.getResXmlIDArray().childesCount(), name);
setNameReference(xmlString.getIndex());
return resXmlStringPool.getOrCreateAttribute(resourceId, name);
}
public ResXmlElement getParentResXmlElement(){
return getParent(ResXmlElement.class);

View File

@ -15,15 +15,21 @@
*/
package com.reandroid.arsc.pool;
import com.reandroid.arsc.array.ResXmlIDArray;
import com.reandroid.arsc.array.StringArray;
import com.reandroid.arsc.array.ResXmlStringArray;
import com.reandroid.arsc.array.StyleArray;
import com.reandroid.arsc.chunk.xml.ResXmlDocument;
import com.reandroid.arsc.chunk.xml.ResXmlIDMap;
import com.reandroid.arsc.group.StringGroup;
import com.reandroid.arsc.item.IntegerArray;
import com.reandroid.arsc.item.IntegerItem;
import com.reandroid.arsc.item.ResXmlID;
import com.reandroid.arsc.item.ResXmlString;
public class ResXmlStringPool extends StringPool<ResXmlString> {
import java.util.Objects;
public class ResXmlStringPool extends StringPool<ResXmlString> {
public ResXmlStringPool(boolean is_utf8) {
super(is_utf8);
}
@ -31,6 +37,73 @@ public class ResXmlStringPool extends StringPool<ResXmlString> {
StringArray<ResXmlString> newInstance(IntegerArray offsets, IntegerItem itemCount, IntegerItem itemStart, boolean is_utf8) {
return new ResXmlStringArray(offsets, itemCount, itemStart, is_utf8);
}
public ResXmlString getOrCreate(String str){
return getOrCreateAttribute(0, str);
}
public ResXmlString getOrCreateAttribute(int resourceId, String str){
ResXmlIDMap resXmlIDMap = getResXmlIDMap();
if(resXmlIDMap == null){
return super.getOrCreate(str);
}
ResXmlIDArray idArray = resXmlIDMap.getResXmlIDArray();
int count = idArray.childesCount();
if(resourceId == 0){
return getOrCreateAfter(count, str);
}
StringArray<ResXmlString> stringsArray = getStringsArray();
ResXmlID xmlID = idArray.getByResId(resourceId);
if(xmlID != null){
ResXmlString xmlString = stringsArray.get(xmlID.getIndex());
if(xmlString!=null && Objects.equals(str, xmlString.get())){
return xmlString;
}
}
count = idArray.childesCount() + 1;
stringsArray.ensureSize(count);
idArray.setChildesCount(count);
int index = count - 1;
xmlID = idArray.get(index);
xmlID.set(resourceId);
idArray.refreshIdMap();
ResXmlString xmlString = stringsArray.newInstance();
xmlString.set(str);
stringsArray.insertItem(index, xmlString);
updateUniqueIdMap(xmlString);
return xmlString;
}
private ResXmlString getOrCreateAfter(int position, String str){
if(position<0){
position=0;
}
StringGroup<ResXmlString> group = get(str);
if(group!=null){
for(ResXmlString xmlString:group.listItems()){
int index = xmlString.getIndex();
if(index > position || (position==0 && position == index)){
return xmlString;
}
}
}
StringArray<ResXmlString> stringsArray = getStringsArray();
int count = stringsArray.childesCount();
if(count < position){
count = position;
}
stringsArray.ensureSize(count+1);
ResXmlString xmlString = stringsArray.get(count);
xmlString.set(str);
super.updateUniqueIdMap(xmlString);
return xmlString;
}
private ResXmlIDMap getResXmlIDMap(){
ResXmlDocument resXmlDocument = getParentInstance(ResXmlDocument.class);
if(resXmlDocument!=null){
return resXmlDocument.getResXmlIDMap();
}
return null;
}
public ResXmlString getOrCreateAttributeName(int idMapCount, String str){
StringGroup<ResXmlString> group = get(str);
if(group!=null){