From 56f2badace2578ebfea01d09d8e7d4c2385bbcdf Mon Sep 17 00:00:00 2001 From: 327135569 Date: Wed, 7 Apr 2021 11:57:45 +0800 Subject: [PATCH] move project --- {apksigner => loader/apksigner}/.gitignore | 0 {apksigner => loader/apksigner}/build.gradle | 0 .../java/com/android/apksig/ApkSigner.java | 0 .../com/android/apksig/ApkSignerEngine.java | 0 .../java/com/android/apksig/ApkVerifier.java | 0 .../apksig/DefaultApkSignerEngine.java | 0 .../main/java/com/android/apksig/Hints.java | 0 .../apksig/SigningCertificateLineage.java | 0 .../apksig/apk/ApkFormatException.java | 0 .../apk/ApkSigningBlockNotFoundException.java | 0 .../java/com/android/apksig/apk/ApkUtils.java | 0 .../apk/CodenameMinSdkVersionException.java | 0 .../apksig/apk/MinSdkVersionException.java | 0 .../com/android/apksig/internal/Supplier.java | 0 .../internal/apk/AndroidBinXmlParser.java | 0 .../internal/apk/ApkSigningBlockUtils.java | 0 .../internal/apk/ContentDigestAlgorithm.java | 0 .../internal/apk/SignatureAlgorithm.java | 0 .../apksig/internal/apk/SignatureInfo.java | 0 .../internal/apk/v1/DigestAlgorithm.java | 0 .../internal/apk/v1/V1SchemeSigner.java | 0 .../internal/apk/v1/V1SchemeVerifier.java | 0 .../internal/apk/v2/V2SchemeSigner.java | 0 .../internal/apk/v2/V2SchemeVerifier.java | 0 .../internal/apk/v3/V3SchemeSigner.java | 0 .../internal/apk/v3/V3SchemeVerifier.java | 0 .../apk/v3/V3SigningCertificateLineage.java | 0 .../apksig/internal/asn1/Asn1BerParser.java | 0 .../apksig/internal/asn1/Asn1Class.java | 0 .../internal/asn1/Asn1DecodingException.java | 0 .../apksig/internal/asn1/Asn1DerEncoder.java | 0 .../internal/asn1/Asn1EncodingException.java | 0 .../apksig/internal/asn1/Asn1Field.java | 0 .../internal/asn1/Asn1OpaqueObject.java | 0 .../apksig/internal/asn1/Asn1TagClass.java | 0 .../apksig/internal/asn1/Asn1Tagging.java | 0 .../apksig/internal/asn1/Asn1Type.java | 0 .../internal/asn1/ber/BerDataValue.java | 0 .../asn1/ber/BerDataValueFormatException.java | 0 .../internal/asn1/ber/BerDataValueReader.java | 0 .../apksig/internal/asn1/ber/BerEncoding.java | 0 .../ber/ByteBufferBerDataValueReader.java | 0 .../ber/InputStreamBerDataValueReader.java | 0 .../apksig/internal/jar/ManifestParser.java | 0 .../apksig/internal/jar/ManifestWriter.java | 0 .../internal/jar/SignatureFileWriter.java | 0 .../internal/pkcs7/AlgorithmIdentifier.java | 0 .../apksig/internal/pkcs7/Attribute.java | 0 .../apksig/internal/pkcs7/ContentInfo.java | 0 .../pkcs7/EncapsulatedContentInfo.java | 0 .../internal/pkcs7/IssuerAndSerialNumber.java | 0 .../apksig/internal/pkcs7/Pkcs7Constants.java | 0 .../pkcs7/Pkcs7DecodingException.java | 0 .../apksig/internal/pkcs7/SignedData.java | 0 .../internal/pkcs7/SignerIdentifier.java | 0 .../apksig/internal/pkcs7/SignerInfo.java | 0 .../internal/util/AndroidSdkVersion.java | 0 .../android/apksig/internal/util/Base64.java | 0 .../internal/util/ByteArrayDataSink.java | 0 .../internal/util/ByteBufferDataSource.java | 0 .../apksig/internal/util/ByteBufferSink.java | 0 .../apksig/internal/util/ByteBufferUtils.java | 0 .../apksig/internal/util/ByteStreams.java | 0 .../internal/util/ChainedDataSource.java | 0 .../util/DelegatingX509Certificate.java | 0 .../internal/util/FileChannelDataSource.java | 0 .../GuaranteedEncodedFormX509Certificate.java | 0 .../internal/util/InclusiveIntRange.java | 0 .../internal/util/MessageDigestSink.java | 0 .../internal/util/OutputStreamDataSink.java | 0 .../android/apksig/internal/util/Pair.java | 0 .../util/RandomAccessFileDataSink.java | 0 .../apksig/internal/util/TeeDataSink.java | 0 .../internal/util/VerityTreeBuilder.java | 0 .../internal/util/X509CertificateUtils.java | 0 .../internal/x509/AttributeTypeAndValue.java | 0 .../apksig/internal/x509/Certificate.java | 0 .../apksig/internal/x509/Extension.java | 0 .../android/apksig/internal/x509/Name.java | 0 .../apksig/internal/x509/RSAPublicKey.java | 0 .../x509/RelativeDistinguishedName.java | 0 .../internal/x509/SubjectPublicKeyInfo.java | 0 .../apksig/internal/x509/TBSCertificate.java | 0 .../android/apksig/internal/x509/Time.java | 0 .../apksig/internal/x509/Validity.java | 0 .../internal/zip/CentralDirectoryRecord.java | 0 .../apksig/internal/zip/EocdRecord.java | 0 .../apksig/internal/zip/LocalFileRecord.java | 0 .../android/apksig/internal/zip/ZipUtils.java | 0 .../com/android/apksig/util/DataSink.java | 0 .../com/android/apksig/util/DataSinks.java | 0 .../com/android/apksig/util/DataSource.java | 0 .../com/android/apksig/util/DataSources.java | 0 .../android/apksig/util/ReadableDataSink.java | 0 .../apksig/util/RunnablesExecutor.java | 0 .../apksig/util/RunnablesProvider.java | 0 .../apksig/zip/ZipFormatException.java | 0 .../com/android/apksigner/ApkSignerTool.java | 0 .../com/android/apksigner/HexEncoding.java | 0 .../com/android/apksigner/OptionsParser.java | 0 .../android/apksigner/ParameterException.java | 0 .../android/apksigner/PasswordRetriever.java | 0 .../com/android/apksigner/SignerParams.java | 0 .../main/java/com/android/apksigner/help.txt | 0 .../com/android/apksigner/help_lineage.txt | 0 .../com/android/apksigner/help_rotate.txt | 0 .../java/com/android/apksigner/help_sign.txt | 0 .../com/android/apksigner/help_verify.txt | 0 .../axmlprinter}/.gitignore | 0 .../axmlprinter}/build.gradle | 0 .../content/res/AXmlResourceParser.java | 1864 ++++++++--------- .../wind/android/content/res/ChunkUtil.java | 72 +- .../wind/android/content/res/IntReader.java | 0 .../wind/android/content/res/StringBlock.java | 0 .../content/res/XmlResourceParser.java | 54 +- .../java/wind/android/util/AttributeSet.java | 98 +- .../java/wind/android/util/TypedValue.java | 142 +- .../src/main/java/wind/test/AXMLPrinter.java | 338 +-- .../src/main/java/wind/v1/XmlPullParser.java | 0 .../java/wind/v1/XmlPullParserException.java | 0 .../java/wind/v1/XmlPullParserFactory.java | 0 .../src/main/java/wind/v1/XmlSerializer.java | 0 122 files changed, 1284 insertions(+), 1284 deletions(-) rename {apksigner => loader/apksigner}/.gitignore (100%) rename {apksigner => loader/apksigner}/build.gradle (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/ApkSigner.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/ApkSignerEngine.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/ApkVerifier.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/DefaultApkSignerEngine.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/Hints.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/SigningCertificateLineage.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/apk/ApkFormatException.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/apk/ApkSigningBlockNotFoundException.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/apk/ApkUtils.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/apk/CodenameMinSdkVersionException.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/apk/MinSdkVersionException.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/Supplier.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/apk/AndroidBinXmlParser.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtils.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/apk/ContentDigestAlgorithm.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/apk/SignatureAlgorithm.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/apk/SignatureInfo.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/apk/v1/DigestAlgorithm.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeSigner.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeSigner.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeVerifier.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeSigner.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeVerifier.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/apk/v3/V3SigningCertificateLineage.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/Asn1BerParser.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/Asn1Class.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/Asn1DecodingException.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/Asn1DerEncoder.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/Asn1EncodingException.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/Asn1Field.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/Asn1OpaqueObject.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/Asn1TagClass.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/Asn1Tagging.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/Asn1Type.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValue.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueFormatException.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueReader.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/ber/BerEncoding.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/ber/ByteBufferBerDataValueReader.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/asn1/ber/InputStreamBerDataValueReader.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/jar/ManifestParser.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/jar/ManifestWriter.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/jar/SignatureFileWriter.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/pkcs7/AlgorithmIdentifier.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/pkcs7/Attribute.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/pkcs7/ContentInfo.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/pkcs7/EncapsulatedContentInfo.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/pkcs7/IssuerAndSerialNumber.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7Constants.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7DecodingException.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/pkcs7/SignedData.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/pkcs7/SignerIdentifier.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/pkcs7/SignerInfo.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/AndroidSdkVersion.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/Base64.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/ByteArrayDataSink.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/ByteBufferDataSource.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/ByteBufferSink.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/ByteBufferUtils.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/ByteStreams.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/ChainedDataSource.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/DelegatingX509Certificate.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/FileChannelDataSource.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/GuaranteedEncodedFormX509Certificate.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/InclusiveIntRange.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/MessageDigestSink.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/OutputStreamDataSink.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/Pair.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/RandomAccessFileDataSink.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/TeeDataSink.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/VerityTreeBuilder.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/util/X509CertificateUtils.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/x509/AttributeTypeAndValue.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/x509/Certificate.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/x509/Extension.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/x509/Name.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/x509/RSAPublicKey.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/x509/RelativeDistinguishedName.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/x509/SubjectPublicKeyInfo.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/x509/TBSCertificate.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/x509/Time.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/x509/Validity.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/zip/CentralDirectoryRecord.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/zip/EocdRecord.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/zip/LocalFileRecord.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/internal/zip/ZipUtils.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/util/DataSink.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/util/DataSinks.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/util/DataSource.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/util/DataSources.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/util/ReadableDataSink.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/util/RunnablesExecutor.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/util/RunnablesProvider.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksig/zip/ZipFormatException.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksigner/ApkSignerTool.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksigner/HexEncoding.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksigner/OptionsParser.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksigner/ParameterException.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksigner/PasswordRetriever.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksigner/SignerParams.java (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksigner/help.txt (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksigner/help_lineage.txt (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksigner/help_rotate.txt (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksigner/help_sign.txt (100%) rename {apksigner => loader/apksigner}/src/main/java/com/android/apksigner/help_verify.txt (100%) rename {axmlprinter => loader/axmlprinter}/.gitignore (100%) rename {axmlprinter => loader/axmlprinter}/build.gradle (100%) rename {axmlprinter => loader/axmlprinter}/src/main/java/wind/android/content/res/AXmlResourceParser.java (96%) rename {axmlprinter => loader/axmlprinter}/src/main/java/wind/android/content/res/ChunkUtil.java (96%) rename {axmlprinter => loader/axmlprinter}/src/main/java/wind/android/content/res/IntReader.java (100%) mode change 100755 => 100644 rename {axmlprinter => loader/axmlprinter}/src/main/java/wind/android/content/res/StringBlock.java (100%) mode change 100755 => 100644 rename {axmlprinter => loader/axmlprinter}/src/main/java/wind/android/content/res/XmlResourceParser.java (96%) rename {axmlprinter => loader/axmlprinter}/src/main/java/wind/android/util/AttributeSet.java (97%) rename {axmlprinter => loader/axmlprinter}/src/main/java/wind/android/util/TypedValue.java (96%) rename {axmlprinter => loader/axmlprinter}/src/main/java/wind/test/AXMLPrinter.java (96%) rename {axmlprinter => loader/axmlprinter}/src/main/java/wind/v1/XmlPullParser.java (100%) rename {axmlprinter => loader/axmlprinter}/src/main/java/wind/v1/XmlPullParserException.java (100%) rename {axmlprinter => loader/axmlprinter}/src/main/java/wind/v1/XmlPullParserFactory.java (100%) rename {axmlprinter => loader/axmlprinter}/src/main/java/wind/v1/XmlSerializer.java (100%) diff --git a/apksigner/.gitignore b/loader/apksigner/.gitignore similarity index 100% rename from apksigner/.gitignore rename to loader/apksigner/.gitignore diff --git a/apksigner/build.gradle b/loader/apksigner/build.gradle similarity index 100% rename from apksigner/build.gradle rename to loader/apksigner/build.gradle diff --git a/apksigner/src/main/java/com/android/apksig/ApkSigner.java b/loader/apksigner/src/main/java/com/android/apksig/ApkSigner.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/ApkSigner.java rename to loader/apksigner/src/main/java/com/android/apksig/ApkSigner.java diff --git a/apksigner/src/main/java/com/android/apksig/ApkSignerEngine.java b/loader/apksigner/src/main/java/com/android/apksig/ApkSignerEngine.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/ApkSignerEngine.java rename to loader/apksigner/src/main/java/com/android/apksig/ApkSignerEngine.java diff --git a/apksigner/src/main/java/com/android/apksig/ApkVerifier.java b/loader/apksigner/src/main/java/com/android/apksig/ApkVerifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/ApkVerifier.java rename to loader/apksigner/src/main/java/com/android/apksig/ApkVerifier.java diff --git a/apksigner/src/main/java/com/android/apksig/DefaultApkSignerEngine.java b/loader/apksigner/src/main/java/com/android/apksig/DefaultApkSignerEngine.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/DefaultApkSignerEngine.java rename to loader/apksigner/src/main/java/com/android/apksig/DefaultApkSignerEngine.java diff --git a/apksigner/src/main/java/com/android/apksig/Hints.java b/loader/apksigner/src/main/java/com/android/apksig/Hints.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/Hints.java rename to loader/apksigner/src/main/java/com/android/apksig/Hints.java diff --git a/apksigner/src/main/java/com/android/apksig/SigningCertificateLineage.java b/loader/apksigner/src/main/java/com/android/apksig/SigningCertificateLineage.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/SigningCertificateLineage.java rename to loader/apksigner/src/main/java/com/android/apksig/SigningCertificateLineage.java diff --git a/apksigner/src/main/java/com/android/apksig/apk/ApkFormatException.java b/loader/apksigner/src/main/java/com/android/apksig/apk/ApkFormatException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/apk/ApkFormatException.java rename to loader/apksigner/src/main/java/com/android/apksig/apk/ApkFormatException.java diff --git a/apksigner/src/main/java/com/android/apksig/apk/ApkSigningBlockNotFoundException.java b/loader/apksigner/src/main/java/com/android/apksig/apk/ApkSigningBlockNotFoundException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/apk/ApkSigningBlockNotFoundException.java rename to loader/apksigner/src/main/java/com/android/apksig/apk/ApkSigningBlockNotFoundException.java diff --git a/apksigner/src/main/java/com/android/apksig/apk/ApkUtils.java b/loader/apksigner/src/main/java/com/android/apksig/apk/ApkUtils.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/apk/ApkUtils.java rename to loader/apksigner/src/main/java/com/android/apksig/apk/ApkUtils.java diff --git a/apksigner/src/main/java/com/android/apksig/apk/CodenameMinSdkVersionException.java b/loader/apksigner/src/main/java/com/android/apksig/apk/CodenameMinSdkVersionException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/apk/CodenameMinSdkVersionException.java rename to loader/apksigner/src/main/java/com/android/apksig/apk/CodenameMinSdkVersionException.java diff --git a/apksigner/src/main/java/com/android/apksig/apk/MinSdkVersionException.java b/loader/apksigner/src/main/java/com/android/apksig/apk/MinSdkVersionException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/apk/MinSdkVersionException.java rename to loader/apksigner/src/main/java/com/android/apksig/apk/MinSdkVersionException.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/Supplier.java b/loader/apksigner/src/main/java/com/android/apksig/internal/Supplier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/Supplier.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/Supplier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/AndroidBinXmlParser.java b/loader/apksigner/src/main/java/com/android/apksig/internal/apk/AndroidBinXmlParser.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/AndroidBinXmlParser.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/apk/AndroidBinXmlParser.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtils.java b/loader/apksigner/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtils.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtils.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/apk/ApkSigningBlockUtils.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/ContentDigestAlgorithm.java b/loader/apksigner/src/main/java/com/android/apksig/internal/apk/ContentDigestAlgorithm.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/ContentDigestAlgorithm.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/apk/ContentDigestAlgorithm.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/SignatureAlgorithm.java b/loader/apksigner/src/main/java/com/android/apksig/internal/apk/SignatureAlgorithm.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/SignatureAlgorithm.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/apk/SignatureAlgorithm.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/SignatureInfo.java b/loader/apksigner/src/main/java/com/android/apksig/internal/apk/SignatureInfo.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/SignatureInfo.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/apk/SignatureInfo.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v1/DigestAlgorithm.java b/loader/apksigner/src/main/java/com/android/apksig/internal/apk/v1/DigestAlgorithm.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v1/DigestAlgorithm.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/apk/v1/DigestAlgorithm.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeSigner.java b/loader/apksigner/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeSigner.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeSigner.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeSigner.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java b/loader/apksigner/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/apk/v1/V1SchemeVerifier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeSigner.java b/loader/apksigner/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeSigner.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeSigner.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeSigner.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeVerifier.java b/loader/apksigner/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeVerifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeVerifier.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/apk/v2/V2SchemeVerifier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeSigner.java b/loader/apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeSigner.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeSigner.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeSigner.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeVerifier.java b/loader/apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeVerifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeVerifier.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SchemeVerifier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SigningCertificateLineage.java b/loader/apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SigningCertificateLineage.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SigningCertificateLineage.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/apk/v3/V3SigningCertificateLineage.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1BerParser.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1BerParser.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1BerParser.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1BerParser.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Class.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Class.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Class.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Class.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1DecodingException.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1DecodingException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1DecodingException.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1DecodingException.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1DerEncoder.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1DerEncoder.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1DerEncoder.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1DerEncoder.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1EncodingException.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1EncodingException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1EncodingException.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1EncodingException.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Field.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Field.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Field.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Field.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1OpaqueObject.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1OpaqueObject.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1OpaqueObject.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1OpaqueObject.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1TagClass.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1TagClass.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1TagClass.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1TagClass.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Tagging.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Tagging.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Tagging.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Tagging.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Type.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Type.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Type.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/Asn1Type.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValue.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValue.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValue.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValue.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueFormatException.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueFormatException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueFormatException.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueFormatException.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueReader.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueReader.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueReader.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerDataValueReader.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerEncoding.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerEncoding.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerEncoding.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/BerEncoding.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/ByteBufferBerDataValueReader.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/ByteBufferBerDataValueReader.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/ber/ByteBufferBerDataValueReader.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/ByteBufferBerDataValueReader.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/InputStreamBerDataValueReader.java b/loader/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/InputStreamBerDataValueReader.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/asn1/ber/InputStreamBerDataValueReader.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/asn1/ber/InputStreamBerDataValueReader.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/jar/ManifestParser.java b/loader/apksigner/src/main/java/com/android/apksig/internal/jar/ManifestParser.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/jar/ManifestParser.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/jar/ManifestParser.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/jar/ManifestWriter.java b/loader/apksigner/src/main/java/com/android/apksig/internal/jar/ManifestWriter.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/jar/ManifestWriter.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/jar/ManifestWriter.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/jar/SignatureFileWriter.java b/loader/apksigner/src/main/java/com/android/apksig/internal/jar/SignatureFileWriter.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/jar/SignatureFileWriter.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/jar/SignatureFileWriter.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/AlgorithmIdentifier.java b/loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/AlgorithmIdentifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/AlgorithmIdentifier.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/AlgorithmIdentifier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/Attribute.java b/loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/Attribute.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/Attribute.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/Attribute.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/ContentInfo.java b/loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/ContentInfo.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/ContentInfo.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/ContentInfo.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/EncapsulatedContentInfo.java b/loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/EncapsulatedContentInfo.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/EncapsulatedContentInfo.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/EncapsulatedContentInfo.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/IssuerAndSerialNumber.java b/loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/IssuerAndSerialNumber.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/IssuerAndSerialNumber.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/IssuerAndSerialNumber.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7Constants.java b/loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7Constants.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7Constants.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7Constants.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7DecodingException.java b/loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7DecodingException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7DecodingException.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/Pkcs7DecodingException.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignedData.java b/loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignedData.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignedData.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignedData.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignerIdentifier.java b/loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignerIdentifier.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignerIdentifier.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignerIdentifier.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignerInfo.java b/loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignerInfo.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignerInfo.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/pkcs7/SignerInfo.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/AndroidSdkVersion.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/AndroidSdkVersion.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/AndroidSdkVersion.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/AndroidSdkVersion.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/Base64.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/Base64.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/Base64.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/Base64.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/ByteArrayDataSink.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/ByteArrayDataSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/ByteArrayDataSink.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/ByteArrayDataSink.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferDataSource.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferDataSource.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferDataSource.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferDataSource.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferSink.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferSink.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferSink.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferUtils.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferUtils.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferUtils.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/ByteBufferUtils.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/ByteStreams.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/ByteStreams.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/ByteStreams.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/ByteStreams.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/ChainedDataSource.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/ChainedDataSource.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/ChainedDataSource.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/ChainedDataSource.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/DelegatingX509Certificate.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/DelegatingX509Certificate.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/DelegatingX509Certificate.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/DelegatingX509Certificate.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/FileChannelDataSource.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/FileChannelDataSource.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/FileChannelDataSource.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/FileChannelDataSource.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/GuaranteedEncodedFormX509Certificate.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/GuaranteedEncodedFormX509Certificate.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/GuaranteedEncodedFormX509Certificate.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/GuaranteedEncodedFormX509Certificate.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/InclusiveIntRange.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/InclusiveIntRange.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/InclusiveIntRange.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/InclusiveIntRange.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/MessageDigestSink.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/MessageDigestSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/MessageDigestSink.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/MessageDigestSink.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/OutputStreamDataSink.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/OutputStreamDataSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/OutputStreamDataSink.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/OutputStreamDataSink.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/Pair.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/Pair.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/Pair.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/Pair.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/RandomAccessFileDataSink.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/RandomAccessFileDataSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/RandomAccessFileDataSink.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/RandomAccessFileDataSink.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/TeeDataSink.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/TeeDataSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/TeeDataSink.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/TeeDataSink.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/VerityTreeBuilder.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/VerityTreeBuilder.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/VerityTreeBuilder.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/VerityTreeBuilder.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/util/X509CertificateUtils.java b/loader/apksigner/src/main/java/com/android/apksig/internal/util/X509CertificateUtils.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/util/X509CertificateUtils.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/util/X509CertificateUtils.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/AttributeTypeAndValue.java b/loader/apksigner/src/main/java/com/android/apksig/internal/x509/AttributeTypeAndValue.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/AttributeTypeAndValue.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/x509/AttributeTypeAndValue.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/Certificate.java b/loader/apksigner/src/main/java/com/android/apksig/internal/x509/Certificate.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/Certificate.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/x509/Certificate.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/Extension.java b/loader/apksigner/src/main/java/com/android/apksig/internal/x509/Extension.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/Extension.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/x509/Extension.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/Name.java b/loader/apksigner/src/main/java/com/android/apksig/internal/x509/Name.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/Name.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/x509/Name.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/RSAPublicKey.java b/loader/apksigner/src/main/java/com/android/apksig/internal/x509/RSAPublicKey.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/RSAPublicKey.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/x509/RSAPublicKey.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/RelativeDistinguishedName.java b/loader/apksigner/src/main/java/com/android/apksig/internal/x509/RelativeDistinguishedName.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/RelativeDistinguishedName.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/x509/RelativeDistinguishedName.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/SubjectPublicKeyInfo.java b/loader/apksigner/src/main/java/com/android/apksig/internal/x509/SubjectPublicKeyInfo.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/SubjectPublicKeyInfo.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/x509/SubjectPublicKeyInfo.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/TBSCertificate.java b/loader/apksigner/src/main/java/com/android/apksig/internal/x509/TBSCertificate.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/TBSCertificate.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/x509/TBSCertificate.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/Time.java b/loader/apksigner/src/main/java/com/android/apksig/internal/x509/Time.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/Time.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/x509/Time.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/x509/Validity.java b/loader/apksigner/src/main/java/com/android/apksig/internal/x509/Validity.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/x509/Validity.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/x509/Validity.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/zip/CentralDirectoryRecord.java b/loader/apksigner/src/main/java/com/android/apksig/internal/zip/CentralDirectoryRecord.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/zip/CentralDirectoryRecord.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/zip/CentralDirectoryRecord.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/zip/EocdRecord.java b/loader/apksigner/src/main/java/com/android/apksig/internal/zip/EocdRecord.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/zip/EocdRecord.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/zip/EocdRecord.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/zip/LocalFileRecord.java b/loader/apksigner/src/main/java/com/android/apksig/internal/zip/LocalFileRecord.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/zip/LocalFileRecord.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/zip/LocalFileRecord.java diff --git a/apksigner/src/main/java/com/android/apksig/internal/zip/ZipUtils.java b/loader/apksigner/src/main/java/com/android/apksig/internal/zip/ZipUtils.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/internal/zip/ZipUtils.java rename to loader/apksigner/src/main/java/com/android/apksig/internal/zip/ZipUtils.java diff --git a/apksigner/src/main/java/com/android/apksig/util/DataSink.java b/loader/apksigner/src/main/java/com/android/apksig/util/DataSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/util/DataSink.java rename to loader/apksigner/src/main/java/com/android/apksig/util/DataSink.java diff --git a/apksigner/src/main/java/com/android/apksig/util/DataSinks.java b/loader/apksigner/src/main/java/com/android/apksig/util/DataSinks.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/util/DataSinks.java rename to loader/apksigner/src/main/java/com/android/apksig/util/DataSinks.java diff --git a/apksigner/src/main/java/com/android/apksig/util/DataSource.java b/loader/apksigner/src/main/java/com/android/apksig/util/DataSource.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/util/DataSource.java rename to loader/apksigner/src/main/java/com/android/apksig/util/DataSource.java diff --git a/apksigner/src/main/java/com/android/apksig/util/DataSources.java b/loader/apksigner/src/main/java/com/android/apksig/util/DataSources.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/util/DataSources.java rename to loader/apksigner/src/main/java/com/android/apksig/util/DataSources.java diff --git a/apksigner/src/main/java/com/android/apksig/util/ReadableDataSink.java b/loader/apksigner/src/main/java/com/android/apksig/util/ReadableDataSink.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/util/ReadableDataSink.java rename to loader/apksigner/src/main/java/com/android/apksig/util/ReadableDataSink.java diff --git a/apksigner/src/main/java/com/android/apksig/util/RunnablesExecutor.java b/loader/apksigner/src/main/java/com/android/apksig/util/RunnablesExecutor.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/util/RunnablesExecutor.java rename to loader/apksigner/src/main/java/com/android/apksig/util/RunnablesExecutor.java diff --git a/apksigner/src/main/java/com/android/apksig/util/RunnablesProvider.java b/loader/apksigner/src/main/java/com/android/apksig/util/RunnablesProvider.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/util/RunnablesProvider.java rename to loader/apksigner/src/main/java/com/android/apksig/util/RunnablesProvider.java diff --git a/apksigner/src/main/java/com/android/apksig/zip/ZipFormatException.java b/loader/apksigner/src/main/java/com/android/apksig/zip/ZipFormatException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksig/zip/ZipFormatException.java rename to loader/apksigner/src/main/java/com/android/apksig/zip/ZipFormatException.java diff --git a/apksigner/src/main/java/com/android/apksigner/ApkSignerTool.java b/loader/apksigner/src/main/java/com/android/apksigner/ApkSignerTool.java similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/ApkSignerTool.java rename to loader/apksigner/src/main/java/com/android/apksigner/ApkSignerTool.java diff --git a/apksigner/src/main/java/com/android/apksigner/HexEncoding.java b/loader/apksigner/src/main/java/com/android/apksigner/HexEncoding.java similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/HexEncoding.java rename to loader/apksigner/src/main/java/com/android/apksigner/HexEncoding.java diff --git a/apksigner/src/main/java/com/android/apksigner/OptionsParser.java b/loader/apksigner/src/main/java/com/android/apksigner/OptionsParser.java similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/OptionsParser.java rename to loader/apksigner/src/main/java/com/android/apksigner/OptionsParser.java diff --git a/apksigner/src/main/java/com/android/apksigner/ParameterException.java b/loader/apksigner/src/main/java/com/android/apksigner/ParameterException.java similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/ParameterException.java rename to loader/apksigner/src/main/java/com/android/apksigner/ParameterException.java diff --git a/apksigner/src/main/java/com/android/apksigner/PasswordRetriever.java b/loader/apksigner/src/main/java/com/android/apksigner/PasswordRetriever.java similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/PasswordRetriever.java rename to loader/apksigner/src/main/java/com/android/apksigner/PasswordRetriever.java diff --git a/apksigner/src/main/java/com/android/apksigner/SignerParams.java b/loader/apksigner/src/main/java/com/android/apksigner/SignerParams.java similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/SignerParams.java rename to loader/apksigner/src/main/java/com/android/apksigner/SignerParams.java diff --git a/apksigner/src/main/java/com/android/apksigner/help.txt b/loader/apksigner/src/main/java/com/android/apksigner/help.txt similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/help.txt rename to loader/apksigner/src/main/java/com/android/apksigner/help.txt diff --git a/apksigner/src/main/java/com/android/apksigner/help_lineage.txt b/loader/apksigner/src/main/java/com/android/apksigner/help_lineage.txt similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/help_lineage.txt rename to loader/apksigner/src/main/java/com/android/apksigner/help_lineage.txt diff --git a/apksigner/src/main/java/com/android/apksigner/help_rotate.txt b/loader/apksigner/src/main/java/com/android/apksigner/help_rotate.txt similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/help_rotate.txt rename to loader/apksigner/src/main/java/com/android/apksigner/help_rotate.txt diff --git a/apksigner/src/main/java/com/android/apksigner/help_sign.txt b/loader/apksigner/src/main/java/com/android/apksigner/help_sign.txt similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/help_sign.txt rename to loader/apksigner/src/main/java/com/android/apksigner/help_sign.txt diff --git a/apksigner/src/main/java/com/android/apksigner/help_verify.txt b/loader/apksigner/src/main/java/com/android/apksigner/help_verify.txt similarity index 100% rename from apksigner/src/main/java/com/android/apksigner/help_verify.txt rename to loader/apksigner/src/main/java/com/android/apksigner/help_verify.txt diff --git a/axmlprinter/.gitignore b/loader/axmlprinter/.gitignore similarity index 100% rename from axmlprinter/.gitignore rename to loader/axmlprinter/.gitignore diff --git a/axmlprinter/build.gradle b/loader/axmlprinter/build.gradle similarity index 100% rename from axmlprinter/build.gradle rename to loader/axmlprinter/build.gradle diff --git a/axmlprinter/src/main/java/wind/android/content/res/AXmlResourceParser.java b/loader/axmlprinter/src/main/java/wind/android/content/res/AXmlResourceParser.java similarity index 96% rename from axmlprinter/src/main/java/wind/android/content/res/AXmlResourceParser.java rename to loader/axmlprinter/src/main/java/wind/android/content/res/AXmlResourceParser.java index bc1e9c3..4bb6445 100644 --- a/axmlprinter/src/main/java/wind/android/content/res/AXmlResourceParser.java +++ b/loader/axmlprinter/src/main/java/wind/android/content/res/AXmlResourceParser.java @@ -1,932 +1,932 @@ -/* - * Copyright 2008 Android4ME - * - * 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 wind.android.content.res; - -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import wind.v1.XmlPullParserException; - -import wind.android.content.res.ChunkUtil; -import wind.android.content.res.IntReader; -import wind.android.content.res.StringBlock; -import wind.android.content.res.XmlResourceParser; -import wind.android.util.TypedValue; - -/** - * @author Dmitry Skiba - * - * Binary xml files parser. - * - * Parser has only two states: - * (1) Operational state, which parser obtains after first successful call - * to next() and retains until open(), close(), or failed call to next(). - * (2) Closed state, which parser obtains after open(), close(), or failed - * call to next(). In this state methods return invalid values or throw exceptions. - * - * TODO: - * * check all methods in closed state - * - */ -public class AXmlResourceParser implements XmlResourceParser { - - public AXmlResourceParser() { - resetEventInfo(); - } - - public void open(InputStream stream) { - close(); - if (stream!=null) { - m_reader=new wind.android.content.res.IntReader(stream,false); - } - } - - public void close() { - if (!m_operational) { - return; - } - m_operational=false; - m_reader.close(); - m_reader=null; - m_strings=null; - m_resourceIDs=null; - m_namespaces.reset(); - resetEventInfo(); - } - - /////////////////////////////////// iteration - - public int next() throws XmlPullParserException,IOException { - if (m_reader==null) { - throw new XmlPullParserException("Parser is not opened.",this,null); - } - try { - doNext(); - return m_event; - } - catch (IOException e) { - close(); - throw e; - } - } - - public int nextToken() throws XmlPullParserException,IOException { - return next(); - } - - public int nextTag() throws XmlPullParserException,IOException { - int eventType=next(); - if (eventType==TEXT && isWhitespace()) { - eventType=next(); - } - if (eventType!=START_TAG && eventType!=END_TAG) { - throw new XmlPullParserException("Expected start or end tag.",this,null); - } - return eventType; - } - - public String nextText() throws XmlPullParserException,IOException { - if(getEventType()!=START_TAG) { - throw new XmlPullParserException("Parser must be on START_TAG to read next text.",this,null); - } - int eventType=next(); - if (eventType==TEXT) { - String result=getText(); - eventType=next(); - if (eventType!=END_TAG) { - throw new XmlPullParserException("Event TEXT must be immediately followed by END_TAG.",this,null); - } - return result; - } else if (eventType==END_TAG) { - return ""; - } else { - throw new XmlPullParserException("Parser must be on START_TAG or TEXT to read text.",this,null); - } - } - - public void require(int type,String namespace,String name) throws XmlPullParserException,IOException { - if (type!=getEventType() || - (namespace!=null && !namespace.equals(getNamespace())) || - (name!=null && !name.equals(getName()))) - { - throw new XmlPullParserException(TYPES[type]+" is expected.",this,null); - } - } - - public int getDepth() { - return m_namespaces.getDepth()-1; - } - - public int getEventType() throws XmlPullParserException { - return m_event; - } - - public int getLineNumber() { - return m_lineNumber; - } - - public String getName() { - if (m_name==-1 || (m_event!=START_TAG && m_event!=END_TAG)) { - return null; - } - return m_strings.getString(m_name); - } - - public String getText() { - if (m_name==-1 || m_event!=TEXT) { - return null; - } - return m_strings.getString(m_name); - } - - public char[] getTextCharacters(int[] holderForStartAndLength) { - String text=getText(); - if (text==null) { - return null; - } - holderForStartAndLength[0]=0; - holderForStartAndLength[1]=text.length(); - char[] chars=new char[text.length()]; - text.getChars(0,text.length(),chars,0); - return chars; - } - - public String getNamespace() { - return m_strings.getString(m_namespaceUri); - } - - public String getPrefix() { - int prefix=m_namespaces.findPrefix(m_namespaceUri); - return m_strings.getString(prefix); - } - - public String getPositionDescription() { - return "XML line #"+getLineNumber(); - } - - public int getNamespaceCount(int depth) throws XmlPullParserException { - return m_namespaces.getAccumulatedCount(depth); - } - - public String getNamespacePrefix(int pos) throws XmlPullParserException { - int prefix=m_namespaces.getPrefix(pos); - return m_strings.getString(prefix); - } - - public String getNamespaceUri(int pos) throws XmlPullParserException { - int uri=m_namespaces.getUri(pos); - return m_strings.getString(uri); - } - - /////////////////////////////////// attributes - - public String getClassAttribute() { - if (m_classAttribute==-1) { - return null; - } - int offset=getAttributeOffset(m_classAttribute); - int value=m_attributes[offset+ATTRIBUTE_IX_VALUE_STRING]; - return m_strings.getString(value); - } - - public String getIdAttribute() { - if (m_idAttribute==-1) { - return null; - } - int offset=getAttributeOffset(m_idAttribute); - int value=m_attributes[offset+ATTRIBUTE_IX_VALUE_STRING]; - return m_strings.getString(value); - } - - public int getIdAttributeResourceValue(int defaultValue) { - if (m_idAttribute==-1) { - return defaultValue; - } - int offset=getAttributeOffset(m_idAttribute); - int valueType=m_attributes[offset+ATTRIBUTE_IX_VALUE_TYPE]; - if (valueType!=TypedValue.TYPE_REFERENCE) { - return defaultValue; - } - return m_attributes[offset+ATTRIBUTE_IX_VALUE_DATA]; - } - - public int getStyleAttribute() { - if (m_styleAttribute==-1) { - return 0; - } - int offset=getAttributeOffset(m_styleAttribute); - return m_attributes[offset+ATTRIBUTE_IX_VALUE_DATA]; - } - - public int getAttributeCount() { - if (m_event!=START_TAG) { - return -1; - } - return m_attributes.length/ATTRIBUTE_LENGHT; - } - - public String getAttributeNamespace(int index) { - int offset=getAttributeOffset(index); - int namespace=m_attributes[offset+ATTRIBUTE_IX_NAMESPACE_URI]; - if (namespace==-1) { - return ""; - } - return m_strings.getString(namespace); - } - - public String getAttributePrefix(int index) { - int offset=getAttributeOffset(index); - int uri=m_attributes[offset+ATTRIBUTE_IX_NAMESPACE_URI]; - int prefix=m_namespaces.findPrefix(uri); - if (prefix==-1) { - return ""; - } - return m_strings.getString(prefix); - } - - public String getAttributeName(int index) { - int offset=getAttributeOffset(index); - int name=m_attributes[offset+ATTRIBUTE_IX_NAME]; - if (name==-1) { - return ""; - } - return m_strings.getString(name); - } - - public int getAttributeNameResource(int index) { - int offset=getAttributeOffset(index); - int name=m_attributes[offset+ATTRIBUTE_IX_NAME]; - if (m_resourceIDs==null || - name<0 || name>=m_resourceIDs.length) - { - return 0; - } - return m_resourceIDs[name]; - } - - public int getAttributeValueType(int index) { - int offset=getAttributeOffset(index); - return m_attributes[offset+ATTRIBUTE_IX_VALUE_TYPE]; - } - - public int getAttributeValueData(int index) { - int offset=getAttributeOffset(index); - return m_attributes[offset+ATTRIBUTE_IX_VALUE_DATA]; - } - - public String getAttributeValue(int index) { - int offset=getAttributeOffset(index); - int valueType=m_attributes[offset+ATTRIBUTE_IX_VALUE_TYPE]; - if (valueType==TypedValue.TYPE_STRING) { - int valueString=m_attributes[offset+ATTRIBUTE_IX_VALUE_STRING]; - return m_strings.getString(valueString); - } - int valueData=m_attributes[offset+ATTRIBUTE_IX_VALUE_DATA]; - return "";//TypedValue.coerceToString(valueType,valueData); - } - - public boolean getAttributeBooleanValue(int index,boolean defaultValue) { - return getAttributeIntValue(index,defaultValue?1:0)!=0; - } - - public float getAttributeFloatValue(int index,float defaultValue) { - int offset=getAttributeOffset(index); - int valueType=m_attributes[offset+ATTRIBUTE_IX_VALUE_TYPE]; - if (valueType==TypedValue.TYPE_FLOAT) { - int valueData=m_attributes[offset+ATTRIBUTE_IX_VALUE_DATA]; - return Float.intBitsToFloat(valueData); - } - return defaultValue; - } - - public int getAttributeIntValue(int index,int defaultValue) { - int offset=getAttributeOffset(index); - int valueType=m_attributes[offset+ATTRIBUTE_IX_VALUE_TYPE]; - if (valueType>=TypedValue.TYPE_FIRST_INT && - valueType<=TypedValue.TYPE_LAST_INT) - { - return m_attributes[offset+ATTRIBUTE_IX_VALUE_DATA]; - } - return defaultValue; - } - - public int getAttributeUnsignedIntValue(int index,int defaultValue) { - return getAttributeIntValue(index,defaultValue); - } - - public int getAttributeResourceValue(int index,int defaultValue) { - int offset=getAttributeOffset(index); - int valueType=m_attributes[offset+ATTRIBUTE_IX_VALUE_TYPE]; - if (valueType==TypedValue.TYPE_REFERENCE) { - return m_attributes[offset+ATTRIBUTE_IX_VALUE_DATA]; - } - return defaultValue; - } - - public String getAttributeValue(String namespace,String attribute) { - int index=findAttribute(namespace,attribute); - if (index==-1) { - return null; - } - return getAttributeValue(index); - } - - public boolean getAttributeBooleanValue(String namespace,String attribute,boolean defaultValue) { - int index=findAttribute(namespace,attribute); - if (index==-1) { - return defaultValue; - } - return getAttributeBooleanValue(index,defaultValue); - } - - public float getAttributeFloatValue(String namespace,String attribute,float defaultValue) { - int index=findAttribute(namespace,attribute); - if (index==-1) { - return defaultValue; - } - return getAttributeFloatValue(index,defaultValue); - } - - public int getAttributeIntValue(String namespace,String attribute,int defaultValue) { - int index=findAttribute(namespace,attribute); - if (index==-1) { - return defaultValue; - } - return getAttributeIntValue(index,defaultValue); - } - - public int getAttributeUnsignedIntValue(String namespace,String attribute,int defaultValue) { - int index=findAttribute(namespace,attribute); - if (index==-1) { - return defaultValue; - } - return getAttributeUnsignedIntValue(index,defaultValue); - } - - public int getAttributeResourceValue(String namespace,String attribute,int defaultValue) { - int index=findAttribute(namespace,attribute); - if (index==-1) { - return defaultValue; - } - return getAttributeResourceValue(index,defaultValue); - } - - public int getAttributeListValue(int index,String[] options,int defaultValue) { - // TODO implement - return 0; - } - - public int getAttributeListValue(String namespace,String attribute,String[] options,int defaultValue) { - // TODO implement - return 0; - } - - public String getAttributeType(int index) { - return "CDATA"; - } - - public boolean isAttributeDefault(int index) { - return false; - } - - /////////////////////////////////// dummies - - public void setInput(InputStream stream,String inputEncoding) throws XmlPullParserException { - throw new XmlPullParserException(E_NOT_SUPPORTED); - } - public void setInput(Reader reader) throws XmlPullParserException { - throw new XmlPullParserException(E_NOT_SUPPORTED); - } - - public String getInputEncoding() { - return null; - } - - public int getColumnNumber() { - return -1; - } - - public boolean isEmptyElementTag() throws XmlPullParserException { - return false; - } - - public boolean isWhitespace() throws XmlPullParserException { - return false; - } - - public void defineEntityReplacementText(String entityName,String replacementText) throws XmlPullParserException { - throw new XmlPullParserException(E_NOT_SUPPORTED); - } - - public String getNamespace(String prefix) { - throw new RuntimeException(E_NOT_SUPPORTED); - } - - public Object getProperty(String name) { - return null; - } - public void setProperty(String name,Object value) throws XmlPullParserException { - throw new XmlPullParserException(E_NOT_SUPPORTED); - } - - public boolean getFeature(String feature) { - return false; - } - public void setFeature(String name,boolean value) throws XmlPullParserException { - throw new XmlPullParserException(E_NOT_SUPPORTED); - } - - ///////////////////////////////////////////// implementation - - /** - * Namespace stack, holds prefix+uri pairs, as well as - * depth information. - * All information is stored in one int[] array. - * Array consists of depth frames: - * Data=DepthFrame*; - * DepthFrame=Count+[Prefix+Uri]*+Count; - * Count='count of Prefix+Uri pairs'; - * Yes, count is stored twice, to enable bottom-up traversal. - * increaseDepth adds depth frame, decreaseDepth removes it. - * push/pop operations operate only in current depth frame. - * decreaseDepth removes any remaining (not pop'ed) namespace pairs. - * findXXX methods search all depth frames starting - * from the last namespace pair of current depth frame. - * All functions that operate with int, use -1 as 'invalid value'. - * - * !! functions expect 'prefix'+'uri' pairs, not 'uri'+'prefix' !! - * - */ - private static final class NamespaceStack { - public NamespaceStack() { - m_data=new int[32]; - } - - public final void reset() { - m_dataLength=0; - m_count=0; - m_depth=0; - } - - public final int getTotalCount() { - return m_count; - } - - public final int getCurrentCount() { - if (m_dataLength==0) { - return 0; - } - int offset=m_dataLength-1; - return m_data[offset]; - } - - public final int getAccumulatedCount(int depth) { - if (m_dataLength==0 || depth<0) { - return 0; - } - if (depth>m_depth) { - depth=m_depth; - } - int accumulatedCount=0; - int offset=0; - for (;depth!=0;--depth) { - int count=m_data[offset]; - accumulatedCount+=count; - offset+=(2+count*2); - } - return accumulatedCount; - } - - public final void push(int prefix,int uri) { - if (m_depth==0) { - increaseDepth(); - } - ensureDataCapacity(2); - int offset=m_dataLength-1; - int count=m_data[offset]; - m_data[offset-1-count*2]=count+1; - m_data[offset]=prefix; - m_data[offset+1]=uri; - m_data[offset+2]=count+1; - m_dataLength+=2; - m_count+=1; - } - - public final boolean pop(int prefix,int uri) { - if (m_dataLength==0) { - return false; - } - int offset=m_dataLength-1; - int count=m_data[offset]; - for (int i=0,o=offset-2;i!=count;++i,o-=2) { - if (m_data[o]!=prefix || m_data[o+1]!=uri) { - continue; - } - count-=1; - if (i==0) { - m_data[o]=count; - o-=(1+count*2); - m_data[o]=count; - } else { - m_data[offset]=count; - offset-=(1+2+count*2); - m_data[offset]=count; - System.arraycopy( - m_data,o+2, - m_data,o, - m_dataLength-o); - } - m_dataLength-=2; - m_count-=1; - return true; - } - return false; - } - - public final boolean pop() { - if (m_dataLength==0) { - return false; - } - int offset=m_dataLength-1; - int count=m_data[offset]; - if (count==0) { - return false; - } - count-=1; - offset-=2; - m_data[offset]=count; - offset-=(1+count*2); - m_data[offset]=count; - m_dataLength-=2; - m_count-=1; - return true; - } - - public final int getPrefix(int index) { - return get(index,true); - } - - public final int getUri(int index) { - return get(index,false); - } - - public final int findPrefix(int uri) { - return find(uri,false); - } - - public final int findUri(int prefix) { - return find(prefix,true); - } - - public final int getDepth() { - return m_depth; - } - - public final void increaseDepth() { - ensureDataCapacity(2); - int offset=m_dataLength; - m_data[offset]=0; - m_data[offset+1]=0; - m_dataLength+=2; - m_depth+=1; - } - public final void decreaseDepth() { - if (m_dataLength==0) { - return; - } - int offset=m_dataLength-1; - int count=m_data[offset]; - if ((offset-1-count*2)==0) { - return; - } - m_dataLength-=2+count*2; - m_count-=count; - m_depth-=1; - } - - private void ensureDataCapacity(int capacity) { - int available=(m_data.length-m_dataLength); - if (available>capacity) { - return; - } - int newLength=(m_data.length+available)*2; - int[] newData=new int[newLength]; - System.arraycopy(m_data,0,newData,0,m_dataLength); - m_data=newData; - } - - private final int find(int prefixOrUri,boolean prefix) { - if (m_dataLength==0) { - return -1; - } - int offset=m_dataLength-1; - for (int i=m_depth;i!=0;--i) { - int count=m_data[offset]; - offset-=2; - for (;count!=0;--count) { - if (prefix) { - if (m_data[offset]==prefixOrUri) { - return m_data[offset+1]; - } - } else { - if (m_data[offset+1]==prefixOrUri) { - return m_data[offset]; - } - } - offset-=2; - } - } - return -1; - } - - private final int get(int index,boolean prefix) { - if (m_dataLength==0 || index<0) { - return -1; - } - int offset=0; - for (int i=m_depth;i!=0;--i) { - int count=m_data[offset]; - if (index>=count) { - index-=count; - offset+=(2+count*2); - continue; - } - offset+=(1+index*2); - if (!prefix) { - offset+=1; - } - return m_data[offset]; - } - return -1; - } - - private int[] m_data; - private int m_dataLength; - private int m_count; - private int m_depth; - } - - /////////////////////////////////// package-visible - -// final void fetchAttributes(int[] styleableIDs,TypedArray result) { -// result.resetIndices(); -// if (m_attributes==null || m_resourceIDs==null) { -// return; -// } -// boolean needStrings=false; -// for (int i=0,e=styleableIDs.length;i!=e;++i) { -// int id=styleableIDs[i]; -// for (int o=0;o!=m_attributes.length;o+=ATTRIBUTE_LENGHT) { -// int name=m_attributes[o+ATTRIBUTE_IX_NAME]; -// if (name>=m_resourceIDs.length || -// m_resourceIDs[name]!=id) -// { -// continue; -// } -// int valueType=m_attributes[o+ATTRIBUTE_IX_VALUE_TYPE]; -// int valueData; -// int assetCookie; -// if (valueType==TypedValue.TYPE_STRING) { -// valueData=m_attributes[o+ATTRIBUTE_IX_VALUE_STRING]; -// assetCookie=-1; -// needStrings=true; -// } else { -// valueData=m_attributes[o+ATTRIBUTE_IX_VALUE_DATA]; -// assetCookie=0; -// } -// result.addValue(i,valueType,valueData,assetCookie,id,0); -// } -// } -// if (needStrings) { -// result.setStrings(m_strings); -// } -// } - - final wind.android.content.res.StringBlock getStrings() { - return m_strings; - } - - /////////////////////////////////// - - private final int getAttributeOffset(int index) { - if (m_event!=START_TAG) { - throw new IndexOutOfBoundsException("Current event is not START_TAG."); - } - int offset=index*5; - if (offset>=m_attributes.length) { - throw new IndexOutOfBoundsException("Invalid attribute index ("+index+")."); - } - return offset; - } - - private final int findAttribute(String namespace,String attribute) { - if (m_strings==null || attribute==null) { - return -1; - } - int name=m_strings.find(attribute); - if (name==-1) { - return -1; - } - int uri=(namespace!=null)? - m_strings.find(namespace): - -1; - for (int o=0;o!=m_attributes.length;++o) { - if (name==m_attributes[o+ATTRIBUTE_IX_NAME] && - (uri==-1 || uri==m_attributes[o+ATTRIBUTE_IX_NAMESPACE_URI])) - { - return o/ATTRIBUTE_LENGHT; - } - } - return -1; - } - - private final void resetEventInfo() { - m_event=-1; - m_lineNumber=-1; - m_name=-1; - m_namespaceUri=-1; - m_attributes=null; - m_idAttribute=-1; - m_classAttribute=-1; - m_styleAttribute=-1; - } - - private final void doNext() throws IOException { - // Delayed initialization. - if (m_strings==null) { - wind.android.content.res.ChunkUtil.readCheckType(m_reader,CHUNK_AXML_FILE); - /*chunkSize*/m_reader.skipInt(); - m_strings= wind.android.content.res.StringBlock.read(m_reader); - m_namespaces.increaseDepth(); - m_operational=true; - } - - if (m_event==END_DOCUMENT) { - return; - } - - int event=m_event; - resetEventInfo(); - - while (true) { - if (m_decreaseDepth) { - m_decreaseDepth=false; - m_namespaces.decreaseDepth(); - } - - // Fake END_DOCUMENT event. - if (event==END_TAG && - m_namespaces.getDepth()==1 && - m_namespaces.getCurrentCount()==0) - { - m_event=END_DOCUMENT; - break; - } - - int chunkType; - if (event==START_DOCUMENT) { - // Fake event, see CHUNK_XML_START_TAG handler. - chunkType=CHUNK_XML_START_TAG; - } else { - chunkType=m_reader.readInt(); - } - - if (chunkType==CHUNK_RESOURCEIDS) { - int chunkSize=m_reader.readInt(); - if (chunkSize<8 || (chunkSize%4)!=0) { - throw new IOException("Invalid resource ids size ("+chunkSize+")."); - } - m_resourceIDs=m_reader.readIntArray(chunkSize/4-2); - continue; - } - - if (chunkTypeCHUNK_XML_LAST) { - throw new IOException("Invalid chunk type ("+chunkType+")."); - } - - // Fake START_DOCUMENT event. - if (chunkType==CHUNK_XML_START_TAG && event==-1) { - m_event=START_DOCUMENT; - break; - } - - // Common header. - /*chunkSize*/m_reader.skipInt(); - int lineNumber=m_reader.readInt(); - /*0xFFFFFFFF*/m_reader.skipInt(); - - if (chunkType==CHUNK_XML_START_NAMESPACE || - chunkType==CHUNK_XML_END_NAMESPACE) - { - if (chunkType==CHUNK_XML_START_NAMESPACE) { - int prefix=m_reader.readInt(); - int uri=m_reader.readInt(); - m_namespaces.push(prefix,uri); - } else { - /*prefix*/m_reader.skipInt(); - /*uri*/m_reader.skipInt(); - m_namespaces.pop(); - } - continue; - } - - m_lineNumber=lineNumber; - - if (chunkType==CHUNK_XML_START_TAG) { - m_namespaceUri=m_reader.readInt(); - m_name=m_reader.readInt(); - /*flags?*/m_reader.skipInt(); - int attributeCount=m_reader.readInt(); - m_idAttribute=(attributeCount>>>16)-1; - attributeCount&=0xFFFF; - m_classAttribute=m_reader.readInt(); - m_styleAttribute=(m_classAttribute>>>16)-1; - m_classAttribute=(m_classAttribute & 0xFFFF)-1; - m_attributes=m_reader.readIntArray(attributeCount*ATTRIBUTE_LENGHT); - for (int i=ATTRIBUTE_IX_VALUE_TYPE;i>>24); - i+=ATTRIBUTE_LENGHT; - } - m_namespaces.increaseDepth(); - m_event=START_TAG; - break; - } - - if (chunkType==CHUNK_XML_END_TAG) { - m_namespaceUri=m_reader.readInt(); - m_name=m_reader.readInt(); - m_event=END_TAG; - m_decreaseDepth=true; - break; - } - - if (chunkType==CHUNK_XML_TEXT) { - m_name=m_reader.readInt(); - /*?*/m_reader.skipInt(); - /*?*/m_reader.skipInt(); - m_event=TEXT; - break; - } - } - } - - /////////////////////////////////// data - - /* - * All values are essentially indices, e.g. m_name is - * an index of name in m_strings. - */ - - private IntReader m_reader; - private boolean m_operational=false; - - private StringBlock m_strings; - private int[] m_resourceIDs; - private NamespaceStack m_namespaces=new NamespaceStack(); - - private boolean m_decreaseDepth; - - private int m_event; - private int m_lineNumber; - private int m_name; - private int m_namespaceUri; - private int[] m_attributes; - private int m_idAttribute; - private int m_classAttribute; - private int m_styleAttribute; - - private static final String - E_NOT_SUPPORTED ="Method is not supported."; - - private static final int - ATTRIBUTE_IX_NAMESPACE_URI =0, - ATTRIBUTE_IX_NAME =1, - ATTRIBUTE_IX_VALUE_STRING =2, - ATTRIBUTE_IX_VALUE_TYPE =3, - ATTRIBUTE_IX_VALUE_DATA =4, - ATTRIBUTE_LENGHT =5; - - private static final int - CHUNK_AXML_FILE =0x00080003, - CHUNK_RESOURCEIDS =0x00080180, - CHUNK_XML_FIRST =0x00100100, - CHUNK_XML_START_NAMESPACE =0x00100100, - CHUNK_XML_END_NAMESPACE =0x00100101, - CHUNK_XML_START_TAG =0x00100102, - CHUNK_XML_END_TAG =0x00100103, - CHUNK_XML_TEXT =0x00100104, - CHUNK_XML_LAST =0x00100104; -} +/* + * Copyright 2008 Android4ME + * + * 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 wind.android.content.res; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import wind.v1.XmlPullParserException; + +import wind.android.content.res.ChunkUtil; +import wind.android.content.res.IntReader; +import wind.android.content.res.StringBlock; +import wind.android.content.res.XmlResourceParser; +import wind.android.util.TypedValue; + +/** + * @author Dmitry Skiba + * + * Binary xml files parser. + * + * Parser has only two states: + * (1) Operational state, which parser obtains after first successful call + * to next() and retains until open(), close(), or failed call to next(). + * (2) Closed state, which parser obtains after open(), close(), or failed + * call to next(). In this state methods return invalid values or throw exceptions. + * + * TODO: + * * check all methods in closed state + * + */ +public class AXmlResourceParser implements XmlResourceParser { + + public AXmlResourceParser() { + resetEventInfo(); + } + + public void open(InputStream stream) { + close(); + if (stream!=null) { + m_reader=new wind.android.content.res.IntReader(stream,false); + } + } + + public void close() { + if (!m_operational) { + return; + } + m_operational=false; + m_reader.close(); + m_reader=null; + m_strings=null; + m_resourceIDs=null; + m_namespaces.reset(); + resetEventInfo(); + } + + /////////////////////////////////// iteration + + public int next() throws XmlPullParserException,IOException { + if (m_reader==null) { + throw new XmlPullParserException("Parser is not opened.",this,null); + } + try { + doNext(); + return m_event; + } + catch (IOException e) { + close(); + throw e; + } + } + + public int nextToken() throws XmlPullParserException,IOException { + return next(); + } + + public int nextTag() throws XmlPullParserException,IOException { + int eventType=next(); + if (eventType==TEXT && isWhitespace()) { + eventType=next(); + } + if (eventType!=START_TAG && eventType!=END_TAG) { + throw new XmlPullParserException("Expected start or end tag.",this,null); + } + return eventType; + } + + public String nextText() throws XmlPullParserException,IOException { + if(getEventType()!=START_TAG) { + throw new XmlPullParserException("Parser must be on START_TAG to read next text.",this,null); + } + int eventType=next(); + if (eventType==TEXT) { + String result=getText(); + eventType=next(); + if (eventType!=END_TAG) { + throw new XmlPullParserException("Event TEXT must be immediately followed by END_TAG.",this,null); + } + return result; + } else if (eventType==END_TAG) { + return ""; + } else { + throw new XmlPullParserException("Parser must be on START_TAG or TEXT to read text.",this,null); + } + } + + public void require(int type,String namespace,String name) throws XmlPullParserException,IOException { + if (type!=getEventType() || + (namespace!=null && !namespace.equals(getNamespace())) || + (name!=null && !name.equals(getName()))) + { + throw new XmlPullParserException(TYPES[type]+" is expected.",this,null); + } + } + + public int getDepth() { + return m_namespaces.getDepth()-1; + } + + public int getEventType() throws XmlPullParserException { + return m_event; + } + + public int getLineNumber() { + return m_lineNumber; + } + + public String getName() { + if (m_name==-1 || (m_event!=START_TAG && m_event!=END_TAG)) { + return null; + } + return m_strings.getString(m_name); + } + + public String getText() { + if (m_name==-1 || m_event!=TEXT) { + return null; + } + return m_strings.getString(m_name); + } + + public char[] getTextCharacters(int[] holderForStartAndLength) { + String text=getText(); + if (text==null) { + return null; + } + holderForStartAndLength[0]=0; + holderForStartAndLength[1]=text.length(); + char[] chars=new char[text.length()]; + text.getChars(0,text.length(),chars,0); + return chars; + } + + public String getNamespace() { + return m_strings.getString(m_namespaceUri); + } + + public String getPrefix() { + int prefix=m_namespaces.findPrefix(m_namespaceUri); + return m_strings.getString(prefix); + } + + public String getPositionDescription() { + return "XML line #"+getLineNumber(); + } + + public int getNamespaceCount(int depth) throws XmlPullParserException { + return m_namespaces.getAccumulatedCount(depth); + } + + public String getNamespacePrefix(int pos) throws XmlPullParserException { + int prefix=m_namespaces.getPrefix(pos); + return m_strings.getString(prefix); + } + + public String getNamespaceUri(int pos) throws XmlPullParserException { + int uri=m_namespaces.getUri(pos); + return m_strings.getString(uri); + } + + /////////////////////////////////// attributes + + public String getClassAttribute() { + if (m_classAttribute==-1) { + return null; + } + int offset=getAttributeOffset(m_classAttribute); + int value=m_attributes[offset+ATTRIBUTE_IX_VALUE_STRING]; + return m_strings.getString(value); + } + + public String getIdAttribute() { + if (m_idAttribute==-1) { + return null; + } + int offset=getAttributeOffset(m_idAttribute); + int value=m_attributes[offset+ATTRIBUTE_IX_VALUE_STRING]; + return m_strings.getString(value); + } + + public int getIdAttributeResourceValue(int defaultValue) { + if (m_idAttribute==-1) { + return defaultValue; + } + int offset=getAttributeOffset(m_idAttribute); + int valueType=m_attributes[offset+ATTRIBUTE_IX_VALUE_TYPE]; + if (valueType!=TypedValue.TYPE_REFERENCE) { + return defaultValue; + } + return m_attributes[offset+ATTRIBUTE_IX_VALUE_DATA]; + } + + public int getStyleAttribute() { + if (m_styleAttribute==-1) { + return 0; + } + int offset=getAttributeOffset(m_styleAttribute); + return m_attributes[offset+ATTRIBUTE_IX_VALUE_DATA]; + } + + public int getAttributeCount() { + if (m_event!=START_TAG) { + return -1; + } + return m_attributes.length/ATTRIBUTE_LENGHT; + } + + public String getAttributeNamespace(int index) { + int offset=getAttributeOffset(index); + int namespace=m_attributes[offset+ATTRIBUTE_IX_NAMESPACE_URI]; + if (namespace==-1) { + return ""; + } + return m_strings.getString(namespace); + } + + public String getAttributePrefix(int index) { + int offset=getAttributeOffset(index); + int uri=m_attributes[offset+ATTRIBUTE_IX_NAMESPACE_URI]; + int prefix=m_namespaces.findPrefix(uri); + if (prefix==-1) { + return ""; + } + return m_strings.getString(prefix); + } + + public String getAttributeName(int index) { + int offset=getAttributeOffset(index); + int name=m_attributes[offset+ATTRIBUTE_IX_NAME]; + if (name==-1) { + return ""; + } + return m_strings.getString(name); + } + + public int getAttributeNameResource(int index) { + int offset=getAttributeOffset(index); + int name=m_attributes[offset+ATTRIBUTE_IX_NAME]; + if (m_resourceIDs==null || + name<0 || name>=m_resourceIDs.length) + { + return 0; + } + return m_resourceIDs[name]; + } + + public int getAttributeValueType(int index) { + int offset=getAttributeOffset(index); + return m_attributes[offset+ATTRIBUTE_IX_VALUE_TYPE]; + } + + public int getAttributeValueData(int index) { + int offset=getAttributeOffset(index); + return m_attributes[offset+ATTRIBUTE_IX_VALUE_DATA]; + } + + public String getAttributeValue(int index) { + int offset=getAttributeOffset(index); + int valueType=m_attributes[offset+ATTRIBUTE_IX_VALUE_TYPE]; + if (valueType==TypedValue.TYPE_STRING) { + int valueString=m_attributes[offset+ATTRIBUTE_IX_VALUE_STRING]; + return m_strings.getString(valueString); + } + int valueData=m_attributes[offset+ATTRIBUTE_IX_VALUE_DATA]; + return "";//TypedValue.coerceToString(valueType,valueData); + } + + public boolean getAttributeBooleanValue(int index,boolean defaultValue) { + return getAttributeIntValue(index,defaultValue?1:0)!=0; + } + + public float getAttributeFloatValue(int index,float defaultValue) { + int offset=getAttributeOffset(index); + int valueType=m_attributes[offset+ATTRIBUTE_IX_VALUE_TYPE]; + if (valueType==TypedValue.TYPE_FLOAT) { + int valueData=m_attributes[offset+ATTRIBUTE_IX_VALUE_DATA]; + return Float.intBitsToFloat(valueData); + } + return defaultValue; + } + + public int getAttributeIntValue(int index,int defaultValue) { + int offset=getAttributeOffset(index); + int valueType=m_attributes[offset+ATTRIBUTE_IX_VALUE_TYPE]; + if (valueType>=TypedValue.TYPE_FIRST_INT && + valueType<=TypedValue.TYPE_LAST_INT) + { + return m_attributes[offset+ATTRIBUTE_IX_VALUE_DATA]; + } + return defaultValue; + } + + public int getAttributeUnsignedIntValue(int index,int defaultValue) { + return getAttributeIntValue(index,defaultValue); + } + + public int getAttributeResourceValue(int index,int defaultValue) { + int offset=getAttributeOffset(index); + int valueType=m_attributes[offset+ATTRIBUTE_IX_VALUE_TYPE]; + if (valueType==TypedValue.TYPE_REFERENCE) { + return m_attributes[offset+ATTRIBUTE_IX_VALUE_DATA]; + } + return defaultValue; + } + + public String getAttributeValue(String namespace,String attribute) { + int index=findAttribute(namespace,attribute); + if (index==-1) { + return null; + } + return getAttributeValue(index); + } + + public boolean getAttributeBooleanValue(String namespace,String attribute,boolean defaultValue) { + int index=findAttribute(namespace,attribute); + if (index==-1) { + return defaultValue; + } + return getAttributeBooleanValue(index,defaultValue); + } + + public float getAttributeFloatValue(String namespace,String attribute,float defaultValue) { + int index=findAttribute(namespace,attribute); + if (index==-1) { + return defaultValue; + } + return getAttributeFloatValue(index,defaultValue); + } + + public int getAttributeIntValue(String namespace,String attribute,int defaultValue) { + int index=findAttribute(namespace,attribute); + if (index==-1) { + return defaultValue; + } + return getAttributeIntValue(index,defaultValue); + } + + public int getAttributeUnsignedIntValue(String namespace,String attribute,int defaultValue) { + int index=findAttribute(namespace,attribute); + if (index==-1) { + return defaultValue; + } + return getAttributeUnsignedIntValue(index,defaultValue); + } + + public int getAttributeResourceValue(String namespace,String attribute,int defaultValue) { + int index=findAttribute(namespace,attribute); + if (index==-1) { + return defaultValue; + } + return getAttributeResourceValue(index,defaultValue); + } + + public int getAttributeListValue(int index,String[] options,int defaultValue) { + // TODO implement + return 0; + } + + public int getAttributeListValue(String namespace,String attribute,String[] options,int defaultValue) { + // TODO implement + return 0; + } + + public String getAttributeType(int index) { + return "CDATA"; + } + + public boolean isAttributeDefault(int index) { + return false; + } + + /////////////////////////////////// dummies + + public void setInput(InputStream stream,String inputEncoding) throws XmlPullParserException { + throw new XmlPullParserException(E_NOT_SUPPORTED); + } + public void setInput(Reader reader) throws XmlPullParserException { + throw new XmlPullParserException(E_NOT_SUPPORTED); + } + + public String getInputEncoding() { + return null; + } + + public int getColumnNumber() { + return -1; + } + + public boolean isEmptyElementTag() throws XmlPullParserException { + return false; + } + + public boolean isWhitespace() throws XmlPullParserException { + return false; + } + + public void defineEntityReplacementText(String entityName,String replacementText) throws XmlPullParserException { + throw new XmlPullParserException(E_NOT_SUPPORTED); + } + + public String getNamespace(String prefix) { + throw new RuntimeException(E_NOT_SUPPORTED); + } + + public Object getProperty(String name) { + return null; + } + public void setProperty(String name,Object value) throws XmlPullParserException { + throw new XmlPullParserException(E_NOT_SUPPORTED); + } + + public boolean getFeature(String feature) { + return false; + } + public void setFeature(String name,boolean value) throws XmlPullParserException { + throw new XmlPullParserException(E_NOT_SUPPORTED); + } + + ///////////////////////////////////////////// implementation + + /** + * Namespace stack, holds prefix+uri pairs, as well as + * depth information. + * All information is stored in one int[] array. + * Array consists of depth frames: + * Data=DepthFrame*; + * DepthFrame=Count+[Prefix+Uri]*+Count; + * Count='count of Prefix+Uri pairs'; + * Yes, count is stored twice, to enable bottom-up traversal. + * increaseDepth adds depth frame, decreaseDepth removes it. + * push/pop operations operate only in current depth frame. + * decreaseDepth removes any remaining (not pop'ed) namespace pairs. + * findXXX methods search all depth frames starting + * from the last namespace pair of current depth frame. + * All functions that operate with int, use -1 as 'invalid value'. + * + * !! functions expect 'prefix'+'uri' pairs, not 'uri'+'prefix' !! + * + */ + private static final class NamespaceStack { + public NamespaceStack() { + m_data=new int[32]; + } + + public final void reset() { + m_dataLength=0; + m_count=0; + m_depth=0; + } + + public final int getTotalCount() { + return m_count; + } + + public final int getCurrentCount() { + if (m_dataLength==0) { + return 0; + } + int offset=m_dataLength-1; + return m_data[offset]; + } + + public final int getAccumulatedCount(int depth) { + if (m_dataLength==0 || depth<0) { + return 0; + } + if (depth>m_depth) { + depth=m_depth; + } + int accumulatedCount=0; + int offset=0; + for (;depth!=0;--depth) { + int count=m_data[offset]; + accumulatedCount+=count; + offset+=(2+count*2); + } + return accumulatedCount; + } + + public final void push(int prefix,int uri) { + if (m_depth==0) { + increaseDepth(); + } + ensureDataCapacity(2); + int offset=m_dataLength-1; + int count=m_data[offset]; + m_data[offset-1-count*2]=count+1; + m_data[offset]=prefix; + m_data[offset+1]=uri; + m_data[offset+2]=count+1; + m_dataLength+=2; + m_count+=1; + } + + public final boolean pop(int prefix,int uri) { + if (m_dataLength==0) { + return false; + } + int offset=m_dataLength-1; + int count=m_data[offset]; + for (int i=0,o=offset-2;i!=count;++i,o-=2) { + if (m_data[o]!=prefix || m_data[o+1]!=uri) { + continue; + } + count-=1; + if (i==0) { + m_data[o]=count; + o-=(1+count*2); + m_data[o]=count; + } else { + m_data[offset]=count; + offset-=(1+2+count*2); + m_data[offset]=count; + System.arraycopy( + m_data,o+2, + m_data,o, + m_dataLength-o); + } + m_dataLength-=2; + m_count-=1; + return true; + } + return false; + } + + public final boolean pop() { + if (m_dataLength==0) { + return false; + } + int offset=m_dataLength-1; + int count=m_data[offset]; + if (count==0) { + return false; + } + count-=1; + offset-=2; + m_data[offset]=count; + offset-=(1+count*2); + m_data[offset]=count; + m_dataLength-=2; + m_count-=1; + return true; + } + + public final int getPrefix(int index) { + return get(index,true); + } + + public final int getUri(int index) { + return get(index,false); + } + + public final int findPrefix(int uri) { + return find(uri,false); + } + + public final int findUri(int prefix) { + return find(prefix,true); + } + + public final int getDepth() { + return m_depth; + } + + public final void increaseDepth() { + ensureDataCapacity(2); + int offset=m_dataLength; + m_data[offset]=0; + m_data[offset+1]=0; + m_dataLength+=2; + m_depth+=1; + } + public final void decreaseDepth() { + if (m_dataLength==0) { + return; + } + int offset=m_dataLength-1; + int count=m_data[offset]; + if ((offset-1-count*2)==0) { + return; + } + m_dataLength-=2+count*2; + m_count-=count; + m_depth-=1; + } + + private void ensureDataCapacity(int capacity) { + int available=(m_data.length-m_dataLength); + if (available>capacity) { + return; + } + int newLength=(m_data.length+available)*2; + int[] newData=new int[newLength]; + System.arraycopy(m_data,0,newData,0,m_dataLength); + m_data=newData; + } + + private final int find(int prefixOrUri,boolean prefix) { + if (m_dataLength==0) { + return -1; + } + int offset=m_dataLength-1; + for (int i=m_depth;i!=0;--i) { + int count=m_data[offset]; + offset-=2; + for (;count!=0;--count) { + if (prefix) { + if (m_data[offset]==prefixOrUri) { + return m_data[offset+1]; + } + } else { + if (m_data[offset+1]==prefixOrUri) { + return m_data[offset]; + } + } + offset-=2; + } + } + return -1; + } + + private final int get(int index,boolean prefix) { + if (m_dataLength==0 || index<0) { + return -1; + } + int offset=0; + for (int i=m_depth;i!=0;--i) { + int count=m_data[offset]; + if (index>=count) { + index-=count; + offset+=(2+count*2); + continue; + } + offset+=(1+index*2); + if (!prefix) { + offset+=1; + } + return m_data[offset]; + } + return -1; + } + + private int[] m_data; + private int m_dataLength; + private int m_count; + private int m_depth; + } + + /////////////////////////////////// package-visible + +// final void fetchAttributes(int[] styleableIDs,TypedArray result) { +// result.resetIndices(); +// if (m_attributes==null || m_resourceIDs==null) { +// return; +// } +// boolean needStrings=false; +// for (int i=0,e=styleableIDs.length;i!=e;++i) { +// int id=styleableIDs[i]; +// for (int o=0;o!=m_attributes.length;o+=ATTRIBUTE_LENGHT) { +// int name=m_attributes[o+ATTRIBUTE_IX_NAME]; +// if (name>=m_resourceIDs.length || +// m_resourceIDs[name]!=id) +// { +// continue; +// } +// int valueType=m_attributes[o+ATTRIBUTE_IX_VALUE_TYPE]; +// int valueData; +// int assetCookie; +// if (valueType==TypedValue.TYPE_STRING) { +// valueData=m_attributes[o+ATTRIBUTE_IX_VALUE_STRING]; +// assetCookie=-1; +// needStrings=true; +// } else { +// valueData=m_attributes[o+ATTRIBUTE_IX_VALUE_DATA]; +// assetCookie=0; +// } +// result.addValue(i,valueType,valueData,assetCookie,id,0); +// } +// } +// if (needStrings) { +// result.setStrings(m_strings); +// } +// } + + final wind.android.content.res.StringBlock getStrings() { + return m_strings; + } + + /////////////////////////////////// + + private final int getAttributeOffset(int index) { + if (m_event!=START_TAG) { + throw new IndexOutOfBoundsException("Current event is not START_TAG."); + } + int offset=index*5; + if (offset>=m_attributes.length) { + throw new IndexOutOfBoundsException("Invalid attribute index ("+index+")."); + } + return offset; + } + + private final int findAttribute(String namespace,String attribute) { + if (m_strings==null || attribute==null) { + return -1; + } + int name=m_strings.find(attribute); + if (name==-1) { + return -1; + } + int uri=(namespace!=null)? + m_strings.find(namespace): + -1; + for (int o=0;o!=m_attributes.length;++o) { + if (name==m_attributes[o+ATTRIBUTE_IX_NAME] && + (uri==-1 || uri==m_attributes[o+ATTRIBUTE_IX_NAMESPACE_URI])) + { + return o/ATTRIBUTE_LENGHT; + } + } + return -1; + } + + private final void resetEventInfo() { + m_event=-1; + m_lineNumber=-1; + m_name=-1; + m_namespaceUri=-1; + m_attributes=null; + m_idAttribute=-1; + m_classAttribute=-1; + m_styleAttribute=-1; + } + + private final void doNext() throws IOException { + // Delayed initialization. + if (m_strings==null) { + wind.android.content.res.ChunkUtil.readCheckType(m_reader,CHUNK_AXML_FILE); + /*chunkSize*/m_reader.skipInt(); + m_strings= wind.android.content.res.StringBlock.read(m_reader); + m_namespaces.increaseDepth(); + m_operational=true; + } + + if (m_event==END_DOCUMENT) { + return; + } + + int event=m_event; + resetEventInfo(); + + while (true) { + if (m_decreaseDepth) { + m_decreaseDepth=false; + m_namespaces.decreaseDepth(); + } + + // Fake END_DOCUMENT event. + if (event==END_TAG && + m_namespaces.getDepth()==1 && + m_namespaces.getCurrentCount()==0) + { + m_event=END_DOCUMENT; + break; + } + + int chunkType; + if (event==START_DOCUMENT) { + // Fake event, see CHUNK_XML_START_TAG handler. + chunkType=CHUNK_XML_START_TAG; + } else { + chunkType=m_reader.readInt(); + } + + if (chunkType==CHUNK_RESOURCEIDS) { + int chunkSize=m_reader.readInt(); + if (chunkSize<8 || (chunkSize%4)!=0) { + throw new IOException("Invalid resource ids size ("+chunkSize+")."); + } + m_resourceIDs=m_reader.readIntArray(chunkSize/4-2); + continue; + } + + if (chunkTypeCHUNK_XML_LAST) { + throw new IOException("Invalid chunk type ("+chunkType+")."); + } + + // Fake START_DOCUMENT event. + if (chunkType==CHUNK_XML_START_TAG && event==-1) { + m_event=START_DOCUMENT; + break; + } + + // Common header. + /*chunkSize*/m_reader.skipInt(); + int lineNumber=m_reader.readInt(); + /*0xFFFFFFFF*/m_reader.skipInt(); + + if (chunkType==CHUNK_XML_START_NAMESPACE || + chunkType==CHUNK_XML_END_NAMESPACE) + { + if (chunkType==CHUNK_XML_START_NAMESPACE) { + int prefix=m_reader.readInt(); + int uri=m_reader.readInt(); + m_namespaces.push(prefix,uri); + } else { + /*prefix*/m_reader.skipInt(); + /*uri*/m_reader.skipInt(); + m_namespaces.pop(); + } + continue; + } + + m_lineNumber=lineNumber; + + if (chunkType==CHUNK_XML_START_TAG) { + m_namespaceUri=m_reader.readInt(); + m_name=m_reader.readInt(); + /*flags?*/m_reader.skipInt(); + int attributeCount=m_reader.readInt(); + m_idAttribute=(attributeCount>>>16)-1; + attributeCount&=0xFFFF; + m_classAttribute=m_reader.readInt(); + m_styleAttribute=(m_classAttribute>>>16)-1; + m_classAttribute=(m_classAttribute & 0xFFFF)-1; + m_attributes=m_reader.readIntArray(attributeCount*ATTRIBUTE_LENGHT); + for (int i=ATTRIBUTE_IX_VALUE_TYPE;i>>24); + i+=ATTRIBUTE_LENGHT; + } + m_namespaces.increaseDepth(); + m_event=START_TAG; + break; + } + + if (chunkType==CHUNK_XML_END_TAG) { + m_namespaceUri=m_reader.readInt(); + m_name=m_reader.readInt(); + m_event=END_TAG; + m_decreaseDepth=true; + break; + } + + if (chunkType==CHUNK_XML_TEXT) { + m_name=m_reader.readInt(); + /*?*/m_reader.skipInt(); + /*?*/m_reader.skipInt(); + m_event=TEXT; + break; + } + } + } + + /////////////////////////////////// data + + /* + * All values are essentially indices, e.g. m_name is + * an index of name in m_strings. + */ + + private IntReader m_reader; + private boolean m_operational=false; + + private StringBlock m_strings; + private int[] m_resourceIDs; + private NamespaceStack m_namespaces=new NamespaceStack(); + + private boolean m_decreaseDepth; + + private int m_event; + private int m_lineNumber; + private int m_name; + private int m_namespaceUri; + private int[] m_attributes; + private int m_idAttribute; + private int m_classAttribute; + private int m_styleAttribute; + + private static final String + E_NOT_SUPPORTED ="Method is not supported."; + + private static final int + ATTRIBUTE_IX_NAMESPACE_URI =0, + ATTRIBUTE_IX_NAME =1, + ATTRIBUTE_IX_VALUE_STRING =2, + ATTRIBUTE_IX_VALUE_TYPE =3, + ATTRIBUTE_IX_VALUE_DATA =4, + ATTRIBUTE_LENGHT =5; + + private static final int + CHUNK_AXML_FILE =0x00080003, + CHUNK_RESOURCEIDS =0x00080180, + CHUNK_XML_FIRST =0x00100100, + CHUNK_XML_START_NAMESPACE =0x00100100, + CHUNK_XML_END_NAMESPACE =0x00100101, + CHUNK_XML_START_TAG =0x00100102, + CHUNK_XML_END_TAG =0x00100103, + CHUNK_XML_TEXT =0x00100104, + CHUNK_XML_LAST =0x00100104; +} diff --git a/axmlprinter/src/main/java/wind/android/content/res/ChunkUtil.java b/loader/axmlprinter/src/main/java/wind/android/content/res/ChunkUtil.java similarity index 96% rename from axmlprinter/src/main/java/wind/android/content/res/ChunkUtil.java rename to loader/axmlprinter/src/main/java/wind/android/content/res/ChunkUtil.java index 199ebd5..efebe71 100644 --- a/axmlprinter/src/main/java/wind/android/content/res/ChunkUtil.java +++ b/loader/axmlprinter/src/main/java/wind/android/content/res/ChunkUtil.java @@ -1,36 +1,36 @@ -/* - * Copyright 2008 Android4ME - * - * 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 wind.android.content.res; - -import wind.android.content.res.IntReader; - -import java.io.IOException; - -/** - * @author Dmitry Skiba - * - */ -class ChunkUtil { - - public static final void readCheckType(IntReader reader, int expectedType) throws IOException { - int type=reader.readInt(); - if (type!=expectedType) { - throw new IOException( - "Expected chunk of type 0x"+Integer.toHexString(expectedType)+ - ", read 0x"+Integer.toHexString(type)+"."); - } - } -} +/* + * Copyright 2008 Android4ME + * + * 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 wind.android.content.res; + +import wind.android.content.res.IntReader; + +import java.io.IOException; + +/** + * @author Dmitry Skiba + * + */ +class ChunkUtil { + + public static final void readCheckType(IntReader reader, int expectedType) throws IOException { + int type=reader.readInt(); + if (type!=expectedType) { + throw new IOException( + "Expected chunk of type 0x"+Integer.toHexString(expectedType)+ + ", read 0x"+Integer.toHexString(type)+"."); + } + } +} diff --git a/axmlprinter/src/main/java/wind/android/content/res/IntReader.java b/loader/axmlprinter/src/main/java/wind/android/content/res/IntReader.java old mode 100755 new mode 100644 similarity index 100% rename from axmlprinter/src/main/java/wind/android/content/res/IntReader.java rename to loader/axmlprinter/src/main/java/wind/android/content/res/IntReader.java diff --git a/axmlprinter/src/main/java/wind/android/content/res/StringBlock.java b/loader/axmlprinter/src/main/java/wind/android/content/res/StringBlock.java old mode 100755 new mode 100644 similarity index 100% rename from axmlprinter/src/main/java/wind/android/content/res/StringBlock.java rename to loader/axmlprinter/src/main/java/wind/android/content/res/StringBlock.java diff --git a/axmlprinter/src/main/java/wind/android/content/res/XmlResourceParser.java b/loader/axmlprinter/src/main/java/wind/android/content/res/XmlResourceParser.java similarity index 96% rename from axmlprinter/src/main/java/wind/android/content/res/XmlResourceParser.java rename to loader/axmlprinter/src/main/java/wind/android/content/res/XmlResourceParser.java index 1efa2f6..3935271 100644 --- a/axmlprinter/src/main/java/wind/android/content/res/XmlResourceParser.java +++ b/loader/axmlprinter/src/main/java/wind/android/content/res/XmlResourceParser.java @@ -1,27 +1,27 @@ -/* - * Copyright 2008 Android4ME - * - * 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 wind.android.content.res; - -import wind.v1.XmlPullParser; -import wind.android.util.AttributeSet; - -/** - * @author Dmitry Skiba - * - */ -public interface XmlResourceParser extends XmlPullParser, AttributeSet { - void close(); -} +/* + * Copyright 2008 Android4ME + * + * 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 wind.android.content.res; + +import wind.v1.XmlPullParser; +import wind.android.util.AttributeSet; + +/** + * @author Dmitry Skiba + * + */ +public interface XmlResourceParser extends XmlPullParser, AttributeSet { + void close(); +} diff --git a/axmlprinter/src/main/java/wind/android/util/AttributeSet.java b/loader/axmlprinter/src/main/java/wind/android/util/AttributeSet.java similarity index 97% rename from axmlprinter/src/main/java/wind/android/util/AttributeSet.java rename to loader/axmlprinter/src/main/java/wind/android/util/AttributeSet.java index 9d2d1dc..e9296e3 100644 --- a/axmlprinter/src/main/java/wind/android/util/AttributeSet.java +++ b/loader/axmlprinter/src/main/java/wind/android/util/AttributeSet.java @@ -1,49 +1,49 @@ -/* - * Copyright 2008 Android4ME - * - * 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 wind.android.util; - -/** - * @author Dmitry Skiba - * - */ -public interface AttributeSet { - int getAttributeCount(); - String getAttributeName(int index); - String getAttributeValue(int index); - String getPositionDescription(); - int getAttributeNameResource(int index); - int getAttributeListValue(int index, String options[], int defaultValue); - boolean getAttributeBooleanValue(int index, boolean defaultValue); - int getAttributeResourceValue(int index, int defaultValue); - int getAttributeIntValue(int index, int defaultValue); - int getAttributeUnsignedIntValue(int index, int defaultValue); - float getAttributeFloatValue(int index, float defaultValue); - String getIdAttribute(); - String getClassAttribute(); - int getIdAttributeResourceValue(int index); - int getStyleAttribute(); - String getAttributeValue(String namespace, String attribute); - int getAttributeListValue(String namespace, String attribute, String options[], int defaultValue); - boolean getAttributeBooleanValue(String namespace, String attribute, boolean defaultValue); - int getAttributeResourceValue(String namespace, String attribute, int defaultValue); - int getAttributeIntValue(String namespace, String attribute, int defaultValue); - int getAttributeUnsignedIntValue(String namespace, String attribute, int defaultValue); - float getAttributeFloatValue(String namespace, String attribute, float defaultValue); - - //TODO: remove - int getAttributeValueType(int index); - int getAttributeValueData(int index); -} +/* + * Copyright 2008 Android4ME + * + * 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 wind.android.util; + +/** + * @author Dmitry Skiba + * + */ +public interface AttributeSet { + int getAttributeCount(); + String getAttributeName(int index); + String getAttributeValue(int index); + String getPositionDescription(); + int getAttributeNameResource(int index); + int getAttributeListValue(int index, String options[], int defaultValue); + boolean getAttributeBooleanValue(int index, boolean defaultValue); + int getAttributeResourceValue(int index, int defaultValue); + int getAttributeIntValue(int index, int defaultValue); + int getAttributeUnsignedIntValue(int index, int defaultValue); + float getAttributeFloatValue(int index, float defaultValue); + String getIdAttribute(); + String getClassAttribute(); + int getIdAttributeResourceValue(int index); + int getStyleAttribute(); + String getAttributeValue(String namespace, String attribute); + int getAttributeListValue(String namespace, String attribute, String options[], int defaultValue); + boolean getAttributeBooleanValue(String namespace, String attribute, boolean defaultValue); + int getAttributeResourceValue(String namespace, String attribute, int defaultValue); + int getAttributeIntValue(String namespace, String attribute, int defaultValue); + int getAttributeUnsignedIntValue(String namespace, String attribute, int defaultValue); + float getAttributeFloatValue(String namespace, String attribute, float defaultValue); + + //TODO: remove + int getAttributeValueType(int index); + int getAttributeValueData(int index); +} diff --git a/axmlprinter/src/main/java/wind/android/util/TypedValue.java b/loader/axmlprinter/src/main/java/wind/android/util/TypedValue.java similarity index 96% rename from axmlprinter/src/main/java/wind/android/util/TypedValue.java rename to loader/axmlprinter/src/main/java/wind/android/util/TypedValue.java index f96e2d8..657ffa1 100644 --- a/axmlprinter/src/main/java/wind/android/util/TypedValue.java +++ b/loader/axmlprinter/src/main/java/wind/android/util/TypedValue.java @@ -1,71 +1,71 @@ -/* - * Copyright 2008 Android4ME - * - * 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 wind.android.util; - -/** - * @author Dmitry Skiba - * - */ -public class TypedValue { - - public int type; - public CharSequence string; - public int data; - public int assetCookie; - public int resourceId; - public int changingConfigurations; - - public static final int - TYPE_NULL =0, - TYPE_REFERENCE =1, - TYPE_ATTRIBUTE =2, - TYPE_STRING =3, - TYPE_FLOAT =4, - TYPE_DIMENSION =5, - TYPE_FRACTION =6, - TYPE_FIRST_INT =16, - TYPE_INT_DEC =16, - TYPE_INT_HEX =17, - TYPE_INT_BOOLEAN =18, - TYPE_FIRST_COLOR_INT =28, - TYPE_INT_COLOR_ARGB8 =28, - TYPE_INT_COLOR_RGB8 =29, - TYPE_INT_COLOR_ARGB4 =30, - TYPE_INT_COLOR_RGB4 =31, - TYPE_LAST_COLOR_INT =31, - TYPE_LAST_INT =31; - - public static final int - COMPLEX_UNIT_PX =0, - COMPLEX_UNIT_DIP =1, - COMPLEX_UNIT_SP =2, - COMPLEX_UNIT_PT =3, - COMPLEX_UNIT_IN =4, - COMPLEX_UNIT_MM =5, - COMPLEX_UNIT_SHIFT =0, - COMPLEX_UNIT_MASK =15, - COMPLEX_UNIT_FRACTION =0, - COMPLEX_UNIT_FRACTION_PARENT=1, - COMPLEX_RADIX_23p0 =0, - COMPLEX_RADIX_16p7 =1, - COMPLEX_RADIX_8p15 =2, - COMPLEX_RADIX_0p23 =3, - COMPLEX_RADIX_SHIFT =4, - COMPLEX_RADIX_MASK =3, - COMPLEX_MANTISSA_SHIFT =8, - COMPLEX_MANTISSA_MASK =0xFFFFFF; - -} +/* + * Copyright 2008 Android4ME + * + * 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 wind.android.util; + +/** + * @author Dmitry Skiba + * + */ +public class TypedValue { + + public int type; + public CharSequence string; + public int data; + public int assetCookie; + public int resourceId; + public int changingConfigurations; + + public static final int + TYPE_NULL =0, + TYPE_REFERENCE =1, + TYPE_ATTRIBUTE =2, + TYPE_STRING =3, + TYPE_FLOAT =4, + TYPE_DIMENSION =5, + TYPE_FRACTION =6, + TYPE_FIRST_INT =16, + TYPE_INT_DEC =16, + TYPE_INT_HEX =17, + TYPE_INT_BOOLEAN =18, + TYPE_FIRST_COLOR_INT =28, + TYPE_INT_COLOR_ARGB8 =28, + TYPE_INT_COLOR_RGB8 =29, + TYPE_INT_COLOR_ARGB4 =30, + TYPE_INT_COLOR_RGB4 =31, + TYPE_LAST_COLOR_INT =31, + TYPE_LAST_INT =31; + + public static final int + COMPLEX_UNIT_PX =0, + COMPLEX_UNIT_DIP =1, + COMPLEX_UNIT_SP =2, + COMPLEX_UNIT_PT =3, + COMPLEX_UNIT_IN =4, + COMPLEX_UNIT_MM =5, + COMPLEX_UNIT_SHIFT =0, + COMPLEX_UNIT_MASK =15, + COMPLEX_UNIT_FRACTION =0, + COMPLEX_UNIT_FRACTION_PARENT=1, + COMPLEX_RADIX_23p0 =0, + COMPLEX_RADIX_16p7 =1, + COMPLEX_RADIX_8p15 =2, + COMPLEX_RADIX_0p23 =3, + COMPLEX_RADIX_SHIFT =4, + COMPLEX_RADIX_MASK =3, + COMPLEX_MANTISSA_SHIFT =8, + COMPLEX_MANTISSA_MASK =0xFFFFFF; + +} diff --git a/axmlprinter/src/main/java/wind/test/AXMLPrinter.java b/loader/axmlprinter/src/main/java/wind/test/AXMLPrinter.java similarity index 96% rename from axmlprinter/src/main/java/wind/test/AXMLPrinter.java rename to loader/axmlprinter/src/main/java/wind/test/AXMLPrinter.java index d56063b..cf8c701 100644 --- a/axmlprinter/src/main/java/wind/test/AXMLPrinter.java +++ b/loader/axmlprinter/src/main/java/wind/test/AXMLPrinter.java @@ -1,170 +1,170 @@ -/* - * Copyright 2008 Android4ME - * - * 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 wind.test; - -import java.io.FileInputStream; -import wind.v1.XmlPullParser; -import wind.android.content.res.AXmlResourceParser; -//import android.util.TypedValue; - -/** - * @author Dmitry Skiba - * - * This is example usage of AXMLParser class. - * - * Prints xml document from Android's binary xml file. - */ -public class AXMLPrinter { - - public static void main(String[] arguments) { - if (arguments.length<1) { - log("Usage: AXMLPrinter "); - return; - } - try { - AXmlResourceParser parser=new AXmlResourceParser(); - parser.open(new FileInputStream(arguments[0])); - StringBuilder indent=new StringBuilder(10); - final String indentStep=" "; - while (true) { - int type=parser.next(); - if (type==XmlPullParser.END_DOCUMENT) { - break; - } - switch (type) { - case XmlPullParser.START_DOCUMENT: - { - log(""); - break; - } - case XmlPullParser.START_TAG: - { - log("%s<%s%s",indent, - getNamespacePrefix(parser.getPrefix()),parser.getName()); - indent.append(indentStep); - - int namespaceCountBefore=parser.getNamespaceCount(parser.getDepth()-1); - int namespaceCount=parser.getNamespaceCount(parser.getDepth()); - for (int i=namespaceCountBefore;i!=namespaceCount;++i) { - log("%sxmlns:%s=\"%s\"", - indent, - parser.getNamespacePrefix(i), - parser.getNamespaceUri(i)); - } - - for (int i=0;i!=parser.getAttributeCount();++i) { - log("%s%s%s=\"%s\"",indent, - getNamespacePrefix(parser.getAttributePrefix(i)), - parser.getAttributeName(i), - getAttributeValue(parser,i)); - } - log("%s>",indent); - break; - } - case XmlPullParser.END_TAG: - { - indent.setLength(indent.length()-indentStep.length()); - log("%s",indent, - getNamespacePrefix(parser.getPrefix()), - parser.getName()); - break; - } - case XmlPullParser.TEXT: - { - log("%s%s",indent,parser.getText()); - break; - } - } - } - } - catch (Exception e) { - e.printStackTrace(); - } - } - - private static String getNamespacePrefix(String prefix) { - if (prefix==null || prefix.length()==0) { - return ""; - } - return prefix+":"; - } - - private static String getAttributeValue(AXmlResourceParser parser,int index) { - int type=parser.getAttributeValueType(index); - int data=parser.getAttributeValueData(index); -// if (type==TypedValue.TYPE_STRING) { -// return parser.getAttributeValue(index); -// } -// if (type==TypedValue.TYPE_ATTRIBUTE) { -// return String.format("?%s%08X",getPackage(data),data); -// } -// if (type==TypedValue.TYPE_REFERENCE) { -// return String.format("@%s%08X",getPackage(data),data); -// } -// if (type==TypedValue.TYPE_FLOAT) { -// return String.valueOf(Float.intBitsToFloat(data)); -// } -// if (type==TypedValue.TYPE_INT_HEX) { -// return String.format("0x%08X",data); -// } -// if (type==TypedValue.TYPE_INT_BOOLEAN) { -// return data!=0?"true":"false"; -// } -// if (type==TypedValue.TYPE_DIMENSION) { -// return Float.toString(complexToFloat(data))+ -// DIMENSION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK]; -// } -// if (type==TypedValue.TYPE_FRACTION) { -// return Float.toString(complexToFloat(data))+ -// FRACTION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK]; -// } -// if (type>=TypedValue.TYPE_FIRST_COLOR_INT && type<=TypedValue.TYPE_LAST_COLOR_INT) { -// return String.format("#%08X",data); -// } -// if (type>=TypedValue.TYPE_FIRST_INT && type<=TypedValue.TYPE_LAST_INT) { -// return String.valueOf(data); -// } - return String.format("<0x%X, type 0x%02X>",data,type); - } - - private static String getPackage(int id) { - if (id>>>24==1) { - return "android:"; - } - return ""; - } - - private static void log(String format,Object...arguments) { - System.out.printf(format,arguments); - System.out.println(); - } - - /////////////////////////////////// ILLEGAL STUFF, DONT LOOK :) - - public static float complexToFloat(int complex) { - return (float)(complex & 0xFFFFFF00)*RADIX_MULTS[(complex>>4) & 3]; - } - - private static final float RADIX_MULTS[]={ - 0.00390625F,3.051758E-005F,1.192093E-007F,4.656613E-010F - }; - private static final String DIMENSION_UNITS[]={ - "px","dip","sp","pt","in","mm","","" - }; - private static final String FRACTION_UNITS[]={ - "%","%p","","","","","","" - }; +/* + * Copyright 2008 Android4ME + * + * 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 wind.test; + +import java.io.FileInputStream; +import wind.v1.XmlPullParser; +import wind.android.content.res.AXmlResourceParser; +//import android.util.TypedValue; + +/** + * @author Dmitry Skiba + * + * This is example usage of AXMLParser class. + * + * Prints xml document from Android's binary xml file. + */ +public class AXMLPrinter { + + public static void main(String[] arguments) { + if (arguments.length<1) { + log("Usage: AXMLPrinter "); + return; + } + try { + AXmlResourceParser parser=new AXmlResourceParser(); + parser.open(new FileInputStream(arguments[0])); + StringBuilder indent=new StringBuilder(10); + final String indentStep=" "; + while (true) { + int type=parser.next(); + if (type==XmlPullParser.END_DOCUMENT) { + break; + } + switch (type) { + case XmlPullParser.START_DOCUMENT: + { + log(""); + break; + } + case XmlPullParser.START_TAG: + { + log("%s<%s%s",indent, + getNamespacePrefix(parser.getPrefix()),parser.getName()); + indent.append(indentStep); + + int namespaceCountBefore=parser.getNamespaceCount(parser.getDepth()-1); + int namespaceCount=parser.getNamespaceCount(parser.getDepth()); + for (int i=namespaceCountBefore;i!=namespaceCount;++i) { + log("%sxmlns:%s=\"%s\"", + indent, + parser.getNamespacePrefix(i), + parser.getNamespaceUri(i)); + } + + for (int i=0;i!=parser.getAttributeCount();++i) { + log("%s%s%s=\"%s\"",indent, + getNamespacePrefix(parser.getAttributePrefix(i)), + parser.getAttributeName(i), + getAttributeValue(parser,i)); + } + log("%s>",indent); + break; + } + case XmlPullParser.END_TAG: + { + indent.setLength(indent.length()-indentStep.length()); + log("%s",indent, + getNamespacePrefix(parser.getPrefix()), + parser.getName()); + break; + } + case XmlPullParser.TEXT: + { + log("%s%s",indent,parser.getText()); + break; + } + } + } + } + catch (Exception e) { + e.printStackTrace(); + } + } + + private static String getNamespacePrefix(String prefix) { + if (prefix==null || prefix.length()==0) { + return ""; + } + return prefix+":"; + } + + private static String getAttributeValue(AXmlResourceParser parser,int index) { + int type=parser.getAttributeValueType(index); + int data=parser.getAttributeValueData(index); +// if (type==TypedValue.TYPE_STRING) { +// return parser.getAttributeValue(index); +// } +// if (type==TypedValue.TYPE_ATTRIBUTE) { +// return String.format("?%s%08X",getPackage(data),data); +// } +// if (type==TypedValue.TYPE_REFERENCE) { +// return String.format("@%s%08X",getPackage(data),data); +// } +// if (type==TypedValue.TYPE_FLOAT) { +// return String.valueOf(Float.intBitsToFloat(data)); +// } +// if (type==TypedValue.TYPE_INT_HEX) { +// return String.format("0x%08X",data); +// } +// if (type==TypedValue.TYPE_INT_BOOLEAN) { +// return data!=0?"true":"false"; +// } +// if (type==TypedValue.TYPE_DIMENSION) { +// return Float.toString(complexToFloat(data))+ +// DIMENSION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK]; +// } +// if (type==TypedValue.TYPE_FRACTION) { +// return Float.toString(complexToFloat(data))+ +// FRACTION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK]; +// } +// if (type>=TypedValue.TYPE_FIRST_COLOR_INT && type<=TypedValue.TYPE_LAST_COLOR_INT) { +// return String.format("#%08X",data); +// } +// if (type>=TypedValue.TYPE_FIRST_INT && type<=TypedValue.TYPE_LAST_INT) { +// return String.valueOf(data); +// } + return String.format("<0x%X, type 0x%02X>",data,type); + } + + private static String getPackage(int id) { + if (id>>>24==1) { + return "android:"; + } + return ""; + } + + private static void log(String format,Object...arguments) { + System.out.printf(format,arguments); + System.out.println(); + } + + /////////////////////////////////// ILLEGAL STUFF, DONT LOOK :) + + public static float complexToFloat(int complex) { + return (float)(complex & 0xFFFFFF00)*RADIX_MULTS[(complex>>4) & 3]; + } + + private static final float RADIX_MULTS[]={ + 0.00390625F,3.051758E-005F,1.192093E-007F,4.656613E-010F + }; + private static final String DIMENSION_UNITS[]={ + "px","dip","sp","pt","in","mm","","" + }; + private static final String FRACTION_UNITS[]={ + "%","%p","","","","","","" + }; } \ No newline at end of file diff --git a/axmlprinter/src/main/java/wind/v1/XmlPullParser.java b/loader/axmlprinter/src/main/java/wind/v1/XmlPullParser.java similarity index 100% rename from axmlprinter/src/main/java/wind/v1/XmlPullParser.java rename to loader/axmlprinter/src/main/java/wind/v1/XmlPullParser.java diff --git a/axmlprinter/src/main/java/wind/v1/XmlPullParserException.java b/loader/axmlprinter/src/main/java/wind/v1/XmlPullParserException.java similarity index 100% rename from axmlprinter/src/main/java/wind/v1/XmlPullParserException.java rename to loader/axmlprinter/src/main/java/wind/v1/XmlPullParserException.java diff --git a/axmlprinter/src/main/java/wind/v1/XmlPullParserFactory.java b/loader/axmlprinter/src/main/java/wind/v1/XmlPullParserFactory.java similarity index 100% rename from axmlprinter/src/main/java/wind/v1/XmlPullParserFactory.java rename to loader/axmlprinter/src/main/java/wind/v1/XmlPullParserFactory.java diff --git a/axmlprinter/src/main/java/wind/v1/XmlSerializer.java b/loader/axmlprinter/src/main/java/wind/v1/XmlSerializer.java similarity index 100% rename from axmlprinter/src/main/java/wind/v1/XmlSerializer.java rename to loader/axmlprinter/src/main/java/wind/v1/XmlSerializer.java