mirror of
https://github.com/revanced/ARSCLib.git
synced 2025-05-01 14:44:27 +02:00
Entries
This commit is contained in:
parent
2fccb3e6b7
commit
2e8ecc6e40
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https://services.gradle.org/distributions/gradle-6.5.1-all.zip
|
distributionUrl=file:///home/d/services.gradle.org/distributions/gradle-6.5.1-all.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
@ -4,6 +4,8 @@ import com.reandroid.lib.arsc.array.LibraryInfoArray;
|
|||||||
import com.reandroid.lib.arsc.item.IntegerItem;
|
import com.reandroid.lib.arsc.item.IntegerItem;
|
||||||
import com.reandroid.lib.arsc.value.LibraryInfo;
|
import com.reandroid.lib.arsc.value.LibraryInfo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class LibraryBlock extends BaseChunk {
|
public class LibraryBlock extends BaseChunk {
|
||||||
private final IntegerItem mLibCount;
|
private final IntegerItem mLibCount;
|
||||||
private final LibraryInfoArray mLibraryInfoArray;
|
private final LibraryInfoArray mLibraryInfoArray;
|
||||||
@ -37,6 +39,9 @@ public class LibraryBlock extends BaseChunk {
|
|||||||
mLibraryInfoArray.add(info);
|
mLibraryInfoArray.add(info);
|
||||||
mLibCount.set(mLibraryInfoArray.childesCount());
|
mLibCount.set(mLibraryInfoArray.childesCount());
|
||||||
}
|
}
|
||||||
|
public List<LibraryInfo> listLibraryInfo(){
|
||||||
|
return mLibraryInfoArray.listItems();
|
||||||
|
}
|
||||||
@Override
|
@Override
|
||||||
public boolean isNull(){
|
public boolean isNull(){
|
||||||
return mLibraryInfoArray.childesCount()==0;
|
return mLibraryInfoArray.childesCount()==0;
|
||||||
|
@ -3,12 +3,18 @@ package com.reandroid.lib.arsc.chunk;
|
|||||||
import com.reandroid.lib.arsc.array.SpecTypePairArray;
|
import com.reandroid.lib.arsc.array.SpecTypePairArray;
|
||||||
import com.reandroid.lib.arsc.base.Block;
|
import com.reandroid.lib.arsc.base.Block;
|
||||||
import com.reandroid.lib.arsc.container.PackageLastBlocks;
|
import com.reandroid.lib.arsc.container.PackageLastBlocks;
|
||||||
|
import com.reandroid.lib.arsc.container.SpecTypePair;
|
||||||
|
import com.reandroid.lib.arsc.group.EntryGroup;
|
||||||
|
import com.reandroid.lib.arsc.group.ItemGroup;
|
||||||
import com.reandroid.lib.arsc.item.IntegerItem;
|
import com.reandroid.lib.arsc.item.IntegerItem;
|
||||||
import com.reandroid.lib.arsc.item.PackageName;
|
import com.reandroid.lib.arsc.item.PackageName;
|
||||||
import com.reandroid.lib.arsc.pool.SpecStringPool;
|
import com.reandroid.lib.arsc.pool.SpecStringPool;
|
||||||
import com.reandroid.lib.arsc.pool.TypeStringPool;
|
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.arsc.value.LibraryInfo;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
public class PackageBlock extends BaseChunk {
|
public class PackageBlock extends BaseChunk {
|
||||||
private final IntegerItem mPackageId;
|
private final IntegerItem mPackageId;
|
||||||
@ -28,6 +34,8 @@ public class PackageBlock extends BaseChunk {
|
|||||||
|
|
||||||
private final PackageLastBlocks mPackageLastBlocks;
|
private final PackageLastBlocks mPackageLastBlocks;
|
||||||
|
|
||||||
|
private final Map<Integer, EntryGroup> mEntriesGroup;
|
||||||
|
|
||||||
public PackageBlock() {
|
public PackageBlock() {
|
||||||
super(ChunkType.PACKAGE, 3);
|
super(ChunkType.PACKAGE, 3);
|
||||||
this.mPackageId=new IntegerItem();
|
this.mPackageId=new IntegerItem();
|
||||||
@ -45,6 +53,8 @@ public class PackageBlock extends BaseChunk {
|
|||||||
this.mLibraryBlock=new LibraryBlock();
|
this.mLibraryBlock=new LibraryBlock();
|
||||||
this.mPackageLastBlocks=new PackageLastBlocks(mSpecTypePairArray, mLibraryBlock);
|
this.mPackageLastBlocks=new PackageLastBlocks(mSpecTypePairArray, mLibraryBlock);
|
||||||
|
|
||||||
|
this.mEntriesGroup=new HashMap<>();
|
||||||
|
|
||||||
addToHeader(mPackageId);
|
addToHeader(mPackageId);
|
||||||
addToHeader(mPackageName);
|
addToHeader(mPackageName);
|
||||||
addToHeader(mTypeStrings);
|
addToHeader(mTypeStrings);
|
||||||
@ -83,12 +93,57 @@ public class PackageBlock extends BaseChunk {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
public int getPackageId(){
|
||||||
|
return mPackageId.get();
|
||||||
|
}
|
||||||
|
public int setPackageId(){
|
||||||
|
return mPackageId.get();
|
||||||
|
}
|
||||||
|
public String getPackageName(){
|
||||||
|
return mPackageName.get();
|
||||||
|
}
|
||||||
|
public void setPackageName(String name){
|
||||||
|
mPackageName.set(name);
|
||||||
|
}
|
||||||
|
public void setTypeStrings(int i){
|
||||||
|
mTypeStrings.set(i);
|
||||||
|
}
|
||||||
|
public int getLastPublicType(){
|
||||||
|
return mLastPublicType.get();
|
||||||
|
}
|
||||||
|
public void setLastPublicType(int i){
|
||||||
|
mLastPublicType.set(i);
|
||||||
|
}
|
||||||
|
public int getKeyStrings(){
|
||||||
|
return mKeyStrings.get();
|
||||||
|
}
|
||||||
|
public void setKeyStrings(int i){
|
||||||
|
mKeyStrings.set(i);
|
||||||
|
}
|
||||||
|
public int getLastPublicKey(){
|
||||||
|
return mLastPublicKey.get();
|
||||||
|
}
|
||||||
|
public void setLastPublicKey(int i){
|
||||||
|
mLastPublicKey.set(i);
|
||||||
|
}
|
||||||
|
public int getTypeIdOffset(){
|
||||||
|
return mTypeIdOffset.get();
|
||||||
|
}
|
||||||
|
public void setTypeIdOffset(int i){
|
||||||
|
mTypeIdOffset.set(i);
|
||||||
|
}
|
||||||
public TypeStringPool getTypeStringPool(){
|
public TypeStringPool getTypeStringPool(){
|
||||||
return mTypeStringPool;
|
return mTypeStringPool;
|
||||||
}
|
}
|
||||||
public SpecStringPool getSpecStringPool(){
|
public SpecStringPool getSpecStringPool(){
|
||||||
return mSpecStringPool;
|
return mSpecStringPool;
|
||||||
}
|
}
|
||||||
|
public SpecTypePairArray getSpecTypePairArray(){
|
||||||
|
return mSpecTypePairArray;
|
||||||
|
}
|
||||||
|
public List<LibraryInfo> listLibraryInfo(){
|
||||||
|
return mLibraryBlock.listLibraryInfo();
|
||||||
|
}
|
||||||
|
|
||||||
public void addLibrary(LibraryBlock libraryBlock){
|
public void addLibrary(LibraryBlock libraryBlock){
|
||||||
if(libraryBlock==null){
|
if(libraryBlock==null){
|
||||||
@ -105,11 +160,51 @@ public class PackageBlock extends BaseChunk {
|
|||||||
public void addLibraryInfo(LibraryInfo info){
|
public void addLibraryInfo(LibraryInfo info){
|
||||||
mLibraryBlock.addLibraryInfo(info);
|
mLibraryBlock.addLibraryInfo(info);
|
||||||
}
|
}
|
||||||
|
public Set<Integer> listResourceIds(){
|
||||||
|
return mEntriesGroup.keySet();
|
||||||
|
}
|
||||||
|
public Collection<EntryGroup> listEntryGroup(){
|
||||||
|
return mEntriesGroup.values();
|
||||||
|
}
|
||||||
|
public EntryGroup getEntryGroup(int resId){
|
||||||
|
return mEntriesGroup.get(resId);
|
||||||
|
}
|
||||||
|
private void updateEntryGroup(EntryBlock entryBlock){
|
||||||
|
int resId=entryBlock.getResourceId();
|
||||||
|
EntryGroup group=mEntriesGroup.get(resId);
|
||||||
|
if(group==null){
|
||||||
|
group=new EntryGroup(resId);
|
||||||
|
mEntriesGroup.put(resId, group);
|
||||||
|
}
|
||||||
|
group.add(entryBlock);
|
||||||
|
}
|
||||||
|
public List<EntryBlock> listEntries(byte typeId, int entryId){
|
||||||
|
List<EntryBlock> results=new ArrayList<>();
|
||||||
|
for(SpecTypePair pair:listSpecTypePair(typeId)){
|
||||||
|
results.addAll(pair.listEntries(entryId));
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
public List<SpecTypePair> listSpecTypePair(byte typeId){
|
||||||
|
List<SpecTypePair> results=new ArrayList<>();
|
||||||
|
for(SpecTypePair pair:listAllSpecTypePair()){
|
||||||
|
if(typeId==pair.getTypeId()){
|
||||||
|
results.add(pair);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
public List<SpecTypePair> listAllSpecTypePair(){
|
||||||
|
return getSpecTypePairArray().listItems();
|
||||||
|
}
|
||||||
|
|
||||||
private void refreshKeyStrings(){
|
private void refreshKeyStrings(){
|
||||||
int pos=countUpTo(mSpecStringPool);
|
int pos=countUpTo(mSpecStringPool);
|
||||||
mKeyStrings.set(pos);
|
mKeyStrings.set(pos);
|
||||||
}
|
}
|
||||||
|
public void onEntryAdded(EntryBlock entryBlock){
|
||||||
|
updateEntryGroup(entryBlock);
|
||||||
|
}
|
||||||
@Override
|
@Override
|
||||||
public void onChunkLoaded() {
|
public void onChunkLoaded() {
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,12 @@ package com.reandroid.lib.arsc.chunk;
|
|||||||
import com.reandroid.lib.arsc.array.EntryBlockArray;
|
import com.reandroid.lib.arsc.array.EntryBlockArray;
|
||||||
import com.reandroid.lib.arsc.item.IntegerArray;
|
import com.reandroid.lib.arsc.item.IntegerArray;
|
||||||
import com.reandroid.lib.arsc.item.IntegerItem;
|
import com.reandroid.lib.arsc.item.IntegerItem;
|
||||||
|
import com.reandroid.lib.arsc.value.EntryBlock;
|
||||||
import com.reandroid.lib.arsc.value.ResConfig;
|
import com.reandroid.lib.arsc.value.ResConfig;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class TypeBlock extends BaseTypeBlock {
|
public class TypeBlock extends BaseTypeBlock {
|
||||||
private final IntegerItem mEntriesStart;
|
private final IntegerItem mEntriesStart;
|
||||||
private final ResConfig mResConfig;
|
private final ResConfig mResConfig;
|
||||||
@ -29,6 +33,24 @@ public class TypeBlock extends BaseTypeBlock {
|
|||||||
public EntryBlockArray getEntryBlockArray(){
|
public EntryBlockArray getEntryBlockArray(){
|
||||||
return mEntryArray;
|
return mEntryArray;
|
||||||
}
|
}
|
||||||
|
public List<EntryBlock> listEntries(){
|
||||||
|
return listEntries(false);
|
||||||
|
}
|
||||||
|
public List<EntryBlock> listEntries(boolean includeNull){
|
||||||
|
List<EntryBlock> results=new ArrayList<>();
|
||||||
|
for(EntryBlock entryBlock:mEntryArray.listItems()){
|
||||||
|
if(!includeNull){
|
||||||
|
if(entryBlock.isNull()){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
results.add(entryBlock);
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
public EntryBlock getEntryBlock(int entryId){
|
||||||
|
return mEntryArray.get(entryId);
|
||||||
|
}
|
||||||
@Override
|
@Override
|
||||||
void onSetEntryCount(int count) {
|
void onSetEntryCount(int count) {
|
||||||
mEntryArray.setChildesCount(count);
|
mEntryArray.setChildesCount(count);
|
||||||
|
@ -6,11 +6,14 @@ import com.reandroid.lib.arsc.base.Block;
|
|||||||
import com.reandroid.lib.arsc.base.BlockContainer;
|
import com.reandroid.lib.arsc.base.BlockContainer;
|
||||||
import com.reandroid.lib.arsc.chunk.PackageBlock;
|
import com.reandroid.lib.arsc.chunk.PackageBlock;
|
||||||
import com.reandroid.lib.arsc.chunk.SpecBlock;
|
import com.reandroid.lib.arsc.chunk.SpecBlock;
|
||||||
|
import com.reandroid.lib.arsc.chunk.TypeBlock;
|
||||||
import com.reandroid.lib.arsc.header.HeaderBlock;
|
import com.reandroid.lib.arsc.header.HeaderBlock;
|
||||||
import com.reandroid.lib.arsc.io.BlockReader;
|
import com.reandroid.lib.arsc.io.BlockReader;
|
||||||
|
import com.reandroid.lib.arsc.value.EntryBlock;
|
||||||
import com.reandroid.lib.arsc.value.ResConfig;
|
import com.reandroid.lib.arsc.value.ResConfig;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class SpecTypePair extends BlockContainer<Block> {
|
public class SpecTypePair extends BlockContainer<Block> {
|
||||||
@ -55,6 +58,20 @@ public class SpecTypePair extends BlockContainer<Block> {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
public List<EntryBlock> listEntries(int entryId){
|
||||||
|
List<EntryBlock> results=new ArrayList<>();
|
||||||
|
for(TypeBlock typeBlock:listTypeBlocks()){
|
||||||
|
EntryBlock entryBlock=typeBlock.getEntryBlock(entryId);
|
||||||
|
if(entryBlock==null||entryBlock.isNull()){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
results.add(entryBlock);
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
public List<TypeBlock> listTypeBlocks(){
|
||||||
|
return mTypeBlockArray.listItems();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onRefreshed() {
|
protected void onRefreshed() {
|
||||||
|
100
src/main/java/com/reandroid/lib/arsc/group/EntryGroup.java
Normal file
100
src/main/java/com/reandroid/lib/arsc/group/EntryGroup.java
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
package com.reandroid.lib.arsc.group;
|
||||||
|
|
||||||
|
import com.reandroid.lib.arsc.base.BlockArrayCreator;
|
||||||
|
import com.reandroid.lib.arsc.chunk.PackageBlock;
|
||||||
|
import com.reandroid.lib.arsc.chunk.TypeBlock;
|
||||||
|
import com.reandroid.lib.arsc.item.SpecString;
|
||||||
|
import com.reandroid.lib.arsc.item.TypeString;
|
||||||
|
import com.reandroid.lib.arsc.pool.SpecStringPool;
|
||||||
|
import com.reandroid.lib.arsc.value.EntryBlock;
|
||||||
|
|
||||||
|
public class EntryGroup extends ItemGroup<EntryBlock> {
|
||||||
|
private final int resourceId;
|
||||||
|
public EntryGroup(int resId) {
|
||||||
|
super(create(), String.format("0x%08x", resId));
|
||||||
|
this.resourceId=resId;
|
||||||
|
}
|
||||||
|
public int getResourceId(){
|
||||||
|
return resourceId;
|
||||||
|
}
|
||||||
|
public void renameSpec(String name){
|
||||||
|
EntryBlock[] items=getItems();
|
||||||
|
if(items==null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SpecStringPool specStringPool=getSpecStringPool();
|
||||||
|
if(specStringPool==null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SpecString specString=specStringPool.getOrCreate(name);
|
||||||
|
renameSpec(specString.getIndex());
|
||||||
|
}
|
||||||
|
public void renameSpec(int specReference){
|
||||||
|
EntryBlock[] items=getItems();
|
||||||
|
if(items==null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for(EntryBlock block:items){
|
||||||
|
if(block==null||block.isNull()){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
block.setSpecReference(specReference);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public TypeString getTypeString(){
|
||||||
|
EntryBlock entryBlock=get(0);
|
||||||
|
if(entryBlock==null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return entryBlock.getTypeString();
|
||||||
|
}
|
||||||
|
public SpecString getSpecString(){
|
||||||
|
EntryBlock entryBlock=get(0);
|
||||||
|
if(entryBlock==null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return entryBlock.getSpecString();
|
||||||
|
}
|
||||||
|
public String getTypeName(){
|
||||||
|
TypeString typeString=getTypeString();
|
||||||
|
if(typeString==null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return typeString.get();
|
||||||
|
}
|
||||||
|
public String getSpecName(){
|
||||||
|
SpecString specString=getSpecString();
|
||||||
|
if(specString==null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return specString.get();
|
||||||
|
}
|
||||||
|
private SpecStringPool getSpecStringPool(){
|
||||||
|
EntryBlock entryBlock=get(0);
|
||||||
|
if(entryBlock==null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
TypeBlock typeBlock=entryBlock.getTypeBlock();
|
||||||
|
if(typeBlock==null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
PackageBlock packageBlock=typeBlock.getPackageBlock();
|
||||||
|
if(packageBlock==null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return packageBlock.getSpecStringPool();
|
||||||
|
}
|
||||||
|
private static BlockArrayCreator<EntryBlock> create(){
|
||||||
|
return new BlockArrayCreator<EntryBlock>(){
|
||||||
|
@Override
|
||||||
|
public EntryBlock newInstance() {
|
||||||
|
return new EntryBlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EntryBlock[] newInstance(int len) {
|
||||||
|
return new EntryBlock[len];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -1,41 +1,67 @@
|
|||||||
package com.reandroid.lib.arsc.pool;
|
package com.reandroid.lib.arsc.group;
|
||||||
|
|
||||||
|
import com.reandroid.lib.arsc.base.Block;
|
||||||
import com.reandroid.lib.arsc.base.BlockArrayCreator;
|
import com.reandroid.lib.arsc.base.BlockArrayCreator;
|
||||||
import com.reandroid.lib.arsc.item.StringItem;
|
|
||||||
|
|
||||||
import java.lang.reflect.Array;
|
import java.util.AbstractList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class StringGroup<T extends StringItem> {
|
public class ItemGroup<T extends Block> {
|
||||||
private final BlockArrayCreator<T> mBlockArrayCreator;
|
private final BlockArrayCreator<T> mBlockArrayCreator;
|
||||||
private final String name;
|
private final String name;
|
||||||
private T[] items;
|
private T[] items;
|
||||||
private final int hashCode;
|
private final int hashCode;
|
||||||
StringGroup(BlockArrayCreator<T> blockArrayCreator, String name, T[] items){
|
public ItemGroup(BlockArrayCreator<T> blockArrayCreator, String name){
|
||||||
this.mBlockArrayCreator=blockArrayCreator;
|
this.mBlockArrayCreator=blockArrayCreator;
|
||||||
this.name=name;
|
this.name=name;
|
||||||
this.items=items;
|
this.items=blockArrayCreator.newInstance(0);
|
||||||
this.hashCode=(getClass().getName()+"-"+name).hashCode();
|
this.hashCode=(getClass().getName()+"-"+name).hashCode();
|
||||||
}
|
}
|
||||||
public boolean contains(T strItem){
|
public List<T> listItems(){
|
||||||
if(strItem==null){
|
return new AbstractList<T>() {
|
||||||
|
@Override
|
||||||
|
public T get(int i) {
|
||||||
|
return ItemGroup.this.get(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int size() {
|
||||||
|
return ItemGroup.this.size();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
public T get(int i){
|
||||||
|
if(i<0||i>= size()){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return items[i];
|
||||||
|
}
|
||||||
|
public int size(){
|
||||||
|
if(items==null){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return items.length;
|
||||||
|
}
|
||||||
|
public boolean contains(T block){
|
||||||
|
if(block==null){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int len=items.length;
|
int len=items.length;
|
||||||
for(int i=0;i<len;i++){
|
for(int i=0;i<len;i++){
|
||||||
if(strItem==items[i]){
|
if(block==items[i]){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
public void remove(T strItem){
|
public void remove(T block){
|
||||||
if(strItem==null){
|
if(block==null){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
boolean found=false;
|
boolean found=false;
|
||||||
int len=items.length;
|
int len=items.length;
|
||||||
for(int i=0;i<len;i++){
|
for(int i=0;i<len;i++){
|
||||||
if(strItem==items[i]){
|
if(block==items[i]){
|
||||||
items[i]=null;
|
items[i]=null;
|
||||||
found=true;
|
found=true;
|
||||||
}
|
}
|
||||||
@ -44,14 +70,14 @@ public class StringGroup<T extends StringItem> {
|
|||||||
trimToSize();
|
trimToSize();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public void add(T strItem){
|
public void add(T block){
|
||||||
if(strItem==null){
|
if(block==null){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int index=items.length;
|
int index=items.length;
|
||||||
T[] update=createNew(index+1);
|
T[] update=createNew(index+1);
|
||||||
System.arraycopy(items, 0, update, 0, index);
|
System.arraycopy(items, 0, update, 0, index);
|
||||||
update[index]=strItem;
|
update[index]=block;
|
||||||
items=update;
|
items=update;
|
||||||
}
|
}
|
||||||
public T[] getItems(){
|
public T[] getItems(){
|
||||||
@ -94,7 +120,7 @@ public class StringGroup<T extends StringItem> {
|
|||||||
public boolean equals(Object obj){
|
public boolean equals(Object obj){
|
||||||
if(obj instanceof StringGroup){
|
if(obj instanceof StringGroup){
|
||||||
StringGroup other=(StringGroup)obj;
|
StringGroup other=(StringGroup)obj;
|
||||||
return name.equals(other.name);
|
return hashCode==other.hashCode();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
10
src/main/java/com/reandroid/lib/arsc/group/StringGroup.java
Normal file
10
src/main/java/com/reandroid/lib/arsc/group/StringGroup.java
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
package com.reandroid.lib.arsc.group;
|
||||||
|
|
||||||
|
import com.reandroid.lib.arsc.base.BlockArrayCreator;
|
||||||
|
import com.reandroid.lib.arsc.item.StringItem;
|
||||||
|
|
||||||
|
public class StringGroup<T extends StringItem> extends ItemGroup<T>{
|
||||||
|
public StringGroup(BlockArrayCreator<T> blockArrayCreator, String name){
|
||||||
|
super(blockArrayCreator, name);
|
||||||
|
}
|
||||||
|
}
|
@ -5,6 +5,7 @@ import com.reandroid.lib.arsc.array.StringArray;
|
|||||||
import com.reandroid.lib.arsc.array.StyleArray;
|
import com.reandroid.lib.arsc.array.StyleArray;
|
||||||
import com.reandroid.lib.arsc.base.Block;
|
import com.reandroid.lib.arsc.base.Block;
|
||||||
import com.reandroid.lib.arsc.chunk.BaseChunk;
|
import com.reandroid.lib.arsc.chunk.BaseChunk;
|
||||||
|
import com.reandroid.lib.arsc.group.StringGroup;
|
||||||
import com.reandroid.lib.arsc.io.BlockLoad;
|
import com.reandroid.lib.arsc.io.BlockLoad;
|
||||||
import com.reandroid.lib.arsc.io.BlockReader;
|
import com.reandroid.lib.arsc.io.BlockReader;
|
||||||
import com.reandroid.lib.arsc.item.*;
|
import com.reandroid.lib.arsc.item.*;
|
||||||
@ -87,8 +88,7 @@ public abstract class BaseStringPool<T extends StringItem> extends BaseChunk imp
|
|||||||
if(group!=null){
|
if(group!=null){
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
T[] items=mArrayStrings.newInstance(0);
|
group=new StringGroup<>(mArrayStrings, str);
|
||||||
group=new StringGroup<>(mArrayStrings, str, items);
|
|
||||||
mUniqueMap.put(str, group);
|
mUniqueMap.put(str, group);
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
@ -288,6 +288,17 @@ public class EntryBlock extends Block {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updatePackage(){
|
||||||
|
TypeBlock typeBlock=getTypeBlock();
|
||||||
|
if(typeBlock==null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PackageBlock packageBlock=typeBlock.getPackageBlock();
|
||||||
|
if(packageBlock==null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
packageBlock.onEntryAdded(this);
|
||||||
|
}
|
||||||
@Override
|
@Override
|
||||||
public void onReadBytes(BlockReader reader) throws IOException{
|
public void onReadBytes(BlockReader reader) throws IOException{
|
||||||
setNull(false);
|
setNull(false);
|
||||||
@ -297,6 +308,7 @@ public class EntryBlock extends Block {
|
|||||||
mSpecReference.readBytes(reader);
|
mSpecReference.readBytes(reader);
|
||||||
createResValue();
|
createResValue();
|
||||||
mResValue.readBytes(reader);
|
mResValue.readBytes(reader);
|
||||||
|
updatePackage();
|
||||||
}
|
}
|
||||||
public String toString(){
|
public String toString(){
|
||||||
StringBuilder builder=new StringBuilder();
|
StringBuilder builder=new StringBuilder();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user