This commit is contained in:
REAndroid 2022-11-25 16:09:40 -05:00
parent f3f895e9c3
commit e68ee0dfc7
12 changed files with 454 additions and 183 deletions

View File

@ -9,8 +9,12 @@ import com.reandroid.lib.arsc.chunk.xml.ResXmlAttribute;
import com.reandroid.lib.arsc.item.ShortItem; import com.reandroid.lib.arsc.item.ShortItem;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
public class ResXmlAttributeArray extends BlockArray<ResXmlAttribute> { public class ResXmlAttributeArray extends BlockArray<ResXmlAttribute> implements Comparator<ResXmlAttribute> {
private final HeaderBlock mHeaderBlock; private final HeaderBlock mHeaderBlock;
private final ShortItem mAttributeStart; private final ShortItem mAttributeStart;
private final ShortItem mAttributeCount; private final ShortItem mAttributeCount;
@ -19,6 +23,16 @@ public class ResXmlAttributeArray extends BlockArray<ResXmlAttribute> {
this.mAttributeStart=attributeStart; this.mAttributeStart=attributeStart;
this.mAttributeCount=attributeCount; this.mAttributeCount=attributeCount;
} }
public void sortAttributes(){
Collection<ResXmlAttribute> items = listItems();
if(items.size()<2){
return;
}
List<ResXmlAttribute> elementList = new ArrayList<>(items);
elementList.sort(this);
clearChildes();
addAll(elementList.toArray(new ResXmlAttribute[0]));
}
private void refreshCount(){ private void refreshCount(){
short count= (short) childesCount(); short count= (short) childesCount();
mAttributeCount.set(count); mAttributeCount.set(count);
@ -52,4 +66,8 @@ public class ResXmlAttributeArray extends BlockArray<ResXmlAttribute> {
setChildesCount(mAttributeCount.get()); setChildesCount(mAttributeCount.get());
super.onReadBytes(reader); super.onReadBytes(reader);
} }
@Override
public int compare(ResXmlAttribute attr1, ResXmlAttribute attr2) {
return attr1.compareTo(attr2);
}
} }

View File

@ -1,5 +1,6 @@
package com.reandroid.lib.arsc.base; package com.reandroid.lib.arsc.base;
import com.reandroid.lib.arsc.container.BlockList;
import com.reandroid.lib.arsc.io.BlockReader; import com.reandroid.lib.arsc.io.BlockReader;
import java.io.IOException; import java.io.IOException;
@ -43,6 +44,10 @@ public abstract class BlockContainer<T extends Block> extends Block{
BlockContainer<?> container=(BlockContainer<?>)item; BlockContainer<?> container=(BlockContainer<?>)item;
container.refresh(); container.refresh();
} }
if(item instanceof BlockList){
BlockList<?> blockList=(BlockList<?>)item;
blockList.refresh();
}
} }
} }
} }

View File

@ -30,18 +30,39 @@ public class AndroidManifestBlock extends ResXmlBlock{
} }
return results; return results;
} }
public ResXmlElement getUsesPermission(String permissionName){
ResXmlElement manifestElement=getManifestElement();
if(manifestElement==null){
return null;
}
List<ResXmlElement> permissionList = manifestElement.searchElementsByTagName(TAG_uses_permission);
for(ResXmlElement permission:permissionList){
ResXmlAttribute nameAttr = permission.searchAttributeById(ID_name);
if(nameAttr==null){
continue;
}
String val=nameAttr.getValueString();
if(val==null){
continue;
}
if(val.equals(permissionName)){
return permission;
}
}
return null;
}
public ResXmlElement addUsesPermission(String permissionName){ public ResXmlElement addUsesPermission(String permissionName){
ResXmlElement manifestElement=getManifestElement(); ResXmlElement manifestElement=getManifestElement();
if(manifestElement==null){ if(manifestElement==null){
return null; return null;
} }
manifestElement.getStartElement().getOrCreateString(TAG_uses_permission); ResXmlElement exist=getUsesPermission(permissionName);
if(exist!=null){
return exist;
}
ResXmlElement result=manifestElement.createChildElement(TAG_uses_permission); ResXmlElement result=manifestElement.createChildElement(TAG_uses_permission);
ResXmlAttribute attr = result.createAndroidAttribute(NAME_name, ID_name); ResXmlAttribute attr = result.createAndroidAttribute(NAME_name, ID_name);
ResXmlString strPermission = result.getStartElement().getOrCreateString(permissionName); attr.setValueAsString(permissionName);
attr.setRawValue(strPermission.getIndex());
attr.setValueType(ValueType.STRING);
attr.setValueStringReference(strPermission.getIndex());
return result; return result;
} }
public String getPackageName(){ public String getPackageName(){
@ -54,13 +75,13 @@ public class AndroidManifestBlock extends ResXmlBlock{
return getManifestAttributeInt(NAME_compileSdkVersion); return getManifestAttributeInt(NAME_compileSdkVersion);
} }
public boolean setCompileSdkVersion(int val){ public boolean setCompileSdkVersion(int val){
return setManifestAttributeInt(NAME_compileSdkVersion, val); return setManifestAttributeInt(ID_compileSdkVersion, val);
} }
public String getCompileSdkVersionCodename(){ public String getCompileSdkVersionCodename(){
return getManifestAttributeString(NAME_compileSdkVersionCodename); return getManifestAttributeString(NAME_compileSdkVersionCodename);
} }
public boolean setCompileSdkVersionCodename(String val){ public boolean setCompileSdkVersionCodename(String val){
return setManifestAttributeString(NAME_compileSdkVersionCodename, val); return setManifestAttributeString(ID_compileSdkVersionCodename, val);
} }
public Integer getVersionCode(){ public Integer getVersionCode(){
return getManifestAttributeInt(NAME_versionCode); return getManifestAttributeInt(NAME_versionCode);
@ -91,6 +112,19 @@ public class AndroidManifestBlock extends ResXmlBlock{
} }
return resXmlString.getHtml(); return resXmlString.getHtml();
} }
private boolean setManifestAttributeString(int resId, String value){
ResXmlElement manifestElement=getManifestElement();
if(manifestElement==null){
return false;
}
ResXmlAttribute attribute= manifestElement.searchAttributeById(resId);
if(attribute==null){
return false;
}
attribute.setValueType(ValueType.STRING);
ResXmlString resXmlString=attribute.setValueString(value);
return resXmlString!=null;
}
private boolean setManifestAttributeString(String name, String value){ private boolean setManifestAttributeString(String name, String value){
ResXmlElement manifestElement=getManifestElement(); ResXmlElement manifestElement=getManifestElement();
if(manifestElement==null){ if(manifestElement==null){
@ -104,6 +138,20 @@ public class AndroidManifestBlock extends ResXmlBlock{
ResXmlString resXmlString=attribute.setValueString(value); ResXmlString resXmlString=attribute.setValueString(value);
return resXmlString!=null; return resXmlString!=null;
} }
private boolean setManifestAttributeInt(int resId, int value){
ResXmlElement manifestElement=getManifestElement();
if(manifestElement==null){
return false;
}
ResXmlAttribute attribute= manifestElement.searchAttributeById(resId);
if(attribute==null){
return false;
}
attribute.setValueType(ValueType.INT_DEC);
attribute.setValueString(String.valueOf(value));
attribute.setRawValue(value);
return true;
}
private boolean setManifestAttributeInt(String name, int value){ private boolean setManifestAttributeInt(String name, int value){
ResXmlElement manifestElement=getManifestElement(); ResXmlElement manifestElement=getManifestElement();
if(manifestElement==null){ if(manifestElement==null){

View File

@ -7,7 +7,7 @@ import com.reandroid.lib.arsc.item.*;
import com.reandroid.lib.arsc.pool.ResXmlStringPool; import com.reandroid.lib.arsc.pool.ResXmlStringPool;
import com.reandroid.lib.arsc.value.ValueType; import com.reandroid.lib.arsc.value.ValueType;
public class ResXmlAttribute extends FixedBlockContainer { public class ResXmlAttribute extends FixedBlockContainer implements Comparable<ResXmlAttribute>{
private final IntegerItem mNamespaceReference; private final IntegerItem mNamespaceReference;
private final IntegerItem mNameReference; private final IntegerItem mNameReference;
private final IntegerItem mValueStringReference; private final IntegerItem mValueStringReference;
@ -249,6 +249,100 @@ public class ResXmlAttribute extends FixedBlockContainer {
} }
return null; return null;
} }
public String getValueAsString(){
int ref=getRawValue();
ResXmlString xmlString=getResXmlString(ref);
if(xmlString==null){
return null;
}
return xmlString.getHtml();
}
public boolean getValueAsBoolean(){
int ref=getRawValue();
return ref!=0;
}
public void setValueAsString(String str){
setValueType(ValueType.STRING);
ResXmlString xmlString=getOrCreateResXmlString(str);
if(xmlString==null){
throw new IllegalStateException("ResXmlString is null, attribute must be added to parent element first");
}
int ref=xmlString.getIndex();
setRawValue(ref);
setValueStringReference(ref);
}
public void setValueAsBoolean(boolean val){
setValueType(ValueType.INT_BOOLEAN);
int ref=val?0xffff:0;
setRawValue(ref);
setValueStringReference(-1);
}
public void setValueAsInteger(int val){
setValueType(ValueType.FIRST_INT);
setRawValue(val);
setValueStringReference(-1);
}
public void setValueAsHex(int val){
setValueType(ValueType.INT_HEX);
setRawValue(val);
setValueStringReference(-1);
}
public void setValueAsFraction(float fraction){
int val=Float.floatToIntBits(fraction);
setValueAsFraction(val);
}
public void setValueAsFraction(int val){
setValueType(ValueType.FRACTION);
setRawValue(val);
setValueStringReference(-1);
}
public void setValueAsResourceId(int resId){
setValueType(ValueType.REFERENCE);
setRawValue(resId);
setValueStringReference(-1);
}
public void setValueAsAttributeId(int attrId){
setValueType(ValueType.ATTRIBUTE);
setRawValue(attrId);
setValueStringReference(-1);
}
public void setValueAsColorRGB4(int val){
setValueType(ValueType.INT_COLOR_RGB4);
setRawValue(val);
setValueStringReference(-1);
}
public void setValueAsColorRGB8(int val){
setValueType(ValueType.INT_COLOR_RGB8);
setRawValue(val);
setValueStringReference(-1);
}
public void setValueAsColorARGB4(int val){
setValueType(ValueType.INT_COLOR_ARGB4);
setRawValue(val);
setValueStringReference(-1);
}
public void setValueAsColorARGB8(int val){
setValueType(ValueType.INT_COLOR_ARGB8);
setRawValue(val);
setValueStringReference(-1);
}
private String getCompareName(){
int id=getNameResourceID();
StringBuilder builder=new StringBuilder();
if(id!=0){
builder.append("0 ");
builder.append(String.format("%08x", id));
}else {
builder.append("1 ");
builder.append(getName());
}
return builder.toString();
}
@Override
public int compareTo(ResXmlAttribute other) {
return getCompareName().compareTo(other.getCompareName());
}
@Override @Override
public String toString(){ public String toString(){

View File

@ -40,25 +40,30 @@ public class ResXmlElement extends FixedBlockContainer {
addChild(5, mEndNamespaceList); addChild(5, mEndNamespaceList);
} }
@Override @Override
protected void refreshChildes(){ protected void onPreRefreshRefresh(){
List<ResXmlElement> elementList = listElements(); ResXmlStartElement start = getStartElement();
for (ResXmlElement element:elementList){ if(start==null){
element.refresh(); return;
} }
super.refreshChildes(); start.getResXmlAttributeArray().sortAttributes();
} }
public ResXmlElement createChildElement(String tag){ public ResXmlElement createChildElement(String tag){
ResXmlElement resXmlElement=new ResXmlElement(); ResXmlElement resXmlElement=new ResXmlElement();
ResXmlStartElement startElement=new ResXmlStartElement(); ResXmlStartElement startElement=new ResXmlStartElement();
resXmlElement.setStartElement(startElement); resXmlElement.setStartElement(startElement);
ResXmlEndElement endElement=new ResXmlEndElement(); ResXmlEndElement endElement=new ResXmlEndElement();
startElement.setResXmlEndElement(endElement);
resXmlElement.setEndElement(endElement); resXmlElement.setEndElement(endElement);
endElement.setResXmlStartElement(startElement);
addElement(resXmlElement); addElement(resXmlElement);
resXmlElement.setTag(tag); resXmlElement.setTag(tag);
int lineNo=getStartElement().getLineNumber()+1; int lineNo=getStartElement().getLineNumber()+1;
startElement.setLineNumber(lineNo); startElement.setLineNumber(lineNo);
endElement.setLineNumber(lineNo); endElement.setLineNumber(lineNo);
endElement.setStringReference(startElement.getStringReference());
return resXmlElement; return resXmlElement;
} }
public ResXmlAttribute createAndroidAttribute(String name, int resourceId){ public ResXmlAttribute createAndroidAttribute(String name, int resourceId){
@ -230,24 +235,21 @@ public class ResXmlElement extends FixedBlockContainer {
return null; return null;
} }
public ResXmlStartNamespace getOrCreateNamespace(String uri, String prefix){ public ResXmlStartNamespace getOrCreateNamespace(String uri, String prefix){
ResXmlStartNamespace namespace=getStartNamespaceByUri(uri); ResXmlStartNamespace exist=getStartNamespaceByUri(uri);
if(namespace!=null){ if(exist!=null){
return namespace; return exist;
} }
ResXmlStartElement startElement = getStartElement(); ResXmlStartNamespace startNamespace=new ResXmlStartNamespace();
ResXmlString uriString = startElement.getOrCreateString(uri);
ResXmlString prefixString = startElement.getOrCreateString(prefix);
namespace=new ResXmlStartNamespace();
addStartNamespace(namespace);
namespace.setUriReference(uriString.getIndex());
namespace.setPrefixReference(prefixString.getIndex());
ResXmlEndNamespace endNamespace=new ResXmlEndNamespace(); ResXmlEndNamespace endNamespace=new ResXmlEndNamespace();
startNamespace.setEnd(endNamespace);
addStartNamespace(startNamespace);
addEndNamespace(endNamespace); addEndNamespace(endNamespace);
endNamespace.setUriReference(uriString.getIndex());
endNamespace.setPrefixReference(prefixString.getIndex()); startNamespace.setUri(uri);
namespace.setResXmlEndNamespace(endNamespace); startNamespace.setPrefix(prefix);
endNamespace.setResXmlStartNamespace(namespace);
return namespace; return startNamespace;
} }
public ResXmlStartNamespace getStartNamespaceByUri(String uri){ public ResXmlStartNamespace getStartNamespaceByUri(String uri){
if(uri==null){ if(uri==null){
@ -354,8 +356,7 @@ public class ResXmlElement extends FixedBlockContainer {
for(int i=0;i<max;i++){ for(int i=0;i<max;i++){
ResXmlStartNamespace start=mStartNamespaceList.get(i); ResXmlStartNamespace start=mStartNamespaceList.get(i);
ResXmlEndNamespace end=mEndNamespaceList.get(max-i-1); ResXmlEndNamespace end=mEndNamespaceList.get(max-i-1);
start.setResXmlEndNamespace(end); start.setEnd(end);
end.setResXmlStartNamespace(start);
} }
} }

View File

@ -2,52 +2,14 @@ package com.reandroid.lib.arsc.chunk.xml;
import com.reandroid.lib.arsc.chunk.ChunkType; import com.reandroid.lib.arsc.chunk.ChunkType;
public class ResXmlEndNamespace extends BaseXmlChunk { public class ResXmlEndNamespace extends ResXmlNamespace<ResXmlStartNamespace>{
private ResXmlStartNamespace mResXmlStartNamespace;
public ResXmlEndNamespace() { public ResXmlEndNamespace() {
super(ChunkType.XML_END_NAMESPACE, 0); super(ChunkType.XML_END_NAMESPACE);
} }
public ResXmlStartNamespace getStart(){
public void setResXmlStartNamespace(ResXmlStartNamespace ns){ return getPair();
mResXmlStartNamespace=ns;
} }
public ResXmlStartNamespace getResXmlStartNamespace(){ public void setStart(ResXmlStartNamespace namespace){
return mResXmlStartNamespace; setPair(namespace);
}
@Override
public String getUri(){
return getString(getUriReference());
}
public String getPrefix(){
return getString(getPrefixReference());
}
public int getUriReference(){
return getStringReference();
}
public void setUriReference(int ref){
setStringReference(ref);
if(mResXmlStartNamespace!=null){
mResXmlStartNamespace.setStringReference(ref);
}
}
public int getPrefixReference(){
return getNamespaceReference();
}
public void setPrefixReference(int ref){
setNamespaceReference(ref);
if(mResXmlStartNamespace!=null){
mResXmlStartNamespace.setNamespaceReference(ref);
}
}
@Override
public String toString(){
String uri=getUri();
if(uri==null){
return super.toString();
}
return "xmlns:"+getPrefix()+"=\""+getUri()+"\"";
} }
} }

View File

@ -0,0 +1,72 @@
package com.reandroid.lib.arsc.chunk.xml;
import com.reandroid.lib.arsc.chunk.ChunkType;
import com.reandroid.lib.arsc.item.ResXmlString;
abstract class ResXmlNamespace<PAIR extends ResXmlNamespace> extends BaseXmlChunk{
private PAIR mPair;
ResXmlNamespace(ChunkType chunkType) {
super(chunkType, 0);
}
@Override
public String getUri(){
return getString(getUriReference());
}
public void setUri(String uri){
ResXmlString xmlString = getOrCreateString(uri);
if(xmlString==null){
throw new IllegalArgumentException("Null ResXmlString, add to parent element first");
}
setUriReference(xmlString.getIndex());
}
public String getPrefix(){
return getString(getPrefixReference());
}
public void setPrefix(String prefix){
ResXmlString xmlString = getOrCreateString(prefix);
if(xmlString==null){
throw new IllegalArgumentException("Null ResXmlString, add to parent element first");
}
setPrefixReference(xmlString.getIndex());
}
public int getUriReference(){
return getStringReference();
}
public void setUriReference(int ref){
setStringReference(ref);
PAIR pair=getPair();
if(pair!=null && pair.getUriReference()!=ref){
pair.setUriReference(ref);
}
}
public int getPrefixReference(){
return getNamespaceReference();
}
public void setPrefixReference(int ref){
setNamespaceReference(ref);
PAIR pair=getPair();
if(pair!=null && pair.getPrefixReference()!=ref){
pair.setPrefixReference(ref);
}
}
PAIR getPair(){
return mPair;
}
void setPair(PAIR pair){
if(pair==this){
return;
}
this.mPair=pair;
if(pair !=null && pair.getPair()!=this){
pair.setPair(this);
}
}
@Override
public String toString(){
String uri=getUri();
if(uri==null){
return super.toString();
}
return "xmlns:"+getPrefix()+"=\""+getUri()+"\"";
}
}

View File

@ -1,10 +1,8 @@
package com.reandroid.lib.arsc.chunk.xml; package com.reandroid.lib.arsc.chunk.xml;
import com.reandroid.lib.arsc.base.BlockContainer;
import com.reandroid.lib.arsc.chunk.ChunkType; import com.reandroid.lib.arsc.chunk.ChunkType;
import com.reandroid.lib.arsc.array.ResXmlAttributeArray; import com.reandroid.lib.arsc.array.ResXmlAttributeArray;
import com.reandroid.lib.arsc.item.IntegerItem; import com.reandroid.lib.arsc.item.IntegerItem;
import com.reandroid.lib.arsc.item.ResXmlString;
import com.reandroid.lib.arsc.item.ShortItem; import com.reandroid.lib.arsc.item.ShortItem;
import java.util.Collection; import java.util.Collection;
@ -65,6 +63,10 @@ public class ResXmlStartElement extends BaseXmlChunk {
} }
public void setName(String name){ public void setName(String name){
setString(name); setString(name);
ResXmlEndElement endElement = getResXmlEndElement();
if(endElement!=null){
endElement.setString(name);
}
} }
public Collection<ResXmlAttribute> listResXmlAttributes(){ public Collection<ResXmlAttribute> listResXmlAttributes(){
return getResXmlAttributeArray().listItems(); return getResXmlAttributeArray().listItems();

View File

@ -2,50 +2,14 @@ package com.reandroid.lib.arsc.chunk.xml;
import com.reandroid.lib.arsc.chunk.ChunkType; import com.reandroid.lib.arsc.chunk.ChunkType;
public class ResXmlStartNamespace extends BaseXmlChunk { public class ResXmlStartNamespace extends ResXmlNamespace<ResXmlEndNamespace> {
private ResXmlEndNamespace mResXmlEndNamespace;
public ResXmlStartNamespace() { public ResXmlStartNamespace() {
super(ChunkType.XML_START_NAMESPACE, 0); super(ChunkType.XML_START_NAMESPACE);
} }
public void setResXmlEndNamespace(ResXmlEndNamespace ns){ public ResXmlEndNamespace getEnd(){
mResXmlEndNamespace=ns; return getPair();
} }
public void setEnd(ResXmlEndNamespace namespace){
@Override setPair(namespace);
public String getUri(){
return getString(getUriReference());
}
public String getPrefix(){
return getString(getPrefixReference());
}
public int getUriReference(){
return getStringReference();
}
public void setUriReference(int ref){
setStringReference(ref);
if(mResXmlEndNamespace!=null){
mResXmlEndNamespace.setStringReference(ref);
}
}
public int getPrefixReference(){
return getNamespaceReference();
}
public void setPrefixReference(int ref){
setNamespaceReference(ref);
if(mResXmlEndNamespace!=null){
mResXmlEndNamespace.setNamespaceReference(ref);
}
}
public ResXmlEndNamespace getResXmlEndNamespace(){
return mResXmlEndNamespace;
}
@Override
public String toString(){
String uri=getUri();
if(uri==null){
return super.toString();
}
return "xmlns:"+getPrefix()+"=\""+getUri()+"\"";
} }
} }

View File

@ -1,6 +1,7 @@
package com.reandroid.lib.arsc.container; package com.reandroid.lib.arsc.container;
import com.reandroid.lib.arsc.base.Block; import com.reandroid.lib.arsc.base.Block;
import com.reandroid.lib.arsc.base.BlockContainer;
import com.reandroid.lib.arsc.base.BlockCounter; import com.reandroid.lib.arsc.base.BlockCounter;
import com.reandroid.lib.arsc.io.BlockReader; import com.reandroid.lib.arsc.io.BlockReader;
@ -15,6 +16,9 @@ public class BlockList<T extends Block> extends Block {
super(); super();
mItems=new ArrayList<>(); mItems=new ArrayList<>();
} }
public void remove(T item){
mItems.remove(item);
}
public void add(T item){ public void add(T item){
if(item==null){ if(item==null){
return; return;
@ -32,7 +36,24 @@ public class BlockList<T extends Block> extends Block {
public List<T> getChildes(){ public List<T> getChildes(){
return mItems; return mItems;
} }
public final void refresh(){
if(isNull()){
return;
}
refreshChildes();
}
private void refreshChildes(){
for(T item:getChildes()){
if(item instanceof BlockContainer){
BlockContainer<?> container=(BlockContainer<?>)item;
container.refresh();
}
if(item instanceof BlockList){
BlockList<?> blockList=(BlockList<?>)item;
blockList.refresh();
}
}
}
@Override @Override
public byte[] getBytes() { public byte[] getBytes() {
byte[] results=null; byte[] results=null;

View File

@ -28,6 +28,29 @@ public class ByteArray extends BlockItem {
public final void set(byte[] values){ public final void set(byte[] values){
super.setBytesInternal(values); super.setBytesInternal(values);
} }
public final void setInt(short val){
byte[] bts = getBytesInternal();
bts[3]= (byte) (val >>> 24 & 0xff);
bts[2]= (byte) (val >>> 16 & 0xff);
bts[1]= (byte) (val >>> 8 & 0xff);
bts[0]= (byte) (val & 0xff);
}
public final void setShort(short val){
byte[] bts = getBytesInternal();
bts[1]= (byte) (val >>> 8 & 0xff);
bts[0]= (byte) (val & 0xff);
}
public final short getShort(){
byte[] bts = getBytesInternal();
return (short) (bts[0] & 0xff | (bts[1] & 0xff) << 8);
}
public final int getInt(){
byte[] bts = getBytesInternal();
return bts[0] & 0xff |
(bts[1] & 0xff) << 8 |
(bts[2] & 0xff) << 16 |
(bts[3] & 0xff) << 24;
}
public final List<Byte> toList(){ public final List<Byte> toList(){
List<Byte> results=new AbstractList<Byte>() { List<Byte> results=new AbstractList<Byte>() {
@Override @Override
@ -88,4 +111,8 @@ public class ByteArray extends BlockItem {
public void onBytesChanged() { public void onBytesChanged() {
} }
@Override
public String toString(){
return "size="+size();
}
} }

View File

@ -30,16 +30,16 @@ public class ResConfig extends BlockArray<Block> implements BlockLoad {
private final ShortItem screenHeight; private final ShortItem screenHeight;
private final ShortItem sdkVersion; private final ShortItem sdkVersion;
private final ShortItem minorVersion; private final ShortItem minorVersion;
private final ByteItem screenLayout; private final ByteArray screenLayout;
private final ByteItem uiMode; private final ByteArray uiMode;
private final ShortItem smallestScreenWidthDp; private final ByteArray smallestScreenWidthDp;
private final ShortItem screenWidthDp; private final ByteArray screenWidthDp;
private final ShortItem screenHeightDp; private final ByteArray screenHeightDp;
private final ByteArray localeScript; private final ByteArray localeScript;
private final ByteArray localeVariant; private final ByteArray localeVariant;
private final ByteItem screenLayout2; private final ByteArray screenLayout2;
private final ByteItem colorMode; private final ByteArray colorMode;
private final ShortItem reservedPadding; private final ByteArray reservedPadding;
private final ByteArray skipSizeGreater56; private final ByteArray skipSizeGreater56;
private final ByteArray exceedingSize; private final ByteArray exceedingSize;
private final ByteArray remainingSize; private final ByteArray remainingSize;
@ -52,35 +52,36 @@ public class ResConfig extends BlockArray<Block> implements BlockLoad {
public ResConfig(){ public ResConfig(){
super(); super();
this.configSize = new IntegerItem(64); this.configSize = new IntegerItem(64);//4
this.mcc = new ShortItem(); this.mcc = new ShortItem();//6
this.mnc = new ShortItem(); this.mnc = new ShortItem();//8
this.languageIn0 = new ByteItem(); this.languageIn0 = new ByteItem();//9
this.languageIn1 = new ByteItem(); this.languageIn1 = new ByteItem();//10
this.countryIn0 = new ByteItem(); this.countryIn0 = new ByteItem();//11
this.countryIn1 = new ByteItem(); this.countryIn1 = new ByteItem();//12
this.orientation = new ByteItem(); this.orientation = new ByteItem();//13
this.touchscreen = new ByteItem(); this.touchscreen = new ByteItem();//14
this.density = new ShortItem(); this.density = new ShortItem();//16
this.keyboard = new ByteItem(); this.keyboard = new ByteItem();//17
this.navigation = new ByteItem(); this.navigation = new ByteItem();//18
this.inputFlags = new ByteItem(); this.inputFlags = new ByteItem();//19
this.inputPad0 = new ByteItem(); this.inputPad0 = new ByteItem();//20
this.screenWidth = new ShortItem(); this.screenWidth = new ShortItem();//22
this.screenHeight = new ShortItem(); this.screenHeight = new ShortItem();//24
this.sdkVersion = new ShortItem(); this.sdkVersion = new ShortItem();//26
this.minorVersion = new ShortItem(); this.minorVersion = new ShortItem();//28
this.screenLayout = new ByteItem(); //28
this.uiMode = new ByteItem(); this.screenLayout = new ByteArray();//29
this.smallestScreenWidthDp = new ShortItem(); this.uiMode = new ByteArray();//30
this.screenWidthDp = new ShortItem(); this.smallestScreenWidthDp = new ByteArray();//32
this.screenHeightDp = new ShortItem(); this.screenWidthDp = new ByteArray();//34
this.screenHeightDp = new ByteArray();//36
// size sum=44; // size sum=44;
this.localeScript = new ByteArray(4); this.localeScript = new ByteArray(4);
this.localeVariant = new ByteArray(8); this.localeVariant = new ByteArray(8);
this.screenLayout2 = new ByteItem(); this.screenLayout2 = new ByteArray();
this.colorMode = new ByteItem(); this.colorMode = new ByteArray();
this.reservedPadding = new ShortItem(); this.reservedPadding = new ByteArray();
this.skipSizeGreater56 = new ByteArray(4); this.skipSizeGreater56 = new ByteArray(4);
this.exceedingSize = new ByteArray(8); this.exceedingSize = new ByteArray(8);
this.remainingSize = new ByteArray(); this.remainingSize = new ByteArray();
@ -164,16 +165,16 @@ public class ResConfig extends BlockArray<Block> implements BlockLoad {
screenHeight.set((short) 0); screenHeight.set((short) 0);
sdkVersion.set((short) 0); sdkVersion.set((short) 0);
minorVersion.set((short) 0); minorVersion.set((short) 0);
screenLayout.set((byte)0); screenLayout.setSize(0);
uiMode.set((byte)0); uiMode.setSize((byte)0);
smallestScreenWidthDp.set((byte)0); smallestScreenWidthDp.setSize((byte)0);
screenWidthDp.set((byte)0); screenWidthDp.setSize((byte)0);
screenHeightDp.set((byte)0); screenHeightDp.setSize((byte)0);
localeScript.clear(); localeScript.clear();
localeVariant.clear(); localeVariant.clear();
screenLayout2.set((byte)0); screenLayout2.setSize(0);
colorMode.set((byte)0); colorMode.setSize(0);
reservedPadding.set((short) 0); reservedPadding.setSize( 0);
skipSizeGreater56.clear(); skipSizeGreater56.clear();
exceedingSize.clear(); exceedingSize.clear();
remainingSize.clear(); remainingSize.clear();
@ -344,34 +345,64 @@ public class ResConfig extends BlockArray<Block> implements BlockLoad {
return this.minorVersion.get(); return this.minorVersion.get();
} }
public void setScreenLayout(byte b){ public void setScreenLayout(byte b){
this.screenLayout.set(b); if(screenLayout.size()==0){
return;
}
this.screenLayout.put(0,b);
} }
public byte getScreenLayout(){ public byte getScreenLayout(){
return this.screenLayout.get(); if(screenLayout.size()==0){
return 0;
}
return this.screenLayout.get(0);
} }
public void setUiMode(byte b){ public void setUiMode(byte b){
this.uiMode.set(b); if(uiMode.size()==0){
return;
}
this.uiMode.put(0, b);
} }
public byte getUiMode(){ public byte getUiMode(){
return this.uiMode.get(); if(uiMode.size()==0){
return 0;
}
return this.uiMode.get(0);
} }
public void setSmallestScreenWidthDp(short sh){ public void setSmallestScreenWidthDp(short sh){
this.smallestScreenWidthDp.set(sh); if(smallestScreenWidthDp.size()==0){
return;
}
this.smallestScreenWidthDp.setShort(sh);
} }
public short getSmallestScreenWidthDp(){ public short getSmallestScreenWidthDp(){
return this.smallestScreenWidthDp.get(); if(this.smallestScreenWidthDp.size()==0){
return 0;
}
return smallestScreenWidthDp.getShort();
} }
public void setScreenWidthDp(short sh){ public void setScreenWidthDp(short sh){
this.screenWidthDp.set(sh); if(screenWidthDp.size()==0){
return;
}
this.screenWidthDp.setShort(sh);
} }
public short getScreenWidthDp(){ public short getScreenWidthDp(){
return this.screenWidthDp.get(); if(screenWidthDp.size()==0){
return 0;
}
return screenWidthDp.getShort();
} }
public void setScreenHeightDp(short sh){ public void setScreenHeightDp(short sh){
this.screenHeightDp.set(sh); if(screenHeightDp.size()==0){
return;
}
this.screenHeightDp.setShort(sh);
} }
public short getScreenHeightDp(){ public short getScreenHeightDp(){
return this.screenHeightDp.get(); if(screenHeightDp.size()==0){
return 0;
}
return this.screenHeightDp.getShort();
} }
public void setLocaleScript(byte[] bts){ public void setLocaleScript(byte[] bts){
this.localeScript.set(bts); this.localeScript.set(bts);
@ -395,22 +426,40 @@ public class ResConfig extends BlockArray<Block> implements BlockLoad {
return toCharArray(localeVariant.toArray()); return toCharArray(localeVariant.toArray());
} }
public void setScreenLayout2(byte b){ public void setScreenLayout2(byte b){
this.screenLayout2.set(b); if(screenLayout2.size()==0){
return;
}
this.screenLayout2.put(0,b);
} }
public byte getScreenLayout2(){ public byte getScreenLayout2(){
return this.screenLayout2.get(); if(screenLayout2.size()==0){
return 0;
}
return this.screenLayout2.get(0);
} }
public void setColorMode(byte b){ public void setColorMode(byte b){
this.colorMode.set(b); if(colorMode.size()==0){
return;
}
this.colorMode.put(0,b);
} }
public byte getColorMode(){ public byte getColorMode(){
return this.colorMode.get(); if(colorMode.size()==0){
return 0;
}
return this.colorMode.get(0);
} }
public void setReservedPadding(short sh){ public void setReservedPadding(short sh){
this.reservedPadding.set(sh); if(reservedPadding.size()==0){
return;
}
this.reservedPadding.setShort(sh);
} }
public short getReservedPadding(){ public short getReservedPadding(){
return this.reservedPadding.get(); if(reservedPadding.size()==0){
return 0;
}
return this.reservedPadding.get(0);
} }
private void valuesChanged(int val, int old){ private void valuesChanged(int val, int old){
@ -443,7 +492,19 @@ public class ResConfig extends BlockArray<Block> implements BlockLoad {
} }
mIsUpdatingSize=true; mIsUpdatingSize=true;
mCurrentSize=sz; mCurrentSize=sz;
localeScript.setSize(0);
skipSizeGreater56.setSize(0);
localeVariant.setSize(0);
exceedingSize.setSize(0);
if(sz==28){
mIsUpdatingSize=false;
return;
}
localeScript.setSize(4); localeScript.setSize(4);
if(sz==32){
mIsUpdatingSize=false;
return;
}
if(sz<=48){ if(sz<=48){
localeVariant.setSize(4); localeVariant.setSize(4);
exceedingSize.setSize(0); exceedingSize.setSize(0);
@ -481,13 +542,9 @@ public class ResConfig extends BlockArray<Block> implements BlockLoad {
@Override @Override
public void onBlockLoaded(BlockReader reader, Block sender) throws IOException { public void onBlockLoaded(BlockReader reader, Block sender) throws IOException {
if(sender==configSize){ if(sender==configSize){
if(configSize.get()!=64){
configSize.get();
}
setConfigSize(configSize.get()); setConfigSize(configSize.get());
} }
} }
public boolean isEqualQualifiers(String qualifiers){ public boolean isEqualQualifiers(String qualifiers){
if(qualifiers==null){ if(qualifiers==null){
qualifiers=""; qualifiers="";