diff --git a/src/main/java/com/reandroid/arsc/value/ResConfig.java b/src/main/java/com/reandroid/arsc/value/ResConfig.java index 12cc580..821ccb6 100755 --- a/src/main/java/com/reandroid/arsc/value/ResConfig.java +++ b/src/main/java/com/reandroid/arsc/value/ResConfig.java @@ -34,6 +34,7 @@ public class ResConfig extends FixedBlockContainer private final ByteArray mValuesContainer; private String mQualifiers; + private int mQualifiersStamp; public ResConfig(){ super(2); @@ -42,7 +43,7 @@ public class ResConfig extends FixedBlockContainer addChild(0, configSize); addChild(1, mValuesContainer); this.configSize.setBlockLoad(this); - this.mValuesContainer.setBlockLoad(this); + this.mQualifiersStamp = 0; } public void copyFrom(ResConfig resConfig){ if(resConfig==this||resConfig==null){ @@ -55,8 +56,6 @@ public class ResConfig extends FixedBlockContainer public void onBlockLoaded(BlockReader reader, Block sender) throws IOException { if(sender==configSize){ setConfigSize(configSize.get()); - }else if(sender==mValuesContainer){ - valuesChanged(); } } @Override @@ -65,28 +64,18 @@ public class ResConfig extends FixedBlockContainer configSize.set(count); } @Override - protected void onRefreshed() { - valuesChanged(); + protected void onRefreshed() { } public void parseQualifiers(String name){ ResConfigHelper.parseQualifiers(this, name); - mQualifiers=null; } public void setConfigSize(int size){ - if( size != SIZE_16 - && size != SIZE_28 - && size != SIZE_32 - && size != SIZE_36 - && size != SIZE_48 - && size != SIZE_56 - && size != SIZE_64 - ){ + if(!isValidSize(size)){ throw new IllegalArgumentException("Invalid config size = " + size); } this.configSize.set(size); size=size-4; mValuesContainer.setSize(size); - valuesChanged(); } public int getConfigSize(){ return this.configSize.get(); @@ -96,14 +85,7 @@ public class ResConfig extends FixedBlockContainer if(current==size){ return true; } - if( size != SIZE_16 - && size != SIZE_28 - && size != SIZE_32 - && size != SIZE_36 - && size != SIZE_48 - && size != SIZE_56 - && size != SIZE_64 - ){ + if(!isValidSize(size)){ return false; } if(current= min){ + return str; + } + StringBuilder builder = new StringBuilder(); + builder.append(str); + int remain = min - length; + for(int i=0; i0 && str.charAt(index) == postfix){ + str = str.substring(0, index); + length = str.length(); + index = length - 1; + } + return str; + } + public static boolean isValidSize(int size){ + switch (size){ + case SIZE_16: + case SIZE_28: + case SIZE_32: + case SIZE_36: + case SIZE_48: + case SIZE_52: + case SIZE_56: + case SIZE_64: + return true; + default: + return size > SIZE_64; + } + } + public enum Orientation{ PORT((byte) 0x1), LAND((byte) 0x2), @@ -1090,6 +1195,7 @@ public class ResConfig extends FixedBlockContainer public static final int SIZE_32 = 32; public static final int SIZE_36 = 36; public static final int SIZE_48 = 48; + public static final int SIZE_52 = 52; public static final int SIZE_56 = 56; public static final int SIZE_64 = 64; @@ -1160,5 +1266,6 @@ public class ResConfig extends FixedBlockContainer private static final String NAME_screenLayout2 = "screenLayout2"; private static final String NAME_colorMode = "colorMode"; + private static final char POSTFIX_locale = '#'; } diff --git a/src/main/java/com/reandroid/arsc/value/ResConfigHelper.java b/src/main/java/com/reandroid/arsc/value/ResConfigHelper.java index f70ebb7..6038813 100755 --- a/src/main/java/com/reandroid/arsc/value/ResConfigHelper.java +++ b/src/main/java/com/reandroid/arsc/value/ResConfigHelper.java @@ -27,7 +27,7 @@ public class ResConfigHelper { result.refresh(); return result; } - static String toQualifier(ResConfig resConfig){ + public static String toQualifier(ResConfig resConfig){ StringBuilder builder=new StringBuilder(); builder.append(decodeLanguageAndCountry(resConfig)); builder.append(decodeOrientation(resConfig)); @@ -105,6 +105,7 @@ public class ResConfigHelper { encodeMnc(resConfig, split); encodeScreenSize(resConfig, split); encodeLanguageAndCountry(resConfig, split); + encodeScriptAndVariant(resConfig, split); } private static void encodeLanguageAndCountry(ResConfig resConfig, String[] split){ @@ -151,6 +152,93 @@ public class ResConfigHelper { char[] chs=country.toCharArray(); resConfig.setRegion(chs); } + private static void encodeScriptAndVariant(ResConfig resConfig, String[] split){ + if(split==null){ + return; + } + for(int i=0;i= 5) { - builder.append("+").append(toUpper(localeVariant)); + if (localeVariant != null) { + builder.append('+').append(localeVariant); } } return builder.toString(); @@ -408,7 +493,7 @@ public class ResConfigHelper { /* * Encodes density to value * densityName is full name like: mdpi, xxxdpi, 580dpi ... */ - public static short encodeDensity(String densityName){ + public static int encodeDensity(String densityName){ short density=0; if(densityName==null){ return density; @@ -419,7 +504,7 @@ public class ResConfigHelper { } return encodeDensityName(matcher.group(1)); } - private static short encodeDensityName(String name){ + private static int encodeDensityName(String name){ if("l".equals(name)){ return DENSITY_LOW; }else if("m".equals(name)){ @@ -501,7 +586,7 @@ public class ResConfigHelper { } return ret.toString(); } - public static String decodeDensity(short density){ + public static String decodeDensity(int density){ switch (density) { case DENSITY_DEFAULT: return null; @@ -1046,8 +1131,8 @@ public class ResConfigHelper { resConfig.setMnc(sh); } private static String decodeMccMnc(ResConfig resConfig){ - short mcc=resConfig.getMcc(); - short mnc=resConfig.getMnc(); + int mcc=resConfig.getMcc(); + int mnc=resConfig.getMnc(); int size=resConfig.getConfigSize(); StringBuilder ret = new StringBuilder(); if (mcc != 0) { @@ -1191,8 +1276,8 @@ public class ResConfigHelper { return builder.toString(); } private static String decodeScreenSize(ResConfig resConfig){ - short width=resConfig.getScreenWidth(); - short height=resConfig.getScreenHeight(); + int width=resConfig.getScreenWidth(); + int height=resConfig.getScreenHeight(); if(width==0||height==0){ return ""; } @@ -1236,6 +1321,20 @@ public class ResConfigHelper { Matcher matcher=PATTERN_LANG_NAME.matcher(str); return matcher.find(); } + private static boolean isLocaleScript(String str){ + if(str==null){ + return false; + } + Matcher matcher=PATTERN_LOCALE_SCRIPT.matcher(str); + return matcher.find(); + } + private static boolean isLocaleVariant(String str){ + if(str==null){ + return false; + } + Matcher matcher=PATTERN_LOCALE_VARIANT.matcher(str); + return matcher.find(); + } private static boolean isCountryName(String str){ if(str==null){ return false; @@ -1289,6 +1388,10 @@ public class ResConfigHelper { private static final Pattern PATTERN_COUNTRY_NAME=Pattern.compile("^[a-zA-Z]{2,3}$"); + private static final Pattern PATTERN_LOCALE_SCRIPT=Pattern.compile("^[a-zA-Z0-9]{3,4}$"); + + private static final Pattern PATTERN_LOCALE_VARIANT=Pattern.compile("^[a-zA-Z0-9#]{5,8}$"); + private static final Pattern PATTERN_MCC_MNC=Pattern.compile("^(m[cn]c)([0-9]{2,3})$"); private static final Pattern PATTERN_DENSITY=Pattern.compile("^([^\\s]+)dpi$"); @@ -1374,8 +1477,8 @@ public class ResConfigHelper { private final static int DENSITY_XHIGH = 320; private final static int DENSITY_XXHIGH = 480; private final static int DENSITY_XXXHIGH = 640; - private final static int DENSITY_ANY = -2; - private final static int DENSITY_NONE = -1; + private final static int DENSITY_ANY = 0xfffe; + private final static int DENSITY_NONE = 0xffff; }