diff --git a/src/main/java/com/reandroid/arsc/header/StringPoolHeader.java b/src/main/java/com/reandroid/arsc/header/StringPoolHeader.java index 1fd21cf..09c41f6 100644 --- a/src/main/java/com/reandroid/arsc/header/StringPoolHeader.java +++ b/src/main/java/com/reandroid/arsc/header/StringPoolHeader.java @@ -16,29 +16,34 @@ package com.reandroid.arsc.header; import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.item.ByteItem; import com.reandroid.arsc.item.IntegerItem; import com.reandroid.arsc.item.ShortItem; + public class StringPoolHeader extends HeaderBlock{ private final IntegerItem countStrings; private final IntegerItem countStyles; - private final ShortItem flagUtf8; - private final ShortItem flagSorted; + private final ByteItem flagSorted; + private final ByteItem flagUtf8; + private final ShortItem flagExtra; private final IntegerItem startStrings; private final IntegerItem startStyles; public StringPoolHeader() { super(ChunkType.STRING.ID); this.countStrings = new IntegerItem(); this.countStyles = new IntegerItem(); - this.flagUtf8 = new ShortItem(); - this.flagSorted = new ShortItem(); + this.flagSorted = new ByteItem(); + this.flagUtf8 = new ByteItem(); + this.flagExtra = new ShortItem(); this.startStrings = new IntegerItem(); this.startStyles = new IntegerItem(); addChild(countStrings); addChild(countStyles); - addChild(flagUtf8); addChild(flagSorted); + addChild(flagUtf8); + addChild(flagExtra); addChild(startStrings); addChild(startStyles); } @@ -48,18 +53,35 @@ public class StringPoolHeader extends HeaderBlock{ public IntegerItem getCountStyles() { return countStyles; } - public ShortItem getFlagUtf8() { + public ByteItem getFlagUtf8() { return flagUtf8; } - public ShortItem getFlagSorted() { + public ByteItem getFlagSorted() { return flagSorted; } + public ShortItem getFlagExtra(){ + return flagExtra; + } public IntegerItem getStartStrings() { return startStrings; } public IntegerItem getStartStyles() { return startStyles; } + + public boolean isUtf8(){ + return (getFlagUtf8().get() & 0x01) !=0; + } + public void setUtf8(boolean utf8){ + getFlagUtf8().set((byte) (utf8 ? 0x01 : 0x00)); + } + public boolean isSorted(){ + return (getFlagSorted().get() & 0x01) !=0; + } + public void setSorted(boolean sorted){ + getFlagSorted().set((byte) (sorted ? 0x01 : 0x00)); + } + @Override public String toString(){ if(getChunkType()!=ChunkType.STRING){ @@ -68,8 +90,9 @@ public class StringPoolHeader extends HeaderBlock{ return getClass().getSimpleName() +" {strings="+getCountStrings() +", styles="+getCountStyles() - +", utf8="+getFlagUtf8().toHex() - +", sorted="+getFlagSorted().toHex() + +", utf8="+isUtf8() + +", sorted="+isSorted() + +", flagExtra="+getFlagExtra().toHex() +", offset-strings="+getStartStrings().get() +", offset-styles="+getStartStyles().get() + '}'; } diff --git a/src/main/java/com/reandroid/arsc/pool/StringPool.java b/src/main/java/com/reandroid/arsc/pool/StringPool.java index a9d490c..61dd028 100755 --- a/src/main/java/com/reandroid/arsc/pool/StringPool.java +++ b/src/main/java/com/reandroid/arsc/pool/StringPool.java @@ -244,30 +244,26 @@ package com.reandroid.arsc.pool; public void setUtf8(boolean is_utf8){ setUtf8(is_utf8, true); } - public final void setSorted(boolean sorted){ - ShortItem flagSorted = getHeaderBlock().getFlagSorted(); - if(sorted){ - flagSorted.set(FLAG_SORTED); - }else { - flagSorted.set((short)0); - } - } private void setUtf8(boolean is_utf8, boolean updateAll){ - ShortItem flagUtf8 = getHeaderBlock().getFlagUtf8(); - boolean old = isUtf8Flag(); - if(is_utf8){ - flagUtf8.set(UTF8_FLAG_VALUE); - }else { - flagUtf8.set((short) 0); + StringPoolHeader header = getHeaderBlock(); + if(is_utf8 == header.isUtf8()){ + return; } - if(!updateAll || old == isUtf8Flag()){ + ByteItem flagUtf8 = header.getFlagUtf8(); + if(is_utf8){ + flagUtf8.set((byte) 0x01); + }else { + flagUtf8.set((byte) 0x00); + } + if(!updateAll){ return; } mArrayStrings.setUtf8(is_utf8); } - private boolean isUtf8Flag(){ - return (getHeaderBlock().getFlagUtf8().get() & FLAG_UTF8) !=0; + public void setFlagSorted(boolean sorted){ + getHeaderBlock().setSorted(sorted); } + abstract StringArray newInstance(IntegerArray offsets, IntegerItem itemCount, IntegerItem itemStart, boolean is_utf8); @Override protected void onChunkRefreshed() { @@ -287,8 +283,9 @@ package com.reandroid.arsc.pool; @Override public void onBlockLoaded(BlockReader reader, Block sender) throws IOException { - if(sender == getHeaderBlock().getFlagUtf8()){ - mArrayStrings.setUtf8(isUtf8Flag()); + StringPoolHeader header = getHeaderBlock(); + if(sender == header.getFlagUtf8()){ + mArrayStrings.setUtf8(header.isUtf8()); } } @Override @@ -310,8 +307,4 @@ package com.reandroid.arsc.pool; return s1.compareTo(s2); } - private static final short UTF8_FLAG_VALUE=0x0100; - - private static final short FLAG_UTF8 = 0x0100; - private static final short FLAG_SORTED = 0x0100; }