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

View File

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