diff --git a/src/main/java/com/reandroid/arsc/array/EntryArray.java b/src/main/java/com/reandroid/arsc/array/EntryArray.java index 60549c1..0abb2f7 100755 --- a/src/main/java/com/reandroid/arsc/array/EntryArray.java +++ b/src/main/java/com/reandroid/arsc/array/EntryArray.java @@ -19,6 +19,8 @@ import com.reandroid.arsc.item.IntegerItem; import com.reandroid.arsc.pool.SpecStringPool; import com.reandroid.arsc.pool.TableStringPool; import com.reandroid.arsc.value.Entry; +import com.reandroid.arsc.value.ResValue; +import com.reandroid.arsc.value.ValueType; import com.reandroid.json.JSONConvert; import com.reandroid.json.JSONArray; import com.reandroid.json.JSONObject; @@ -75,12 +77,22 @@ public class EntryArray extends OffsetBlockArray implements JSONConvert itr = iterator(true); + while (itr.hasNext()){ + Entry entry = itr.next(); + if(entry.isComplex()){ + return true; + } + ResValue resValue = entry.getResValue(); + ValueType valueType = resValue.getValueType(); + if(valueType == null || valueType == ValueType.REFERENCE + || valueType == ValueType.NULL){ + continue; + } return false; } - return first.isComplex(); + return null; } public boolean isEmpty(){ return !iterator(true).hasNext(); diff --git a/src/main/java/com/reandroid/arsc/array/TypeBlockArray.java b/src/main/java/com/reandroid/arsc/array/TypeBlockArray.java index 279431b..cbe12cb 100755 --- a/src/main/java/com/reandroid/arsc/array/TypeBlockArray.java +++ b/src/main/java/com/reandroid/arsc/array/TypeBlockArray.java @@ -16,7 +16,6 @@ package com.reandroid.arsc.array; import com.reandroid.arsc.chunk.ChunkType; -import com.reandroid.arsc.base.Block; import com.reandroid.arsc.base.BlockArray; import com.reandroid.arsc.chunk.SpecBlock; import com.reandroid.arsc.chunk.TypeBlock; @@ -32,17 +31,29 @@ 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.Comparator; -import java.util.List; +import java.util.*; public class TypeBlockArray extends BlockArray implements JSONConvert, Comparator { private byte mTypeId; + private Boolean mHasComplexEntry; + public TypeBlockArray(){ super(); } + + public Boolean hasComplexEntry(){ + if(mHasComplexEntry != null){ + return mHasComplexEntry; + } + for(TypeBlock typeBlock : listItems(true)){ + Boolean hasComplex = typeBlock.getEntryArray().hasComplexEntry(); + if(hasComplex != null){ + mHasComplexEntry = hasComplex; + } + } + return mHasComplexEntry; + } public void destroy(){ for(TypeBlock typeBlock:listItems()){ if(typeBlock!=null){ diff --git a/src/main/java/com/reandroid/arsc/chunk/TypeBlock.java b/src/main/java/com/reandroid/arsc/chunk/TypeBlock.java index 460ac1a..74bb3a6 100755 --- a/src/main/java/com/reandroid/arsc/chunk/TypeBlock.java +++ b/src/main/java/com/reandroid/arsc/chunk/TypeBlock.java @@ -18,12 +18,8 @@ package com.reandroid.arsc.chunk; import com.reandroid.arsc.array.EntryArray; import com.reandroid.arsc.array.OffsetArray; import com.reandroid.arsc.array.SparseOffsetsArray; -import com.reandroid.arsc.base.Block; import com.reandroid.arsc.container.SpecTypePair; -import com.reandroid.arsc.group.EntryGroup; import com.reandroid.arsc.header.TypeHeader; -import com.reandroid.arsc.io.BlockLoad; -import com.reandroid.arsc.io.BlockReader; import com.reandroid.arsc.item.*; import com.reandroid.arsc.pool.SpecStringPool; import com.reandroid.arsc.pool.TableStringPool; @@ -199,7 +195,10 @@ public class TypeBlock extends Chunk .getSpecStringPool().getOrCreate(name); entry = getOrCreateEntry((short) id); if(entry.isNull()){ - entry.ensureComplex(getEntryArray().hasComplexEntry()); + Boolean hasComplex = hasComplexEntry(); + if(hasComplex != null){ + entry.ensureComplex(hasComplex); + } } entry.setSpecReference(specString.getIndex()); return entry; @@ -216,6 +215,13 @@ public class TypeBlock extends Chunk public Entry getEntry(String entryName){ return getEntryArray().getEntry(entryName); } + public Boolean hasComplexEntry(){ + SpecTypePair specTypePair = getParentSpecTypePair(); + if(specTypePair != null){ + return specTypePair.hasComplexEntry(); + } + return null; + } public ResConfig getResConfig(){ return getHeaderBlock().getConfig(); } diff --git a/src/main/java/com/reandroid/arsc/container/SpecTypePair.java b/src/main/java/com/reandroid/arsc/container/SpecTypePair.java index 7403e39..bc24bab 100755 --- a/src/main/java/com/reandroid/arsc/container/SpecTypePair.java +++ b/src/main/java/com/reandroid/arsc/container/SpecTypePair.java @@ -57,6 +57,9 @@ public class SpecTypePair extends BlockContainer this(new SpecBlock(), new TypeBlockArray()); } + public Boolean hasComplexEntry(){ + return getTypeBlockArray().hasComplexEntry(); + } public void linkTableStringsInternal(TableStringPool tableStringPool){ for(TypeBlock typeBlock:listTypeBlocks()){ typeBlock.linkTableStringsInternal(tableStringPool);