diff --git a/app/src/main/java/com/hippo/ehviewer/Settings.java b/app/src/main/java/com/hippo/ehviewer/Settings.java index be92ea0bb..c6cb27c4e 100755 --- a/app/src/main/java/com/hippo/ehviewer/Settings.java +++ b/app/src/main/java/com/hippo/ehviewer/Settings.java @@ -41,6 +41,7 @@ import com.hippo.yorozuya.NumberUtils; import java.io.File; import java.util.Locale; +import java.util.Set; public class Settings { @@ -271,6 +272,11 @@ public class Settings { private static final int DEFAULT_DOWNLOAD_DELAY = 0; private static final String KEY_REQUEST_NEWS = "request_news"; private static final boolean DEFAULT_REQUEST_NEWS = true; + + + private static final String KEY_ARCHIVE_PASSWDS = "archive_passwds"; + + private static Context sContext; private static SharedPreferences sSettingsPre; private static EhConfig sEhConfig; @@ -384,6 +390,21 @@ public class Settings { sSettingsPre.edit().putString(key, value).apply(); } + public static Set getStringSet(String key) { + return sSettingsPre.getStringSet(key, null); + } + + public static void putStringToStringSet(String key, String value) { + Set set = getStringSet(key); + if (set == null) + set = Set.of(value); + else if (set.contains(value)) + return; + else + set.add(value); + sSettingsPre.edit().putStringSet(key, set).apply(); + } + public static int getIntFromStr(String key, int defValue) { try { return NumberUtils.parseIntSafely(sSettingsPre.getString(key, Integer.toString(defValue)), defValue); @@ -1139,4 +1160,12 @@ public class Settings { public static void putClipboardTextHashCode(int value) { putInt(KEY_CLIPBOARD_TEXT_HASH_CODE, value); } + + public static Set getArchivePasswds() { + return getStringSet(KEY_ARCHIVE_PASSWDS); + } + + public static void putPasswdToArchivePasswds(String value) { + putStringToStringSet(KEY_ARCHIVE_PASSWDS, value); + } } 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 dbcccc1e1..6eb20fdfc 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ArchiveGalleryProvider.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ArchiveGalleryProvider.java @@ -18,7 +18,6 @@ package com.hippo.ehviewer.gallery; import android.content.Context; import android.net.Uri; -import android.os.Bundle; import android.os.Handler; import android.os.Process; @@ -28,6 +27,7 @@ import androidx.annotation.Nullable; import com.hippo.UriArchiveAccessor; import com.hippo.ehviewer.GetText; import com.hippo.ehviewer.R; +import com.hippo.ehviewer.Settings; import com.hippo.glgallery.GalleryPageView; import com.hippo.image.Image; import com.hippo.unifile.UniFile; @@ -38,15 +38,15 @@ import java.io.InputStream; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; import java.util.Stack; import java.util.concurrent.atomic.AtomicInteger; public class ArchiveGalleryProvider extends GalleryProvider2 { + private static final AtomicInteger sIdGenerator = new AtomicInteger(); public static Handler showPasswd; public static String passwd; public static PVLock pv = new PVLock(0); - - private static final AtomicInteger sIdGenerator = new AtomicInteger(); private final UriArchiveAccessor archiveAccessor; private final Stack requests = new Stack<>(); private final AtomicInteger extractingIndex = new AtomicInteger(GalleryPageView.INVALID_INDEX); @@ -56,10 +56,8 @@ public class ArchiveGalleryProvider extends GalleryProvider2 { private Thread decodeThread; private volatile int size = STATE_WAIT; private String error; - private final Context ctx; public ArchiveGalleryProvider(Context context, Uri uri) { - ctx = context; UriArchiveAccessor archiveAccessor1; try { archiveAccessor1 = new UriArchiveAccessor(context, uri); @@ -172,7 +170,6 @@ public class ArchiveGalleryProvider extends GalleryProvider2 { private class ArchiveTask implements Runnable { private void waitPasswd() throws InterruptedException { - Bundle bundle = new Bundle(); showPasswd.sendEmptyMessage(0); pv.p(); } @@ -203,7 +200,17 @@ public class ArchiveGalleryProvider extends GalleryProvider2 { notifyDataChanged(); if (archiveAccessor.needPassword()) { - while (!Thread.currentThread().isInterrupted()) { + boolean need_request = true; + Set set = Settings.getArchivePasswds(); + if (set != null) { + for (String passwd : set) { + if (archiveAccessor.providePassword(passwd)) { + need_request = false; + break; + } + } + } + while (!Thread.currentThread().isInterrupted() && need_request) { try { waitPasswd(); } catch (InterruptedException e) { @@ -213,6 +220,7 @@ public class ArchiveGalleryProvider extends GalleryProvider2 { if (!archiveAccessor.providePassword(passwd)) notifyError(); else { + Settings.putPasswdToArchivePasswds(passwd); notifyDismiss(); break; }