split StringPoolHeader flags to single byte

This commit is contained in:
REAndroid 2023-02-18 08:26:19 -05:00
parent 997ed231aa
commit 168ae6f6da
2 changed files with 48 additions and 32 deletions

View File

@ -16,29 +16,34 @@
package com.reandroid.arsc.header; package com.reandroid.arsc.header;
import com.reandroid.arsc.chunk.ChunkType; import com.reandroid.arsc.chunk.ChunkType;
import com.reandroid.arsc.item.ByteItem;
import com.reandroid.arsc.item.IntegerItem; import com.reandroid.arsc.item.IntegerItem;
import com.reandroid.arsc.item.ShortItem; import com.reandroid.arsc.item.ShortItem;
public class StringPoolHeader extends HeaderBlock{ public class StringPoolHeader extends HeaderBlock{
private final IntegerItem countStrings; private final IntegerItem countStrings;
private final IntegerItem countStyles; private final IntegerItem countStyles;
private final ShortItem flagUtf8; private final ByteItem flagSorted;
private final ShortItem flagSorted; private final ByteItem flagUtf8;
private final ShortItem flagExtra;
private final IntegerItem startStrings; private final IntegerItem startStrings;
private final IntegerItem startStyles; private final IntegerItem startStyles;
public StringPoolHeader() { public StringPoolHeader() {
super(ChunkType.STRING.ID); super(ChunkType.STRING.ID);
this.countStrings = new IntegerItem(); this.countStrings = new IntegerItem();
this.countStyles = new IntegerItem(); this.countStyles = new IntegerItem();
this.flagUtf8 = new ShortItem(); this.flagSorted = new ByteItem();
this.flagSorted = new ShortItem(); this.flagUtf8 = new ByteItem();
this.flagExtra = new ShortItem();
this.startStrings = new IntegerItem(); this.startStrings = new IntegerItem();
this.startStyles = new IntegerItem(); this.startStyles = new IntegerItem();
addChild(countStrings); addChild(countStrings);
addChild(countStyles); addChild(countStyles);
addChild(flagUtf8);
addChild(flagSorted); addChild(flagSorted);
addChild(flagUtf8);
addChild(flagExtra);
addChild(startStrings); addChild(startStrings);
addChild(startStyles); addChild(startStyles);
} }
@ -48,18 +53,35 @@ public class StringPoolHeader extends HeaderBlock{
public IntegerItem getCountStyles() { public IntegerItem getCountStyles() {
return countStyles; return countStyles;
} }
public ShortItem getFlagUtf8() { public ByteItem getFlagUtf8() {
return flagUtf8; return flagUtf8;
} }
public ShortItem getFlagSorted() { public ByteItem getFlagSorted() {
return flagSorted; return flagSorted;
} }
public ShortItem getFlagExtra(){
return flagExtra;
}
public IntegerItem getStartStrings() { public IntegerItem getStartStrings() {
return startStrings; return startStrings;
} }
public IntegerItem getStartStyles() { public IntegerItem getStartStyles() {
return startStyles; 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 @Override
public String toString(){ public String toString(){
if(getChunkType()!=ChunkType.STRING){ if(getChunkType()!=ChunkType.STRING){
@ -68,8 +90,9 @@ public class StringPoolHeader extends HeaderBlock{
return getClass().getSimpleName() return getClass().getSimpleName()
+" {strings="+getCountStrings() +" {strings="+getCountStrings()
+", styles="+getCountStyles() +", styles="+getCountStyles()
+", utf8="+getFlagUtf8().toHex() +", utf8="+isUtf8()
+", sorted="+getFlagSorted().toHex() +", sorted="+isSorted()
+", flagExtra="+getFlagExtra().toHex()
+", offset-strings="+getStartStrings().get() +", offset-strings="+getStartStrings().get()
+", offset-styles="+getStartStyles().get() + '}'; +", offset-styles="+getStartStyles().get() + '}';
} }

View File

@ -244,30 +244,26 @@ package com.reandroid.arsc.pool;
public void setUtf8(boolean is_utf8){ public void setUtf8(boolean is_utf8){
setUtf8(is_utf8, true); 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){ private void setUtf8(boolean is_utf8, boolean updateAll){
ShortItem flagUtf8 = getHeaderBlock().getFlagUtf8(); StringPoolHeader header = getHeaderBlock();
boolean old = isUtf8Flag(); if(is_utf8 == header.isUtf8()){
if(is_utf8){ return;
flagUtf8.set(UTF8_FLAG_VALUE);
}else {
flagUtf8.set((short) 0);
} }
if(!updateAll || old == isUtf8Flag()){ ByteItem flagUtf8 = header.getFlagUtf8();
if(is_utf8){
flagUtf8.set((byte) 0x01);
}else {
flagUtf8.set((byte) 0x00);
}
if(!updateAll){
return; return;
} }
mArrayStrings.setUtf8(is_utf8); mArrayStrings.setUtf8(is_utf8);
} }
private boolean isUtf8Flag(){ public void setFlagSorted(boolean sorted){
return (getHeaderBlock().getFlagUtf8().get() & FLAG_UTF8) !=0; getHeaderBlock().setSorted(sorted);
} }
abstract StringArray<T> newInstance(IntegerArray offsets, IntegerItem itemCount, IntegerItem itemStart, boolean is_utf8); abstract StringArray<T> newInstance(IntegerArray offsets, IntegerItem itemCount, IntegerItem itemStart, boolean is_utf8);
@Override @Override
protected void onChunkRefreshed() { protected void onChunkRefreshed() {
@ -287,8 +283,9 @@ package com.reandroid.arsc.pool;
@Override @Override
public void onBlockLoaded(BlockReader reader, Block sender) throws IOException { public void onBlockLoaded(BlockReader reader, Block sender) throws IOException {
if(sender == getHeaderBlock().getFlagUtf8()){ StringPoolHeader header = getHeaderBlock();
mArrayStrings.setUtf8(isUtf8Flag()); if(sender == header.getFlagUtf8()){
mArrayStrings.setUtf8(header.isUtf8());
} }
} }
@Override @Override
@ -310,8 +307,4 @@ package com.reandroid.arsc.pool;
return s1.compareTo(s2); 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;
} }