mirror of
https://github.com/revanced/ARSCLib.git
synced 2025-05-01 06:34:26 +02:00
link attributes resource id
This commit is contained in:
parent
2ea78058d6
commit
2f75149bae
@ -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){
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user