link attributes resource id

This commit is contained in:
REAndroid 2023-02-17 08:17:32 -05:00
parent 2ea78058d6
commit 2f75149bae
2 changed files with 71 additions and 42 deletions

View File

@ -15,7 +15,6 @@
*/ */
package com.reandroid.arsc.chunk.xml; package com.reandroid.arsc.chunk.xml;
import com.reandroid.arsc.array.ResXmlIDArray;
import com.reandroid.arsc.decoder.ValueDecoder; import com.reandroid.arsc.decoder.ValueDecoder;
import com.reandroid.arsc.group.EntryGroup; import com.reandroid.arsc.group.EntryGroup;
import com.reandroid.arsc.io.BlockReader; import com.reandroid.arsc.io.BlockReader;
@ -34,7 +33,8 @@
public class ResXmlAttribute extends ValueItem implements Comparable<ResXmlAttribute>{ public class ResXmlAttribute extends ValueItem implements Comparable<ResXmlAttribute>{
private ReferenceItem mNSReference; private ReferenceItem mNSReference;
private ReferenceItem mNameReference; private ReferenceItem mNameReference;
private ReferenceItem mStringReference; private ReferenceItem mNameIdReference;
private ReferenceItem mValueStringReference;
public ResXmlAttribute(int attributeUnitSize) { public ResXmlAttribute(int attributeUnitSize) {
super(attributeUnitSize, OFFSET_SIZE); super(attributeUnitSize, OFFSET_SIZE);
byte[] bts = getBytesInternal(); byte[] bts = getBytesInternal();
@ -79,7 +79,11 @@
return getString(getValueStringReference()); return getString(getValueStringReference());
} }
public int getNameResourceID(){ public int getNameResourceID(){
return getResourceId(getNameReference()); ResXmlID xmlID = getResXmlID();
if(xmlID != null){
return xmlID.get();
}
return 0;
} }
public void setNameResourceID(int resourceId){ public void setNameResourceID(int resourceId){
ResXmlIDMap xmlIDMap=getResXmlIDMap(); ResXmlIDMap xmlIDMap=getResXmlIDMap();
@ -130,20 +134,12 @@
} }
return stringItem.getHtml(); return stringItem.getHtml();
} }
private int getResourceId(int ref){ private ResXmlID getResXmlID(){
if(ref<0){ ResXmlIDMap xmlIDMap = getResXmlIDMap();
return 0; if(xmlIDMap == null){
return null;
} }
ResXmlIDMap xmlIDMap=getResXmlIDMap(); return xmlIDMap.getResXmlIDArray().get(getNameReference());
if(xmlIDMap==null){
return 0;
}
ResXmlIDArray xmlIDArray = xmlIDMap.getResXmlIDArray();
ResXmlID xmlID = xmlIDArray.get(ref);
if(xmlID!=null){
return xmlID.get();
}
return 0;
} }
private ResXmlIDMap getResXmlIDMap(){ private ResXmlIDMap getResXmlIDMap(){
ResXmlElement xmlElement=getParentResXmlElement(); ResXmlElement xmlElement=getParentResXmlElement();
@ -171,9 +167,11 @@
if(ref == getNameReference()){ if(ref == getNameReference()){
return; return;
} }
unLinkNameId(getResXmlID());
unlink(mNameReference); unlink(mNameReference);
putInteger(getBytesInternal(), OFFSET_NAME, ref); putInteger(getBytesInternal(), OFFSET_NAME, ref);
mNameReference = link(OFFSET_NAME); mNameReference = link(OFFSET_NAME);
linkNameId();
} }
int getValueStringReference(){ int getValueStringReference(){
return getInteger(getBytesInternal(), OFFSET_STRING); return getInteger(getBytesInternal(), OFFSET_STRING);
@ -182,9 +180,9 @@
if(ref == getValueStringReference()){ if(ref == getValueStringReference()){
return; return;
} }
unlink(mStringReference); unlink(mValueStringReference);
putInteger(getBytesInternal(), OFFSET_STRING, ref); putInteger(getBytesInternal(), OFFSET_STRING, ref);
mStringReference = link(OFFSET_STRING); mValueStringReference = link(OFFSET_STRING);
} }
@Override @Override
@ -205,22 +203,49 @@
} }
@Override @Override
protected void onDataChanged(){ protected void onDataChanged(){
if(getValueType()!=ValueType.STRING){ if(getValueType()==ValueType.STRING){
setValueStringReference(getData());
}else {
setValueStringReference(-1); setValueStringReference(-1);
} }
} }
private void linkNameId(){
ResXmlID xmlID = getResXmlID();
if(xmlID==null){
return;
}
unLinkNameId(xmlID);
ReferenceItem referenceItem = new ReferenceBlock<>(this, OFFSET_NAME);
xmlID.addReference(referenceItem);
mNameIdReference = referenceItem;
}
private void unLinkNameId(ResXmlID xmlID){
ReferenceItem referenceItem = mNameIdReference;
if(referenceItem==null || xmlID == null){
return;
}
xmlID.removeReference(referenceItem);
mNameIdReference = null;
}
private void linkAll(){ private void linkAll(){
unlink(mNSReference); unlink(mNSReference);
mNSReference = link(OFFSET_NS); mNSReference = link(OFFSET_NS);
unlink(mNameReference); unlink(mNameReference);
mNameReference = link(OFFSET_NAME); mNameReference = link(OFFSET_NAME);
unlink(mStringReference); unlink(mValueStringReference);
mStringReference = link(OFFSET_STRING); mValueStringReference = link(OFFSET_STRING);
linkNameId();
} }
private void unlinkAll(){ private void unlinkAll(){
unlink(mNSReference); unlink(mNSReference);
unlink(mNameReference); unlink(mNameReference);
unlink(mStringReference); unlink(mValueStringReference);
mNSReference = null;
mNameReference = null;
mValueStringReference = null;
unLinkNameId(getResXmlID());
} }
private ReferenceItem link(int offset){ private ReferenceItem link(int offset){
if(offset<0){ if(offset<0){

View File

@ -20,7 +20,6 @@ import com.reandroid.arsc.chunk.xml.ResXmlDocument;
import com.reandroid.arsc.pool.ResXmlStringPool; import com.reandroid.arsc.pool.ResXmlStringPool;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
public class ResXmlID extends IntegerItem { public class ResXmlID extends IntegerItem {
@ -35,12 +34,6 @@ public class ResXmlID extends IntegerItem {
public boolean removeReference(ReferenceItem ref){ public boolean removeReference(ReferenceItem ref){
return mReferencedList.remove(ref); return mReferencedList.remove(ref);
} }
public boolean removeAllReference(Collection<ReferenceItem> referenceItems){
return mReferencedList.removeAll(referenceItems);
}
public void removeAllReference(){
mReferencedList.clear();
}
public List<ReferenceItem> getReferencedList(){ public List<ReferenceItem> getReferencedList(){
return mReferencedList; return mReferencedList;
} }
@ -49,13 +42,8 @@ public class ResXmlID extends IntegerItem {
mReferencedList.add(ref); mReferencedList.add(ref);
} }
} }
public void addReference(Collection<ReferenceItem> refList){ public int getReferenceCount(){
if(refList==null){ return mReferencedList.size();
return;
}
for(ReferenceItem ref:refList){
addReference(ref);
}
} }
private void reUpdateReferences(int newIndex){ private void reUpdateReferences(int newIndex){
for(ReferenceItem ref:mReferencedList){ for(ReferenceItem ref:mReferencedList){
@ -67,16 +55,19 @@ public class ResXmlID extends IntegerItem {
reUpdateReferences(newIndex); reUpdateReferences(newIndex);
} }
public String getName(){ public String getName(){
ResXmlStringPool stringPool=getXmlStringPool(); ResXmlString xmlString = getResXmlString();
if(stringPool==null){
return null;
}
ResXmlString xmlString = stringPool.get(getIndex());
if(xmlString==null){ if(xmlString==null){
return null; return null;
} }
return xmlString.getHtml(); return xmlString.getHtml();
} }
public ResXmlString getResXmlString(){
ResXmlStringPool stringPool=getXmlStringPool();
if(stringPool==null){
return null;
}
return stringPool.get(getIndex());
}
private ResXmlStringPool getXmlStringPool(){ private ResXmlStringPool getXmlStringPool(){
Block parent=this; Block parent=this;
while (parent!=null){ while (parent!=null){
@ -89,6 +80,19 @@ public class ResXmlID extends IntegerItem {
} }
@Override @Override
public String toString(){ public String toString(){
return getIndex()+": "+String.format("0x%08x", get()); StringBuilder builder = new StringBuilder();
builder.append("USED-BY=");
builder.append(getReferenceCount());
builder.append('{');
String name = getName();
if(name!=null){
builder.append(name);
}else {
builder.append(getIndex());
}
builder.append(':');
builder.append(String.format("0x%08x", get()));
builder.append('}');
return builder.toString();
} }
} }