From dc911e861e5667ea56012871a24c82b09685973f Mon Sep 17 00:00:00 2001 From: REAndroid Date: Fri, 3 Mar 2023 08:01:01 -0500 Subject: [PATCH] merge and convert resource spec --- .../com/reandroid/arsc/array/EntryArray.java | 8 +- .../arsc/array/SpecTypePairArray.java | 10 ++- .../com/reandroid/arsc/chunk/SpecBlock.java | 13 ++++ .../arsc/container/SpecTypePair.java | 11 ++- .../com/reandroid/arsc/item/IntegerArray.java | 4 + .../reandroid/arsc/item/SpecFlagsArray.java | 77 ++++++++++++++++++- .../java/com/reandroid/arsc/value/Entry.java | 2 + 7 files changed, 110 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/reandroid/arsc/array/EntryArray.java b/src/main/java/com/reandroid/arsc/array/EntryArray.java index 59b8559..97986c9 100755 --- a/src/main/java/com/reandroid/arsc/array/EntryArray.java +++ b/src/main/java/com/reandroid/arsc/array/EntryArray.java @@ -89,12 +89,13 @@ public class EntryArray extends OffsetBlockArray implements JSONConvert implements JSONConvert implements JSONConvert JSONArray jsonArray=new JSONArray(); int i=0; for(SpecTypePair specTypePair:listItems()){ - JSONObject jsonObject= specTypePair.toJson(); + JSONObject jsonObject = specTypePair.toJson(); if(jsonObject==null){ continue; } @@ -232,10 +233,11 @@ public class SpecTypePairArray extends BlockArray return; } int length = json.length(); - ensureSize(length); for (int i=0;i @Override public JSONObject toJson() { JSONObject jsonObject=new JSONObject(); - jsonObject.put("id", getSpecBlock().getId()); - jsonObject.put("types", getTypeBlockArray().toJson()); + jsonObject.put(SpecBlock.NAME_spec, getSpecBlock().toJson()); + jsonObject.put(NAME_types, getTypeBlockArray().toJson()); return jsonObject; } @Override public void fromJson(JSONObject json) { - getSpecBlock().setTypeId((byte) json.getInt("id")); - getTypeBlockArray().fromJson(json.getJSONArray("types")); + getSpecBlock().fromJson(json.getJSONObject(SpecBlock.NAME_spec)); + getTypeBlockArray().fromJson(json.getJSONArray(NAME_types)); } public void merge(SpecTypePair typePair){ if(typePair==null||typePair==this){ @@ -213,6 +213,7 @@ public class SpecTypePair extends BlockContainer throw new IllegalArgumentException("Can not merge different id types: " +getTypeId()+"!="+typePair.getTypeId()); } + getSpecBlock().merge(typePair.getSpecBlock()); getTypeBlockArray().merge(typePair.getTypeBlockArray()); } @Override @@ -234,4 +235,6 @@ public class SpecTypePair extends BlockContainer builder.append(getTypeBlockArray().childesCount()); return builder.toString(); } + + public static final String NAME_types = "types"; } diff --git a/src/main/java/com/reandroid/arsc/item/IntegerArray.java b/src/main/java/com/reandroid/arsc/item/IntegerArray.java index db3f926..4085933 100755 --- a/src/main/java/com/reandroid/arsc/item/IntegerArray.java +++ b/src/main/java/com/reandroid/arsc/item/IntegerArray.java @@ -124,4 +124,8 @@ public class IntegerArray extends BlockItem { bts[i+1]= (byte) (value >>> 8 & 0xff); bts[i]= (byte) (value & 0xff); } + @Override + public String toString(){ + return "size="+size(); + } } diff --git a/src/main/java/com/reandroid/arsc/item/SpecFlagsArray.java b/src/main/java/com/reandroid/arsc/item/SpecFlagsArray.java index 2e33851..4702958 100644 --- a/src/main/java/com/reandroid/arsc/item/SpecFlagsArray.java +++ b/src/main/java/com/reandroid/arsc/item/SpecFlagsArray.java @@ -16,12 +16,17 @@ package com.reandroid.arsc.item; import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.chunk.SpecBlock; import com.reandroid.arsc.io.BlockLoad; import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.value.Entry; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONObject; import java.io.IOException; -public class SpecFlagsArray extends IntegerArray implements BlockLoad { +public class SpecFlagsArray extends IntegerArray implements BlockLoad, JSONConvert { private final IntegerItem entryCount; public SpecFlagsArray(IntegerItem entryCount) { super(); @@ -30,11 +35,14 @@ public class SpecFlagsArray extends IntegerArray implements BlockLoad { setBlockLoad(this); } public void set(int entryId, int value){ - entryId = 0xffff & entryId; - ensureArraySize(entryId); - super.put(entryId, value); + setFlag(entryId, value); refresh(); } + private void setFlag(int id, int flag){ + id = 0xffff & id; + ensureArraySize(id+1); + super.put(id, flag); + } @Override public Integer get(int entryId){ entryId = 0xffff & entryId; @@ -49,4 +57,65 @@ public class SpecFlagsArray extends IntegerArray implements BlockLoad { public void refresh(){ entryCount.set(size()); } + + public void merge(SpecFlagsArray specFlagsArray){ + if(specFlagsArray == null || specFlagsArray==this){ + return; + } + this.ensureArraySize(specFlagsArray.size()); + int[] comingValues = specFlagsArray.toArray(); + int[] existValues = this.toArray(); + for(int i=0; i