diff --git a/src/main/java/com/reandroid/lib/arsc/array/StagedAliasEntryArray.java b/src/main/java/com/reandroid/lib/arsc/array/StagedAliasEntryArray.java index 9b977c7..ce11d4d 100644 --- a/src/main/java/com/reandroid/lib/arsc/array/StagedAliasEntryArray.java +++ b/src/main/java/com/reandroid/lib/arsc/array/StagedAliasEntryArray.java @@ -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 implements BlockLoad { + public class StagedAliasEntryArray extends BlockArray + implements BlockLoad, JSONConvert { 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;i0){ - 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"; } diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/StagedAlias.java b/src/main/java/com/reandroid/lib/arsc/chunk/StagedAlias.java index c9d856c..35a1d1a 100644 --- a/src/main/java/com/reandroid/lib/arsc/chunk/StagedAlias.java +++ b/src/main/java/com/reandroid/lib/arsc/chunk/StagedAlias.java @@ -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 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; + } } diff --git a/src/main/java/com/reandroid/lib/arsc/value/StagedAliasEntry.java b/src/main/java/com/reandroid/lib/arsc/value/StagedAliasEntry.java index a8be2f7..53ad8f9 100644 --- a/src/main/java/com/reandroid/lib/arsc/value/StagedAliasEntry.java +++ b/src/main/java/com/reandroid/lib/arsc/value/StagedAliasEntry.java @@ -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 { 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"; }