diff --git a/app/build.gradle b/app/build.gradle index da5592242..325c36426 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -82,9 +82,8 @@ dependencies { implementation 'com.google.android.material:material:1.2.0-alpha05' implementation 'com.getkeepsafe.relinker:relinker:1.4.1' implementation 'com.github.amlcurran.showcaseview:library:5.4.3' - implementation 'com.github.seven332.a7zip:extract-lite:d4ddec5793' + implementation 'com.github.seven332.a7zip:extract-lite:1b21783' implementation 'com.github.seven332:android-resource:0.1.0' - implementation 'com.github.seven332:animator:0.1.0' implementation 'com.github.seven332:beerbelly:0.1.4' implementation 'com.github.seven332:conaco:0.1.5-eh' implementation 'com.github.seven332:easyrecyclerview:0.1.1' diff --git a/app/src/main/java/com/hippo/ehviewer/EhApplication.java b/app/src/main/java/com/hippo/ehviewer/EhApplication.java index 677013cfe..9aa99ff22 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhApplication.java +++ b/app/src/main/java/com/hippo/ehviewer/EhApplication.java @@ -34,7 +34,7 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatDelegate; import androidx.collection.LruCache; -import com.getkeepsafe.relinker.ReLinker; +import com.hippo.a7zip.A7Zip; import com.hippo.beerbelly.SimpleDiskCache; import com.hippo.conaco.Conaco; import com.hippo.content.RecordingApplication; @@ -275,7 +275,7 @@ public class EhApplication extends RecordingApplication { EhEngine.initialize(); BitmapUtils.initialize(this); Image.initialize(this); - ReLinker.loadLibrary(this, "a7zip-extract-lite"); + A7Zip.initialize(this); if (EhDB.needMerge()) { EhDB.mergeOldDB(this); diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/A7ZipArchive.java b/app/src/main/java/com/hippo/ehviewer/gallery/A7ZipArchive.java index 7fafdc14e..ca445a895 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/A7ZipArchive.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/A7ZipArchive.java @@ -16,12 +16,13 @@ package com.hippo.ehviewer.gallery; +import androidx.annotation.NonNull; + import com.hippo.a7zip.ArchiveException; import com.hippo.a7zip.InArchive; -import com.hippo.a7zip.InStream; import com.hippo.a7zip.PropID; import com.hippo.a7zip.PropType; -import com.hippo.a7zip.SequentialOutStream; +import com.hippo.a7zip.SeekableInputStream; import com.hippo.unifile.UniRandomAccessFile; import java.io.Closeable; @@ -48,7 +49,7 @@ class A7ZipArchive implements Closeable { } static A7ZipArchive create(UniRandomAccessFile file) throws ArchiveException { - InStream store = new UniRandomAccessFileInStream(file); + SeekableInputStream store = new UniRandomAccessFileInStream(file); InArchive archive = InArchive.open(store); if ((archive.getArchivePropertyType(PropID.ENCRYPTED) == PropType.BOOL && archive.getArchiveBooleanProperty(PropID.ENCRYPTED)) || (archive.getArchivePropertyType(PropID.SOLID) == PropType.BOOL && archive.getArchiveBooleanProperty(PropID.SOLID)) @@ -102,8 +103,9 @@ class A7ZipArchive implements Closeable { } } - private static class UniRandomAccessFileInStream implements InStream { + private static class UniRandomAccessFileInStream extends SeekableInputStream { + private final byte[] scratch = new byte[8]; private UniRandomAccessFile file; public UniRandomAccessFileInStream(UniRandomAccessFile file) { @@ -125,6 +127,16 @@ class A7ZipArchive implements Closeable { return file.length(); } + @Override + public int read() throws IOException { + return (file.read(scratch, 0, 1) != -1) ? scratch[0] & 0xff : -1; + } + + @Override + public int read(@NonNull byte[] b) throws IOException { + return file.read(b, 0, b.length); + } + @Override public int read(byte[] b, int off, int len) throws IOException { return file.read(b, off, len); @@ -136,7 +148,7 @@ class A7ZipArchive implements Closeable { } } - private static class OutputStreamSequentialOutStream implements SequentialOutStream { + private static class OutputStreamSequentialOutStream extends OutputStream { private OutputStream stream; @@ -144,6 +156,11 @@ class A7ZipArchive implements Closeable { this.stream = stream; } + @Override + public void write(int b) throws IOException { + stream.write(b); + } + @Override public void write(byte[] b, int off, int len) throws IOException { stream.write(b, off, len); diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/ArchiveGalleryProvider.java b/app/src/main/java/com/hippo/ehviewer/gallery/ArchiveGalleryProvider.java index e6eb5845b..0de12d8f6 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ArchiveGalleryProvider.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ArchiveGalleryProvider.java @@ -66,7 +66,7 @@ public class ArchiveGalleryProvider extends GalleryProvider2 { private String error; public ArchiveGalleryProvider(Context context, Uri uri) { - file = UniFile.fromUri(context, uri); + file = UniFile.fromMediaUri(context, uri); } @Override diff --git a/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java index 52c996cfb..78a526bf5 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java @@ -195,6 +195,7 @@ public class GalleryActivity extends EhActivity implements SeekBar.OnSeekBarChan } else if (Intent.ACTION_VIEW.equals(mAction)) { if (mUri != null) { // Only support zip now + grantUriPermission(BuildConfig.APPLICATION_ID, mUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); mGalleryProvider = new ArchiveGalleryProvider(this, mUri); } }