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;
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() + '}';
}

View File

@ -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<T> 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;
}