From 1be579dfde0f606966170ee1a1c7fa3360e7d212 Mon Sep 17 00:00:00 2001 From: REAndroid Date: Fri, 17 Feb 2023 10:10:19 -0500 Subject: [PATCH] link StyleItem to StringPool --- .../com/reandroid/arsc/item/StringItem.java | 6 ++ .../com/reandroid/arsc/item/StyleItem.java | 100 ++++++++++++++---- .../com/reandroid/arsc/pool/StringPool.java | 6 ++ 3 files changed, 94 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/reandroid/arsc/item/StringItem.java b/src/main/java/com/reandroid/arsc/item/StringItem.java index 6542c66..b349f05 100755 --- a/src/main/java/com/reandroid/arsc/item/StringItem.java +++ b/src/main/java/com/reandroid/arsc/item/StringItem.java @@ -118,6 +118,12 @@ public class StringItem extends BlockItem implements JSONConvert { }else if(str.equals(old)){ return; } + if(str==null){ + StyleItem styleItem = getStyle(); + if(styleItem!=null){ + styleItem.onRemoved(); + } + } byte[] bts=encodeString(str); setBytesInternal(bts); } diff --git a/src/main/java/com/reandroid/arsc/item/StyleItem.java b/src/main/java/com/reandroid/arsc/item/StyleItem.java index 3f18491..24b045f 100755 --- a/src/main/java/com/reandroid/arsc/item/StyleItem.java +++ b/src/main/java/com/reandroid/arsc/item/StyleItem.java @@ -24,14 +24,20 @@ import com.reandroid.json.JSONArray; import com.reandroid.json.JSONObject; import java.io.IOException; -import java.util.AbstractList; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class StyleItem extends IntegerArray implements JSONConvert { private List mSpanInfoList; + private final Set mReferences; public StyleItem() { super(); + this.mReferences = new HashSet<>(); + } + void onRemoved(){ + setStylePieceCount(0); + } + public void onDataLoaded(){ + linkAll(); } private void setEndValue(int negOne){ super.put(size()-1, negOne); @@ -44,8 +50,66 @@ public class StyleItem extends IntegerArray implements JSONConvert { return super.get(i); } final void setStringRef(int index, int val){ + setStringRef(index, val, true); + } + final void setStringRef(int index, int val, boolean link){ + if(link){ + unLink(index); + } int i=index * INTEGERS_COUNT + INDEX_STRING_REF; super.put(i, val); + if(link){ + link(getStringItem(val), index); + } + } + private void linkAll(){ + int count = getStylePieceCount(); + for(int i=0; i { setStylePiece(index, refString, firstChar, lastChar); } final void setStylePiece(int index, int refString, int firstChar, int lastChar){ + unLink(index); int i=index * INTEGERS_COUNT; super.put(i+ INDEX_STRING_REF, refString); super.put(i+ INDEX_CHAR_FIRST, firstChar); super.put(i+ INDEX_CHAR_LAST, lastChar); + link(getStringItem(refString), index); } final int[] getStylePiece(int index){ if(index<0||index>= getStylePieceCount()){ @@ -102,14 +168,6 @@ public class StyleItem extends IntegerArray implements JSONConvert { super.put(i + INDEX_CHAR_FIRST, three[INDEX_CHAR_FIRST]); super.put(i + INDEX_CHAR_LAST, three[INDEX_CHAR_LAST]); } - final void ensureStylePieceCount(int count){ - if(count<0){ - count=0; - } - if(count { if(count==cur){ return; } + if(count == 0){ + unlinkAll(); + } int max=count * INTEGERS_COUNT + 1; if(size()==0 || count==0){ super.setSize(max); @@ -188,15 +249,18 @@ public class StyleItem extends IntegerArray implements JSONConvert { return mSpanInfoList; } private String getStringFromPool(int ref){ + StringItem stringItem = getStringItem(ref); + if(stringItem!=null){ + return stringItem.get(); + } + return null; + } + private StringItem getStringItem(int ref){ StringPool stringPool = getStringPool(); - if(stringPool==null){ - return null; + if(stringPool!=null){ + return stringPool.get(ref); } - StringItem stringItem = stringPool.get(ref); - if(stringItem==null){ - return null; - } - return stringItem.get(); + return null; } private StringPool getStringPool(){ Block parent=getParent(); diff --git a/src/main/java/com/reandroid/arsc/pool/StringPool.java b/src/main/java/com/reandroid/arsc/pool/StringPool.java index 29c337d..a9d490c 100755 --- a/src/main/java/com/reandroid/arsc/pool/StringPool.java +++ b/src/main/java/com/reandroid/arsc/pool/StringPool.java @@ -277,6 +277,12 @@ package com.reandroid.arsc.pool; @Override public void onChunkLoaded() { refreshUniqueIdMap(); + StyleItem[] styles = getStyles(); + if(styles!=null){ + for(StyleItem styleItem:styles){ + styleItem.onDataLoaded(); + } + } } @Override