From 2f49748a3b5ad13746c2ca082618e2c9ca2c2888 Mon Sep 17 00:00:00 2001 From: tarsin Date: Wed, 18 May 2022 11:40:29 +0800 Subject: [PATCH] Do Code cleanup --- app/build.gradle | 2 - app/src/main/AndroidManifest.xml | 18 +- .../main/java/com/hippo/conaco/Conaco.java | 16 +- .../java/com/hippo/conaco/ConacoTask.java | 320 +++++++++--------- .../main/java/com/hippo/conaco/Unikery.java | 14 +- .../com/hippo/database/MSQLiteBuilder.java | 2 +- .../easyrecyclerview/EasyRecyclerView.java | 197 ++++++----- .../easyrecyclerview/HandlerDrawable.java | 2 +- .../LinearDividerItemDecoration.java | 7 +- .../java/com/hippo/ehviewer/UrlOpener.java | 4 - .../ehviewer/WindowInsetsAnimationHelper.java | 3 +- .../com/hippo/ehviewer/client/EhEngine.java | 4 +- .../hippo/ehviewer/client/EhTagDatabase.java | 2 +- .../java/com/hippo/ehviewer/client/EhUrl.java | 35 +- .../preference/IdentityCookiePreference.java | 2 +- .../hippo/ehviewer/spider/SpiderQueen.java | 2 +- .../hippo/ehviewer/ui/GalleryActivity.java | 109 +++--- .../ui/fragment/DownloadFragment.java | 1 - .../ehviewer/ui/fragment/FilterFragment.java | 38 +-- .../ehviewer/ui/fragment/HostsFragment.java | 10 +- .../ehviewer/ui/fragment/MyTagsFragment.java | 10 +- .../ehviewer/ui/fragment/UConfigFragment.java | 20 +- .../hippo/ehviewer/ui/scene/BaseScene.java | 1 - .../ehviewer/ui/scene/DownloadsScene.java | 144 ++++---- .../ehviewer/ui/scene/FavoritesScene.java | 33 +- .../ehviewer/ui/scene/GalleryAdapter.java | 4 +- .../ui/scene/GalleryCommentsScene.java | 75 ++-- .../ehviewer/ui/scene/GalleryDetailScene.java | 57 ++-- .../ehviewer/ui/scene/GalleryListScene.java | 77 +++-- .../hippo/ehviewer/ui/scene/HistoryScene.java | 69 ++-- .../ehviewer/ui/scene/SecurityScene.java | 2 +- .../hippo/ehviewer/widget/GalleryHeader.java | 14 +- .../widget/GalleryInfoContentHelper.java | 3 +- .../com/hippo/ehviewer/widget/SearchBar.java | 43 ++- .../hippo/ehviewer/widget/SearchLayout.java | 32 +- .../hippo/ehviewer/widget/SeekBarPanel.java | 2 +- .../java/com/hippo/util/ReadableTime.java | 2 +- .../java/com/hippo/view/ViewTransition.java | 5 +- .../java/com/hippo/widget/AutoWrapLayout.java | 4 +- .../java/com/hippo/widget/BatteryView.java | 24 +- .../java/com/hippo/widget/CheckTextView.java | 29 +- .../java/com/hippo/widget/ContentLayout.java | 7 +- .../main/java/com/hippo/widget/Slider.java | 2 - .../main/java/com/hippo/widget/TextClock.java | 30 +- .../widget/lockpattern/LockPatternView.java | 136 ++++---- app/src/main/res/drawable/big_download.xml | 4 +- app/src/main/res/drawable/big_filter.xml | 4 +- app/src/main/res/drawable/big_history.xml | 4 +- .../main/res/drawable/big_sad_pandroid.xml | 4 +- .../res/drawable/ic_baseline_dark_mode_24.xml | 10 +- .../ic_baseline_format_list_numbered_24.xml | 4 +- .../res/drawable/ic_baseline_label_24.xml | 4 +- .../main/res/drawable/ic_baseline_menu_24.xml | 10 +- .../res/drawable/ic_baseline_reorder_24.xml | 4 +- .../res/drawable/ic_baseline_warning_24.xml | 4 +- .../res/drawable/ic_launcher_foreground.xml | 8 +- app/src/main/res/drawable/image_failed.xml | 4 +- .../main/res/drawable/v_adb_primary_x24.xml | 4 +- app/src/main/res/drawable/v_alert_red_x48.xml | 4 +- .../res/drawable/v_archive_primary_x48.xml | 4 +- .../res/drawable/v_arrow_left_dark_x24.xml | 4 +- .../res/drawable/v_book_open_primary_x24.xml | 4 +- app/src/main/res/drawable/v_book_open_x24.xml | 4 +- .../main/res/drawable/v_chart_accent_x48.xml | 4 +- .../res/drawable/v_check_all_dark_x24.xml | 4 +- .../main/res/drawable/v_check_dark_x24.xml | 4 +- .../res/drawable/v_clear_all_dark_x24.xml | 4 +- .../main/res/drawable/v_close_dark_x24.xml | 4 +- .../main/res/drawable/v_cookie_brown_x48.xml | 4 +- app/src/main/res/drawable/v_delete_x24.xml | 4 +- .../v_dots_vertical_secondary_dark_x24.xml | 4 +- .../res/drawable/v_download_box_dark_x24.xml | 4 +- .../res/drawable/v_download_primary_x24.xml | 4 +- app/src/main/res/drawable/v_download_x16.xml | 4 +- app/src/main/res/drawable/v_download_x24.xml | 4 +- .../drawable/v_eh_subscription_black_x24.xml | 4 +- .../res/drawable/v_file_find_primary_x48.xml | 4 +- .../main/res/drawable/v_filter_dark_x24.xml | 4 +- .../main/res/drawable/v_fire_black_x24.xml | 4 +- .../main/res/drawable/v_folder_move_x24.xml | 4 +- .../main/res/drawable/v_go_to_dark_x24.xml | 4 +- .../res/drawable/v_heart_box_dark_x24.xml | 4 +- .../main/res/drawable/v_heart_broken_x24.xml | 4 +- .../drawable/v_heart_outline_primary_x48.xml | 4 +- .../main/res/drawable/v_heart_primary_x48.xml | 4 +- app/src/main/res/drawable/v_heart_x16.xml | 4 +- app/src/main/res/drawable/v_heart_x24.xml | 4 +- .../main/res/drawable/v_help_circle_x24.xml | 4 +- .../main/res/drawable/v_history_black_x24.xml | 4 +- .../res/drawable/v_homepage_black_x24.xml | 4 +- .../res/drawable/v_info_outline_dark_x24.xml | 4 +- .../main/res/drawable/v_info_primary_x24.xml | 4 +- app/src/main/res/drawable/v_magnify_x24.xml | 4 +- app/src/main/res/drawable/v_pause_x24.xml | 4 +- .../main/res/drawable/v_pencil_dark_x24.xml | 4 +- app/src/main/res/drawable/v_play_x24.xml | 4 +- app/src/main/res/drawable/v_plus_dark_x24.xml | 4 +- .../main/res/drawable/v_refresh_dark_x24.xml | 4 +- .../main/res/drawable/v_reply_dark_x24.xml | 4 +- .../res/drawable/v_sad_panda_primary_x24.xml | 4 +- .../main/res/drawable/v_sec_primary_x24.xml | 4 +- app/src/main/res/drawable/v_send_dark_x24.xml | 4 +- .../res/drawable/v_settings_black_x24.xml | 4 +- .../main/res/drawable/v_share_primary_x48.xml | 4 +- .../res/drawable/v_similar_primary_x48.xml | 4 +- app/src/main/res/drawable/v_slider_bubble.xml | 4 +- app/src/main/res/drawable/v_star_half_x16.xml | 4 +- .../main/res/drawable/v_star_outline_x16.xml | 4 +- app/src/main/res/drawable/v_star_x16.xml | 4 +- .../res/drawable/v_utorrent_primary_x48.xml | 4 +- .../res/layout-land/activity_set_security.xml | 8 +- app/src/main/res/layout/activity_filter.xml | 10 +- app/src/main/res/layout/activity_hosts.xml | 8 +- app/src/main/res/layout/activity_main.xml | 6 +- .../main/res/layout/activity_preference.xml | 8 +- .../main/res/layout/activity_set_security.xml | 2 +- app/src/main/res/layout/activity_webview.xml | 2 +- .../res/layout/design_navigation_item.xml | 6 +- app/src/main/res/layout/dialog_add_filter.xml | 4 +- .../res/layout/dialog_checkbox_builder.xml | 12 +- .../main/res/layout/dialog_gallery_menu.xml | 4 +- app/src/main/res/layout/dialog_go_to.xml | 4 +- app/src/main/res/layout/drawer_list_rv.xml | 2 +- .../res/layout/gallery_detail_content.xml | 2 +- .../main/res/layout/gallery_detail_header.xml | 6 +- app/src/main/res/layout/item_drawer_list.xml | 4 +- app/src/main/res/layout/item_filter.xml | 4 +- app/src/main/res/layout/item_gallery_grid.xml | 2 +- app/src/main/res/layout/item_gallery_list.xml | 2 +- .../main/res/layout/item_simple_list_2.xml | 4 +- app/src/main/res/layout/nav_header_main.xml | 4 +- app/src/main/res/layout/scene_download.xml | 14 +- app/src/main/res/layout/scene_favorites.xml | 12 +- .../res/layout/scene_gallery_comments.xml | 2 +- .../res/layout/scene_gallery_previews.xml | 2 +- app/src/main/res/layout/scene_history.xml | 4 +- app/src/main/res/layout/scene_login.xml | 20 +- app/src/main/res/layout/scene_progress.xml | 2 +- app/src/main/res/layout/scene_security.xml | 2 +- app/src/main/res/layout/scene_toolbar.xml | 6 +- app/src/main/res/layout/search_action.xml | 4 +- app/src/main/res/layout/search_category.xml | 6 +- app/src/main/res/layout/search_normal.xml | 12 +- .../layout/widget_advance_search_table.xml | 52 +-- .../main/res/layout/widget_content_layout.xml | 2 +- .../main/res/layout/widget_image_search.xml | 12 +- app/src/main/res/layout/widget_search_bar.xml | 2 +- .../main/res/menu/download_label_option.xml | 4 +- app/src/main/res/menu/quicksearch_option.xml | 2 +- app/src/main/res/values/styles.xml | 1 + app/src/main/res/values/themes.xml | 5 +- app/src/main/res/xml/about_settings.xml | 12 +- app/src/main/res/xml/advanced_settings.xml | 2 +- app/src/main/res/xml/download_settings.xml | 4 +- app/src/main/res/xml/eh_settings.xml | 6 +- app/src/main/res/xml/privacy_settings.xml | 2 +- app/src/main/res/xml/read_settings.xml | 2 +- .../com/hippo/ehviewer/daogenerator/Main.java | 2 +- 158 files changed, 1064 insertions(+), 1125 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4424a57a5..af62057ff 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,3 @@ -import java.nio.file.Paths - plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3196a53df..23018b681 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,24 +32,24 @@ + tools:ignore="UnusedAttribute"> + android:windowSoftInputMode="adjustResize|stateAlwaysHidden"> @@ -90,9 +90,9 @@ + android:theme="@style/AppTheme.Gallery"> diff --git a/app/src/main/java/com/hippo/conaco/Conaco.java b/app/src/main/java/com/hippo/conaco/Conaco.java index 19bf047f7..8b4ebd99b 100644 --- a/app/src/main/java/com/hippo/conaco/Conaco.java +++ b/app/src/main/java/com/hippo/conaco/Conaco.java @@ -39,26 +39,17 @@ import okhttp3.OkHttpClient; @SuppressWarnings("rawtypes") public final class Conaco { - private static final String TAG = Conaco.class.getSimpleName(); - - @IntDef({SOURCE_MEMORY, SOURCE_DISK, SOURCE_NETWORK}) - @Retention(RetentionPolicy.SOURCE) - public @interface Source { - } - public static final int SOURCE_MEMORY = 0; public static final int SOURCE_DISK = 1; public static final int SOURCE_NETWORK = 2; - + private static final String TAG = Conaco.class.getSimpleName(); private final ValueHelper mHelper; private final ValueCache mCache; private final OkHttpClient mOkHttpClient; private final Register mRegister; - private final SerialThreadExecutor mDiskExecutor; private final ThreadPoolExecutor mNetworkExecutor; private final AtomicInteger mIdGenerator; - private final boolean mDebug; private Conaco(Builder builder) { @@ -197,6 +188,11 @@ public final class Conaco { onUnregisterConacoTask(task); } + @IntDef({SOURCE_MEMORY, SOURCE_DISK, SOURCE_NETWORK}) + @Retention(RetentionPolicy.SOURCE) + public @interface Source { + } + public static class Builder extends BeerBelly.BeerBellyParams { /** * The client to get image from internet diff --git a/app/src/main/java/com/hippo/conaco/ConacoTask.java b/app/src/main/java/com/hippo/conaco/ConacoTask.java index 285224a0c..b063ef183 100644 --- a/app/src/main/java/com/hippo/conaco/ConacoTask.java +++ b/app/src/main/java/com/hippo/conaco/ConacoTask.java @@ -85,6 +85,42 @@ public final class ConacoTask { mConaco = builder.mConaco; } + private static void putFromDiskCacheToDataContainer(String key, ValueCache cache, DataContainer container) { + SimpleDiskCache diskCache = cache.getDiskCache(); + if (diskCache != null) { + InputStreamPipe pipe = diskCache.getInputStreamPipe(key); + if (pipe != null) { + try { + pipe.obtain(); + container.save(pipe.open(), -1L, null, null); + } catch (IOException e) { + Log.d(TAG, "Can't save value from disk cache to data container"); + e.printStackTrace(); + container.remove(); + } finally { + pipe.close(); + pipe.release(); + } + } + } + } + + private static void putFromDataContainerToDiskCache(String key, ValueCache cache, DataContainer container) { + InputStreamPipe pipe = container.get(); + if (pipe != null) { + try { + pipe.obtain(); + cache.putRawToDisk(key, pipe.open()); + } catch (IOException e) { + Log.w(TAG, "Can't save value from data container to disk cache", e); + cache.removeFromDisk(key); + } finally { + pipe.close(); + pipe.release(); + } + } + } + int getId() { return mId; } @@ -176,39 +212,133 @@ public final class ConacoTask { return mStop || asyncTask.isCancelled() || unikery == null || unikery.getTaskId() != mId; } - private static void putFromDiskCacheToDataContainer(String key, ValueCache cache, DataContainer container) { - SimpleDiskCache diskCache = cache.getDiskCache(); - if (diskCache != null) { - InputStreamPipe pipe = diskCache.getInputStreamPipe(key); - if (pipe != null) { - try { - pipe.obtain(); - container.save(pipe.open(), -1L, null, null); - } catch (IOException e) { - Log.d(TAG, "Can't save value from disk cache to data container"); - e.printStackTrace(); - container.remove(); - } finally { - pipe.close(); - pipe.release(); - } + @SuppressWarnings({"unused", "UnusedReturnValue", "RedundantSuppression"}) + public static class Builder { + + private int mId; + private Unikery mUnikery; + private String mKey; + private String mUrl; + private DataContainer mDataContainer; + private boolean mUseMemoryCache = true; + private boolean mUseDiskCache = true; + private boolean mUseNetwork = true; + private ValueHelper mHelper; + private ValueCache mCache; + private OkHttpClient mOkHttpClient; + private Executor mDiskExecutor; + private Executor mNetworkExecutor; + private Conaco mConaco; + + public Builder setId(int id) { + mId = id; + return this; + } + + public Unikery getUnikery() { + return mUnikery; + } + + public Builder setUnikery(Unikery unikery) { + mUnikery = unikery; + return this; + } + + public String getKey() { + return mKey; + } + + public Builder setKey(String key) { + mKey = key; + return this; + } + + public String getUrl() { + return mUrl; + } + + public Builder setUrl(String url) { + mUrl = url; + return this; + } + + public Builder setDataContainer(DataContainer dataContainer) { + mDataContainer = dataContainer; + return this; + } + + boolean isUseMemoryCache() { + return mUseMemoryCache; + } + + public Builder setUseMemoryCache(boolean useMemoryCache) { + mUseMemoryCache = useMemoryCache; + return this; + } + + boolean isUseDiskCache() { + return mUseDiskCache; + } + + public Builder setUseDiskCache(boolean useDiskCache) { + mUseDiskCache = useDiskCache; + return this; + } + + boolean isUseNetwork() { + return mUseNetwork; + } + + public Builder setUseNetwork(boolean useNetwork) { + mUseNetwork = useNetwork; + return this; + } + + ValueHelper getHelper() { + return mHelper; + } + + Builder setHelper(ValueHelper helper) { + mHelper = helper; + return this; + } + + Builder setCache(ValueCache cache) { + mCache = cache; + return this; + } + + Builder setOkHttpClient(OkHttpClient okHttpClient) { + mOkHttpClient = okHttpClient; + return this; + } + + Builder setDiskExecutor(Executor diskExecutor) { + mDiskExecutor = diskExecutor; + return this; + } + + Builder setNetworkExecutor(Executor networkExecutor) { + mNetworkExecutor = networkExecutor; + return this; + } + + Builder setConaco(Conaco conaco) { + mConaco = conaco; + return this; + } + + public void isValid() { + if (mUnikery == null) { + throw new IllegalStateException("Must set unikery"); + } + if (mKey == null && mUrl == null && mDataContainer == null) { + throw new IllegalStateException("At least one of mKey and mUrl and mDataContainer have to not be null"); } } - } - private static void putFromDataContainerToDiskCache(String key, ValueCache cache, DataContainer container) { - InputStreamPipe pipe = container.get(); - if (pipe != null) { - try { - pipe.obtain(); - cache.putRawToDisk(key, pipe.open()); - } catch (IOException e) { - Log.w(TAG, "Can't save value from data container to disk cache", e); - cache.removeFromDisk(key); - } finally { - pipe.close(); - pipe.release(); - } + public ConacoTask build() { + return new ConacoTask<>(this); } } @@ -455,134 +585,4 @@ public final class ConacoTask { } } } - - @SuppressWarnings({"unused", "UnusedReturnValue", "RedundantSuppression"}) - public static class Builder { - - private int mId; - private Unikery mUnikery; - private String mKey; - private String mUrl; - private DataContainer mDataContainer; - private boolean mUseMemoryCache = true; - private boolean mUseDiskCache = true; - private boolean mUseNetwork = true; - private ValueHelper mHelper; - private ValueCache mCache; - private OkHttpClient mOkHttpClient; - private Executor mDiskExecutor; - private Executor mNetworkExecutor; - private Conaco mConaco; - - public Builder setId(int id) { - mId = id; - return this; - } - - public Builder setUnikery(Unikery unikery) { - mUnikery = unikery; - return this; - } - - public Unikery getUnikery() { - return mUnikery; - } - - public Builder setKey(String key) { - mKey = key; - return this; - } - - public String getKey() { - return mKey; - } - - public Builder setUrl(String url) { - mUrl = url; - return this; - } - - public String getUrl() { - return mUrl; - } - - public Builder setDataContainer(DataContainer dataContainer) { - mDataContainer = dataContainer; - return this; - } - - public Builder setUseMemoryCache(boolean useMemoryCache) { - mUseMemoryCache = useMemoryCache; - return this; - } - - boolean isUseMemoryCache() { - return mUseMemoryCache; - } - - public Builder setUseDiskCache(boolean useDiskCache) { - mUseDiskCache = useDiskCache; - return this; - } - - boolean isUseDiskCache() { - return mUseDiskCache; - } - - public Builder setUseNetwork(boolean useNetwork) { - mUseNetwork = useNetwork; - return this; - } - - boolean isUseNetwork() { - return mUseNetwork; - } - - Builder setHelper(ValueHelper helper) { - mHelper = helper; - return this; - } - - ValueHelper getHelper() { - return mHelper; - } - - Builder setCache(ValueCache cache) { - mCache = cache; - return this; - } - - Builder setOkHttpClient(OkHttpClient okHttpClient) { - mOkHttpClient = okHttpClient; - return this; - } - - Builder setDiskExecutor(Executor diskExecutor) { - mDiskExecutor = diskExecutor; - return this; - } - - Builder setNetworkExecutor(Executor networkExecutor) { - mNetworkExecutor = networkExecutor; - return this; - } - - Builder setConaco(Conaco conaco) { - mConaco = conaco; - return this; - } - - public void isValid() { - if (mUnikery == null) { - throw new IllegalStateException("Must set unikery"); - } - if (mKey == null && mUrl == null && mDataContainer == null) { - throw new IllegalStateException("At least one of mKey and mUrl and mDataContainer have to not be null"); - } - } - - public ConacoTask build() { - return new ConacoTask<>(this); - } - } } diff --git a/app/src/main/java/com/hippo/conaco/Unikery.java b/app/src/main/java/com/hippo/conaco/Unikery.java index 07c0ef4fe..1d73f1227 100644 --- a/app/src/main/java/com/hippo/conaco/Unikery.java +++ b/app/src/main/java/com/hippo/conaco/Unikery.java @@ -22,13 +22,6 @@ public interface Unikery { int INVALID_ID = -1; - /** - * Store the conaco task id - * - * @param id the conaco task id - */ - void setTaskId(int id); - /** * Get the conaco task id * @@ -36,6 +29,13 @@ public interface Unikery { */ int getTaskId(); + /** + * Store the conaco task id + * + * @param id the conaco task id + */ + void setTaskId(int id); + /** * On miss in the source */ diff --git a/app/src/main/java/com/hippo/database/MSQLiteBuilder.java b/app/src/main/java/com/hippo/database/MSQLiteBuilder.java index 002a21aa6..d16d73350 100644 --- a/app/src/main/java/com/hippo/database/MSQLiteBuilder.java +++ b/app/src/main/java/com/hippo/database/MSQLiteBuilder.java @@ -46,9 +46,9 @@ public class MSQLiteBuilder { JAVA_TYPE_TO_SQLITE_TYPE.put(String.class, "TEXT"); } + private final SparseArray> statementsMap = new SparseArray<>(); private int version = 0; private List statements; - private final SparseArray> statementsMap = new SparseArray<>(); private static String javaTypeToSQLiteType(Class clazz) { String type = JAVA_TYPE_TO_SQLITE_TYPE.get(clazz); diff --git a/app/src/main/java/com/hippo/easyrecyclerview/EasyRecyclerView.java b/app/src/main/java/com/hippo/easyrecyclerview/EasyRecyclerView.java index 772b8b82e..bdaa7dd99 100644 --- a/app/src/main/java/com/hippo/easyrecyclerview/EasyRecyclerView.java +++ b/app/src/main/java/com/hippo/easyrecyclerview/EasyRecyclerView.java @@ -86,23 +86,19 @@ public class EasyRecyclerView extends BridgeRecyclerView { double flingMoveDistanceY; boolean canScrollVertical = true; boolean canScrollHorizontally = true; - - /** - * Controls if/how the user may choose/check items in the list - */ - private int mChoiceMode = CHOICE_MODE_NONE; - - /** - * Controls CHOICE_MODE_MULTIPLE_MODAL. null when inactive. - */ - private ActionMode mChoiceActionMode; - /** * Wrapper for the multiple choice mode callback; AbsListView needs to perform * a few extra actions around what application code does. */ MultiChoiceModeWrapper mMultiChoiceModeCallback; - + /** + * Controls if/how the user may choose/check items in the list + */ + private int mChoiceMode = CHOICE_MODE_NONE; + /** + * Controls CHOICE_MODE_MULTIPLE_MODAL. null when inactive. + */ + private ActionMode mChoiceActionMode; /** * Listener for custom multiple choices */ @@ -161,6 +157,14 @@ public class EasyRecyclerView extends BridgeRecyclerView { setEnableScroll(!Settings.getEInkMode()); } + public static void setViewChecked(View view, boolean checked) { + if (view instanceof Checkable) { + ((Checkable) view).setChecked(checked); + } else { + view.setActivated(checked); + } + } + /** * {@inheritDoc} */ @@ -550,14 +554,6 @@ public class EasyRecyclerView extends BridgeRecyclerView { } } - public static void setViewChecked(View view, boolean checked) { - if (view instanceof Checkable) { - ((Checkable) view).setChecked(checked); - } else { - view.setActivated(checked); - } - } - private void init(Context context) { float scale = context.getResources().getDisplayMetrics().density; final float ppi = scale * 160.0f; @@ -845,12 +841,78 @@ public class EasyRecyclerView extends BridgeRecyclerView { return mFlingFriction * mPhysicalCoeff * Math.exp(DECELERATION_RATE / decelMinusOne * l); } + public boolean isEnableScroll() { + return enableScroll; + } + public void setEnableScroll(boolean enableScroll) { this.enableScroll = enableScroll; } - public boolean isEnableScroll() { - return enableScroll; + @Override + public Parcelable onSaveInstanceState() { + final SavedState ss = new SavedState(super.onSaveInstanceState()); + + ss.choiceMode = mChoiceMode; + ss.customChoice = mCustomChoice; + ss.checkedItemCount = mCheckedItemCount; + ss.checkState = mCheckStates; + ss.checkIdState = mCheckedIdStates; + + return ss; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + SavedState ss = (SavedState) state; + super.onRestoreInstanceState(ss.getSuperState()); + + setChoiceMode(ss.choiceMode); + mCustomChoice = ss.customChoice; + mCheckedItemCount = ss.checkedItemCount; + if (ss.checkState != null) { + mCheckStates = ss.checkState; + } + if (ss.checkIdState != null) { + mCheckedIdStates = ss.checkIdState; + } + + if (mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL && mCheckedItemCount > 0) { + mChoiceActionMode = startActionMode(mMultiChoiceModeCallback); + } + updateOnScreenCheckedViews(); + } + + /** + * A MultiChoiceModeListener receives events for {@link android.widget.AbsListView#CHOICE_MODE_MULTIPLE_MODAL}. + * It acts as the {@link android.view.ActionMode.Callback} for the selection mode and also receives + * {@link #onItemCheckedStateChanged(android.view.ActionMode, int, long, boolean)} events when the user + * selects and deselects list items. + */ + public interface MultiChoiceModeListener extends ActionMode.Callback { + /** + * Called when an item is checked or unchecked during selection mode. + * + * @param mode The {@link android.view.ActionMode} providing the selection mode + * @param position Adapter position of the item that was checked or unchecked + * @param id Adapter ID of the item that was checked or unchecked + * @param checked true if the item is now checked, false + * if the item is now unchecked. + */ + void onItemCheckedStateChanged(ActionMode mode, + int position, long id, boolean checked); + } + + /** + * Custom checked + */ + public interface CustomChoiceListener { + + void onIntoCustomChoice(EasyRecyclerView view); + + void onOutOfCustomChoice(EasyRecyclerView view); + + void onItemCheckedStateChanged(EasyRecyclerView view, int position, long id, boolean checked); } /** @@ -870,13 +932,23 @@ public class EasyRecyclerView extends BridgeRecyclerView { public static final SavedState EMPTY_STATE = new SavedState() { }; + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + @Override + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; int choiceMode; boolean customChoice; int checkedItemCount; SparseBooleanArray checkState; LongSparseArray checkIdState; - // This keeps the parent(RecyclerView)'s state Parcelable mSuperState; @@ -939,73 +1011,6 @@ public class EasyRecyclerView extends BridgeRecyclerView { public Parcelable getSuperState() { return mSuperState; } - - public static final Parcelable.Creator CREATOR - = new Parcelable.Creator() { - @Override - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - @Override - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } - - @Override - public Parcelable onSaveInstanceState() { - final SavedState ss = new SavedState(super.onSaveInstanceState()); - - ss.choiceMode = mChoiceMode; - ss.customChoice = mCustomChoice; - ss.checkedItemCount = mCheckedItemCount; - ss.checkState = mCheckStates; - ss.checkIdState = mCheckedIdStates; - - return ss; - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - SavedState ss = (SavedState) state; - super.onRestoreInstanceState(ss.getSuperState()); - - setChoiceMode(ss.choiceMode); - mCustomChoice = ss.customChoice; - mCheckedItemCount = ss.checkedItemCount; - if (ss.checkState != null) { - mCheckStates = ss.checkState; - } - if (ss.checkIdState != null) { - mCheckedIdStates = ss.checkIdState; - } - - if (mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL && mCheckedItemCount > 0) { - mChoiceActionMode = startActionMode(mMultiChoiceModeCallback); - } - updateOnScreenCheckedViews(); - } - - /** - * A MultiChoiceModeListener receives events for {@link android.widget.AbsListView#CHOICE_MODE_MULTIPLE_MODAL}. - * It acts as the {@link android.view.ActionMode.Callback} for the selection mode and also receives - * {@link #onItemCheckedStateChanged(android.view.ActionMode, int, long, boolean)} events when the user - * selects and deselects list items. - */ - public interface MultiChoiceModeListener extends ActionMode.Callback { - /** - * Called when an item is checked or unchecked during selection mode. - * - * @param mode The {@link android.view.ActionMode} providing the selection mode - * @param position Adapter position of the item that was checked or unchecked - * @param id Adapter ID of the item that was checked or unchecked - * @param checked true if the item is now checked, false - * if the item is now unchecked. - */ - void onItemCheckedStateChanged(ActionMode mode, - int position, long id, boolean checked); } class MultiChoiceModeWrapper implements MultiChoiceModeListener { @@ -1064,16 +1069,4 @@ public class EasyRecyclerView extends BridgeRecyclerView { } } } - - /** - * Custom checked - */ - public interface CustomChoiceListener { - - void onIntoCustomChoice(EasyRecyclerView view); - - void onOutOfCustomChoice(EasyRecyclerView view); - - void onItemCheckedStateChanged(EasyRecyclerView view, int position, long id, boolean checked); - } } diff --git a/app/src/main/java/com/hippo/easyrecyclerview/HandlerDrawable.java b/app/src/main/java/com/hippo/easyrecyclerview/HandlerDrawable.java index d3a7b4b0b..eda638440 100644 --- a/app/src/main/java/com/hippo/easyrecyclerview/HandlerDrawable.java +++ b/app/src/main/java/com/hippo/easyrecyclerview/HandlerDrawable.java @@ -28,9 +28,9 @@ import androidx.annotation.NonNull; public class HandlerDrawable extends Drawable { - private int mColor = Color.BLACK; private final Paint mPaint; private final RectF mTemp = new RectF(); + private int mColor = Color.BLACK; public HandlerDrawable() { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); diff --git a/app/src/main/java/com/hippo/easyrecyclerview/LinearDividerItemDecoration.java b/app/src/main/java/com/hippo/easyrecyclerview/LinearDividerItemDecoration.java index c031a9480..b65272737 100644 --- a/app/src/main/java/com/hippo/easyrecyclerview/LinearDividerItemDecoration.java +++ b/app/src/main/java/com/hippo/easyrecyclerview/LinearDividerItemDecoration.java @@ -35,13 +35,10 @@ import androidx.recyclerview.widget.RecyclerView; public class LinearDividerItemDecoration extends RecyclerView.ItemDecoration { public static final int HORIZONTAL = LinearLayoutManager.HORIZONTAL; public static final int VERTICAL = LinearLayoutManager.VERTICAL; - - private boolean mShowFirstDivider = false; - private boolean mShowLastDivider = false; - private final Rect mRect; private final Paint mPaint; - + private boolean mShowFirstDivider = false; + private boolean mShowLastDivider = false; private int mOrientation; private int mThickness; private int mPaddingStart = 0; diff --git a/app/src/main/java/com/hippo/ehviewer/UrlOpener.java b/app/src/main/java/com/hippo/ehviewer/UrlOpener.java index 7f6492568..5c1ec0851 100644 --- a/app/src/main/java/com/hippo/ehviewer/UrlOpener.java +++ b/app/src/main/java/com/hippo/ehviewer/UrlOpener.java @@ -19,13 +19,11 @@ package com.hippo.ehviewer; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; -import android.content.res.Configuration; import android.net.Uri; import android.text.TextUtils; import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.browser.customtabs.CustomTabColorSchemeParams; import androidx.browser.customtabs.CustomTabsIntent; import com.hippo.ehviewer.client.EhUrlOpener; @@ -36,8 +34,6 @@ import com.hippo.ehviewer.ui.MainActivity; import com.hippo.scene.Announcer; import com.hippo.scene.StageActivity; -import rikka.core.res.ResourcesKt; - public final class UrlOpener { private UrlOpener() { diff --git a/app/src/main/java/com/hippo/ehviewer/WindowInsetsAnimationHelper.java b/app/src/main/java/com/hippo/ehviewer/WindowInsetsAnimationHelper.java index 8053dc9aa..f06d11cfa 100644 --- a/app/src/main/java/com/hippo/ehviewer/WindowInsetsAnimationHelper.java +++ b/app/src/main/java/com/hippo/ehviewer/WindowInsetsAnimationHelper.java @@ -15,14 +15,13 @@ public class WindowInsetsAnimationHelper extends WindowInsetsAnimationCompat.Cal private final View[] views; private final HashMap startPaddings = new HashMap<>(); private final HashMap endPaddings = new HashMap<>(); + WindowInsetsAnimationCompat animation; public WindowInsetsAnimationHelper(int dispatchMode, View... views) { super(dispatchMode); this.views = views; } - WindowInsetsAnimationCompat animation; - @Override public void onPrepare(@NonNull WindowInsetsAnimationCompat animation) { super.onPrepare(animation); diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java index 98d4565cb..34044b8d1 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java @@ -36,6 +36,7 @@ import com.hippo.ehviewer.client.exception.EhException; import com.hippo.ehviewer.client.exception.NoHAtHClientException; import com.hippo.ehviewer.client.exception.ParseException; import com.hippo.ehviewer.client.parser.ArchiveParser; +import com.hippo.ehviewer.client.parser.EventPaneParser; import com.hippo.ehviewer.client.parser.FavoritesParser; import com.hippo.ehviewer.client.parser.ForumsParser; import com.hippo.ehviewer.client.parser.GalleryApiParser; @@ -48,7 +49,6 @@ import com.hippo.ehviewer.client.parser.GalleryTokenApiParser; import com.hippo.ehviewer.client.parser.ProfileParser; import com.hippo.ehviewer.client.parser.RateGalleryParser; import com.hippo.ehviewer.client.parser.SignInParser; -import com.hippo.ehviewer.client.parser.EventPaneParser; import com.hippo.ehviewer.client.parser.TorrentParser; import com.hippo.ehviewer.client.parser.VoteCommentParser; import com.hippo.ehviewer.client.parser.VoteTagParser; @@ -971,7 +971,7 @@ public class EhEngine { try { Response response = call.execute(); - Log.d(TAG, "" + response.request().url().toString()); + Log.d(TAG, "" + response.request().url()); code = response.code(); headers = response.headers(); diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhTagDatabase.java b/app/src/main/java/com/hippo/ehviewer/client/EhTagDatabase.java index 84118823c..48a583e31 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhTagDatabase.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhTagDatabase.java @@ -56,9 +56,9 @@ import okio.Okio; public class EhTagDatabase { private static final Map NAMESPACE_TO_PREFIX = new HashMap<>(); - private static volatile EhTagDatabase instance; // TODO more lock for different language private static final Lock lock = new ReentrantLock(); + private static volatile EhTagDatabase instance; static { NAMESPACE_TO_PREFIX.put("artist", "a:"); 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 c646b071e..cbe1a6ffb 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhUrl.java @@ -36,40 +36,29 @@ public class EhUrl { public static final String DOMAIN_LOFI = "lofi.e-hentai.org"; public static final String HOST_EX = "https://" + DOMAIN_EX + "/"; - public static final String HOST_E = "https://" + DOMAIN_E + "/"; - - public static final String API_SIGN_IN = "https://forums.e-hentai.org/index.php?act=Login&CODE=01"; - - public static final String API_E = HOST_E + "api.php"; public static final String API_EX = HOST_EX + "api.php"; - + public static final String URL_FAVORITES_EX = HOST_EX + "favorites.php"; + public static final String URL_UCONFIG_EX = HOST_EX + "uconfig.php"; + public static final String URL_MY_TAGS_EX = HOST_EX + "mytags"; + public static final String URL_WATCHED_EX = HOST_EX + "watched"; + public static final String HOST_E = "https://" + DOMAIN_E + "/"; + public static final String API_E = HOST_E + "api.php"; + public static final String URL_FAVORITES_E = HOST_E + "favorites.php"; + public static final String URL_UCONFIG_E = HOST_E + "uconfig.php"; + public static final String URL_MY_TAGS_E = HOST_E + "mytags"; + public static final String URL_WATCHED_E = HOST_E + "watched"; + public static final String API_SIGN_IN = "https://forums.e-hentai.org/index.php?act=Login&CODE=01"; public static final String URL_POPULAR_E = "https://e-hentai.org/popular"; public static final String URL_POPULAR_EX = "https://exhentai.org/popular"; - public static final String URL_IMAGE_SEARCH_E = "https://upload.e-hentai.org/image_lookup.php"; public static final String URL_IMAGE_SEARCH_EX = "https://exhentai.org/upload/image_lookup.php"; - public static final String URL_SIGN_IN = "https://forums.e-hentai.org/index.php?act=Login"; public static final String URL_REGISTER = "https://forums.e-hentai.org/index.php?act=Reg&CODE=00"; - public static final String URL_FAVORITES_E = HOST_E + "favorites.php"; - public static final String URL_FAVORITES_EX = HOST_EX + "favorites.php"; public static final String URL_FORUMS = "https://forums.e-hentai.org/"; - public static final String REFERER_EX = "https://" + DOMAIN_EX; - public static final String REFERER_E = "https://" + DOMAIN_E; - public static final String ORIGIN_EX = REFERER_EX; + public static final String REFERER_E = "https://" + DOMAIN_E; public static final String ORIGIN_E = REFERER_E; - - public static final String URL_UCONFIG_E = HOST_E + "uconfig.php"; - public static final String URL_UCONFIG_EX = HOST_EX + "uconfig.php"; - - public static final String URL_MY_TAGS_E = HOST_E + "mytags"; - public static final String URL_MY_TAGS_EX = HOST_EX + "mytags"; - - public static final String URL_WATCHED_E = HOST_E + "watched"; - public static final String URL_WATCHED_EX = HOST_EX + "watched"; - private static final String URL_PREFIX_THUMB_E = "https://ehgt.org/"; private static final String URL_PREFIX_THUMB_EX = "https://exhentai.org/t/"; 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 949c38f1a..74b46e65c 100644 --- a/app/src/main/java/com/hippo/ehviewer/preference/IdentityCookiePreference.java +++ b/app/src/main/java/com/hippo/ehviewer/preference/IdentityCookiePreference.java @@ -40,9 +40,9 @@ import okhttp3.HttpUrl; public class IdentityCookiePreference extends MessagePreference { - private String message; @SuppressLint("StaticFieldLeak") private final SettingsActivity mActivity; + private String message; public IdentityCookiePreference(Context context) { super(context); 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 6a06c46b6..e531842a6 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderQueen.java @@ -143,6 +143,7 @@ public final class SpiderQueen implements Runnable { private final int mWorkerMaxCount; private final int mPreloadNumber; private final int mDownloadDelay; + private final AtomicReference showKey = new AtomicReference<>(); private int mReadReference = 0; private int mDownloadReference = 0; // It mQueenThread is null, failed or stopped @@ -153,7 +154,6 @@ public final class SpiderQueen implements Runnable { private volatile int[] mPageStateArray; // For download, when it go to mPageStateArray.size(), done private volatile int mDownloadPage = -1; - private final AtomicReference showKey = new AtomicReference<>(); private SpiderQueen(EhApplication application, @NonNull GalleryInfo galleryInfo) { mHttpClient = EhApplication.getOkHttpClient(application); 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 90c33146d..0eff90751 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java @@ -130,6 +130,36 @@ public class GalleryActivity extends EhActivity implements SeekBar.OnSeekBarChan private GalleryInfo mGalleryInfo; private int mPage; private String mCacheFileName; + ActivityResultLauncher saveImageToLauncher = registerForActivityResult( + new ActivityResultContracts.CreateDocument(), + uri -> { + if (uri != null) { + String filepath = AppConfig.getExternalTempDir() + File.separator + mCacheFileName; + File cachefile = new File(filepath); + + ContentResolver resolver = getContentResolver(); + + IoThreadPoolExecutor.getInstance().execute(() -> { + InputStream is = null; + OutputStream os = null; + try { + is = new FileInputStream(cachefile); + os = resolver.openOutputStream(uri); + IOUtils.copy(is, os); + } catch (IOException e) { + e.printStackTrace(); + } finally { + IOUtils.closeQuietly(is); + IOUtils.closeQuietly(os); + runOnUiThread(() -> Toast.makeText(GalleryActivity.this, getString(R.string.image_saved, uri.getPath()), Toast.LENGTH_SHORT).show()); + } + //noinspection ResultOfMethodCallIgnored + cachefile.delete(); + }); + } + + + }); @Nullable private GLRootView mGLRootView; @Nullable @@ -191,10 +221,7 @@ public class GalleryActivity extends EhActivity implements SeekBar.OnSeekBarChan private int mLayoutMode; private int mSize; private int mCurrentIndex; - - private int mSavingPage = -1; - - ActivityResultLauncher requestStoragePermissionLauncher = registerForActivityResult( + private int mSavingPage = -1; ActivityResultLauncher requestStoragePermissionLauncher = registerForActivityResult( new ActivityResultContracts.RequestPermission(), result -> { if (result && mSavingPage != -1) { @@ -204,36 +231,6 @@ public class GalleryActivity extends EhActivity implements SeekBar.OnSeekBarChan } mSavingPage = -1; }); - ActivityResultLauncher saveImageToLauncher = registerForActivityResult( - new ActivityResultContracts.CreateDocument(), - uri -> { - if (uri != null) { - String filepath = AppConfig.getExternalTempDir() + File.separator + mCacheFileName; - File cachefile = new File(filepath); - - ContentResolver resolver = getContentResolver(); - - IoThreadPoolExecutor.getInstance().execute(() -> { - InputStream is = null; - OutputStream os = null; - try { - is = new FileInputStream(cachefile); - os = resolver.openOutputStream(uri); - IOUtils.copy(is, os); - } catch (IOException e) { - e.printStackTrace(); - } finally { - IOUtils.closeQuietly(is); - IOUtils.closeQuietly(os); - runOnUiThread(() -> Toast.makeText(GalleryActivity.this, getString(R.string.image_saved, uri.getPath()), Toast.LENGTH_SHORT).show()); - } - //noinspection ResultOfMethodCallIgnored - cachefile.delete(); - }); - } - - - }); private void buildProvider() { if (mGalleryProvider != null) { @@ -1023,6 +1020,29 @@ public class GalleryActivity extends EhActivity implements SeekBar.OnSeekBarChan }); } + @Nullable + private String getGalleryDetailUrl() { + long gid; + String token; + if (mGalleryInfo != null) { + gid = mGalleryInfo.gid; + token = mGalleryInfo.token; + } else { + return null; + } + return EhUrl.getGalleryDetailUrl(gid, token, 0, false); + } + + @Override + public void onProvideAssistContent(AssistContent outContent) { + super.onProvideAssistContent(outContent); + + String url = getGalleryDetailUrl(); + if (url != null) { + outContent.setWebUri(Uri.parse(url)); + } + } + private class GalleryMenuHelper implements DialogInterface.OnClickListener { private final View mView; @@ -1283,26 +1303,5 @@ public class GalleryActivity extends EhActivity implements SeekBar.OnSeekBarChan } } - @Nullable - private String getGalleryDetailUrl() { - long gid; - String token; - if (mGalleryInfo != null) { - gid = mGalleryInfo.gid; - token = mGalleryInfo.token; - } else { - return null; - } - return EhUrl.getGalleryDetailUrl(gid, token, 0, false); - } - @Override - public void onProvideAssistContent(AssistContent outContent) { - super.onProvideAssistContent(outContent); - - String url = getGalleryDetailUrl(); - if (url != null) { - outContent.setWebUri(Uri.parse(url)); - } - } } 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 6217a715e..ae0c10097 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 @@ -23,7 +23,6 @@ import android.os.Bundle; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; import com.google.android.material.dialog.MaterialAlertDialogBuilder; diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/FilterFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/FilterFragment.java index 4847f0180..542a02604 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/FilterFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/FilterFragment.java @@ -174,6 +174,25 @@ public class FilterFragment extends BaseFragment { .show(); } + @Override + public int getFragmentTitle() { + return R.string.filter; + } + + private static class FilterHolder extends RecyclerView.ViewHolder { + + private final MaterialCheckBox checkbox; + private final TextView text; + private final ImageView delete; + + public FilterHolder(View itemView) { + super(itemView); + checkbox = itemView.findViewById(R.id.checkbox); + text = itemView.findViewById(R.id.text); + delete = itemView.findViewById(R.id.delete); + } + } + private class AddFilterDialogHelper implements View.OnClickListener { @Nullable @@ -235,20 +254,6 @@ public class FilterFragment extends BaseFragment { } } - private static class FilterHolder extends RecyclerView.ViewHolder { - - private final MaterialCheckBox checkbox; - private final TextView text; - private final ImageView delete; - - public FilterHolder(View itemView) { - super(itemView); - checkbox = itemView.findViewById(R.id.checkbox); - text = itemView.findViewById(R.id.text); - delete = itemView.findViewById(R.id.delete); - } - } - private class FilterAdapter extends RecyclerView.Adapter { private static final int TYPE_ITEM = 0; @@ -457,9 +462,4 @@ public class FilterFragment extends BaseFragment { mEhFilter.triggerFilter(filter); } } - - @Override - public int getFragmentTitle() { - return R.string.filter; - } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/HostsFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/HostsFragment.java index 1a990b251..099a87f77 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/HostsFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/HostsFragment.java @@ -118,6 +118,11 @@ public class HostsFragment extends BaseFragment adapter.notifyDataSetChanged(); } + @Override + public int getFragmentTitle() { + return R.string.hosts; + } + public abstract static class HostDialogFragment extends DialogFragment { private HostsFragment hostsFragment; @@ -266,9 +271,4 @@ public class HostsFragment extends BaseFragment return data.size(); } } - - @Override - public int getFragmentTitle() { - return R.string.hosts; - } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/MyTagsFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/MyTagsFragment.java index 2615d09b6..3e5d3abf6 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/MyTagsFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/MyTagsFragment.java @@ -72,6 +72,11 @@ public class MyTagsFragment extends BaseFragment { } } + @Override + public int getFragmentTitle() { + return R.string.my_tags; + } + private class MyTagsWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { @@ -89,9 +94,4 @@ public class MyTagsFragment extends BaseFragment { progress.setVisibility(View.GONE); } } - - @Override - public int getFragmentTitle() { - return R.string.my_tags; - } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/UConfigFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/UConfigFragment.java index 7e0bd3e36..0bae779ea 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/UConfigFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/UConfigFragment.java @@ -146,6 +146,16 @@ public class UConfigFragment extends BaseFragment { } } + @Override + public void onDestroy() { + super.onDestroy(); + } + + @Override + public int getFragmentTitle() { + return R.string.u_config; + } + private class UConfigWebViewClient extends WebViewClient { @Override @@ -166,14 +176,4 @@ public class UConfigFragment extends BaseFragment { loaded = true; } } - - @Override - public void onDestroy() { - super.onDestroy(); - } - - @Override - public int getFragmentTitle() { - return R.string.u_config; - } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java index 8b2677588..2cd69f0c8 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java @@ -41,7 +41,6 @@ import androidx.fragment.app.FragmentActivity; import com.hippo.ehviewer.ui.MainActivity; import com.hippo.scene.SceneFragment; -import com.hippo.util.AppHelper; public abstract class BaseScene extends SceneFragment { 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 f3742847a..4c6108c57 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 @@ -378,7 +378,7 @@ public class DownloadsScene extends ToolbarScene mRecyclerView.scrollToPosition(mInitPosition); mInitPosition = -1; } - RecyclerViewKt.addEdgeSpacing(mRecyclerView, 4,4,4,4, TypedValue.COMPLEX_UNIT_DIP); + RecyclerViewKt.addEdgeSpacing(mRecyclerView, 4, 4, 4, 4, TypedValue.COMPLEX_UNIT_DIP); RecyclerViewKt.fixEdgeEffect(mRecyclerView, false, true); mFastScroller.attachToRecyclerView(mRecyclerView); @@ -437,8 +437,8 @@ public class DownloadsScene extends ToolbarScene TapTargetView.showFor(requireActivity(), TapTarget.forView(((DownloadHolder) holder).thumb, - getString(R.string.guide_download_thumb_title), - getString(R.string.guide_download_thumb_text)) + getString(R.string.guide_download_thumb_title), + getString(R.string.guide_download_thumb_text)) .transparentTarget(true), new TapTargetView.Listener() { @Override @@ -466,8 +466,8 @@ public class DownloadsScene extends ToolbarScene TapTargetView.showFor(requireActivity(), TapTarget.forBounds(bounds, - getString(R.string.guide_download_labels_title), - getString(R.string.guide_download_labels_text)) + getString(R.string.guide_download_labels_title), + getString(R.string.guide_download_labels_text)) .outerCircleColor(R.color.colorPrimary) .transparentTarget(true), new TapTargetView.Listener() { @@ -999,6 +999,73 @@ public class DownloadsScene extends ToolbarScene } } + private static class ThumbDataContainer implements DataContainer { + + private final DownloadInfo mInfo; + @Nullable + private UniFile mFile; + + public ThumbDataContainer(@NonNull DownloadInfo info) { + mInfo = info; + } + + private void ensureFile() { + if (mFile == null) { + UniFile dir = SpiderDen.getGalleryDownloadDir(mInfo); + if (dir != null && dir.isDirectory()) { + mFile = dir.createFile(".thumb"); + } + } + } + + @Override + public boolean isEnabled() { + ensureFile(); + return mFile != null; + } + + @Override + public void onUrlMoved(String requestUrl, String responseUrl) { + } + + @Override + public boolean save(InputStream is, long length, String mediaType, ProgressNotifier notify) { + ensureFile(); + if (mFile == null) { + return false; + } + + OutputStream os = null; + try { + os = mFile.openOutputStream(); + IOUtils.copy(is, os); + return true; + } catch (IOException e) { + e.printStackTrace(); + return false; + } finally { + IOUtils.closeQuietly(os); + } + } + + @Override + public InputStreamPipe get() { + ensureFile(); + if (mFile != null) { + return new UniFileInputStreamPipe(mFile); + } else { + return null; + } + } + + @Override + public void remove() { + if (mFile != null) { + mFile.delete(); + } + } + } + private class DownloadLabelAdapter extends RecyclerView.Adapter implements DraggableItemAdapter { private final LayoutInflater mInflater; @@ -1392,73 +1459,6 @@ public class DownloadsScene extends ToolbarScene } } - private static class ThumbDataContainer implements DataContainer { - - private final DownloadInfo mInfo; - @Nullable - private UniFile mFile; - - public ThumbDataContainer(@NonNull DownloadInfo info) { - mInfo = info; - } - - private void ensureFile() { - if (mFile == null) { - UniFile dir = SpiderDen.getGalleryDownloadDir(mInfo); - if (dir != null && dir.isDirectory()) { - mFile = dir.createFile(".thumb"); - } - } - } - - @Override - public boolean isEnabled() { - ensureFile(); - return mFile != null; - } - - @Override - public void onUrlMoved(String requestUrl, String responseUrl) { - } - - @Override - public boolean save(InputStream is, long length, String mediaType, ProgressNotifier notify) { - ensureFile(); - if (mFile == null) { - return false; - } - - OutputStream os = null; - try { - os = mFile.openOutputStream(); - IOUtils.copy(is, os); - return true; - } catch (IOException e) { - e.printStackTrace(); - return false; - } finally { - IOUtils.closeQuietly(os); - } - } - - @Override - public InputStreamPipe get() { - ensureFile(); - if (mFile != null) { - return new UniFileInputStreamPipe(mFile); - } else { - return null; - } - } - - @Override - public void remove() { - if (mFile != null) { - mFile.delete(); - } - } - } - private class RenameLabelDialogHelper implements View.OnClickListener { private final EditTextDialogBuilder mBuilder; diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java index 3b9522760..46938692a 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java @@ -27,7 +27,6 @@ import android.os.Bundle; import android.text.InputType; import android.text.TextUtils; import android.util.SparseBooleanArray; -import android.util.TypedValue; import android.view.Display; import android.view.Gravity; import android.view.LayoutInflater; @@ -91,7 +90,6 @@ import java.util.Collections; import java.util.List; import rikka.core.res.ResourcesKt; -import rikka.recyclerview.RecyclerViewKt; // TODO Get favorite, modify favorite, add favorite, what a mess! @SuppressLint("RtlHardcoded") @@ -121,6 +119,19 @@ public class FavoritesScene extends BaseScene implements @Nullable @ViewLifeCircle private FabLayout mFabLayout; + private final Runnable showNormalFabsRunnable = new Runnable() { + @Override + public void run() { + if (mFabLayout != null) { + mFabLayout.setSecondaryFabVisibilityAt(0, true); + mFabLayout.setSecondaryFabVisibilityAt(1, true); + mFabLayout.setSecondaryFabVisibilityAt(2, true); + mFabLayout.setSecondaryFabVisibilityAt(3, false); + mFabLayout.setSecondaryFabVisibilityAt(4, false); + mFabLayout.setSecondaryFabVisibilityAt(5, false); + } + } + }; @Nullable @ViewLifeCircle private FavoritesAdapter mAdapter; @@ -166,20 +177,6 @@ public class FavoritesScene extends BaseScene implements // For modify action private boolean mModifyAdd; - private final Runnable showNormalFabsRunnable = new Runnable() { - @Override - public void run() { - if (mFabLayout != null) { - mFabLayout.setSecondaryFabVisibilityAt(0, true); - mFabLayout.setSecondaryFabVisibilityAt(1, true); - mFabLayout.setSecondaryFabVisibilityAt(2, true); - mFabLayout.setSecondaryFabVisibilityAt(3, false); - mFabLayout.setSecondaryFabVisibilityAt(4, false); - mFabLayout.setSecondaryFabVisibilityAt(5, false); - } - } - }; - @Override public int getNavCheckedItem() { return R.id.nav_favourite; @@ -335,8 +332,8 @@ public class FavoritesScene extends BaseScene implements TapTargetView.showFor(requireActivity(), TapTarget.forBounds(bounds, - getString(R.string.guide_collections_title), - getString(R.string.guide_collections_text)) + getString(R.string.guide_collections_title), + getString(R.string.guide_collections_text)) .outerCircleColor(R.color.colorPrimary) .transparentTarget(true), new TapTargetView.Listener() { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryAdapter.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryAdapter.java index 9d64e836b..4ec6ca2f4 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryAdapter.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryAdapter.java @@ -60,11 +60,11 @@ abstract class GalleryAdapter extends RecyclerView.Adapter { private final int mPaddingTopSB; private final int mListThumbWidth; private final int mListThumbHeight; + private final boolean mShowFavourited; + private final DownloadManager mDownloadManager; private MarginItemDecoration mListDecoration; private MarginItemDecoration mGirdDecoration; private int mType = TYPE_INVALID; - private final boolean mShowFavourited; - private final DownloadManager mDownloadManager; public GalleryAdapter(@NonNull LayoutInflater inflater, @NonNull Resources resources, @NonNull RecyclerView recyclerView, int type, boolean showFavourited) { 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 3e35a144f..c5af49510 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 @@ -45,7 +45,6 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; import androidx.core.content.ContextCompat; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsAnimationCompat; @@ -224,7 +223,7 @@ public final class GalleryCommentsScene extends ToolbarScene if (itemAnimator instanceof DefaultItemAnimator) { ((DefaultItemAnimator) itemAnimator).setSupportsChangeAnimations(false); } - RecyclerViewKt.addEdgeSpacing(mRecyclerView, 0,0,0,80, TypedValue.COMPLEX_UNIT_DIP); + RecyclerViewKt.addEdgeSpacing(mRecyclerView, 0, 0, 0, 80, TypedValue.COMPLEX_UNIT_DIP); mSendImage.setOnClickListener(this); mFab.setOnClickListener(this); @@ -472,27 +471,27 @@ public final class GalleryCommentsScene extends ToolbarScene mFab.animate().x(fabEndX).y(fabEndY).scaleX(0.0f).scaleY(0.0f) .setInterpolator(AnimationUtils.SLOW_FAST_SLOW_INTERPOLATOR) .setDuration(300L).setListener(new SimpleAnimatorListener() { - @Override - public void onAnimationEnd(Animator animation) { - if (null == mFab || null == mEditPanel) { - return; - } - - ((View) mFab).setVisibility(View.INVISIBLE); - mEditPanel.setVisibility(View.VISIBLE); - int halfW = mEditPanel.getWidth() / 2; - int halfH = mEditPanel.getHeight() / 2; - Animator animator = ViewAnimationUtils.createCircularReveal(mEditPanel, halfW, halfH, 0, - (float) Math.hypot(halfW, halfH)).setDuration(300L); - animator.addListener(new SimpleAnimatorListener() { @Override - public void onAnimationEnd(Animator a) { - mInAnimation = false; + public void onAnimationEnd(Animator animation) { + if (null == mFab || null == mEditPanel) { + return; + } + + ((View) mFab).setVisibility(View.INVISIBLE); + mEditPanel.setVisibility(View.VISIBLE); + int halfW = mEditPanel.getWidth() / 2; + int halfH = mEditPanel.getHeight() / 2; + Animator animator = ViewAnimationUtils.createCircularReveal(mEditPanel, halfW, halfH, 0, + (float) Math.hypot(halfW, halfH)).setDuration(300L); + animator.addListener(new SimpleAnimatorListener() { + @Override + public void onAnimationEnd(Animator a) { + mInAnimation = false; + } + }); + animator.start(); } - }); - animator.start(); - } - }).start(); + }).start(); } private void showEditPanel(boolean animation) { @@ -544,11 +543,11 @@ public final class GalleryCommentsScene extends ToolbarScene mFab.animate().translationX(0.0f).translationY(0.0f).scaleX(1.0f).scaleY(1.0f).rotation(0.0f) .setInterpolator(AnimationUtils.SLOW_FAST_SLOW_INTERPOLATOR) .setDuration(300L).setListener(new SimpleAnimatorListener() { - @Override - public void onAnimationEnd(Animator animation) { - mInAnimation = false; - } - }).start(); + @Override + public void onAnimationEnd(Animator animation) { + mInAnimation = false; + } + }).start(); } }); animator.start(); @@ -848,6 +847,18 @@ public final class GalleryCommentsScene extends ToolbarScene } } + private static class MoreCommentHolder extends CommentHolder { + public MoreCommentHolder(LayoutInflater inflater, ViewGroup parent) { + super(inflater, R.layout.item_gallery_comment_more, parent); + } + } + + private static class ProgressCommentHolder extends CommentHolder { + public ProgressCommentHolder(LayoutInflater inflater, ViewGroup parent) { + super(inflater, R.layout.item_gallery_comment_progress, parent); + } + } + private class ActualCommentHolder extends CommentHolder { private final TextView user; @@ -902,18 +913,6 @@ public final class GalleryCommentsScene extends ToolbarScene } } - private static class MoreCommentHolder extends CommentHolder { - public MoreCommentHolder(LayoutInflater inflater, ViewGroup parent) { - super(inflater, R.layout.item_gallery_comment_more, parent); - } - } - - private static class ProgressCommentHolder extends CommentHolder { - public ProgressCommentHolder(LayoutInflater inflater, ViewGroup parent) { - super(inflater, R.layout.item_gallery_comment_progress, parent); - } - } - private class CommentAdapter extends RecyclerView.Adapter { private final LayoutInflater mInflater; 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 d2d4fd595..f851b6a1c 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 @@ -265,12 +265,6 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene private GalleryDetail mGalleryDetail; private int mRequestId = IntIdGenerator.INVALID_ID; private Pair[] mTorrentList; - private String mArchiveFormParamOr; - private Pair[] mArchiveList; - @State - private int mState = STATE_INIT; - private boolean mModifingFavorites; - ActivityResultLauncher requestStoragePermissionLauncher = registerForActivityResult( new ActivityResultContracts.RequestPermission(), result -> { @@ -284,6 +278,24 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene helper.setDialog(dialog, mGalleryDetail.torrentUrl); } }); + private String mArchiveFormParamOr; + private Pair[] mArchiveList; + @State + private int mState = STATE_INIT; + private boolean mModifingFavorites; + + @Nullable + private static String getArtist(GalleryTagGroup[] tagGroups) { + if (null == tagGroups) { + return null; + } + for (GalleryTagGroup tagGroup : tagGroups) { + if ("artist".equals(tagGroup.groupName) && tagGroup.size() > 0) { + return tagGroup.getTagAt(0); + } + } + return null; + } @StringRes private int getRatingText(float rating) { @@ -330,19 +342,6 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene return resId; } - @Nullable - private static String getArtist(GalleryTagGroup[] tagGroups) { - if (null == tagGroups) { - return null; - } - for (GalleryTagGroup tagGroup : tagGroups) { - if ("artist".equals(tagGroup.groupName) && tagGroup.size() > 0) { - return tagGroup.getTagAt(0); - } - } - return null; - } - private void handleArgs(Bundle args) { if (args == null) { return; @@ -1710,6 +1709,16 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene mModifingFavorites = false; } + @Override + public void onProvideAssistContent(AssistContent outContent) { + super.onProvideAssistContent(outContent); + + String url = getGalleryDetailUrl(false); + if (url != null) { + outContent.setWebUri(Uri.parse(url)); + } + } + @IntDef({STATE_INIT, STATE_NORMAL, STATE_REFRESH, STATE_REFRESH_HEADER, STATE_FAILED}) @Retention(RetentionPolicy.SOURCE) private @interface State { @@ -2223,14 +2232,4 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene EhApplication.getEhClient(context).execute(request); } } - - @Override - public void onProvideAssistContent(AssistContent outContent) { - super.onProvideAssistContent(outContent); - - String url = getGalleryDetailUrl(false); - if (url != null) { - outContent.setWebUri(Uri.parse(url)); - } - } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java index e337a5e86..e06a57788 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java @@ -165,6 +165,9 @@ public final class GalleryListScene extends BaseScene private EasyRecyclerView mRecyclerView; @Nullable private SearchLayout mSearchLayout; + ActivityResultLauncher selectImageLauncher = registerForActivityResult( + new ActivityResultContracts.OpenDocument(), + result -> mSearchLayout.setImageUri(result)); @Nullable private SearchBar mSearchBar; @Nullable @@ -236,10 +239,6 @@ public final class GalleryListScene extends BaseScene private FavouriteStatusRouter.Listener mFavouriteStatusRouterListener; private boolean mIsTopList = false; - ActivityResultLauncher selectImageLauncher = registerForActivityResult( - new ActivityResultContracts.OpenDocument(), - result -> mSearchLayout.setImageUri(result)); - @Nullable private static String getSuitableTitleForUrlBuilder( Resources resources, ListUrlBuilder urlBuilder, boolean appName) { @@ -657,8 +656,8 @@ public final class GalleryListScene extends BaseScene TapTargetView.showFor(requireActivity(), TapTarget.forBounds(bounds, - getString(R.string.guide_quick_search_title), - getString(R.string.guide_quick_search_text)) + getString(R.string.guide_quick_search_title), + getString(R.string.guide_quick_search_text)) .outerCircleColor(R.color.colorPrimary) .transparentTarget(true), new TapTargetView.Listener() { @@ -1093,39 +1092,6 @@ public final class GalleryListScene extends BaseScene return true; } - private class MoveDialogHelper implements DialogInterface.OnClickListener { - - private final String[] mLabels; - private final GalleryInfo mGi; - - public MoveDialogHelper(String[] labels, GalleryInfo gi) { - mLabels = labels; - mGi = gi; - } - - @Override - public void onClick(DialogInterface dialog, int which) { - // Cancel check mode - Context context = getContext(); - if (null == context) { - return; - } - if (null != mRecyclerView) { - mRecyclerView.outOfCustomChoiceMode(); - } - - DownloadManager downloadManager = EhApplication.getDownloadManager(context); - DownloadInfo downloadInfo = downloadManager.getDownloadInfo(mGi.gid); - if (downloadInfo == null) { - return; - } - - String label = which == 0 ? null : mLabels[which]; - - downloadManager.changeLabel(Collections.singletonList(downloadInfo), label); - } - } - private void showActionFab() { if (null != mFabLayout && STATE_NORMAL == mState && !mShowActionFab) { mShowActionFab = true; @@ -1614,6 +1580,39 @@ public final class GalleryListScene extends BaseScene } } + private class MoveDialogHelper implements DialogInterface.OnClickListener { + + private final String[] mLabels; + private final GalleryInfo mGi; + + public MoveDialogHelper(String[] labels, GalleryInfo gi) { + mLabels = labels; + mGi = gi; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + // Cancel check mode + Context context = getContext(); + if (null == context) { + return; + } + if (null != mRecyclerView) { + mRecyclerView.outOfCustomChoiceMode(); + } + + DownloadManager downloadManager = EhApplication.getDownloadManager(context); + DownloadInfo downloadInfo = downloadManager.getDownloadInfo(mGi.gid); + if (downloadInfo == null) { + return; + } + + String label = which == 0 ? null : mLabels[which]; + + downloadManager.changeLabel(Collections.singletonList(downloadInfo), label); + } + } + private class QsDrawerAdapter extends RecyclerView.Adapter implements DraggableItemAdapter { private final LayoutInflater mInflater; diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.java index fdcad1ca8..ee8045bf5 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.java @@ -86,7 +86,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import rikka.core.res.ResourcesKt; import rikka.recyclerview.RecyclerViewKt; public class HistoryScene extends ToolbarScene { @@ -234,7 +233,7 @@ public class HistoryScene extends ToolbarScene { guardManager.attachRecyclerView(mRecyclerView); swipeManager.attachRecyclerView(mRecyclerView); RecyclerViewKt.fixEdgeEffect(mRecyclerView, false, true); - RecyclerViewKt.addEdgeSpacing(mRecyclerView, 4,4,4,4, TypedValue.COMPLEX_UNIT_DIP); + RecyclerViewKt.addEdgeSpacing(mRecyclerView, 4, 4, 4, 4, TypedValue.COMPLEX_UNIT_DIP); mFastScroller.attachToRecyclerView(mRecyclerView); HandlerDrawable handlerDrawable = new HandlerDrawable(); @@ -458,39 +457,6 @@ public class HistoryScene extends ToolbarScene { return true; } - private class MoveDialogHelper implements DialogInterface.OnClickListener { - - private final String[] mLabels; - private final GalleryInfo mGi; - - public MoveDialogHelper(String[] labels, GalleryInfo gi) { - mLabels = labels; - mGi = gi; - } - - @Override - public void onClick(DialogInterface dialog, int which) { - // Cancel check mode - Context context = getContext(); - if (null == context) { - return; - } - if (null != mRecyclerView) { - mRecyclerView.outOfCustomChoiceMode(); - } - - DownloadManager downloadManager = EhApplication.getDownloadManager(context); - DownloadInfo downloadInfo = downloadManager.getDownloadInfo(mGi.gid); - if (downloadInfo == null) { - return; - } - - String label = which == 0 ? null : mLabels[which]; - - downloadManager.changeLabel(Collections.singletonList(downloadInfo), label); - } - } - private static class AddToFavoriteListener extends EhCallback { public AddToFavoriteListener(Context context, int stageId, String sceneTag) { @@ -578,6 +544,39 @@ public class HistoryScene extends ToolbarScene { } } + private class MoveDialogHelper implements DialogInterface.OnClickListener { + + private final String[] mLabels; + private final GalleryInfo mGi; + + public MoveDialogHelper(String[] labels, GalleryInfo gi) { + mLabels = labels; + mGi = gi; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + // Cancel check mode + Context context = getContext(); + if (null == context) { + return; + } + if (null != mRecyclerView) { + mRecyclerView.outOfCustomChoiceMode(); + } + + DownloadManager downloadManager = EhApplication.getDownloadManager(context); + DownloadInfo downloadInfo = downloadManager.getDownloadInfo(mGi.gid); + if (downloadInfo == null) { + return; + } + + String label = which == 0 ? null : mLabels[which]; + + downloadManager.changeLabel(Collections.singletonList(downloadInfo), label); + } + } + private class HistoryAdapter extends RecyclerView.Adapter implements SwipeableItemAdapter { 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 a4c5f7cac..392b3a51a 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 @@ -41,7 +41,7 @@ import java.util.List; import java.util.concurrent.Executors; public class SecurityScene extends SolidScene implements - LockPatternView.OnPatternListener{ + LockPatternView.OnPatternListener { private static final int MAX_RETRY_TIMES = 5; private static final String KEY_RETRY_TIMES = "retry_times"; diff --git a/app/src/main/java/com/hippo/ehviewer/widget/GalleryHeader.java b/app/src/main/java/com/hippo/ehviewer/widget/GalleryHeader.java index 35bb8b763..bf73be3fa 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/GalleryHeader.java +++ b/app/src/main/java/com/hippo/ehviewer/widget/GalleryHeader.java @@ -32,19 +32,15 @@ import com.hippo.yorozuya.ObjectUtils; public class GalleryHeader extends ViewGroup { - private DisplayCutoutCompat displayCutout; - private int topInsets = 0; - - private View battery; - private View progress; - private View clock; - private final Rect batteryRect = new Rect(); private final Rect progressRect = new Rect(); private final Rect clockRect = new Rect(); - private final int[] location = new int[2]; - + private DisplayCutoutCompat displayCutout; + private int topInsets = 0; + private View battery; + private View progress; + private View clock; private int lastX = 0; private int lastY = 0; diff --git a/app/src/main/java/com/hippo/ehviewer/widget/GalleryInfoContentHelper.java b/app/src/main/java/com/hippo/ehviewer/widget/GalleryInfoContentHelper.java index a550b181b..45fcd6973 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/GalleryInfoContentHelper.java +++ b/app/src/main/java/com/hippo/ehviewer/widget/GalleryInfoContentHelper.java @@ -33,10 +33,9 @@ import java.util.Map; public abstract class GalleryInfoContentHelper extends ContentLayout.ContentHelper { private static final String KEY_DATA_MAP = "data_map"; - + private final FavouriteStatusRouter.Listener listener; @SuppressLint("UseSparseArrays") private Map map = new HashMap<>(); - private final FavouriteStatusRouter.Listener listener; public GalleryInfoContentHelper() { listener = (gid, slot) -> { diff --git a/app/src/main/java/com/hippo/ehviewer/widget/SearchBar.java b/app/src/main/java/com/hippo/ehviewer/widget/SearchBar.java index 9f29ba080..05f579661 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/SearchBar.java +++ b/app/src/main/java/com/hippo/ehviewer/widget/SearchBar.java @@ -40,7 +40,6 @@ import android.widget.TextView; import androidx.annotation.Keep; import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; import androidx.core.util.Pair; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -491,6 +490,27 @@ public class SearchBar extends MaterialCardView implements View.OnClickListener, } } + private String wrapTagKeyword(String keyword) { + keyword = keyword.trim(); + + int index1 = keyword.indexOf(':'); + if (index1 == -1 || index1 >= keyword.length() - 1) { + // Can't find :, or : is the last char + return keyword; + } + if (keyword.charAt(index1 + 1) == '"') { + // The char after : is ", the word must be quoted + return keyword; + } + int index2 = keyword.indexOf(' '); + if (index2 <= index1) { + // Can't find space, or space is before : + return keyword; + } + + return keyword.substring(0, index1 + 1) + "\"" + keyword.substring(index1 + 1) + "$\""; + } + public interface Helper { void onClickTitle(); @@ -666,25 +686,4 @@ public class SearchBar extends MaterialCardView implements View.OnClickListener, return true; } } - - private String wrapTagKeyword(String keyword) { - keyword = keyword.trim(); - - int index1 = keyword.indexOf(':'); - if (index1 == -1 || index1 >= keyword.length() - 1) { - // Can't find :, or : is the last char - return keyword; - } - if (keyword.charAt(index1 + 1) == '"') { - // The char after : is ", the word must be quoted - return keyword; - } - int index2 = keyword.indexOf(' '); - if (index2 <= index1) { - // Can't find space, or space is before : - return keyword; - } - - return keyword.substring(0, index1 + 1) + "\"" + keyword.substring(index1 + 1) + "$\""; - } } diff --git a/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java b/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java index 64c15ab0f..d2df2969a 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java +++ b/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.java @@ -314,6 +314,22 @@ public class SearchLayout extends EasyRecyclerView implements CompoundButton.OnC void onSelectImage(); } + static class SearchLayoutManager extends LinearLayoutManager { + + public SearchLayoutManager(Context context) { + super(context); + } + + @Override + public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { + try { + super.onLayoutChildren(recycler, state); + } catch (IndexOutOfBoundsException e) { + e.printStackTrace(); + } + } + } + private class SearchAdapter extends EasyRecyclerView.Adapter { @Override @@ -384,20 +400,4 @@ public class SearchLayout extends EasyRecyclerView implements CompoundButton.OnC return type; } } - - static class SearchLayoutManager extends LinearLayoutManager { - - public SearchLayoutManager(Context context) { - super(context); - } - - @Override - public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { - try { - super.onLayoutChildren(recycler, state); - } catch (IndexOutOfBoundsException e) { - e.printStackTrace(); - } - } - } } diff --git a/app/src/main/java/com/hippo/ehviewer/widget/SeekBarPanel.java b/app/src/main/java/com/hippo/ehviewer/widget/SeekBarPanel.java index 08f9401ee..7fe6ce04f 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/SeekBarPanel.java +++ b/app/src/main/java/com/hippo/ehviewer/widget/SeekBarPanel.java @@ -31,8 +31,8 @@ import com.hippo.yorozuya.ViewUtils; public class SeekBarPanel extends LinearLayout { - private SeekBar mSeekBar; private final int[] mLocation = new int[2]; + private SeekBar mSeekBar; public SeekBarPanel(Context context) { super(context); diff --git a/app/src/main/java/com/hippo/util/ReadableTime.java b/app/src/main/java/com/hippo/util/ReadableTime.java index 4c5c13739..64fe3b79c 100644 --- a/app/src/main/java/com/hippo/util/ReadableTime.java +++ b/app/src/main/java/com/hippo/util/ReadableTime.java @@ -36,7 +36,6 @@ public final class ReadableTime { public static final long DAY_MILLIS = 24 * HOUR_MILLIS; public static final long WEEK_MILLIS = 7 * DAY_MILLIS; public static final long YEAR_MILLIS = 365 * DAY_MILLIS; - public static final int SIZE = 5; public static final long[] MULTIPLES = { YEAR_MILLIS, DAY_MILLIS, @@ -44,6 +43,7 @@ public final class ReadableTime { MINUTE_MILLIS, SECOND_MILLIS }; + public static final int SIZE = 5; public static final int[] UNITS = { R.plurals.year, R.plurals.day, diff --git a/app/src/main/java/com/hippo/view/ViewTransition.java b/app/src/main/java/com/hippo/view/ViewTransition.java index e0968c67f..660670b6a 100644 --- a/app/src/main/java/com/hippo/view/ViewTransition.java +++ b/app/src/main/java/com/hippo/view/ViewTransition.java @@ -26,12 +26,9 @@ public class ViewTransition { protected static final long ANIMATE_TIME = 300L; private final View[] mViews; - - private int mShownView = -1; - protected ViewPropertyAnimator mAnimator1; protected ViewPropertyAnimator mAnimator2; - + private int mShownView = -1; private OnShowViewListener mOnShowViewListener; public ViewTransition(View... views) { diff --git a/app/src/main/java/com/hippo/widget/AutoWrapLayout.java b/app/src/main/java/com/hippo/widget/AutoWrapLayout.java index 87608317c..f448ce6a9 100644 --- a/app/src/main/java/com/hippo/widget/AutoWrapLayout.java +++ b/app/src/main/java/com/hippo/widget/AutoWrapLayout.java @@ -167,8 +167,8 @@ public class AutoWrapLayout extends ViewGroup { // If it is first item in line, try to show it all if (lineEndIndex == lineStartIndex) { child.measure(MeasureSpec.makeMeasureSpec( - maxWidth - paddingLeft - paddingRight - - lp.leftMargin - lp.rightMargin, MeasureSpec.AT_MOST), + maxWidth - paddingLeft - paddingRight + - lp.leftMargin - lp.rightMargin, MeasureSpec.AT_MOST), MeasureSpec.UNSPECIFIED); childWidth = child.getMeasuredWidth(); childHeight = child.getMeasuredHeight(); diff --git a/app/src/main/java/com/hippo/widget/BatteryView.java b/app/src/main/java/com/hippo/widget/BatteryView.java index c7ab2b7bd..ce2fc5381 100644 --- a/app/src/main/java/com/hippo/widget/BatteryView.java +++ b/app/src/main/java/com/hippo/widget/BatteryView.java @@ -41,7 +41,7 @@ public class BatteryView extends AppCompatTextView { private boolean mCharging = false; private BatteryDrawable mDrawable; - private final Runnable mCharger = new Runnable() { + private boolean mAttached = false; private final Runnable mCharger = new Runnable() { private int level = 0; @@ -55,9 +55,14 @@ public class BatteryView extends AppCompatTextView { getHandler().postDelayed(mCharger, 200); } }; - private boolean mAttached = false; private boolean mIsChargerWorking = false; - private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { + public BatteryView(Context context) { + super(context); + init(); + } + public BatteryView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override @SuppressLint("SetTextI18n") @@ -88,15 +93,6 @@ public class BatteryView extends AppCompatTextView { } }; - public BatteryView(Context context) { - super(context); - init(); - } - - public BatteryView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - public BatteryView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); @@ -173,4 +169,8 @@ public class BatteryView extends AppCompatTextView { private void unregisterReceiver() { getContext().unregisterReceiver(mIntentReceiver); } + + + + } diff --git a/app/src/main/java/com/hippo/widget/CheckTextView.java b/app/src/main/java/com/hippo/widget/CheckTextView.java index 3cfa258df..58bb1a24a 100644 --- a/app/src/main/java/com/hippo/widget/CheckTextView.java +++ b/app/src/main/java/com/hippo/widget/CheckTextView.java @@ -33,17 +33,12 @@ import com.hippo.ehviewer.R; public class CheckTextView extends AppCompatCheckedTextView implements View.OnClickListener { - private Drawable mForeground; - private final Rect mSelfBounds = new Rect(); - private final Rect mOverlayBounds = new Rect(); - - private int mForegroundGravity = Gravity.FILL; - protected boolean mForegroundInPadding = true; - boolean mForegroundBoundsChanged = false; + private Drawable mForeground; + private int mForegroundGravity = Gravity.FILL; public CheckTextView(Context context) { this(context, null); @@ -136,6 +131,16 @@ public class CheckTextView extends AppCompatCheckedTextView implements View.OnCl } } + /** + * Returns the drawable used as the foreground of this FrameLayout. The + * foreground drawable, if non-null, is always drawn on top of the children. + * + * @return A Drawable or null if no foreground was set. + */ + public Drawable getForeground() { + return mForeground; + } + /** * Supply a Drawable that is to be rendered on top of all of the child * views in the frame layout. Any padding in the Drawable will be taken @@ -171,16 +176,6 @@ public class CheckTextView extends AppCompatCheckedTextView implements View.OnCl } } - /** - * Returns the drawable used as the foreground of this FrameLayout. The - * foreground drawable, if non-null, is always drawn on top of the children. - * - * @return A Drawable or null if no foreground was set. - */ - public Drawable getForeground() { - return mForeground; - } - @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); diff --git a/app/src/main/java/com/hippo/widget/ContentLayout.java b/app/src/main/java/com/hippo/widget/ContentLayout.java index 314573550..cb14f928b 100644 --- a/app/src/main/java/com/hippo/widget/ContentLayout.java +++ b/app/src/main/java/com/hippo/widget/ContentLayout.java @@ -56,7 +56,6 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; -import rikka.core.res.ResourcesKt; import rikka.recyclerview.RecyclerViewKt; public class ContentLayout extends FrameLayout { @@ -125,7 +124,7 @@ public class ContentLayout extends FrameLayout { resources.getColor(R.color.loading_indicator_orange)); mBottomProgress.setIndeterminateAnimationType(LinearProgressIndicator.INDETERMINATE_ANIMATION_TYPE_CONTIGUOUS); - RecyclerViewKt.addEdgeSpacing(mRecyclerView, 4,4,4,4, TypedValue.COMPLEX_UNIT_DIP); + RecyclerViewKt.addEdgeSpacing(mRecyclerView, 4, 4, 4, 4, TypedValue.COMPLEX_UNIT_DIP); RecyclerViewKt.fixEdgeEffect(mRecyclerView, false, true); mRecyclerViewOriginBottom = mRecyclerView.getPaddingBottom(); @@ -263,8 +262,6 @@ public class ContentLayout extends FrameLayout { private int mCurrentTaskId; private int mCurrentTaskType; private int mCurrentTaskPage; - private int mNextPageScrollSize; - private String mEmptyString = "No hint"; private final SwipeRefreshLayout.OnRefreshListener mOnRefreshListener = new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { @@ -278,6 +275,8 @@ public class ContentLayout extends FrameLayout { } } }; + private int mNextPageScrollSize; + private String mEmptyString = "No hint"; private final RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { diff --git a/app/src/main/java/com/hippo/widget/Slider.java b/app/src/main/java/com/hippo/widget/Slider.java index 436027751..7c37eb3ad 100644 --- a/app/src/main/java/com/hippo/widget/Slider.java +++ b/app/src/main/java/com/hippo/widget/Slider.java @@ -45,8 +45,6 @@ import com.hippo.yorozuya.LayoutUtils; import com.hippo.yorozuya.MathUtils; import com.hippo.yorozuya.SimpleHandler; -import rikka.core.res.ResourcesKt; - public class Slider extends View { private static final char[] CHARACTERS = { diff --git a/app/src/main/java/com/hippo/widget/TextClock.java b/app/src/main/java/com/hippo/widget/TextClock.java index e9ae121d4..641bc0023 100644 --- a/app/src/main/java/com/hippo/widget/TextClock.java +++ b/app/src/main/java/com/hippo/widget/TextClock.java @@ -55,7 +55,7 @@ public class TextClock extends AppCompatTextView { private boolean mAttached; private Calendar mTime; - private final Runnable mTicker = new Runnable() { + private String mTimeZone; private final Runnable mTicker = new Runnable() { @Override public void run() { onTimeChanged(); @@ -66,7 +66,16 @@ public class TextClock extends AppCompatTextView { getHandler().postAtTime(mTicker, next); } }; - private final ContentObserver mFormatChangeObserver = new ContentObserver(new Handler()) { + private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (mTimeZone == null && Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) { + final String timeZone = intent.getStringExtra("time-zone"); + createTime(timeZone); + } + onTimeChanged(); + } + }; private final ContentObserver mFormatChangeObserver = new ContentObserver(new Handler()) { @Override public void onChange(boolean selfChange) { chooseFormat(); @@ -79,22 +88,9 @@ public class TextClock extends AppCompatTextView { onTimeChanged(); } }; - private String mTimeZone; - private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (mTimeZone == null && Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) { - final String timeZone = intent.getStringExtra("time-zone"); - createTime(timeZone); - } - onTimeChanged(); - } - }; - public TextClock(Context context) { this(context, null); } - public TextClock(Context context, AttributeSet attrs) { this(context, attrs, 0); } @@ -261,4 +257,8 @@ public class TextClock extends AppCompatTextView { mTime.setTimeInMillis(System.currentTimeMillis()); setText(DateFormat.format(mFormat, mTime)); } + + + + } \ No newline at end of file diff --git a/app/src/main/java/com/hippo/widget/lockpattern/LockPatternView.java b/app/src/main/java/com/hippo/widget/lockpattern/LockPatternView.java index 07f4cd92a..6aca9ebd4 100644 --- a/app/src/main/java/com/hippo/widget/lockpattern/LockPatternView.java +++ b/app/src/main/java/com/hippo/widget/lockpattern/LockPatternView.java @@ -58,9 +58,6 @@ public class LockPatternView extends View { private static final int ASPECT_SQUARE = 0; // View will be the minimum of width/height private static final int ASPECT_LOCK_WIDTH = 1; // Fixed width; height will be minimum of (w,h) private static final int ASPECT_LOCK_HEIGHT = 2; // Fixed height; width will be minimum of (w,h) - - private final Cell[][] mCells; - private static final boolean PROFILE_DRAWING = false; /** * How many milliseconds we spend animating each circle of a lock pattern @@ -73,6 +70,7 @@ public class LockPatternView extends View { * It didn't seem to have much impact on the devices tested, so currently set to 0. */ private static final float DRAG_THRESHOLD = 0.0f; + private final Cell[][] mCells; private final CellState[][] mCellStates; private final int mDotSize; private final int mDotSizeActivated; @@ -181,6 +179,66 @@ public class LockPatternView extends View { mLinearOutSlowInInterpolator = new LinearOutSlowInInterpolator(); } + /** + * Returns the greatest common divisor of {@code a, b}. Returns {@code 0} if + * {@code a == 0 && b == 0}. + * + * @throws IllegalArgumentException if {@code a < 0} or {@code b < 0} + */ + private static int gcd(int a, int b) { + + /* + * The reason we require both arguments to be >= 0 is because otherwise, what do you return + * on gcd(0, Integer.MIN_VALUE)? BigInteger.gcd would return positive 2^31, but positive + * 2^31 isn't an int. + */ + //checkNonNegative("a", a); + if (a < 0) { + throw new IllegalArgumentException("a (" + a + ") must be >= 0"); + } + //checkNonNegative("b", b); + if (b < 0) { + throw new IllegalArgumentException("b (" + b + ") must be >= 0"); + } + + if (a == 0) { + // 0 % b == 0, so b divides a, but the converse doesn't hold. + // BigInteger.gcd is consistent with this decision. + return b; + } else if (b == 0) { + return a; // similar logic + } + /* + * Uses the binary GCD algorithm; see http://en.wikipedia.org/wiki/Binary_GCD_algorithm. + * This is >40% faster than the Euclidean algorithm in benchmarks. + */ + int aTwos = Integer.numberOfTrailingZeros(a); + a >>= aTwos; // divide out all 2s + int bTwos = Integer.numberOfTrailingZeros(b); + b >>= bTwos; // divide out all 2s + while (a != b) { // both a, b are odd + + // The key to the binary GCD algorithm is as follows: + // Both a and b are odd. Assume a > b; then gcd(a - b, b) = gcd(a, b). + // But in gcd(a - b, b), a - b is even and b is odd, so we can divide out powers of two. + + // We bend over backwards to avoid branching, adapting a technique from + // http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax + + int delta = a - b; // can't overflow, since a and b are nonnegative + + int minDeltaOrZero = delta & (delta >> (Integer.SIZE - 1)); + // equivalent to Math.min(delta, 0) + + a = delta - minDeltaOrZero - minDeltaOrZero; // sets a to Math.abs(a - b) + // a is now nonnegative and even + + b += minDeltaOrZero; // sets b to min(old a, b) + a >>= Integer.numberOfTrailingZeros(a); // divide out all 2s, since 2 doesn't divide b + } + return a << Math.min(aTwos, bTwos); + } + public int getCellSize() { return mPattern.size(); } @@ -333,6 +391,9 @@ public class LockPatternView extends View { setMeasuredDimension(viewWidth, viewHeight); } + // From + // https://github.com/google/guava/blob/c462d69329709f72a17a64cb229d15e76e72199c/guava/src/com/google/common/math/IntMath.java + /** * Determines whether the point x, y will add a new point to the current * pattern (in addition to finding the cell, also makes heuristic choices @@ -376,69 +437,6 @@ public class LockPatternView extends View { return null; } - // From - // https://github.com/google/guava/blob/c462d69329709f72a17a64cb229d15e76e72199c/guava/src/com/google/common/math/IntMath.java - - /** - * Returns the greatest common divisor of {@code a, b}. Returns {@code 0} if - * {@code a == 0 && b == 0}. - * - * @throws IllegalArgumentException if {@code a < 0} or {@code b < 0} - */ - private static int gcd(int a, int b) { - - /* - * The reason we require both arguments to be >= 0 is because otherwise, what do you return - * on gcd(0, Integer.MIN_VALUE)? BigInteger.gcd would return positive 2^31, but positive - * 2^31 isn't an int. - */ - //checkNonNegative("a", a); - if (a < 0) { - throw new IllegalArgumentException("a (" + a + ") must be >= 0"); - } - //checkNonNegative("b", b); - if (b < 0) { - throw new IllegalArgumentException("b (" + b + ") must be >= 0"); - } - - if (a == 0) { - // 0 % b == 0, so b divides a, but the converse doesn't hold. - // BigInteger.gcd is consistent with this decision. - return b; - } else if (b == 0) { - return a; // similar logic - } - /* - * Uses the binary GCD algorithm; see http://en.wikipedia.org/wiki/Binary_GCD_algorithm. - * This is >40% faster than the Euclidean algorithm in benchmarks. - */ - int aTwos = Integer.numberOfTrailingZeros(a); - a >>= aTwos; // divide out all 2s - int bTwos = Integer.numberOfTrailingZeros(b); - b >>= bTwos; // divide out all 2s - while (a != b) { // both a, b are odd - - // The key to the binary GCD algorithm is as follows: - // Both a and b are odd. Assume a > b; then gcd(a - b, b) = gcd(a, b). - // But in gcd(a - b, b), a - b is even and b is odd, so we can divide out powers of two. - - // We bend over backwards to avoid branching, adapting a technique from - // http://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax - - int delta = a - b; // can't overflow, since a and b are nonnegative - - int minDeltaOrZero = delta & (delta >> (Integer.SIZE - 1)); - // equivalent to Math.min(delta, 0) - - a = delta - minDeltaOrZero - minDeltaOrZero; // sets a to Math.abs(a - b) - // a is now nonnegative and even - - b += minDeltaOrZero; // sets b to min(old a, b) - a >>= Integer.numberOfTrailingZeros(a); // divide out all 2s, since 2 doesn't divide b - } - return a << Math.min(aTwos, bTwos); - } - private void addCellToPattern(Cell newCell) { mPatternDrawLookup[newCell.getRow()][newCell.getColumn()] = true; mPattern.add(newCell); @@ -1040,14 +1038,14 @@ public class LockPatternView extends View { } public static class CellState { + public float lineEndX = Float.MIN_VALUE; + public float lineEndY = Float.MIN_VALUE; + public ValueAnimator lineAnimator; int row; int col; float radius; float translationY; float alpha = 1f; - public float lineEndX = Float.MIN_VALUE; - public float lineEndY = Float.MIN_VALUE; - public ValueAnimator lineAnimator; } /** diff --git a/app/src/main/res/drawable/big_download.xml b/app/src/main/res/drawable/big_download.xml index bb0c5cb54..dd0fad861 100644 --- a/app/src/main/res/drawable/big_download.xml +++ b/app/src/main/res/drawable/big_download.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> - + android:viewportHeight="24"> + diff --git a/app/src/main/res/drawable/ic_baseline_format_list_numbered_24.xml b/app/src/main/res/drawable/ic_baseline_format_list_numbered_24.xml index 363544e16..7590ccf64 100644 --- a/app/src/main/res/drawable/ic_baseline_format_list_numbered_24.xml +++ b/app/src/main/res/drawable/ic_baseline_format_list_numbered_24.xml @@ -1,9 +1,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_baseline_label_24.xml b/app/src/main/res/drawable/ic_baseline_label_24.xml index 4e39f0505..3fc9a9a1e 100644 --- a/app/src/main/res/drawable/ic_baseline_label_24.xml +++ b/app/src/main/res/drawable/ic_baseline_label_24.xml @@ -1,9 +1,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_baseline_menu_24.xml b/app/src/main/res/drawable/ic_baseline_menu_24.xml index 4350ba96a..ada350030 100644 --- a/app/src/main/res/drawable/ic_baseline_menu_24.xml +++ b/app/src/main/res/drawable/ic_baseline_menu_24.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="24"> + diff --git a/app/src/main/res/drawable/ic_baseline_reorder_24.xml b/app/src/main/res/drawable/ic_baseline_reorder_24.xml index def7bf60b..68334062c 100644 --- a/app/src/main/res/drawable/ic_baseline_reorder_24.xml +++ b/app/src/main/res/drawable/ic_baseline_reorder_24.xml @@ -1,9 +1,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_baseline_warning_24.xml b/app/src/main/res/drawable/ic_baseline_warning_24.xml index 7abb7f51b..2eccab985 100644 --- a/app/src/main/res/drawable/ic_baseline_warning_24.xml +++ b/app/src/main/res/drawable/ic_baseline_warning_24.xml @@ -1,9 +1,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index a1b273b1c..162a7b6c8 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -9,12 +9,12 @@ android:translateX="35.1" android:translateY="39.584126"> + android:fillType="evenOdd" + android:pathData="M39.893,68.066L39.893,75.977L0,75.977L0,4.59L39.893,4.59L39.893,12.5L8.984,12.5L8.984,34.766L38.086,34.766L38.086,42.578L8.984,42.578L8.984,68.066L39.893,68.066Z" /> + android:fillType="evenOdd" + android:pathData="M99.609,75.977L90.918,75.977L90.918,41.699A23.436,23.436 0,0 0,90.662 38.109Q90.055,34.207 88.013,31.958Q85.629,29.334 81.028,28.863A20.84,20.84 0,0 0,78.906 28.76A23.134,23.134 0,0 0,74.45 29.16Q71.926,29.656 69.994,30.767A11.122,11.122 0,0 0,66.968 33.301A13.32,13.32 0,0 0,64.756 37.276Q63.399,40.971 63.213,46.495A53.517,53.517 0,0 0,63.184 48.291L63.184,75.977L54.395,75.977L54.395,0L63.184,0L63.184,22.266A66.935,66.935 0,0 1,63.115 25.383Q63.043,26.914 62.897,28.251A33.547,33.547 0,0 1,62.695 29.785L63.281,29.785A16.11,16.11 0,0 1,69.394 24.035A19.448,19.448 0,0 1,70.068 23.682A20.88,20.88 0,0 1,77.292 21.622A25.763,25.763 0,0 1,79.98 21.484A32.643,32.643 0,0 1,85.483 21.917Q91.249,22.905 94.678,26.147Q98.472,29.735 99.347,36.631A35.274,35.274 0,0 1,99.609 41.064L99.609,75.977Z" /> diff --git a/app/src/main/res/drawable/image_failed.xml b/app/src/main/res/drawable/image_failed.xml index d780b5478..ff2d4e900 100644 --- a/app/src/main/res/drawable/image_failed.xml +++ b/app/src/main/res/drawable/image_failed.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_adb_primary_x24.xml b/app/src/main/res/drawable/v_adb_primary_x24.xml index e27646efb..9a365b442 100644 --- a/app/src/main/res/drawable/v_adb_primary_x24.xml +++ b/app/src/main/res/drawable/v_adb_primary_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24.0"> + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_chart_accent_x48.xml b/app/src/main/res/drawable/v_chart_accent_x48.xml index 564e23a6e..84cf1c242 100644 --- a/app/src/main/res/drawable/v_chart_accent_x48.xml +++ b/app/src/main/res/drawable/v_chart_accent_x48.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_check_dark_x24.xml b/app/src/main/res/drawable/v_check_dark_x24.xml index b1639b6d2..f136a6969 100644 --- a/app/src/main/res/drawable/v_check_dark_x24.xml +++ b/app/src/main/res/drawable/v_check_dark_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_clear_all_dark_x24.xml b/app/src/main/res/drawable/v_clear_all_dark_x24.xml index 981792991..59b8155be 100644 --- a/app/src/main/res/drawable/v_clear_all_dark_x24.xml +++ b/app/src/main/res/drawable/v_clear_all_dark_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_close_dark_x24.xml b/app/src/main/res/drawable/v_close_dark_x24.xml index b3e6c976b..325305c5e 100644 --- a/app/src/main/res/drawable/v_close_dark_x24.xml +++ b/app/src/main/res/drawable/v_close_dark_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_cookie_brown_x48.xml b/app/src/main/res/drawable/v_cookie_brown_x48.xml index 9ef7d6f38..3089d4f70 100644 --- a/app/src/main/res/drawable/v_cookie_brown_x48.xml +++ b/app/src/main/res/drawable/v_cookie_brown_x48.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_delete_x24.xml b/app/src/main/res/drawable/v_delete_x24.xml index a6a58b6ce..1de3b4576 100644 --- a/app/src/main/res/drawable/v_delete_x24.xml +++ b/app/src/main/res/drawable/v_delete_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_dots_vertical_secondary_dark_x24.xml b/app/src/main/res/drawable/v_dots_vertical_secondary_dark_x24.xml index 3eeb971a3..d651502ea 100644 --- a/app/src/main/res/drawable/v_dots_vertical_secondary_dark_x24.xml +++ b/app/src/main/res/drawable/v_dots_vertical_secondary_dark_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_download_box_dark_x24.xml b/app/src/main/res/drawable/v_download_box_dark_x24.xml index b3e0e2f22..f708b1f3b 100644 --- a/app/src/main/res/drawable/v_download_box_dark_x24.xml +++ b/app/src/main/res/drawable/v_download_box_dark_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_download_primary_x24.xml b/app/src/main/res/drawable/v_download_primary_x24.xml index 89b16a645..088ca995c 100644 --- a/app/src/main/res/drawable/v_download_primary_x24.xml +++ b/app/src/main/res/drawable/v_download_primary_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_eh_subscription_black_x24.xml b/app/src/main/res/drawable/v_eh_subscription_black_x24.xml index 04312475b..d98362f16 100644 --- a/app/src/main/res/drawable/v_eh_subscription_black_x24.xml +++ b/app/src/main/res/drawable/v_eh_subscription_black_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_file_find_primary_x48.xml b/app/src/main/res/drawable/v_file_find_primary_x48.xml index a421f871c..1b8cbad4c 100644 --- a/app/src/main/res/drawable/v_file_find_primary_x48.xml +++ b/app/src/main/res/drawable/v_file_find_primary_x48.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_go_to_dark_x24.xml b/app/src/main/res/drawable/v_go_to_dark_x24.xml index 594d9a548..e45b38e79 100644 --- a/app/src/main/res/drawable/v_go_to_dark_x24.xml +++ b/app/src/main/res/drawable/v_go_to_dark_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_heart_outline_primary_x48.xml b/app/src/main/res/drawable/v_heart_outline_primary_x48.xml index 43bb8848b..bb693162b 100644 --- a/app/src/main/res/drawable/v_heart_outline_primary_x48.xml +++ b/app/src/main/res/drawable/v_heart_outline_primary_x48.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_help_circle_x24.xml b/app/src/main/res/drawable/v_help_circle_x24.xml index bf44deccd..f2d65827d 100644 --- a/app/src/main/res/drawable/v_help_circle_x24.xml +++ b/app/src/main/res/drawable/v_help_circle_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_history_black_x24.xml b/app/src/main/res/drawable/v_history_black_x24.xml index 83c1014d0..fef4f9232 100644 --- a/app/src/main/res/drawable/v_history_black_x24.xml +++ b/app/src/main/res/drawable/v_history_black_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_pause_x24.xml b/app/src/main/res/drawable/v_pause_x24.xml index 452036a08..0624c1d42 100644 --- a/app/src/main/res/drawable/v_pause_x24.xml +++ b/app/src/main/res/drawable/v_pause_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_pencil_dark_x24.xml b/app/src/main/res/drawable/v_pencil_dark_x24.xml index 6fd4aaedd..51148e783 100644 --- a/app/src/main/res/drawable/v_pencil_dark_x24.xml +++ b/app/src/main/res/drawable/v_pencil_dark_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> + android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/v_plus_dark_x24.xml b/app/src/main/res/drawable/v_plus_dark_x24.xml index df4dab603..71cdc235d 100644 --- a/app/src/main/res/drawable/v_plus_dark_x24.xml +++ b/app/src/main/res/drawable/v_plus_dark_x24.xml @@ -17,9 +17,9 @@ + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24.0"> + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="32"> + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> + android:viewportHeight="24"> @@ -51,8 +51,8 @@ style="?attr/buttonBarStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:clipToPadding="false" android:layout_gravity="bottom" + android:clipToPadding="false" android:orientation="vertical" android:paddingLeft="12dp" android:paddingTop="4dp" diff --git a/app/src/main/res/layout/activity_filter.xml b/app/src/main/res/layout/activity_filter.xml index 3e50175c4..75c22b801 100644 --- a/app/src/main/res/layout/activity_filter.xml +++ b/app/src/main/res/layout/activity_filter.xml @@ -15,9 +15,9 @@ --> + android:layout_height="match_parent"> + app:layout_fitsSystemWindowsInsets="bottom" + app:srcCompat="@drawable/v_plus_dark_x24" /> diff --git a/app/src/main/res/layout/activity_hosts.xml b/app/src/main/res/layout/activity_hosts.xml index 2160c4633..a4b7f4dc9 100644 --- a/app/src/main/res/layout/activity_hosts.xml +++ b/app/src/main/res/layout/activity_hosts.xml @@ -15,9 +15,9 @@ --> + app:layout_fitsSystemWindowsInsets="bottom" + app:srcCompat="@drawable/v_plus_dark_x24" /> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ecc3b98e7..6a5b1503f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -54,11 +54,11 @@ android:layout_gravity="start" android:background="?android:attr/colorBackground" app:headerLayout="@layout/nav_header_main" + app:insetForeground="@null" + app:itemShapeAppearanceOverlay="@style/ShapeAppearanceOverlay.MaterialComponents.NavigationView" + app:itemShapeInsetBottom="0dp" app:itemShapeInsetStart="0dp" app:itemShapeInsetTop="0dp" - app:itemShapeInsetBottom="0dp" - app:itemShapeAppearanceOverlay="@style/ShapeAppearanceOverlay.MaterialComponents.NavigationView" - app:insetForeground="@null" app:menu="@menu/nav_drawer_main" /> + app:fitsSystemWindowsInsets="start|end"> + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" /> diff --git a/app/src/main/res/layout/activity_webview.xml b/app/src/main/res/layout/activity_webview.xml index 1ed354964..eeeb2a381 100644 --- a/app/src/main/res/layout/activity_webview.xml +++ b/app/src/main/res/layout/activity_webview.xml @@ -15,9 +15,9 @@ --> diff --git a/app/src/main/res/layout/design_navigation_item.xml b/app/src/main/res/layout/design_navigation_item.xml index b844ca9fe..f3de8e3b3 100644 --- a/app/src/main/res/layout/design_navigation_item.xml +++ b/app/src/main/res/layout/design_navigation_item.xml @@ -17,8 +17,8 @@ \ No newline at end of file + android:paddingRight="?attr/listPreferredItemPaddingRight" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_add_filter.xml b/app/src/main/res/layout/dialog_add_filter.xml index 792400a09..a4a44a6b6 100644 --- a/app/src/main/res/layout/dialog_add_filter.xml +++ b/app/src/main/res/layout/dialog_add_filter.xml @@ -18,8 +18,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:paddingTop="@dimen/abc_dialog_padding_top_material" - android:paddingHorizontal="?attr/dialogPreferredPadding"> + android:paddingHorizontal="?attr/dialogPreferredPadding" + android:paddingTop="@dimen/abc_dialog_padding_top_material"> + android:orientation="vertical" + android:paddingHorizontal="?attr/dialogPreferredPadding"> + android:background="@null" + android:clickable="false" + android:focusable="false" /> diff --git a/app/src/main/res/layout/dialog_gallery_menu.xml b/app/src/main/res/layout/dialog_gallery_menu.xml index 62be4ecff..49b5d641e 100644 --- a/app/src/main/res/layout/dialog_gallery_menu.xml +++ b/app/src/main/res/layout/dialog_gallery_menu.xml @@ -21,10 +21,10 @@ + android:paddingHorizontal="?attr/dialogPreferredPadding" + android:paddingTop="@dimen/abc_dialog_padding_top_material"> + app:srcCompat="@drawable/v_dots_vertical_secondary_dark_x24" + app:tint="@color/primary_drawable_black" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_filter.xml b/app/src/main/res/layout/item_filter.xml index 9d7258eca..8911c32e7 100644 --- a/app/src/main/res/layout/item_filter.xml +++ b/app/src/main/res/layout/item_filter.xml @@ -28,9 +28,9 @@ android:layout_height="wrap_content" android:background="@android:color/transparent" android:clickable="false" - android:maxLines="1" android:ellipsize="end" android:focusable="false" + android:maxLines="1" android:paddingStart="0dp" android:paddingEnd="24dp" /> @@ -38,11 +38,11 @@ android:id="@+id/delete" android:layout_width="32dp" android:layout_height="32dp" - android:padding="4dp" android:layout_gravity="end|center_vertical" android:background="?selectableItemBackgroundBorderless" android:clickable="true" android:contentDescription="@string/delete" android:focusable="true" + android:padding="4dp" app:srcCompat="@drawable/v_delete_x24" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_gallery_grid.xml b/app/src/main/res/layout/item_gallery_grid.xml index 18aa3940a..0f13f01a2 100644 --- a/app/src/main/res/layout/item_gallery_grid.xml +++ b/app/src/main/res/layout/item_gallery_grid.xml @@ -15,9 +15,9 @@ --> + android:paddingBottom="8dp"> + app:srcCompat="@drawable/ic_baseline_dark_mode_24" + app:tint="#fff" /> diff --git a/app/src/main/res/layout/scene_download.xml b/app/src/main/res/layout/scene_download.xml index 4d2da5a46..03417488f 100644 --- a/app/src/main/res/layout/scene_download.xml +++ b/app/src/main/res/layout/scene_download.xml @@ -15,9 +15,9 @@ --> + android:layout_height="match_parent"> diff --git a/app/src/main/res/layout/scene_history.xml b/app/src/main/res/layout/scene_history.xml index 3d3644aa9..09df602ed 100644 --- a/app/src/main/res/layout/scene_history.xml +++ b/app/src/main/res/layout/scene_history.xml @@ -15,9 +15,9 @@ --> + android:layout_height="match_parent"> + android:singleLine="true" /> @@ -75,11 +75,11 @@ android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" + android:autofillHints="password" android:imeOptions="actionDone" android:inputType="textPassword" android:maxLines="1" - android:singleLine="true" - android:autofillHints="password" /> + android:singleLine="true" /> @@ -93,13 +93,13 @@ style="?attr/buttonBarStyle" android:layout_width="match_parent" android:layout_height="wrap_content" + android:clipToPadding="false" android:gravity="bottom" android:orientation="vertical" android:paddingLeft="12dp" android:paddingTop="4dp" android:paddingRight="12dp" - android:paddingBottom="4dp" - android:clipToPadding="false"> + android:paddingBottom="4dp">