diff --git a/README.md b/README.md index b56e02b..2ff0f3f 100755 --- a/README.md +++ b/README.md @@ -60,21 +60,21 @@ cd ARSCLib
See java example ```java -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.xml.AndroidManifestBlock; -import com.reandroid.lib.arsc.chunk.xml.ResXmlElement; -import com.reandroid.lib.arsc.chunk.xml.ResXmlAttribute; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.xml.AndroidManifestBlock; +import com.reandroid.arsc.chunk.xml.ResXmlElement; +import com.reandroid.arsc.chunk.xml.ResXmlAttribute; -public static void exampleManifest() throws IOException{ +public static void exampleManifest()throws IOException{ File inFile=new File("AndroidManifest.xml"); // *** Loading AndroidManifest *** - AndroidManifestBlock manifestBlock = AndroidManifestBlock.load(inFile); + AndroidManifestBlock manifestBlock=AndroidManifestBlock.load(inFile); System.out.println("Package name: "+manifestBlock.getPackageName()); - List usesPermissionList = manifestBlock.getUsesPermissions(); + List usesPermissionList=manifestBlock.getUsesPermissions(); for(String usesPermission:usesPermissionList){ System.out.println("Uses permission: "+usesPermission); } @@ -90,9 +90,9 @@ public static void exampleManifest() throws IOException{ manifestBlock.setVersionName("9.0.4"); // Modify xml attribute - List activityList = manifestBlock.listActivities(); + List activityList=manifestBlock.listActivities(); for(ResXmlElement activityElement:activityList){ - ResXmlAttribute attributeName = activityElement.searchAttributeByResourceId(AndroidManifestBlock.ID_name); + ResXmlAttribute attributeName=activityElement.searchAttributeByResourceId(AndroidManifestBlock.ID_name); System.out.println("Old activity name: "+attributeName.getValueAsString()); attributeName.setValueAsString("com.app.MyActivity"); System.out.println("New activity name: "+attributeName.getValueAsString()); diff --git a/build.gradle b/build.gradle index 96daec6..e58e7f0 100755 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'java' -group 'com.reandroid.lib.arsc' +group 'com.reandroid' version '1.1.4' java { diff --git a/src/main/java/com/reandroid/lib/apk/APKLogger.java b/src/main/java/com/reandroid/apk/APKLogger.java similarity index 96% rename from src/main/java/com/reandroid/lib/apk/APKLogger.java rename to src/main/java/com/reandroid/apk/APKLogger.java index aec9c30..2ad571e 100644 --- a/src/main/java/com/reandroid/lib/apk/APKLogger.java +++ b/src/main/java/com/reandroid/apk/APKLogger.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; public interface APKLogger { void logMessage(String msg); diff --git a/src/main/java/com/reandroid/lib/apk/ApkBundle.java b/src/main/java/com/reandroid/apk/ApkBundle.java similarity index 97% rename from src/main/java/com/reandroid/lib/apk/ApkBundle.java rename to src/main/java/com/reandroid/apk/ApkBundle.java index 90ecf9d..85e7a45 100644 --- a/src/main/java/com/reandroid/lib/apk/ApkBundle.java +++ b/src/main/java/com/reandroid/apk/ApkBundle.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.APKArchive; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.pool.TableStringPool; -import com.reandroid.lib.arsc.pool.builder.StringPoolMerger; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.pool.TableStringPool; +import com.reandroid.arsc.pool.builder.StringPoolMerger; import java.io.File; import java.io.FileNotFoundException; diff --git a/src/main/java/com/reandroid/lib/apk/ApkJsonDecoder.java b/src/main/java/com/reandroid/apk/ApkJsonDecoder.java similarity index 94% rename from src/main/java/com/reandroid/lib/apk/ApkJsonDecoder.java rename to src/main/java/com/reandroid/apk/ApkJsonDecoder.java index 18a2a24..afd4852 100644 --- a/src/main/java/com/reandroid/lib/apk/ApkJsonDecoder.java +++ b/src/main/java/com/reandroid/apk/ApkJsonDecoder.java @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.InputSource; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.chunk.xml.AndroidManifestBlock; -import com.reandroid.lib.arsc.chunk.xml.ResXmlBlock; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.chunk.xml.AndroidManifestBlock; +import com.reandroid.arsc.chunk.xml.ResXmlDocument; +import com.reandroid.json.JSONObject; import java.io.File; import java.io.FileOutputStream; @@ -71,9 +71,9 @@ public class ApkJsonDecoder { InputSource inputSource= resFile.getInputSource(); String path=inputSource.getAlias(); File file=toResJson(dir, path); - ResXmlBlock resXmlBlock=new ResXmlBlock(); - resXmlBlock.readBytes(inputSource.openStream()); - JSONObject jsonObject=resXmlBlock.toJson(); + ResXmlDocument resXmlDocument =new ResXmlDocument(); + resXmlDocument.readBytes(inputSource.openStream()); + JSONObject jsonObject= resXmlDocument.toJson(); jsonObject.write(file); addDecoded(path); } diff --git a/src/main/java/com/reandroid/lib/apk/ApkJsonEncoder.java b/src/main/java/com/reandroid/apk/ApkJsonEncoder.java similarity index 97% rename from src/main/java/com/reandroid/lib/apk/ApkJsonEncoder.java rename to src/main/java/com/reandroid/apk/ApkJsonEncoder.java index f1a3d6f..942f521 100644 --- a/src/main/java/com/reandroid/lib/apk/ApkJsonEncoder.java +++ b/src/main/java/com/reandroid/apk/ApkJsonEncoder.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.APKArchive; import com.reandroid.archive.FileInputSource; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.chunk.xml.AndroidManifestBlock; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.chunk.xml.AndroidManifestBlock; import java.io.File; import java.io.IOException; diff --git a/src/main/java/com/reandroid/lib/apk/ApkModule.java b/src/main/java/com/reandroid/apk/ApkModule.java similarity index 95% rename from src/main/java/com/reandroid/lib/apk/ApkModule.java rename to src/main/java/com/reandroid/apk/ApkModule.java index 145d4de..5655b7e 100644 --- a/src/main/java/com/reandroid/lib/apk/ApkModule.java +++ b/src/main/java/com/reandroid/apk/ApkModule.java @@ -13,18 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.*; -import com.reandroid.lib.arsc.array.PackageArray; -import com.reandroid.lib.arsc.chunk.BaseChunk; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.chunk.xml.AndroidManifestBlock; -import com.reandroid.lib.arsc.group.StringGroup; -import com.reandroid.lib.arsc.item.TableString; -import com.reandroid.lib.arsc.pool.TableStringPool; -import com.reandroid.lib.arsc.value.EntryBlock; +import com.reandroid.arsc.array.PackageArray; +import com.reandroid.arsc.chunk.Chunk; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.chunk.xml.AndroidManifestBlock; +import com.reandroid.arsc.group.StringGroup; +import com.reandroid.arsc.item.TableString; +import com.reandroid.arsc.pool.TableStringPool; +import com.reandroid.arsc.value.EntryBlock; import java.io.File; import java.io.IOException; @@ -75,6 +75,9 @@ public class ApkModule { writeApk(file, null); } public void writeApk(File file, WriteProgress progress) throws IOException { + writeApk(file, progress, null); + } + public void writeApk(File file, WriteProgress progress, WriteInterceptor interceptor) throws IOException { uncompressNonXmlResFiles(); APKArchive archive=getApkArchive(); InputSource table=archive.getInputSource(TableBlock.FILE_NAME); @@ -96,6 +99,7 @@ public class ApkModule { } ZipSerializer serializer=new ZipSerializer(archive.listInputSources()); serializer.setWriteProgress(progress); + serializer.setWriteInterceptor(interceptor); serializer.writeZip(file); } private void uncompressNonXmlResFiles() throws IOException { @@ -288,7 +292,7 @@ public class ApkModule { }else if(inputSource instanceof SingleJsonTableInputSource){ tableBlock=((SingleJsonTableInputSource)inputSource).getTableBlock(); }else if(inputSource instanceof BlockInputSource){ - BaseChunk block = ((BlockInputSource) inputSource).getBlock(); + Chunk block = ((BlockInputSource) inputSource).getBlock(); tableBlock=(TableBlock) block; }else { InputStream inputStream = inputSource.openStream(); @@ -372,7 +376,7 @@ public class ApkModule { } } for(DexFileInputSource source:comingList){ - String name=DexFileInputSource.getDexName(index); + String name= DexFileInputSource.getDexName(index); DexFileInputSource add=new DexFileInputSource(name, source.getInputSource()); archive.add(add); logMessage("Added ["+module.getModuleName()+"] " diff --git a/src/main/java/com/reandroid/lib/apk/ApkModuleXmlDecoder.java b/src/main/java/com/reandroid/apk/ApkModuleXmlDecoder.java similarity index 92% rename from src/main/java/com/reandroid/lib/apk/ApkModuleXmlDecoder.java rename to src/main/java/com/reandroid/apk/ApkModuleXmlDecoder.java index 0416e53..670a554 100644 --- a/src/main/java/com/reandroid/lib/apk/ApkModuleXmlDecoder.java +++ b/src/main/java/com/reandroid/apk/ApkModuleXmlDecoder.java @@ -13,23 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.InputSource; -import com.reandroid.lib.apk.xmldecoder.XMLBagDecoder; -import com.reandroid.lib.apk.xmldecoder.XMLNamespaceValidator; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.chunk.TypeBlock; -import com.reandroid.lib.arsc.chunk.xml.AndroidManifestBlock; -import com.reandroid.lib.arsc.chunk.xml.ResXmlBlock; -import com.reandroid.lib.arsc.container.SpecTypePair; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.*; -import com.reandroid.lib.common.EntryStore; -import com.reandroid.lib.common.Frameworks; -import com.reandroid.lib.common.TableEntryStore; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.apk.xmldecoder.XMLBagDecoder; +import com.reandroid.apk.xmldecoder.XMLNamespaceValidator; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.chunk.TypeBlock; +import com.reandroid.arsc.chunk.xml.AndroidManifestBlock; +import com.reandroid.arsc.chunk.xml.ResXmlDocument; +import com.reandroid.arsc.container.SpecTypePair; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.*; +import com.reandroid.common.EntryStore; +import com.reandroid.common.Frameworks; +import com.reandroid.common.TableEntryStore; +import com.reandroid.json.JSONObject; import com.reandroid.xml.XMLAttribute; import com.reandroid.xml.XMLDocument; import com.reandroid.xml.XMLElement; @@ -130,8 +130,8 @@ import java.util.*; throws IOException, XMLException{ EntryBlock entryBlock=resFile.pickOne(); PackageBlock packageBlock=entryBlock.getPackageBlock(); - ResXmlBlock resXmlBlock=new ResXmlBlock(); - resXmlBlock.readBytes(resFile.getInputSource().openStream()); + ResXmlDocument resXmlDocument =new ResXmlDocument(); + resXmlDocument.readBytes(resFile.getInputSource().openStream()); File pkgDir=new File(outDir, getPackageDirName(packageBlock)); File resDir=new File(pkgDir, ApkUtil.RES_DIR_NAME); @@ -140,9 +140,9 @@ import java.util.*; File file=new File(resDir, path); logVerbose("Decoding: "+path); - XMLNamespaceValidator namespaceValidator=new XMLNamespaceValidator(resXmlBlock); + XMLNamespaceValidator namespaceValidator=new XMLNamespaceValidator(resXmlDocument); namespaceValidator.validate(); - XMLDocument xmlDocument=resXmlBlock.decodeToXml(entryStore, packageBlock.getId()); + XMLDocument xmlDocument= resXmlDocument.decodeToXml(entryStore, packageBlock.getId()); xmlDocument.save(file, true); addDecodedEntry(resFile.pickOne()); diff --git a/src/main/java/com/reandroid/lib/apk/ApkModuleXmlEncoder.java b/src/main/java/com/reandroid/apk/ApkModuleXmlEncoder.java similarity index 92% rename from src/main/java/com/reandroid/lib/apk/ApkModuleXmlEncoder.java rename to src/main/java/com/reandroid/apk/ApkModuleXmlEncoder.java index 1791990..84b180d 100644 --- a/src/main/java/com/reandroid/lib/apk/ApkModuleXmlEncoder.java +++ b/src/main/java/com/reandroid/apk/ApkModuleXmlEncoder.java @@ -13,13 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.APKArchive; import com.reandroid.archive.FileInputSource; - import com.reandroid.lib.apk.xmlencoder.RESEncoder; - import com.reandroid.lib.arsc.chunk.TableBlock; - import com.reandroid.lib.json.JSONObject; + import com.reandroid.apk.xmlencoder.RESEncoder; + import com.reandroid.arsc.chunk.TableBlock; import com.reandroid.xml.XMLException; import java.io.File; diff --git a/src/main/java/com/reandroid/lib/apk/ApkUtil.java b/src/main/java/com/reandroid/apk/ApkUtil.java similarity index 97% rename from src/main/java/com/reandroid/lib/apk/ApkUtil.java rename to src/main/java/com/reandroid/apk/ApkUtil.java index be7d815..e379220 100644 --- a/src/main/java/com/reandroid/lib/apk/ApkUtil.java +++ b/src/main/java/com/reandroid/apk/ApkUtil.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.InputSource; @@ -39,7 +39,7 @@ public class ApkUtil { public static String toArchiveResourcePath(File dir, File file){ String path = toArchivePath(dir, file); if(path.endsWith(ApkUtil.JSON_FILE_EXTENSION)){ - int i2=path.length()-ApkUtil.JSON_FILE_EXTENSION.length(); + int i2=path.length()- ApkUtil.JSON_FILE_EXTENSION.length(); path=path.substring(0, i2); } return path; diff --git a/src/main/java/com/reandroid/lib/apk/BlockInputSource.java b/src/main/java/com/reandroid/apk/BlockInputSource.java similarity index 81% rename from src/main/java/com/reandroid/lib/apk/BlockInputSource.java rename to src/main/java/com/reandroid/apk/BlockInputSource.java index 3356218..e70cb21 100644 --- a/src/main/java/com/reandroid/lib/apk/BlockInputSource.java +++ b/src/main/java/com/reandroid/apk/BlockInputSource.java @@ -13,20 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.ByteInputSource; -import com.reandroid.archive.InputSource; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.chunk.BaseChunk; -import com.reandroid.lib.arsc.chunk.TableBlock; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.chunk.Chunk; -import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; -public class BlockInputSource extends ByteInputSource{ +public class BlockInputSource extends ByteInputSource{ private final T mBlock; public BlockInputSource(String name, T block) { super(new byte[0], name); diff --git a/src/main/java/com/reandroid/lib/apk/CrcOutputStream.java b/src/main/java/com/reandroid/apk/CrcOutputStream.java similarity index 98% rename from src/main/java/com/reandroid/lib/apk/CrcOutputStream.java rename to src/main/java/com/reandroid/apk/CrcOutputStream.java index 8972c8b..b99d5f3 100644 --- a/src/main/java/com/reandroid/lib/apk/CrcOutputStream.java +++ b/src/main/java/com/reandroid/apk/CrcOutputStream.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import java.io.IOException; import java.io.OutputStream; diff --git a/src/main/java/com/reandroid/lib/apk/DexFileInputSource.java b/src/main/java/com/reandroid/apk/DexFileInputSource.java similarity index 98% rename from src/main/java/com/reandroid/lib/apk/DexFileInputSource.java rename to src/main/java/com/reandroid/apk/DexFileInputSource.java index 9a6e90f..195d699 100644 --- a/src/main/java/com/reandroid/lib/apk/DexFileInputSource.java +++ b/src/main/java/com/reandroid/apk/DexFileInputSource.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.InputSource; diff --git a/src/main/java/com/reandroid/lib/apk/FileMagic.java b/src/main/java/com/reandroid/apk/FileMagic.java similarity index 99% rename from src/main/java/com/reandroid/lib/apk/FileMagic.java rename to src/main/java/com/reandroid/apk/FileMagic.java index 6a0a7a3..f8acba2 100644 --- a/src/main/java/com/reandroid/lib/apk/FileMagic.java +++ b/src/main/java/com/reandroid/apk/FileMagic.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.InputSource; diff --git a/src/main/java/com/reandroid/lib/apk/FrameworkApk.java b/src/main/java/com/reandroid/apk/FrameworkApk.java similarity index 92% rename from src/main/java/com/reandroid/lib/apk/FrameworkApk.java rename to src/main/java/com/reandroid/apk/FrameworkApk.java index aa6a7df..d47676e 100644 --- a/src/main/java/com/reandroid/lib/apk/FrameworkApk.java +++ b/src/main/java/com/reandroid/apk/FrameworkApk.java @@ -13,16 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.APKArchive; import com.reandroid.archive.InputSource; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.chunk.xml.AndroidManifestBlock; -import com.reandroid.lib.arsc.chunk.xml.ResXmlAttribute; -import com.reandroid.lib.arsc.chunk.xml.ResXmlElement; -import com.reandroid.lib.arsc.util.FrameworkTable; -import com.reandroid.lib.arsc.value.ValueType; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.chunk.xml.AndroidManifestBlock; +import com.reandroid.arsc.chunk.xml.ResXmlAttribute; +import com.reandroid.arsc.chunk.xml.ResXmlElement; +import com.reandroid.arsc.util.FrameworkTable; +import com.reandroid.arsc.value.ValueType; import java.io.File; import java.io.IOException; diff --git a/src/main/java/com/reandroid/lib/apk/JsonManifestInputSource.java b/src/main/java/com/reandroid/apk/JsonManifestInputSource.java similarity index 93% rename from src/main/java/com/reandroid/lib/apk/JsonManifestInputSource.java rename to src/main/java/com/reandroid/apk/JsonManifestInputSource.java index 59bb87e..3173106 100644 --- a/src/main/java/com/reandroid/lib/apk/JsonManifestInputSource.java +++ b/src/main/java/com/reandroid/apk/JsonManifestInputSource.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.FileInputSource; import com.reandroid.archive.InputSource; -import com.reandroid.lib.arsc.chunk.xml.AndroidManifestBlock; +import com.reandroid.arsc.chunk.xml.AndroidManifestBlock; import java.io.File; diff --git a/src/main/java/com/reandroid/lib/apk/JsonXmlInputSource.java b/src/main/java/com/reandroid/apk/JsonXmlInputSource.java similarity index 78% rename from src/main/java/com/reandroid/lib/apk/JsonXmlInputSource.java rename to src/main/java/com/reandroid/apk/JsonXmlInputSource.java index 8bb472a..7989744 100644 --- a/src/main/java/com/reandroid/lib/apk/JsonXmlInputSource.java +++ b/src/main/java/com/reandroid/apk/JsonXmlInputSource.java @@ -13,14 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.FileInputSource; import com.reandroid.archive.InputSource; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.chunk.xml.ResXmlBlock; -import com.reandroid.lib.json.JSONException; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.chunk.xml.ResXmlDocument; +import com.reandroid.json.JSONException; +import com.reandroid.json.JSONObject; import java.io.*; @@ -37,28 +36,28 @@ public class JsonXmlInputSource extends InputSource { } @Override public InputStream openStream() throws IOException { - ResXmlBlock resXmlBlock= getResXmlBlock(); - return new ByteArrayInputStream(resXmlBlock.getBytes()); + ResXmlDocument resXmlDocument = getResXmlBlock(); + return new ByteArrayInputStream(resXmlDocument.getBytes()); } @Override public long getLength() throws IOException{ - ResXmlBlock resXmlBlock = getResXmlBlock(); - return resXmlBlock.countBytes(); + ResXmlDocument resXmlDocument = getResXmlBlock(); + return resXmlDocument.countBytes(); } - private ResXmlBlock getResXmlBlock() throws IOException{ + private ResXmlDocument getResXmlBlock() throws IOException{ logVerbose("From json: "+getAlias()); - ResXmlBlock resXmlBlock=newInstance(); + ResXmlDocument resXmlDocument =newInstance(); InputStream inputStream=inputSource.openStream(); try{ JSONObject jsonObject=new JSONObject(inputStream); - resXmlBlock.fromJson(jsonObject); + resXmlDocument.fromJson(jsonObject); }catch (JSONException ex){ throw new IOException(inputSource.getAlias()+": "+ex.getMessage(), ex); } - return resXmlBlock; + return resXmlDocument; } - ResXmlBlock newInstance(){ - return new ResXmlBlock(); + ResXmlDocument newInstance(){ + return new ResXmlDocument(); } void setAPKLogger(APKLogger logger) { this.apkLogger = logger; diff --git a/src/main/java/com/reandroid/lib/apk/RenamedInputSource.java b/src/main/java/com/reandroid/apk/RenamedInputSource.java similarity index 98% rename from src/main/java/com/reandroid/lib/apk/RenamedInputSource.java rename to src/main/java/com/reandroid/apk/RenamedInputSource.java index 2398d7e..8e1545c 100644 --- a/src/main/java/com/reandroid/lib/apk/RenamedInputSource.java +++ b/src/main/java/com/reandroid/apk/RenamedInputSource.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.InputSource; diff --git a/src/main/java/com/reandroid/lib/apk/ResFile.java b/src/main/java/com/reandroid/apk/ResFile.java similarity index 91% rename from src/main/java/com/reandroid/lib/apk/ResFile.java rename to src/main/java/com/reandroid/apk/ResFile.java index 1fe9fda..2d8109f 100644 --- a/src/main/java/com/reandroid/lib/apk/ResFile.java +++ b/src/main/java/com/reandroid/apk/ResFile.java @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.InputSource; -import com.reandroid.lib.apk.xmlencoder.XMLEncodeSource; -import com.reandroid.lib.arsc.chunk.TypeBlock; -import com.reandroid.lib.arsc.chunk.xml.ResXmlBlock; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.apk.xmlencoder.XMLEncodeSource; +import com.reandroid.arsc.chunk.TypeBlock; +import com.reandroid.arsc.chunk.xml.ResXmlDocument; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.json.JSONObject; import java.io.File; import java.io.IOException; @@ -117,7 +117,7 @@ public class ResFile { }else{ try { InputStream inputStream=getInputSource().openStream(); - mBinXml=ResXmlBlock.isResXmlBlock(inputStream); + mBinXml= ResXmlDocument.isResXmlBlock(inputStream); inputStream.close(); } catch (IOException ignored) { } @@ -131,9 +131,9 @@ public class ResFile { String fileName=getFilePath()+ApkUtil.JSON_FILE_EXTENSION; fileName=fileName.replace('/', File.separatorChar); File file=new File(rootDir, fileName); - ResXmlBlock resXmlBlock=new ResXmlBlock(); - resXmlBlock.readBytes(getInputSource().openStream()); - JSONObject jsonObject=resXmlBlock.toJson(); + ResXmlDocument resXmlDocument =new ResXmlDocument(); + resXmlDocument.readBytes(getInputSource().openStream()); + JSONObject jsonObject= resXmlDocument.toJson(); jsonObject.write(file); return true; } diff --git a/src/main/java/com/reandroid/lib/apk/ResourceIds.java b/src/main/java/com/reandroid/apk/ResourceIds.java similarity index 98% rename from src/main/java/com/reandroid/lib/apk/ResourceIds.java rename to src/main/java/com/reandroid/apk/ResourceIds.java index 13ab0d7..be87b07 100644 --- a/src/main/java/com/reandroid/lib/apk/ResourceIds.java +++ b/src/main/java/com/reandroid/apk/ResourceIds.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.group.EntryGroup; -import com.reandroid.lib.arsc.pool.SpecStringPool; -import com.reandroid.lib.arsc.util.ResNameMap; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.group.EntryGroup; +import com.reandroid.arsc.pool.SpecStringPool; +import com.reandroid.arsc.util.ResNameMap; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONObject; import com.reandroid.xml.*; import java.io.*; diff --git a/src/main/java/com/reandroid/lib/apk/SingleJsonTableInputSource.java b/src/main/java/com/reandroid/apk/SingleJsonTableInputSource.java similarity index 95% rename from src/main/java/com/reandroid/lib/apk/SingleJsonTableInputSource.java rename to src/main/java/com/reandroid/apk/SingleJsonTableInputSource.java index 00dc8ff..6ac7a77 100644 --- a/src/main/java/com/reandroid/lib/apk/SingleJsonTableInputSource.java +++ b/src/main/java/com/reandroid/apk/SingleJsonTableInputSource.java @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.FileInputSource; import com.reandroid.archive.InputSource; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.json.JSONException; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.json.JSONException; +import com.reandroid.json.JSONObject; import java.io.*; diff --git a/src/main/java/com/reandroid/lib/apk/SplitJsonTableInputSource.java b/src/main/java/com/reandroid/apk/SplitJsonTableInputSource.java similarity index 96% rename from src/main/java/com/reandroid/lib/apk/SplitJsonTableInputSource.java rename to src/main/java/com/reandroid/apk/SplitJsonTableInputSource.java index ff67e3a..0f8618b 100644 --- a/src/main/java/com/reandroid/lib/apk/SplitJsonTableInputSource.java +++ b/src/main/java/com/reandroid/apk/SplitJsonTableInputSource.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.InputSource; -import com.reandroid.lib.arsc.chunk.TableBlock; +import com.reandroid.arsc.chunk.TableBlock; import java.io.*; diff --git a/src/main/java/com/reandroid/lib/apk/StringPoolBuilder.java b/src/main/java/com/reandroid/apk/StringPoolBuilder.java similarity index 91% rename from src/main/java/com/reandroid/lib/apk/StringPoolBuilder.java rename to src/main/java/com/reandroid/apk/StringPoolBuilder.java index 7785732..02f124a 100644 --- a/src/main/java/com/reandroid/lib/apk/StringPoolBuilder.java +++ b/src/main/java/com/reandroid/apk/StringPoolBuilder.java @@ -13,17 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.pool.SpecStringPool; -import com.reandroid.lib.arsc.pool.TableStringPool; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ValueType; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONException; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.pool.SpecStringPool; +import com.reandroid.arsc.pool.TableStringPool; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ValueType; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONException; +import com.reandroid.json.JSONObject; import java.io.File; import java.io.FileInputStream; diff --git a/src/main/java/com/reandroid/lib/apk/TableBlockJson.java b/src/main/java/com/reandroid/apk/TableBlockJson.java similarity index 90% rename from src/main/java/com/reandroid/lib/apk/TableBlockJson.java rename to src/main/java/com/reandroid/apk/TableBlockJson.java index f97192f..cd1331f 100644 --- a/src/main/java/com/reandroid/lib/apk/TableBlockJson.java +++ b/src/main/java/com/reandroid/apk/TableBlockJson.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; -import com.reandroid.lib.arsc.BuildInfo; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.StagedAlias; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.chunk.TypeBlock; -import com.reandroid.lib.arsc.container.SpecTypePair; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.BuildInfo; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.StagedAlias; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.chunk.TypeBlock; +import com.reandroid.arsc.container.SpecTypePair; +import com.reandroid.json.JSONObject; import java.io.File; import java.io.IOException; diff --git a/src/main/java/com/reandroid/lib/apk/TableBlockJsonBuilder.java b/src/main/java/com/reandroid/apk/TableBlockJsonBuilder.java similarity index 90% rename from src/main/java/com/reandroid/lib/apk/TableBlockJsonBuilder.java rename to src/main/java/com/reandroid/apk/TableBlockJsonBuilder.java index d3f0428..1880496 100644 --- a/src/main/java/com/reandroid/lib/apk/TableBlockJsonBuilder.java +++ b/src/main/java/com/reandroid/apk/TableBlockJsonBuilder.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.StagedAlias; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.chunk.TypeBlock; -import com.reandroid.lib.arsc.value.ResConfig; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.StagedAlias; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.chunk.TypeBlock; +import com.reandroid.arsc.value.ResConfig; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONObject; import java.io.File; import java.io.FileInputStream; diff --git a/src/main/java/com/reandroid/lib/apk/UncompressedFiles.java b/src/main/java/com/reandroid/apk/UncompressedFiles.java similarity index 97% rename from src/main/java/com/reandroid/lib/apk/UncompressedFiles.java rename to src/main/java/com/reandroid/apk/UncompressedFiles.java index 339c400..da86be8 100644 --- a/src/main/java/com/reandroid/lib/apk/UncompressedFiles.java +++ b/src/main/java/com/reandroid/apk/UncompressedFiles.java @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; import com.reandroid.archive.InputSource; import com.reandroid.archive.ZipArchive; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONObject; import java.io.File; import java.io.FileInputStream; diff --git a/src/main/java/com/reandroid/lib/apk/XmlHelper.java b/src/main/java/com/reandroid/apk/XmlHelper.java similarity index 93% rename from src/main/java/com/reandroid/lib/apk/XmlHelper.java rename to src/main/java/com/reandroid/apk/XmlHelper.java index cd49e27..bf38694 100644 --- a/src/main/java/com/reandroid/lib/apk/XmlHelper.java +++ b/src/main/java/com/reandroid/apk/XmlHelper.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk; +package com.reandroid.apk; -import com.reandroid.lib.arsc.item.StringItem; +import com.reandroid.arsc.item.StringItem; import com.reandroid.xml.XMLElement; public class XmlHelper { diff --git a/src/main/java/com/reandroid/lib/apk/xmldecoder/BagDecoder.java b/src/main/java/com/reandroid/apk/xmldecoder/BagDecoder.java similarity index 88% rename from src/main/java/com/reandroid/lib/apk/xmldecoder/BagDecoder.java rename to src/main/java/com/reandroid/apk/xmldecoder/BagDecoder.java index f0a2c56..7de9a2e 100644 --- a/src/main/java/com/reandroid/lib/apk/xmldecoder/BagDecoder.java +++ b/src/main/java/com/reandroid/apk/xmldecoder/BagDecoder.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmldecoder; +package com.reandroid.apk.xmldecoder; -import com.reandroid.lib.arsc.value.ResValueBag; -import com.reandroid.lib.common.EntryStore; +import com.reandroid.arsc.value.ResValueBag; +import com.reandroid.common.EntryStore; import com.reandroid.xml.XMLElement; abstract class BagDecoder { diff --git a/src/main/java/com/reandroid/lib/apk/xmldecoder/XMLArrayDecoder.java b/src/main/java/com/reandroid/apk/xmldecoder/XMLArrayDecoder.java similarity index 88% rename from src/main/java/com/reandroid/lib/apk/xmldecoder/XMLArrayDecoder.java rename to src/main/java/com/reandroid/apk/xmldecoder/XMLArrayDecoder.java index 90df2d4..8a32971 100644 --- a/src/main/java/com/reandroid/lib/apk/xmldecoder/XMLArrayDecoder.java +++ b/src/main/java/com/reandroid/apk/xmldecoder/XMLArrayDecoder.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmldecoder; +package com.reandroid.apk.xmldecoder; -import com.reandroid.lib.apk.ApkUtil; -import com.reandroid.lib.apk.XmlHelper; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.ResValueBag; -import com.reandroid.lib.arsc.value.ResValueBagItem; -import com.reandroid.lib.arsc.value.ValueType; -import com.reandroid.lib.common.EntryStore; +import com.reandroid.apk.ApkUtil; +import com.reandroid.apk.XmlHelper; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.ResValueBag; +import com.reandroid.arsc.value.ResValueBagItem; +import com.reandroid.arsc.value.ValueType; +import com.reandroid.common.EntryStore; import com.reandroid.xml.XMLElement; import java.util.HashSet; diff --git a/src/main/java/com/reandroid/lib/apk/xmldecoder/XMLAttrDecoder.java b/src/main/java/com/reandroid/apk/xmldecoder/XMLAttrDecoder.java similarity index 91% rename from src/main/java/com/reandroid/lib/apk/xmldecoder/XMLAttrDecoder.java rename to src/main/java/com/reandroid/apk/xmldecoder/XMLAttrDecoder.java index aba56fe..a7e8b9e 100644 --- a/src/main/java/com/reandroid/lib/apk/xmldecoder/XMLAttrDecoder.java +++ b/src/main/java/com/reandroid/apk/xmldecoder/XMLAttrDecoder.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmldecoder; +package com.reandroid.apk.xmldecoder; -import com.reandroid.lib.arsc.value.ResValueBag; -import com.reandroid.lib.arsc.value.attribute.AttributeBag; -import com.reandroid.lib.arsc.value.attribute.AttributeBagItem; -import com.reandroid.lib.common.EntryStore; +import com.reandroid.arsc.value.ResValueBag; +import com.reandroid.arsc.value.attribute.AttributeBag; +import com.reandroid.arsc.value.attribute.AttributeBagItem; +import com.reandroid.common.EntryStore; import com.reandroid.xml.XMLElement; class XMLAttrDecoder extends BagDecoder{ diff --git a/src/main/java/com/reandroid/lib/apk/xmldecoder/XMLBagDecoder.java b/src/main/java/com/reandroid/apk/xmldecoder/XMLBagDecoder.java similarity index 92% rename from src/main/java/com/reandroid/lib/apk/xmldecoder/XMLBagDecoder.java rename to src/main/java/com/reandroid/apk/xmldecoder/XMLBagDecoder.java index f5194de..db4a205 100644 --- a/src/main/java/com/reandroid/lib/apk/xmldecoder/XMLBagDecoder.java +++ b/src/main/java/com/reandroid/apk/xmldecoder/XMLBagDecoder.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmldecoder; +package com.reandroid.apk.xmldecoder; -import com.reandroid.lib.arsc.value.ResValueBag; -import com.reandroid.lib.common.EntryStore; +import com.reandroid.arsc.value.ResValueBag; +import com.reandroid.common.EntryStore; import com.reandroid.xml.XMLElement; import java.util.ArrayList; diff --git a/src/main/java/com/reandroid/lib/apk/xmldecoder/XMLCommonBagDecoder.java b/src/main/java/com/reandroid/apk/xmldecoder/XMLCommonBagDecoder.java similarity index 86% rename from src/main/java/com/reandroid/lib/apk/xmldecoder/XMLCommonBagDecoder.java rename to src/main/java/com/reandroid/apk/xmldecoder/XMLCommonBagDecoder.java index 25e3ace..6769a2f 100644 --- a/src/main/java/com/reandroid/lib/apk/xmldecoder/XMLCommonBagDecoder.java +++ b/src/main/java/com/reandroid/apk/xmldecoder/XMLCommonBagDecoder.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmldecoder; +package com.reandroid.apk.xmldecoder; -import com.reandroid.lib.apk.XmlHelper; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.ResValueBag; -import com.reandroid.lib.arsc.value.ResValueBagItem; -import com.reandroid.lib.arsc.value.ValueType; -import com.reandroid.lib.common.EntryStore; +import com.reandroid.apk.XmlHelper; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.ResValueBag; +import com.reandroid.arsc.value.ResValueBagItem; +import com.reandroid.arsc.value.ValueType; +import com.reandroid.common.EntryStore; import com.reandroid.xml.XMLElement; class XMLCommonBagDecoder extends BagDecoder{ diff --git a/src/main/java/com/reandroid/lib/apk/xmldecoder/XMLNamespaceValidator.java b/src/main/java/com/reandroid/apk/xmldecoder/XMLNamespaceValidator.java similarity index 96% rename from src/main/java/com/reandroid/lib/apk/xmldecoder/XMLNamespaceValidator.java rename to src/main/java/com/reandroid/apk/xmldecoder/XMLNamespaceValidator.java index f891992..53eee30 100644 --- a/src/main/java/com/reandroid/lib/apk/xmldecoder/XMLNamespaceValidator.java +++ b/src/main/java/com/reandroid/apk/xmldecoder/XMLNamespaceValidator.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmldecoder; +package com.reandroid.apk.xmldecoder; -import com.reandroid.lib.arsc.chunk.xml.*; +import com.reandroid.arsc.chunk.xml.*; import java.util.ArrayList; import java.util.List; @@ -25,12 +25,12 @@ public class XMLNamespaceValidator { private static final String URI_APP="http://schemas.android.com/apk/res-auto"; private static final String PREFIX_ANDROID ="android"; private static final String PREFIX_APP="app"; - private final ResXmlBlock xmlBlock; + private final ResXmlDocument xmlBlock; private List mAttributeList; private ResXmlElement mRootElement; private ResXmlStartNamespace mNsAndroid; private ResXmlStartNamespace mNsApp; - public XMLNamespaceValidator(ResXmlBlock xmlBlock){ + public XMLNamespaceValidator(ResXmlDocument xmlBlock){ this.xmlBlock=xmlBlock; } public void validate(){ diff --git a/src/main/java/com/reandroid/lib/apk/xmldecoder/XMLPluralsDecoder.java b/src/main/java/com/reandroid/apk/xmldecoder/XMLPluralsDecoder.java similarity index 85% rename from src/main/java/com/reandroid/lib/apk/xmldecoder/XMLPluralsDecoder.java rename to src/main/java/com/reandroid/apk/xmldecoder/XMLPluralsDecoder.java index a6848bd..c71a61c 100644 --- a/src/main/java/com/reandroid/lib/apk/xmldecoder/XMLPluralsDecoder.java +++ b/src/main/java/com/reandroid/apk/xmldecoder/XMLPluralsDecoder.java @@ -13,16 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmldecoder; +package com.reandroid.apk.xmldecoder; -import com.reandroid.lib.apk.XmlHelper; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.BaseResValue; -import com.reandroid.lib.arsc.value.ResValueBag; -import com.reandroid.lib.arsc.value.ResValueBagItem; -import com.reandroid.lib.arsc.value.ValueType; -import com.reandroid.lib.arsc.value.plurals.PluralsQuantity; -import com.reandroid.lib.common.EntryStore; +import com.reandroid.apk.XmlHelper; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.BaseResValue; +import com.reandroid.arsc.value.ResValueBag; +import com.reandroid.arsc.value.ResValueBagItem; +import com.reandroid.arsc.value.ValueType; +import com.reandroid.arsc.value.plurals.PluralsQuantity; +import com.reandroid.common.EntryStore; import com.reandroid.xml.XMLElement; class XMLPluralsDecoder extends BagDecoder{ diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/EncodeException.java b/src/main/java/com/reandroid/apk/xmlencoder/EncodeException.java similarity index 95% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/EncodeException.java rename to src/main/java/com/reandroid/apk/xmlencoder/EncodeException.java index 64074ec..c997bba 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/EncodeException.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/EncodeException.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; public class EncodeException extends IllegalArgumentException{ public EncodeException(String message){ diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/EncodeMaterials.java b/src/main/java/com/reandroid/apk/xmlencoder/EncodeMaterials.java similarity index 94% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/EncodeMaterials.java rename to src/main/java/com/reandroid/apk/xmlencoder/EncodeMaterials.java index 4f17dff..f65f970 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/EncodeMaterials.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/EncodeMaterials.java @@ -13,24 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.reandroid.lib.apk.xmlencoder; + package com.reandroid.apk.xmlencoder; - import com.reandroid.lib.apk.APKLogger; - import com.reandroid.lib.apk.ResourceIds; - import com.reandroid.lib.arsc.chunk.PackageBlock; - import com.reandroid.lib.arsc.chunk.TableBlock; - import com.reandroid.lib.arsc.chunk.TypeBlock; - import com.reandroid.lib.arsc.container.SpecTypePair; - import com.reandroid.lib.arsc.decoder.ValueDecoder; - import com.reandroid.lib.arsc.group.EntryGroup; - import com.reandroid.lib.arsc.item.SpecString; - import com.reandroid.lib.arsc.util.FrameworkTable; - import com.reandroid.lib.arsc.util.ResNameMap; - import com.reandroid.lib.arsc.value.EntryBlock; - import com.reandroid.lib.common.Frameworks; - import com.reandroid.lib.common.ResourceResolver; + import com.reandroid.apk.APKLogger; + import com.reandroid.apk.ResourceIds; + import com.reandroid.arsc.chunk.PackageBlock; + import com.reandroid.arsc.chunk.TableBlock; + import com.reandroid.arsc.chunk.TypeBlock; + import com.reandroid.arsc.container.SpecTypePair; + import com.reandroid.arsc.decoder.ValueDecoder; + import com.reandroid.arsc.group.EntryGroup; + import com.reandroid.arsc.item.SpecString; + import com.reandroid.arsc.util.FrameworkTable; + import com.reandroid.arsc.util.ResNameMap; + import com.reandroid.arsc.value.EntryBlock; + import com.reandroid.common.Frameworks; + import com.reandroid.common.ResourceResolver; - import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.regex.Matcher; diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/EncodeUtil.java b/src/main/java/com/reandroid/apk/xmlencoder/EncodeUtil.java similarity index 99% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/EncodeUtil.java rename to src/main/java/com/reandroid/apk/xmlencoder/EncodeUtil.java index 5f52f04..b6b3e0a 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/EncodeUtil.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/EncodeUtil.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; import java.io.File; import java.util.Comparator; diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/FilePathEncoder.java b/src/main/java/com/reandroid/apk/xmlencoder/FilePathEncoder.java similarity index 93% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/FilePathEncoder.java rename to src/main/java/com/reandroid/apk/xmlencoder/FilePathEncoder.java index 82a3673..8de5199 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/FilePathEncoder.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/FilePathEncoder.java @@ -13,16 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; import com.reandroid.archive.APKArchive; import com.reandroid.archive.FileInputSource; import com.reandroid.archive.InputSource; - import com.reandroid.lib.apk.ApkUtil; - import com.reandroid.lib.apk.UncompressedFiles; - import com.reandroid.lib.arsc.chunk.PackageBlock; - import com.reandroid.lib.arsc.chunk.TypeBlock; - import com.reandroid.lib.arsc.value.EntryBlock; + import com.reandroid.apk.ApkUtil; + import com.reandroid.apk.UncompressedFiles; + import com.reandroid.arsc.chunk.PackageBlock; + import com.reandroid.arsc.chunk.TypeBlock; + import com.reandroid.arsc.value.EntryBlock; import com.reandroid.xml.source.XMLFileSource; import com.reandroid.xml.source.XMLSource; diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/PackageCreator.java b/src/main/java/com/reandroid/apk/xmlencoder/PackageCreator.java similarity index 92% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/PackageCreator.java rename to src/main/java/com/reandroid/apk/xmlencoder/PackageCreator.java index 73f244d..64145e4 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/PackageCreator.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/PackageCreator.java @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.apk.APKLogger; -import com.reandroid.lib.apk.ResourceIds; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.pool.TypeStringPool; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.apk.APKLogger; +import com.reandroid.apk.ResourceIds; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.pool.TypeStringPool; +import com.reandroid.json.JSONObject; import java.io.File; import java.io.FileInputStream; diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/RESEncoder.java b/src/main/java/com/reandroid/apk/xmlencoder/RESEncoder.java similarity index 96% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/RESEncoder.java rename to src/main/java/com/reandroid/apk/xmlencoder/RESEncoder.java index 05d8d60..c5b9149 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/RESEncoder.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/RESEncoder.java @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.reandroid.lib.apk.xmlencoder; + package com.reandroid.apk.xmlencoder; + import com.reandroid.apk.*; import com.reandroid.archive.APKArchive; - import com.reandroid.lib.apk.*; - import com.reandroid.lib.arsc.chunk.PackageBlock; - import com.reandroid.lib.arsc.chunk.TableBlock; - import com.reandroid.lib.arsc.chunk.xml.AndroidManifestBlock; - import com.reandroid.lib.common.Frameworks; + import com.reandroid.arsc.chunk.PackageBlock; + import com.reandroid.arsc.chunk.TableBlock; + import com.reandroid.arsc.chunk.xml.AndroidManifestBlock; + import com.reandroid.common.Frameworks; import com.reandroid.xml.XMLDocument; import com.reandroid.xml.XMLException; import com.reandroid.xml.source.XMLFileSource; @@ -64,7 +64,7 @@ List pubXmlFileList = searchPublicXmlFiles(mainDir); if(pubXmlFileList.size()==0){ throw new IOException("No .*/values/" - +ApkUtil.FILE_NAME_PUBLIC_XML+" file found in '"+mainDir); + + ApkUtil.FILE_NAME_PUBLIC_XML+" file found in '"+mainDir); } preloadStringPool(pubXmlFileList); diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/ValuesEncoder.java b/src/main/java/com/reandroid/apk/xmlencoder/ValuesEncoder.java similarity index 98% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/ValuesEncoder.java rename to src/main/java/com/reandroid/apk/xmlencoder/ValuesEncoder.java index 78322b8..dc52251 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/ValuesEncoder.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/ValuesEncoder.java @@ -13,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.apk.ApkUtil; import com.reandroid.xml.XMLDocument; import com.reandroid.xml.XMLElement; import com.reandroid.xml.XMLException; diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/ValuesStringPoolBuilder.java b/src/main/java/com/reandroid/apk/xmlencoder/ValuesStringPoolBuilder.java similarity index 94% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/ValuesStringPoolBuilder.java rename to src/main/java/com/reandroid/apk/xmlencoder/ValuesStringPoolBuilder.java index 10fa61c..330caa4 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/ValuesStringPoolBuilder.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/ValuesStringPoolBuilder.java @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.arsc.array.StyleArray; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.item.StyleItem; -import com.reandroid.lib.arsc.item.TableString; -import com.reandroid.lib.arsc.pool.TableStringPool; +import com.reandroid.arsc.array.StyleArray; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.item.StyleItem; +import com.reandroid.arsc.item.TableString; +import com.reandroid.arsc.pool.TableStringPool; import com.reandroid.xml.XMLDocument; import com.reandroid.xml.XMLElement; import com.reandroid.xml.XMLSpanInfo; diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLEncodeSource.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLEncodeSource.java similarity index 79% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/XMLEncodeSource.java rename to src/main/java/com/reandroid/apk/xmlencoder/XMLEncodeSource.java index 5e6f071..bc16f3e 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLEncodeSource.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLEncodeSource.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; import com.reandroid.archive.ByteInputSource; -import com.reandroid.lib.apk.CrcOutputStream; -import com.reandroid.lib.arsc.chunk.xml.ResXmlBlock; +import com.reandroid.apk.CrcOutputStream; +import com.reandroid.arsc.chunk.xml.ResXmlDocument; import com.reandroid.xml.XMLException; import com.reandroid.xml.source.XMLSource; @@ -27,7 +27,7 @@ import java.io.OutputStream; public class XMLEncodeSource extends ByteInputSource { private final EncodeMaterials encodeMaterials; private final XMLSource xmlSource; - private ResXmlBlock resXmlBlock; + private ResXmlDocument resXmlDocument; public XMLEncodeSource(EncodeMaterials encodeMaterials, XMLSource xmlSource){ super(new byte[0], xmlSource.getPath()); this.encodeMaterials=encodeMaterials; @@ -39,9 +39,9 @@ public class XMLEncodeSource extends ByteInputSource { } @Override public long getCrc() throws IOException{ - ResXmlBlock resXmlBlock = getResXmlBlock(); + ResXmlDocument resXmlDocument = getResXmlBlock(); CrcOutputStream outputStream=new CrcOutputStream(); - resXmlBlock.writeBytes(outputStream); + resXmlDocument.writeBytes(outputStream); return outputStream.getCrcValue(); } @Override @@ -57,26 +57,26 @@ public class XMLEncodeSource extends ByteInputSource { //should not reach here return new byte[0]; } - public ResXmlBlock getResXmlBlock() throws IOException{ - if(resXmlBlock!=null){ - return resXmlBlock; + public ResXmlDocument getResXmlBlock() throws IOException{ + if(resXmlDocument !=null){ + return resXmlDocument; } try { XMLFileEncoder xmlFileEncoder=new XMLFileEncoder(encodeMaterials); xmlFileEncoder.setCurrentPath(xmlSource.getPath()); encodeMaterials.logVerbose("Encoding xml: "+xmlSource.getPath()); - resXmlBlock = xmlFileEncoder.encode(xmlSource.getXMLDocument()); + resXmlDocument = xmlFileEncoder.encode(xmlSource.getXMLDocument()); } catch (XMLException ex) { throw new EncodeException("XMLException on: '"+xmlSource.getPath() +"'\n '"+ex.getMessage()+"'"); } - return resXmlBlock; + return resXmlDocument; } @Override public void disposeInputSource(){ this.xmlSource.disposeXml(); - if(this.resXmlBlock!=null){ - resXmlBlock=null; + if(this.resXmlDocument !=null){ + resXmlDocument =null; } } } diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLFileEncoder.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLFileEncoder.java similarity index 87% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/XMLFileEncoder.java rename to src/main/java/com/reandroid/apk/xmlencoder/XMLFileEncoder.java index c7e55e3..97a0a2c 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLFileEncoder.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLFileEncoder.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.arsc.chunk.xml.*; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResValueBag; -import com.reandroid.lib.arsc.value.ValueType; -import com.reandroid.lib.arsc.value.attribute.AttributeBag; -import com.reandroid.lib.arsc.value.attribute.AttributeValueType; +import com.reandroid.arsc.chunk.xml.*; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResValueBag; +import com.reandroid.arsc.value.ValueType; +import com.reandroid.arsc.value.attribute.AttributeBag; +import com.reandroid.arsc.value.attribute.AttributeValueType; import com.reandroid.xml.*; import java.io.File; @@ -29,7 +29,7 @@ import java.io.InputStream; public class XMLFileEncoder { private final EncodeMaterials materials; - private ResXmlBlock resXmlBlock; + private ResXmlDocument resXmlDocument; private String mCurrentPath; public XMLFileEncoder(EncodeMaterials materials){ this.materials=materials; @@ -39,7 +39,7 @@ public class XMLFileEncoder { public void setCurrentPath(String path) { this.mCurrentPath = path; } - public ResXmlBlock encode(String xmlString){ + public ResXmlDocument encode(String xmlString){ try { return encode(XMLDocument.load(xmlString)); } catch (XMLException ex) { @@ -47,7 +47,7 @@ public class XMLFileEncoder { } return null; } - public ResXmlBlock encode(InputStream inputStream){ + public ResXmlDocument encode(InputStream inputStream){ try { return encode(XMLDocument.load(inputStream)); } catch (XMLException ex) { @@ -55,7 +55,7 @@ public class XMLFileEncoder { } return null; } - public ResXmlBlock encode(File xmlFile){ + public ResXmlDocument encode(File xmlFile){ setCurrentPath(xmlFile.getAbsolutePath()); try { return encode(XMLDocument.load(xmlFile)); @@ -64,19 +64,19 @@ public class XMLFileEncoder { } return null; } - public ResXmlBlock encode(XMLDocument xmlDocument){ - resXmlBlock=new ResXmlBlock(); + public ResXmlDocument encode(XMLDocument xmlDocument){ + resXmlDocument =new ResXmlDocument(); buildIdMap(xmlDocument); buildElement(xmlDocument); - resXmlBlock.refresh(); - return resXmlBlock; + resXmlDocument.refresh(); + return resXmlDocument; } - public ResXmlBlock getResXmlBlock(){ - return resXmlBlock; + public ResXmlDocument getResXmlBlock(){ + return resXmlDocument; } private void buildElement(XMLDocument xmlDocument){ XMLElement element = xmlDocument.getDocumentElement(); - ResXmlElement resXmlElement = resXmlBlock.createRootElement(element.getTagName()); + ResXmlElement resXmlElement = resXmlDocument.createRootElement(element.getTagName()); buildElement(element, resXmlElement); } private void buildElement(XMLElement element, ResXmlElement resXmlElement){ @@ -136,7 +136,7 @@ public class XMLFileEncoder { }else { xmlAttribute.setValueType(ValueType.REFERENCE); } - xmlAttribute.setRawValue(materials.resolveReference(valueText)); + xmlAttribute.setData(materials.resolveReference(valueText)); continue; } if(entryBlock!=null){ @@ -147,7 +147,7 @@ public class XMLFileEncoder { attributeBag.encodeEnumOrFlagValue(valueText); if(encodeResult!=null){ xmlAttribute.setValueType(encodeResult.valueType); - xmlAttribute.setRawValue(encodeResult.value); + xmlAttribute.setData(encodeResult.value); continue; } if(attributeBag.isEqualType(AttributeValueType.STRING)) { @@ -164,7 +164,7 @@ public class XMLFileEncoder { ValueDecoder.encodeGuessAny(valueText); if(encodeResult!=null){ xmlAttribute.setValueType(encodeResult.valueType); - xmlAttribute.setRawValue(encodeResult.value); + xmlAttribute.setData(encodeResult.value); }else { xmlAttribute.setValueAsString(ValueDecoder .unEscapeSpecialCharacter(valueText)); @@ -187,7 +187,7 @@ public class XMLFileEncoder { ResIdBuilder idBuilder=new ResIdBuilder(); XMLElement element= xmlDocument.getDocumentElement(); searchResIds(idBuilder, element); - idBuilder.buildTo(resXmlBlock.getResXmlIDMap()); + idBuilder.buildTo(resXmlDocument.getResXmlIDMap()); } private void searchResIds(ResIdBuilder idBuilder, XMLElement element){ for(XMLAttribute attribute : element.listAttributes()){ diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoder.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoder.java similarity index 91% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoder.java rename to src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoder.java index 7b070a9..a077fce 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoder.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoder.java @@ -13,16 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.TypeBlock; -import com.reandroid.lib.arsc.container.SpecTypePair; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.item.SpecString; -import com.reandroid.lib.arsc.pool.TypeStringPool; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ValueType; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.TypeBlock; +import com.reandroid.arsc.container.SpecTypePair; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.item.SpecString; +import com.reandroid.arsc.pool.TypeStringPool; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ValueType; import com.reandroid.xml.XMLDocument; import com.reandroid.xml.XMLElement; diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderArray.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderArray.java similarity index 90% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderArray.java rename to src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderArray.java index 915bc15..2e60ce3 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderArray.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderArray.java @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.apk.ApkUtil; -import com.reandroid.lib.arsc.array.ResValueBagItemArray; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.ResValueBag; -import com.reandroid.lib.arsc.value.ResValueBagItem; -import com.reandroid.lib.arsc.value.ValueType; +import com.reandroid.apk.ApkUtil; +import com.reandroid.arsc.array.ResValueBagItemArray; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.ResValueBag; +import com.reandroid.arsc.value.ResValueBagItem; +import com.reandroid.arsc.value.ValueType; import com.reandroid.xml.XMLElement; class XMLValuesEncoderArray extends XMLValuesEncoderBag{ diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderAttr.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderAttr.java similarity index 87% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderAttr.java rename to src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderAttr.java index 132a0f1..20d6571 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderAttr.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderAttr.java @@ -13,16 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.arsc.array.ResValueBagItemArray; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.ResValueBag; -import com.reandroid.lib.arsc.value.ResValueBagItem; -import com.reandroid.lib.arsc.value.ValueType; -import com.reandroid.lib.arsc.value.attribute.AttributeBag; -import com.reandroid.lib.arsc.value.attribute.AttributeItemType; -import com.reandroid.lib.arsc.value.attribute.AttributeValueType; +import com.reandroid.arsc.array.ResValueBagItemArray; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.ResValueBag; +import com.reandroid.arsc.value.ResValueBagItem; +import com.reandroid.arsc.value.ValueType; +import com.reandroid.arsc.value.attribute.AttributeBag; +import com.reandroid.arsc.value.attribute.AttributeItemType; +import com.reandroid.arsc.value.attribute.AttributeValueType; import com.reandroid.xml.XMLAttribute; import com.reandroid.xml.XMLElement; @@ -54,7 +54,7 @@ class XMLValuesEncoderAttr extends XMLValuesEncoderBag{ formatItem.setIdHigh((short) 0x0100); formatItem.setIdLow(AttributeItemType.FORMAT.getValue()); - formatItem.setType(ValueType.INT_DEC); + formatItem.setValueType(ValueType.INT_DEC); formatItem.setDataHigh(getChildTypes(parentElement)); AttributeValueType[] valueTypes = AttributeValueType @@ -78,7 +78,7 @@ class XMLValuesEncoderAttr extends XMLValuesEncoderBag{ ResValueBagItem bagItem = bagItemArray.get(bagIndex); bagItem.setIdHigh((short) 0x0100); bagItem.setIdLow(itemType.getValue()); - bagItem.setType(ValueType.INT_DEC); + bagItem.setValueType(ValueType.INT_DEC); bagItem.setData(ValueDecoder.parseInteger(attribute.getValue())); bagIndex++; } @@ -111,7 +111,7 @@ class XMLValuesEncoderAttr extends XMLValuesEncoderBag{ ResValueBagItem bagItem = bagItemArray.get(i+offset); bagItem.setId(resourceId); - bagItem.setType(encodeResult.valueType); + bagItem.setValueType(encodeResult.valueType); bagItem.setData(encodeResult.value); } } diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderBag.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderBag.java similarity index 91% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderBag.java rename to src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderBag.java index 5466dad..cf33055 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderBag.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderBag.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResValueBag; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResValueBag; import com.reandroid.xml.XMLElement; class XMLValuesEncoderBag extends XMLValuesEncoder{ diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderColor.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderColor.java similarity index 89% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderColor.java rename to src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderColor.java index ee85b3d..e89f889 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderColor.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderColor.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.EntryBlock; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.EntryBlock; class XMLValuesEncoderColor extends XMLValuesEncoder{ XMLValuesEncoderColor(EncodeMaterials materials) { diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderCommon.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderCommon.java similarity index 90% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderCommon.java rename to src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderCommon.java index d09c3de..cd25761 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderCommon.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderCommon.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.EntryBlock; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.EntryBlock; class XMLValuesEncoderCommon extends XMLValuesEncoder{ XMLValuesEncoderCommon(EncodeMaterials materials) { diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderDimen.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderDimen.java similarity index 90% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderDimen.java rename to src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderDimen.java index 28f3ef5..49e09cb 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderDimen.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderDimen.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.EntryBlock; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.EntryBlock; class XMLValuesEncoderDimen extends XMLValuesEncoder{ XMLValuesEncoderDimen(EncodeMaterials materials) { diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderId.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderId.java similarity index 93% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderId.java rename to src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderId.java index 1ad2623..1fc5200 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderId.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderId.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.arsc.value.EntryBlock; +import com.reandroid.arsc.value.EntryBlock; class XMLValuesEncoderId extends XMLValuesEncoder{ public XMLValuesEncoderId(EncodeMaterials materials) { diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderInteger.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderInteger.java similarity index 88% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderInteger.java rename to src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderInteger.java index 332cddf..f55b8f6 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderInteger.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderInteger.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ValueType; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ValueType; class XMLValuesEncoderInteger extends XMLValuesEncoder{ XMLValuesEncoderInteger(EncodeMaterials materials) { diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderPlurals.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderPlurals.java similarity index 81% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderPlurals.java rename to src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderPlurals.java index 15e252b..16cf800 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderPlurals.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderPlurals.java @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.arsc.array.ResValueBagItemArray; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.ResValueBag; -import com.reandroid.lib.arsc.value.ResValueBagItem; -import com.reandroid.lib.arsc.value.ValueType; -import com.reandroid.lib.arsc.value.plurals.PluralsQuantity; +import com.reandroid.arsc.array.ResValueBagItemArray; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.ResValueBag; +import com.reandroid.arsc.value.ResValueBagItem; +import com.reandroid.arsc.value.ValueType; +import com.reandroid.arsc.value.plurals.PluralsQuantity; import com.reandroid.xml.XMLElement; class XMLValuesEncoderPlurals extends XMLValuesEncoderBag{ @@ -46,10 +46,10 @@ class XMLValuesEncoderPlurals extends XMLValuesEncoderBag{ String valueText=child.getTextContent(); if(ValueDecoder.isReference(valueText)){ - bagItem.setType(ValueType.REFERENCE); + bagItem.setValueType(ValueType.REFERENCE); bagItem.setData(getMaterials().resolveReference(valueText)); }else if(EncodeUtil.isEmpty(valueText)) { - bagItem.setType(ValueType.NULL); + bagItem.setValueType(ValueType.NULL); bagItem.setData(0); }else{ bagItem.setValueAsString(ValueDecoder diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderString.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderString.java similarity index 77% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderString.java rename to src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderString.java index ae47bf4..a61f6e8 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderString.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderString.java @@ -13,17 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.xml.XMLDocument; -import com.reandroid.xml.XMLElement; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.EntryBlock; -import java.util.ArrayList; -import java.util.List; - -class XMLValuesEncoderString extends XMLValuesEncoder{ + class XMLValuesEncoderString extends XMLValuesEncoder{ XMLValuesEncoderString(EncodeMaterials materials) { super(materials); } diff --git a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderStyle.java b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderStyle.java similarity index 87% rename from src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderStyle.java rename to src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderStyle.java index 0faabb2..652d34a 100644 --- a/src/main/java/com/reandroid/lib/apk/xmlencoder/XMLValuesEncoderStyle.java +++ b/src/main/java/com/reandroid/apk/xmlencoder/XMLValuesEncoderStyle.java @@ -13,16 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.apk.xmlencoder; +package com.reandroid.apk.xmlencoder; -import com.reandroid.lib.arsc.array.ResValueBagItemArray; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResValueBag; -import com.reandroid.lib.arsc.value.ResValueBagItem; -import com.reandroid.lib.arsc.value.ValueType; -import com.reandroid.lib.arsc.value.attribute.AttributeBag; -import com.reandroid.lib.arsc.value.attribute.AttributeValueType; +import com.reandroid.arsc.array.ResValueBagItemArray; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResValueBag; +import com.reandroid.arsc.value.ResValueBagItem; +import com.reandroid.arsc.value.ValueType; +import com.reandroid.arsc.value.attribute.AttributeBag; +import com.reandroid.arsc.value.attribute.AttributeValueType; import com.reandroid.xml.XMLElement; @@ -89,9 +89,9 @@ class XMLValuesEncoderStyle extends XMLValuesEncoderBag{ } if(ValueDecoder.isReference(valueText)){ if(valueText.startsWith("?")){ - bagItem.setType(ValueType.ATTRIBUTE); + bagItem.setValueType(ValueType.ATTRIBUTE); }else { - bagItem.setType(ValueType.REFERENCE); + bagItem.setValueType(ValueType.REFERENCE); } bagItem.setData(getMaterials().resolveReference(valueText)); }else if(attributeBag.isEqualType(AttributeValueType.STRING)) { diff --git a/src/main/java/com/reandroid/archive/ByteInputSource.java b/src/main/java/com/reandroid/archive/ByteInputSource.java index 61708a6..6acfe73 100644 --- a/src/main/java/com/reandroid/archive/ByteInputSource.java +++ b/src/main/java/com/reandroid/archive/ByteInputSource.java @@ -20,7 +20,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -public class ByteInputSource extends InputSource{ +public class ByteInputSource extends InputSource { private byte[] inBytes; public ByteInputSource(byte[] inBytes, String name) { super(name); diff --git a/src/main/java/com/reandroid/archive/FileInputSource.java b/src/main/java/com/reandroid/archive/FileInputSource.java index dd65831..57150f1 100644 --- a/src/main/java/com/reandroid/archive/FileInputSource.java +++ b/src/main/java/com/reandroid/archive/FileInputSource.java @@ -17,7 +17,7 @@ package com.reandroid.archive; import java.io.*; -public class FileInputSource extends InputSource{ +public class FileInputSource extends InputSource { private final File file; public FileInputSource(File file, String name){ super(name); diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlEndNamespace.java b/src/main/java/com/reandroid/archive/WriteInterceptor.java old mode 100755 new mode 100644 similarity index 59% rename from src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlEndNamespace.java rename to src/main/java/com/reandroid/archive/WriteInterceptor.java index a211b5f..ad80d55 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlEndNamespace.java +++ b/src/main/java/com/reandroid/archive/WriteInterceptor.java @@ -13,18 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.chunk.xml; +package com.reandroid.archive; -import com.reandroid.lib.arsc.chunk.ChunkType; - -public class ResXmlEndNamespace extends ResXmlNamespace{ - public ResXmlEndNamespace() { - super(ChunkType.XML_END_NAMESPACE); - } - public ResXmlStartNamespace getStart(){ - return getPair(); - } - public void setStart(ResXmlStartNamespace namespace){ - setPair(namespace); - } +public interface WriteInterceptor { + InputSource onWriteArchive(InputSource inputSource); } diff --git a/src/main/java/com/reandroid/archive/ZipEntrySource.java b/src/main/java/com/reandroid/archive/ZipEntrySource.java index 7e2e82f..41bc096 100644 --- a/src/main/java/com/reandroid/archive/ZipEntrySource.java +++ b/src/main/java/com/reandroid/archive/ZipEntrySource.java @@ -20,7 +20,7 @@ import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -public class ZipEntrySource extends InputSource{ +public class ZipEntrySource extends InputSource { private final ZipFile zipFile; private final ZipEntry zipEntry; public ZipEntrySource(ZipFile zipFile, ZipEntry zipEntry){ diff --git a/src/main/java/com/reandroid/archive/ZipSerializer.java b/src/main/java/com/reandroid/archive/ZipSerializer.java index 8c8ac92..f462ecb 100644 --- a/src/main/java/com/reandroid/archive/ZipSerializer.java +++ b/src/main/java/com/reandroid/archive/ZipSerializer.java @@ -23,9 +23,14 @@ import java.util.zip.ZipOutputStream; public class ZipSerializer { private final List mSourceList; private WriteProgress writeProgress; + private WriteInterceptor writeInterceptor; public ZipSerializer(List sourceList){ this.mSourceList=sourceList; } + + public void setWriteInterceptor(WriteInterceptor writeInterceptor) { + this.writeInterceptor = writeInterceptor; + } public void setWriteProgress(WriteProgress writeProgress){ this.writeProgress=writeProgress; } @@ -52,6 +57,10 @@ public class ZipSerializer { WriteProgress progress=writeProgress; ZipOutputStream zipOutputStream=new ZipOutputStream(outputStream); for(InputSource inputSource:mSourceList){ + inputSource = interceptWrite(inputSource); + if(inputSource==null){ + continue; + } if(progress!=null){ progress.onCompressFile(inputSource.getAlias(), inputSource.getMethod(), length); } @@ -78,4 +87,11 @@ public class ZipSerializer { } return zipEntry; } + private InputSource interceptWrite(InputSource inputSource){ + WriteInterceptor interceptor=writeInterceptor; + if(interceptor!=null){ + return interceptor.onWriteArchive(inputSource); + } + return inputSource; + } } diff --git a/src/main/java/com/reandroid/lib/arsc/BuildInfo.java b/src/main/java/com/reandroid/arsc/BuildInfo.java similarity index 98% rename from src/main/java/com/reandroid/lib/arsc/BuildInfo.java rename to src/main/java/com/reandroid/arsc/BuildInfo.java index 2ebf48b..1b1aa7b 100755 --- a/src/main/java/com/reandroid/lib/arsc/BuildInfo.java +++ b/src/main/java/com/reandroid/arsc/BuildInfo.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc; +package com.reandroid.arsc; import java.io.InputStream; import java.util.Properties; diff --git a/src/main/java/com/reandroid/lib/arsc/array/EntryBlockArray.java b/src/main/java/com/reandroid/arsc/array/EntryBlockArray.java similarity index 90% rename from src/main/java/com/reandroid/lib/arsc/array/EntryBlockArray.java rename to src/main/java/com/reandroid/arsc/array/EntryBlockArray.java index 7ac940e..3e368ac 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/EntryBlockArray.java +++ b/src/main/java/com/reandroid/arsc/array/EntryBlockArray.java @@ -13,17 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.item.IntegerArray; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.value.BaseResValue; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResValueInt; -import com.reandroid.lib.arsc.value.ValueType; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.item.IntegerArray; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.value.BaseResValue; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResValueInt; +import com.reandroid.arsc.value.ValueType; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONObject; import java.util.Iterator; diff --git a/src/main/java/com/reandroid/lib/arsc/array/LibraryInfoArray.java b/src/main/java/com/reandroid/arsc/array/LibraryInfoArray.java similarity index 89% rename from src/main/java/com/reandroid/lib/arsc/array/LibraryInfoArray.java rename to src/main/java/com/reandroid/arsc/array/LibraryInfoArray.java index 466e138..79e1ae5 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/LibraryInfoArray.java +++ b/src/main/java/com/reandroid/arsc/array/LibraryInfoArray.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.base.BlockArray; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.value.LibraryInfo; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.base.BlockArray; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.value.LibraryInfo; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONObject; import java.io.IOException; diff --git a/src/main/java/com/reandroid/lib/arsc/array/OffsetBlockArray.java b/src/main/java/com/reandroid/arsc/array/OffsetBlockArray.java similarity index 93% rename from src/main/java/com/reandroid/lib/arsc/array/OffsetBlockArray.java rename to src/main/java/com/reandroid/arsc/array/OffsetBlockArray.java index 180ca95..2e4324c 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/OffsetBlockArray.java +++ b/src/main/java/com/reandroid/arsc/array/OffsetBlockArray.java @@ -13,17 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.base.BlockArray; -import com.reandroid.lib.arsc.base.BlockCounter; -import com.reandroid.lib.arsc.io.BlockLoad; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.ByteArray; -import com.reandroid.lib.arsc.item.IntegerArray; -import com.reandroid.lib.arsc.item.IntegerItem; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.base.BlockArray; +import com.reandroid.arsc.base.BlockCounter; +import com.reandroid.arsc.io.BlockLoad; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.item.ByteArray; +import com.reandroid.arsc.item.IntegerArray; +import com.reandroid.arsc.item.IntegerItem; import java.io.IOException; diff --git a/src/main/java/com/reandroid/lib/arsc/array/PackageArray.java b/src/main/java/com/reandroid/arsc/array/PackageArray.java similarity index 90% rename from src/main/java/com/reandroid/lib/arsc/array/PackageArray.java rename to src/main/java/com/reandroid/arsc/array/PackageArray.java index ee4e34d..0d6d405 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/PackageArray.java +++ b/src/main/java/com/reandroid/arsc/array/PackageArray.java @@ -13,17 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.base.BlockArray; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.io.BlockLoad; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.base.BlockArray; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.io.BlockLoad; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONObject; import java.io.IOException; import java.util.Comparator; diff --git a/src/main/java/com/reandroid/lib/arsc/array/ResValueBagItemArray.java b/src/main/java/com/reandroid/arsc/array/ResValueBagItemArray.java similarity index 89% rename from src/main/java/com/reandroid/lib/arsc/array/ResValueBagItemArray.java rename to src/main/java/com/reandroid/arsc/array/ResValueBagItemArray.java index 403acad..b98e6cd 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/ResValueBagItemArray.java +++ b/src/main/java/com/reandroid/arsc/array/ResValueBagItemArray.java @@ -13,13 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.base.BlockArray; -import com.reandroid.lib.arsc.value.ResValueBag; -import com.reandroid.lib.arsc.value.ResValueBagItem; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONArray; +import com.reandroid.arsc.base.BlockArray; +import com.reandroid.arsc.value.ResValueBagItem; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONArray; public class ResValueBagItemArray extends BlockArray implements JSONConvert { public ResValueBagItemArray(){ diff --git a/src/main/java/com/reandroid/lib/arsc/array/ResXmlAttributeArray.java b/src/main/java/com/reandroid/arsc/array/ResXmlAttributeArray.java similarity index 73% rename from src/main/java/com/reandroid/lib/arsc/array/ResXmlAttributeArray.java rename to src/main/java/com/reandroid/arsc/array/ResXmlAttributeArray.java index a98a27b..53ef1f1 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/ResXmlAttributeArray.java +++ b/src/main/java/com/reandroid/arsc/array/ResXmlAttributeArray.java @@ -13,17 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.base.BlockArray; -import com.reandroid.lib.arsc.header.HeaderBlock; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.chunk.xml.ResXmlAttribute; -import com.reandroid.lib.arsc.item.ShortItem; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.base.BlockArray; +import com.reandroid.arsc.header.HeaderBlock; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.chunk.xml.ResXmlAttribute; +import com.reandroid.arsc.item.ShortItem; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONObject; import java.io.IOException; import java.util.Comparator; @@ -33,18 +33,22 @@ public class ResXmlAttributeArray extends BlockArray private final HeaderBlock mHeaderBlock; private final ShortItem mAttributeStart; private final ShortItem mAttributeCount; - public ResXmlAttributeArray(HeaderBlock headerBlock, ShortItem attributeStart, ShortItem attributeCount){ + private final ShortItem mAttributesUnitSize; + public ResXmlAttributeArray(HeaderBlock headerBlock, + ShortItem attributeStart, + ShortItem attributeCount, + ShortItem attributesUnitSize){ this.mHeaderBlock=headerBlock; this.mAttributeStart=attributeStart; this.mAttributeCount=attributeCount; + this.mAttributesUnitSize=attributesUnitSize; } - public ResXmlAttribute getFirstIntAttribute(){ - for(ResXmlAttribute attribute:listItems()){ - if(attribute.hasIntegerValue()){ - return attribute; - } + public void setAttributesUnitSize(int size){ + ResXmlAttribute[] attributes=getChildes(); + for(int i=0;i } @Override public ResXmlAttribute newInstance() { - return new ResXmlAttribute(); + return new ResXmlAttribute(mAttributesUnitSize.unsignedInt()); } @Override public ResXmlAttribute[] newInstance(int len) { diff --git a/src/main/java/com/reandroid/lib/arsc/array/ResXmlIDArray.java b/src/main/java/com/reandroid/arsc/array/ResXmlIDArray.java similarity index 88% rename from src/main/java/com/reandroid/lib/arsc/array/ResXmlIDArray.java rename to src/main/java/com/reandroid/arsc/array/ResXmlIDArray.java index 7e1c553..bfbe10c 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/ResXmlIDArray.java +++ b/src/main/java/com/reandroid/arsc/array/ResXmlIDArray.java @@ -13,15 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.base.BlockArray; -import com.reandroid.lib.arsc.header.HeaderBlock; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.ResXmlID; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.base.BlockArray; +import com.reandroid.arsc.header.HeaderBlock; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.item.ResXmlID; import java.io.IOException; import java.util.HashMap; diff --git a/src/main/java/com/reandroid/lib/arsc/array/ResXmlStringArray.java b/src/main/java/com/reandroid/arsc/array/ResXmlStringArray.java similarity index 85% rename from src/main/java/com/reandroid/lib/arsc/array/ResXmlStringArray.java rename to src/main/java/com/reandroid/arsc/array/ResXmlStringArray.java index 92f1752..39b26b1 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/ResXmlStringArray.java +++ b/src/main/java/com/reandroid/arsc/array/ResXmlStringArray.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.item.IntegerArray; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.ResXmlString; +import com.reandroid.arsc.item.IntegerArray; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.ResXmlString; public class ResXmlStringArray extends StringArray { public ResXmlStringArray(IntegerArray offsets, IntegerItem itemCount, IntegerItem itemStart, boolean is_utf8) { diff --git a/src/main/java/com/reandroid/lib/arsc/array/SpecBlockArray.java b/src/main/java/com/reandroid/arsc/array/SpecBlockArray.java similarity index 88% rename from src/main/java/com/reandroid/lib/arsc/array/SpecBlockArray.java rename to src/main/java/com/reandroid/arsc/array/SpecBlockArray.java index a8b9acf..22f918b 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/SpecBlockArray.java +++ b/src/main/java/com/reandroid/arsc/array/SpecBlockArray.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.base.BlockArray; -import com.reandroid.lib.arsc.chunk.SpecBlock; +import com.reandroid.arsc.base.BlockArray; +import com.reandroid.arsc.chunk.SpecBlock; public class SpecBlockArray extends BlockArray { public SpecBlockArray(){ diff --git a/src/main/java/com/reandroid/lib/arsc/array/SpecStringArray.java b/src/main/java/com/reandroid/arsc/array/SpecStringArray.java similarity index 85% rename from src/main/java/com/reandroid/lib/arsc/array/SpecStringArray.java rename to src/main/java/com/reandroid/arsc/array/SpecStringArray.java index 92989d2..8b9278d 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/SpecStringArray.java +++ b/src/main/java/com/reandroid/arsc/array/SpecStringArray.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.item.IntegerArray; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.SpecString; +import com.reandroid.arsc.item.IntegerArray; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.SpecString; public class SpecStringArray extends StringArray { public SpecStringArray(IntegerArray offsets, IntegerItem itemCount, IntegerItem itemStart, boolean is_utf8) { diff --git a/src/main/java/com/reandroid/lib/arsc/array/SpecTypePairArray.java b/src/main/java/com/reandroid/arsc/array/SpecTypePairArray.java similarity index 94% rename from src/main/java/com/reandroid/lib/arsc/array/SpecTypePairArray.java rename to src/main/java/com/reandroid/arsc/array/SpecTypePairArray.java index fb8c58e..c27693d 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/SpecTypePairArray.java +++ b/src/main/java/com/reandroid/arsc/array/SpecTypePairArray.java @@ -13,17 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.base.BlockArray; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.TypeBlock; -import com.reandroid.lib.arsc.container.SpecTypePair; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResConfig; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.base.BlockArray; +import com.reandroid.arsc.chunk.TypeBlock; +import com.reandroid.arsc.container.SpecTypePair; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResConfig; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONObject; import java.util.*; diff --git a/src/main/java/com/reandroid/lib/arsc/array/StagedAliasEntryArray.java b/src/main/java/com/reandroid/arsc/array/StagedAliasEntryArray.java similarity index 87% rename from src/main/java/com/reandroid/lib/arsc/array/StagedAliasEntryArray.java rename to src/main/java/com/reandroid/arsc/array/StagedAliasEntryArray.java index 90355ce..8656f5f 100644 --- a/src/main/java/com/reandroid/lib/arsc/array/StagedAliasEntryArray.java +++ b/src/main/java/com/reandroid/arsc/array/StagedAliasEntryArray.java @@ -13,16 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.reandroid.lib.arsc.array; + package com.reandroid.arsc.array; - import com.reandroid.lib.arsc.base.Block; - import com.reandroid.lib.arsc.base.BlockArray; - import com.reandroid.lib.arsc.io.BlockLoad; - 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 com.reandroid.arsc.base.Block; + import com.reandroid.arsc.base.BlockArray; + import com.reandroid.arsc.io.BlockLoad; + import com.reandroid.arsc.io.BlockReader; + import com.reandroid.arsc.item.IntegerItem; + import com.reandroid.arsc.value.StagedAliasEntry; + import com.reandroid.json.JSONArray; + import com.reandroid.json.JSONConvert; import java.io.IOException; diff --git a/src/main/java/com/reandroid/lib/arsc/array/StringArray.java b/src/main/java/com/reandroid/arsc/array/StringArray.java similarity index 91% rename from src/main/java/com/reandroid/lib/arsc/array/StringArray.java rename to src/main/java/com/reandroid/arsc/array/StringArray.java index f473f23..142943c 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/StringArray.java +++ b/src/main/java/com/reandroid/arsc/array/StringArray.java @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.item.IntegerArray; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.StringItem; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.item.IntegerArray; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.StringItem; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONObject; import java.util.AbstractList; import java.util.ArrayList; diff --git a/src/main/java/com/reandroid/lib/arsc/array/StyleArray.java b/src/main/java/com/reandroid/arsc/array/StyleArray.java similarity index 88% rename from src/main/java/com/reandroid/lib/arsc/array/StyleArray.java rename to src/main/java/com/reandroid/arsc/array/StyleArray.java index 0778156..6d3d6a7 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/StyleArray.java +++ b/src/main/java/com/reandroid/arsc/array/StyleArray.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.ByteArray; -import com.reandroid.lib.arsc.item.IntegerArray; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.StyleItem; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONArray; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.item.ByteArray; +import com.reandroid.arsc.item.IntegerArray; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.StyleItem; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONArray; import java.io.IOException; diff --git a/src/main/java/com/reandroid/lib/arsc/array/TableStringArray.java b/src/main/java/com/reandroid/arsc/array/TableStringArray.java similarity index 85% rename from src/main/java/com/reandroid/lib/arsc/array/TableStringArray.java rename to src/main/java/com/reandroid/arsc/array/TableStringArray.java index 7bec799..a21a1c5 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/TableStringArray.java +++ b/src/main/java/com/reandroid/arsc/array/TableStringArray.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.item.IntegerArray; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.TableString; +import com.reandroid.arsc.item.IntegerArray; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.TableString; public class TableStringArray extends StringArray { public TableStringArray(IntegerArray offsets, IntegerItem itemCount, IntegerItem itemStart, boolean is_utf8) { diff --git a/src/main/java/com/reandroid/lib/arsc/array/TypeBlockArray.java b/src/main/java/com/reandroid/arsc/array/TypeBlockArray.java similarity index 93% rename from src/main/java/com/reandroid/lib/arsc/array/TypeBlockArray.java rename to src/main/java/com/reandroid/arsc/array/TypeBlockArray.java index f5781e1..cc67a12 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/TypeBlockArray.java +++ b/src/main/java/com/reandroid/arsc/array/TypeBlockArray.java @@ -13,22 +13,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.base.BlockArray; -import com.reandroid.lib.arsc.chunk.SpecBlock; -import com.reandroid.lib.arsc.chunk.TypeBlock; -import com.reandroid.lib.arsc.container.SpecTypePair; -import com.reandroid.lib.arsc.header.HeaderBlock; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.TypeString; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResConfig; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.base.BlockArray; +import com.reandroid.arsc.chunk.SpecBlock; +import com.reandroid.arsc.chunk.TypeBlock; +import com.reandroid.arsc.header.HeaderBlock; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.item.TypeString; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResConfig; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONObject; import java.io.IOException; import java.util.AbstractList; diff --git a/src/main/java/com/reandroid/lib/arsc/array/TypeStringArray.java b/src/main/java/com/reandroid/arsc/array/TypeStringArray.java similarity index 87% rename from src/main/java/com/reandroid/lib/arsc/array/TypeStringArray.java rename to src/main/java/com/reandroid/arsc/array/TypeStringArray.java index 7cc3d98..76fbe49 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/TypeStringArray.java +++ b/src/main/java/com/reandroid/arsc/array/TypeStringArray.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; +package com.reandroid.arsc.array; -import com.reandroid.lib.arsc.item.IntegerArray; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.TypeString; +import com.reandroid.arsc.item.IntegerArray; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.TypeString; public class TypeStringArray extends StringArray { private int lastCreateIndex; diff --git a/src/main/java/com/reandroid/lib/arsc/base/Block.java b/src/main/java/com/reandroid/arsc/base/Block.java similarity index 96% rename from src/main/java/com/reandroid/lib/arsc/base/Block.java rename to src/main/java/com/reandroid/arsc/base/Block.java index def365e..d1c3598 100755 --- a/src/main/java/com/reandroid/lib/arsc/base/Block.java +++ b/src/main/java/com/reandroid/arsc/base/Block.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.base; +package com.reandroid.arsc.base; -import com.reandroid.lib.arsc.io.BlockLoad; -import com.reandroid.lib.arsc.io.BlockReader; +import com.reandroid.arsc.io.BlockLoad; +import com.reandroid.arsc.io.BlockReader; import java.io.IOException; import java.io.OutputStream; diff --git a/src/main/java/com/reandroid/lib/arsc/base/BlockArray.java b/src/main/java/com/reandroid/arsc/base/BlockArray.java similarity index 99% rename from src/main/java/com/reandroid/lib/arsc/base/BlockArray.java rename to src/main/java/com/reandroid/arsc/base/BlockArray.java index 8ccde4f..4c93087 100755 --- a/src/main/java/com/reandroid/lib/arsc/base/BlockArray.java +++ b/src/main/java/com/reandroid/arsc/base/BlockArray.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.base; +package com.reandroid.arsc.base; import java.util.*; diff --git a/src/main/java/com/reandroid/lib/arsc/base/BlockArrayCreator.java b/src/main/java/com/reandroid/arsc/base/BlockArrayCreator.java similarity index 95% rename from src/main/java/com/reandroid/lib/arsc/base/BlockArrayCreator.java rename to src/main/java/com/reandroid/arsc/base/BlockArrayCreator.java index 5a284b9..1e5f68e 100755 --- a/src/main/java/com/reandroid/lib/arsc/base/BlockArrayCreator.java +++ b/src/main/java/com/reandroid/arsc/base/BlockArrayCreator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.base; +package com.reandroid.arsc.base; public interface BlockArrayCreator extends BlockCreator{ T[] newInstance(int len); diff --git a/src/main/java/com/reandroid/lib/arsc/base/BlockContainer.java b/src/main/java/com/reandroid/arsc/base/BlockContainer.java similarity index 96% rename from src/main/java/com/reandroid/lib/arsc/base/BlockContainer.java rename to src/main/java/com/reandroid/arsc/base/BlockContainer.java index 78efdc7..4e52ec6 100755 --- a/src/main/java/com/reandroid/lib/arsc/base/BlockContainer.java +++ b/src/main/java/com/reandroid/arsc/base/BlockContainer.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.base; +package com.reandroid.arsc.base; -import com.reandroid.lib.arsc.container.BlockList; -import com.reandroid.lib.arsc.io.BlockReader; +import com.reandroid.arsc.container.BlockList; +import com.reandroid.arsc.io.BlockReader; import java.io.IOException; import java.io.OutputStream; diff --git a/src/main/java/com/reandroid/lib/arsc/base/BlockCounter.java b/src/main/java/com/reandroid/arsc/base/BlockCounter.java similarity index 96% rename from src/main/java/com/reandroid/lib/arsc/base/BlockCounter.java rename to src/main/java/com/reandroid/arsc/base/BlockCounter.java index 7b301a1..585ca91 100755 --- a/src/main/java/com/reandroid/lib/arsc/base/BlockCounter.java +++ b/src/main/java/com/reandroid/arsc/base/BlockCounter.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.base; +package com.reandroid.arsc.base; public class BlockCounter { public final Block END; diff --git a/src/main/java/com/reandroid/lib/arsc/base/BlockCreator.java b/src/main/java/com/reandroid/arsc/base/BlockCreator.java similarity index 94% rename from src/main/java/com/reandroid/lib/arsc/base/BlockCreator.java rename to src/main/java/com/reandroid/arsc/base/BlockCreator.java index 5e19c6b..44a034b 100755 --- a/src/main/java/com/reandroid/lib/arsc/base/BlockCreator.java +++ b/src/main/java/com/reandroid/arsc/base/BlockCreator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.base; +package com.reandroid.arsc.base; public interface BlockCreator { T newInstance(); diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/BaseChunk.java b/src/main/java/com/reandroid/arsc/chunk/Chunk.java similarity index 71% rename from src/main/java/com/reandroid/lib/arsc/chunk/BaseChunk.java rename to src/main/java/com/reandroid/arsc/chunk/Chunk.java index 0642411..c31124e 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/BaseChunk.java +++ b/src/main/java/com/reandroid/arsc/chunk/Chunk.java @@ -13,20 +13,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.chunk; +package com.reandroid.arsc.chunk; -import com.reandroid.lib.arsc.container.ExpandableBlockContainer; -import com.reandroid.lib.arsc.header.HeaderBlock; -import com.reandroid.lib.arsc.io.BlockReader; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.container.ExpandableBlockContainer; +import com.reandroid.arsc.container.SingleBlockContainer; +import com.reandroid.arsc.header.HeaderBlock; +import com.reandroid.arsc.io.BlockReader; import java.io.IOException; -public abstract class BaseChunk extends ExpandableBlockContainer { +public abstract class Chunk extends ExpandableBlockContainer { private final T mHeaderBlock; - protected BaseChunk(T headerBlock, int initialChildesCount) { - super(initialChildesCount+1); + protected final SingleBlockContainer firstPlaceHolder; + protected Chunk(T headerBlock, int initialChildesCount) { + super(initialChildesCount+2); this.mHeaderBlock = headerBlock; + this.firstPlaceHolder = new SingleBlockContainer<>(); addChild(headerBlock); + addChild(firstPlaceHolder); + } + public SingleBlockContainer getFirstPlaceHolder() { + return firstPlaceHolder; } void setHeaderLoaded(HeaderBlock.HeaderLoaded headerLoaded){ getHeaderBlock().setHeaderLoaded(headerLoaded); @@ -47,9 +55,7 @@ public abstract class BaseChunk extends ExpandableBlockCo public void onReadBytes(BlockReader reader) throws IOException { HeaderBlock headerBlock=reader.readHeaderBlock(); checkInvalidChunk(headerBlock); - BlockReader chunkReader = reader.create( - reader.getPosition(), - headerBlock.getChunkSize()); + BlockReader chunkReader = reader.create(headerBlock.getChunkSize()); super.onReadBytes(chunkReader); reader.offset(headerBlock.getChunkSize()); chunkReader.close(); diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/ChunkType.java b/src/main/java/com/reandroid/arsc/chunk/ChunkType.java similarity index 98% rename from src/main/java/com/reandroid/lib/arsc/chunk/ChunkType.java rename to src/main/java/com/reandroid/arsc/chunk/ChunkType.java index c93654a..594ddb9 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/ChunkType.java +++ b/src/main/java/com/reandroid/arsc/chunk/ChunkType.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.chunk; +package com.reandroid.arsc.chunk; public enum ChunkType { NULL((short)0x0000), diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/LibraryBlock.java b/src/main/java/com/reandroid/arsc/chunk/LibraryBlock.java similarity index 87% rename from src/main/java/com/reandroid/lib/arsc/chunk/LibraryBlock.java rename to src/main/java/com/reandroid/arsc/chunk/LibraryBlock.java index 302f2be..aeca72d 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/LibraryBlock.java +++ b/src/main/java/com/reandroid/arsc/chunk/LibraryBlock.java @@ -13,17 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.chunk; +package com.reandroid.arsc.chunk; -import com.reandroid.lib.arsc.array.LibraryInfoArray; -import com.reandroid.lib.arsc.header.LibraryHeader; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.value.LibraryInfo; +import com.reandroid.arsc.array.LibraryInfoArray; +import com.reandroid.arsc.header.LibraryHeader; +import com.reandroid.arsc.value.LibraryInfo; import java.util.Collection; -import java.util.List; -public class LibraryBlock extends BaseChunk { + public class LibraryBlock extends Chunk { private final LibraryInfoArray mLibraryInfoArray; public LibraryBlock() { super(new LibraryHeader(),1); diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/Overlayable.java b/src/main/java/com/reandroid/arsc/chunk/Overlayable.java similarity index 83% rename from src/main/java/com/reandroid/lib/arsc/chunk/Overlayable.java rename to src/main/java/com/reandroid/arsc/chunk/Overlayable.java index 3e4a5ad..f21cec5 100644 --- a/src/main/java/com/reandroid/lib/arsc/chunk/Overlayable.java +++ b/src/main/java/com/reandroid/arsc/chunk/Overlayable.java @@ -13,15 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.reandroid.lib.arsc.chunk; + package com.reandroid.arsc.chunk; - import com.reandroid.lib.arsc.base.Block; - import com.reandroid.lib.arsc.header.HeaderBlock; - import com.reandroid.lib.arsc.header.OverlayableHeader; - import com.reandroid.lib.arsc.io.BlockLoad; - import com.reandroid.lib.arsc.io.BlockReader; - import com.reandroid.lib.arsc.item.ByteArray; - import com.reandroid.lib.arsc.item.FixedLengthString; + import com.reandroid.arsc.base.Block; + import com.reandroid.arsc.header.HeaderBlock; + import com.reandroid.arsc.header.OverlayableHeader; + import com.reandroid.arsc.io.BlockLoad; + import com.reandroid.arsc.io.BlockReader; + import com.reandroid.arsc.item.ByteArray; import java.io.IOException; @@ -30,7 +29,7 @@ * We didn't test this class with resource table, if someone found a resource/apk please * create issue on https://github.com/REAndroid/ARSCLib * */ - public class Overlayable extends BaseChunk implements BlockLoad { + public class Overlayable extends Chunk implements BlockLoad { /** * @link body * As on AOSP there is only a description of header struct but no mention about diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/OverlayablePolicy.java b/src/main/java/com/reandroid/arsc/chunk/OverlayablePolicy.java similarity index 93% rename from src/main/java/com/reandroid/lib/arsc/chunk/OverlayablePolicy.java rename to src/main/java/com/reandroid/arsc/chunk/OverlayablePolicy.java index f40a497..7f61583 100644 --- a/src/main/java/com/reandroid/lib/arsc/chunk/OverlayablePolicy.java +++ b/src/main/java/com/reandroid/arsc/chunk/OverlayablePolicy.java @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.reandroid.lib.arsc.chunk; + package com.reandroid.arsc.chunk; - import com.reandroid.lib.arsc.base.Block; - import com.reandroid.lib.arsc.header.OverlayablePolicyHeader; - import com.reandroid.lib.arsc.io.BlockLoad; - import com.reandroid.lib.arsc.io.BlockReader; - import com.reandroid.lib.arsc.item.IntegerArray; - import com.reandroid.lib.arsc.item.IntegerItem; + import com.reandroid.arsc.base.Block; + import com.reandroid.arsc.header.OverlayablePolicyHeader; + import com.reandroid.arsc.io.BlockLoad; + import com.reandroid.arsc.io.BlockReader; + import com.reandroid.arsc.item.IntegerArray; + import com.reandroid.arsc.item.IntegerItem; import java.io.IOException; import java.util.Collection; @@ -30,7 +30,7 @@ * We didn't test this class with resource table, if someone found a resource/apk please * create issue on https://github.com/REAndroid/ARSCLib * */ - public class OverlayablePolicy extends BaseChunk implements BlockLoad { + public class OverlayablePolicy extends Chunk implements BlockLoad { private final IntegerArray tableRefArray; public OverlayablePolicy(){ super(new OverlayablePolicyHeader(), 1); diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/PackageBlock.java b/src/main/java/com/reandroid/arsc/chunk/PackageBlock.java similarity index 90% rename from src/main/java/com/reandroid/lib/arsc/chunk/PackageBlock.java rename to src/main/java/com/reandroid/arsc/chunk/PackageBlock.java index 23944be..fff95ac 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/PackageBlock.java +++ b/src/main/java/com/reandroid/arsc/chunk/PackageBlock.java @@ -13,37 +13,31 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.chunk; +package com.reandroid.arsc.chunk; - import com.reandroid.lib.arsc.BuildInfo; - import com.reandroid.lib.arsc.array.LibraryInfoArray; - import com.reandroid.lib.arsc.array.SpecTypePairArray; - import com.reandroid.lib.arsc.base.Block; - import com.reandroid.lib.arsc.container.BlockList; - import com.reandroid.lib.arsc.container.PackageBody; - import com.reandroid.lib.arsc.container.SingleBlockContainer; - import com.reandroid.lib.arsc.container.SpecTypePair; - import com.reandroid.lib.arsc.group.EntryGroup; - import com.reandroid.lib.arsc.header.PackageHeader; - import com.reandroid.lib.arsc.io.BlockLoad; - import com.reandroid.lib.arsc.io.BlockReader; - import com.reandroid.lib.arsc.item.FixedLengthString; - import com.reandroid.lib.arsc.item.IntegerItem; - import com.reandroid.lib.arsc.item.ReferenceItem; - import com.reandroid.lib.arsc.pool.SpecStringPool; - import com.reandroid.lib.arsc.pool.TableStringPool; - 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.StagedAliasEntry; - import com.reandroid.lib.json.JSONConvert; - import com.reandroid.lib.json.JSONObject; + import com.reandroid.arsc.BuildInfo; + import com.reandroid.arsc.array.LibraryInfoArray; + import com.reandroid.arsc.array.SpecTypePairArray; + import com.reandroid.arsc.base.Block; + import com.reandroid.arsc.container.BlockList; + import com.reandroid.arsc.container.PackageBody; + import com.reandroid.arsc.container.SpecTypePair; + import com.reandroid.arsc.group.EntryGroup; + import com.reandroid.arsc.header.PackageHeader; + import com.reandroid.arsc.item.ReferenceItem; + import com.reandroid.arsc.pool.SpecStringPool; + import com.reandroid.arsc.pool.TableStringPool; + import com.reandroid.arsc.pool.TypeStringPool; + import com.reandroid.arsc.value.EntryBlock; + import com.reandroid.arsc.value.LibraryInfo; + import com.reandroid.arsc.value.StagedAliasEntry; + import com.reandroid.json.JSONConvert; + import com.reandroid.json.JSONObject; - import java.io.IOException; import java.util.*; - public class PackageBlock extends BaseChunk + public class PackageBlock extends Chunk implements JSONConvert, Comparable { private final TypeStringPool mTypeStringPool; diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/SpecBlock.java b/src/main/java/com/reandroid/arsc/chunk/SpecBlock.java similarity index 86% rename from src/main/java/com/reandroid/lib/arsc/chunk/SpecBlock.java rename to src/main/java/com/reandroid/arsc/chunk/SpecBlock.java index cc1b730..d11ecff 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/SpecBlock.java +++ b/src/main/java/com/reandroid/arsc/chunk/SpecBlock.java @@ -13,19 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.reandroid.lib.arsc.chunk; + package com.reandroid.arsc.chunk; - import com.reandroid.lib.arsc.array.TypeBlockArray; - import com.reandroid.lib.arsc.base.Block; - import com.reandroid.lib.arsc.container.SpecTypePair; - import com.reandroid.lib.arsc.header.SpecHeader; - import com.reandroid.lib.arsc.item.*; - import com.reandroid.lib.json.JSONConvert; - import com.reandroid.lib.json.JSONObject; + import com.reandroid.arsc.array.TypeBlockArray; + import com.reandroid.arsc.base.Block; + import com.reandroid.arsc.container.SpecTypePair; + import com.reandroid.arsc.header.SpecHeader; + import com.reandroid.arsc.item.*; + import com.reandroid.json.JSONConvert; + import com.reandroid.json.JSONObject; import java.util.List; - public class SpecBlock extends BaseChunk implements JSONConvert { + public class SpecBlock extends Chunk implements JSONConvert { private final SpecFlagsArray specFlagsArray; public SpecBlock() { super(new SpecHeader(), 1); diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/StagedAlias.java b/src/main/java/com/reandroid/arsc/chunk/StagedAlias.java similarity index 90% rename from src/main/java/com/reandroid/lib/arsc/chunk/StagedAlias.java rename to src/main/java/com/reandroid/arsc/chunk/StagedAlias.java index 845c2e6..d070ff9 100644 --- a/src/main/java/com/reandroid/lib/arsc/chunk/StagedAlias.java +++ b/src/main/java/com/reandroid/arsc/chunk/StagedAlias.java @@ -13,16 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.reandroid.lib.arsc.chunk; + package com.reandroid.arsc.chunk; - import com.reandroid.lib.arsc.array.StagedAliasEntryArray; - import com.reandroid.lib.arsc.header.StagedAliasHeader; - import com.reandroid.lib.arsc.item.IntegerItem; - import com.reandroid.lib.arsc.value.StagedAliasEntry; + import com.reandroid.arsc.array.StagedAliasEntryArray; + import com.reandroid.arsc.header.StagedAliasHeader; + import com.reandroid.arsc.value.StagedAliasEntry; import java.util.Collection; - public class StagedAlias extends BaseChunk{ + public class StagedAlias extends Chunk { private final StagedAliasEntryArray stagedAliasEntryArray; public StagedAlias() { super(new StagedAliasHeader(), 1); diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/TableBlock.java b/src/main/java/com/reandroid/arsc/chunk/TableBlock.java similarity index 80% rename from src/main/java/com/reandroid/lib/arsc/chunk/TableBlock.java rename to src/main/java/com/reandroid/arsc/chunk/TableBlock.java index 29971c9..a7f807b 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/TableBlock.java +++ b/src/main/java/com/reandroid/arsc/chunk/TableBlock.java @@ -13,28 +13,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.chunk; +package com.reandroid.arsc.chunk; -import com.reandroid.lib.arsc.BuildInfo; -import com.reandroid.lib.arsc.array.PackageArray; -import com.reandroid.lib.arsc.group.EntryGroup; -import com.reandroid.lib.arsc.header.HeaderBlock; -import com.reandroid.lib.arsc.header.TableHeader; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.pool.TableStringPool; -import com.reandroid.lib.arsc.value.StagedAliasEntry; -import com.reandroid.lib.common.Frameworks; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.BuildInfo; +import com.reandroid.arsc.array.PackageArray; +import com.reandroid.arsc.group.EntryGroup; +import com.reandroid.arsc.header.HeaderBlock; +import com.reandroid.arsc.header.InfoHeader; +import com.reandroid.arsc.header.TableHeader; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.pool.TableStringPool; +import com.reandroid.arsc.value.StagedAliasEntry; +import com.reandroid.common.Frameworks; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONObject; import java.io.*; import java.util.Collection; import java.util.HashSet; import java.util.Set; -public class TableBlock extends BaseChunk implements JSONConvert { +public class TableBlock extends Chunk implements JSONConvert { private final TableStringPool mTableStringPool; private final PackageArray mPackageArray; private final Set mFrameWorks=new HashSet<>(); @@ -75,7 +75,32 @@ public class TableBlock extends BaseChunk implements JSONConvert +public class TypeBlock extends Chunk implements BlockLoad, JSONConvert, Comparable { private final EntryBlockArray mEntryArray; diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/UnknownChunk.java b/src/main/java/com/reandroid/arsc/chunk/UnknownChunk.java similarity index 92% rename from src/main/java/com/reandroid/lib/arsc/chunk/UnknownChunk.java rename to src/main/java/com/reandroid/arsc/chunk/UnknownChunk.java index a78e09e..aaa4b2e 100644 --- a/src/main/java/com/reandroid/lib/arsc/chunk/UnknownChunk.java +++ b/src/main/java/com/reandroid/arsc/chunk/UnknownChunk.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.chunk; +package com.reandroid.arsc.chunk; - import com.reandroid.lib.arsc.header.HeaderBlock; - import com.reandroid.lib.arsc.item.ByteArray; + import com.reandroid.arsc.header.HeaderBlock; + import com.reandroid.arsc.item.ByteArray; import java.io.*; @@ -24,7 +24,7 @@ package com.reandroid.lib.arsc.chunk; * This class can load any valid chunk, aimed to * handle any future android changes * */ -public class UnknownChunk extends BaseChunk implements HeaderBlock.HeaderLoaded { +public class UnknownChunk extends Chunk implements HeaderBlock.HeaderLoaded { private final ByteArray body; public UnknownChunk() { super(new HeaderBlock(INITIAL_CHUNK_TYPE), 1); diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/AndroidManifestBlock.java b/src/main/java/com/reandroid/arsc/chunk/xml/AndroidManifestBlock.java similarity index 98% rename from src/main/java/com/reandroid/lib/arsc/chunk/xml/AndroidManifestBlock.java rename to src/main/java/com/reandroid/arsc/chunk/xml/AndroidManifestBlock.java index da0a560..339fb0d 100644 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/AndroidManifestBlock.java +++ b/src/main/java/com/reandroid/arsc/chunk/xml/AndroidManifestBlock.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.chunk.xml; +package com.reandroid.arsc.chunk.xml; -import com.reandroid.lib.arsc.value.ValueType; +import com.reandroid.arsc.value.ValueType; import java.io.File; import java.io.FileInputStream; @@ -24,7 +24,7 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; -public class AndroidManifestBlock extends ResXmlBlock{ +public class AndroidManifestBlock extends ResXmlDocument { public AndroidManifestBlock(){ super(); } @@ -41,7 +41,7 @@ public class AndroidManifestBlock extends ResXmlBlock{ if(iconAttribute==null || iconAttribute.getValueType() != ValueType.REFERENCE){ return 0; } - return iconAttribute.getRawValue(); + return iconAttribute.getData(); } public void setIconResourceId(int resourceId){ ResXmlElement applicationElement = getApplicationElement(); @@ -51,7 +51,7 @@ public class AndroidManifestBlock extends ResXmlBlock{ ResXmlAttribute iconAttribute = applicationElement.getOrCreateAndroidAttribute(NAME_icon, ID_icon); iconAttribute.setValueType(ValueType.REFERENCE); - iconAttribute.setRawValue(resourceId); + iconAttribute.setData(resourceId); } public boolean isDebuggable(){ ResXmlElement application=getApplicationElement(); @@ -315,7 +315,7 @@ public class AndroidManifestBlock extends ResXmlBlock{ builder.append("}"); return builder.toString(); } - public static boolean isAndroidManifestBlock(ResXmlBlock xmlBlock){ + public static boolean isAndroidManifestBlock(ResXmlDocument xmlBlock){ if(xmlBlock==null){ return false; } diff --git a/src/main/java/com/reandroid/arsc/chunk/xml/BaseXmlChunk.java b/src/main/java/com/reandroid/arsc/chunk/xml/BaseXmlChunk.java new file mode 100755 index 0000000..88b47a0 --- /dev/null +++ b/src/main/java/com/reandroid/arsc/chunk/xml/BaseXmlChunk.java @@ -0,0 +1,212 @@ + /* + * Copyright (C) 2022 github.com/REAndroid + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.reandroid.arsc.chunk.xml; + + import com.reandroid.arsc.chunk.ChunkType; + import com.reandroid.arsc.base.Block; + import com.reandroid.arsc.chunk.Chunk; + import com.reandroid.arsc.header.XmlNodeHeader; + import com.reandroid.arsc.item.IntegerItem; + import com.reandroid.arsc.item.ResXmlString; + import com.reandroid.arsc.pool.ResXmlStringPool; + + import java.util.HashSet; + import java.util.Set; + + class BaseXmlChunk extends Chunk { + private final IntegerItem mNamespaceReference; + private final IntegerItem mStringReference; + + BaseXmlChunk(ChunkType chunkType, int initialChildesCount) { + super(new XmlNodeHeader(chunkType), initialChildesCount+2); + + this.mNamespaceReference=new IntegerItem(-1); + this.mStringReference=new IntegerItem(-1); + + addChild(mNamespaceReference); + addChild(mStringReference); + } + Set clearStringReferences(){ + Set results=new HashSet<>(); + ResXmlString xmlString; + xmlString=unLinkStringReference(getHeaderBlock().getCommentReference()); + if(xmlString!=null){ + results.add(xmlString); + } + xmlString=unLinkStringReference(mNamespaceReference); + if(xmlString!=null){ + results.add(xmlString); + } + xmlString=unLinkStringReference(mStringReference); + if(xmlString!=null){ + results.add(xmlString); + } + return results; + } + void linkStringReferences(){ + linkStringReference(getHeaderBlock().getCommentReference()); + linkStringReference(mNamespaceReference); + linkStringReference(mStringReference); + } + private void linkStringReference(IntegerItem item){ + ResXmlString xmlString = getResXmlString(item.get()); + if(xmlString!=null){ + xmlString.addReferenceIfAbsent(item); + } + } + ResXmlString unLinkStringReference(IntegerItem item){ + ResXmlString xmlString = getResXmlString(item.get()); + if(xmlString!=null){ + xmlString.removeReference(item); + } + return xmlString; + } + public void setLineNumber(int val){ + getHeaderBlock().getLineNumber().set(val); + } + public int getLineNumber(){ + return getHeaderBlock().getLineNumber().get(); + } + public void setCommentReference(int val){ + IntegerItem comment=getHeaderBlock().getCommentReference(); + unLinkStringReference(comment); + getHeaderBlock().getCommentReference().set(val); + linkStringReference(comment); + } + public int getCommentReference(){ + return getHeaderBlock().getCommentReference().get(); + } + public void setNamespaceReference(int val){ + unLinkStringReference(mNamespaceReference); + mNamespaceReference.set(val); + linkStringReference(mNamespaceReference); + } + public int getNamespaceReference(){ + return mNamespaceReference.get(); + } + public void setStringReference(int val){ + unLinkStringReference(mStringReference); + mStringReference.set(val); + linkStringReference(mStringReference); + } + public int getStringReference(){ + return mStringReference.get(); + } + public ResXmlString setString(String str){ + ResXmlStringPool pool = getStringPool(); + if(pool==null){ + return null; + } + ResXmlString xmlString = pool.getOrCreate(str); + setStringReference(xmlString.getIndex()); + return xmlString; + } + public ResXmlStringPool getStringPool(){ + Block parent=getParent(); + while (parent!=null){ + if(parent instanceof ResXmlDocument){ + return ((ResXmlDocument)parent).getStringPool(); + } + if(parent instanceof ResXmlElement){ + return ((ResXmlElement)parent).getStringPool(); + } + parent=parent.getParent(); + } + return null; + } + public ResXmlString getResXmlString(int ref){ + if(ref<0){ + return null; + } + ResXmlStringPool stringPool=getStringPool(); + if(stringPool!=null){ + return stringPool.get(ref); + } + return null; + } + ResXmlString getOrCreateResXmlString(String str){ + ResXmlStringPool stringPool=getStringPool(); + if(stringPool!=null){ + return stringPool.getOrCreate(str); + } + return null; + } + String getString(int ref){ + ResXmlString xmlString=getResXmlString(ref); + if(xmlString!=null){ + return xmlString.get(); + } + return null; + } + ResXmlString getOrCreateString(String str){ + ResXmlStringPool stringPool=getStringPool(); + if(stringPool==null){ + return null; + } + return stringPool.getOrCreate(str); + } + + public String getName(){ + return getString(getStringReference()); + } + public String getUri(){ + return getString(getNamespaceReference()); + } + public String getComment(){ + return getString(getCommentReference()); + } + public void setComment(String comment){ + if(comment==null||comment.length()==0){ + setCommentReference(-1); + }else { + String old=getComment(); + if(comment.equals(old)){ + return; + } + ResXmlString xmlString = getOrCreateResXmlString(comment); + setCommentReference(xmlString.getIndex()); + } + } + public ResXmlElement getParentResXmlElement(){ + Block parent=getParent(); + while (parent!=null){ + if(parent instanceof ResXmlElement){ + return (ResXmlElement)parent; + } + parent=parent.getParent(); + } + return null; + } + @Override + protected void onChunkRefreshed() { + + } + @Override + public String toString(){ + ChunkType chunkType=getHeaderBlock().getChunkType(); + if(chunkType==null){ + return super.toString(); + } + StringBuilder builder=new StringBuilder(); + builder.append(chunkType.toString()); + builder.append(": line="); + builder.append(getLineNumber()); + builder.append(" {"); + builder.append(getName()); + builder.append("}"); + return builder.toString(); + } + } diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResIdBuilder.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResIdBuilder.java similarity index 90% rename from src/main/java/com/reandroid/lib/arsc/chunk/xml/ResIdBuilder.java rename to src/main/java/com/reandroid/arsc/chunk/xml/ResIdBuilder.java index 6bb8c56..0e72a08 100644 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResIdBuilder.java +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResIdBuilder.java @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.chunk.xml; +package com.reandroid.arsc.chunk.xml; -import com.reandroid.lib.arsc.array.ResXmlIDArray; -import com.reandroid.lib.arsc.array.StringArray; -import com.reandroid.lib.arsc.item.ResXmlID; -import com.reandroid.lib.arsc.item.ResXmlString; -import com.reandroid.lib.arsc.pool.ResXmlStringPool; +import com.reandroid.arsc.array.ResXmlIDArray; +import com.reandroid.arsc.array.StringArray; +import com.reandroid.arsc.item.ResXmlID; +import com.reandroid.arsc.item.ResXmlString; +import com.reandroid.arsc.pool.ResXmlStringPool; import java.util.*; diff --git a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlAttribute.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlAttribute.java new file mode 100755 index 0000000..f4eba42 --- /dev/null +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlAttribute.java @@ -0,0 +1,535 @@ + /* + * Copyright (C) 2022 github.com/REAndroid + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.reandroid.arsc.chunk.xml; + + import com.reandroid.arsc.array.ResXmlAttributeArray; + import com.reandroid.arsc.array.ResXmlIDArray; + import com.reandroid.arsc.base.Block; + import com.reandroid.arsc.container.FixedBlockContainer; + import com.reandroid.arsc.decoder.ValueDecoder; + import com.reandroid.arsc.group.EntryGroup; + import com.reandroid.arsc.item.*; + import com.reandroid.arsc.pool.ResXmlStringPool; + import com.reandroid.arsc.value.Value; + import com.reandroid.arsc.value.ValueType; + import com.reandroid.common.EntryStore; + import com.reandroid.json.JSONConvert; + import com.reandroid.json.JSONObject; + import com.reandroid.xml.XMLAttribute; + import com.reandroid.xml.XMLException; + + import java.util.HashSet; + import java.util.Set; + + public class ResXmlAttribute extends FixedBlockContainer + implements Value, Comparable, JSONConvert { + private final IntegerItem mNamespaceReference; + private final IntegerItem mNameReference; + private final IntegerItem mValueStringReference; + private final ShortItem mNameType; + private final ByteItem mReserved; + private final ByteItem mValueTypeByte; + private final IntegerItem mData; + private final ByteArray extraBytes; + public ResXmlAttribute(int size) { + super(8); + mNamespaceReference = new IntegerItem(-1); + mNameReference = new IntegerItem(-1); + mValueStringReference = new IntegerItem(-1); + mNameType = new ShortItem((short) 0x0008); + mReserved = new ByteItem(); + mValueTypeByte = new ByteItem(); + mData = new IntegerItem(); + extraBytes = new ByteArray(); + addChild(0, mNamespaceReference); + addChild(1, mNameReference); + addChild(2, mValueStringReference); + addChild(3, mNameType); + addChild(4, mReserved); + addChild(5, mValueTypeByte); + addChild(6, mData); + addChild(7, extraBytes); + + extraBytes.setSize(size-20); + } + public ResXmlAttribute(){ + this(20); + } + public void setAttributesUnitSize(int size){ + extraBytes.setSize(size-20); + IntegerItem integerItem = new IntegerItem(this.hashCode()); + extraBytes.putByteArray(0, integerItem.getBytes()); + } + + Set clearStringReferences(){ + Set results= new HashSet<>(); + ResXmlString xmlString; + xmlString=unLinkStringReference(mNamespaceReference); + if(xmlString!=null){ + results.add(xmlString); + } + xmlString=unLinkStringReference(mNameReference); + if(xmlString!=null){ + results.add(xmlString); + } + xmlString=unLinkStringReference(mValueStringReference); + if(xmlString!=null){ + results.add(xmlString); + } + xmlString=unLinkStringReference(mData); + if(xmlString!=null){ + results.add(xmlString); + } + return results; + } + public void linkStringReferences(){ + linkStringReference(mNamespaceReference); + linkStringReference(mNameReference); + linkStringReference(mValueStringReference); + if(getValueType()==ValueType.STRING){ + linkStringReference(mData); + } + } + private void linkStringReference(IntegerItem item){ + ResXmlString xmlString = getResXmlString(item.get()); + if(xmlString!=null){ + xmlString.addReferenceIfAbsent(item); + } + } + private ResXmlString unLinkStringReference(IntegerItem item){ + ResXmlString xmlString = getResXmlString(item.get()); + if(xmlString!=null){ + xmlString.removeReference(item); + } + return xmlString; + } + public String getUri(){ + return getString(getNamespaceReference()); + } + int getNamespaceReference(){ + return mNamespaceReference.get(); + } + public void setNamespaceReference(int ref){ + mNamespaceReference.set(ref); + } + int getNameReference(){ + return mNameReference.get(); + } + void setNameReference(int ref){ + mNameReference.set(ref); + } + int getValueStringReference(){ + return mValueStringReference.get(); + } + void setValueStringReference(int ref){ + mValueStringReference.set(ref); + } + byte getValueTypeByte(){ + return mValueTypeByte.get(); + } + void setValueTypeByte(byte b){ + mValueTypeByte.set(b); + } + @Override + public int getData(){ + return mData.get(); + } + @Override + public void setData(int val){ + mData.set(val); + } + @Override + public ValueType getValueType(){ + return ValueType.valueOf(getValueTypeByte()); + } + @Override + public void setValueType(ValueType valueType){ + byte b=0; + if(valueType!=null){ + b=valueType.getByte(); + } + setValueTypeByte(b); + } + public String getFullName(){ + String name=getName(); + if(name==null){ + return null; + } + String prefix=getNamePrefix(); + if(prefix==null){ + return name; + } + return prefix+":"+name; + } + public String getName(){ + return getString(getNameReference()); + } + public String getNamePrefix(){ + ResXmlElement xmlElement=getParentResXmlElement(); + if(xmlElement==null){ + return null; + } + ResXmlStartNamespace startNamespace=xmlElement.getStartNamespaceByUriRef(getNamespaceReference()); + if(startNamespace==null){ + return null; + } + return startNamespace.getPrefix(); + } + public ResXmlStartNamespace getStartNamespace(){ + ResXmlElement xmlElement=getParentResXmlElement(); + if(xmlElement==null){ + return null; + } + return xmlElement.getStartNamespaceByUriRef(getNamespaceReference()); + } + @Deprecated + public String getValueString(){ + return getString(getValueStringReference()); + } + public int getNameResourceID(){ + return getResourceId(getNameReference()); + } + public void setNameResourceID(int resourceId){ + ResXmlIDMap xmlIDMap=getResXmlIDMap(); + if(xmlIDMap==null){ + return; + } + ResXmlID xmlID = xmlIDMap.getOrCreate(resourceId); + setNameReference(xmlID.getIndex()); + } + public void setName(String name, int resourceId){ + if(resourceId!=0){ + setNameResourceID(resourceId); + return; + } + if(name==null){ + name=""; + } + ResXmlIDMap xmlIDMap=getResXmlIDMap(); + ResXmlStringPool stringPool=getStringPool(); + if(stringPool==null || xmlIDMap==null){ + return; + } + ResXmlString xmlString = stringPool.getOrCreateAttributeName(xmlIDMap.getResXmlIDArray().childesCount(), name); + setNameReference(xmlString.getIndex()); + } + private int getResourceId(int ref){ + if(ref<0){ + return 0; + } + ResXmlIDMap xmlIDMap=getResXmlIDMap(); + if(xmlIDMap==null){ + return 0; + } + ResXmlIDArray xmlIDArray = xmlIDMap.getResXmlIDArray(); + ResXmlID xmlID = xmlIDArray.get(ref); + if(xmlID!=null){ + return xmlID.get(); + } + return 0; + } + + private String getString(int ref){ + if(ref<0){ + return null; + } + ResXmlString xmlString=getResXmlString(ref); + if(xmlString!=null){ + return xmlString.getHtml(); + } + return null; + } + private ResXmlString getResXmlString(int ref){ + ResXmlStringPool stringPool=getStringPool(); + if(stringPool!=null){ + return stringPool.get(ref); + } + return null; + } + private ResXmlString getOrCreateResXmlString(String str){ + ResXmlStringPool stringPool=getStringPool(); + if(stringPool!=null){ + return stringPool.getOrCreate(str); + } + return null; + } + private ResXmlStringPool getStringPool(){ + ResXmlElement xmlElement=getParentResXmlElement(); + if(xmlElement!=null){ + return xmlElement.getStringPool(); + } + return null; + } + private ResXmlIDMap getResXmlIDMap(){ + ResXmlElement xmlElement=getParentResXmlElement(); + if(xmlElement!=null){ + return xmlElement.getResXmlIDMap(); + } + return null; + } + public ResXmlElement getParentResXmlElement(){ + Block parent=getParent(); + while (parent!=null){ + if(parent instanceof ResXmlElement){ + return (ResXmlElement)parent; + } + parent=parent.getParent(); + } + return null; + } + public String getValueAsString(){ + int ref= getData(); + ResXmlString xmlString=getResXmlString(ref); + if(xmlString==null){ + return null; + } + return xmlString.getHtml(); + } + public boolean getValueAsBoolean(){ + int ref= getData(); + 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(); + setData(ref); + setValueStringReference(ref); + } + public void setValueAsBoolean(boolean val){ + setValueType(ValueType.INT_BOOLEAN); + int ref=val?0xffffffff:0; + setData(ref); + setValueStringReference(-1); + } + public boolean hasIntegerValue(){ + ValueType valueType=getValueType(); + return valueType==ValueType.INT_DEC; + } + public Integer getValueAsInteger(){ + if(hasIntegerValue()){ + return getData(); + } + return null; + } + public void setValueAsInteger(int val){ + setValueType(ValueType.INT_DEC); + setData(val); + setValueStringReference(-1); + } + private ResXmlAttributeArray getParentResXmlAttributeArray(){ + Block parent=this; + while(parent!=null){ + if(parent instanceof ResXmlAttributeArray){ + return (ResXmlAttributeArray)parent; + } + parent=parent.getParent(); + } + return null; + } + public void setValueAsIntegerDec(int val){ + setValueType(ValueType.INT_DEC); + setData(val); + setValueStringReference(-1); + } + public void setValueAsHex(int val){ + setValueType(ValueType.INT_HEX); + setData(val); + setValueStringReference(-1); + } + public void setValueAsFraction(float fraction){ + int val=Float.floatToIntBits(fraction); + setValueAsFraction(val); + } + public void setValueAsFraction(int val){ + setValueType(ValueType.FRACTION); + setData(val); + setValueStringReference(-1); + } + public void setValueAsResourceId(int resId){ + setValueType(ValueType.REFERENCE); + setData(resId); + setValueStringReference(-1); + } + public void setValueAsAttributeId(int attrId){ + setValueType(ValueType.ATTRIBUTE); + setData(attrId); + setValueStringReference(-1); + } + public void setValueAsColorRGB4(int val){ + setValueType(ValueType.INT_COLOR_RGB4); + setData(val); + setValueStringReference(-1); + } + public void setValueAsColorRGB8(int val){ + setValueType(ValueType.INT_COLOR_RGB8); + setData(val); + setValueStringReference(-1); + } + public void setValueAsColorARGB4(int val){ + setValueType(ValueType.INT_COLOR_ARGB4); + setData(val); + setValueStringReference(-1); + } + public void setValueAsColorARGB8(int val){ + setValueType(ValueType.INT_COLOR_ARGB8); + setData(val); + setValueStringReference(-1); + } + @Override + public int compareTo(ResXmlAttribute other) { + int id1=getNameResourceID(); + int id2=other.getNameResourceID(); + if(id1==0 && id2!=0){ + return 1; + } + if(id2==0 && id1!=0){ + return -1; + } + if(id1!=0){ + return Integer.compare(id1, id2); + } + String name1=getName(); + if(name1==null){ + name1=""; + } + String name2=other.getName(); + if(name2==null){ + name2=""; + } + return name1.compareTo(name2); + } + @Override + public JSONObject toJson() { + JSONObject jsonObject= new JSONObject(); + jsonObject.put(NAME_name, getName()); + jsonObject.put(NAME_id, getNameResourceID()); + jsonObject.put(NAME_namespace_uri, getUri()); + ValueType valueType=getValueType(); + jsonObject.put(NAME_value_type, valueType.name()); + if(valueType==ValueType.STRING){ + jsonObject.put(NAME_data, getValueAsString()); + }else if(valueType==ValueType.INT_BOOLEAN){ + jsonObject.put(NAME_data, getValueAsBoolean()); + }else { + jsonObject.put(NAME_data, getData()); + } + return jsonObject; + } + @Override + public void fromJson(JSONObject json) { + String name = json.optString(NAME_name, ""); + int id = json.optInt(NAME_id, 0); + setName(name, id); + String uri= json.optString(NAME_namespace_uri, null); + if(uri!=null){ + ResXmlStartNamespace ns = getParentResXmlElement().getStartNamespaceByUri(uri); + setNamespaceReference(ns.getUriReference()); + } + ValueType valueType=ValueType.fromName(json.getString(NAME_value_type)); + if(valueType==ValueType.STRING){ + setValueAsString(json.optString(NAME_data, "")); + }else if(valueType==ValueType.INT_BOOLEAN){ + setValueAsBoolean(json.getBoolean(NAME_data)); + }else { + setValueType(valueType); + setData(json.getInt(NAME_data)); + } + } + public XMLAttribute decodeToXml(EntryStore entryStore, int currentPackageId) throws XMLException { + int resourceId=getNameResourceID(); + String name; + if(resourceId==0){ + name=getName(); + }else { + EntryGroup group = entryStore.getEntryGroup(resourceId); + if(group==null){ + //Lets ignore such error until XML encoder implemented + //throw new XMLException("Failed to decode attribute name: " + //+ String.format("@0x%08x", resourceId)); + name=String.format("@0x%08x", resourceId); + }else { + name=group.getSpecName(); + } + } + String prefix = getNamePrefix(); + if(prefix!=null){ + name=prefix+":"+name; + } + ValueType valueType=getValueType(); + int raw= getData(); + String value; + if(valueType==ValueType.STRING){ + value = ValueDecoder.escapeSpecialCharacter(getValueAsString()); + }else { + value = ValueDecoder.decode(entryStore, + currentPackageId, + resourceId, + valueType, + raw); + } + XMLAttribute attribute = new XMLAttribute(name, value); + attribute.setNameId(resourceId); + if(valueType==ValueType.REFERENCE||valueType==ValueType.ATTRIBUTE){ + attribute.setValueId(raw); + } + return attribute; + } + @Override + public String toString(){ + String fullName=getFullName(); + if(fullName!=null ){ + int id=getNameResourceID(); + if(id>0){ + fullName=fullName+"(@"+String.format("0x%08x",id)+")"; + } + String valStr; + ValueType valueType=getValueType(); + if(valueType==ValueType.STRING){ + valStr=getValueAsString(); + }else if (valueType==ValueType.INT_BOOLEAN){ + valStr=String.valueOf(getValueAsBoolean()); + }else { + valStr="["+valueType+"] "+ getData(); + } + if(valStr!=null){ + return fullName+"=\""+valStr+"\""; + } + return fullName+"["+valueType+"]=\""+ getData()+"\""; + } + StringBuilder builder= new StringBuilder(); + builder.append(getClass().getSimpleName()); + builder.append(": "); + builder.append(getIndex()); + builder.append("{NamespaceReference=").append(getNamespaceReference()); + builder.append(", NameReference=").append(getNameReference()); + builder.append(", ValueStringReference=").append(getValueStringReference()); + builder.append(", NameType=").append(mNameType.unsignedInt()); + builder.append(", ReservedByte=").append(mReserved.unsignedInt()); + builder.append(", ValueTypeByte=").append(getValueTypeByte()); + builder.append(", RawValue=").append(getData()); + builder.append("}"); + return builder.toString(); + } + static final String NAME_id = "id"; + public static final String NAME_value_type = "value_type"; + public static final String NAME_name = "name"; + public static final String NAME_namespace_uri = "namespace_uri"; + public static final String NAME_data= "data"; + } diff --git a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlDocument.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlDocument.java new file mode 100755 index 0000000..7ab709d --- /dev/null +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlDocument.java @@ -0,0 +1,353 @@ + /* + * Copyright (C) 2022 github.com/REAndroid + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.reandroid.arsc.chunk.xml; + + import com.reandroid.arsc.chunk.Chunk; + import com.reandroid.arsc.chunk.ChunkType; + import com.reandroid.arsc.container.SingleBlockContainer; + import com.reandroid.arsc.header.HeaderBlock; + import com.reandroid.arsc.io.BlockReader; + import com.reandroid.arsc.pool.ResXmlStringPool; + import com.reandroid.arsc.value.ValueType; + import com.reandroid.common.EntryStore; + import com.reandroid.json.JSONArray; + import com.reandroid.json.JSONConvert; + import com.reandroid.json.JSONObject; + import com.reandroid.xml.XMLDocument; + import com.reandroid.xml.XMLElement; + import com.reandroid.xml.XMLException; + + import java.io.*; + import java.util.ArrayList; + import java.util.HashSet; + import java.util.List; + import java.util.Set; + + public class ResXmlDocument extends Chunk implements JSONConvert { + private final ResXmlStringPool mResXmlStringPool; + private final ResXmlIDMap mResXmlIDMap; + private ResXmlElement mResXmlElement; + private final SingleBlockContainer mResXmlElementContainer; + public ResXmlDocument() { + super(new HeaderBlock(ChunkType.XML),3); + this.mResXmlStringPool=new ResXmlStringPool(true); + this.mResXmlIDMap=new ResXmlIDMap(); + this.mResXmlElement=new ResXmlElement(); + this.mResXmlElementContainer=new SingleBlockContainer<>(); + this.mResXmlElementContainer.setItem(mResXmlElement); + addChild(mResXmlStringPool); + addChild(mResXmlIDMap); + addChild(mResXmlElementContainer); + } + public void setAttributesUnitSize(int size, boolean setToAll){ + ResXmlElement root = getResXmlElement(); + if(root!=null){ + root.setAttributesUnitSize(size, setToAll); + } + } + public ResXmlElement createRootElement(String tag){ + int lineNo=1; + ResXmlElement resXmlElement=new ResXmlElement(); + resXmlElement.newStartElement(lineNo); + + setResXmlElement(resXmlElement); + + if(tag!=null){ + resXmlElement.setTag(tag); + } + return resXmlElement; + } + void linkStringReferences(){ + ResXmlElement element=getResXmlElement(); + if(element!=null){ + element.linkStringReferences(); + } + } + /* + * method Block.addBytes is inefficient for large size byte array + * so let's override here because this block is the largest + */ + @Override + public byte[] getBytes(){ + ByteArrayOutputStream os=new ByteArrayOutputStream(); + try { + writeBytes(os); + os.close(); + } catch (IOException ignored) { + } + return os.toByteArray(); + } + @Override + public void onReadBytes(BlockReader reader) throws IOException { + HeaderBlock headerBlock=reader.readHeaderBlock(); + if(headerBlock==null){ + return; + } + BlockReader chunkReader=reader.create(headerBlock.getChunkSize()); + headerBlock=getHeaderBlock(); + headerBlock.readBytes(chunkReader); + // android/aapt2 accepts 0x0000 (NULL) chunk type as XML, it could + // be android's bug and might be fixed in the future until then lets fix it ourselves + headerBlock.setType(ChunkType.XML); + while (chunkReader.isAvailable()){ + boolean readOk=readNext(chunkReader); + if(!readOk){ + break; + } + } + reader.offset(headerBlock.getChunkSize()); + chunkReader.close(); + onChunkLoaded(); + } + @Override + public void onChunkLoaded(){ + super.onChunkLoaded(); + linkStringReferences(); + } + private boolean readNext(BlockReader reader) throws IOException { + if(!reader.isAvailable()){ + return false; + } + int position=reader.getPosition(); + HeaderBlock headerBlock=reader.readHeaderBlock(); + if(headerBlock==null){ + return false; + } + ChunkType chunkType=headerBlock.getChunkType(); + if(chunkType==ChunkType.STRING){ + mResXmlStringPool.readBytes(reader); + }else if(chunkType==ChunkType.XML_RESOURCE_MAP){ + mResXmlIDMap.readBytes(reader); + }else if(isElementChunk(chunkType)){ + mResXmlElementContainer.readBytes(reader); + return reader.isAvailable(); + }else { + throw new IOException("Unexpected chunk "+headerBlock); + } + return reader.isAvailable() && position!=reader.getPosition(); + } + private boolean isElementChunk(ChunkType chunkType){ + if(chunkType==ChunkType.XML_START_ELEMENT){ + return true; + } + if(chunkType==ChunkType.XML_END_ELEMENT){ + return true; + } + if(chunkType==ChunkType.XML_START_NAMESPACE){ + return true; + } + if(chunkType==ChunkType.XML_END_NAMESPACE){ + return true; + } + if(chunkType==ChunkType.XML_CDATA){ + return true; + } + if(chunkType==ChunkType.XML_LAST_CHUNK){ + return true; + } + return false; + } + public ResXmlStringPool getStringPool(){ + return mResXmlStringPool; + } + public ResXmlIDMap getResXmlIDMap(){ + return mResXmlIDMap; + } + public ResXmlElement getResXmlElement(){ + return mResXmlElement; + } + public void setResXmlElement(ResXmlElement resXmlElement){ + this.mResXmlElement=resXmlElement; + this.mResXmlElementContainer.setItem(resXmlElement); + } + @Override + protected void onChunkRefreshed() { + + } + public void readBytes(File file) throws IOException{ + BlockReader reader=new BlockReader(file); + super.readBytes(reader); + } + public void readBytes(InputStream inputStream) throws IOException{ + BlockReader reader=new BlockReader(inputStream); + super.readBytes(reader); + } + public final int writeBytes(File file) throws IOException{ + if(isNull()){ + throw new IOException("Can NOT save null block"); + } + File dir=file.getParentFile(); + if(dir!=null && !dir.exists()){ + dir.mkdirs(); + } + OutputStream outputStream=new FileOutputStream(file); + int length = super.writeBytes(outputStream); + outputStream.close(); + return length; + } + @Override + public JSONObject toJson() { + JSONObject jsonObject=new JSONObject(); + jsonObject.put(ResXmlDocument.NAME_element, getResXmlElement().toJson()); + JSONArray pool = getStringPool().toJson(); + if(pool!=null){ + jsonObject.put(ResXmlDocument.NAME_styled_strings, pool); + } + return jsonObject; + } + @Override + public void fromJson(JSONObject json) { + onFromJson(json); + ResXmlElement xmlElement=getResXmlElement(); + xmlElement.fromJson(json.optJSONObject(ResXmlDocument.NAME_element)); + refresh(); + } + public XMLDocument decodeToXml(EntryStore entryStore, int currentPackageId) throws XMLException { + XMLDocument xmlDocument = new XMLDocument(); + XMLElement xmlElement = getResXmlElement() + .decodeToXml(entryStore, currentPackageId); + xmlDocument.setDocumentElement(xmlElement); + return xmlDocument; + } + private void onFromJson(JSONObject json){ + List attributeList=recursiveAttributes(json.optJSONObject(ResXmlDocument.NAME_element)); + buildResourceIds(attributeList); + Set allStrings=recursiveStrings(json.optJSONObject(ResXmlDocument.NAME_element)); + ResXmlStringPool stringPool = getStringPool(); + stringPool.addStrings(allStrings); + stringPool.refresh(); + } + private void buildResourceIds(List attributeList){ + ResIdBuilder builder=new ResIdBuilder(); + for(JSONObject attribute:attributeList){ + int id=attribute.getInt(ResXmlAttribute.NAME_id); + if(id==0){ + continue; + } + String name=attribute.getString(ResXmlAttribute.NAME_name); + builder.add(id, name); + } + builder.buildTo(getResXmlIDMap()); + } + private List recursiveAttributes(JSONObject elementJson){ + List results = new ArrayList<>(); + if(elementJson==null){ + return results; + } + JSONArray attributes = elementJson.optJSONArray(ResXmlElement.NAME_attributes); + if(attributes != null){ + int length = attributes.length(); + for(int i=0; i recursiveStrings(JSONObject elementJson){ + Set results = new HashSet<>(); + if(elementJson==null){ + return results; + } + results.add(elementJson.optString(ResXmlElement.NAME_namespace_uri)); + results.add(elementJson.optString(ResXmlElement.NAME_name)); + JSONArray namespaces=elementJson.optJSONArray(ResXmlElement.NAME_namespaces); + if(namespaces != null){ + int length = namespaces.length(); + for(int i=0; i { + private final BlockList mStartNamespaceList; + private final SingleBlockContainer mStartElementContainer; + private final BlockList mBody; + private final SingleBlockContainer mEndElementContainer; + private final BlockList mEndNamespaceList; + private int mDepth; + public ResXmlElement() { + super(5); + this.mStartNamespaceList = new BlockList<>(); + this.mStartElementContainer= new SingleBlockContainer<>(); + this.mBody = new BlockList<>(); + this.mEndElementContainer = new SingleBlockContainer<>(); + this.mEndNamespaceList = new BlockList<>(); + addChild(0, mStartNamespaceList); + addChild(1, mStartElementContainer); + addChild(2, mBody); + addChild(3, mEndElementContainer); + addChild(4, mEndNamespaceList); + } + public void setAttributesUnitSize(int size, boolean setToAll){ + ResXmlStartElement startElement = getStartElement(); + startElement.setAttributesUnitSize(size); + if(setToAll){ + for(ResXmlElement child:listElements()){ + child.setAttributesUnitSize(size, setToAll); + } + } + } + public String getComment(){ + return getStartElement().getComment(); + } + public void setComment(String comment){ + getStartElement().setComment(comment); + } + public void calculatePositions(){ + ResXmlStartElement start = getStartElement(); + if(start!=null){ + start.calculatePositions(); + } + } + public ResXmlAttribute newAttribute(){ + return getStartElement().newAttribute(); + } + Set clearStringReferences(){ + Set results=new HashSet<>(); + for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){ + results.addAll(startNamespace.clearStringReferences()); + } + ResXmlStartElement start = getStartElement(); + if(start!=null){ + results.addAll(start.clearStringReferences()); + } + ResXmlText resXmlText=getResXmlText(); + if(resXmlText!=null){ + results.addAll(resXmlText.clearStringReferences()); + } + for(ResXmlElement child:listElements()){ + results.addAll(child.clearStringReferences()); + } + return results; + } + void linkStringReferences(){ + for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){ + startNamespace.linkStringReferences(); + } + ResXmlStartElement start = getStartElement(); + if(start!=null){ + start.linkStringReferences(); + } + ResXmlText resXmlText=getResXmlText(); + if(resXmlText!=null){ + resXmlText.linkStringReferences(); + } + for(ResXmlElement child:listElements()){ + child.linkStringReferences(); + } + } + public ResXmlElement createChildElement(){ + return createChildElement(null); + } + public ResXmlElement createChildElement(String tag){ + int lineNo=getStartElement().getLineNumber()+1; + ResXmlElement resXmlElement=new ResXmlElement(); + resXmlElement.newStartElement(lineNo); + + addElement(resXmlElement); + + if(tag!=null){ + resXmlElement.setTag(tag); + } + return resXmlElement; + } + public ResXmlAttribute getOrCreateAndroidAttribute(String name, int resourceId){ + return getOrCreateAttribute(NS_ANDROID_URI, NS_ANDROID_PREFIX, name, resourceId); + } + public ResXmlAttribute getOrCreateAttribute(String uri, String prefix, String name, int resourceId){ + ResXmlAttribute attribute=searchAttribute(name, resourceId); + if(attribute==null){ + attribute = createAttribute(name, resourceId); + if(uri!=null){ + ResXmlElement root = getRootResXmlElement(); + ResXmlStartNamespace ns = root.getOrCreateNamespace(uri, prefix); + attribute.setNamespaceReference(ns.getUriReference()); + } + } + return attribute; + } + public ResXmlAttribute getOrCreateAttribute(String name, int resourceId){ + ResXmlAttribute attribute=searchAttribute(name, resourceId); + if(attribute==null){ + attribute=createAttribute(name, resourceId); + } + return attribute; + } + public ResXmlAttribute createAndroidAttribute(String name, int resourceId){ + ResXmlAttribute attribute=createAttribute(name, resourceId); + ResXmlStartNamespace ns = getOrCreateNamespace(NS_ANDROID_URI, NS_ANDROID_PREFIX); + attribute.setNamespaceReference(ns.getUriReference()); + return attribute; + } + public ResXmlAttribute createAttribute(String name, int resourceId){ + ResXmlAttribute attribute=new ResXmlAttribute(); + addAttribute(attribute); + attribute.setName(name, resourceId); + return attribute; + } + public void addAttribute(ResXmlAttribute attribute){ + getStartElement().getResXmlAttributeArray().add(attribute); + } + public ResXmlElement getElementByTagName(String name){ + if(name==null){ + return null; + } + for(ResXmlElement child:listElements()){ + if(name.equals(child.getTag())||name.equals(child.getTagName())){ + return child; + } + } + return null; + } + private ResXmlAttribute searchAttribute(String name, int resourceId){ + if(resourceId==0){ + return searchAttributeByName(name); + } + return searchAttributeByResourceId(resourceId); + } + public ResXmlAttribute searchAttributeByName(String name){ + ResXmlStartElement startElement=getStartElement(); + if(startElement!=null){ + return startElement.searchAttributeByName(name); + } + return null; + } + public ResXmlAttribute searchAttributeByResourceId(int resourceId){ + ResXmlStartElement startElement=getStartElement(); + if(startElement!=null){ + return startElement.searchAttributeByResourceId(resourceId); + } + return null; + } + public void setTag(String tag){ + ResXmlStringPool pool = getStringPool(); + if(pool==null){ + return; + } + ensureStartEndElement(); + ResXmlStartElement start=getStartElement(); + String prefix=null; + String name=tag; + int i=tag.lastIndexOf(':'); + if(i>=0){ + prefix=tag.substring(0,i); + i++; + name=tag.substring(i); + } + start.setName(name); + ResXmlStartNamespace ns = getStartNamespaceByPrefix(prefix); + if(ns!=null){ + start.setNamespaceReference(ns.getUriReference()); + } + } + public String getTagName(){ + ResXmlStartElement startElement=getStartElement(); + if(startElement!=null){ + return startElement.getTagName(); + } + return null; + } + public String getTag(){ + ResXmlStartElement startElement=getStartElement(); + if(startElement!=null){ + return startElement.getName(); + } + return null; + } + public String getTagUri(){ + ResXmlStartElement startElement=getStartElement(); + if(startElement!=null){ + return startElement.getUri(); + } + return null; + } + public String getTagPrefix(){ + ResXmlStartElement startElement=getStartElement(); + if(startElement!=null){ + return startElement.getPrefix(); + } + return null; + } + public Collection listAttributes(){ + ResXmlStartElement startElement=getStartElement(); + if(startElement!=null){ + return startElement.listResXmlAttributes(); + } + return new ArrayList<>(); + } + public ResXmlStringPool getStringPool(){ + Block parent=getParent(); + while (parent!=null){ + if(parent instanceof ResXmlDocument){ + return ((ResXmlDocument)parent).getStringPool(); + } + if(parent instanceof ResXmlElement){ + return ((ResXmlElement)parent).getStringPool(); + } + parent=parent.getParent(); + } + return null; + } + public ResXmlIDMap getResXmlIDMap(){ + Block parent=getParent(); + while (parent!=null){ + if(parent instanceof ResXmlDocument){ + return ((ResXmlDocument)parent).getResXmlIDMap(); + } + parent=parent.getParent(); + } + return null; + } + + public int getDepth(){ + return mDepth; + } + private void setDepth(int depth){ + mDepth=depth; + } + public void addElement(ResXmlElement element){ + mBody.add(element); + } + public boolean removeAttribute(ResXmlAttribute resXmlAttribute){ + return getStartElement().getResXmlAttributeArray().remove(resXmlAttribute); + } + public boolean removeElement(ResXmlElement element){ + if(element.getParent()!=null){ + // TODO: Find a way to remove properly from StringPool + Set removedStrings = element.clearStringReferences(); + for(ResXmlString xmlString:removedStrings){ + if(xmlString.getReferencedList().size()!=0){ + continue; + } + xmlString.set(""); + } + } + return mBody.remove(element); + } + public int countElements(){ + int result = 0; + for(ResXmlNode xmlNode:listXmlNodes()){ + if(xmlNode instanceof ResXmlElement){ + result++; + } + } + return result; + } + public void clearChildes(){ + List copyOfNodeList=new ArrayList<>(mBody.getChildes()); + for(ResXmlNode xmlNode:copyOfNodeList){ + if(xmlNode==null){ + continue; + } + xmlNode.onRemove(); + mBody.remove(xmlNode); + } + } + public List listXmlNodes(){ + return mBody.getChildes(); + } + public List listXmlText(){ + List results=new ArrayList<>(); + for(ResXmlNode xmlNode:listXmlNodes()){ + if(xmlNode instanceof ResXmlTextNode){ + results.add(((ResXmlTextNode) xmlNode).getResXmlText()); + } + } + return results; + } + public List listXmlTextNodes(){ + List results=new ArrayList<>(); + for(ResXmlNode xmlNode:listXmlNodes()){ + if(xmlNode instanceof ResXmlTextNode){ + results.add((ResXmlTextNode) xmlNode); + } + } + return results; + } + public List listElements(){ + List results=new ArrayList<>(); + for(ResXmlNode xmlNode:listXmlNodes()){ + if(xmlNode instanceof ResXmlElement){ + results.add((ResXmlElement) xmlNode); + } + } + return results; + } + public List listElements(String name){ + List results=new ArrayList<>(); + if(name==null){ + return results; + } + for(ResXmlElement element:listElements()){ + if(name.equals(element.getTag())||name.equals(element.getTagName())){ + results.add(element); + } + } + return results; + } + public ResXmlElement getRootResXmlElement(){ + ResXmlElement parent=getParentResXmlElement(); + if(parent!=null){ + return parent.getRootResXmlElement(); + } + return this; + } + public ResXmlElement getParentResXmlElement(){ + Block parent=getParent(); + while (parent!=null){ + if(parent instanceof ResXmlElement){ + return (ResXmlElement)parent; + } + parent=parent.getParent(); + } + return null; + } + public ResXmlStartNamespace getStartNamespaceByUriRef(int uriRef){ + if(uriRef<0){ + return null; + } + for(ResXmlStartNamespace ns:mStartNamespaceList.getChildes()){ + if(uriRef==ns.getUriReference()){ + return ns; + } + } + ResXmlElement xmlElement=getParentResXmlElement(); + if(xmlElement!=null){ + return xmlElement.getStartNamespaceByUriRef(uriRef); + } + return null; + } + public ResXmlStartNamespace getOrCreateNamespace(String uri, String prefix){ + ResXmlStartNamespace exist=getStartNamespaceByUri(uri); + if(exist!=null){ + return exist; + } + ResXmlStartNamespace startNamespace=new ResXmlStartNamespace(); + ResXmlEndNamespace endNamespace=new ResXmlEndNamespace(); + startNamespace.setEnd(endNamespace); + + addStartNamespace(startNamespace); + addEndNamespace(endNamespace); + + startNamespace.setUri(uri); + startNamespace.setPrefix(prefix); + + return startNamespace; + } + public ResXmlStartNamespace getStartNamespaceByUri(String uri){ + if(uri==null){ + return null; + } + for(ResXmlStartNamespace ns:mStartNamespaceList.getChildes()){ + if(uri.equals(ns.getUri())){ + return ns; + } + } + ResXmlElement xmlElement=getParentResXmlElement(); + if(xmlElement!=null){ + return xmlElement.getStartNamespaceByUri(uri); + } + return null; + } + public ResXmlStartNamespace getStartNamespaceByPrefix(String prefix){ + if(prefix==null){ + return null; + } + for(ResXmlStartNamespace ns:mStartNamespaceList.getChildes()){ + if(prefix.equals(ns.getPrefix())){ + return ns; + } + } + ResXmlElement xmlElement=getParentResXmlElement(); + if(xmlElement!=null){ + return xmlElement.getStartNamespaceByPrefix(prefix); + } + return null; + } + public List getStartNamespaceList(){ + return mStartNamespaceList.getChildes(); + } + public void addStartNamespace(ResXmlStartNamespace item){ + mStartNamespaceList.add(item); + } + public List getEndNamespaceList(){ + return mEndNamespaceList.getChildes(); + } + public void addEndNamespace(ResXmlEndNamespace item){ + mEndNamespaceList.add(item); + } + + ResXmlStartElement newStartElement(int lineNo){ + ResXmlStartElement startElement=new ResXmlStartElement(); + setStartElement(startElement); + + ResXmlEndElement endElement=new ResXmlEndElement(); + startElement.setResXmlEndElement(endElement); + + setEndElement(endElement); + endElement.setResXmlStartElement(startElement); + + startElement.setLineNumber(lineNo); + endElement.setLineNumber(lineNo); + + return startElement; + } + + public ResXmlStartElement getStartElement(){ + return mStartElementContainer.getItem(); + } + public void setStartElement(ResXmlStartElement item){ + mStartElementContainer.setItem(item); + } + + public ResXmlEndElement getEndElement(){ + return mEndElementContainer.getItem(); + } + public void setEndElement(ResXmlEndElement item){ + mEndElementContainer.setItem(item); + } + + // Use listXmlText() instead to be removed on next version + @Deprecated + public ResXmlText getResXmlText(){ + List xmlTextList=listXmlText(); + if(xmlTextList.size()==0){ + return null; + } + return xmlTextList.get(0); + } + public void addResXmlTextNode(ResXmlTextNode xmlTextNode){ + mBody.add(xmlTextNode); + } + public void addResXmlText(ResXmlText xmlText){ + if(xmlText!=null){ + addResXmlTextNode(new ResXmlTextNode(xmlText)); + } + } + // Use addResXmlText() + @Deprecated + public void setResXmlText(ResXmlText xmlText){ + addResXmlText(xmlText); + } + @Deprecated + public void setResXmlText(String text){ + clearChildes(); + addResXmlText(text); + } + public void addResXmlText(String text){ + if(text==null){ + return; + } + ResXmlTextNode xmlTextNode=new ResXmlTextNode(); + addResXmlTextNode(xmlTextNode); + xmlTextNode.setText(text); + } + + private boolean isBalanced(){ + return isElementBalanced() && isNamespaceBalanced(); + } + private boolean isNamespaceBalanced(){ + return (mStartNamespaceList.size()==mEndNamespaceList.size()); + } + private boolean isElementBalanced(){ + return (hasStartElement() && hasEndElement()); + } + private boolean hasStartElement(){ + return mStartElementContainer.hasItem(); + } + private boolean hasEndElement(){ + return mEndElementContainer.hasItem(); + } + + private void linkStartEnd(){ + linkStartEndElement(); + linkStartEndNameSpaces(); + } + private void linkStartEndElement(){ + ResXmlStartElement start=getStartElement(); + ResXmlEndElement end=getEndElement(); + if(start==null || end==null){ + return; + } + start.setResXmlEndElement(end); + end.setResXmlStartElement(start); + } + private void ensureStartEndElement(){ + ResXmlStartElement start=getStartElement(); + ResXmlEndElement end=getEndElement(); + if(start!=null && end!=null){ + return; + } + if(start==null){ + start=new ResXmlStartElement(); + setStartElement(start); + } + if(end==null){ + end=new ResXmlEndElement(); + setEndElement(end); + } + linkStartEndElement(); + } + private void linkStartEndNameSpaces(){ + if(!isNamespaceBalanced()){ + return; + } + int max=mStartNamespaceList.size(); + for(int i=0;i0 && getDepth()==0){ + onFinishedUnexpected(reader); + return; + } + onFinishedSuccess(reader, headerBlock); + } + private void onFinishedSuccess(BlockReader reader, HeaderBlock headerBlock) throws IOException{ + + } + private void onFinishedUnexpected(BlockReader reader) throws IOException{ + StringBuilder builder=new StringBuilder(); + builder.append("Unexpected finish reading: reader=").append(reader.toString()); + HeaderBlock header = reader.readHeaderBlock(); + if(header!=null){ + builder.append(", next header="); + builder.append(header.toString()); + } + throw new IOException(builder.toString()); + } + private void onStartElement(BlockReader reader) throws IOException{ + if(hasStartElement()){ + ResXmlElement childElement=new ResXmlElement(); + addElement(childElement); + childElement.setDepth(getDepth()+1); + childElement.readBytes(reader); + }else{ + ResXmlStartElement startElement=new ResXmlStartElement(); + setStartElement(startElement); + startElement.readBytes(reader); + } + } + private void onEndElement(BlockReader reader) throws IOException{ + if(hasEndElement()){ + multipleEndElement(reader); + return; + } + ResXmlEndElement endElement=new ResXmlEndElement(); + setEndElement(endElement); + endElement.readBytes(reader); + } + private void onStartNamespace(BlockReader reader) throws IOException{ + ResXmlStartNamespace startNamespace=new ResXmlStartNamespace(); + addStartNamespace(startNamespace); + startNamespace.readBytes(reader); + } + private void onEndNamespace(BlockReader reader) throws IOException{ + ResXmlEndNamespace endNamespace=new ResXmlEndNamespace(); + addEndNamespace(endNamespace); + endNamespace.readBytes(reader); + } + private void onXmlText(BlockReader reader) throws IOException{ + ResXmlText xmlText=new ResXmlText(); + addResXmlText(xmlText); + xmlText.readBytes(reader); + } + + private void unknownChunk(BlockReader reader, HeaderBlock headerBlock) throws IOException{ + throw new IOException("Unknown chunk: "+headerBlock.toString()); + } + private void multipleEndElement(BlockReader reader) throws IOException{ + throw new IOException("Multiple end element: "+reader.toString()); + } + private void unexpectedChunk(BlockReader reader, HeaderBlock headerBlock) throws IOException{ + throw new IOException("Unexpected chunk: "+headerBlock.toString()); + } + private void unBalancedFinish(BlockReader reader) throws IOException{ + if(!isNamespaceBalanced()){ + throw new IOException("Unbalanced namespace: start=" + +mStartNamespaceList.size()+", end="+mEndNamespaceList.size()); + } + + if(!isElementBalanced()){ + // Should not happen unless corrupted file, auto corrected above + StringBuilder builder=new StringBuilder(); + builder.append("Unbalanced element: start="); + ResXmlStartElement startElement=getStartElement(); + if(startElement!=null){ + builder.append(startElement); + }else { + builder.append("null"); + } + builder.append(", end="); + ResXmlEndElement endElement=getEndElement(); + if(endElement!=null){ + builder.append(endElement); + }else { + builder.append("null"); + } + throw new IOException(builder.toString()); + } + } + @Override + public JSONObject toJson() { + JSONObject jsonObject=new JSONObject(); + jsonObject.put(NAME_node_type, NAME_element); + ResXmlStartElement start = getStartElement(); + jsonObject.put(NAME_line, start.getLineNumber()); + int i=0; + JSONArray nsList=new JSONArray(); + for(ResXmlStartNamespace namespace:getStartNamespaceList()){ + JSONObject ns=new JSONObject(); + ns.put(NAME_namespace_uri, namespace.getUri()); + ns.put(NAME_namespace_prefix, namespace.getPrefix()); + nsList.put(i, ns); + i++; + } + if(i>0){ + jsonObject.put(NAME_namespaces, nsList); + } + jsonObject.put(NAME_name, start.getName()); + String comment=start.getComment(); + if(comment!=null){ + jsonObject.put(NAME_comment, comment); + } + String uri=start.getUri(); + if(uri!=null){ + jsonObject.put(NAME_namespace_uri, uri); + } + JSONArray attrArray=start.getResXmlAttributeArray().toJson(); + jsonObject.put(NAME_attributes, attrArray); + i=0; + JSONArray childes=new JSONArray(); + for(ResXmlNode xmlNode:listXmlNodes()){ + childes.put(i, xmlNode.toJson()); + i++; + } + if(i>0){ + jsonObject.put(NAME_childes, childes); + } + return jsonObject; + } + @Override + public void fromJson(JSONObject json) { + ResXmlStartElement start = getStartElement(); + int lineNo=json.optInt(NAME_line, 1); + if(start==null){ + start = newStartElement(lineNo); + }else { + start.setLineNumber(lineNo); + } + JSONArray nsArray = json.optJSONArray(NAME_namespaces); + if(nsArray!=null){ + int length=nsArray.length(); + for(int i=0;i"); + builder.append(text.toString()); + builder.append(""); + }else { + builder.append("/>"); + } + return builder.toString(); + } + return "NULL"; + } + static ResXmlElement newResXmlElement(String tag){ + ResXmlElement resXmlElement=new ResXmlElement(); + ResXmlStartElement startElement=new ResXmlStartElement(); + resXmlElement.setStartElement(startElement); + ResXmlEndElement endElement=new ResXmlEndElement(); + resXmlElement.setEndElement(endElement); + resXmlElement.setTag(tag); + return resXmlElement; + } + + public static final String NS_ANDROID_URI = "http://schemas.android.com/apk/res/android"; + public static final String NS_ANDROID_PREFIX = "android"; + + static final String NAME_element = "element"; + static final String NAME_name = "name"; + static final String NAME_comment = "comment"; + static final String NAME_text = "text"; + static final String NAME_namespaces = "namespaces"; + static final String NAME_namespace_uri = "namespace_uri"; + static final String NAME_namespace_prefix = "namespace_prefix"; + private static final String NAME_line = "line"; + static final String NAME_attributes = "attributes"; + static final String NAME_childes = "childes"; + } diff --git a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlEndElement.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlEndElement.java new file mode 100755 index 0000000..ea32e12 --- /dev/null +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlEndElement.java @@ -0,0 +1,32 @@ + /* + * Copyright (C) 2022 github.com/REAndroid + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.reandroid.arsc.chunk.xml; + + import com.reandroid.arsc.chunk.ChunkType; + + public class ResXmlEndElement extends BaseXmlChunk { + private ResXmlStartElement mResXmlStartElement; + public ResXmlEndElement(){ + super(ChunkType.XML_END_ELEMENT, 0); + } + + public void setResXmlStartElement(ResXmlStartElement element){ + mResXmlStartElement=element; + } + public ResXmlStartElement getResXmlStartElement(){ + return mResXmlStartElement; + } + } diff --git a/src/main/java/com/reandroid/lib/arsc/array/ResXmlChunkArray.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlEndNamespace.java similarity index 58% rename from src/main/java/com/reandroid/lib/arsc/array/ResXmlChunkArray.java rename to src/main/java/com/reandroid/arsc/chunk/xml/ResXmlEndNamespace.java index 06951a9..22edb1b 100755 --- a/src/main/java/com/reandroid/lib/arsc/array/ResXmlChunkArray.java +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlEndNamespace.java @@ -13,25 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.array; + package com.reandroid.arsc.chunk.xml; -import com.reandroid.lib.arsc.base.BlockArray; -import com.reandroid.lib.arsc.chunk.xml.BaseXmlChunk; + import com.reandroid.arsc.chunk.ChunkType; -public class ResXmlChunkArray extends BlockArray { - - @Override - public BaseXmlChunk newInstance() { - return null; - } - - @Override - public BaseXmlChunk[] newInstance(int len) { - return new BaseXmlChunk[len]; - } - - @Override - protected void onRefreshed() { - - } -} + public class ResXmlEndNamespace extends ResXmlNamespace{ + public ResXmlEndNamespace() { + super(ChunkType.XML_END_NAMESPACE); + } + public ResXmlStartNamespace getStart(){ + return (ResXmlStartNamespace) getPair(); + } + public void setStart(ResXmlStartNamespace namespace){ + setPair(namespace); + } + } diff --git a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlIDMap.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlIDMap.java new file mode 100755 index 0000000..21d8b49 --- /dev/null +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlIDMap.java @@ -0,0 +1,68 @@ + /* + * Copyright (C) 2022 github.com/REAndroid + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.reandroid.arsc.chunk.xml; + + import com.reandroid.arsc.base.Block; + import com.reandroid.arsc.chunk.ChunkType; + import com.reandroid.arsc.array.ResXmlIDArray; + import com.reandroid.arsc.chunk.Chunk; + import com.reandroid.arsc.header.HeaderBlock; + import com.reandroid.arsc.item.ResXmlID; + import com.reandroid.arsc.pool.ResXmlStringPool; + + import java.util.Collection; + + public class ResXmlIDMap extends Chunk { + private final ResXmlIDArray mResXmlIDArray; + public ResXmlIDMap() { + super(new HeaderBlock(ChunkType.XML_RESOURCE_MAP), 1); + this.mResXmlIDArray=new ResXmlIDArray(getHeaderBlock()); + addChild(mResXmlIDArray); + } + public ResXmlIDArray getResXmlIDArray(){ + return mResXmlIDArray; + } + + public Collection listResXmlID(){ + return getResXmlIDArray().listItems(); + } + public void addResourceId(int index, int resId){ + getResXmlIDArray().addResourceId(index, resId); + } + public ResXmlID getResXmlID(int ref){ + return getResXmlIDArray().get(ref); + } + public ResXmlID getOrCreate(int resId){ + return getResXmlIDArray().getOrCreate(resId); + } + public ResXmlID getByResId(int resId){ + return getResXmlIDArray().getByResId(resId); + } + @Override + protected void onChunkRefreshed() { + + } + ResXmlStringPool getXmlStringPool(){ + Block parent=this; + while (parent!=null){ + if(parent instanceof ResXmlDocument){ + return ((ResXmlDocument)parent).getStringPool(); + } + parent=parent.getParent(); + } + return null; + } + } diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlNamespace.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlNamespace.java similarity index 86% rename from src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlNamespace.java rename to src/main/java/com/reandroid/arsc/chunk/xml/ResXmlNamespace.java index 1d73de1..123af29 100644 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlNamespace.java +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlNamespace.java @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.chunk.xml; +package com.reandroid.arsc.chunk.xml; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.item.ResXmlString; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.item.ResXmlString; -abstract class ResXmlNamespace extends BaseXmlChunk{ - private PAIR mPair; +abstract class ResXmlNamespace extends BaseXmlChunk{ + private ResXmlNamespace mPair; ResXmlNamespace(ChunkType chunkType) { super(chunkType, 0); } @@ -49,7 +49,7 @@ abstract class ResXmlNamespace extends BaseXmlChun } public void setUriReference(int ref){ setStringReference(ref); - PAIR pair=getPair(); + ResXmlNamespace pair=getPair(); if(pair!=null && pair.getUriReference()!=ref){ pair.setUriReference(ref); } @@ -59,15 +59,15 @@ abstract class ResXmlNamespace extends BaseXmlChun } public void setPrefixReference(int ref){ setNamespaceReference(ref); - PAIR pair=getPair(); + ResXmlNamespace pair=getPair(); if(pair!=null && pair.getPrefixReference()!=ref){ pair.setPrefixReference(ref); } } - PAIR getPair(){ + ResXmlNamespace getPair(){ return mPair; } - void setPair(PAIR pair){ + void setPair(ResXmlNamespace pair){ if(pair==this){ return; } diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlNode.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlNode.java similarity index 82% rename from src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlNode.java rename to src/main/java/com/reandroid/arsc/chunk/xml/ResXmlNode.java index cbfefeb..388a7f7 100644 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlNode.java +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlNode.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.chunk.xml; +package com.reandroid.arsc.chunk.xml; -import com.reandroid.lib.arsc.container.FixedBlockContainer; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.container.FixedBlockContainer; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONObject; public abstract class ResXmlNode extends FixedBlockContainer implements JSONConvert { ResXmlNode(int childesCount) { diff --git a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlStartElement.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlStartElement.java new file mode 100755 index 0000000..2716ea5 --- /dev/null +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlStartElement.java @@ -0,0 +1,292 @@ + /* + * Copyright (C) 2022 github.com/REAndroid + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.reandroid.arsc.chunk.xml; + + import com.reandroid.arsc.chunk.ChunkType; + import com.reandroid.arsc.array.ResXmlAttributeArray; + import com.reandroid.arsc.item.ResXmlString; + import com.reandroid.arsc.item.ShortItem; + + import java.util.Collection; + import java.util.Set; + + public class ResXmlStartElement extends BaseXmlChunk { + private final ShortItem mAttributeStart; + private final ShortItem mAttributeUnitSize; + private final ShortItem mAttributeCount; + private final ShortItem mIdAttributePosition; + private final ShortItem mClassAttributePosition; + private final ShortItem mStyleAttributePosition; + private final ResXmlAttributeArray mAttributeArray; + private ResXmlEndElement mResXmlEndElement; + public ResXmlStartElement() { + super(ChunkType.XML_START_ELEMENT, 7); + mAttributeStart = new ShortItem(ATTRIBUTES_DEFAULT_START); + mAttributeUnitSize = new ShortItem(ATTRIBUTES_UNIT_SIZE); + mAttributeCount = new ShortItem(); + mIdAttributePosition = new ShortItem(); + mClassAttributePosition = new ShortItem(); + mStyleAttributePosition = new ShortItem(); + mAttributeArray = new ResXmlAttributeArray(getHeaderBlock(), + mAttributeStart, + mAttributeCount, + mAttributeUnitSize); + addChild(mAttributeStart); + addChild(mAttributeUnitSize); + addChild(mAttributeCount); + addChild(mIdAttributePosition); + addChild(mClassAttributePosition); + addChild(mStyleAttributePosition); + addChild(mAttributeArray); + } + void setAttributesUnitSize(int size){ + mAttributeArray.setAttributesUnitSize(size); + } + public ResXmlAttribute newAttribute(){ + ResXmlAttributeArray attributeArray = getResXmlAttributeArray(); + return attributeArray.createNext(); + } + @Override + void linkStringReferences(){ + super.linkStringReferences(); + ResXmlEndElement end = getResXmlEndElement(); + if(end!=null){ + end.linkStringReferences(); + } + for(ResXmlAttribute attr:listResXmlAttributes()){ + attr.linkStringReferences(); + } + } + @Override + Set clearStringReferences(){ + Set results=super.clearStringReferences(); + ResXmlEndElement end = getResXmlEndElement(); + if(end!=null){ + results.addAll(end.clearStringReferences()); + } + for(ResXmlAttribute attr:listResXmlAttributes()){ + results.addAll(attr.clearStringReferences()); + } + return results; + } + @Override + protected void onPreRefreshRefresh(){ + sortAttributes(); + } + private void sortAttributes(){ + ResXmlAttributeArray array = getResXmlAttributeArray(); + + ResXmlAttribute idAttribute=array.get(mIdAttributePosition.get()-1); + ResXmlAttribute classAttribute=array.get(mClassAttributePosition.get()-1); + ResXmlAttribute styleAttribute=array.get(mStyleAttributePosition.get()-1); + + array.sortAttributes(); + if(idAttribute!=null){ + mIdAttributePosition.set((short) (idAttribute.getIndex()+1)); + } + if(classAttribute!=null){ + mClassAttributePosition.set((short) (classAttribute.getIndex()+1)); + // In case obfuscation + if(!ATTRIBUTE_NAME_CLASS.equals(classAttribute.getName())){ + classAttribute.setName(ATTRIBUTE_NAME_CLASS, 0); + } + } + if(styleAttribute!=null){ + mStyleAttributePosition.set((short) (styleAttribute.getIndex()+1)); + // In case obfuscation + if(!ATTRIBUTE_NAME_STYLE.equals(styleAttribute.getName())){ + styleAttribute.setName(ATTRIBUTE_NAME_STYLE, 0); + } + } + } + void calculatePositions(){ + ResXmlAttribute idAttribute=getAttribute(ATTRIBUTE_RESOURCE_ID_id); + ResXmlAttribute classAttribute=getNoIdAttribute(ATTRIBUTE_NAME_CLASS); + ResXmlAttribute styleAttribute=getNoIdAttribute(ATTRIBUTE_NAME_STYLE); + + if(idAttribute!=null){ + mIdAttributePosition.set((short) (idAttribute.getIndex()+1)); + } + if(classAttribute!=null){ + mClassAttributePosition.set((short) (classAttribute.getIndex()+1)); + } + if(styleAttribute!=null){ + mStyleAttributePosition.set((short) (styleAttribute.getIndex()+1)); + } + } + public ResXmlAttribute getAttribute(int resourceId){ + for(ResXmlAttribute attribute:listResXmlAttributes()){ + if(resourceId==attribute.getNameResourceID()){ + return attribute; + } + } + return null; + } + private ResXmlAttribute getNoIdAttribute(String name){ + for(ResXmlAttribute attribute:listResXmlAttributes()){ + if(attribute.getNameResourceID()!=0){ + continue; + } + if(name.equals(attribute.getName())){ + return attribute; + } + } + return null; + } + public ResXmlAttribute getAttribute(String uri, String name){ + if(name==null){ + return null; + } + for(ResXmlAttribute attribute:listResXmlAttributes()){ + if(name.equals(attribute.getName())||name.equals(attribute.getFullName())){ + if(uri!=null){ + if(uri.equals(attribute.getUri())){ + return attribute; + } + continue; + } + return attribute; + } + } + return null; + } + public ResXmlAttribute searchAttributeByName(String name){ + if(name==null){ + return null; + } + for(ResXmlAttribute attribute:listResXmlAttributes()){ + if(name.equals(attribute.getFullName()) || name.equals(attribute.getName())){ + return attribute; + } + } + return null; + } + public ResXmlAttribute searchAttributeByResourceId(int resourceId){ + if(resourceId==0){ + return null; + } + for(ResXmlAttribute attribute:listResXmlAttributes()){ + if(resourceId==attribute.getNameResourceID()){ + return attribute; + } + } + return null; + } + public String getTagName(){ + String prefix=getPrefix(); + String name=getName(); + if(prefix==null){ + return name; + } + return prefix+":"+name; + } + public void setName(String name){ + setString(name); + ResXmlEndElement endElement = getResXmlEndElement(); + if(endElement!=null){ + endElement.setString(name); + } + } + public Collection listResXmlAttributes(){ + return getResXmlAttributeArray().listItems(); + } + public ResXmlAttributeArray getResXmlAttributeArray(){ + return mAttributeArray; + } + + public String getUri(){ + int uriRef=getNamespaceReference(); + if(uriRef<0){ + return null; + } + ResXmlElement parentElement=getParentResXmlElement(); + ResXmlStartNamespace startNamespace=parentElement.getStartNamespaceByUriRef(uriRef); + if(startNamespace!=null){ + return startNamespace.getUri(); + } + return null; + } + public String getPrefix(){ + int uriRef=getNamespaceReference(); + if(uriRef<0){ + return null; + } + ResXmlElement parentElement=getParentResXmlElement(); + ResXmlStartNamespace startNamespace=parentElement.getStartNamespaceByUriRef(uriRef); + if(startNamespace!=null){ + return startNamespace.getPrefix(); + } + return null; + } + public void setResXmlEndElement(ResXmlEndElement element){ + mResXmlEndElement=element; + } + public ResXmlEndElement getResXmlEndElement(){ + return mResXmlEndElement; + } + + @Override + protected void onChunkRefreshed() { + refreshAttributeStart(); + refreshAttributeCount(); + } + private void refreshAttributeStart(){ + int start=countUpTo(mAttributeArray); + start=start-getHeaderBlock().getHeaderSize(); + mAttributeStart.set((short)start); + } + private void refreshAttributeCount(){ + int count=mAttributeArray.childesCount(); + mAttributeCount.set((short)count); + } + + @Override + public String toString(){ + String txt=getTagName(); + if(txt==null){ + return super.toString(); + } + StringBuilder builder=new StringBuilder(); + builder.append(txt); + ResXmlAttribute[] allAttr=mAttributeArray.getChildes(); + if(allAttr!=null){ + for(int i=0;i10){ + break; + } + builder.append(" "); + builder.append(allAttr[i].toString()); + } + } + return builder.toString(); + } + + private static final short ATTRIBUTES_UNIT_SIZE=20; + private static final short ATTRIBUTES_DEFAULT_START=20; + /* + * Find another way to mark an attribute is class, device actually relies on + * value of mClassAttributePosition */ + private static final String ATTRIBUTE_NAME_CLASS="class"; + /* + * Find another way to mark an attribute is style, device actually relies on + * value of mStyleAttributePosition */ + private static final String ATTRIBUTE_NAME_STYLE="style"; + /* + * Resource id value of attribute 'android:id' + * instead of relying on hardcoded value, we should find another way to + * mark an attribute is 'id' */ + private static final int ATTRIBUTE_RESOURCE_ID_id =0x010100d0; + } diff --git a/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlStartNamespace.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlStartNamespace.java new file mode 100755 index 0000000..ea0778a --- /dev/null +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlStartNamespace.java @@ -0,0 +1,69 @@ + /* + * Copyright (C) 2022 github.com/REAndroid + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.reandroid.arsc.chunk.xml; + + import com.reandroid.arsc.chunk.ChunkType; + import com.reandroid.arsc.item.ResXmlString; + import com.reandroid.xml.SchemaAttr; + import com.reandroid.xml.XMLAttribute; + + import java.util.Set; + + public class ResXmlStartNamespace extends ResXmlNamespace { + public ResXmlStartNamespace() { + super(ChunkType.XML_START_NAMESPACE); + } + public ResXmlEndNamespace getEnd(){ + return (ResXmlEndNamespace) getPair(); + } + public void setEnd(ResXmlEndNamespace namespace){ + setPair(namespace); + } + @Override + void linkStringReferences(){ + super.linkStringReferences(); + ResXmlEndNamespace end = getEnd(); + if(end!=null){ + end.linkStringReferences(); + } + } + @Override + Set clearStringReferences(){ + Set results=super.clearStringReferences(); + ResXmlEndNamespace end = getEnd(); + if(end!=null){ + results.addAll(end.clearStringReferences()); + } + return results; + } + public XMLAttribute decodeToXml(){ + String uri=getUri(); + String prefix=getPrefix(); + if(isEmpty(uri) || isEmpty(prefix)){ + return null; + } + SchemaAttr schemaAttr=new SchemaAttr(prefix, uri); + schemaAttr.setLineNumber(getLineNumber()); + return schemaAttr; + } + private boolean isEmpty(String txt){ + if(txt==null){ + return true; + } + txt=txt.trim(); + return txt.length()==0; + } + } diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlText.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlText.java similarity index 87% rename from src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlText.java rename to src/main/java/com/reandroid/arsc/chunk/xml/ResXmlText.java index b692b18..7780561 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlText.java +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlText.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.chunk.xml; +package com.reandroid.arsc.chunk.xml; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.ResXmlString; -import com.reandroid.lib.arsc.pool.ResXmlStringPool; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.ResXmlString; +import com.reandroid.arsc.pool.ResXmlStringPool; public class ResXmlText extends BaseXmlChunk { private final IntegerItem mReserved; diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlTextNode.java b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlTextNode.java similarity index 94% rename from src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlTextNode.java rename to src/main/java/com/reandroid/arsc/chunk/xml/ResXmlTextNode.java index 6e05272..a37227d 100644 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlTextNode.java +++ b/src/main/java/com/reandroid/arsc/chunk/xml/ResXmlTextNode.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.chunk.xml; +package com.reandroid.arsc.chunk.xml; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.json.JSONObject; import com.reandroid.xml.XMLText; public class ResXmlTextNode extends ResXmlNode { diff --git a/src/main/java/com/reandroid/lib/arsc/container/BlockList.java b/src/main/java/com/reandroid/arsc/container/BlockList.java similarity index 93% rename from src/main/java/com/reandroid/lib/arsc/container/BlockList.java rename to src/main/java/com/reandroid/arsc/container/BlockList.java index dd9b642..d0fd016 100755 --- a/src/main/java/com/reandroid/lib/arsc/container/BlockList.java +++ b/src/main/java/com/reandroid/arsc/container/BlockList.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.container; +package com.reandroid.arsc.container; -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.io.BlockReader; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.base.BlockContainer; +import com.reandroid.arsc.base.BlockCounter; +import com.reandroid.arsc.io.BlockReader; import java.io.IOException; import java.io.OutputStream; diff --git a/src/main/java/com/reandroid/lib/arsc/container/ExpandableBlockContainer.java b/src/main/java/com/reandroid/arsc/container/ExpandableBlockContainer.java similarity index 92% rename from src/main/java/com/reandroid/lib/arsc/container/ExpandableBlockContainer.java rename to src/main/java/com/reandroid/arsc/container/ExpandableBlockContainer.java index df230ac..8b3d718 100755 --- a/src/main/java/com/reandroid/lib/arsc/container/ExpandableBlockContainer.java +++ b/src/main/java/com/reandroid/arsc/container/ExpandableBlockContainer.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.container; +package com.reandroid.arsc.container; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.base.BlockContainer; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.base.BlockContainer; public class ExpandableBlockContainer extends BlockContainer { private Block[] mChildes; diff --git a/src/main/java/com/reandroid/lib/arsc/container/FixedBlockContainer.java b/src/main/java/com/reandroid/arsc/container/FixedBlockContainer.java similarity index 89% rename from src/main/java/com/reandroid/lib/arsc/container/FixedBlockContainer.java rename to src/main/java/com/reandroid/arsc/container/FixedBlockContainer.java index 584ee6d..f45b695 100755 --- a/src/main/java/com/reandroid/lib/arsc/container/FixedBlockContainer.java +++ b/src/main/java/com/reandroid/arsc/container/FixedBlockContainer.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.container; +package com.reandroid.arsc.container; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.base.BlockContainer; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.base.BlockContainer; public class FixedBlockContainer extends BlockContainer { private final Block[] mChildes; diff --git a/src/main/java/com/reandroid/lib/arsc/container/PackageBody.java b/src/main/java/com/reandroid/arsc/container/PackageBody.java similarity index 95% rename from src/main/java/com/reandroid/lib/arsc/container/PackageBody.java rename to src/main/java/com/reandroid/arsc/container/PackageBody.java index 7361cc0..5236c04 100755 --- a/src/main/java/com/reandroid/lib/arsc/container/PackageBody.java +++ b/src/main/java/com/reandroid/arsc/container/PackageBody.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.container; +package com.reandroid.arsc.container; -import com.reandroid.lib.arsc.chunk.*; -import com.reandroid.lib.arsc.array.SpecTypePairArray; -import com.reandroid.lib.arsc.header.HeaderBlock; -import com.reandroid.lib.arsc.io.BlockReader; +import com.reandroid.arsc.chunk.*; +import com.reandroid.arsc.array.SpecTypePairArray; +import com.reandroid.arsc.header.HeaderBlock; +import com.reandroid.arsc.io.BlockReader; import java.io.IOException; diff --git a/src/main/java/com/reandroid/lib/arsc/container/ResValueContainer.java b/src/main/java/com/reandroid/arsc/container/ResValueContainer.java similarity index 91% rename from src/main/java/com/reandroid/lib/arsc/container/ResValueContainer.java rename to src/main/java/com/reandroid/arsc/container/ResValueContainer.java index 6421964..e0216b6 100755 --- a/src/main/java/com/reandroid/lib/arsc/container/ResValueContainer.java +++ b/src/main/java/com/reandroid/arsc/container/ResValueContainer.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.container; +package com.reandroid.arsc.container; -import com.reandroid.lib.arsc.base.BlockContainer; -import com.reandroid.lib.arsc.value.BaseResValue; +import com.reandroid.arsc.base.BlockContainer; +import com.reandroid.arsc.value.BaseResValue; public class ResValueContainer extends BlockContainer { private final BaseResValue[] mChildes; diff --git a/src/main/java/com/reandroid/lib/arsc/container/SingleBlockContainer.java b/src/main/java/com/reandroid/arsc/container/SingleBlockContainer.java similarity index 92% rename from src/main/java/com/reandroid/lib/arsc/container/SingleBlockContainer.java rename to src/main/java/com/reandroid/arsc/container/SingleBlockContainer.java index 7755aa5..1135e84 100755 --- a/src/main/java/com/reandroid/lib/arsc/container/SingleBlockContainer.java +++ b/src/main/java/com/reandroid/arsc/container/SingleBlockContainer.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.container; +package com.reandroid.arsc.container; -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.io.BlockReader; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.base.BlockContainer; +import com.reandroid.arsc.base.BlockCounter; +import com.reandroid.arsc.io.BlockReader; import java.io.IOException; import java.io.OutputStream; diff --git a/src/main/java/com/reandroid/lib/arsc/container/SpecTypePair.java b/src/main/java/com/reandroid/arsc/container/SpecTypePair.java similarity index 90% rename from src/main/java/com/reandroid/lib/arsc/container/SpecTypePair.java rename to src/main/java/com/reandroid/arsc/container/SpecTypePair.java index c8b2559..54a9a55 100755 --- a/src/main/java/com/reandroid/lib/arsc/container/SpecTypePair.java +++ b/src/main/java/com/reandroid/arsc/container/SpecTypePair.java @@ -13,22 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.container; +package com.reandroid.arsc.container; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.array.TypeBlockArray; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.base.BlockContainer; -import com.reandroid.lib.arsc.chunk.PackageBlock; -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.io.BlockReader; -import com.reandroid.lib.arsc.item.TypeString; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResConfig; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.array.TypeBlockArray; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.base.BlockContainer; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.SpecBlock; +import com.reandroid.arsc.chunk.TypeBlock; +import com.reandroid.arsc.header.HeaderBlock; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.item.TypeString; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResConfig; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONObject; import java.io.IOException; import java.util.ArrayList; @@ -37,7 +37,7 @@ import java.util.Iterator; import java.util.List; public class SpecTypePair extends BlockContainer - implements JSONConvert , Comparable{ + implements JSONConvert, Comparable{ private final Block[] mChildes; private final SpecBlock mSpecBlock; private final TypeBlockArray mTypeBlockArray; diff --git a/src/main/java/com/reandroid/lib/arsc/decoder/ValueDecoder.java b/src/main/java/com/reandroid/arsc/decoder/ValueDecoder.java similarity index 98% rename from src/main/java/com/reandroid/lib/arsc/decoder/ValueDecoder.java rename to src/main/java/com/reandroid/arsc/decoder/ValueDecoder.java index 6395d0f..36fe845 100755 --- a/src/main/java/com/reandroid/lib/arsc/decoder/ValueDecoder.java +++ b/src/main/java/com/reandroid/arsc/decoder/ValueDecoder.java @@ -13,16 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.decoder; +package com.reandroid.arsc.decoder; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.group.EntryGroup; -import com.reandroid.lib.arsc.item.TableString; -import com.reandroid.lib.arsc.pool.TableStringPool; -import com.reandroid.lib.arsc.value.*; -import com.reandroid.lib.arsc.value.attribute.AttributeBag; -import com.reandroid.lib.common.EntryStore; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.group.EntryGroup; +import com.reandroid.arsc.item.TableString; +import com.reandroid.arsc.pool.TableStringPool; +import com.reandroid.arsc.value.*; +import com.reandroid.arsc.value.attribute.AttributeBag; +import com.reandroid.common.EntryStore; import java.util.Collection; import java.util.Iterator; diff --git a/src/main/java/com/reandroid/lib/arsc/group/EntryGroup.java b/src/main/java/com/reandroid/arsc/group/EntryGroup.java similarity index 93% rename from src/main/java/com/reandroid/lib/arsc/group/EntryGroup.java rename to src/main/java/com/reandroid/arsc/group/EntryGroup.java index 7fe05ad..b114379 100755 --- a/src/main/java/com/reandroid/lib/arsc/group/EntryGroup.java +++ b/src/main/java/com/reandroid/arsc/group/EntryGroup.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.group; +package com.reandroid.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; +import com.reandroid.arsc.base.BlockArrayCreator; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.TypeBlock; +import com.reandroid.arsc.item.SpecString; +import com.reandroid.arsc.item.TypeString; +import com.reandroid.arsc.pool.SpecStringPool; +import com.reandroid.arsc.value.EntryBlock; import java.util.Iterator; diff --git a/src/main/java/com/reandroid/lib/arsc/group/ItemGroup.java b/src/main/java/com/reandroid/arsc/group/ItemGroup.java similarity index 94% rename from src/main/java/com/reandroid/lib/arsc/group/ItemGroup.java rename to src/main/java/com/reandroid/arsc/group/ItemGroup.java index b26016d..8fd4da2 100755 --- a/src/main/java/com/reandroid/lib/arsc/group/ItemGroup.java +++ b/src/main/java/com/reandroid/arsc/group/ItemGroup.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.group; +package com.reandroid.arsc.group; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.base.BlockArrayCreator; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.base.BlockArrayCreator; import java.util.AbstractList; import java.util.Iterator; @@ -107,6 +107,7 @@ import java.util.Objects; return items; } private void trimToSize(){ + T[] items=this.items; int count=countNonNull(); int len=items.length; if(count==len){ @@ -121,7 +122,7 @@ import java.util.Objects; index++; } } - items=update; + this.items=update; } private int countNonNull(){ int result=0; @@ -142,8 +143,7 @@ import java.util.Objects; @Override public boolean equals(Object obj){ if(obj instanceof StringGroup){ - StringGroup other=(StringGroup)obj; - return hashCode==other.hashCode(); + return hashCode==obj.hashCode(); } return false; } @@ -155,7 +155,7 @@ import java.util.Objects; private class GroupIterator implements Iterator { private int mCursor; - private int mMaxSize; + private final int mMaxSize; private final boolean mSkipNullBlock; GroupIterator(boolean skipNullBlock){ mSkipNullBlock=skipNullBlock; diff --git a/src/main/java/com/reandroid/lib/arsc/group/StringGroup.java b/src/main/java/com/reandroid/arsc/group/StringGroup.java similarity index 85% rename from src/main/java/com/reandroid/lib/arsc/group/StringGroup.java rename to src/main/java/com/reandroid/arsc/group/StringGroup.java index dc3d9cf..73ccdbc 100755 --- a/src/main/java/com/reandroid/lib/arsc/group/StringGroup.java +++ b/src/main/java/com/reandroid/arsc/group/StringGroup.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.group; +package com.reandroid.arsc.group; -import com.reandroid.lib.arsc.base.BlockArrayCreator; -import com.reandroid.lib.arsc.item.StringItem; +import com.reandroid.arsc.base.BlockArrayCreator; +import com.reandroid.arsc.item.StringItem; public class StringGroup extends ItemGroup{ public StringGroup(BlockArrayCreator blockArrayCreator, String name){ diff --git a/src/main/java/com/reandroid/lib/arsc/header/HeaderBlock.java b/src/main/java/com/reandroid/arsc/header/HeaderBlock.java similarity index 86% rename from src/main/java/com/reandroid/lib/arsc/header/HeaderBlock.java rename to src/main/java/com/reandroid/arsc/header/HeaderBlock.java index 0318bfc..42a6cea 100755 --- a/src/main/java/com/reandroid/lib/arsc/header/HeaderBlock.java +++ b/src/main/java/com/reandroid/arsc/header/HeaderBlock.java @@ -13,20 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.header; +package com.reandroid.arsc.header; -import com.reandroid.lib.arsc.base.BlockContainer; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.container.BlockList; -import com.reandroid.lib.arsc.container.ExpandableBlockContainer; -import com.reandroid.lib.arsc.io.BlockLoad; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.BlockItem; -import com.reandroid.lib.arsc.item.ByteArray; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.ShortItem; -import com.reandroid.lib.arsc.util.HexBytesWriter; +import com.reandroid.arsc.base.BlockContainer; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.container.BlockList; +import com.reandroid.arsc.container.ExpandableBlockContainer; +import com.reandroid.arsc.io.BlockLoad; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.item.BlockItem; +import com.reandroid.arsc.item.ByteArray; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.ShortItem; +import com.reandroid.arsc.util.HexBytesWriter; import java.io.*; import java.util.List; @@ -96,8 +96,7 @@ import java.util.List; refreshChunkSize(); } private void refreshHeaderSize(){ - int count=countBytes(); - setHeaderSize((short)count); + setHeaderSize((short)countBytes()); } private void refreshChunkSize(){ Block parent=getParent(); @@ -114,17 +113,13 @@ import java.util.List; return result; } private int onReadBytes(InputStream inputStream) throws IOException { - int readCount = readBytes(inputStream, this); - int difference = getHeaderSize() - readCount; - if(difference==0){ - return readCount; - } - if(extraBytes.getParent()==null){ - addChild(extraBytes); - } - extraBytes.setSize(difference); - readCount += extraBytes.readBytes(inputStream); - return readCount; + int readCount = readBytes(inputStream, this); + int difference = getHeaderSize() - readCount; + initExtraBytes(this.extraBytes, difference); + if(this.extraBytes.size()>0){ + readCount += extraBytes.readBytes(inputStream); + } + return readCount; } private int readBytes(InputStream inputStream, Block block) throws IOException{ int result=0; @@ -153,14 +148,10 @@ import java.util.List; super.onReadBytes(reader); int readActual=reader.getPosition() - start; int difference=getHeaderSize()-readActual; - if(difference==0){ - return; + initExtraBytes(this.extraBytes, difference); + if(this.extraBytes.size()>0){ + this.extraBytes.readBytes(reader); } - if(extraBytes.getParent()==null){ - addChild(extraBytes); - } - extraBytes.setSize(difference); - extraBytes.readBytes(reader); } @Override public void onBlockLoaded(BlockReader reader, Block sender) throws IOException { @@ -182,6 +173,15 @@ import java.util.List; protected void refreshChildes(){ // Not required } + void initExtraBytes(ByteArray extraBytes, int difference){ + if(difference==0){ + return; + } + if(extraBytes.getParent()==null){ + addChild(extraBytes); + } + extraBytes.setSize(difference); + } void onChunkTypeLoaded(short chunkType){ HeaderLoaded headerLoaded = mHeaderLoaded; if(headerLoaded!=null){ diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlEndElement.java b/src/main/java/com/reandroid/arsc/header/InfoHeader.java old mode 100755 new mode 100644 similarity index 56% rename from src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlEndElement.java rename to src/main/java/com/reandroid/arsc/header/InfoHeader.java index b69b0f3..b6eb928 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlEndElement.java +++ b/src/main/java/com/reandroid/arsc/header/InfoHeader.java @@ -13,21 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.chunk.xml; + package com.reandroid.arsc.header; -import com.reandroid.lib.arsc.chunk.ChunkType; + import com.reandroid.arsc.item.ByteArray; -public class ResXmlEndElement extends BaseXmlChunk { - private ResXmlStartElement mResXmlStartElement; - public ResXmlEndElement(){ - super(ChunkType.XML_END_ELEMENT, 0); - } - - public void setResXmlStartElement(ResXmlStartElement element){ - mResXmlStartElement=element; - } - public ResXmlStartElement getResXmlStartElement(){ - return mResXmlStartElement; - } - -} + public class InfoHeader extends HeaderBlock{ + public InfoHeader(short type) { + super(type); + } + public InfoHeader() { + this((short) 0); + } + @Override + void initExtraBytes(ByteArray extraBytes, int difference){ + } + @Override + public int countBytes() { + return 8; + } + } diff --git a/src/main/java/com/reandroid/lib/arsc/header/LibraryHeader.java b/src/main/java/com/reandroid/arsc/header/LibraryHeader.java similarity index 89% rename from src/main/java/com/reandroid/lib/arsc/header/LibraryHeader.java rename to src/main/java/com/reandroid/arsc/header/LibraryHeader.java index fbde016..1bf03a1 100644 --- a/src/main/java/com/reandroid/lib/arsc/header/LibraryHeader.java +++ b/src/main/java/com/reandroid/arsc/header/LibraryHeader.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.header; +package com.reandroid.arsc.header; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.item.IntegerItem; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.item.IntegerItem; public class LibraryHeader extends HeaderBlock{ private final IntegerItem count; diff --git a/src/main/java/com/reandroid/lib/arsc/header/OverlayableHeader.java b/src/main/java/com/reandroid/arsc/header/OverlayableHeader.java similarity index 91% rename from src/main/java/com/reandroid/lib/arsc/header/OverlayableHeader.java rename to src/main/java/com/reandroid/arsc/header/OverlayableHeader.java index d8887ae..6292ab5 100644 --- a/src/main/java/com/reandroid/lib/arsc/header/OverlayableHeader.java +++ b/src/main/java/com/reandroid/arsc/header/OverlayableHeader.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.header; +package com.reandroid.arsc.header; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.item.FixedLengthString; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.item.FixedLengthString; public class OverlayableHeader extends HeaderBlock{ private final FixedLengthString name; diff --git a/src/main/java/com/reandroid/lib/arsc/header/OverlayablePolicyHeader.java b/src/main/java/com/reandroid/arsc/header/OverlayablePolicyHeader.java similarity index 91% rename from src/main/java/com/reandroid/lib/arsc/header/OverlayablePolicyHeader.java rename to src/main/java/com/reandroid/arsc/header/OverlayablePolicyHeader.java index 978a959..e6c9316 100644 --- a/src/main/java/com/reandroid/lib/arsc/header/OverlayablePolicyHeader.java +++ b/src/main/java/com/reandroid/arsc/header/OverlayablePolicyHeader.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.header; +package com.reandroid.arsc.header; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.item.IntegerItem; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.item.IntegerItem; public class OverlayablePolicyHeader extends HeaderBlock{ private final IntegerItem flags; diff --git a/src/main/java/com/reandroid/lib/arsc/header/PackageHeader.java b/src/main/java/com/reandroid/arsc/header/PackageHeader.java similarity index 91% rename from src/main/java/com/reandroid/lib/arsc/header/PackageHeader.java rename to src/main/java/com/reandroid/arsc/header/PackageHeader.java index cc4b784..b1f29bd 100644 --- a/src/main/java/com/reandroid/lib/arsc/header/PackageHeader.java +++ b/src/main/java/com/reandroid/arsc/header/PackageHeader.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.header; +package com.reandroid.arsc.header; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.container.SingleBlockContainer; -import com.reandroid.lib.arsc.item.FixedLengthString; -import com.reandroid.lib.arsc.item.IntegerItem; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.container.SingleBlockContainer; +import com.reandroid.arsc.item.FixedLengthString; +import com.reandroid.arsc.item.IntegerItem; public class PackageHeader extends HeaderBlock{ private final IntegerItem packageId; diff --git a/src/main/java/com/reandroid/lib/arsc/header/SpecHeader.java b/src/main/java/com/reandroid/arsc/header/SpecHeader.java similarity index 86% rename from src/main/java/com/reandroid/lib/arsc/header/SpecHeader.java rename to src/main/java/com/reandroid/arsc/header/SpecHeader.java index f54a139..d113549 100644 --- a/src/main/java/com/reandroid/lib/arsc/header/SpecHeader.java +++ b/src/main/java/com/reandroid/arsc/header/SpecHeader.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.header; +package com.reandroid.arsc.header; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.item.ByteItem; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.ShortItem; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.item.ByteItem; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.ShortItem; public class SpecHeader extends HeaderBlock{ private final ByteItem id; diff --git a/src/main/java/com/reandroid/lib/arsc/header/StagedAliasHeader.java b/src/main/java/com/reandroid/arsc/header/StagedAliasHeader.java similarity index 89% rename from src/main/java/com/reandroid/lib/arsc/header/StagedAliasHeader.java rename to src/main/java/com/reandroid/arsc/header/StagedAliasHeader.java index 52b9a15..38996da 100644 --- a/src/main/java/com/reandroid/lib/arsc/header/StagedAliasHeader.java +++ b/src/main/java/com/reandroid/arsc/header/StagedAliasHeader.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.header; +package com.reandroid.arsc.header; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.item.IntegerItem; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.item.IntegerItem; public class StagedAliasHeader extends HeaderBlock{ private final IntegerItem count; diff --git a/src/main/java/com/reandroid/lib/arsc/header/StringPoolHeader.java b/src/main/java/com/reandroid/arsc/header/StringPoolHeader.java similarity index 93% rename from src/main/java/com/reandroid/lib/arsc/header/StringPoolHeader.java rename to src/main/java/com/reandroid/arsc/header/StringPoolHeader.java index e40da7e..1fd21cf 100644 --- a/src/main/java/com/reandroid/lib/arsc/header/StringPoolHeader.java +++ b/src/main/java/com/reandroid/arsc/header/StringPoolHeader.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.header; +package com.reandroid.arsc.header; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.ShortItem; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.ShortItem; public class StringPoolHeader extends HeaderBlock{ private final IntegerItem countStrings; diff --git a/src/main/java/com/reandroid/lib/arsc/header/TableHeader.java b/src/main/java/com/reandroid/arsc/header/TableHeader.java similarity index 89% rename from src/main/java/com/reandroid/lib/arsc/header/TableHeader.java rename to src/main/java/com/reandroid/arsc/header/TableHeader.java index d823963..3a8aed7 100644 --- a/src/main/java/com/reandroid/lib/arsc/header/TableHeader.java +++ b/src/main/java/com/reandroid/arsc/header/TableHeader.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.header; +package com.reandroid.arsc.header; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.item.IntegerItem; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.item.IntegerItem; public class TableHeader extends HeaderBlock{ private final IntegerItem packageCount; diff --git a/src/main/java/com/reandroid/lib/arsc/header/TypeHeader.java b/src/main/java/com/reandroid/arsc/header/TypeHeader.java similarity index 88% rename from src/main/java/com/reandroid/lib/arsc/header/TypeHeader.java rename to src/main/java/com/reandroid/arsc/header/TypeHeader.java index 6b70f20..f9fe51d 100644 --- a/src/main/java/com/reandroid/lib/arsc/header/TypeHeader.java +++ b/src/main/java/com/reandroid/arsc/header/TypeHeader.java @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.header; +package com.reandroid.arsc.header; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.item.ByteItem; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.ShortItem; -import com.reandroid.lib.arsc.value.ResConfig; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.item.ByteItem; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.ShortItem; +import com.reandroid.arsc.value.ResConfig; public class TypeHeader extends HeaderBlock{ private final ByteItem id; diff --git a/src/main/java/com/reandroid/lib/arsc/header/XmlNodeHeader.java b/src/main/java/com/reandroid/arsc/header/XmlNodeHeader.java similarity index 92% rename from src/main/java/com/reandroid/lib/arsc/header/XmlNodeHeader.java rename to src/main/java/com/reandroid/arsc/header/XmlNodeHeader.java index 2703f12..1feba22 100644 --- a/src/main/java/com/reandroid/lib/arsc/header/XmlNodeHeader.java +++ b/src/main/java/com/reandroid/arsc/header/XmlNodeHeader.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.header; +package com.reandroid.arsc.header; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.item.IntegerItem; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.item.IntegerItem; public class XmlNodeHeader extends HeaderBlock{ private final IntegerItem lineNumber; diff --git a/src/main/java/com/reandroid/lib/arsc/io/BlockLoad.java b/src/main/java/com/reandroid/arsc/io/BlockLoad.java similarity index 90% rename from src/main/java/com/reandroid/lib/arsc/io/BlockLoad.java rename to src/main/java/com/reandroid/arsc/io/BlockLoad.java index d9f3ec6..7728ae9 100755 --- a/src/main/java/com/reandroid/lib/arsc/io/BlockLoad.java +++ b/src/main/java/com/reandroid/arsc/io/BlockLoad.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.io; +package com.reandroid.arsc.io; -import com.reandroid.lib.arsc.base.Block; +import com.reandroid.arsc.base.Block; import java.io.IOException; diff --git a/src/main/java/com/reandroid/lib/arsc/io/BlockReader.java b/src/main/java/com/reandroid/arsc/io/BlockReader.java similarity index 84% rename from src/main/java/com/reandroid/lib/arsc/io/BlockReader.java rename to src/main/java/com/reandroid/arsc/io/BlockReader.java index 6c90bc8..50cf088 100755 --- a/src/main/java/com/reandroid/lib/arsc/io/BlockReader.java +++ b/src/main/java/com/reandroid/arsc/io/BlockReader.java @@ -13,9 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.io; +package com.reandroid.arsc.io; -import com.reandroid.lib.arsc.header.HeaderBlock; +import com.reandroid.arsc.header.HeaderBlock; +import com.reandroid.arsc.header.InfoHeader; import java.io.*; @@ -46,16 +47,15 @@ import java.io.*; public BlockReader(File file) throws IOException { this(loadBuffer(file)); } - public HeaderBlock readHeaderBlock() throws IOException { - int pos=getPosition(); - HeaderBlock headerBlock=new HeaderBlock((short)0); - try{ - headerBlock.readBytes(this); - }catch (EOFException ex){ + public InfoHeader readHeaderBlock() throws IOException { + InfoHeader infoHeader = new InfoHeader(); + if(available() < infoHeader.countBytes()){ return null; } + int pos = getPosition(); + infoHeader.readBytes(this); seek(pos); - return headerBlock; + return infoHeader; } public int searchNextIntPosition(int bytesOffset, int value){ if(mIsClosed || mPosition>=mLength){ @@ -80,15 +80,27 @@ import java.io.*; (bts[offset+2] & 0xff) << 16 | (bts[offset+3] & 0xff) << 24; } - public byte[] getBuffer(){ - return BUFFER; + public byte[] getBytes(){ + int len = length(); + if(this.BUFFER.length == len){ + return BUFFER; + } + byte[] bytes = new byte[len]; + if(len==0){ + return bytes; + } + System.arraycopy(BUFFER, mStart, bytes, 0, len); + return bytes; + } + public BlockReader create(int len){ + return create(getPosition(), len); } public BlockReader create(int start, int len){ - int max=start+len; - if(len<0 || max> mLength){ - len= mLength -start; + int max = start + len; + if(len < 0 || max > this.mLength){ + len = this.mLength - start; } - start=start+mStart; + start = start + this.mStart; return new BlockReader(BUFFER, start, len); } public boolean isAvailable(){ @@ -136,33 +148,6 @@ import java.io.*; System.arraycopy(result, 0, result2, 0, len2); return result2; } - public int lengthUntilNextZero(int offset, int zeroCount){ - if(mIsClosed || mPosition>=mLength){ - return 0; - } - synchronized (mLock){ - int actPos=mStart+mPosition-1; - int max=available(); - int remZero=zeroCount; - int len=0; - for(int i=0;i=mLength){ - j++; + i++; break; } } - return j; + return i; } } public int getPosition(){ diff --git a/src/main/java/com/reandroid/lib/arsc/item/BlockItem.java b/src/main/java/com/reandroid/arsc/item/BlockItem.java similarity index 94% rename from src/main/java/com/reandroid/lib/arsc/item/BlockItem.java rename to src/main/java/com/reandroid/arsc/item/BlockItem.java index 557c292..33e1fb0 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/BlockItem.java +++ b/src/main/java/com/reandroid/arsc/item/BlockItem.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.base.BlockCounter; -import com.reandroid.lib.arsc.io.BlockReader; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.base.BlockCounter; +import com.reandroid.arsc.io.BlockReader; import java.io.IOException; import java.io.InputStream; diff --git a/src/main/java/com/reandroid/lib/arsc/item/ByteArray.java b/src/main/java/com/reandroid/arsc/item/ByteArray.java similarity index 95% rename from src/main/java/com/reandroid/lib/arsc/item/ByteArray.java rename to src/main/java/com/reandroid/arsc/item/ByteArray.java index f8053ec..1d1cd49 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/ByteArray.java +++ b/src/main/java/com/reandroid/arsc/item/ByteArray.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; import java.util.AbstractList; import java.util.List; @@ -119,7 +119,15 @@ public class ByteArray extends BlockItem { } public final void putByteArray(int offset, byte[] val){ byte[] bts = getBytesInternal(); - System.arraycopy(val, 0, bts, offset, val.length); + int avail = bts.length-offset; + if(avail<=0){ + return; + } + int len = val.length; + if(len>avail){ + len=avail; + } + System.arraycopy(val, 0, bts, offset, len); } public final byte[] getByteArray(int offset, int length){ byte[] bts = getBytesInternal(); diff --git a/src/main/java/com/reandroid/lib/arsc/item/ByteItem.java b/src/main/java/com/reandroid/arsc/item/ByteItem.java similarity index 97% rename from src/main/java/com/reandroid/lib/arsc/item/ByteItem.java rename to src/main/java/com/reandroid/arsc/item/ByteItem.java index 0775745..b29215d 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/ByteItem.java +++ b/src/main/java/com/reandroid/arsc/item/ByteItem.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; public class ByteItem extends BlockItem { diff --git a/src/main/java/com/reandroid/lib/arsc/item/FixedLengthString.java b/src/main/java/com/reandroid/arsc/item/FixedLengthString.java similarity index 96% rename from src/main/java/com/reandroid/lib/arsc/item/FixedLengthString.java rename to src/main/java/com/reandroid/arsc/item/FixedLengthString.java index 36a7f6c..172197d 100644 --- a/src/main/java/com/reandroid/lib/arsc/item/FixedLengthString.java +++ b/src/main/java/com/reandroid/arsc/item/FixedLengthString.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.reandroid.lib.arsc.item; + package com.reandroid.arsc.item; - import com.reandroid.lib.arsc.io.BlockReader; + import com.reandroid.arsc.io.BlockReader; import java.nio.charset.StandardCharsets; diff --git a/src/main/java/com/reandroid/lib/arsc/item/IntegerArray.java b/src/main/java/com/reandroid/arsc/item/IntegerArray.java similarity index 98% rename from src/main/java/com/reandroid/lib/arsc/item/IntegerArray.java rename to src/main/java/com/reandroid/arsc/item/IntegerArray.java index 6545e8f..62c1b22 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/IntegerArray.java +++ b/src/main/java/com/reandroid/arsc/item/IntegerArray.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; import java.util.AbstractList; diff --git a/src/main/java/com/reandroid/lib/arsc/item/IntegerItem.java b/src/main/java/com/reandroid/arsc/item/IntegerItem.java similarity index 73% rename from src/main/java/com/reandroid/lib/arsc/item/IntegerItem.java rename to src/main/java/com/reandroid/arsc/item/IntegerItem.java index b1aabf7..e812172 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/IntegerItem.java +++ b/src/main/java/com/reandroid/arsc/item/IntegerItem.java @@ -13,10 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; -public class IntegerItem extends BlockItem implements ReferenceItem{ + import com.reandroid.arsc.io.BlockReader; + + import java.io.IOException; + import java.io.InputStream; + + public class IntegerItem extends BlockItem implements ReferenceItem{ private int mCache; public IntegerItem(){ super(4); @@ -61,4 +66,14 @@ public class IntegerItem extends BlockItem implements ReferenceItem{ return String.valueOf(get()); } + public static int readInteger(BlockReader reader) throws IOException { + IntegerItem integerItem = new IntegerItem(); + integerItem.readBytes(reader); + return integerItem.get(); + } + public static int readInteger(InputStream inputStream) throws IOException { + IntegerItem integerItem = new IntegerItem(); + integerItem.readBytes(inputStream); + return integerItem.get(); + } } diff --git a/src/main/java/com/reandroid/lib/arsc/item/ReferenceItem.java b/src/main/java/com/reandroid/arsc/item/ReferenceItem.java similarity index 94% rename from src/main/java/com/reandroid/lib/arsc/item/ReferenceItem.java rename to src/main/java/com/reandroid/arsc/item/ReferenceItem.java index c96467b..f3b4051 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/ReferenceItem.java +++ b/src/main/java/com/reandroid/arsc/item/ReferenceItem.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; public interface ReferenceItem { void set(int val); diff --git a/src/main/java/com/reandroid/lib/arsc/item/ResXmlID.java b/src/main/java/com/reandroid/arsc/item/ResXmlID.java similarity index 87% rename from src/main/java/com/reandroid/lib/arsc/item/ResXmlID.java rename to src/main/java/com/reandroid/arsc/item/ResXmlID.java index 552a572..bb72f5e 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/ResXmlID.java +++ b/src/main/java/com/reandroid/arsc/item/ResXmlID.java @@ -13,13 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.chunk.xml.ResXmlBlock; -import com.reandroid.lib.arsc.pool.ResXmlStringPool; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.chunk.xml.ResXmlDocument; +import com.reandroid.arsc.pool.ResXmlStringPool; import java.util.ArrayList; import java.util.Collection; @@ -82,8 +80,8 @@ public class ResXmlID extends IntegerItem { private ResXmlStringPool getXmlStringPool(){ Block parent=this; while (parent!=null){ - if(parent instanceof ResXmlBlock){ - return ((ResXmlBlock)parent).getStringPool(); + if(parent instanceof ResXmlDocument){ + return ((ResXmlDocument)parent).getStringPool(); } parent=parent.getParent(); } diff --git a/src/main/java/com/reandroid/lib/arsc/item/ResXmlString.java b/src/main/java/com/reandroid/arsc/item/ResXmlString.java similarity index 96% rename from src/main/java/com/reandroid/lib/arsc/item/ResXmlString.java rename to src/main/java/com/reandroid/arsc/item/ResXmlString.java index 7e4132a..1135995 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/ResXmlString.java +++ b/src/main/java/com/reandroid/arsc/item/ResXmlString.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; import java.util.List; diff --git a/src/main/java/com/reandroid/lib/arsc/item/ShortItem.java b/src/main/java/com/reandroid/arsc/item/ShortItem.java similarity index 65% rename from src/main/java/com/reandroid/lib/arsc/item/ShortItem.java rename to src/main/java/com/reandroid/arsc/item/ShortItem.java index 0fc7e1d..b30d822 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/ShortItem.java +++ b/src/main/java/com/reandroid/arsc/item/ShortItem.java @@ -13,9 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; -public class ShortItem extends BlockItem { + import com.reandroid.arsc.io.BlockReader; + + import java.io.IOException; + import java.io.InputStream; + + public class ShortItem extends BlockItem { private short mCache; public ShortItem(){ @@ -56,4 +61,21 @@ public class ShortItem extends BlockItem { public String toString(){ return String.valueOf(get()); } + + public static short readShort(BlockReader reader) throws IOException { + ShortItem shortItem = new ShortItem(); + shortItem.readBytes(reader); + return shortItem.get(); + } + public static short readShort(InputStream inputStream) throws IOException { + ShortItem shortItem = new ShortItem(); + shortItem.readBytes(inputStream); + return shortItem.get(); + } + public static int readUnsignedShort(BlockReader reader) throws IOException { + return 0x0000ffff & readShort(reader); + } + public static int readUnsignedShort(InputStream inputStream) throws IOException { + return 0x0000ffff & readShort(inputStream); + } } diff --git a/src/main/java/com/reandroid/lib/arsc/item/SpecFlagsArray.java b/src/main/java/com/reandroid/arsc/item/SpecFlagsArray.java similarity index 90% rename from src/main/java/com/reandroid/lib/arsc/item/SpecFlagsArray.java rename to src/main/java/com/reandroid/arsc/item/SpecFlagsArray.java index 3d56031..2e33851 100644 --- a/src/main/java/com/reandroid/lib/arsc/item/SpecFlagsArray.java +++ b/src/main/java/com/reandroid/arsc/item/SpecFlagsArray.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.io.BlockLoad; -import com.reandroid.lib.arsc.io.BlockReader; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.io.BlockLoad; +import com.reandroid.arsc.io.BlockReader; import java.io.IOException; diff --git a/src/main/java/com/reandroid/lib/arsc/item/SpecString.java b/src/main/java/com/reandroid/arsc/item/SpecString.java similarity index 96% rename from src/main/java/com/reandroid/lib/arsc/item/SpecString.java rename to src/main/java/com/reandroid/arsc/item/SpecString.java index 5d885ce..d60fd3e 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/SpecString.java +++ b/src/main/java/com/reandroid/arsc/item/SpecString.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; import java.util.List; diff --git a/src/main/java/com/reandroid/lib/arsc/item/StringItem.java b/src/main/java/com/reandroid/arsc/item/StringItem.java similarity index 97% rename from src/main/java/com/reandroid/lib/arsc/item/StringItem.java rename to src/main/java/com/reandroid/arsc/item/StringItem.java index 1c74861..eb37dea 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/StringItem.java +++ b/src/main/java/com/reandroid/arsc/item/StringItem.java @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.pool.BaseStringPool; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.pool.BaseStringPool; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONObject; import java.io.IOException; diff --git a/src/main/java/com/reandroid/lib/arsc/item/StyleItem.java b/src/main/java/com/reandroid/arsc/item/StyleItem.java similarity index 97% rename from src/main/java/com/reandroid/lib/arsc/item/StyleItem.java rename to src/main/java/com/reandroid/arsc/item/StyleItem.java index bad1f76..77890e0 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/StyleItem.java +++ b/src/main/java/com/reandroid/arsc/item/StyleItem.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.model.StyleSpanInfo; -import com.reandroid.lib.arsc.pool.BaseStringPool; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.model.StyleSpanInfo; +import com.reandroid.arsc.pool.BaseStringPool; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONObject; import java.io.IOException; import java.util.AbstractList; diff --git a/src/main/java/com/reandroid/lib/arsc/item/TableString.java b/src/main/java/com/reandroid/arsc/item/TableString.java similarity index 91% rename from src/main/java/com/reandroid/lib/arsc/item/TableString.java rename to src/main/java/com/reandroid/arsc/item/TableString.java index 50ddbdf..931a091 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/TableString.java +++ b/src/main/java/com/reandroid/arsc/item/TableString.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResValueReference; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResValueReference; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/reandroid/lib/arsc/item/TypeString.java b/src/main/java/com/reandroid/arsc/item/TypeString.java similarity index 91% rename from src/main/java/com/reandroid/lib/arsc/item/TypeString.java rename to src/main/java/com/reandroid/arsc/item/TypeString.java index 81f261a..1c997fb 100755 --- a/src/main/java/com/reandroid/lib/arsc/item/TypeString.java +++ b/src/main/java/com/reandroid/arsc/item/TypeString.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.item; +package com.reandroid.arsc.item; - import com.reandroid.lib.arsc.base.Block; - import com.reandroid.lib.arsc.pool.TypeStringPool; + import com.reandroid.arsc.base.Block; + import com.reandroid.arsc.pool.TypeStringPool; public class TypeString extends StringItem { public TypeString(boolean utf8) { diff --git a/src/main/java/com/reandroid/lib/arsc/model/StyleSpanInfo.java b/src/main/java/com/reandroid/arsc/model/StyleSpanInfo.java similarity index 96% rename from src/main/java/com/reandroid/lib/arsc/model/StyleSpanInfo.java rename to src/main/java/com/reandroid/arsc/model/StyleSpanInfo.java index 4e4a9d3..3be2d09 100755 --- a/src/main/java/com/reandroid/lib/arsc/model/StyleSpanInfo.java +++ b/src/main/java/com/reandroid/arsc/model/StyleSpanInfo.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.model; +package com.reandroid.arsc.model; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONObject; public class StyleSpanInfo implements JSONConvert { private String mTag; diff --git a/src/main/java/com/reandroid/lib/arsc/pool/BaseStringPool.java b/src/main/java/com/reandroid/arsc/pool/BaseStringPool.java similarity index 93% rename from src/main/java/com/reandroid/lib/arsc/pool/BaseStringPool.java rename to src/main/java/com/reandroid/arsc/pool/BaseStringPool.java index 4674463..66dc9aa 100755 --- a/src/main/java/com/reandroid/lib/arsc/pool/BaseStringPool.java +++ b/src/main/java/com/reandroid/arsc/pool/BaseStringPool.java @@ -13,25 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.pool; +package com.reandroid.arsc.pool; - import com.reandroid.lib.arsc.array.StringArray; - import com.reandroid.lib.arsc.array.StyleArray; - import com.reandroid.lib.arsc.base.Block; - import com.reandroid.lib.arsc.chunk.BaseChunk; - import com.reandroid.lib.arsc.group.StringGroup; - import com.reandroid.lib.arsc.header.StringPoolHeader; - import com.reandroid.lib.arsc.io.BlockLoad; - import com.reandroid.lib.arsc.io.BlockReader; - import com.reandroid.lib.arsc.item.*; - import com.reandroid.lib.json.JSONArray; - import com.reandroid.lib.json.JSONConvert; + import com.reandroid.arsc.array.StringArray; + import com.reandroid.arsc.array.StyleArray; + import com.reandroid.arsc.base.Block; + import com.reandroid.arsc.chunk.Chunk; + import com.reandroid.arsc.group.StringGroup; + import com.reandroid.arsc.header.StringPoolHeader; + import com.reandroid.arsc.io.BlockLoad; + import com.reandroid.arsc.io.BlockReader; + import com.reandroid.arsc.item.*; + import com.reandroid.json.JSONArray; + import com.reandroid.json.JSONConvert; import java.io.IOException; import java.util.*; - public abstract class BaseStringPool extends BaseChunk implements BlockLoad, JSONConvert, Comparator { + public abstract class BaseStringPool extends Chunk implements BlockLoad, JSONConvert, Comparator { private final StringArray mArrayStrings; private final StyleArray mArrayStyles; diff --git a/src/main/java/com/reandroid/lib/arsc/pool/JsonStringPoolHelper.java b/src/main/java/com/reandroid/arsc/pool/JsonStringPoolHelper.java similarity index 92% rename from src/main/java/com/reandroid/lib/arsc/pool/JsonStringPoolHelper.java rename to src/main/java/com/reandroid/arsc/pool/JsonStringPoolHelper.java index dcd2607..bb5c01b 100644 --- a/src/main/java/com/reandroid/lib/arsc/pool/JsonStringPoolHelper.java +++ b/src/main/java/com/reandroid/arsc/pool/JsonStringPoolHelper.java @@ -1,12 +1,12 @@ -package com.reandroid.lib.arsc.pool; +package com.reandroid.arsc.pool; -import com.reandroid.lib.arsc.array.StringArray; -import com.reandroid.lib.arsc.array.StyleArray; -import com.reandroid.lib.arsc.item.StringItem; -import com.reandroid.lib.arsc.item.StyleItem; -import com.reandroid.lib.arsc.model.StyleSpanInfo; -import com.reandroid.lib.json.JSONArray; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.array.StringArray; +import com.reandroid.arsc.array.StyleArray; +import com.reandroid.arsc.item.StringItem; +import com.reandroid.arsc.item.StyleItem; +import com.reandroid.arsc.model.StyleSpanInfo; +import com.reandroid.json.JSONArray; +import com.reandroid.json.JSONObject; import java.util.*; diff --git a/src/main/java/com/reandroid/lib/arsc/pool/ResXmlStringPool.java b/src/main/java/com/reandroid/arsc/pool/ResXmlStringPool.java similarity index 86% rename from src/main/java/com/reandroid/lib/arsc/pool/ResXmlStringPool.java rename to src/main/java/com/reandroid/arsc/pool/ResXmlStringPool.java index f2e5cf2..60dd99b 100755 --- a/src/main/java/com/reandroid/lib/arsc/pool/ResXmlStringPool.java +++ b/src/main/java/com/reandroid/arsc/pool/ResXmlStringPool.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.pool; +package com.reandroid.arsc.pool; -import com.reandroid.lib.arsc.array.StringArray; -import com.reandroid.lib.arsc.array.ResXmlStringArray; -import com.reandroid.lib.arsc.array.StyleArray; -import com.reandroid.lib.arsc.group.StringGroup; -import com.reandroid.lib.arsc.item.IntegerArray; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.ResXmlString; +import com.reandroid.arsc.array.StringArray; +import com.reandroid.arsc.array.ResXmlStringArray; +import com.reandroid.arsc.array.StyleArray; +import com.reandroid.arsc.group.StringGroup; +import com.reandroid.arsc.item.IntegerArray; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.ResXmlString; public class ResXmlStringPool extends BaseStringPool { public ResXmlStringPool(boolean is_utf8) { diff --git a/src/main/java/com/reandroid/lib/arsc/pool/SpecStringPool.java b/src/main/java/com/reandroid/arsc/pool/SpecStringPool.java similarity index 77% rename from src/main/java/com/reandroid/lib/arsc/pool/SpecStringPool.java rename to src/main/java/com/reandroid/arsc/pool/SpecStringPool.java index 1d77aca..887961a 100755 --- a/src/main/java/com/reandroid/lib/arsc/pool/SpecStringPool.java +++ b/src/main/java/com/reandroid/arsc/pool/SpecStringPool.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.pool; +package com.reandroid.arsc.pool; -import com.reandroid.lib.arsc.array.SpecStringArray; -import com.reandroid.lib.arsc.array.StringArray; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.item.IntegerArray; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.SpecString; +import com.reandroid.arsc.array.SpecStringArray; +import com.reandroid.arsc.array.StringArray; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.item.IntegerArray; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.SpecString; public class SpecStringPool extends BaseStringPool { public SpecStringPool(boolean is_utf8){ diff --git a/src/main/java/com/reandroid/lib/arsc/pool/TableStringPool.java b/src/main/java/com/reandroid/arsc/pool/TableStringPool.java similarity index 83% rename from src/main/java/com/reandroid/lib/arsc/pool/TableStringPool.java rename to src/main/java/com/reandroid/arsc/pool/TableStringPool.java index 06b957e..0002ac6 100755 --- a/src/main/java/com/reandroid/lib/arsc/pool/TableStringPool.java +++ b/src/main/java/com/reandroid/arsc/pool/TableStringPool.java @@ -13,18 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.pool; +package com.reandroid.arsc.pool; -import com.reandroid.lib.arsc.array.StringArray; -import com.reandroid.lib.arsc.array.TableStringArray; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.chunk.UnknownChunk; -import com.reandroid.lib.arsc.header.HeaderBlock; -import com.reandroid.lib.arsc.header.StringPoolHeader; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.IntegerArray; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.TableString; +import com.reandroid.arsc.array.StringArray; +import com.reandroid.arsc.array.TableStringArray; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.chunk.UnknownChunk; +import com.reandroid.arsc.header.HeaderBlock; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.item.IntegerArray; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.TableString; import java.io.IOException; import java.io.InputStream; diff --git a/src/main/java/com/reandroid/lib/arsc/pool/TypeStringPool.java b/src/main/java/com/reandroid/arsc/pool/TypeStringPool.java similarity index 87% rename from src/main/java/com/reandroid/lib/arsc/pool/TypeStringPool.java rename to src/main/java/com/reandroid/arsc/pool/TypeStringPool.java index cd97a9c..ce10fb5 100755 --- a/src/main/java/com/reandroid/lib/arsc/pool/TypeStringPool.java +++ b/src/main/java/com/reandroid/arsc/pool/TypeStringPool.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.pool; +package com.reandroid.arsc.pool; -import com.reandroid.lib.arsc.array.StringArray; -import com.reandroid.lib.arsc.array.TypeStringArray; -import com.reandroid.lib.arsc.chunk.TypeBlock; -import com.reandroid.lib.arsc.group.StringGroup; -import com.reandroid.lib.arsc.item.IntegerArray; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.TypeString; +import com.reandroid.arsc.array.StringArray; +import com.reandroid.arsc.array.TypeStringArray; +import com.reandroid.arsc.chunk.TypeBlock; +import com.reandroid.arsc.group.StringGroup; +import com.reandroid.arsc.item.IntegerArray; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.TypeString; public class TypeStringPool extends BaseStringPool { private final IntegerItem mTypeIdOffset; diff --git a/src/main/java/com/reandroid/lib/arsc/pool/builder/StringPoolMerger.java b/src/main/java/com/reandroid/arsc/pool/builder/StringPoolMerger.java similarity index 94% rename from src/main/java/com/reandroid/lib/arsc/pool/builder/StringPoolMerger.java rename to src/main/java/com/reandroid/arsc/pool/builder/StringPoolMerger.java index 0467622..3e21ce9 100644 --- a/src/main/java/com/reandroid/lib/arsc/pool/builder/StringPoolMerger.java +++ b/src/main/java/com/reandroid/arsc/pool/builder/StringPoolMerger.java @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.pool.builder; +package com.reandroid.arsc.pool.builder; -import com.reandroid.lib.arsc.array.StringArray; -import com.reandroid.lib.arsc.array.StyleArray; -import com.reandroid.lib.arsc.item.StyleItem; -import com.reandroid.lib.arsc.item.TableString; -import com.reandroid.lib.arsc.model.StyleSpanInfo; -import com.reandroid.lib.arsc.pool.TableStringPool; +import com.reandroid.arsc.array.StringArray; +import com.reandroid.arsc.array.StyleArray; +import com.reandroid.arsc.item.StyleItem; +import com.reandroid.arsc.item.TableString; +import com.reandroid.arsc.model.StyleSpanInfo; +import com.reandroid.arsc.pool.TableStringPool; import java.util.*; diff --git a/src/main/java/com/reandroid/lib/arsc/pool/builder/StyleBuilder.java b/src/main/java/com/reandroid/arsc/pool/builder/StyleBuilder.java similarity index 93% rename from src/main/java/com/reandroid/lib/arsc/pool/builder/StyleBuilder.java rename to src/main/java/com/reandroid/arsc/pool/builder/StyleBuilder.java index 471950e..e41e1ef 100755 --- a/src/main/java/com/reandroid/lib/arsc/pool/builder/StyleBuilder.java +++ b/src/main/java/com/reandroid/arsc/pool/builder/StyleBuilder.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.pool.builder; +package com.reandroid.arsc.pool.builder; -import com.reandroid.lib.arsc.item.StringItem; +import com.reandroid.arsc.item.StringItem; import java.util.regex.Pattern; diff --git a/src/main/java/com/reandroid/lib/arsc/util/FrameworkTable.java b/src/main/java/com/reandroid/arsc/util/FrameworkTable.java similarity index 94% rename from src/main/java/com/reandroid/lib/arsc/util/FrameworkTable.java rename to src/main/java/com/reandroid/arsc/util/FrameworkTable.java index 4cf6833..79981ec 100755 --- a/src/main/java/com/reandroid/lib/arsc/util/FrameworkTable.java +++ b/src/main/java/com/reandroid/arsc/util/FrameworkTable.java @@ -13,23 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.util; +package com.reandroid.arsc.util; -import com.reandroid.lib.arsc.array.SpecTypePairArray; -import com.reandroid.lib.arsc.array.TypeBlockArray; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.chunk.TypeBlock; -import com.reandroid.lib.arsc.container.SpecTypePair; -import com.reandroid.lib.arsc.group.EntryGroup; -import com.reandroid.lib.arsc.header.HeaderBlock; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.ReferenceItem; -import com.reandroid.lib.arsc.item.TableString; -import com.reandroid.lib.arsc.pool.TableStringPool; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResConfig; +import com.reandroid.arsc.array.SpecTypePairArray; +import com.reandroid.arsc.array.TypeBlockArray; +import com.reandroid.arsc.chunk.ChunkType; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.chunk.TypeBlock; +import com.reandroid.arsc.container.SpecTypePair; +import com.reandroid.arsc.group.EntryGroup; +import com.reandroid.arsc.header.HeaderBlock; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.item.ReferenceItem; +import com.reandroid.arsc.item.TableString; +import com.reandroid.arsc.pool.TableStringPool; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResConfig; import java.io.*; import java.util.*; diff --git a/src/main/java/com/reandroid/lib/arsc/util/HexBytesWriter.java b/src/main/java/com/reandroid/arsc/util/HexBytesWriter.java similarity index 61% rename from src/main/java/com/reandroid/lib/arsc/util/HexBytesWriter.java rename to src/main/java/com/reandroid/arsc/util/HexBytesWriter.java index 2511d46..7aff2aa 100644 --- a/src/main/java/com/reandroid/lib/arsc/util/HexBytesWriter.java +++ b/src/main/java/com/reandroid/arsc/util/HexBytesWriter.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.util; +package com.reandroid.arsc.util; import java.io.IOException; import java.io.StringWriter; @@ -24,6 +24,8 @@ public class HexBytesWriter { private final int width; private final int columns; private final int indent; + private boolean mAppendString = true; + private String mEncoding; public HexBytesWriter(byte[] byteArray, int width, int columns, int indent){ this.byteArray = byteArray; this.width = (width <= 0) ? DEFAULT_WIDTH : width; @@ -36,6 +38,23 @@ public class HexBytesWriter { public HexBytesWriter(byte[] byteArray){ this(byteArray, DEFAULT_WIDTH, DEFAULT_COLUMNS, DEFAULT_INDENT); } + + public void setAppendString(boolean appendString) { + this.mAppendString = appendString; + } + public void setEncoding(String encoding){ + if(!"UTF-16".equals(encoding)){ + encoding = "UTF-8"; + } + this.mEncoding = encoding; + } + private String getEncoding(){ + if(mEncoding==null){ + mEncoding="UTF-8"; + } + return mEncoding; + } + public void write(Writer writer) throws IOException{ if(byteArray==null){ return; @@ -54,6 +73,7 @@ public class HexBytesWriter { for(int i=0; i < length; i++){ if((i%width)==0){ if(i!=0){ + writeString(writer, x, i); writeNewLine(writer); newLineAppended=true; } @@ -69,11 +89,65 @@ public class HexBytesWriter { newLineAppended=false; writeHex(writer, byteArray[offset+i]); } + if(x>1){ + writeString(writer,x , length); + } } private void writeHex(Writer writer, byte b) throws IOException { String hex = String.format("%02x", (0xff & b)).toUpperCase(); writer.write(hex); } + private void writeString(Writer writer, int width, int position) throws IOException { + if(!mAppendString){ + return; + } + int start = position - width; + if(start<0){ + start=0; + } + int rem = this.width - width; + if(rem > 0){ + fillLastRow(writer, position); + } + writer.write(' '); + writer.write(' '); + writer.write(' '); + writer.write(' '); + String text = new String(this.byteArray, start, width, getEncoding()); + for(char ch:text.toCharArray()){ + printChar(writer, ch); + } + } + private void fillLastRow(Writer writer, int position) throws IOException { + int rem = width - position % width; + for(int i=0; i { BaseResValue(int bytesLength){ diff --git a/src/main/java/com/reandroid/lib/arsc/value/BaseResValueItem.java b/src/main/java/com/reandroid/arsc/value/BaseResValueItem.java similarity index 89% rename from src/main/java/com/reandroid/lib/arsc/value/BaseResValueItem.java rename to src/main/java/com/reandroid/arsc/value/BaseResValueItem.java index ae4d3e9..914d1b3 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/BaseResValueItem.java +++ b/src/main/java/com/reandroid/arsc/value/BaseResValueItem.java @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value; +package com.reandroid.arsc.value; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.item.ReferenceItem; -import com.reandroid.lib.arsc.item.TableString; -import com.reandroid.lib.arsc.pool.TableStringPool; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.item.ReferenceItem; +import com.reandroid.arsc.item.TableString; +import com.reandroid.arsc.pool.TableStringPool; public abstract class BaseResValueItem extends BaseResValue implements ResValueItem { @@ -84,12 +84,12 @@ public abstract class BaseResValueItem extends BaseResValue implements ResValueI mReferenceItem=null; return entryBlock.removeTableReference(ref); } - + @Override public ValueType getValueType(){ return ValueType.valueOf(getType()); } @Override - public void setType(ValueType valueType){ + public void setValueType(ValueType valueType){ byte type=0; if(valueType!=null){ type=valueType.getByte(); diff --git a/src/main/java/com/reandroid/lib/arsc/value/EntryBlock.java b/src/main/java/com/reandroid/arsc/value/EntryBlock.java similarity index 96% rename from src/main/java/com/reandroid/lib/arsc/value/EntryBlock.java rename to src/main/java/com/reandroid/arsc/value/EntryBlock.java index bbce731..5363134 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/EntryBlock.java +++ b/src/main/java/com/reandroid/arsc/value/EntryBlock.java @@ -13,20 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value; +package com.reandroid.arsc.value; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.base.BlockCounter; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.chunk.TypeBlock; -import com.reandroid.lib.arsc.group.EntryGroup; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.*; -import com.reandroid.lib.arsc.pool.SpecStringPool; -import com.reandroid.lib.arsc.pool.TableStringPool; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.base.BlockCounter; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.chunk.TypeBlock; +import com.reandroid.arsc.group.EntryGroup; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.item.*; +import com.reandroid.arsc.pool.SpecStringPool; +import com.reandroid.arsc.pool.TableStringPool; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONObject; import java.io.IOException; @@ -52,7 +52,7 @@ public class EntryBlock extends Block implements JSONConvert { resValueInt=new ResValueInt(); setResValue(resValueInt); } - resValueInt.setType(valueType); + resValueInt.setValueType(valueType); resValueInt.setData(rawValue); return resValueInt; } @@ -65,7 +65,7 @@ public class EntryBlock extends Block implements JSONConvert { resValueInt=new ResValueInt(); setResValue(resValueInt); } - resValueInt.setType(ValueType.INT_BOOLEAN); + resValueInt.setValueType(ValueType.INT_BOOLEAN); resValueInt.setData(val?0xffffffff:0); return resValueInt; } @@ -78,7 +78,7 @@ public class EntryBlock extends Block implements JSONConvert { resValueInt=new ResValueInt(); setResValue(resValueInt); } - resValueInt.setType(ValueType.INT_DEC); + resValueInt.setValueType(ValueType.INT_DEC); resValueInt.setData(val); return resValueInt; } @@ -91,7 +91,7 @@ public class EntryBlock extends Block implements JSONConvert { resValueInt=new ResValueInt(); setResValue(resValueInt); } - resValueInt.setType(ValueType.REFERENCE); + resValueInt.setValueType(ValueType.REFERENCE); resValueInt.setData(resId); return resValueInt; } @@ -109,7 +109,7 @@ public class EntryBlock extends Block implements JSONConvert { resValueInt=new ResValueInt(); setResValue(resValueInt); } - resValueInt.setType(ValueType.STRING); + resValueInt.setValueType(ValueType.STRING); resValueInt.setData(tableString.getIndex()); return resValueInt; } diff --git a/src/main/java/com/reandroid/lib/arsc/value/LibraryInfo.java b/src/main/java/com/reandroid/arsc/value/LibraryInfo.java similarity index 91% rename from src/main/java/com/reandroid/lib/arsc/value/LibraryInfo.java rename to src/main/java/com/reandroid/arsc/value/LibraryInfo.java index f2f9813..4089ebc 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/LibraryInfo.java +++ b/src/main/java/com/reandroid/arsc/value/LibraryInfo.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value; +package com.reandroid.arsc.value; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.base.BlockCounter; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.FixedLengthString; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.base.BlockCounter; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.item.FixedLengthString; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONObject; import java.io.IOException; import java.io.OutputStream; diff --git a/src/main/java/com/reandroid/lib/arsc/value/ResConfig.java b/src/main/java/com/reandroid/arsc/value/ResConfig.java similarity index 98% rename from src/main/java/com/reandroid/lib/arsc/value/ResConfig.java rename to src/main/java/com/reandroid/arsc/value/ResConfig.java index 4e7e91c..12cc580 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/ResConfig.java +++ b/src/main/java/com/reandroid/arsc/value/ResConfig.java @@ -13,16 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value; +package com.reandroid.arsc.value; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.container.FixedBlockContainer; -import com.reandroid.lib.arsc.io.BlockLoad; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.ByteArray; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.container.FixedBlockContainer; +import com.reandroid.arsc.io.BlockLoad; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.item.ByteArray; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONObject; import java.io.IOException; import java.util.Arrays; diff --git a/src/main/java/com/reandroid/lib/arsc/value/ResConfigHelper.java b/src/main/java/com/reandroid/arsc/value/ResConfigHelper.java similarity index 99% rename from src/main/java/com/reandroid/lib/arsc/value/ResConfigHelper.java rename to src/main/java/com/reandroid/arsc/value/ResConfigHelper.java index 0ae608f..f70ebb7 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/ResConfigHelper.java +++ b/src/main/java/com/reandroid/arsc/value/ResConfigHelper.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value; +package com.reandroid.arsc.value; import java.util.*; import java.util.regex.Matcher; diff --git a/src/main/java/com/reandroid/lib/arsc/value/ResValueBag.java b/src/main/java/com/reandroid/arsc/value/ResValueBag.java similarity index 93% rename from src/main/java/com/reandroid/lib/arsc/value/ResValueBag.java rename to src/main/java/com/reandroid/arsc/value/ResValueBag.java index f1e2331..c3798ba 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/ResValueBag.java +++ b/src/main/java/com/reandroid/arsc/value/ResValueBag.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value; +package com.reandroid.arsc.value; -import com.reandroid.lib.arsc.array.ResValueBagItemArray; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.base.BlockCounter; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.ReferenceItem; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.array.ResValueBagItemArray; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.base.BlockCounter; +import com.reandroid.arsc.io.BlockReader; +import com.reandroid.arsc.item.IntegerItem; +import com.reandroid.arsc.item.ReferenceItem; +import com.reandroid.json.JSONObject; import java.io.IOException; import java.io.OutputStream; diff --git a/src/main/java/com/reandroid/lib/arsc/value/ResValueBagItem.java b/src/main/java/com/reandroid/arsc/value/ResValueBagItem.java similarity index 92% rename from src/main/java/com/reandroid/lib/arsc/value/ResValueBagItem.java rename to src/main/java/com/reandroid/arsc/value/ResValueBagItem.java index 7c4325a..425fd3e 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/ResValueBagItem.java +++ b/src/main/java/com/reandroid/arsc/value/ResValueBagItem.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value; +package com.reandroid.arsc.value; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.item.ReferenceItem; -import com.reandroid.lib.arsc.item.TableString; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.base.Block; +import com.reandroid.arsc.item.ReferenceItem; +import com.reandroid.arsc.item.TableString; +import com.reandroid.json.JSONObject; public class ResValueBagItem extends BaseResValueItem{ @@ -34,7 +34,7 @@ public class ResValueBagItem extends BaseResValueItem{ return getTableString(getData()).getHtml(); } public void setValueAsString(String str){ - setType(ValueType.STRING); + this.setValueType(ValueType.STRING); TableString tableString=getTableStringPool().getOrCreate(str); setData(tableString.getIndex()); } @@ -42,7 +42,7 @@ public class ResValueBagItem extends BaseResValueItem{ return getData()!=0; } public void setValueAsBoolean(boolean val){ - setType(ValueType.INT_BOOLEAN); + this.setValueType(ValueType.INT_BOOLEAN); int data=val?0xffffffff:0; setData(data); } @@ -83,18 +83,10 @@ public class ResValueBagItem extends BaseResValueItem{ } public void setTypeAndData(ValueType valueType, int data){ - setType(valueType); + this.setValueType(valueType); setData(data); } @Override - public void setType(ValueType valueType){ - byte type=0; - if(valueType!=null){ - type=valueType.getByte(); - } - setType(type); - } - @Override public void setType(byte type){ byte old=getType(); if(type==old){ @@ -201,7 +193,7 @@ public class ResValueBagItem extends BaseResValueItem{ @Override public void fromJson(JSONObject json) { ValueType valueType=ValueType.fromName(json.getString(NAME_value_type)); - setType(valueType); + this.setValueType(valueType); setId(json.getInt(NAME_id)); if(valueType==ValueType.STRING){ setValueAsString(json.optString(NAME_data, "")); @@ -220,7 +212,7 @@ public class ResValueBagItem extends BaseResValueItem{ if(valueType==ValueType.STRING){ setValueAsString(bagItem.getValueAsString()); }else { - setType(valueType); + this.setValueType(valueType); setData(bagItem.getData()); } } diff --git a/src/main/java/com/reandroid/lib/arsc/value/ResValueInt.java b/src/main/java/com/reandroid/arsc/value/ResValueInt.java similarity index 93% rename from src/main/java/com/reandroid/lib/arsc/value/ResValueInt.java rename to src/main/java/com/reandroid/arsc/value/ResValueInt.java index 616e7b2..0925d64 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/ResValueInt.java +++ b/src/main/java/com/reandroid/arsc/value/ResValueInt.java @@ -13,12 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value; +package com.reandroid.arsc.value; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.item.SpecString; -import com.reandroid.lib.arsc.item.TableString; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.item.TableString; +import com.reandroid.json.JSONObject; public class ResValueInt extends BaseResValueItem { public ResValueInt() { @@ -32,12 +31,12 @@ public class ResValueInt extends BaseResValueItem { return getString(getData()); } public void setValueAsString(String str){ - setType(ValueType.STRING); + setValueType(ValueType.STRING); TableString tableString=getTableStringPool().getOrCreate(str); setData(tableString.getIndex()); } public void setValueAsBoolean(boolean val){ - setType(ValueType.INT_BOOLEAN); + setValueType(ValueType.INT_BOOLEAN); int data=val?0xffffffff:0; setData(data); } @@ -131,7 +130,7 @@ public class ResValueInt extends BaseResValueItem { }else if(valueType==ValueType.INT_BOOLEAN){ setValueAsBoolean(json.getBoolean(NAME_data)); }else { - setType(valueType); + setValueType(valueType); setData(json.getInt(NAME_data)); } } @@ -143,7 +142,7 @@ public class ResValueInt extends BaseResValueItem { if(valueType==ValueType.STRING){ setValueAsString(resValueInt.getValueAsString()); }else { - setType(valueType); + setValueType(valueType); setData(resValueInt.getData()); } } diff --git a/src/main/java/com/reandroid/lib/arsc/value/ResValueItem.java b/src/main/java/com/reandroid/arsc/value/ResValueItem.java similarity index 84% rename from src/main/java/com/reandroid/lib/arsc/value/ResValueItem.java rename to src/main/java/com/reandroid/arsc/value/ResValueItem.java index 6239448..032b28d 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/ResValueItem.java +++ b/src/main/java/com/reandroid/arsc/value/ResValueItem.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value; +package com.reandroid.arsc.value; -public interface ResValueItem { +public interface ResValueItem extends Value{ void setHeaderSize(short size); short getHeaderSize(); @@ -23,10 +23,7 @@ public interface ResValueItem { byte getReserved(); void setType(byte type); - void setType(ValueType valueType); byte getType(); - int getData(); - void setData(int data); void onSetReference(int data); } diff --git a/src/main/java/com/reandroid/lib/arsc/value/ResValueReference.java b/src/main/java/com/reandroid/arsc/value/ResValueReference.java similarity index 94% rename from src/main/java/com/reandroid/lib/arsc/value/ResValueReference.java rename to src/main/java/com/reandroid/arsc/value/ResValueReference.java index a045594..bf8376d 100644 --- a/src/main/java/com/reandroid/lib/arsc/value/ResValueReference.java +++ b/src/main/java/com/reandroid/arsc/value/ResValueReference.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value; +package com.reandroid.arsc.value; -import com.reandroid.lib.arsc.item.ReferenceItem; +import com.reandroid.arsc.item.ReferenceItem; import java.util.Objects; diff --git a/src/main/java/com/reandroid/lib/arsc/value/StagedAliasEntry.java b/src/main/java/com/reandroid/arsc/value/StagedAliasEntry.java similarity index 88% rename from src/main/java/com/reandroid/lib/arsc/value/StagedAliasEntry.java rename to src/main/java/com/reandroid/arsc/value/StagedAliasEntry.java index 53ad8f9..55eeca5 100644 --- a/src/main/java/com/reandroid/lib/arsc/value/StagedAliasEntry.java +++ b/src/main/java/com/reandroid/arsc/value/StagedAliasEntry.java @@ -1,8 +1,8 @@ -package com.reandroid.lib.arsc.value; +package com.reandroid.arsc.value; -import com.reandroid.lib.arsc.item.ByteArray; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONObject; +import com.reandroid.arsc.item.ByteArray; +import com.reandroid.json.JSONConvert; +import com.reandroid.json.JSONObject; public class StagedAliasEntry extends ByteArray implements JSONConvert { public StagedAliasEntry(){ diff --git a/src/main/java/com/reandroid/arsc/value/Value.java b/src/main/java/com/reandroid/arsc/value/Value.java new file mode 100644 index 0000000..1bc3293 --- /dev/null +++ b/src/main/java/com/reandroid/arsc/value/Value.java @@ -0,0 +1,23 @@ + /* + * Copyright (C) 2022 github.com/REAndroid + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.reandroid.arsc.value; + + public interface Value { + void setValueType(ValueType valueType); + ValueType getValueType(); + int getData(); + void setData(int data); + } diff --git a/src/main/java/com/reandroid/lib/arsc/value/ValueType.java b/src/main/java/com/reandroid/arsc/value/ValueType.java similarity index 97% rename from src/main/java/com/reandroid/lib/arsc/value/ValueType.java rename to src/main/java/com/reandroid/arsc/value/ValueType.java index ff25f27..7d009db 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/ValueType.java +++ b/src/main/java/com/reandroid/arsc/value/ValueType.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value; +package com.reandroid.arsc.value; public enum ValueType { diff --git a/src/main/java/com/reandroid/lib/arsc/value/array/ArrayBag.java b/src/main/java/com/reandroid/arsc/value/array/ArrayBag.java similarity index 94% rename from src/main/java/com/reandroid/lib/arsc/value/array/ArrayBag.java rename to src/main/java/com/reandroid/arsc/value/array/ArrayBag.java index bb3340c..4fd6fff 100644 --- a/src/main/java/com/reandroid/lib/arsc/value/array/ArrayBag.java +++ b/src/main/java/com/reandroid/arsc/value/array/ArrayBag.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value.array; +package com.reandroid.arsc.value.array; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResValueBag; -import com.reandroid.lib.arsc.value.ResValueBagItem; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResValueBag; +import com.reandroid.arsc.value.ResValueBagItem; public class ArrayBag { private final ArrayBagItem[] mBagItems; diff --git a/src/main/java/com/reandroid/lib/arsc/value/array/ArrayBagItem.java b/src/main/java/com/reandroid/arsc/value/array/ArrayBagItem.java similarity index 82% rename from src/main/java/com/reandroid/lib/arsc/value/array/ArrayBagItem.java rename to src/main/java/com/reandroid/arsc/value/array/ArrayBagItem.java index af97bb5..3c7697c 100644 --- a/src/main/java/com/reandroid/lib/arsc/value/array/ArrayBagItem.java +++ b/src/main/java/com/reandroid/arsc/value/array/ArrayBagItem.java @@ -13,26 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value.array; +package com.reandroid.arsc.value.array; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.item.SpecString; -import com.reandroid.lib.arsc.item.TableString; -import com.reandroid.lib.arsc.pool.SpecStringPool; -import com.reandroid.lib.arsc.pool.TableStringPool; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResValueBagItem; -import com.reandroid.lib.arsc.value.ValueType; -import com.reandroid.lib.arsc.value.plurals.PluralsBagItem; -import com.reandroid.lib.arsc.value.plurals.PluralsQuantity; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.item.TableString; +import com.reandroid.arsc.pool.TableStringPool; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResValueBagItem; +import com.reandroid.arsc.value.ValueType; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; -public class ArrayBagItem { + public class ArrayBagItem { private final ResValueBagItem mBagItem; public ArrayBagItem(ResValueBagItem bagItem){ this.mBagItem=bagItem; diff --git a/src/main/java/com/reandroid/lib/arsc/value/attribute/AttributeBag.java b/src/main/java/com/reandroid/arsc/value/attribute/AttributeBag.java similarity index 96% rename from src/main/java/com/reandroid/lib/arsc/value/attribute/AttributeBag.java rename to src/main/java/com/reandroid/arsc/value/attribute/AttributeBag.java index 0980f2e..3af22f9 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/attribute/AttributeBag.java +++ b/src/main/java/com/reandroid/arsc/value/attribute/AttributeBag.java @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value.attribute; +package com.reandroid.arsc.value.attribute; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResValueBag; -import com.reandroid.lib.arsc.value.ValueType; -import com.reandroid.lib.common.EntryStore; +import com.reandroid.arsc.decoder.ValueDecoder; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResValueBag; +import com.reandroid.arsc.value.ValueType; +import com.reandroid.common.EntryStore; public class AttributeBag { diff --git a/src/main/java/com/reandroid/lib/arsc/value/attribute/AttributeBagItem.java b/src/main/java/com/reandroid/arsc/value/attribute/AttributeBagItem.java similarity index 95% rename from src/main/java/com/reandroid/lib/arsc/value/attribute/AttributeBagItem.java rename to src/main/java/com/reandroid/arsc/value/attribute/AttributeBagItem.java index 95d555a..7dd91bb 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/attribute/AttributeBagItem.java +++ b/src/main/java/com/reandroid/arsc/value/attribute/AttributeBagItem.java @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value.attribute; +package com.reandroid.arsc.value.attribute; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.group.EntryGroup; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResValueBagItem; -import com.reandroid.lib.common.EntryStore; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.group.EntryGroup; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResValueBagItem; +import com.reandroid.common.EntryStore; public class AttributeBagItem { diff --git a/src/main/java/com/reandroid/lib/arsc/value/attribute/AttributeItemType.java b/src/main/java/com/reandroid/arsc/value/attribute/AttributeItemType.java similarity index 97% rename from src/main/java/com/reandroid/lib/arsc/value/attribute/AttributeItemType.java rename to src/main/java/com/reandroid/arsc/value/attribute/AttributeItemType.java index 286176a..bbe97e0 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/attribute/AttributeItemType.java +++ b/src/main/java/com/reandroid/arsc/value/attribute/AttributeItemType.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value.attribute; +package com.reandroid.arsc.value.attribute; public enum AttributeItemType { FORMAT((short)0x0000), diff --git a/src/main/java/com/reandroid/lib/arsc/value/attribute/AttributeValueType.java b/src/main/java/com/reandroid/arsc/value/attribute/AttributeValueType.java similarity index 98% rename from src/main/java/com/reandroid/lib/arsc/value/attribute/AttributeValueType.java rename to src/main/java/com/reandroid/arsc/value/attribute/AttributeValueType.java index 2e82054..176f6b5 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/attribute/AttributeValueType.java +++ b/src/main/java/com/reandroid/arsc/value/attribute/AttributeValueType.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value.attribute; +package com.reandroid.arsc.value.attribute; -import com.reandroid.lib.arsc.value.ValueType; +import com.reandroid.arsc.value.ValueType; import java.util.*; diff --git a/src/main/java/com/reandroid/lib/arsc/value/plurals/PluralsBag.java b/src/main/java/com/reandroid/arsc/value/plurals/PluralsBag.java similarity index 95% rename from src/main/java/com/reandroid/lib/arsc/value/plurals/PluralsBag.java rename to src/main/java/com/reandroid/arsc/value/plurals/PluralsBag.java index c9a9026..4ee7666 100644 --- a/src/main/java/com/reandroid/lib/arsc/value/plurals/PluralsBag.java +++ b/src/main/java/com/reandroid/arsc/value/plurals/PluralsBag.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value.plurals; +package com.reandroid.arsc.value.plurals; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResValueBag; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResValueBag; public class PluralsBag { private final PluralsBagItem[] mBagItems; diff --git a/src/main/java/com/reandroid/lib/arsc/value/plurals/PluralsBagItem.java b/src/main/java/com/reandroid/arsc/value/plurals/PluralsBagItem.java similarity index 91% rename from src/main/java/com/reandroid/lib/arsc/value/plurals/PluralsBagItem.java rename to src/main/java/com/reandroid/arsc/value/plurals/PluralsBagItem.java index da2b843..654acfd 100644 --- a/src/main/java/com/reandroid/lib/arsc/value/plurals/PluralsBagItem.java +++ b/src/main/java/com/reandroid/arsc/value/plurals/PluralsBagItem.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value.plurals; +package com.reandroid.arsc.value.plurals; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.item.TableString; -import com.reandroid.lib.arsc.pool.TableStringPool; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResValueBagItem; -import com.reandroid.lib.arsc.value.ValueType; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.item.TableString; +import com.reandroid.arsc.pool.TableStringPool; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResValueBagItem; +import com.reandroid.arsc.value.ValueType; import java.util.ArrayList; import java.util.HashSet; diff --git a/src/main/java/com/reandroid/lib/arsc/value/plurals/PluralsQuantity.java b/src/main/java/com/reandroid/arsc/value/plurals/PluralsQuantity.java similarity index 97% rename from src/main/java/com/reandroid/lib/arsc/value/plurals/PluralsQuantity.java rename to src/main/java/com/reandroid/arsc/value/plurals/PluralsQuantity.java index fcc2898..ee0c92f 100755 --- a/src/main/java/com/reandroid/lib/arsc/value/plurals/PluralsQuantity.java +++ b/src/main/java/com/reandroid/arsc/value/plurals/PluralsQuantity.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value.plurals; +package com.reandroid.arsc.value.plurals; public enum PluralsQuantity { diff --git a/src/main/java/com/reandroid/lib/arsc/value/style/StyleBag.java b/src/main/java/com/reandroid/arsc/value/style/StyleBag.java similarity index 94% rename from src/main/java/com/reandroid/lib/arsc/value/style/StyleBag.java rename to src/main/java/com/reandroid/arsc/value/style/StyleBag.java index e76cea5..b0ad88e 100644 --- a/src/main/java/com/reandroid/lib/arsc/value/style/StyleBag.java +++ b/src/main/java/com/reandroid/arsc/value/style/StyleBag.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value.style; +package com.reandroid.arsc.value.style; -import com.reandroid.lib.arsc.item.SpecString; -import com.reandroid.lib.arsc.item.TypeString; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResValueBag; +import com.reandroid.arsc.item.SpecString; +import com.reandroid.arsc.item.TypeString; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResValueBag; public class StyleBag { private final StyleBagItem[] mBagItems; diff --git a/src/main/java/com/reandroid/lib/arsc/value/style/StyleBagItem.java b/src/main/java/com/reandroid/arsc/value/style/StyleBagItem.java similarity index 95% rename from src/main/java/com/reandroid/lib/arsc/value/style/StyleBagItem.java rename to src/main/java/com/reandroid/arsc/value/style/StyleBagItem.java index 14e3a95..999adbc 100644 --- a/src/main/java/com/reandroid/lib/arsc/value/style/StyleBagItem.java +++ b/src/main/java/com/reandroid/arsc/value/style/StyleBagItem.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.arsc.value.style; +package com.reandroid.arsc.value.style; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.ResValueBagItem; -import com.reandroid.lib.arsc.value.ValueType; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.ResValueBagItem; +import com.reandroid.arsc.value.ValueType; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/reandroid/lib/common/EntryStore.java b/src/main/java/com/reandroid/common/EntryStore.java similarity index 85% rename from src/main/java/com/reandroid/lib/common/EntryStore.java rename to src/main/java/com/reandroid/common/EntryStore.java index e118daa..99f83c2 100755 --- a/src/main/java/com/reandroid/lib/common/EntryStore.java +++ b/src/main/java/com/reandroid/common/EntryStore.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.common; +package com.reandroid.common; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.group.EntryGroup; -import com.reandroid.lib.arsc.item.TableString; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.group.EntryGroup; +import com.reandroid.arsc.item.TableString; import java.util.Collection; diff --git a/src/main/java/com/reandroid/lib/common/Frameworks.java b/src/main/java/com/reandroid/common/Frameworks.java similarity index 90% rename from src/main/java/com/reandroid/lib/common/Frameworks.java rename to src/main/java/com/reandroid/common/Frameworks.java index 79eed14..949d0ad 100755 --- a/src/main/java/com/reandroid/lib/common/Frameworks.java +++ b/src/main/java/com/reandroid/common/Frameworks.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.common; +package com.reandroid.common; -import com.reandroid.lib.arsc.util.FrameworkTable; +import com.reandroid.arsc.util.FrameworkTable; import java.io.IOException; import java.io.InputStream; @@ -37,7 +37,7 @@ public class Frameworks { return android_table; } private static FrameworkTable loadFramework(String name) throws IOException { - InputStream inputStream=Frameworks.class.getResourceAsStream(name); + InputStream inputStream= Frameworks.class.getResourceAsStream(name); if(inputStream==null){ return null; } diff --git a/src/main/java/com/reandroid/lib/common/ResourceResolver.java b/src/main/java/com/reandroid/common/ResourceResolver.java similarity index 95% rename from src/main/java/com/reandroid/lib/common/ResourceResolver.java rename to src/main/java/com/reandroid/common/ResourceResolver.java index fd8c7de..72c4a9b 100644 --- a/src/main/java/com/reandroid/lib/common/ResourceResolver.java +++ b/src/main/java/com/reandroid/common/ResourceResolver.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.common; +package com.reandroid.common; public interface ResourceResolver { int resolveResourceId(String packageName, String type, String name); diff --git a/src/main/java/com/reandroid/lib/common/TableEntryStore.java b/src/main/java/com/reandroid/common/TableEntryStore.java similarity index 94% rename from src/main/java/com/reandroid/lib/common/TableEntryStore.java rename to src/main/java/com/reandroid/common/TableEntryStore.java index e2d025e..34ce57f 100755 --- a/src/main/java/com/reandroid/lib/common/TableEntryStore.java +++ b/src/main/java/com/reandroid/common/TableEntryStore.java @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.common; +package com.reandroid.common; -import com.reandroid.lib.arsc.chunk.PackageBlock; -import com.reandroid.lib.arsc.chunk.TableBlock; -import com.reandroid.lib.arsc.group.EntryGroup; -import com.reandroid.lib.arsc.item.TableString; -import com.reandroid.lib.arsc.value.EntryBlock; -import com.reandroid.lib.arsc.value.StagedAliasEntry; +import com.reandroid.arsc.chunk.PackageBlock; +import com.reandroid.arsc.chunk.TableBlock; +import com.reandroid.arsc.group.EntryGroup; +import com.reandroid.arsc.item.TableString; +import com.reandroid.arsc.value.EntryBlock; +import com.reandroid.arsc.value.StagedAliasEntry; import java.util.*; diff --git a/src/main/java/com/reandroid/lib/json/CDL.java b/src/main/java/com/reandroid/json/CDL.java similarity index 99% rename from src/main/java/com/reandroid/lib/json/CDL.java rename to src/main/java/com/reandroid/json/CDL.java index c2ba348..ae47086 100644 --- a/src/main/java/com/reandroid/lib/json/CDL.java +++ b/src/main/java/com/reandroid/json/CDL.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; public class CDL { diff --git a/src/main/java/com/reandroid/lib/json/Cookie.java b/src/main/java/com/reandroid/json/Cookie.java similarity index 98% rename from src/main/java/com/reandroid/lib/json/Cookie.java rename to src/main/java/com/reandroid/json/Cookie.java index 996fc67..1443fac 100644 --- a/src/main/java/com/reandroid/lib/json/Cookie.java +++ b/src/main/java/com/reandroid/json/Cookie.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import java.util.Locale; @@ -27,7 +27,7 @@ public class Cookie { return sb.toString(); } public static JSONObject toJSONObject(String string) { - final JSONObject jo = new JSONObject(); + final JSONObject jo = new JSONObject(); String name; Object value; diff --git a/src/main/java/com/reandroid/lib/json/CookieList.java b/src/main/java/com/reandroid/json/CookieList.java similarity index 97% rename from src/main/java/com/reandroid/lib/json/CookieList.java rename to src/main/java/com/reandroid/json/CookieList.java index 9b7a02f..52a6339 100644 --- a/src/main/java/com/reandroid/lib/json/CookieList.java +++ b/src/main/java/com/reandroid/json/CookieList.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; public class CookieList { diff --git a/src/main/java/com/reandroid/lib/json/HTTP.java b/src/main/java/com/reandroid/json/HTTP.java similarity index 97% rename from src/main/java/com/reandroid/lib/json/HTTP.java rename to src/main/java/com/reandroid/json/HTTP.java index 906a624..10f5e42 100644 --- a/src/main/java/com/reandroid/lib/json/HTTP.java +++ b/src/main/java/com/reandroid/json/HTTP.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import java.util.Locale; @@ -13,7 +13,7 @@ public class HTTP { public static final String CRLF = "\r\n"; public static JSONObject toJSONObject(String string) throws JSONException { - JSONObject jo = new JSONObject(); + JSONObject jo = new JSONObject(); HTTPTokener x = new HTTPTokener(string); String token; diff --git a/src/main/java/com/reandroid/lib/json/HTTPTokener.java b/src/main/java/com/reandroid/json/HTTPTokener.java similarity index 97% rename from src/main/java/com/reandroid/lib/json/HTTPTokener.java rename to src/main/java/com/reandroid/json/HTTPTokener.java index 0ccd0f4..67f559d 100644 --- a/src/main/java/com/reandroid/lib/json/HTTPTokener.java +++ b/src/main/java/com/reandroid/json/HTTPTokener.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; public class HTTPTokener extends JSONTokener { diff --git a/src/main/java/com/reandroid/lib/json/JSONArray.java b/src/main/java/com/reandroid/json/JSONArray.java similarity index 99% rename from src/main/java/com/reandroid/lib/json/JSONArray.java rename to src/main/java/com/reandroid/json/JSONArray.java index 4bb9205..8e5dc4e 100644 --- a/src/main/java/com/reandroid/lib/json/JSONArray.java +++ b/src/main/java/com/reandroid/json/JSONArray.java @@ -3,11 +3,10 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import java.io.IOException; import java.io.InputStream; -import java.io.StringWriter; import java.io.Writer; import java.lang.reflect.Array; import java.math.BigDecimal; diff --git a/src/main/java/com/reandroid/lib/json/JSONConvert.java b/src/main/java/com/reandroid/json/JSONConvert.java similarity index 90% rename from src/main/java/com/reandroid/lib/json/JSONConvert.java rename to src/main/java/com/reandroid/json/JSONConvert.java index 00f4b3a..358caf2 100644 --- a/src/main/java/com/reandroid/lib/json/JSONConvert.java +++ b/src/main/java/com/reandroid/json/JSONConvert.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; public interface JSONConvert { public T toJson(); diff --git a/src/main/java/com/reandroid/lib/json/JSONException.java b/src/main/java/com/reandroid/json/JSONException.java similarity index 95% rename from src/main/java/com/reandroid/lib/json/JSONException.java rename to src/main/java/com/reandroid/json/JSONException.java index 527363f..13b72cd 100644 --- a/src/main/java/com/reandroid/lib/json/JSONException.java +++ b/src/main/java/com/reandroid/json/JSONException.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; public class JSONException extends IllegalArgumentException { /** Serialization ID */ diff --git a/src/main/java/com/reandroid/lib/json/JSONItem.java b/src/main/java/com/reandroid/json/JSONItem.java similarity index 98% rename from src/main/java/com/reandroid/lib/json/JSONItem.java rename to src/main/java/com/reandroid/json/JSONItem.java index 5898f6b..86b630f 100644 --- a/src/main/java/com/reandroid/lib/json/JSONItem.java +++ b/src/main/java/com/reandroid/json/JSONItem.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.reandroid.lib.json; +package com.reandroid.json; import java.io.*; import java.nio.charset.StandardCharsets; diff --git a/src/main/java/com/reandroid/lib/json/JSONML.java b/src/main/java/com/reandroid/json/JSONML.java similarity index 99% rename from src/main/java/com/reandroid/lib/json/JSONML.java rename to src/main/java/com/reandroid/json/JSONML.java index f493bcc..9b15ea3 100644 --- a/src/main/java/com/reandroid/lib/json/JSONML.java +++ b/src/main/java/com/reandroid/json/JSONML.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; public class JSONML { @@ -281,7 +281,7 @@ public class JSONML { } public static String toString(JSONArray ja) throws JSONException { int i; - JSONObject jo; + JSONObject jo; int length; Object object; StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/com/reandroid/lib/json/JSONObject.java b/src/main/java/com/reandroid/json/JSONObject.java similarity index 99% rename from src/main/java/com/reandroid/lib/json/JSONObject.java rename to src/main/java/com/reandroid/json/JSONObject.java index 79f0c69..cb730d5 100644 --- a/src/main/java/com/reandroid/lib/json/JSONObject.java +++ b/src/main/java/com/reandroid/json/JSONObject.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import java.io.*; @@ -18,7 +18,7 @@ import java.util.*; import java.util.Map.Entry; import java.util.regex.Pattern; -public class JSONObject extends JSONItem{ +public class JSONObject extends JSONItem { private static final class Null { diff --git a/src/main/java/com/reandroid/lib/json/JSONPointer.java b/src/main/java/com/reandroid/json/JSONPointer.java similarity index 99% rename from src/main/java/com/reandroid/lib/json/JSONPointer.java rename to src/main/java/com/reandroid/json/JSONPointer.java index f1574ad..1512969 100644 --- a/src/main/java/com/reandroid/lib/json/JSONPointer.java +++ b/src/main/java/com/reandroid/json/JSONPointer.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import static java.lang.String.format; diff --git a/src/main/java/com/reandroid/lib/json/JSONPointerException.java b/src/main/java/com/reandroid/json/JSONPointerException.java similarity index 94% rename from src/main/java/com/reandroid/lib/json/JSONPointerException.java rename to src/main/java/com/reandroid/json/JSONPointerException.java index ef8ab98..218e661 100644 --- a/src/main/java/com/reandroid/lib/json/JSONPointerException.java +++ b/src/main/java/com/reandroid/json/JSONPointerException.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; public class JSONPointerException extends JSONException { private static final long serialVersionUID = 8872944667561856751L; diff --git a/src/main/java/com/reandroid/lib/json/JSONPropertyIgnore.java b/src/main/java/com/reandroid/json/JSONPropertyIgnore.java similarity index 94% rename from src/main/java/com/reandroid/lib/json/JSONPropertyIgnore.java rename to src/main/java/com/reandroid/json/JSONPropertyIgnore.java index 097e9c3..160f14a 100644 --- a/src/main/java/com/reandroid/lib/json/JSONPropertyIgnore.java +++ b/src/main/java/com/reandroid/json/JSONPropertyIgnore.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.RetentionPolicy.RUNTIME; diff --git a/src/main/java/com/reandroid/lib/json/JSONPropertyName.java b/src/main/java/com/reandroid/json/JSONPropertyName.java similarity index 94% rename from src/main/java/com/reandroid/lib/json/JSONPropertyName.java rename to src/main/java/com/reandroid/json/JSONPropertyName.java index c58d2dc..5268dc4 100644 --- a/src/main/java/com/reandroid/lib/json/JSONPropertyName.java +++ b/src/main/java/com/reandroid/json/JSONPropertyName.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.RetentionPolicy.RUNTIME; diff --git a/src/main/java/com/reandroid/lib/json/JSONString.java b/src/main/java/com/reandroid/json/JSONString.java similarity index 89% rename from src/main/java/com/reandroid/lib/json/JSONString.java rename to src/main/java/com/reandroid/json/JSONString.java index f9744c5..a78be92 100644 --- a/src/main/java/com/reandroid/lib/json/JSONString.java +++ b/src/main/java/com/reandroid/json/JSONString.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; public interface JSONString { diff --git a/src/main/java/com/reandroid/lib/json/JSONStringer.java b/src/main/java/com/reandroid/json/JSONStringer.java similarity index 93% rename from src/main/java/com/reandroid/lib/json/JSONStringer.java rename to src/main/java/com/reandroid/json/JSONStringer.java index ea4123e..a511ff7 100644 --- a/src/main/java/com/reandroid/lib/json/JSONStringer.java +++ b/src/main/java/com/reandroid/json/JSONStringer.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import java.io.StringWriter; diff --git a/src/main/java/com/reandroid/lib/json/JSONTokener.java b/src/main/java/com/reandroid/json/JSONTokener.java similarity index 99% rename from src/main/java/com/reandroid/lib/json/JSONTokener.java rename to src/main/java/com/reandroid/json/JSONTokener.java index 298e240..6ea5f39 100644 --- a/src/main/java/com/reandroid/lib/json/JSONTokener.java +++ b/src/main/java/com/reandroid/json/JSONTokener.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import java.io.BufferedReader; import java.io.IOException; diff --git a/src/main/java/com/reandroid/lib/json/JSONWriter.java b/src/main/java/com/reandroid/json/JSONWriter.java similarity index 99% rename from src/main/java/com/reandroid/lib/json/JSONWriter.java rename to src/main/java/com/reandroid/json/JSONWriter.java index 47fcf11..794de4d 100644 --- a/src/main/java/com/reandroid/lib/json/JSONWriter.java +++ b/src/main/java/com/reandroid/json/JSONWriter.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import java.io.IOException; import java.util.Collection; diff --git a/src/main/java/com/reandroid/lib/json/JsonUtil.java b/src/main/java/com/reandroid/json/JsonUtil.java similarity index 98% rename from src/main/java/com/reandroid/lib/json/JsonUtil.java rename to src/main/java/com/reandroid/json/JsonUtil.java index 15de813..91bf156 100644 --- a/src/main/java/com/reandroid/lib/json/JsonUtil.java +++ b/src/main/java/com/reandroid/json/JsonUtil.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import java.io.*; import java.nio.charset.StandardCharsets; diff --git a/src/main/java/com/reandroid/lib/json/Property.java b/src/main/java/com/reandroid/json/Property.java similarity index 97% rename from src/main/java/com/reandroid/lib/json/Property.java rename to src/main/java/com/reandroid/json/Property.java index 1eb7efa..c6c2d4d 100644 --- a/src/main/java/com/reandroid/lib/json/Property.java +++ b/src/main/java/com/reandroid/json/Property.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import java.util.Enumeration; import java.util.Properties; diff --git a/src/main/java/com/reandroid/lib/json/XML.java b/src/main/java/com/reandroid/json/XML.java similarity index 99% rename from src/main/java/com/reandroid/lib/json/XML.java rename to src/main/java/com/reandroid/json/XML.java index af32ba8..a22114a 100644 --- a/src/main/java/com/reandroid/lib/json/XML.java +++ b/src/main/java/com/reandroid/json/XML.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import java.io.Reader; import java.io.StringReader; diff --git a/src/main/java/com/reandroid/lib/json/XMLParserConfiguration.java b/src/main/java/com/reandroid/json/XMLParserConfiguration.java similarity index 85% rename from src/main/java/com/reandroid/lib/json/XMLParserConfiguration.java rename to src/main/java/com/reandroid/json/XMLParserConfiguration.java index 5dbf503..a1da111 100644 --- a/src/main/java/com/reandroid/lib/json/XMLParserConfiguration.java +++ b/src/main/java/com/reandroid/json/XMLParserConfiguration.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import java.util.Collections; import java.util.HashMap; @@ -27,7 +27,7 @@ public class XMLParserConfiguration { private Map> xsiTypeMap; - public XMLParserConfiguration () { + public XMLParserConfiguration() { this.keepStrings = false; this.cDataTagName = "content"; this.convertNilAttributeToNull = false; @@ -35,31 +35,31 @@ public class XMLParserConfiguration { } @Deprecated - public XMLParserConfiguration (final boolean keepStrings) { + public XMLParserConfiguration(final boolean keepStrings) { this(keepStrings, "content", false); } @Deprecated - public XMLParserConfiguration (final String cDataTagName) { + public XMLParserConfiguration(final String cDataTagName) { this(false, cDataTagName, false); } @Deprecated - public XMLParserConfiguration (final boolean keepStrings, final String cDataTagName) { + public XMLParserConfiguration(final boolean keepStrings, final String cDataTagName) { this.keepStrings = keepStrings; this.cDataTagName = cDataTagName; this.convertNilAttributeToNull = false; } @Deprecated - public XMLParserConfiguration (final boolean keepStrings, final String cDataTagName, final boolean convertNilAttributeToNull) { + public XMLParserConfiguration(final boolean keepStrings, final String cDataTagName, final boolean convertNilAttributeToNull) { this.keepStrings = keepStrings; this.cDataTagName = cDataTagName; this.convertNilAttributeToNull = convertNilAttributeToNull; } - private XMLParserConfiguration (final boolean keepStrings, final String cDataTagName, - final boolean convertNilAttributeToNull, final Map> xsiTypeMap ) { + private XMLParserConfiguration(final boolean keepStrings, final String cDataTagName, + final boolean convertNilAttributeToNull, final Map> xsiTypeMap ) { this.keepStrings = keepStrings; this.cDataTagName = cDataTagName; this.convertNilAttributeToNull = convertNilAttributeToNull; diff --git a/src/main/java/com/reandroid/lib/json/XMLTokener.java b/src/main/java/com/reandroid/json/XMLTokener.java similarity index 99% rename from src/main/java/com/reandroid/lib/json/XMLTokener.java rename to src/main/java/com/reandroid/json/XMLTokener.java index 693febc..f0c4574 100644 --- a/src/main/java/com/reandroid/lib/json/XMLTokener.java +++ b/src/main/java/com/reandroid/json/XMLTokener.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; import java.io.Reader; diff --git a/src/main/java/com/reandroid/lib/json/XMLXsiTypeConverter.java b/src/main/java/com/reandroid/json/XMLXsiTypeConverter.java similarity index 89% rename from src/main/java/com/reandroid/lib/json/XMLXsiTypeConverter.java rename to src/main/java/com/reandroid/json/XMLXsiTypeConverter.java index 29296a3..af9ef09 100644 --- a/src/main/java/com/reandroid/lib/json/XMLXsiTypeConverter.java +++ b/src/main/java/com/reandroid/json/XMLXsiTypeConverter.java @@ -3,7 +3,7 @@ * This is NOT property of REAndroid * This package is renamed from org.json.* to avoid class conflict when used on anroid platforms */ -package com.reandroid.lib.json; +package com.reandroid.json; public interface XMLXsiTypeConverter { T convert(String value); diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/BaseXmlChunk.java b/src/main/java/com/reandroid/lib/arsc/chunk/xml/BaseXmlChunk.java deleted file mode 100755 index bfbb139..0000000 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/BaseXmlChunk.java +++ /dev/null @@ -1,213 +0,0 @@ - /* - * Copyright (C) 2022 github.com/REAndroid - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.reandroid.lib.arsc.chunk.xml; - -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.chunk.BaseChunk; -import com.reandroid.lib.arsc.header.XmlNodeHeader; -import com.reandroid.lib.arsc.item.IntegerItem; -import com.reandroid.lib.arsc.item.ResXmlString; -import com.reandroid.lib.arsc.pool.ResXmlStringPool; - -import java.util.HashSet; -import java.util.Set; - - - public class BaseXmlChunk extends BaseChunk { - - private final IntegerItem mNamespaceReference; - private final IntegerItem mStringReference; - BaseXmlChunk(ChunkType chunkType, int initialChildesCount) { - super(new XmlNodeHeader(chunkType), initialChildesCount+2); - - this.mNamespaceReference=new IntegerItem(-1); - this.mStringReference=new IntegerItem(-1); - - addChild(mNamespaceReference); - addChild(mStringReference); - } - Set clearStringReferences(){ - Set results=new HashSet<>(); - ResXmlString xmlString; - xmlString=unLinkStringReference(getHeaderBlock().getCommentReference()); - if(xmlString!=null){ - results.add(xmlString); - } - xmlString=unLinkStringReference(mNamespaceReference); - if(xmlString!=null){ - results.add(xmlString); - } - xmlString=unLinkStringReference(mStringReference); - if(xmlString!=null){ - results.add(xmlString); - } - return results; - } - void linkStringReferences(){ - linkStringReference(getHeaderBlock().getCommentReference()); - linkStringReference(mNamespaceReference); - linkStringReference(mStringReference); - } - private void linkStringReference(IntegerItem item){ - ResXmlString xmlString = getResXmlString(item.get()); - if(xmlString!=null){ - xmlString.addReferenceIfAbsent(item); - } - } - ResXmlString unLinkStringReference(IntegerItem item){ - ResXmlString xmlString = getResXmlString(item.get()); - if(xmlString!=null){ - xmlString.removeReference(item); - } - return xmlString; - } - public void setLineNumber(int val){ - getHeaderBlock().getLineNumber().set(val); - } - public int getLineNumber(){ - return getHeaderBlock().getLineNumber().get(); - } - public void setCommentReference(int val){ - IntegerItem comment=getHeaderBlock().getCommentReference(); - unLinkStringReference(comment); - getHeaderBlock().getCommentReference().set(val); - linkStringReference(comment); - } - public int getCommentReference(){ - return getHeaderBlock().getCommentReference().get(); - } - public void setNamespaceReference(int val){ - unLinkStringReference(mNamespaceReference); - mNamespaceReference.set(val); - linkStringReference(mNamespaceReference); - } - public int getNamespaceReference(){ - return mNamespaceReference.get(); - } - public void setStringReference(int val){ - unLinkStringReference(mStringReference); - mStringReference.set(val); - linkStringReference(mStringReference); - } - public int getStringReference(){ - return mStringReference.get(); - } - public ResXmlString setString(String str){ - ResXmlStringPool pool = getStringPool(); - if(pool==null){ - return null; - } - ResXmlString xmlString = pool.getOrCreate(str); - setStringReference(xmlString.getIndex()); - return xmlString; - } - public ResXmlStringPool getStringPool(){ - Block parent=getParent(); - while (parent!=null){ - if(parent instanceof ResXmlBlock){ - return ((ResXmlBlock)parent).getStringPool(); - } - if(parent instanceof ResXmlElement){ - return ((ResXmlElement)parent).getStringPool(); - } - parent=parent.getParent(); - } - return null; - } - public ResXmlString getResXmlString(int ref){ - if(ref<0){ - return null; - } - ResXmlStringPool stringPool=getStringPool(); - if(stringPool!=null){ - return stringPool.get(ref); - } - return null; - } - ResXmlString getOrCreateResXmlString(String str){ - ResXmlStringPool stringPool=getStringPool(); - if(stringPool!=null){ - return stringPool.getOrCreate(str); - } - return null; - } - String getString(int ref){ - ResXmlString xmlString=getResXmlString(ref); - if(xmlString!=null){ - return xmlString.get(); - } - return null; - } - ResXmlString getOrCreateString(String str){ - ResXmlStringPool stringPool=getStringPool(); - if(stringPool==null){ - return null; - } - return stringPool.getOrCreate(str); - } - - public String getName(){ - return getString(getStringReference()); - } - public String getUri(){ - return getString(getNamespaceReference()); - } - public String getComment(){ - return getString(getCommentReference()); - } - public void setComment(String comment){ - if(comment==null||comment.length()==0){ - setCommentReference(-1); - }else { - String old=getComment(); - if(comment.equals(old)){ - return; - } - ResXmlString xmlString = getOrCreateResXmlString(comment); - setCommentReference(xmlString.getIndex()); - } - } - public ResXmlElement getParentResXmlElement(){ - Block parent=getParent(); - while (parent!=null){ - if(parent instanceof ResXmlElement){ - return (ResXmlElement)parent; - } - parent=parent.getParent(); - } - return null; - } - @Override - protected void onChunkRefreshed() { - - } - @Override - public String toString(){ - ChunkType chunkType=getHeaderBlock().getChunkType(); - if(chunkType==null){ - return super.toString(); - } - StringBuilder builder=new StringBuilder(); - builder.append(chunkType.toString()); - builder.append(": line="); - builder.append(getLineNumber()); - builder.append(" {"); - builder.append(getName()); - builder.append("}"); - return builder.toString(); - } -} diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlAttribute.java b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlAttribute.java deleted file mode 100755 index 58533ac..0000000 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlAttribute.java +++ /dev/null @@ -1,526 +0,0 @@ - /* - * Copyright (C) 2022 github.com/REAndroid - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.reandroid.lib.arsc.chunk.xml; - -import com.reandroid.lib.arsc.array.ResXmlAttributeArray; -import com.reandroid.lib.arsc.array.ResXmlIDArray; -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.container.FixedBlockContainer; -import com.reandroid.lib.arsc.decoder.ValueDecoder; -import com.reandroid.lib.arsc.group.EntryGroup; -import com.reandroid.lib.arsc.item.*; -import com.reandroid.lib.arsc.pool.ResXmlStringPool; -import com.reandroid.lib.arsc.value.ValueType; -import com.reandroid.lib.common.EntryStore; -import com.reandroid.lib.json.JSONConvert; -import com.reandroid.lib.json.JSONObject; -import com.reandroid.xml.XMLAttribute; -import com.reandroid.xml.XMLException; - -import java.util.HashSet; -import java.util.Set; - - public class ResXmlAttribute extends FixedBlockContainer - implements Comparable, JSONConvert { - private final IntegerItem mNamespaceReference; - private final IntegerItem mNameReference; - private final IntegerItem mValueStringReference; - private final ShortItem mNameType; - private final ByteItem mReserved; - private final ByteItem mValueTypeByte; - private final IntegerItem mRawValue; - public ResXmlAttribute() { - super(7); - mNamespaceReference =new IntegerItem(-1); - mNameReference =new IntegerItem(-1); - mValueStringReference =new IntegerItem(-1); - mNameType=new ShortItem((short) 0x0008); - mReserved =new ByteItem(); - mValueTypeByte=new ByteItem(); - mRawValue=new IntegerItem(); - addChild(0, mNamespaceReference); - addChild(1, mNameReference); - addChild(2, mValueStringReference); - addChild(3, mNameType); - addChild(4, mReserved); - addChild(5, mValueTypeByte); - addChild(6, mRawValue); - } - Set clearStringReferences(){ - Set results=new HashSet<>(); - ResXmlString xmlString; - xmlString=unLinkStringReference(mNamespaceReference); - if(xmlString!=null){ - results.add(xmlString); - } - xmlString=unLinkStringReference(mNameReference); - if(xmlString!=null){ - results.add(xmlString); - } - xmlString=unLinkStringReference(mValueStringReference); - if(xmlString!=null){ - results.add(xmlString); - } - xmlString=unLinkStringReference(mRawValue); - if(xmlString!=null){ - results.add(xmlString); - } - return results; - } - public void linkStringReferences(){ - linkStringReference(mNamespaceReference); - linkStringReference(mNameReference); - linkStringReference(mValueStringReference); - if(getValueType()==ValueType.STRING){ - linkStringReference(mRawValue); - } - } - private void linkStringReference(IntegerItem item){ - ResXmlString xmlString = getResXmlString(item.get()); - if(xmlString!=null){ - xmlString.addReferenceIfAbsent(item); - } - } - private ResXmlString unLinkStringReference(IntegerItem item){ - ResXmlString xmlString = getResXmlString(item.get()); - if(xmlString!=null){ - xmlString.removeReference(item); - } - return xmlString; - } - public String getUri(){ - return getString(getNamespaceReference()); - } - int getNamespaceReference(){ - return mNamespaceReference.get(); - } - public void setNamespaceReference(int ref){ - mNamespaceReference.set(ref); - } - int getNameReference(){ - return mNameReference.get(); - } - void setNameReference(int ref){ - mNameReference.set(ref); - } - int getValueStringReference(){ - return mValueStringReference.get(); - } - void setValueStringReference(int ref){ - mValueStringReference.set(ref); - } - short getNameType(){ - return mNameType.get(); - } - void setNameType(short s){ - mNameType.set(s); - } - byte getValueTypeByte(){ - return mValueTypeByte.get(); - } - void setValueTypeByte(byte b){ - mValueTypeByte.set(b); - } - public int getRawValue(){ - return mRawValue.get(); - } - public void setRawValue(int val){ - mRawValue.set(val); - } - - public ResXmlString getNameString(){ - return getResXmlString(getNameReference()); - } - public ValueType getValueType(){ - return ValueType.valueOf(getValueTypeByte()); - } - public void setValueType(ValueType valueType){ - byte b=0; - if(valueType!=null){ - b=valueType.getByte(); - } - setValueTypeByte(b); - } - public String getFullName(){ - String name=getName(); - if(name==null){ - return null; - } - String prefix=getNamePrefix(); - if(prefix==null){ - return name; - } - return prefix+":"+name; - } - public String getName(){ - return getString(getNameReference()); - } - public String getNamePrefix(){ - ResXmlElement xmlElement=getParentResXmlElement(); - if(xmlElement==null){ - return null; - } - ResXmlStartNamespace startNamespace=xmlElement.getStartNamespaceByUriRef(getNamespaceReference()); - if(startNamespace==null){ - return null; - } - return startNamespace.getPrefix(); - } - public ResXmlStartNamespace getStartNamespace(){ - ResXmlElement xmlElement=getParentResXmlElement(); - if(xmlElement==null){ - return null; - } - return xmlElement.getStartNamespaceByUriRef(getNamespaceReference()); - } - @Deprecated - public String getValueString(){ - return getString(getValueStringReference()); - } - public int getNameResourceID(){ - return getResourceId(getNameReference()); - } - public void setNameResourceID(int resourceId){ - ResXmlIDMap xmlIDMap=getResXmlIDMap(); - if(xmlIDMap==null){ - return; - } - ResXmlID xmlID = xmlIDMap.getOrCreate(resourceId); - setNameReference(xmlID.getIndex()); - } - public void setName(String name, int resourceId){ - if(resourceId!=0){ - setNameResourceID(resourceId); - return; - } - if(name==null){ - name=""; - } - ResXmlIDMap xmlIDMap=getResXmlIDMap(); - ResXmlStringPool stringPool=getStringPool(); - if(stringPool==null || xmlIDMap==null){ - return; - } - ResXmlString xmlString = stringPool.getOrCreateAttributeName(xmlIDMap.getResXmlIDArray().childesCount(), name); - setNameReference(xmlString.getIndex()); - } - private int getResourceId(int ref){ - if(ref<0){ - return 0; - } - ResXmlIDMap xmlIDMap=getResXmlIDMap(); - if(xmlIDMap==null){ - return 0; - } - ResXmlIDArray xmlIDArray = xmlIDMap.getResXmlIDArray(); - ResXmlID xmlID = xmlIDArray.get(ref); - if(xmlID!=null){ - return xmlID.get(); - } - return 0; - } - - private String getString(int ref){ - if(ref<0){ - return null; - } - ResXmlString xmlString=getResXmlString(ref); - if(xmlString!=null){ - return xmlString.getHtml(); - } - return null; - } - private ResXmlString getResXmlString(int ref){ - ResXmlStringPool stringPool=getStringPool(); - if(stringPool!=null){ - return stringPool.get(ref); - } - return null; - } - private ResXmlString getOrCreateResXmlString(String str){ - ResXmlStringPool stringPool=getStringPool(); - if(stringPool!=null){ - return stringPool.getOrCreate(str); - } - return null; - } - private ResXmlStringPool getStringPool(){ - ResXmlElement xmlElement=getParentResXmlElement(); - if(xmlElement!=null){ - return xmlElement.getStringPool(); - } - return null; - } - private ResXmlIDMap getResXmlIDMap(){ - ResXmlElement xmlElement=getParentResXmlElement(); - if(xmlElement!=null){ - return xmlElement.getResXmlIDMap(); - } - return null; - } - public ResXmlElement getParentResXmlElement(){ - Block parent=getParent(); - while (parent!=null){ - if(parent instanceof ResXmlElement){ - return (ResXmlElement)parent; - } - parent=parent.getParent(); - } - 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?0xffffffff:0; - setRawValue(ref); - setValueStringReference(-1); - } - public boolean hasIntegerValue(){ - ValueType valueType=getValueType(); - return valueType==ValueType.INT_DEC; - } - public Integer getValueAsInteger(){ - if(hasIntegerValue()){ - return getRawValue(); - } - return null; - } - public void setValueAsInteger(int val){ - setValueType(ValueType.INT_DEC); - setRawValue(val); - setValueStringReference(-1); - } - private ResXmlAttributeArray getParentResXmlAttributeArray(){ - Block parent=this; - while(parent!=null){ - if(parent instanceof ResXmlAttributeArray){ - return (ResXmlAttributeArray)parent; - } - parent=parent.getParent(); - } - return null; - } - public void setValueAsIntegerDec(int val){ - setValueType(ValueType.INT_DEC); - 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); - } - @Override - public int compareTo(ResXmlAttribute other) { - int id1=getNameResourceID(); - int id2=other.getNameResourceID(); - if(id1==0 && id2!=0){ - return 1; - } - if(id2==0 && id1!=0){ - return -1; - } - if(id1!=0){ - return Integer.compare(id1, id2); - } - String name1=getName(); - if(name1==null){ - name1=""; - } - String name2=other.getName(); - if(name2==null){ - name2=""; - } - return name1.compareTo(name2); - } - @Override - public JSONObject toJson() { - JSONObject jsonObject=new JSONObject(); - jsonObject.put(NAME_name, getName()); - jsonObject.put(NAME_id, getNameResourceID()); - jsonObject.put(NAME_namespace_uri, getUri()); - ValueType valueType=getValueType(); - jsonObject.put(NAME_value_type, valueType.name()); - if(valueType==ValueType.STRING){ - jsonObject.put(NAME_data, getValueAsString()); - }else if(valueType==ValueType.INT_BOOLEAN){ - jsonObject.put(NAME_data, getValueAsBoolean()); - }else { - jsonObject.put(NAME_data, getRawValue()); - } - return jsonObject; - } - @Override - public void fromJson(JSONObject json) { - String name = json.optString(NAME_name, ""); - int id = json.optInt(NAME_id, 0); - setName(name, id); - String uri= json.optString(NAME_namespace_uri, null); - if(uri!=null){ - ResXmlStartNamespace ns = getParentResXmlElement().getStartNamespaceByUri(uri); - setNamespaceReference(ns.getUriReference()); - } - ValueType valueType=ValueType.fromName(json.getString(NAME_value_type)); - if(valueType==ValueType.STRING){ - setValueAsString(json.optString(NAME_data, "")); - }else if(valueType==ValueType.INT_BOOLEAN){ - setValueAsBoolean(json.getBoolean(NAME_data)); - }else { - setValueType(valueType); - setRawValue(json.getInt(NAME_data)); - } - } - public XMLAttribute decodeToXml(EntryStore entryStore, int currentPackageId) throws XMLException { - int resourceId=getNameResourceID(); - String name; - if(resourceId==0){ - name=getName(); - }else { - EntryGroup group = entryStore.getEntryGroup(resourceId); - if(group==null){ - //Lets ignore such error until XML encoder implemented - //throw new XMLException("Failed to decode attribute name: " - //+ String.format("@0x%08x", resourceId)); - name=String.format("@0x%08x", resourceId); - }else { - name=group.getSpecName(); - } - } - String prefix = getNamePrefix(); - if(prefix!=null){ - name=prefix+":"+name; - } - ValueType valueType=getValueType(); - int raw=getRawValue(); - String value; - if(valueType==ValueType.STRING){ - value = ValueDecoder.escapeSpecialCharacter(getValueAsString()); - }else { - value = ValueDecoder.decode(entryStore, - currentPackageId, - resourceId, - valueType, - raw); - } - XMLAttribute attribute = new XMLAttribute(name, value); - attribute.setNameId(resourceId); - if(valueType==ValueType.REFERENCE||valueType==ValueType.ATTRIBUTE){ - attribute.setValueId(raw); - } - return attribute; - } - @Override - public String toString(){ - String fullName=getFullName(); - if(fullName!=null ){ - int id=getNameResourceID(); - if(id>0){ - fullName=fullName+"(@"+String.format("0x%08x",id)+")"; - } - String valStr; - ValueType valueType=getValueType(); - if(valueType==ValueType.STRING){ - valStr=getValueAsString(); - }else if (valueType==ValueType.INT_BOOLEAN){ - valStr=String.valueOf(getValueAsBoolean()); - }else { - valStr="["+valueType+"] "+getRawValue(); - } - if(valStr!=null){ - return fullName+"=\""+valStr+"\""; - } - return fullName+"["+valueType+"]=\""+getRawValue()+"\""; - } - StringBuilder builder=new StringBuilder(); - builder.append(getClass().getSimpleName()); - builder.append(": "); - builder.append(getIndex()); - builder.append("{NamespaceReference=").append(getNamespaceReference()); - builder.append(", NameReference=").append(getNameReference()); - builder.append(", ValueStringReference=").append(getValueStringReference()); - builder.append(", NameType=").append(getNameType()); - builder.append(", ReservedByte=").append(mReserved.get()); - builder.append(", ValueTypeByte=").append(getValueTypeByte()); - builder.append(", RawValue=").append(getRawValue()); - builder.append("}"); - return builder.toString(); - } - static final String NAME_id = "id"; - public static final String NAME_value_type = "value_type"; - public static final String NAME_name = "name"; - public static final String NAME_namespace_uri = "namespace_uri"; - public static final String NAME_data= "data"; -} diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlBlock.java b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlBlock.java deleted file mode 100755 index 75b69bf..0000000 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlBlock.java +++ /dev/null @@ -1,347 +0,0 @@ - /* - * Copyright (C) 2022 github.com/REAndroid - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.reandroid.lib.arsc.chunk.xml; - - import com.reandroid.lib.arsc.chunk.BaseChunk; - import com.reandroid.lib.arsc.chunk.ChunkType; - import com.reandroid.lib.arsc.container.SingleBlockContainer; - import com.reandroid.lib.arsc.header.HeaderBlock; - import com.reandroid.lib.arsc.io.BlockReader; - import com.reandroid.lib.arsc.pool.ResXmlStringPool; - import com.reandroid.lib.arsc.value.ValueType; - import com.reandroid.lib.common.EntryStore; - import com.reandroid.lib.json.JSONArray; - import com.reandroid.lib.json.JSONConvert; - import com.reandroid.lib.json.JSONObject; - import com.reandroid.xml.XMLDocument; - import com.reandroid.xml.XMLElement; - import com.reandroid.xml.XMLException; - - import java.io.*; - import java.util.ArrayList; - import java.util.HashSet; - import java.util.List; - import java.util.Set; - - public class ResXmlBlock extends BaseChunk implements JSONConvert { - private final ResXmlStringPool mResXmlStringPool; - private final ResXmlIDMap mResXmlIDMap; - private ResXmlElement mResXmlElement; - private final SingleBlockContainer mResXmlElementContainer; - public ResXmlBlock() { - super(new HeaderBlock(ChunkType.XML),3); - this.mResXmlStringPool=new ResXmlStringPool(true); - this.mResXmlIDMap=new ResXmlIDMap(); - this.mResXmlElement=new ResXmlElement(); - this.mResXmlElementContainer=new SingleBlockContainer<>(); - this.mResXmlElementContainer.setItem(mResXmlElement); - addChild(mResXmlStringPool); - addChild(mResXmlIDMap); - addChild(mResXmlElementContainer); - } - public ResXmlElement createRootElement(String tag){ - int lineNo=1; - ResXmlElement resXmlElement=new ResXmlElement(); - resXmlElement.newStartElement(lineNo); - - setResXmlElement(resXmlElement); - - if(tag!=null){ - resXmlElement.setTag(tag); - } - return resXmlElement; - } - void linkStringReferences(){ - ResXmlElement element=getResXmlElement(); - if(element!=null){ - element.linkStringReferences(); - } - } - /* - * method Block.addBytes is inefficient for large size byte array - * so let's override here because this block is the largest - */ - @Override - public byte[] getBytes(){ - ByteArrayOutputStream os=new ByteArrayOutputStream(); - try { - writeBytes(os); - os.close(); - } catch (IOException ignored) { - } - return os.toByteArray(); - } - @Override - public void onReadBytes(BlockReader reader) throws IOException { - HeaderBlock headerBlock=reader.readHeaderBlock(); - if(headerBlock==null){ - return; - } - BlockReader chunkReader=reader.create(reader.getPosition(), headerBlock.getChunkSize()); - headerBlock=getHeaderBlock(); - headerBlock.readBytes(chunkReader); - // android/aapt2 accepts 0x0000 (NULL) chunk type as XML, it could - // be android's bug and might be fixed in the future until then lets fix it ourselves - headerBlock.setType(ChunkType.XML); - while (chunkReader.isAvailable()){ - boolean readOk=readNext(chunkReader); - if(!readOk){ - break; - } - } - reader.offset(headerBlock.getChunkSize()); - chunkReader.close(); - onChunkLoaded(); - } - @Override - public void onChunkLoaded(){ - super.onChunkLoaded(); - linkStringReferences(); - } - private boolean readNext(BlockReader reader) throws IOException { - if(!reader.isAvailable()){ - return false; - } - int position=reader.getPosition(); - HeaderBlock headerBlock=reader.readHeaderBlock(); - if(headerBlock==null){ - return false; - } - ChunkType chunkType=headerBlock.getChunkType(); - if(chunkType==ChunkType.STRING){ - mResXmlStringPool.readBytes(reader); - }else if(chunkType==ChunkType.XML_RESOURCE_MAP){ - mResXmlIDMap.readBytes(reader); - }else if(isElementChunk(chunkType)){ - mResXmlElementContainer.readBytes(reader); - return reader.isAvailable(); - }else { - throw new IOException("Unexpected chunk "+headerBlock); - } - return reader.isAvailable() && position!=reader.getPosition(); - } - private boolean isElementChunk(ChunkType chunkType){ - if(chunkType==ChunkType.XML_START_ELEMENT){ - return true; - } - if(chunkType==ChunkType.XML_END_ELEMENT){ - return true; - } - if(chunkType==ChunkType.XML_START_NAMESPACE){ - return true; - } - if(chunkType==ChunkType.XML_END_NAMESPACE){ - return true; - } - if(chunkType==ChunkType.XML_CDATA){ - return true; - } - if(chunkType==ChunkType.XML_LAST_CHUNK){ - return true; - } - return false; - } - public ResXmlStringPool getStringPool(){ - return mResXmlStringPool; - } - public ResXmlIDMap getResXmlIDMap(){ - return mResXmlIDMap; - } - public ResXmlElement getResXmlElement(){ - return mResXmlElement; - } - public void setResXmlElement(ResXmlElement resXmlElement){ - this.mResXmlElement=resXmlElement; - this.mResXmlElementContainer.setItem(resXmlElement); - } - @Override - protected void onChunkRefreshed() { - - } - public void readBytes(File file) throws IOException{ - BlockReader reader=new BlockReader(file); - super.readBytes(reader); - } - public void readBytes(InputStream inputStream) throws IOException{ - BlockReader reader=new BlockReader(inputStream); - super.readBytes(reader); - } - public final int writeBytes(File file) throws IOException{ - if(isNull()){ - throw new IOException("Can NOT save null block"); - } - File dir=file.getParentFile(); - if(dir!=null && !dir.exists()){ - dir.mkdirs(); - } - OutputStream outputStream=new FileOutputStream(file); - int length = super.writeBytes(outputStream); - outputStream.close(); - return length; - } - @Override - public JSONObject toJson() { - JSONObject jsonObject=new JSONObject(); - jsonObject.put(ResXmlBlock.NAME_element, getResXmlElement().toJson()); - JSONArray pool = getStringPool().toJson(); - if(pool!=null){ - jsonObject.put(ResXmlBlock.NAME_styled_strings, pool); - } - return jsonObject; - } - @Override - public void fromJson(JSONObject json) { - onFromJson(json); - ResXmlElement xmlElement=getResXmlElement(); - xmlElement.fromJson(json.optJSONObject(ResXmlBlock.NAME_element)); - refresh(); - } - public XMLDocument decodeToXml(EntryStore entryStore, int currentPackageId) throws XMLException { - XMLDocument xmlDocument = new XMLDocument(); - XMLElement xmlElement = getResXmlElement() - .decodeToXml(entryStore, currentPackageId); - xmlDocument.setDocumentElement(xmlElement); - return xmlDocument; - } - private void onFromJson(JSONObject json){ - List attributeList=recursiveAttributes(json.optJSONObject(ResXmlBlock.NAME_element)); - buildResourceIds(attributeList); - Set allStrings=recursiveStrings(json.optJSONObject(ResXmlBlock.NAME_element)); - ResXmlStringPool stringPool = getStringPool(); - stringPool.addStrings(allStrings); - stringPool.refresh(); - } - private void buildResourceIds(List attributeList){ - ResIdBuilder builder=new ResIdBuilder(); - for(JSONObject attribute:attributeList){ - int id=attribute.getInt(ResXmlAttribute.NAME_id); - if(id==0){ - continue; - } - String name=attribute.getString(ResXmlAttribute.NAME_name); - builder.add(id, name); - } - builder.buildTo(getResXmlIDMap()); - } - private List recursiveAttributes(JSONObject elementJson){ - List results = new ArrayList<>(); - if(elementJson==null){ - return results; - } - JSONArray attributes = elementJson.optJSONArray(ResXmlElement.NAME_attributes); - if(attributes != null){ - int length = attributes.length(); - for(int i=0; i recursiveStrings(JSONObject elementJson){ - Set results = new HashSet<>(); - if(elementJson==null){ - return results; - } - results.add(elementJson.optString(ResXmlElement.NAME_namespace_uri)); - results.add(elementJson.optString(ResXmlElement.NAME_name)); - JSONArray namespaces=elementJson.optJSONArray(ResXmlElement.NAME_namespaces); - if(namespaces != null){ - int length = namespaces.length(); - for(int i=0; i { - private final BlockList mStartNamespaceList; - private final SingleBlockContainer mStartElementContainer; - private final BlockList mBody; - private final SingleBlockContainer mEndElementContainer; - private final BlockList mEndNamespaceList; - private int mDepth; - public ResXmlElement() { - super(5); - this.mStartNamespaceList = new BlockList<>(); - this.mStartElementContainer= new SingleBlockContainer<>(); - this.mBody = new BlockList<>(); - this.mEndElementContainer = new SingleBlockContainer<>(); - this.mEndNamespaceList = new BlockList<>(); - addChild(0, mStartNamespaceList); - addChild(1, mStartElementContainer); - addChild(2, mBody); - addChild(3, mEndElementContainer); - addChild(4, mEndNamespaceList); - } - public String getComment(){ - return getStartElement().getComment(); - } - public void setComment(String comment){ - getStartElement().setComment(comment); - } - public void calculatePositions(){ - ResXmlStartElement start = getStartElement(); - if(start!=null){ - start.calculatePositions(); - } - } - public ResXmlAttribute newAttribute(){ - return getStartElement().newAttribute(); - } - Set clearStringReferences(){ - Set results=new HashSet<>(); - for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){ - results.addAll(startNamespace.clearStringReferences()); - } - ResXmlStartElement start = getStartElement(); - if(start!=null){ - results.addAll(start.clearStringReferences()); - } - ResXmlText resXmlText=getResXmlText(); - if(resXmlText!=null){ - results.addAll(resXmlText.clearStringReferences()); - } - for(ResXmlElement child:listElements()){ - results.addAll(child.clearStringReferences()); - } - return results; - } - void linkStringReferences(){ - for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){ - startNamespace.linkStringReferences(); - } - ResXmlStartElement start = getStartElement(); - if(start!=null){ - start.linkStringReferences(); - } - ResXmlText resXmlText=getResXmlText(); - if(resXmlText!=null){ - resXmlText.linkStringReferences(); - } - for(ResXmlElement child:listElements()){ - child.linkStringReferences(); - } - } - public ResXmlElement createChildElement(){ - return createChildElement(null); - } - public ResXmlElement createChildElement(String tag){ - int lineNo=getStartElement().getLineNumber()+1; - ResXmlElement resXmlElement=new ResXmlElement(); - resXmlElement.newStartElement(lineNo); - - addElement(resXmlElement); - - if(tag!=null){ - resXmlElement.setTag(tag); - } - return resXmlElement; - } - public ResXmlAttribute getOrCreateAndroidAttribute(String name, int resourceId){ - return getOrCreateAttribute(NS_ANDROID_URI, NS_ANDROID_PREFIX, name, resourceId); - } - public ResXmlAttribute getOrCreateAttribute(String uri, String prefix, String name, int resourceId){ - ResXmlAttribute attribute=searchAttribute(name, resourceId); - if(attribute==null){ - attribute = createAttribute(name, resourceId); - if(uri!=null){ - ResXmlElement root = getRootResXmlElement(); - ResXmlStartNamespace ns = root.getOrCreateNamespace(uri, prefix); - attribute.setNamespaceReference(ns.getUriReference()); - } - } - return attribute; - } - public ResXmlAttribute getOrCreateAttribute(String name, int resourceId){ - ResXmlAttribute attribute=searchAttribute(name, resourceId); - if(attribute==null){ - attribute=createAttribute(name, resourceId); - } - return attribute; - } - public ResXmlAttribute createAndroidAttribute(String name, int resourceId){ - ResXmlAttribute attribute=createAttribute(name, resourceId); - ResXmlStartNamespace ns = getOrCreateNamespace(NS_ANDROID_URI, NS_ANDROID_PREFIX); - attribute.setNamespaceReference(ns.getUriReference()); - return attribute; - } - public ResXmlAttribute createAttribute(String name, int resourceId){ - ResXmlAttribute attribute=new ResXmlAttribute(); - addAttribute(attribute); - attribute.setName(name, resourceId); - return attribute; - } - public void addAttribute(ResXmlAttribute attribute){ - getStartElement().getResXmlAttributeArray().add(attribute); - } - public ResXmlElement getElementByTagName(String name){ - if(name==null){ - return null; - } - for(ResXmlElement child:listElements()){ - if(name.equals(child.getTag())||name.equals(child.getTagName())){ - return child; - } - } - return null; - } - private ResXmlAttribute searchAttribute(String name, int resourceId){ - if(resourceId==0){ - return searchAttributeByName(name); - } - return searchAttributeByResourceId(resourceId); - } - public ResXmlAttribute searchAttributeByName(String name){ - ResXmlStartElement startElement=getStartElement(); - if(startElement!=null){ - return startElement.searchAttributeByName(name); - } - return null; - } - public ResXmlAttribute searchAttributeByResourceId(int resourceId){ - ResXmlStartElement startElement=getStartElement(); - if(startElement!=null){ - return startElement.searchAttributeByResourceId(resourceId); - } - return null; - } - public void setTag(String tag){ - ResXmlStringPool pool = getStringPool(); - if(pool==null){ - return; - } - ensureStartEndElement(); - ResXmlStartElement start=getStartElement(); - String prefix=null; - String name=tag; - int i=tag.lastIndexOf(':'); - if(i>=0){ - prefix=tag.substring(0,i); - i++; - name=tag.substring(i); - } - start.setName(name); - ResXmlStartNamespace ns = getStartNamespaceByPrefix(prefix); - if(ns!=null){ - start.setNamespaceReference(ns.getUriReference()); - } - } - public String getTagName(){ - ResXmlStartElement startElement=getStartElement(); - if(startElement!=null){ - return startElement.getTagName(); - } - return null; - } - public String getTag(){ - ResXmlStartElement startElement=getStartElement(); - if(startElement!=null){ - return startElement.getName(); - } - return null; - } - public String getTagUri(){ - ResXmlStartElement startElement=getStartElement(); - if(startElement!=null){ - return startElement.getUri(); - } - return null; - } - public String getTagPrefix(){ - ResXmlStartElement startElement=getStartElement(); - if(startElement!=null){ - return startElement.getPrefix(); - } - return null; - } - public Collection listAttributes(){ - ResXmlStartElement startElement=getStartElement(); - if(startElement!=null){ - return startElement.listResXmlAttributes(); - } - return new ArrayList<>(); - } - public ResXmlStringPool getStringPool(){ - Block parent=getParent(); - while (parent!=null){ - if(parent instanceof ResXmlBlock){ - return ((ResXmlBlock)parent).getStringPool(); - } - if(parent instanceof ResXmlElement){ - return ((ResXmlElement)parent).getStringPool(); - } - parent=parent.getParent(); - } - return null; - } - public ResXmlIDMap getResXmlIDMap(){ - Block parent=getParent(); - while (parent!=null){ - if(parent instanceof ResXmlBlock){ - return ((ResXmlBlock)parent).getResXmlIDMap(); - } - parent=parent.getParent(); - } - return null; - } - - public int getDepth(){ - return mDepth; - } - private void setDepth(int depth){ - mDepth=depth; - } - public void addElement(ResXmlElement element){ - mBody.add(element); - } - public boolean removeAttribute(ResXmlAttribute resXmlAttribute){ - return getStartElement().getResXmlAttributeArray().remove(resXmlAttribute); - } - public boolean removeElement(ResXmlElement element){ - if(element.getParent()!=null){ - // TODO: Find a way to remove properly from StringPool - Set removedStrings = element.clearStringReferences(); - for(ResXmlString xmlString:removedStrings){ - if(xmlString.getReferencedList().size()!=0){ - continue; - } - xmlString.set(""); - } - } - return mBody.remove(element); - } - public int countElements(){ - int result = 0; - for(ResXmlNode xmlNode:listXmlNodes()){ - if(xmlNode instanceof ResXmlElement){ - result++; - } - } - return result; - } - public void clearChildes(){ - List copyOfNodeList=new ArrayList<>(mBody.getChildes()); - for(ResXmlNode xmlNode:copyOfNodeList){ - if(xmlNode==null){ - continue; - } - xmlNode.onRemove(); - mBody.remove(xmlNode); - } - } - public List listXmlNodes(){ - return mBody.getChildes(); - } - public List listXmlText(){ - List results=new ArrayList<>(); - for(ResXmlNode xmlNode:listXmlNodes()){ - if(xmlNode instanceof ResXmlTextNode){ - results.add(((ResXmlTextNode) xmlNode).getResXmlText()); - } - } - return results; - } - public List listXmlTextNodes(){ - List results=new ArrayList<>(); - for(ResXmlNode xmlNode:listXmlNodes()){ - if(xmlNode instanceof ResXmlTextNode){ - results.add((ResXmlTextNode) xmlNode); - } - } - return results; - } - public List listElements(){ - List results=new ArrayList<>(); - for(ResXmlNode xmlNode:listXmlNodes()){ - if(xmlNode instanceof ResXmlElement){ - results.add((ResXmlElement) xmlNode); - } - } - return results; - } - public List listElements(String name){ - List results=new ArrayList<>(); - if(name==null){ - return results; - } - for(ResXmlElement element:listElements()){ - if(name.equals(element.getTag())||name.equals(element.getTagName())){ - results.add(element); - } - } - return results; - } - public ResXmlElement getRootResXmlElement(){ - ResXmlElement parent=getParentResXmlElement(); - if(parent!=null){ - return parent.getRootResXmlElement(); - } - return this; - } - public ResXmlElement getParentResXmlElement(){ - Block parent=getParent(); - while (parent!=null){ - if(parent instanceof ResXmlElement){ - return (ResXmlElement)parent; - } - parent=parent.getParent(); - } - return null; - } - public ResXmlStartNamespace getStartNamespaceByUriRef(int uriRef){ - if(uriRef<0){ - return null; - } - for(ResXmlStartNamespace ns:mStartNamespaceList.getChildes()){ - if(uriRef==ns.getUriReference()){ - return ns; - } - } - ResXmlElement xmlElement=getParentResXmlElement(); - if(xmlElement!=null){ - return xmlElement.getStartNamespaceByUriRef(uriRef); - } - return null; - } - public ResXmlStartNamespace getOrCreateNamespace(String uri, String prefix){ - ResXmlStartNamespace exist=getStartNamespaceByUri(uri); - if(exist!=null){ - return exist; - } - ResXmlStartNamespace startNamespace=new ResXmlStartNamespace(); - ResXmlEndNamespace endNamespace=new ResXmlEndNamespace(); - startNamespace.setEnd(endNamespace); - - addStartNamespace(startNamespace); - addEndNamespace(endNamespace); - - startNamespace.setUri(uri); - startNamespace.setPrefix(prefix); - - return startNamespace; - } - public ResXmlStartNamespace getStartNamespaceByUri(String uri){ - if(uri==null){ - return null; - } - for(ResXmlStartNamespace ns:mStartNamespaceList.getChildes()){ - if(uri.equals(ns.getUri())){ - return ns; - } - } - ResXmlElement xmlElement=getParentResXmlElement(); - if(xmlElement!=null){ - return xmlElement.getStartNamespaceByUri(uri); - } - return null; - } - public ResXmlStartNamespace getStartNamespaceByPrefix(String prefix){ - if(prefix==null){ - return null; - } - for(ResXmlStartNamespace ns:mStartNamespaceList.getChildes()){ - if(prefix.equals(ns.getPrefix())){ - return ns; - } - } - ResXmlElement xmlElement=getParentResXmlElement(); - if(xmlElement!=null){ - return xmlElement.getStartNamespaceByPrefix(prefix); - } - return null; - } - public List getStartNamespaceList(){ - return mStartNamespaceList.getChildes(); - } - public void addStartNamespace(ResXmlStartNamespace item){ - mStartNamespaceList.add(item); - } - public List getEndNamespaceList(){ - return mEndNamespaceList.getChildes(); - } - public void addEndNamespace(ResXmlEndNamespace item){ - mEndNamespaceList.add(item); - } - - ResXmlStartElement newStartElement(int lineNo){ - ResXmlStartElement startElement=new ResXmlStartElement(); - setStartElement(startElement); - - ResXmlEndElement endElement=new ResXmlEndElement(); - startElement.setResXmlEndElement(endElement); - - setEndElement(endElement); - endElement.setResXmlStartElement(startElement); - - startElement.setLineNumber(lineNo); - endElement.setLineNumber(lineNo); - - return startElement; - } - - public ResXmlStartElement getStartElement(){ - return mStartElementContainer.getItem(); - } - public void setStartElement(ResXmlStartElement item){ - mStartElementContainer.setItem(item); - } - - public ResXmlEndElement getEndElement(){ - return mEndElementContainer.getItem(); - } - public void setEndElement(ResXmlEndElement item){ - mEndElementContainer.setItem(item); - } - - // Use listXmlText() instead to be removed on next version - @Deprecated - public ResXmlText getResXmlText(){ - List xmlTextList=listXmlText(); - if(xmlTextList.size()==0){ - return null; - } - return xmlTextList.get(0); - } - public void addResXmlTextNode(ResXmlTextNode xmlTextNode){ - mBody.add(xmlTextNode); - } - public void addResXmlText(ResXmlText xmlText){ - if(xmlText!=null){ - addResXmlTextNode(new ResXmlTextNode(xmlText)); - } - } - // Use addResXmlText() - @Deprecated - public void setResXmlText(ResXmlText xmlText){ - addResXmlText(xmlText); - } - @Deprecated - public void setResXmlText(String text){ - clearChildes(); - addResXmlText(text); - } - public void addResXmlText(String text){ - if(text==null){ - return; - } - ResXmlTextNode xmlTextNode=new ResXmlTextNode(); - addResXmlTextNode(xmlTextNode); - xmlTextNode.setText(text); - } - - private boolean isBalanced(){ - return isElementBalanced() && isNamespaceBalanced(); - } - private boolean isNamespaceBalanced(){ - return (mStartNamespaceList.size()==mEndNamespaceList.size()); - } - private boolean isElementBalanced(){ - return (hasStartElement() && hasEndElement()); - } - private boolean hasStartElement(){ - return mStartElementContainer.hasItem(); - } - private boolean hasEndElement(){ - return mEndElementContainer.hasItem(); - } - - private void linkStartEnd(){ - linkStartEndElement(); - linkStartEndNameSpaces(); - } - private void linkStartEndElement(){ - ResXmlStartElement start=getStartElement(); - ResXmlEndElement end=getEndElement(); - if(start==null || end==null){ - return; - } - start.setResXmlEndElement(end); - end.setResXmlStartElement(start); - } - private void ensureStartEndElement(){ - ResXmlStartElement start=getStartElement(); - ResXmlEndElement end=getEndElement(); - if(start!=null && end!=null){ - return; - } - if(start==null){ - start=new ResXmlStartElement(); - setStartElement(start); - } - if(end==null){ - end=new ResXmlEndElement(); - setEndElement(end); - } - linkStartEndElement(); - } - private void linkStartEndNameSpaces(){ - if(!isNamespaceBalanced()){ - return; - } - int max=mStartNamespaceList.size(); - for(int i=0;i0 && getDepth()==0){ - onFinishedUnexpected(reader); - return; - } - onFinishedSuccess(reader, headerBlock); - } - private void onFinishedSuccess(BlockReader reader, HeaderBlock headerBlock) throws IOException{ - - } - private void onFinishedUnexpected(BlockReader reader) throws IOException{ - StringBuilder builder=new StringBuilder(); - builder.append("Unexpected finish reading: reader=").append(reader.toString()); - HeaderBlock header = reader.readHeaderBlock(); - if(header!=null){ - builder.append(", next header="); - builder.append(header.toString()); - } - throw new IOException(builder.toString()); - } - private void onStartElement(BlockReader reader) throws IOException{ - if(hasStartElement()){ - ResXmlElement childElement=new ResXmlElement(); - addElement(childElement); - childElement.setDepth(getDepth()+1); - childElement.readBytes(reader); - }else{ - ResXmlStartElement startElement=new ResXmlStartElement(); - setStartElement(startElement); - startElement.readBytes(reader); - } - } - private void onEndElement(BlockReader reader) throws IOException{ - if(hasEndElement()){ - multipleEndElement(reader); - return; - } - ResXmlEndElement endElement=new ResXmlEndElement(); - setEndElement(endElement); - endElement.readBytes(reader); - } - private void onStartNamespace(BlockReader reader) throws IOException{ - ResXmlStartNamespace startNamespace=new ResXmlStartNamespace(); - addStartNamespace(startNamespace); - startNamespace.readBytes(reader); - } - private void onEndNamespace(BlockReader reader) throws IOException{ - ResXmlEndNamespace endNamespace=new ResXmlEndNamespace(); - addEndNamespace(endNamespace); - endNamespace.readBytes(reader); - } - private void onXmlText(BlockReader reader) throws IOException{ - ResXmlText xmlText=new ResXmlText(); - addResXmlText(xmlText); - xmlText.readBytes(reader); - } - - private void unknownChunk(BlockReader reader, HeaderBlock headerBlock) throws IOException{ - throw new IOException("Unknown chunk: "+headerBlock.toString()); - } - private void multipleEndElement(BlockReader reader) throws IOException{ - throw new IOException("Multiple end element: "+reader.toString()); - } - private void unexpectedChunk(BlockReader reader, HeaderBlock headerBlock) throws IOException{ - throw new IOException("Unexpected chunk: "+headerBlock.toString()); - } - private void unBalancedFinish(BlockReader reader) throws IOException{ - if(!isNamespaceBalanced()){ - throw new IOException("Unbalanced namespace: start=" - +mStartNamespaceList.size()+", end="+mEndNamespaceList.size()); - } - - if(!isElementBalanced()){ - // Should not happen unless corrupted file, auto corrected above - StringBuilder builder=new StringBuilder(); - builder.append("Unbalanced element: start="); - ResXmlStartElement startElement=getStartElement(); - if(startElement!=null){ - builder.append(startElement); - }else { - builder.append("null"); - } - builder.append(", end="); - ResXmlEndElement endElement=getEndElement(); - if(endElement!=null){ - builder.append(endElement); - }else { - builder.append("null"); - } - throw new IOException(builder.toString()); - } - } - @Override - public JSONObject toJson() { - JSONObject jsonObject=new JSONObject(); - jsonObject.put(NAME_node_type, NAME_element); - ResXmlStartElement start = getStartElement(); - jsonObject.put(NAME_line, start.getLineNumber()); - int i=0; - JSONArray nsList=new JSONArray(); - for(ResXmlStartNamespace namespace:getStartNamespaceList()){ - JSONObject ns=new JSONObject(); - ns.put(NAME_namespace_uri, namespace.getUri()); - ns.put(NAME_namespace_prefix, namespace.getPrefix()); - nsList.put(i, ns); - i++; - } - if(i>0){ - jsonObject.put(NAME_namespaces, nsList); - } - jsonObject.put(NAME_name, start.getName()); - String comment=start.getComment(); - if(comment!=null){ - jsonObject.put(NAME_comment, comment); - } - String uri=start.getUri(); - if(uri!=null){ - jsonObject.put(NAME_namespace_uri, uri); - } - JSONArray attrArray=start.getResXmlAttributeArray().toJson(); - jsonObject.put(NAME_attributes, attrArray); - i=0; - JSONArray childes=new JSONArray(); - for(ResXmlNode xmlNode:listXmlNodes()){ - childes.put(i, xmlNode.toJson()); - i++; - } - if(i>0){ - jsonObject.put(NAME_childes, childes); - } - return jsonObject; - } - @Override - public void fromJson(JSONObject json) { - ResXmlStartElement start = getStartElement(); - int lineNo=json.optInt(NAME_line, 1); - if(start==null){ - start = newStartElement(lineNo); - }else { - start.setLineNumber(lineNo); - } - JSONArray nsArray = json.optJSONArray(NAME_namespaces); - if(nsArray!=null){ - int length=nsArray.length(); - for(int i=0;i"); - builder.append(text.toString()); - builder.append(""); - }else { - builder.append("/>"); - } - return builder.toString(); - } - return "NULL"; - } - static ResXmlElement newResXmlElement(String tag){ - ResXmlElement resXmlElement=new ResXmlElement(); - ResXmlStartElement startElement=new ResXmlStartElement(); - resXmlElement.setStartElement(startElement); - ResXmlEndElement endElement=new ResXmlEndElement(); - resXmlElement.setEndElement(endElement); - resXmlElement.setTag(tag); - return resXmlElement; - } - - public static final String NS_ANDROID_URI = "http://schemas.android.com/apk/res/android"; - public static final String NS_ANDROID_PREFIX = "android"; - - static final String NAME_element = "element"; - static final String NAME_name = "name"; - static final String NAME_comment = "comment"; - static final String NAME_text = "text"; - static final String NAME_namespaces = "namespaces"; - static final String NAME_namespace_uri = "namespace_uri"; - static final String NAME_namespace_prefix = "namespace_prefix"; - private static final String NAME_line = "line"; - static final String NAME_attributes = "attributes"; - static final String NAME_childes = "childes"; -} diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlIDMap.java b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlIDMap.java deleted file mode 100755 index 6854a77..0000000 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlIDMap.java +++ /dev/null @@ -1,70 +0,0 @@ - /* - * Copyright (C) 2022 github.com/REAndroid - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.reandroid.lib.arsc.chunk.xml; - -import com.reandroid.lib.arsc.base.Block; -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.array.ResXmlIDArray; -import com.reandroid.lib.arsc.chunk.BaseChunk; -import com.reandroid.lib.arsc.header.HeaderBlock; -import com.reandroid.lib.arsc.io.BlockReader; -import com.reandroid.lib.arsc.item.ResXmlID; -import com.reandroid.lib.arsc.pool.ResXmlStringPool; - -import java.io.IOException; -import java.util.Collection; - -public class ResXmlIDMap extends BaseChunk { - private final ResXmlIDArray mResXmlIDArray; - public ResXmlIDMap() { - super(new HeaderBlock(ChunkType.XML_RESOURCE_MAP), 1); - this.mResXmlIDArray=new ResXmlIDArray(getHeaderBlock()); - addChild(mResXmlIDArray); - } - public ResXmlIDArray getResXmlIDArray(){ - return mResXmlIDArray; - } - - public Collection listResXmlID(){ - return getResXmlIDArray().listItems(); - } - public void addResourceId(int index, int resId){ - getResXmlIDArray().addResourceId(index, resId); - } - public ResXmlID getResXmlID(int ref){ - return getResXmlIDArray().get(ref); - } - public ResXmlID getOrCreate(int resId){ - return getResXmlIDArray().getOrCreate(resId); - } - public ResXmlID getByResId(int resId){ - return getResXmlIDArray().getByResId(resId); - } - @Override - protected void onChunkRefreshed() { - - } - ResXmlStringPool getXmlStringPool(){ - Block parent=this; - while (parent!=null){ - if(parent instanceof ResXmlBlock){ - return ((ResXmlBlock)parent).getStringPool(); - } - parent=parent.getParent(); - } - return null; - } -} diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlStartElement.java b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlStartElement.java deleted file mode 100755 index 32ee394..0000000 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlStartElement.java +++ /dev/null @@ -1,287 +0,0 @@ - /* - * Copyright (C) 2022 github.com/REAndroid - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.reandroid.lib.arsc.chunk.xml; - -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.array.ResXmlAttributeArray; -import com.reandroid.lib.arsc.item.ResXmlString; -import com.reandroid.lib.arsc.item.ShortItem; - -import java.util.Collection; -import java.util.Set; - - - public class ResXmlStartElement extends BaseXmlChunk { - private final ShortItem mAttributeStart; - private final ShortItem mAttributeUnitSize; - private final ShortItem mAttributeCount; - private final ShortItem mIdAttributePosition; - private final ShortItem mClassAttributePosition; - private final ShortItem mStyleAttributePosition; - private final ResXmlAttributeArray mAttributeArray; - private ResXmlEndElement mResXmlEndElement; - public ResXmlStartElement() { - super(ChunkType.XML_START_ELEMENT, 7); - mAttributeStart=new ShortItem(ATTRIBUTES_DEFAULT_START); - mAttributeUnitSize =new ShortItem(ATTRIBUTES_UNIT_SIZE); - mAttributeCount=new ShortItem(); - mIdAttributePosition =new ShortItem(); - mClassAttributePosition=new ShortItem(); - mStyleAttributePosition=new ShortItem(); - mAttributeArray=new ResXmlAttributeArray(getHeaderBlock(), mAttributeStart, mAttributeCount); - addChild(mAttributeStart); - addChild(mAttributeUnitSize); - addChild(mAttributeCount); - addChild(mIdAttributePosition); - addChild(mClassAttributePosition); - addChild(mStyleAttributePosition); - addChild(mAttributeArray); - } - public ResXmlAttribute newAttribute(){ - ResXmlAttributeArray attributeArray = getResXmlAttributeArray(); - return attributeArray.createNext(); - } - @Override - void linkStringReferences(){ - super.linkStringReferences(); - ResXmlEndElement end = getResXmlEndElement(); - if(end!=null){ - end.linkStringReferences(); - } - for(ResXmlAttribute attr:listResXmlAttributes()){ - attr.linkStringReferences(); - } - } - @Override - Set clearStringReferences(){ - Set results=super.clearStringReferences(); - ResXmlEndElement end = getResXmlEndElement(); - if(end!=null){ - results.addAll(end.clearStringReferences()); - } - for(ResXmlAttribute attr:listResXmlAttributes()){ - results.addAll(attr.clearStringReferences()); - } - return results; - } - @Override - protected void onPreRefreshRefresh(){ - sortAttributes(); - } - private void sortAttributes(){ - ResXmlAttributeArray array = getResXmlAttributeArray(); - - ResXmlAttribute idAttribute=array.get(mIdAttributePosition.get()-1); - ResXmlAttribute classAttribute=array.get(mClassAttributePosition.get()-1); - ResXmlAttribute styleAttribute=array.get(mStyleAttributePosition.get()-1); - - array.sortAttributes(); - if(idAttribute!=null){ - mIdAttributePosition.set((short) (idAttribute.getIndex()+1)); - } - if(classAttribute!=null){ - mClassAttributePosition.set((short) (classAttribute.getIndex()+1)); - // In case obfuscation - if(!ATTRIBUTE_NAME_CLASS.equals(classAttribute.getName())){ - classAttribute.setName(ATTRIBUTE_NAME_CLASS, 0); - } - } - if(styleAttribute!=null){ - mStyleAttributePosition.set((short) (styleAttribute.getIndex()+1)); - // In case obfuscation - if(!ATTRIBUTE_NAME_STYLE.equals(styleAttribute.getName())){ - styleAttribute.setName(ATTRIBUTE_NAME_STYLE, 0); - } - } - } - void calculatePositions(){ - ResXmlAttribute idAttribute=getAttribute(ATTRIBUTE_RESOURCE_ID_id); - ResXmlAttribute classAttribute=getNoIdAttribute(ATTRIBUTE_NAME_CLASS); - ResXmlAttribute styleAttribute=getNoIdAttribute(ATTRIBUTE_NAME_STYLE); - - if(idAttribute!=null){ - mIdAttributePosition.set((short) (idAttribute.getIndex()+1)); - } - if(classAttribute!=null){ - mClassAttributePosition.set((short) (classAttribute.getIndex()+1)); - } - if(styleAttribute!=null){ - mStyleAttributePosition.set((short) (styleAttribute.getIndex()+1)); - } - } - public ResXmlAttribute getAttribute(int resourceId){ - for(ResXmlAttribute attribute:listResXmlAttributes()){ - if(resourceId==attribute.getNameResourceID()){ - return attribute; - } - } - return null; - } - private ResXmlAttribute getNoIdAttribute(String name){ - for(ResXmlAttribute attribute:listResXmlAttributes()){ - if(attribute.getNameResourceID()!=0){ - continue; - } - if(name.equals(attribute.getName())){ - return attribute; - } - } - return null; - } - public ResXmlAttribute getAttribute(String uri, String name){ - if(name==null){ - return null; - } - for(ResXmlAttribute attribute:listResXmlAttributes()){ - if(name.equals(attribute.getName())||name.equals(attribute.getFullName())){ - if(uri!=null){ - if(uri.equals(attribute.getUri())){ - return attribute; - } - continue; - } - return attribute; - } - } - return null; - } - public ResXmlAttribute searchAttributeByName(String name){ - if(name==null){ - return null; - } - for(ResXmlAttribute attribute:listResXmlAttributes()){ - if(name.equals(attribute.getFullName()) || name.equals(attribute.getName())){ - return attribute; - } - } - return null; - } - public ResXmlAttribute searchAttributeByResourceId(int resourceId){ - if(resourceId==0){ - return null; - } - for(ResXmlAttribute attribute:listResXmlAttributes()){ - if(resourceId==attribute.getNameResourceID()){ - return attribute; - } - } - return null; - } - public String getTagName(){ - String prefix=getPrefix(); - String name=getName(); - if(prefix==null){ - return name; - } - return prefix+":"+name; - } - public void setName(String name){ - setString(name); - ResXmlEndElement endElement = getResXmlEndElement(); - if(endElement!=null){ - endElement.setString(name); - } - } - public Collection listResXmlAttributes(){ - return getResXmlAttributeArray().listItems(); - } - public ResXmlAttributeArray getResXmlAttributeArray(){ - return mAttributeArray; - } - - public String getUri(){ - int uriRef=getNamespaceReference(); - if(uriRef<0){ - return null; - } - ResXmlElement parentElement=getParentResXmlElement(); - ResXmlStartNamespace startNamespace=parentElement.getStartNamespaceByUriRef(uriRef); - if(startNamespace!=null){ - return startNamespace.getUri(); - } - return null; - } - public String getPrefix(){ - int uriRef=getNamespaceReference(); - if(uriRef<0){ - return null; - } - ResXmlElement parentElement=getParentResXmlElement(); - ResXmlStartNamespace startNamespace=parentElement.getStartNamespaceByUriRef(uriRef); - if(startNamespace!=null){ - return startNamespace.getPrefix(); - } - return null; - } - public void setResXmlEndElement(ResXmlEndElement element){ - mResXmlEndElement=element; - } - public ResXmlEndElement getResXmlEndElement(){ - return mResXmlEndElement; - } - - @Override - protected void onChunkRefreshed() { - refreshAttributeStart(); - refreshAttributeCount(); - } - private void refreshAttributeStart(){ - int start=countUpTo(mAttributeArray); - start=start-getHeaderBlock().getHeaderSize(); - mAttributeStart.set((short)start); - } - private void refreshAttributeCount(){ - int count=mAttributeArray.childesCount(); - mAttributeCount.set((short)count); - } - - @Override - public String toString(){ - String txt=getTagName(); - if(txt==null){ - return super.toString(); - } - StringBuilder builder=new StringBuilder(); - builder.append(txt); - ResXmlAttribute[] allAttr=mAttributeArray.getChildes(); - if(allAttr!=null){ - for(int i=0;i10){ - break; - } - builder.append(" "); - builder.append(allAttr[i].toString()); - } - } - return builder.toString(); - } - - private static final short ATTRIBUTES_UNIT_SIZE=20; - private static final short ATTRIBUTES_DEFAULT_START=20; - /* - * Find another way to mark an attribute is class, device actually relies on - * value of mClassAttributePosition */ - private static final String ATTRIBUTE_NAME_CLASS="class"; - /* - * Find another way to mark an attribute is style, device actually relies on - * value of mStyleAttributePosition */ - private static final String ATTRIBUTE_NAME_STYLE="style"; - /* - * Resource id value of attribute 'android:id' - * instead of relying on hardcoded value, we should find another way to - * mark an attribute is 'id' */ - private static final int ATTRIBUTE_RESOURCE_ID_id =0x010100d0; -} diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlStartNamespace.java b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlStartNamespace.java deleted file mode 100755 index d45b689..0000000 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlStartNamespace.java +++ /dev/null @@ -1,70 +0,0 @@ - /* - * Copyright (C) 2022 github.com/REAndroid - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.reandroid.lib.arsc.chunk.xml; - -import com.reandroid.lib.arsc.chunk.ChunkType; -import com.reandroid.lib.arsc.item.ResXmlString; -import com.reandroid.xml.NameSpaceItem; -import com.reandroid.xml.SchemaAttr; -import com.reandroid.xml.XMLAttribute; - -import java.util.Set; - - public class ResXmlStartNamespace extends ResXmlNamespace { - public ResXmlStartNamespace() { - super(ChunkType.XML_START_NAMESPACE); - } - public ResXmlEndNamespace getEnd(){ - return getPair(); - } - public void setEnd(ResXmlEndNamespace namespace){ - setPair(namespace); - } - @Override - void linkStringReferences(){ - super.linkStringReferences(); - ResXmlEndNamespace end = getEnd(); - if(end!=null){ - end.linkStringReferences(); - } - } - @Override - Set clearStringReferences(){ - Set results=super.clearStringReferences(); - ResXmlEndNamespace end = getEnd(); - if(end!=null){ - results.addAll(end.clearStringReferences()); - } - return results; - } - public XMLAttribute decodeToXml(){ - String uri=getUri(); - String prefix=getPrefix(); - if(isEmpty(uri) || isEmpty(prefix)){ - return null; - } - SchemaAttr schemaAttr=new SchemaAttr(prefix, uri); - schemaAttr.setLineNumber(getLineNumber()); - return schemaAttr; - } - private boolean isEmpty(String txt){ - if(txt==null){ - return true; - } - txt=txt.trim(); - return txt.length()==0; - } -} diff --git a/src/main/java/com/reandroid/xml/parser/MXParser.java b/src/main/java/com/reandroid/xml/parser/MXParser.java index e1257a2..f1e0131 100644 --- a/src/main/java/com/reandroid/xml/parser/MXParser.java +++ b/src/main/java/com/reandroid/xml/parser/MXParser.java @@ -14,8 +14,6 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.UnsupportedEncodingException; -import com.reandroid.xml.parser.XmlPullParser; -import com.reandroid.xml.parser.XmlPullParserException; public class MXParser implements XmlPullParser {