mirror of
https://github.com/revanced/ARSCLib.git
synced 2025-04-30 14:24:25 +02:00
Xml element clearStringReferences when removing child element
This commit is contained in:
parent
1c59826985
commit
6abaaebdb4
@ -18,15 +18,15 @@ package com.reandroid.lib.arsc.chunk.xml;
|
||||
import com.reandroid.lib.arsc.chunk.ChunkType;
|
||||
import com.reandroid.lib.arsc.base.Block;
|
||||
import com.reandroid.lib.arsc.chunk.BaseChunk;
|
||||
import com.reandroid.lib.arsc.io.BlockReader;
|
||||
import com.reandroid.lib.arsc.item.IntegerItem;
|
||||
import com.reandroid.lib.arsc.item.ResXmlString;
|
||||
import com.reandroid.lib.arsc.pool.ResXmlStringPool;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
public class BaseXmlChunk extends BaseChunk {
|
||||
public class BaseXmlChunk extends BaseChunk {
|
||||
|
||||
private final IntegerItem mLineNumber;
|
||||
private final IntegerItem mCommentReference;
|
||||
@ -46,6 +46,23 @@ public class BaseXmlChunk extends BaseChunk {
|
||||
addChild(mNamespaceReference);
|
||||
addChild(mStringReference);
|
||||
}
|
||||
Set<ResXmlString> clearStringReferences(){
|
||||
Set<ResXmlString> results=new HashSet<>();
|
||||
ResXmlString xmlString;
|
||||
xmlString=unLinkStringReference(mCommentReference);
|
||||
if(xmlString!=null){
|
||||
results.add(xmlString);
|
||||
}
|
||||
xmlString=unLinkStringReference(mNamespaceReference);
|
||||
if(xmlString!=null){
|
||||
results.add(xmlString);
|
||||
}
|
||||
xmlString=unLinkStringReference(mStringReference);
|
||||
if(xmlString!=null){
|
||||
results.add(xmlString);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
void linkStringReferences(){
|
||||
linkStringReference(mCommentReference);
|
||||
linkStringReference(mNamespaceReference);
|
||||
@ -57,11 +74,12 @@ public class BaseXmlChunk extends BaseChunk {
|
||||
xmlString.addReferenceIfAbsent(item);
|
||||
}
|
||||
}
|
||||
void unLinkStringReference(IntegerItem item){
|
||||
ResXmlString unLinkStringReference(IntegerItem item){
|
||||
ResXmlString xmlString = getResXmlString(item.get());
|
||||
if(xmlString!=null){
|
||||
xmlString.removeReference(item);
|
||||
}
|
||||
return xmlString;
|
||||
}
|
||||
public void setLineNumber(int val){
|
||||
mLineNumber.set(val);
|
||||
|
@ -18,16 +18,16 @@ package com.reandroid.lib.arsc.chunk.xml;
|
||||
import com.reandroid.lib.arsc.array.ResXmlIDArray;
|
||||
import com.reandroid.lib.arsc.base.Block;
|
||||
import com.reandroid.lib.arsc.container.FixedBlockContainer;
|
||||
import com.reandroid.lib.arsc.io.BlockReader;
|
||||
import com.reandroid.lib.arsc.item.*;
|
||||
import com.reandroid.lib.arsc.pool.ResXmlStringPool;
|
||||
import com.reandroid.lib.arsc.value.ValueType;
|
||||
import com.reandroid.lib.json.JSONConvert;
|
||||
import com.reandroid.lib.json.JSONObject;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class ResXmlAttribute extends FixedBlockContainer
|
||||
public class ResXmlAttribute extends FixedBlockContainer
|
||||
implements Comparable<ResXmlAttribute>, JSONConvert<JSONObject> {
|
||||
private final IntegerItem mNamespaceReference;
|
||||
private final IntegerItem mNameReference;
|
||||
@ -53,6 +53,27 @@ public class ResXmlAttribute extends FixedBlockContainer
|
||||
addChild(5, mValueTypeByte);
|
||||
addChild(6, mRawValue);
|
||||
}
|
||||
Set<ResXmlString> clearStringReferences(){
|
||||
Set<ResXmlString> results=new HashSet<>();
|
||||
ResXmlString xmlString;
|
||||
xmlString=unLinkStringReference(mNamespaceReference);
|
||||
if(xmlString!=null){
|
||||
results.add(xmlString);
|
||||
}
|
||||
xmlString=unLinkStringReference(mNameReference);
|
||||
if(xmlString!=null){
|
||||
results.add(xmlString);
|
||||
}
|
||||
xmlString=unLinkStringReference(mValueStringReference);
|
||||
if(xmlString!=null){
|
||||
results.add(xmlString);
|
||||
}
|
||||
xmlString=unLinkStringReference(mRawValue);
|
||||
if(xmlString!=null){
|
||||
results.add(xmlString);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
public void linkStringReferences(){
|
||||
linkStringReference(mNamespaceReference);
|
||||
linkStringReference(mNameReference);
|
||||
@ -67,6 +88,13 @@ public class ResXmlAttribute extends FixedBlockContainer
|
||||
xmlString.addReferenceIfAbsent(item);
|
||||
}
|
||||
}
|
||||
private ResXmlString unLinkStringReference(IntegerItem item){
|
||||
ResXmlString xmlString = getResXmlString(item.get());
|
||||
if(xmlString!=null){
|
||||
xmlString.removeReference(item);
|
||||
}
|
||||
return xmlString;
|
||||
}
|
||||
public String getUri(){
|
||||
return getString(getNamespaceReference());
|
||||
}
|
||||
|
@ -22,6 +22,7 @@ import com.reandroid.lib.arsc.container.FixedBlockContainer;
|
||||
import com.reandroid.lib.arsc.container.SingleBlockContainer;
|
||||
import com.reandroid.lib.arsc.header.HeaderBlock;
|
||||
import com.reandroid.lib.arsc.io.BlockReader;
|
||||
import com.reandroid.lib.arsc.item.ResXmlString;
|
||||
import com.reandroid.lib.arsc.pool.ResXmlStringPool;
|
||||
import com.reandroid.lib.json.JSONConvert;
|
||||
import com.reandroid.lib.json.JSONArray;
|
||||
@ -29,11 +30,9 @@ import com.reandroid.lib.json.JSONObject;
|
||||
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
public class ResXmlElement extends FixedBlockContainer implements JSONConvert<JSONObject> {
|
||||
public class ResXmlElement extends FixedBlockContainer implements JSONConvert<JSONObject> {
|
||||
private final BlockList<ResXmlStartNamespace> mStartNamespaceList;
|
||||
private final SingleBlockContainer<ResXmlStartElement> mStartElementContainer;
|
||||
private final BlockList<ResXmlElement> mBody;
|
||||
@ -56,6 +55,24 @@ public class ResXmlElement extends FixedBlockContainer implements JSONConvert<JS
|
||||
addChild(4, mEndElementContainer);
|
||||
addChild(5, mEndNamespaceList);
|
||||
}
|
||||
Set<ResXmlString> clearStringReferences(){
|
||||
Set<ResXmlString> results=new HashSet<>();
|
||||
for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){
|
||||
results.addAll(startNamespace.clearStringReferences());
|
||||
}
|
||||
ResXmlStartElement start = getStartElement();
|
||||
if(start!=null){
|
||||
results.addAll(start.clearStringReferences());
|
||||
}
|
||||
ResXmlText resXmlText=getResXmlText();
|
||||
if(resXmlText!=null){
|
||||
results.addAll(resXmlText.clearStringReferences());
|
||||
}
|
||||
for(ResXmlElement child:listElements()){
|
||||
results.addAll(child.clearStringReferences());
|
||||
}
|
||||
return results;
|
||||
}
|
||||
void linkStringReferences(){
|
||||
for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){
|
||||
startNamespace.linkStringReferences();
|
||||
@ -212,8 +229,18 @@ public class ResXmlElement extends FixedBlockContainer implements JSONConvert<JS
|
||||
public void addElement(ResXmlElement element){
|
||||
mBody.add(element);
|
||||
}
|
||||
public void removeElement(ResXmlElement element){
|
||||
mBody.remove(element);
|
||||
public boolean removeElement(ResXmlElement element){
|
||||
if(element.getParent()!=null){
|
||||
// TODO: Find a way to remove properly from StringPool
|
||||
Set<ResXmlString> removedStrings = element.clearStringReferences();
|
||||
for(ResXmlString xmlString:removedStrings){
|
||||
if(xmlString.getReferencedList().size()!=0){
|
||||
continue;
|
||||
}
|
||||
xmlString.set("");
|
||||
}
|
||||
}
|
||||
return mBody.remove(element);
|
||||
}
|
||||
public int countElements(){
|
||||
return mBody.size();
|
||||
|
@ -17,13 +17,14 @@ package com.reandroid.lib.arsc.chunk.xml;
|
||||
|
||||
import com.reandroid.lib.arsc.chunk.ChunkType;
|
||||
import com.reandroid.lib.arsc.array.ResXmlAttributeArray;
|
||||
import com.reandroid.lib.arsc.item.ResXmlString;
|
||||
import com.reandroid.lib.arsc.item.ShortItem;
|
||||
import com.reandroid.lib.arsc.value.ValueType;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
public class ResXmlStartElement extends BaseXmlChunk {
|
||||
public class ResXmlStartElement extends BaseXmlChunk {
|
||||
private final ShortItem mAttributeStart;
|
||||
private final ShortItem mAttributeUnitSize;
|
||||
private final ShortItem mAttributeCount;
|
||||
@ -52,10 +53,26 @@ public class ResXmlStartElement extends BaseXmlChunk {
|
||||
@Override
|
||||
void linkStringReferences(){
|
||||
super.linkStringReferences();
|
||||
ResXmlEndElement end = getResXmlEndElement();
|
||||
if(end!=null){
|
||||
end.linkStringReferences();
|
||||
}
|
||||
for(ResXmlAttribute attr:listResXmlAttributes()){
|
||||
attr.linkStringReferences();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
Set<ResXmlString> clearStringReferences(){
|
||||
Set<ResXmlString> results=super.clearStringReferences();
|
||||
ResXmlEndElement end = getResXmlEndElement();
|
||||
if(end!=null){
|
||||
results.addAll(end.clearStringReferences());
|
||||
}
|
||||
for(ResXmlAttribute attr:listResXmlAttributes()){
|
||||
results.addAll(attr.clearStringReferences());
|
||||
}
|
||||
return results;
|
||||
}
|
||||
@Override
|
||||
protected void onPreRefreshRefresh(){
|
||||
sortAttributes();
|
||||
|
@ -16,8 +16,11 @@
|
||||
package com.reandroid.lib.arsc.chunk.xml;
|
||||
|
||||
import com.reandroid.lib.arsc.chunk.ChunkType;
|
||||
import com.reandroid.lib.arsc.item.ResXmlString;
|
||||
|
||||
public class ResXmlStartNamespace extends ResXmlNamespace<ResXmlEndNamespace> {
|
||||
import java.util.Set;
|
||||
|
||||
public class ResXmlStartNamespace extends ResXmlNamespace<ResXmlEndNamespace> {
|
||||
public ResXmlStartNamespace() {
|
||||
super(ChunkType.XML_START_NAMESPACE);
|
||||
}
|
||||
@ -35,4 +38,13 @@ public class ResXmlStartNamespace extends ResXmlNamespace<ResXmlEndNamespace> {
|
||||
end.linkStringReferences();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
Set<ResXmlString> clearStringReferences(){
|
||||
Set<ResXmlString> results=super.clearStringReferences();
|
||||
ResXmlEndNamespace end = getEnd();
|
||||
if(end!=null){
|
||||
results.addAll(end.clearStringReferences());
|
||||
}
|
||||
return results;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user