mirror of
https://github.com/revanced/ARSCLib.git
synced 2025-05-01 14:44:27 +02:00
211 lines
5.8 KiB
Java
Executable File
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;
|
|
|
|
}
|