implement json conversion on StagedAlias

This commit is contained in:
REAndroid 2022-12-29 12:08:01 -05:00
parent 33817b36d8
commit e841b12f03
4 changed files with 83 additions and 8 deletions

View File

@ -21,10 +21,13 @@
import com.reandroid.lib.arsc.io.BlockReader;
import com.reandroid.lib.arsc.item.IntegerItem;
import com.reandroid.lib.arsc.value.StagedAliasEntry;
import com.reandroid.lib.json.JSONArray;
import com.reandroid.lib.json.JSONConvert;
import java.io.IOException;
public class StagedAliasEntryArray extends BlockArray<StagedAliasEntry> implements BlockLoad {
public class StagedAliasEntryArray extends BlockArray<StagedAliasEntry>
implements BlockLoad, JSONConvert<JSONArray> {
private final IntegerItem count;
public StagedAliasEntryArray(IntegerItem count){
super();
@ -57,4 +60,29 @@
private void updateCount(){
this.count.set(childesCount());
}
@Override
public JSONArray toJson() {
StagedAliasEntry[] childes=getChildes();
if(childes==null||childes.length==0){
return null;
}
JSONArray jsonArray=new JSONArray();
for(int i=0;i<childes.length;i++){
jsonArray.put(i, childes[i].toJson());
}
return jsonArray;
}
@Override
public void fromJson(JSONArray json) {
clearChildes();
if(json==null){
return;
}
int length = json.length();
setChildesCount(length);
for(int i=0;i<length;i++){
get(i).fromJson(json.getJSONObject(i));
}
}
}

View File

@ -33,6 +33,7 @@ package com.reandroid.lib.arsc.chunk;
import com.reandroid.lib.arsc.pool.TypeStringPool;
import com.reandroid.lib.arsc.value.EntryBlock;
import com.reandroid.lib.arsc.value.LibraryInfo;
import com.reandroid.lib.json.JSONArray;
import com.reandroid.lib.json.JSONConvert;
import com.reandroid.lib.json.JSONObject;
@ -289,11 +290,11 @@ package com.reandroid.lib.arsc.chunk;
mSpecStringPoolCount.set(mSpecStringPool.countStrings());
}
private void refreshTypeIdOffset(){
int smallestId=getSpecTypePairArray().getSmallestTypeId();
if(smallestId>0){
smallestId=smallestId-1;
}
mTypeIdOffset.set(smallestId);
// TODO: find solution
//int largest=getSpecTypePairArray().getHighestTypeId();
//int count=getTypeStringPool().countStrings();
//mTypeIdOffset.set(count-largest);
mTypeIdOffset.set(0);
}
public void onEntryAdded(EntryBlock entryBlock){
updateEntry(entryBlock);
@ -321,6 +322,12 @@ package com.reandroid.lib.arsc.chunk;
if(libraryInfoArray.childesCount()>0){
jsonObject.put(NAME_libraries,libraryInfoArray.toJson());
}
StagedAlias stagedAlias =
StagedAlias.mergeAll(getStagedAliasList().getChildes());
if(stagedAlias!=null){
jsonObject.put(NAME_staged_aliases,
stagedAlias.getStagedAliasEntryArray().toJson());
}
return jsonObject;
}
@Override
@ -330,6 +337,12 @@ package com.reandroid.lib.arsc.chunk;
getSpecTypePairArray().fromJson(json.getJSONArray(NAME_specs));
LibraryInfoArray libraryInfoArray = mLibraryBlock.getLibraryInfoArray();
libraryInfoArray.fromJson(json.optJSONArray(NAME_libraries));
if(json.has(NAME_staged_aliases)){
StagedAlias stagedAlias=new StagedAlias();
stagedAlias.getStagedAliasEntryArray()
.fromJson(json.getJSONArray(NAME_staged_aliases));
mStagedAliasList.add(stagedAlias);
}
}
public void merge(PackageBlock packageBlock){
if(packageBlock==null||packageBlock==this){
@ -376,4 +389,5 @@ package com.reandroid.lib.arsc.chunk;
public static final String JSON_FILE_NAME = "package.json";
private static final String NAME_specs="specs";
private static final String NAME_libraries="libraries";
private static final String NAME_staged_aliases="staged_aliases";
}

View File

@ -30,7 +30,7 @@
stagedAliasEntryArray = new StagedAliasEntryArray(count);
addChild(stagedAliasEntryArray);
}
public void addStagedAliasEntries(StagedAlias stagedAlias){
public void merge(StagedAlias stagedAlias){
if(stagedAlias==null||stagedAlias==this){
return;
}
@ -58,4 +58,21 @@
return getClass().getSimpleName()+
": count="+getStagedAliasEntryCount();
}
public static StagedAlias mergeAll(Collection<StagedAlias> stagedAliasList){
if(stagedAliasList.size()==0){
return null;
}
StagedAlias result=new StagedAlias();
for(StagedAlias stagedAlias:stagedAliasList){
if(stagedAlias.isNull()){
continue;
}
result.merge(stagedAlias);
}
if(!result.isNull()){
result.refresh();
return result;
}
return null;
}
}

View File

@ -1,8 +1,10 @@
package com.reandroid.lib.arsc.value;
import com.reandroid.lib.arsc.item.ByteArray;
import com.reandroid.lib.json.JSONConvert;
import com.reandroid.lib.json.JSONObject;
public class StagedAliasEntry extends ByteArray {
public class StagedAliasEntry extends ByteArray implements JSONConvert<JSONObject> {
public StagedAliasEntry(){
super(8);
}
@ -23,4 +25,18 @@ public class StagedAliasEntry extends ByteArray {
return "stagedResId="+String.format("0x%08x",getStagedResId())
+", finalizedResId="+String.format("0x%08x",getFinalizedResId());
}
@Override
public JSONObject toJson() {
JSONObject jsonObject=new JSONObject();
jsonObject.put(NAME_staged_resource_id, getStagedResId());
jsonObject.put(NAME_finalized_resource_id, getFinalizedResId());
return jsonObject;
}
@Override
public void fromJson(JSONObject json) {
setStagedResId(json.getInt(NAME_staged_resource_id));
setFinalizedResId(json.getInt(NAME_finalized_resource_id));
}
public static final String NAME_staged_resource_id = "staged_resource_id";
public static final String NAME_finalized_resource_id = "finalized_resource_id";
}