ARSCLib/src/main/java/com/reandroid/lib/arsc/value/ResValueBagItem.java
2022-11-30 11:11:23 -05:00

211 lines
5.8 KiB
Java
Executable File

package com.reandroid.lib.arsc.value;
import com.reandroid.lib.arsc.base.Block;
import com.reandroid.lib.arsc.item.ReferenceItem;
import com.reandroid.lib.arsc.item.TableString;
import org.json.JSONObject;
public class ResValueBagItem extends BaseResValueItem{
public ResValueBagItem() {
super(BYTES_COUNT);
setHeaderSize(BYTES_SIZE);
}
public String getValueAsString(){
return getTableString(getData()).getHtml();
}
public void setValueAsString(String str){
setType(ValueType.STRING);
TableString tableString=getTableStringPool().getOrCreate(str);
setData(tableString.getIndex());
}
public boolean getValueAsBoolean(){
return getData()!=0;
}
public void setValueAsBoolean(boolean val){
setType(ValueType.INT_BOOLEAN);
int data=val?0xffffffff:0;
setData(data);
}
public ResValueBag getParentBag(){
Block parent=getParent();
while(parent!=null){
if(parent instanceof ResValueBag){
return (ResValueBag) parent;
}
parent=parent.getParent();
}
return null;
}
@Override
public void setHeaderSize(short size) {
setShort(OFFSET_SIZE, size);
}
@Override
public short getHeaderSize() {
return getShort(OFFSET_SIZE);
}
@Override
public void setReserved(byte reserved) {
setByte(OFFSET_RESERVED, reserved);
}
@Override
public byte getReserved() {
return getByte(OFFSET_RESERVED);
}
public void setId(int id){
setInt(OFFSET_ID, id);
}
public int getId(){
return getInt(OFFSET_ID);
}
@Override
public void setType(ValueType valueType){
byte type=0;
if(valueType!=null){
type=valueType.getByte();
}
setType(type);
}
@Override
public void setType(byte type){
byte old=getType();
if(type==old){
return;
}
removeTableReference();
setByte(OFFSET_TYPE, type);
if(type==ValueType.STRING.getByte()){
ReferenceItem ref=getTableStringReference();
removeTableReference(ref);
}
}
@Override
public byte getType(){
return getByte(OFFSET_TYPE);
}
@Override
public int getData(){
return getInt(OFFSET_DATA);
}
@Override
public void setData(int data){
int old=getData();
if(data==old){
return;
}
beforeDataValueChanged();
setInt(OFFSET_DATA, data);
afterDataValueChanged();
}
private void beforeDataValueChanged(){
if(getValueType()==ValueType.STRING){
removeTableReference();
}
}
private void afterDataValueChanged(){
if(getValueType()==ValueType.STRING){
addTableReference(getTableStringReference());
}
}
public short getIdHigh(){
return getShort(OFFSET_ID+2);
}
public short getIdLow(){
return getShort(OFFSET_ID);
}
public void setIdHigh(short val){
setShort(OFFSET_ID+2, val);
}
public void setIdLow(short val){
setShort(OFFSET_ID, val);
}
public short getDataHigh(){
return getShort(OFFSET_DATA+2);
}
public short getDataLow(){
return getShort(OFFSET_DATA);
}
public void setDataHigh(short val){
if(val==getDataHigh()){
return;
}
beforeDataValueChanged();
setShort(OFFSET_DATA+2, val);
afterDataValueChanged();
}
public void setDataLow(short val){
if(val==getDataLow()){
return;
}
beforeDataValueChanged();
setShort(OFFSET_DATA+2, val);
afterDataValueChanged();
}
@Override
public JSONObject toJson() {
if(isNull()){
return null;
}
JSONObject jsonObject=new JSONObject();
ValueType valueType=getValueType();
jsonObject.put(NAME_value_type, valueType.name());
jsonObject.put(NAME_id, getId());
if(valueType==ValueType.STRING){
jsonObject.put(NAME_data, getValueAsString());
}else if(valueType==ValueType.INT_BOOLEAN){
jsonObject.put(NAME_data, getValueAsBoolean());
}else {
jsonObject.put(NAME_data, getData());
}
return jsonObject;
}
@Override
public void fromJson(JSONObject json) {
ValueType valueType=ValueType.fromName(json.getString(NAME_value_type));
setType(valueType);
setId(json.getInt(NAME_id));
if(valueType==ValueType.STRING){
setValueAsString(json.getString(NAME_data));
}else if(valueType==ValueType.INT_BOOLEAN){
setValueAsBoolean(json.getBoolean(NAME_data));
}else {
setData(json.getInt(NAME_data));
}
}
@Override
public String toString(){
StringBuilder builder=new StringBuilder();
builder.append(getClass().getSimpleName());
builder.append(" type=");
ValueType vt=getValueType();
if(vt!=null){
builder.append(vt.name());
}else {
builder.append("Unknown");
}
builder.append('(');
builder.append(String.format("0x%02x", getType()));
builder.append(") id=");
builder.append(String.format("0x%08x", getId()));
builder.append(", data=");
builder.append(String.format("0x%08x", getData()));
return builder.toString();
}
private static final int OFFSET_ID=0;
private static final int OFFSET_SIZE=4;
private static final int OFFSET_RESERVED=6;
private static final int OFFSET_TYPE=7;
private static final int OFFSET_DATA=8;
private static final int BYTES_COUNT=12;
private static final short BYTES_SIZE=0x08;
}