From 4b3488026d7bf4adbba558b31c379e27f7af3ebb Mon Sep 17 00:00:00 2001 From: NekoInverter <42698724+NekoInverter@users.noreply.github.com> Date: Fri, 3 Apr 2020 15:50:20 +0800 Subject: [PATCH] Remove unused codes --- app/build.gradle | 2 +- app/proguard-rules.pro | 3 +- .../com/hippo/drawable/AddDeleteDrawable.java | 10 ++- .../main/java/com/hippo/ehviewer/Crash.java | 3 - .../java/com/hippo/ehviewer/Settings.java | 2 +- .../com/hippo/ehviewer/client/EhClient.java | 9 +-- .../java/com/hippo/ehviewer/client/EhDns.java | 2 - .../java/com/hippo/ehviewer/client/EhUrl.java | 2 +- .../ehviewer/download/DownloadManager.java | 19 ++--- .../ehviewer/download/DownloadService.java | 6 +- .../gallery/ArchiveGalleryProvider.java | 10 ++- .../preference/CleanRedundancyPreference.java | 17 +++-- .../ClearDownloadPathCachePreference.java | 1 + .../preference/IdentityCookiePreference.java | 3 + .../preference/RestoreDownloadPreference.java | 23 +++--- .../SignInRequiredActivityPreference.java | 26 +++---- .../preference/SignOutPreference.java | 13 +++- .../com/hippo/ehviewer/spider/SpiderInfo.java | 4 +- .../hippo/ehviewer/spider/SpiderQueen.java | 56 +++++++-------- .../hippo/ehviewer/ui/CommonOperations.java | 55 +++++++------- .../com/hippo/ehviewer/ui/MainActivity.java | 5 +- .../ehviewer/ui/SetSecurityActivity.java | 8 +-- .../hippo/ehviewer/ui/SettingsActivity.java | 15 ++++ .../ehviewer/ui/fragment/AboutFragment.java | 51 ------------- .../ui/fragment/AdvancedFragment.java | 48 +++---------- .../ui/fragment/DownloadFragment.java | 9 +-- .../ehviewer/ui/scene/DownloadsScene.java | 2 +- .../ui/scene/GalleryCommentsScene.java | 2 +- .../ehviewer/ui/scene/GalleryDetailScene.java | 2 +- .../ehviewer/ui/scene/QuickSearchScene.java | 2 - .../ehviewer/ui/scene/SecurityScene.java | 14 ++-- .../com/hippo/io/FileInputStreamPipe.java | 64 ----------------- .../com/hippo/io/FileOutputStreamPipe.java | 64 ----------------- .../com/hippo/reveal/ViewAnimationUtils.java | 28 -------- .../com/hippo/util/PermissionRequester.java | 67 ------------------ .../drawable-hdpi/drawer_shadow_left.9.png | Bin 114 -> 0 bytes .../drawable-hdpi/drawer_shadow_right.9.png | Bin 116 -> 0 bytes app/src/main/res/drawable-hdpi/ic_fp_40px.png | Bin 7011 -> 0 bytes .../drawable-mdpi/drawer_shadow_left.9.png | Bin 100 -> 0 bytes .../drawable-mdpi/drawer_shadow_right.9.png | Bin 102 -> 0 bytes app/src/main/res/drawable-mdpi/ic_fp_40px.png | Bin 4001 -> 0 bytes .../drawable-xhdpi/drawer_shadow_left.9.png | Bin 127 -> 0 bytes .../drawable-xhdpi/drawer_shadow_right.9.png | Bin 129 -> 0 bytes .../main/res/drawable-xhdpi/ic_fp_40px.png | Bin 10524 -> 0 bytes .../drawable-xxhdpi/drawer_shadow_left.9.png | Bin 155 -> 0 bytes .../drawable-xxhdpi/drawer_shadow_right.9.png | Bin 156 -> 0 bytes .../main/res/drawable-xxhdpi/ic_fp_40px.png | Bin 16848 -> 0 bytes 47 files changed, 169 insertions(+), 478 deletions(-) delete mode 100644 app/src/main/java/com/hippo/io/FileInputStreamPipe.java delete mode 100644 app/src/main/java/com/hippo/io/FileOutputStreamPipe.java delete mode 100644 app/src/main/java/com/hippo/reveal/ViewAnimationUtils.java delete mode 100644 app/src/main/java/com/hippo/util/PermissionRequester.java delete mode 100644 app/src/main/res/drawable-hdpi/drawer_shadow_left.9.png delete mode 100644 app/src/main/res/drawable-hdpi/drawer_shadow_right.9.png delete mode 100755 app/src/main/res/drawable-hdpi/ic_fp_40px.png delete mode 100644 app/src/main/res/drawable-mdpi/drawer_shadow_left.9.png delete mode 100644 app/src/main/res/drawable-mdpi/drawer_shadow_right.9.png delete mode 100755 app/src/main/res/drawable-mdpi/ic_fp_40px.png delete mode 100644 app/src/main/res/drawable-xhdpi/drawer_shadow_left.9.png delete mode 100644 app/src/main/res/drawable-xhdpi/drawer_shadow_right.9.png delete mode 100755 app/src/main/res/drawable-xhdpi/ic_fp_40px.png delete mode 100644 app/src/main/res/drawable-xxhdpi/drawer_shadow_left.9.png delete mode 100644 app/src/main/res/drawable-xxhdpi/drawer_shadow_right.9.png delete mode 100755 app/src/main/res/drawable-xxhdpi/ic_fp_40px.png diff --git a/app/build.gradle b/app/build.gradle index ecf1b6115..992b8828f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -50,7 +50,7 @@ android { release { minifyEnabled true shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' buildConfigField 'String', 'FILE_PROVIDER_AUTHORITY', '"com.hippo.ehviewer.fileprovider"' signingConfig signingConfigs.release } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 1d7f668ed..448b9937d 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -17,4 +17,5 @@ #} -keepattributes SourceFile,LineNumberTable --keep class com.hippo.** { *; } \ No newline at end of file +-keep class com.hippo.** { *; } +-repackageclasses '' \ No newline at end of file diff --git a/app/src/main/java/com/hippo/drawable/AddDeleteDrawable.java b/app/src/main/java/com/hippo/drawable/AddDeleteDrawable.java index 80c6daeae..eb0169e98 100644 --- a/app/src/main/java/com/hippo/drawable/AddDeleteDrawable.java +++ b/app/src/main/java/com/hippo/drawable/AddDeleteDrawable.java @@ -26,7 +26,8 @@ import android.graphics.Path; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.os.Build; + +import androidx.annotation.Keep; import com.hippo.ehviewer.R; import com.hippo.yorozuya.MathUtils; @@ -118,12 +119,11 @@ public class AddDeleteDrawable extends Drawable { mAutoUpdateMirror = autoUpdateMirror; } - @SuppressWarnings("unused") public float getProgress() { return mProgress; } - @SuppressWarnings("unused") + @Keep public void setProgress(float progress) { if (mAutoUpdateMirror) { if (progress == 1f) { @@ -152,9 +152,7 @@ public class AddDeleteDrawable extends Drawable { } else { ObjectAnimator oa = ObjectAnimator.ofFloat(this, "progress", endProgress); oa.setDuration(duration); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { - oa.setAutoCancel(true); - } + oa.setAutoCancel(true); oa.start(); } } diff --git a/app/src/main/java/com/hippo/ehviewer/Crash.java b/app/src/main/java/com/hippo/ehviewer/Crash.java index f0b673a5c..b4f021d86 100644 --- a/app/src/main/java/com/hippo/ehviewer/Crash.java +++ b/app/src/main/java/com/hippo/ehviewer/Crash.java @@ -145,9 +145,6 @@ public final class Crash { fw.write("RADIO="); fw.write(Build.getRadioVersion()); fw.write("\r\n"); - fw.write("SERIAL="); - fw.write(Build.SERIAL); - fw.write("\r\n"); fw.write("TAGS="); fw.write(Build.TAGS); fw.write("\r\n"); diff --git a/app/src/main/java/com/hippo/ehviewer/Settings.java b/app/src/main/java/com/hippo/ehviewer/Settings.java index c45fbd98a..7f4559a93 100755 --- a/app/src/main/java/com/hippo/ehviewer/Settings.java +++ b/app/src/main/java/com/hippo/ehviewer/Settings.java @@ -971,7 +971,7 @@ public class Settings { } public static boolean getEnableFingerprint() { - return getBoolean(KEY_ENABLE_FINGERPRINT, false); + return getBoolean(KEY_ENABLE_FINGERPRINT, true); } public static void putEnableFingerprint(boolean value) { diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhClient.java b/app/src/main/java/com/hippo/ehviewer/client/EhClient.java index dd6d708d7..8b0335f03 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhClient.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhClient.java @@ -116,13 +116,7 @@ public class EhClient { if (mCallback != null) { // TODO Avoid new runnable - final Callback finalCallback = mCallback; - SimpleHandler.getInstance().post(new Runnable() { - @Override - public void run() { - finalCallback.onCancel(); - } - }); + SimpleHandler.getInstance().post(mCallback::onCancel); } Status status = getStatus(); @@ -144,7 +138,6 @@ public class EhClient { } @Override - @SuppressWarnings("unchecked") protected Object doInBackground(Object... params) { try { switch (mMethod) { diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhDns.java b/app/src/main/java/com/hippo/ehviewer/client/EhDns.java index 5e9eaca36..106f8d752 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhDns.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhDns.java @@ -67,8 +67,6 @@ public class EhDns implements Dns { @Override public List lookup(String hostname) throws UnknownHostException { - if (hostname == null) throw new UnknownHostException("hostname == null"); - InetAddress inetAddress = hosts.get(hostname); if (inetAddress != null) { return Collections.singletonList(inetAddress); diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java b/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java index c5240a0d6..a0468e2d5 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java @@ -221,7 +221,7 @@ public class EhUrl { HttpUrl url = HttpUrl.parse(originUrl); if (url == null) return originUrl; List pathSegments = url.pathSegments(); - if (pathSegments == null || pathSegments.size() < 3) return originUrl; + if (pathSegments.size() < 3) return originUrl; ListIterator iterator = pathSegments.listIterator(pathSegments.size()); // The last segments, like diff --git a/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.java b/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.java index 22f1c1cba..2905fc6ba 100644 --- a/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.java +++ b/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.java @@ -55,12 +55,7 @@ import java.util.Map; public class DownloadManager implements SpiderQueen.OnSpiderListener { private static final String TAG = DownloadManager.class.getSimpleName(); - private static final Comparator DATE_DESC_COMPARATOR = new Comparator() { - @Override - public int compare(DownloadInfo lhs, DownloadInfo rhs) { - return lhs.time - rhs.time > 0 ? -1 : 1; - } - }; + private static final Comparator DATE_DESC_COMPARATOR = (lhs, rhs) -> lhs.time - rhs.time > 0 ? -1 : 1; private final Context mContext; // All download info list private final LinkedList mAllInfoList; @@ -95,7 +90,7 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { HashMap> map = new HashMap<>(); mMap = map; for (DownloadLabel label : labels) { - map.put(label.getLabel(), new LinkedList()); + map.put(label.getLabel(), new LinkedList<>()); } // Create default for non tag @@ -340,15 +335,13 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { void startAllDownload() { boolean update = false; // Start all STATE_NONE and STATE_FAILED item - LinkedList allInfoList = mAllInfoList; - LinkedList waitList = mWaitList; - for (DownloadInfo info : allInfoList) { + for (DownloadInfo info : mAllInfoList) { if (info.state == DownloadInfo.STATE_NONE || info.state == DownloadInfo.STATE_FAILED) { update = true; // Set state DownloadInfo.STATE_WAIT info.state = DownloadInfo.STATE_WAIT; // Add to wait list - waitList.add(info); + mWaitList.add(info); // Update in DB EhDB.putDownloadInfo(info); } @@ -413,7 +406,7 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { for (DownloadLabel label : downloadLabelList) { String labelString = label.getLabel(); if (!containLabel(labelString)) { - mMap.put(labelString, new LinkedList()); + mMap.put(labelString, new LinkedList<>()); mLabelList.add(EhDB.addDownloadLabel(label)); } } @@ -748,7 +741,7 @@ public class DownloadManager implements SpiderQueen.OnSpiderListener { } mLabelList.add(EhDB.addDownloadLabel(label)); - mMap.put(label, new LinkedList()); + mMap.put(label, new LinkedList<>()); for (DownloadInfoListener l : mDownloadInfoListeners) { l.onUpdateLabels(); diff --git a/app/src/main/java/com/hippo/ehviewer/download/DownloadService.java b/app/src/main/java/com/hippo/ehviewer/download/DownloadService.java index f34aa3bda..95eeab091 100644 --- a/app/src/main/java/com/hippo/ehviewer/download/DownloadService.java +++ b/app/src/main/java/com/hippo/ehviewer/download/DownloadService.java @@ -104,7 +104,7 @@ public class DownloadService extends Service implements DownloadManager.Download CHANNEL_ID = getPackageName() + ".download"; mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && mNotifyManager != null) { mNotifyManager.createNotificationChannel(new NotificationChannel(CHANNEL_ID, getString(R.string.download_service), NotificationManager.IMPORTANCE_LOW)); } @@ -203,7 +203,6 @@ public class DownloadService extends Service implements DownloadManager.Download throw new IllegalStateException("No bindService"); } - @SuppressWarnings("deprecation") private void ensureDownloadingBuilder() { if (mDownloadingBuilder != null) { return; @@ -422,11 +421,10 @@ public class DownloadService extends Service implements DownloadManager.Download style = new NotificationCompat.InboxStyle(); style.setBigContentTitle(getString(R.string.stat_download_done_title)); SparseJBArray stateArray = sItemStateArray; - SparseJLArray titleArray = sItemTitleArray; for (int i = 0, n = stateArray.size(); i < n; i++) { long id = stateArray.keyAt(i); boolean fin = stateArray.valueAt(i); - String title = titleArray.get(id); + String title = sItemTitleArray.get(id); if (title == null) { continue; } 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 0de12d8f6..63fdf456a 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ArchiveGalleryProvider.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ArchiveGalleryProvider.java @@ -161,12 +161,10 @@ public class ArchiveGalleryProvider extends GalleryProvider2 { @Override public void run() { UniRandomAccessFile uraf = null; - if (file != null) { - try { - uraf = file.createRandomAccessFile("r"); - } catch (IOException e) { - e.printStackTrace(); - } + try { + uraf = file.createRandomAccessFile("r"); + } catch (IOException e) { + e.printStackTrace(); } if (uraf == null) { size = STATE_ERROR; diff --git a/app/src/main/java/com/hippo/ehviewer/preference/CleanRedundancyPreference.java b/app/src/main/java/com/hippo/ehviewer/preference/CleanRedundancyPreference.java index f66207e44..049c0afdc 100644 --- a/app/src/main/java/com/hippo/ehviewer/preference/CleanRedundancyPreference.java +++ b/app/src/main/java/com/hippo/ehviewer/preference/CleanRedundancyPreference.java @@ -16,9 +16,9 @@ package com.hippo.ehviewer.preference; +import android.annotation.SuppressLint; import android.content.Context; import android.util.AttributeSet; -import android.widget.Toast; import androidx.annotation.NonNull; @@ -26,6 +26,8 @@ import com.hippo.ehviewer.EhApplication; import com.hippo.ehviewer.R; import com.hippo.ehviewer.Settings; import com.hippo.ehviewer.download.DownloadManager; +import com.hippo.ehviewer.ui.SettingsActivity; +import com.hippo.ehviewer.ui.scene.BaseScene; import com.hippo.unifile.UniFile; import com.hippo.yorozuya.NumberUtils; @@ -51,13 +53,14 @@ public class CleanRedundancyPreference extends TaskPreference { private static class ClearTask extends Task { - private final EhApplication mApplication; + @SuppressLint("StaticFieldLeak") + private final SettingsActivity mActivity; private final DownloadManager mManager; public ClearTask(@NonNull Context context) { super(context); - mApplication = (EhApplication) context.getApplicationContext(); - mManager = EhApplication.getDownloadManager(mApplication); + mActivity = (SettingsActivity) context; + mManager = EhApplication.getDownloadManager(context.getApplicationContext()); } // True for cleared @@ -111,9 +114,9 @@ public class CleanRedundancyPreference extends TaskPreference { count = 0; } - Toast.makeText(mApplication, 0 == count ? - mApplication.getString(R.string.settings_download_clean_redundancy_no_redundancy) : - mApplication.getString(R.string.settings_download_clean_redundancy_done, count), Toast.LENGTH_SHORT).show(); + mActivity.showTip(0 == count ? + mActivity.getString(R.string.settings_download_clean_redundancy_no_redundancy) : + mActivity.getString(R.string.settings_download_clean_redundancy_done, count), BaseScene.LENGTH_SHORT); super.onPostExecute(o); } } diff --git a/app/src/main/java/com/hippo/ehviewer/preference/ClearDownloadPathCachePreference.java b/app/src/main/java/com/hippo/ehviewer/preference/ClearDownloadPathCachePreference.java index 8e68d35c4..7e5def27e 100644 --- a/app/src/main/java/com/hippo/ehviewer/preference/ClearDownloadPathCachePreference.java +++ b/app/src/main/java/com/hippo/ehviewer/preference/ClearDownloadPathCachePreference.java @@ -51,6 +51,7 @@ public class ClearDownloadPathCachePreference extends MessagePreference { protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { super.onPrepareDialogBuilder(builder); builder.setTitle(null); + builder.setNegativeButton(android.R.string.cancel, null); } @Override diff --git a/app/src/main/java/com/hippo/ehviewer/preference/IdentityCookiePreference.java b/app/src/main/java/com/hippo/ehviewer/preference/IdentityCookiePreference.java index 1a5e4e10a..9689830e6 100644 --- a/app/src/main/java/com/hippo/ehviewer/preference/IdentityCookiePreference.java +++ b/app/src/main/java/com/hippo/ehviewer/preference/IdentityCookiePreference.java @@ -104,6 +104,9 @@ public class IdentityCookiePreference extends MessagePreference { IdentityCookiePreference.this.onClick(dialog, which); }); + builder.setNegativeButton(android.R.string.cancel, null); + } else { + builder.setPositiveButton(android.R.string.ok, null); } } } diff --git a/app/src/main/java/com/hippo/ehviewer/preference/RestoreDownloadPreference.java b/app/src/main/java/com/hippo/ehviewer/preference/RestoreDownloadPreference.java index 6049e1046..30ef4cf4b 100644 --- a/app/src/main/java/com/hippo/ehviewer/preference/RestoreDownloadPreference.java +++ b/app/src/main/java/com/hippo/ehviewer/preference/RestoreDownloadPreference.java @@ -16,11 +16,11 @@ package com.hippo.ehviewer.preference; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.os.Parcel; import android.util.AttributeSet; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.preference.Preference; @@ -35,6 +35,8 @@ import com.hippo.ehviewer.client.data.GalleryInfo; import com.hippo.ehviewer.download.DownloadManager; import com.hippo.ehviewer.spider.SpiderInfo; import com.hippo.ehviewer.spider.SpiderQueen; +import com.hippo.ehviewer.ui.SettingsActivity; +import com.hippo.ehviewer.ui.scene.BaseScene; import com.hippo.unifile.UniFile; import com.hippo.util.ExceptionUtils; import com.hippo.yorozuya.IOUtils; @@ -69,15 +71,16 @@ public class RestoreDownloadPreference extends TaskPreference { private static class RestoreTask extends Task { - private final EhApplication mApplication; + @SuppressLint("StaticFieldLeak") + private final SettingsActivity mActivity; private final DownloadManager mManager; private final OkHttpClient mHttpClient; public RestoreTask(@NonNull Context context) { super(context); - mApplication = (EhApplication) context.getApplicationContext(); - mManager = EhApplication.getDownloadManager(mApplication); - mHttpClient = EhApplication.getOkHttpClient(mApplication); + mActivity = (SettingsActivity) context; + mManager = EhApplication.getDownloadManager(context.getApplicationContext()); + mHttpClient = EhApplication.getOkHttpClient(context.getApplicationContext()); } private RestoreItem getRestoreItem(UniFile file) { @@ -151,11 +154,11 @@ public class RestoreDownloadPreference extends TaskPreference { @SuppressWarnings("unchecked") protected void onPostExecute(Object o) { if (!(o instanceof List)) { - Toast.makeText(mApplication, R.string.settings_download_restore_failed, Toast.LENGTH_SHORT).show(); + mActivity.showTip(R.string.settings_download_restore_failed, BaseScene.LENGTH_SHORT); } else { List list = (List) o; if (list.isEmpty()) { - Toast.makeText(mApplication, R.string.settings_download_restore_not_found, Toast.LENGTH_SHORT).show(); + mActivity.showTip(R.string.settings_download_restore_not_found, BaseScene.LENGTH_SHORT); } else { int count = 0; for (int i = 0, n = list.size(); i < n; i++) { @@ -169,9 +172,9 @@ public class RestoreDownloadPreference extends TaskPreference { count++; } } - Toast.makeText(mApplication, - mApplication.getString(R.string.settings_download_restore_successfully, count), - Toast.LENGTH_SHORT).show(); + mActivity.showTip( + mActivity.getString(R.string.settings_download_restore_successfully, count), + BaseScene.LENGTH_SHORT); Preference preference = getPreference(); if (null != preference) { diff --git a/app/src/main/java/com/hippo/ehviewer/preference/SignInRequiredActivityPreference.java b/app/src/main/java/com/hippo/ehviewer/preference/SignInRequiredActivityPreference.java index cf2fd3e82..60c76a33f 100644 --- a/app/src/main/java/com/hippo/ehviewer/preference/SignInRequiredActivityPreference.java +++ b/app/src/main/java/com/hippo/ehviewer/preference/SignInRequiredActivityPreference.java @@ -16,42 +16,38 @@ package com.hippo.ehviewer.preference; +import android.annotation.SuppressLint; import android.content.Context; import android.util.AttributeSet; -import android.view.View; -import android.widget.Toast; -import androidx.preference.PreferenceViewHolder; - -import com.google.android.material.snackbar.Snackbar; import com.hippo.ehviewer.EhApplication; import com.hippo.ehviewer.R; import com.hippo.ehviewer.client.EhCookieStore; import com.hippo.ehviewer.client.EhUrl; +import com.hippo.ehviewer.ui.SettingsActivity; +import com.hippo.ehviewer.ui.scene.BaseScene; import com.hippo.preference.ActivityPreference; import okhttp3.HttpUrl; public class SignInRequiredActivityPreference extends ActivityPreference { - private View view; + @SuppressLint("StaticFieldLeak") + private final SettingsActivity mActivity; public SignInRequiredActivityPreference(Context context) { super(context); + mActivity = (SettingsActivity) context; } public SignInRequiredActivityPreference(Context context, AttributeSet attrs) { super(context, attrs); + mActivity = (SettingsActivity) context; } public SignInRequiredActivityPreference(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); - } - - @Override - public void onBindViewHolder(PreferenceViewHolder holder) { - view = holder.itemView; - super.onBindViewHolder(holder); + mActivity = (SettingsActivity) context; } @Override @@ -66,11 +62,7 @@ public class SignInRequiredActivityPreference extends ActivityPreference { store.contains(ex, EhCookieStore.KEY_IPD_PASS_HASH)) { super.onClick(); } else { - if (view != null) { - Snackbar.make(view, R.string.error_please_login_first, 3000).show(); - } else { - Toast.makeText(getContext(), R.string.error_please_login_first, Toast.LENGTH_LONG).show(); - } + mActivity.showTip(R.string.error_please_login_first, BaseScene.LENGTH_SHORT); } } } diff --git a/app/src/main/java/com/hippo/ehviewer/preference/SignOutPreference.java b/app/src/main/java/com/hippo/ehviewer/preference/SignOutPreference.java index 3e2b0b0ec..aaa2bc795 100644 --- a/app/src/main/java/com/hippo/ehviewer/preference/SignOutPreference.java +++ b/app/src/main/java/com/hippo/ehviewer/preference/SignOutPreference.java @@ -16,31 +16,39 @@ package com.hippo.ehviewer.preference; +import android.annotation.SuppressLint; import android.content.Context; import android.util.AttributeSet; -import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import com.hippo.ehviewer.R; import com.hippo.ehviewer.client.EhUtils; +import com.hippo.ehviewer.ui.SettingsActivity; +import com.hippo.ehviewer.ui.scene.BaseScene; import com.hippo.preference.MessagePreference; public class SignOutPreference extends MessagePreference { + @SuppressLint("StaticFieldLeak") + private final SettingsActivity mActivity; + public SignOutPreference(Context context) { super(context); init(); + mActivity = (SettingsActivity) context; } public SignOutPreference(Context context, AttributeSet attrs) { super(context, attrs); init(); + mActivity = (SettingsActivity) context; } public SignOutPreference(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); + mActivity = (SettingsActivity) context; } private void init() { @@ -51,6 +59,7 @@ public class SignOutPreference extends MessagePreference { protected void onPrepareDialogBuilder(AlertDialog.Builder builder) { super.onPrepareDialogBuilder(builder); builder.setPositiveButton(R.string.settings_eh_sign_out_yes, this); + builder.setNegativeButton(android.R.string.cancel, null); } @Override @@ -58,7 +67,7 @@ public class SignOutPreference extends MessagePreference { super.onDialogClosed(positiveResult); if (positiveResult) { EhUtils.signOut(getContext()); - Toast.makeText(getContext(), R.string.settings_eh_sign_out_tip, Toast.LENGTH_SHORT).show(); + mActivity.showTip(R.string.settings_eh_sign_out_tip, BaseScene.LENGTH_SHORT); } } } diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.java b/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.java index 80d65cbb7..1bc94178a 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.java +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderInfo.java @@ -78,7 +78,7 @@ public class SpiderInfo { } } - return startPage >= 0 ? startPage : 0; + return Math.max(startPage, 0); } private static int getVersion(String str) { @@ -171,7 +171,7 @@ public class SpiderInfo { writer.write(VERSION_STR); writer.write(Integer.toString(VERSION)); writer.write("\n"); - writer.write(String.format("%08x", startPage >= 0 ? startPage : 0)); // Avoid negative + writer.write(String.format("%08x", Math.max(startPage, 0))); // Avoid negative writer.write("\n"); writer.write(Long.toString(gid)); writer.write("\n"); diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java index 532d4e51d..0879d5565 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java @@ -167,7 +167,7 @@ public final class SpiderQueen implements Runnable { } mWorkerPoolExecutor = new ThreadPoolExecutor(mWorkerMaxCount, mWorkerMaxCount, - 0, TimeUnit.SECONDS, new LinkedBlockingDeque(), + 0, TimeUnit.SECONDS, new LinkedBlockingDeque<>(), new PriorityThreadFactory(SpiderWorker.class.getSimpleName(), Process.THREAD_PRIORITY_BACKGROUND)); } @@ -1019,6 +1019,33 @@ public final class SpiderQueen implements Runnable { void onGetImageFailure(int index, String error); } + private static class AutoCloseInputStream extends InputStream { + + private final InputStreamPipe mPipe; + private final InputStream mIs; + + public AutoCloseInputStream(InputStreamPipe pipe, InputStream is) { + mPipe = pipe; + mIs = is; + } + + @Override + public int read() throws IOException { + return mIs.read(); + } + + @Override + public int read(@NonNull byte[] buffer, int byteOffset, int byteCount) throws IOException { + return mIs.read(buffer, byteOffset, byteCount); + } + + @Override + public void close() throws IOException { + mPipe.close(); + mPipe.release(); + } + } + private class SpiderWorker implements Runnable { private final long mGid; @@ -1606,31 +1633,4 @@ public final class SpiderQueen implements Runnable { } } } - - private class AutoCloseInputStream extends InputStream { - - private final InputStreamPipe mPipe; - private final InputStream mIs; - - public AutoCloseInputStream(InputStreamPipe pipe, InputStream is) { - mPipe = pipe; - mIs = is; - } - - @Override - public int read() throws IOException { - return mIs.read(); - } - - @Override - public int read(@NonNull byte[] buffer, int byteOffset, int byteCount) throws IOException { - return mIs.read(buffer, byteOffset, byteCount); - } - - @Override - public void close() throws IOException { - mPipe.close(); - mPipe.release(); - } - } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.java b/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.java index 35fcb4a18..1f790b873 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.java @@ -23,8 +23,6 @@ import android.content.pm.PackageManager; import android.os.AsyncTask; import android.util.Log; -import androidx.appcompat.app.AlertDialog; - import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.hippo.app.ListCheckBoxDialogBuilder; import com.hippo.ehviewer.EhApplication; @@ -192,36 +190,33 @@ public final class CommonOperations { } new ListCheckBoxDialogBuilder(activity, items, - new ListCheckBoxDialogBuilder.OnItemClickListener() { - @Override - public void onItemClick(ListCheckBoxDialogBuilder builder, AlertDialog dialog, int position) { - String label; - if (position == 0) { - label = null; - } else { - label = items[position]; - if (!dm.containLabel(label)) { - label = null; - } + (builder, dialog, position) -> { + String label1; + if (position == 0) { + label1 = null; + } else { + label1 = items[position]; + if (!dm.containLabel(label1)) { + label1 = null; } - // Start download - for (GalleryInfo gi : toAdd) { - Intent intent = new Intent(activity, DownloadService.class); - intent.setAction(DownloadService.ACTION_START); - intent.putExtra(DownloadService.KEY_LABEL, label); - intent.putExtra(DownloadService.KEY_GALLERY_INFO, gi); - activity.startService(intent); - } - // Save settings - if (builder.isChecked()) { - Settings.putHasDefaultDownloadLabel(true); - Settings.putDefaultDownloadLabel(label); - } else { - Settings.putHasDefaultDownloadLabel(false); - } - // Notify - activity.showTip(R.string.added_to_download_list, BaseScene.LENGTH_SHORT); } + // Start download + for (GalleryInfo gi : toAdd) { + Intent intent = new Intent(activity, DownloadService.class); + intent.setAction(DownloadService.ACTION_START); + intent.putExtra(DownloadService.KEY_LABEL, label1); + intent.putExtra(DownloadService.KEY_GALLERY_INFO, gi); + activity.startService(intent); + } + // Save settings + if (builder.isChecked()) { + Settings.putHasDefaultDownloadLabel(true); + Settings.putDefaultDownloadLabel(label1); + } else { + Settings.putHasDefaultDownloadLabel(false); + } + // Notify + activity.showTip(R.string.added_to_download_list, BaseScene.LENGTH_SHORT); }, activity.getString(R.string.remember_download_label), false) .setTitle(R.string.download) .show(); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java index 375f3bad6..8a73e2cca 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java @@ -55,7 +55,6 @@ import com.hippo.ehviewer.client.EhUtils; import com.hippo.ehviewer.client.data.ListUrlBuilder; import com.hippo.ehviewer.client.parser.GalleryDetailUrlParser; import com.hippo.ehviewer.client.parser.GalleryPageUrlParser; -import com.hippo.ehviewer.ui.scene.AnalyticsScene; import com.hippo.ehviewer.ui.scene.BaseScene; import com.hippo.ehviewer.ui.scene.CookieSignInScene; import com.hippo.ehviewer.ui.scene.DownloadLabelsScene; @@ -106,7 +105,7 @@ public final class MainActivity extends StageActivity static { registerLaunchMode(SecurityScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK); registerLaunchMode(WarningScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK); - registerLaunchMode(AnalyticsScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK); + //registerLaunchMode(AnalyticsScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK); registerLaunchMode(SignInScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK); registerLaunchMode(WebViewSignInScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK); registerLaunchMode(CookieSignInScene.class, SceneFragment.LAUNCH_MODE_SINGLE_TASK); @@ -597,7 +596,7 @@ public final class MainActivity extends StageActivity public void showTip(CharSequence message, int length) { if (null != mDrawerLayout) { Snackbar.make(mDrawerLayout, message, - length == BaseScene.LENGTH_LONG ? 5000 : 3000).show(); + length == BaseScene.LENGTH_LONG ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT).show(); } else { Toast.makeText(this, message, length == BaseScene.LENGTH_LONG ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/SetSecurityActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/SetSecurityActivity.java index d863e5c75..712db5f14 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/SetSecurityActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/SetSecurityActivity.java @@ -59,11 +59,9 @@ public class SetSecurityActivity extends ToolbarActivity implements View.OnClick LockPatternUtils.stringToPattern(pattern)); } - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { - if (BiometricManager.from(this).canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS) { - mFingerprint.setVisibility(View.VISIBLE); - mFingerprint.setChecked(Settings.getEnableFingerprint()); - } + if (BiometricManager.from(this).canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS) { + mFingerprint.setVisibility(View.VISIBLE); + mFingerprint.setChecked(Settings.getEnableFingerprint()); } mCancel.setOnClickListener(this); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java index 95d7b3819..78c5db195 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java @@ -19,10 +19,13 @@ package com.hippo.ehviewer.ui; import android.os.Bundle; import android.view.MenuItem; +import androidx.annotation.StringRes; import androidx.appcompat.app.ActionBar; +import com.google.android.material.snackbar.Snackbar; import com.hippo.ehviewer.R; import com.hippo.ehviewer.ui.fragment.SettingsFragment; +import com.hippo.ehviewer.ui.scene.BaseScene; public final class SettingsActivity extends EhActivity { @@ -42,6 +45,18 @@ public final class SettingsActivity extends EhActivity { } } + public void showTip(@StringRes int id, int length) { + showTip(getString(id), length); + } + + /** + * If activity is running, show snack bar, otherwise show toast + */ + public void showTip(CharSequence message, int length) { + Snackbar.make(findViewById(R.id.snackbar), message, + length == BaseScene.LENGTH_LONG ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT).show(); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/AboutFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/AboutFragment.java index ae519e02a..bdb7f36be 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/AboutFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/AboutFragment.java @@ -16,30 +16,18 @@ package com.hippo.ehviewer.ui.fragment; -import android.content.ClipData; -import android.content.ClipboardManager; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; import android.os.Bundle; -import android.util.Base64; -import android.widget.TextView; -import android.widget.Toast; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import com.google.android.gms.oss.licenses.OssLicensesMenuActivity; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.hippo.ehviewer.EhApplication; import com.hippo.ehviewer.R; import com.hippo.ehviewer.ui.CommonOperations; import com.hippo.util.AppHelper; import com.takisoft.preferencex.PreferenceFragmentCompat; -import java.nio.charset.StandardCharsets; - public class AboutFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener { @@ -47,11 +35,6 @@ public class AboutFragment extends PreferenceFragmentCompat private static final String KEY_DONATE = "donate"; private static final String KEY_CHECK_FOR_UPDATES = "check_for_updates"; - private static String base64Decode(String encoded) { - byte[] bytes = Base64.decode(encoded, Base64.DEFAULT); - return new String(bytes, StandardCharsets.UTF_8); - } - @Override public void onCreatePreferencesFix(@Nullable Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.about_settings); @@ -74,43 +57,9 @@ public class AboutFragment extends PreferenceFragmentCompat if (KEY_AUTHOR.equals(key)) { AppHelper.sendEmail(requireActivity(), EhApplication.getDeveloperEmail(), "About EhViewer", null); - } else if (KEY_DONATE.equals(key)) { - showDonationDialog(); } else if (KEY_CHECK_FOR_UPDATES.equals(key)) { CommonOperations.checkUpdate(getActivity(), true); } return true; } - - private void showDonationDialog() { - AlertDialog dialog = new MaterialAlertDialogBuilder(requireActivity()) - .setView(R.layout.dialog_donate) - .show(); - - String alipayStr = base64Decode("c2V2ZW4zMzJAMTYzLmNvbQ=="); - TextView alipayText = dialog.findViewById(R.id.alipay_text); - alipayText.setText(alipayStr); - dialog.findViewById(R.id.alipay_copy).setOnClickListener(v -> copyToClipboard(alipayStr)); - - String paypalStr = base64Decode("aHR0cHM6Ly9wYXlwYWwubWUvc2V2ZW4zMzI="); - TextView paypalText = dialog.findViewById(R.id.paypal_text); - paypalText.setText(paypalStr); - dialog.findViewById(R.id.paypal_open).setOnClickListener(v -> openUrl(paypalStr)); - dialog.findViewById(R.id.paypal_copy).setOnClickListener(v -> copyToClipboard(paypalStr)); - } - - private void copyToClipboard(String text) { - ClipboardManager cmb = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); - if (cmb != null) { - cmb.setPrimaryClip(ClipData.newPlainText(null, text)); - Toast.makeText(getActivity(), R.string.settings_about_donate_copied, Toast.LENGTH_SHORT).show(); - } - } - - private void openUrl(String url) { - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.parse(url)); - Intent chooser = Intent.createChooser(intent, ""); - startActivity(chooser); - } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.java index 7fc9fbd06..52c7383f5 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.java @@ -17,11 +17,9 @@ package com.hippo.ehviewer.ui.fragment; import android.app.Activity; -import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; @@ -29,19 +27,17 @@ import androidx.preference.Preference; import androidx.preference.PreferenceGroup; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.hippo.ehviewer.AppConfig; import com.hippo.ehviewer.BuildConfig; import com.hippo.ehviewer.EhApplication; import com.hippo.ehviewer.EhDB; import com.hippo.ehviewer.GetText; import com.hippo.ehviewer.R; +import com.hippo.ehviewer.ui.SettingsActivity; +import com.hippo.ehviewer.ui.scene.BaseScene; import com.hippo.util.LogCat; import com.hippo.util.ReadableTime; import com.takisoft.preferencex.PreferenceFragmentCompat; -import java.io.File; -import java.util.Arrays; - public class AdvancedFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener { @@ -55,28 +51,6 @@ public class AdvancedFragment extends PreferenceFragmentCompat private static final String KEY_IMPORT_DATA = "import_data"; private static final String KEY_EXPORT_DATA = "export_data"; - private static void importData(final Context context) { - final File dir = AppConfig.getExternalDataDir(); - if (null == dir) { - Toast.makeText(context, R.string.cant_get_data_dir, Toast.LENGTH_SHORT).show(); - return; - } - final String[] files = dir.list(); - if (null == files || files.length <= 0) { - Toast.makeText(context, R.string.cant_find_any_data, Toast.LENGTH_SHORT).show(); - return; - } - Arrays.sort(files); - new MaterialAlertDialogBuilder(context).setItems(files, (dialog, which) -> { - File file = new File(dir, files[which]); - //String error = EhDB.importDB(context, file); - //if (null == error) { - // error = context.getString(R.string.settings_advanced_import_data_successfully); - //} - //Toast.makeText(context, error, Toast.LENGTH_SHORT).show(); - }).show(); - } - @Override public void onCreatePreferencesFix(@Nullable Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.advanced_settings); @@ -154,15 +128,15 @@ public class AdvancedFragment extends PreferenceFragmentCompat if (alertDialog.isShowing()) { alertDialog.dismiss(); } - Toast.makeText(requireContext(), + ((SettingsActivity) requireActivity()).showTip( (success) ? GetText.getString(R.string.settings_advanced_export_data_to, uri.toString()) : GetText.getString(R.string.settings_advanced_export_data_failed), - Toast.LENGTH_SHORT).show(); + BaseScene.LENGTH_SHORT); }); }).start(); } catch (Exception e) { - GetText.getString(R.string.settings_advanced_export_data_failed); + ((SettingsActivity) requireActivity()).showTip(R.string.settings_advanced_export_data_failed, BaseScene.LENGTH_SHORT); } } } @@ -183,14 +157,14 @@ public class AdvancedFragment extends PreferenceFragmentCompat alertDialog.dismiss(); } if (null == error) { - Toast.makeText(requireContext(), getString(R.string.settings_advanced_import_data_successfully), Toast.LENGTH_SHORT).show(); + ((SettingsActivity) requireActivity()).showTip(getString(R.string.settings_advanced_import_data_successfully), BaseScene.LENGTH_SHORT); } else { - Toast.makeText(requireContext(), error, Toast.LENGTH_SHORT).show(); + ((SettingsActivity) requireActivity()).showTip(error, BaseScene.LENGTH_SHORT); } }); }).start(); } catch (Exception e) { - Toast.makeText(requireContext(), e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); + ((SettingsActivity) requireActivity()).showTip(e.getLocalizedMessage(), BaseScene.LENGTH_SHORT); } } } @@ -201,11 +175,11 @@ public class AdvancedFragment extends PreferenceFragmentCompat requireActivity().grantUriPermission(BuildConfig.APPLICATION_ID, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION); try { boolean ok = LogCat.save(requireActivity().getContentResolver().openOutputStream(uri)); - Toast.makeText(getActivity(), + ((SettingsActivity) requireActivity()).showTip( ok ? getString(R.string.settings_advanced_dump_logcat_to, uri.toString()) : - getString(R.string.settings_advanced_dump_logcat_failed), Toast.LENGTH_SHORT).show(); + getString(R.string.settings_advanced_dump_logcat_failed), BaseScene.LENGTH_SHORT); } catch (Exception e) { - Toast.makeText(getActivity(), getString(R.string.settings_advanced_dump_logcat_failed), Toast.LENGTH_SHORT).show(); + ((SettingsActivity) requireActivity()).showTip(getString(R.string.settings_advanced_dump_logcat_failed), BaseScene.LENGTH_SHORT); } } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/DownloadFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/DownloadFragment.java index 78ca3f2c9..6b8f61576 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/DownloadFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/DownloadFragment.java @@ -20,7 +20,6 @@ import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.widget.Toast; import androidx.annotation.Nullable; import androidx.preference.Preference; @@ -28,6 +27,8 @@ import androidx.preference.Preference; import com.hippo.ehviewer.R; import com.hippo.ehviewer.Settings; import com.hippo.ehviewer.ui.CommonOperations; +import com.hippo.ehviewer.ui.SettingsActivity; +import com.hippo.ehviewer.ui.scene.BaseScene; import com.hippo.unifile.UniFile; import com.hippo.util.ExceptionUtils; import com.takisoft.preferencex.PreferenceFragmentCompat; @@ -95,7 +96,7 @@ public class DownloadFragment extends PreferenceFragmentCompat implements startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE_DIR_L); } catch (Throwable e) { ExceptionUtils.throwIfFatal(e); - Toast.makeText(getActivity(), R.string.error_cant_find_activity, Toast.LENGTH_SHORT).show(); + ((SettingsActivity) requireActivity()).showTip(R.string.error_cant_find_activity, BaseScene.LENGTH_SHORT); } } @@ -113,8 +114,8 @@ public class DownloadFragment extends PreferenceFragmentCompat implements Settings.putDownloadLocation(uniFile); onUpdateDownloadLocation(); } else { - Toast.makeText(getActivity(), R.string.settings_download_cant_get_download_location, - Toast.LENGTH_SHORT).show(); + ((SettingsActivity) requireActivity()).showTip(R.string.settings_download_cant_get_download_location, + BaseScene.LENGTH_SHORT); } } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java index f868e2ba2..ef6774dbc 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.java @@ -559,7 +559,7 @@ public class DownloadsScene extends ToolbarScene LongList gidList = new LongList(); for (int i = list.size() - 1; i > -1; i--) { DownloadInfo info = list.get(i); - if(info.state!=DownloadInfo.STATE_FINISH){ + if (info.state != DownloadInfo.STATE_FINISH) { gidList.add(info.gid); } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java index a76542b80..cbe717efd 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java @@ -38,6 +38,7 @@ import android.text.style.URLSpan; import android.util.Log; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewAnimationUtils; import android.view.ViewGroup; import android.widget.EditText; import android.widget.ImageView; @@ -66,7 +67,6 @@ import com.hippo.ehviewer.client.data.GalleryCommentList; import com.hippo.ehviewer.client.data.GalleryDetail; import com.hippo.ehviewer.client.parser.VoteCommentParser; import com.hippo.ehviewer.ui.MainActivity; -import com.hippo.reveal.ViewAnimationUtils; import com.hippo.scene.SceneFragment; import com.hippo.text.Html; import com.hippo.text.URLImageGetter; diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java index f134126a9..4dbabf5b3 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java @@ -38,6 +38,7 @@ import android.view.Gravity; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; +import android.view.ViewAnimationUtils; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; @@ -91,7 +92,6 @@ import com.hippo.ehviewer.ui.GalleryActivity; import com.hippo.ehviewer.ui.MainActivity; import com.hippo.ehviewer.ui.annotation.WholeLifeCircle; import com.hippo.ehviewer.widget.GalleryRatingBar; -import com.hippo.reveal.ViewAnimationUtils; import com.hippo.scene.Announcer; import com.hippo.scene.SceneFragment; import com.hippo.scene.TransitionHelper; diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/QuickSearchScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/QuickSearchScene.java index 7cd2ca440..f9e0df975 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/QuickSearchScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/QuickSearchScene.java @@ -77,8 +77,6 @@ public final class QuickSearchScene extends ToolbarScene { mQuickSearchList = null; } - @SuppressWarnings("deprecation") - @Nullable @Override public View onCreateView3(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/SecurityScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/SecurityScene.java index 0a98139c8..def0cecf3 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/SecurityScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/SecurityScene.java @@ -19,7 +19,6 @@ package com.hippo.ehviewer.ui.scene; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorManager; -import android.os.Build; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -100,7 +99,11 @@ public class SecurityScene extends SolidScene implements mSensorManager.registerListener(mShakeDetector, mAccelerometer, SensorManager.SENSOR_DELAY_UI); } - if (isFingerprintAuthAvailable()) { + startBiometricPrompt(); + } + + private void startBiometricPrompt() { + if (Settings.getEnableFingerprint() && BiometricManager.from(requireContext()).canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS) { BiometricPrompt biometricPrompt = new BiometricPrompt(this, Executors.newSingleThreadExecutor(), new BiometricPrompt.AuthenticationCallback() { @Override public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) { @@ -147,6 +150,7 @@ public class SecurityScene extends SolidScene implements public View onCreateView2(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.scene_security, container, false); + view.setOnClickListener(v -> startBiometricPrompt()); mPatternView = (LockPatternView) ViewUtils.$$(view, R.id.pattern_view); mPatternView.setOnPatternListener(this); @@ -206,10 +210,4 @@ public class SecurityScene extends SolidScene implements finish(); } } - - private boolean isFingerprintAuthAvailable() { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - && Settings.getEnableFingerprint() - && BiometricManager.from(requireContext()).canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS; - } } diff --git a/app/src/main/java/com/hippo/io/FileInputStreamPipe.java b/app/src/main/java/com/hippo/io/FileInputStreamPipe.java deleted file mode 100644 index 6ff3e9f4f..000000000 --- a/app/src/main/java/com/hippo/io/FileInputStreamPipe.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2015 Hippo Seven - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hippo.io; - -import androidx.annotation.NonNull; - -import com.hippo.streampipe.InputStreamPipe; -import com.hippo.yorozuya.IOUtils; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; - -public class FileInputStreamPipe implements InputStreamPipe { - - private final File mFile; - private InputStream mIs; - - public FileInputStreamPipe(File file) { - mFile = file; - } - - @Override - public void obtain() { - // Empty - } - - @Override - public void release() { - // Empty - } - - @NonNull - @Override - public InputStream open() throws IOException { - if (mIs != null) { - throw new IllegalStateException("Please close it first"); - } - - mIs = new FileInputStream(mFile); - return mIs; - } - - @Override - public void close() { - IOUtils.closeQuietly(mIs); - mIs = null; - } -} diff --git a/app/src/main/java/com/hippo/io/FileOutputStreamPipe.java b/app/src/main/java/com/hippo/io/FileOutputStreamPipe.java deleted file mode 100644 index 7d59e9dbb..000000000 --- a/app/src/main/java/com/hippo/io/FileOutputStreamPipe.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2015 Hippo Seven - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hippo.io; - -import androidx.annotation.NonNull; - -import com.hippo.streampipe.OutputStreamPipe; -import com.hippo.yorozuya.IOUtils; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -public class FileOutputStreamPipe implements OutputStreamPipe { - - private final File mFile; - private OutputStream mOs; - - public FileOutputStreamPipe(File file) { - mFile = file; - } - - @Override - public void obtain() { - // Empty - } - - @Override - public void release() { - // Empty - } - - @NonNull - @Override - public OutputStream open() throws IOException { - if (mOs != null) { - throw new IllegalStateException("Please close it first"); - } - - mOs = new FileOutputStream(mFile); - return mOs; - } - - @Override - public void close() { - IOUtils.closeQuietly(mOs); - mOs = null; - } -} diff --git a/app/src/main/java/com/hippo/reveal/ViewAnimationUtils.java b/app/src/main/java/com/hippo/reveal/ViewAnimationUtils.java deleted file mode 100644 index 13d39d4f0..000000000 --- a/app/src/main/java/com/hippo/reveal/ViewAnimationUtils.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2016 Hippo Seven - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hippo.reveal; - -import android.animation.Animator; -import android.view.View; - -public final class ViewAnimationUtils { - public static Animator createCircularReveal(View view, - int centerX, int centerY, float startRadius, float endRadius) { - return android.view.ViewAnimationUtils.createCircularReveal( - view, centerX, centerY, startRadius, endRadius); - } -} diff --git a/app/src/main/java/com/hippo/util/PermissionRequester.java b/app/src/main/java/com/hippo/util/PermissionRequester.java deleted file mode 100644 index 2295313e2..000000000 --- a/app/src/main/java/com/hippo/util/PermissionRequester.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2015 Hippo Seven - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hippo.util; - -import android.app.Activity; -import android.content.pm.PackageManager; - -import androidx.core.app.ActivityCompat; - -import com.google.android.material.dialog.MaterialAlertDialogBuilder; - -public class PermissionRequester { - - /** - * @return true for there no need to request, do your work it now. - * false for do in {@link androidx.core.app.ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])} - */ - public static boolean request(final Activity activity, final String permission, String rationale, final int requestCode) { - if (!(activity instanceof ActivityCompat.OnRequestPermissionsResultCallback)) { - throw new IllegalStateException("The Activity must implement ActivityCompat.OnRequestPermissionsResultCallback"); - } - - if (ActivityCompat.checkSelfPermission(activity, permission) - == PackageManager.PERMISSION_GRANTED) { - return true; - } - - if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) { - new MaterialAlertDialogBuilder(activity) - .setMessage(rationale) - .setPositiveButton(android.R.string.ok, (dialog, which) -> requestPermissions(activity, new String[]{permission}, requestCode)).setNegativeButton(android.R.string.cancel, null) - .show(); - } else { - return requestPermissions(activity, new String[]{permission}, requestCode); - } - - return false; - } - - private static boolean requestPermissions( - final Activity activity, - final String[] permissions, - int requestCode - ) { - try { - ActivityCompat.requestPermissions(activity, permissions, requestCode); - return true; - } catch (Throwable t) { - ExceptionUtils.throwIfFatal(t); - return false; - } - } -} diff --git a/app/src/main/res/drawable-hdpi/drawer_shadow_left.9.png b/app/src/main/res/drawable-hdpi/drawer_shadow_left.9.png deleted file mode 100644 index a2a24d7c75c823c800c982621fe4f92fbcea2264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^JV0#3!3HEVSgovpl%=POV@L&KvI66ucH=2eMTHt} zhMTZI~gueA&dsi6Mtqv<31mmU1)g$&$Egu!`}Vf{-x-!^MCntw+MnivbN` N@O1TaS?83{1OP?uA(#LF diff --git a/app/src/main/res/drawable-hdpi/drawer_shadow_right.9.png b/app/src/main/res/drawable-hdpi/drawer_shadow_right.9.png deleted file mode 100644 index fc28a844bd6f0af30f49b91180939508115e577f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^JV0#3!3HEVSgovpl(naeV@L&KazoR9o+HdYM^Am? zdgGwOdSsVF4)>9L4s#g7tv{LcWJz2#Sd|!Zctu+v?_w!8(?9A$#taOze>`b*Io5F+ PXbgj=tDnm{r-UW|+^i%+ diff --git a/app/src/main/res/drawable-hdpi/ic_fp_40px.png b/app/src/main/res/drawable-hdpi/ic_fp_40px.png deleted file mode 100755 index 48ebd8ad737272d78d0ab9141c47c84f463fa3bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7011 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 diff --git a/app/src/main/res/drawable-mdpi/drawer_shadow_left.9.png b/app/src/main/res/drawable-mdpi/drawer_shadow_left.9.png deleted file mode 100644 index d6a4e27f3f5829d745f439f26eb82c0153994e18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^oItF^!3HFIe|>%mq_jO<978G?lNA{L9hN-xiObO8 y4bPER4rkg!6>CL%wWLB#R%L_;&S_*fW?)#gy(A(c=gS$OHU>{uKbLh*2~7YH79HFG diff --git a/app/src/main/res/drawable-mdpi/drawer_shadow_right.9.png b/app/src/main/res/drawable-mdpi/drawer_shadow_right.9.png deleted file mode 100644 index 0710e0c4e17b9c5feaf0544693bd901773134a50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^oItF^!3HFIe|>%mq;x%9978G?lN*};^Xy<;#*|vg zYNrs!o|LZ8*La%0XHlT*;x0GQUaepK?8XcXTa!y7^uNnR0W~ssy85}Sb4q9e01EsZ Axc~qF diff --git a/app/src/main/res/drawable-mdpi/ic_fp_40px.png b/app/src/main/res/drawable-mdpi/ic_fp_40px.png deleted file mode 100755 index 122f44257b1aa188955ab01e5bf71a5f079b1da5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4001 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 diff --git a/app/src/main/res/drawable-xhdpi/drawer_shadow_left.9.png b/app/src/main/res/drawable-xhdpi/drawer_shadow_left.9.png deleted file mode 100644 index 346dae4e5be01d2c63ac1371a8faa3abf4752908..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^{6Or)!3HEd1bTh|DK}3S$B+ufBn9C=?Z#7{icV^@ z;OVe!ydl=X+YrIn;o2~Rbv+})x2H3JY8es({$JbN{z3WlCY{rpY9^&dPD`!4Rc~a# Y%+P9D(^zH0WC>E`>FVdQ&MBb@0GP2SssI20 diff --git a/app/src/main/res/drawable-xhdpi/drawer_shadow_right.9.png b/app/src/main/res/drawable-xhdpi/drawer_shadow_right.9.png deleted file mode 100644 index 60421efa5ce8f9e4c292e7e0c6000cd032d5ec86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^{6Or)!3HEd1bTh|DGyH<$B+ufq=u&dJSt3kq^3R< zjcABq=@4zW!O)T0ctg13aD#>9`qqYTPakkFFtjnu_&YtX{6k4&dV)k-A_(0(V!#vs a(PnF6O=I4vb#g#689ZJ6T-G@yGywoh;42>h diff --git a/app/src/main/res/drawable-xhdpi/ic_fp_40px.png b/app/src/main/res/drawable-xhdpi/ic_fp_40px.png deleted file mode 100755 index e1c9590bbfbcf220b08879f2f9e560a4f285f4ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10524 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 diff --git a/app/src/main/res/drawable-xxhdpi/ic_fp_40px.png b/app/src/main/res/drawable-xxhdpi/ic_fp_40px.png deleted file mode 100755 index e9869f6bbe3c307f4058c30f75439412beb8ab63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16848 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 UORsrIT>t<807*qoM6N<$g3w4LoB#j-