From 2da8cfde01a6646a8fb30637ec3b050cf9c610d4 Mon Sep 17 00:00:00 2001 From: tarsin Date: Tue, 27 Jun 2023 11:54:09 +0800 Subject: [PATCH] Unify MainActivity nav behaviour --- .../ehviewer/ui/GalleryInfoBottomSheet.kt | 1 + .../com/hippo/ehviewer/ui/MainActivity.kt | 12 ++-- .../java/com/hippo/ehviewer/ui/UrlOpener.kt | 42 ------------- .../com/hippo/ehviewer/ui/scene/BaseScene.kt | 13 ---- .../hippo/ehviewer/ui/scene/DownloadsScene.kt | 2 +- .../hippo/ehviewer/ui/scene/FavoritesScene.kt | 2 +- .../ehviewer/ui/scene/GalleryCommentsScene.kt | 3 +- .../ehviewer/ui/scene/GalleryDetailScene.kt | 20 +++--- .../ehviewer/ui/scene/GalleryListScene.kt | 6 +- .../hippo/ehviewer/ui/scene/HistoryScene.kt | 2 +- .../com/hippo/ehviewer/ui/scene/MainNav.kt | 63 +++++++++++++++++++ .../hippo/ehviewer/ui/scene/ProgressScene.kt | 2 +- 12 files changed, 89 insertions(+), 79 deletions(-) create mode 100644 app/src/main/java/com/hippo/ehviewer/ui/scene/MainNav.kt diff --git a/app/src/main/java/com/hippo/ehviewer/ui/GalleryInfoBottomSheet.kt b/app/src/main/java/com/hippo/ehviewer/ui/GalleryInfoBottomSheet.kt index 16e8f6897..9668a5404 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/GalleryInfoBottomSheet.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/GalleryInfoBottomSheet.kt @@ -43,6 +43,7 @@ import com.hippo.ehviewer.client.EhUrl import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.data.GalleryDetail import com.hippo.ehviewer.client.thumbUrl +import com.hippo.ehviewer.ui.scene.navWithUrl import com.hippo.ehviewer.util.tellClipboardWithToast private const val INDEX_URL = 2 diff --git a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.kt b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.kt index 242d7fc67..ddea3614b 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.kt @@ -65,6 +65,8 @@ import com.hippo.ehviewer.ui.scene.GalleryDetailScene import com.hippo.ehviewer.ui.scene.GalleryListScene import com.hippo.ehviewer.ui.scene.GalleryListScene.Companion.toStartArgs import com.hippo.ehviewer.ui.scene.ProgressScene +import com.hippo.ehviewer.ui.scene.navAnimated +import com.hippo.ehviewer.ui.scene.navWithUrl import com.hippo.ehviewer.util.addTextToClipboard import com.hippo.ehviewer.util.getParcelableExtraCompat import com.hippo.ehviewer.util.getUrlFromClipboard @@ -130,7 +132,7 @@ class MainActivity : EhActivity() { if ("text/plain" == type) { val builder = ListUrlBuilder() builder.keyword = intent.getStringExtra(Intent.EXTRA_TEXT) - navController.navigate( + navController.navAnimated( R.id.galleryListScene, builder.toStartArgs(), ) @@ -144,7 +146,7 @@ class MainActivity : EhActivity() { builder.mode = ListUrlBuilder.MODE_IMAGE_SEARCH builder.imagePath = temp.path builder.isUseSimilarityScan = true - navController.navigate( + navController.navAnimated( R.id.galleryListScene, builder.toStartArgs(), ) @@ -154,7 +156,7 @@ class MainActivity : EhActivity() { } } else if (action == DownloadService.ACTION_START_DOWNLOADSCENE) { val args = intent.getBundleExtra(DownloadService.ACTION_START_DOWNLOADSCENE_ARGS) - navController.navigate(R.id.nav_downloads, args) + navController.navAnimated(R.id.nav_downloads, args) } return false @@ -344,7 +346,7 @@ class MainActivity : EhActivity() { args.putString(GalleryDetailScene.KEY_ACTION, GalleryDetailScene.ACTION_GID_TOKEN) args.putLong(GalleryDetailScene.KEY_GID, result1.gid) args.putString(GalleryDetailScene.KEY_TOKEN, result1.token) - launch = { navController.navigate(R.id.galleryDetailScene, args) } + launch = { navController.navAnimated(R.id.galleryDetailScene, args) } } val result2 = GalleryPageUrlParser.parse(text, false) if (result2 != null) { @@ -353,7 +355,7 @@ class MainActivity : EhActivity() { args.putLong(ProgressScene.KEY_GID, result2.gid) args.putString(ProgressScene.KEY_PTOKEN, result2.pToken) args.putInt(ProgressScene.KEY_PAGE, result2.page) - launch = { navController.navigate(R.id.progressScene, args) } + launch = { navController.navAnimated(R.id.progressScene, args) } } launch?.let { withUIContext { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/UrlOpener.kt b/app/src/main/java/com/hippo/ehviewer/ui/UrlOpener.kt index f14364cb6..66f9c5661 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/UrlOpener.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/UrlOpener.kt @@ -18,19 +18,12 @@ package com.hippo.ehviewer.ui import android.content.ActivityNotFoundException import android.content.Context import android.net.Uri -import android.os.Bundle import android.widget.Toast import androidx.annotation.MainThread import androidx.browser.customtabs.CustomTabsIntent -import androidx.navigation.NavController import com.hippo.ehviewer.R import com.hippo.ehviewer.client.data.GalleryDetail -import com.hippo.ehviewer.client.parser.GalleryDetailUrlParser -import com.hippo.ehviewer.client.parser.GalleryListUrlParser import com.hippo.ehviewer.client.parser.GalleryPageUrlParser -import com.hippo.ehviewer.ui.scene.GalleryDetailScene -import com.hippo.ehviewer.ui.scene.GalleryListScene -import com.hippo.ehviewer.ui.scene.ProgressScene private val intent = CustomTabsIntent.Builder().apply { setShowTitle(true) }.build() @@ -59,38 +52,3 @@ fun Context.jumpToReaderByPage(url: String, detail: GalleryDetail): Boolean { } return false } - -@MainThread -fun NavController.navWithUrl(url: String): Boolean { - if (url.isEmpty()) return false - GalleryListUrlParser.parse(url)?.let { lub -> - Bundle().apply { - putString(GalleryListScene.KEY_ACTION, GalleryListScene.ACTION_LIST_URL_BUILDER) - putParcelable(GalleryListScene.KEY_LIST_URL_BUILDER, lub) - navigate(R.id.galleryListScene, this) - } - return true - } - - GalleryDetailUrlParser.parse(url)?.apply { - Bundle().apply { - putString(GalleryDetailScene.KEY_ACTION, GalleryDetailScene.ACTION_GID_TOKEN) - putLong(GalleryDetailScene.KEY_GID, gid) - putString(GalleryDetailScene.KEY_TOKEN, token) - navigate(R.id.galleryDetailScene, this) - } - return true - } - - GalleryPageUrlParser.parse(url)?.apply { - Bundle().apply { - putString(ProgressScene.KEY_ACTION, ProgressScene.ACTION_GALLERY_TOKEN) - putLong(ProgressScene.KEY_GID, gid) - putString(ProgressScene.KEY_PTOKEN, pToken) - putInt(ProgressScene.KEY_PAGE, page) - navigate(R.id.progressScene, this) - } - return true - } - return false -} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.kt index 09046f7d2..559a2b8fd 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.kt @@ -29,8 +29,6 @@ import androidx.core.view.GravityCompat import androidx.core.view.SoftwareKeyboardControllerCompat import androidx.drawerlayout.widget.DrawerLayout import androidx.fragment.app.Fragment -import androidx.navigation.NavOptions -import androidx.navigation.fragment.NavHostFragment import com.hippo.ehviewer.ui.MainActivity import rikka.core.res.resolveDrawable @@ -202,17 +200,6 @@ abstract class BaseScene : Fragment() { val theme: Theme get() = requireActivity().theme - @SuppressLint("PrivateResource") - fun navigate(id: Int, args: Bundle?, singleTop: Boolean = false) { - val options: NavOptions = NavOptions.Builder().setLaunchSingleTop(singleTop) - .setEnterAnim(androidx.fragment.R.animator.fragment_open_enter) - .setExitAnim(androidx.fragment.R.animator.fragment_open_exit) - .setPopEnterAnim(androidx.fragment.R.animator.fragment_close_enter) - .setPopExitAnim(androidx.fragment.R.animator.fragment_close_exit) - .build() - NavHostFragment.findNavController(this).navigate(id, args, options) - } - companion object { const val LENGTH_SHORT = 0 const val LENGTH_LONG = 1 diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt index eb25fd3cd..dd733b6f1 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/DownloadsScene.kt @@ -834,7 +834,7 @@ class DownloadsScene : GalleryDetailScene.ACTION_GALLERY_INFO, ) args.putParcelable(GalleryDetailScene.KEY_GALLERY_INFO, list[index]) - navigate(R.id.galleryDetailScene, args) + navAnimated(R.id.galleryDetailScene, args) } else if (binding.start === v) { val intent = Intent(activity, DownloadService::class.java) intent.action = DownloadService.ACTION_START diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.kt index 3d50772e3..42aa9b0fc 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.kt @@ -399,7 +399,7 @@ class FavoritesScene : GalleryDetailScene.ACTION_GALLERY_INFO, ) args.putParcelable(GalleryDetailScene.KEY_GALLERY_INFO, gi) - navigate(R.id.galleryDetailScene, args) + navAnimated(R.id.galleryDetailScene, args) } } return true diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.kt index 1df632459..a3e83e3ba 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.kt @@ -78,7 +78,6 @@ import com.hippo.ehviewer.ui.legacy.ObservedTextView import com.hippo.ehviewer.ui.legacy.URLImageGetter import com.hippo.ehviewer.ui.legacy.ViewTransition import com.hippo.ehviewer.ui.legacy.WindowInsetsAnimationHelper -import com.hippo.ehviewer.ui.navWithUrl import com.hippo.ehviewer.ui.openBrowser import com.hippo.ehviewer.ui.scene.GalleryListScene.Companion.toStartArgs import com.hippo.ehviewer.util.ExceptionUtils @@ -815,7 +814,7 @@ class GalleryCommentsScene : BaseToolbarScene(), View.OnClickListener, OnRefresh mode = ListUrlBuilder.MODE_UPLOADER keyword = it } - navigate(R.id.galleryListScene, lub.toStartArgs(), true) + navAnimated(R.id.galleryListScene, lub.toStartArgs(), true) } } time.text = ReadableTime.getTimeAgo(value.time) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt index ba45cc512..27c4e5506 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt @@ -776,7 +776,7 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { } val lub = ListUrlBuilder() lub.category = category - navigate(R.id.galleryListScene, lub.toStartArgs(), true) + navAnimated(R.id.galleryListScene, lub.toStartArgs(), true) } private fun onUploaderChipClick() { @@ -786,7 +786,7 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { val lub = ListUrlBuilder() lub.mode = ListUrlBuilder.MODE_UPLOADER lub.keyword = uploader - navigate(R.id.galleryListScene, lub.toStartArgs(), true) + navAnimated(R.id.galleryListScene, lub.toStartArgs(), true) } private fun onDownloadButtonClick() { @@ -945,7 +945,7 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { args.putString(KEY_ACTION, ACTION_GID_TOKEN) args.putLong(KEY_GID, newerVersion.gid) args.putString(KEY_TOKEN, newerVersion.token) - navigate(R.id.galleryDetailScene, args) + navAnimated(R.id.galleryDetailScene, args) } .show() } @@ -1041,7 +1041,7 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { val lub = ListUrlBuilder() lub.mode = ListUrlBuilder.MODE_TAG lub.keyword = tag - navigate(R.id.galleryListScene, lub.toStartArgs(), true) + navAnimated(R.id.galleryListScene, lub.toStartArgs(), true) } val hapticFeedback = LocalHapticFeedback.current @@ -1083,7 +1083,7 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { GalleryCommentsScene.KEY_GALLERY_DETAIL, galleryDetail, ) - navigate(R.id.galleryCommentsScene, args) + navAnimated(R.id.galleryCommentsScene, args) } @SuppressLint("InflateParams") @@ -1146,7 +1146,7 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { val lub = ListUrlBuilder() lub.mode = ListUrlBuilder.MODE_NORMAL lub.keyword = "\"" + keyword + "\"" - navigate(R.id.galleryListScene, lub.toStartArgs(), true) + navAnimated(R.id.galleryListScene, lub.toStartArgs(), true) return } val artist = getArtist(gd.tags) @@ -1154,14 +1154,14 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { val lub = ListUrlBuilder() lub.mode = ListUrlBuilder.MODE_TAG lub.keyword = "artist:$artist" - navigate(R.id.galleryListScene, lub.toStartArgs(), true) + navAnimated(R.id.galleryListScene, lub.toStartArgs(), true) return } if (null != gd.uploader) { val lub = ListUrlBuilder() lub.mode = ListUrlBuilder.MODE_UPLOADER lub.keyword = gd.uploader - navigate(R.id.galleryListScene, lub.toStartArgs(), true) + navAnimated(R.id.galleryListScene, lub.toStartArgs(), true) } } @@ -1176,7 +1176,7 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { val lub = ListUrlBuilder() lub.mode = ListUrlBuilder.MODE_NORMAL lub.hash = key.substringAfterLast('/').substringBefore('-') - navigate(R.id.galleryListScene, lub.toStartArgs(), true) + navAnimated(R.id.galleryListScene, lub.toStartArgs(), true) } catch (e: Throwable) { e.printStackTrace() } @@ -1187,7 +1187,7 @@ class GalleryDetailScene : BaseScene(), DownloadInfoListener { val args = Bundle() args.putParcelable(KEY_GALLERY_DETAIL, it) args.putBoolean(KEY_NEXT_PAGE, nextPage) - navigate(R.id.galleryPreviewsScene, args) + navAnimated(R.id.galleryPreviewsScene, args) } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt index a5a273232..fe98d4ab1 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt @@ -585,7 +585,7 @@ class GalleryListScene : SearchBarScene(), OnDragHandlerListener, SearchLayout.H val args = Bundle() args.putString(GalleryDetailScene.KEY_ACTION, GalleryDetailScene.ACTION_GALLERY_INFO) args.putParcelable(GalleryDetailScene.KEY_GALLERY_INFO, gi) - navigate(R.id.galleryDetailScene, args) + navAnimated(R.id.galleryDetailScene, args) } override fun onClickPrimaryFab(view: FabLayout, fab: FloatingActionButton) { @@ -982,7 +982,7 @@ class GalleryListScene : SearchBarScene(), OnDragHandlerListener, SearchLayout.H val args = ListUrlBuilder().apply { set(q) }.toStartArgs().apply { putString(KEY_GOTO, goto) } - navigate(R.id.galleryListScene, args, true) + navAnimated(R.id.galleryListScene, args, true) setState(STATE_NORMAL) closeDrawer(GravityCompat.END) } @@ -1050,7 +1050,7 @@ class GalleryListScene : SearchBarScene(), OnDragHandlerListener, SearchLayout.H } override fun onClick() { - navigate(getDestination(), getArgs()) + navAnimated(getDestination(), getArgs()) if (mState == STATE_SIMPLE_SEARCH) { setState(STATE_NORMAL) } else if (mState == STATE_SEARCH_SHOW_LIST) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.kt index f461a7688..e32c4e954 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/HistoryScene.kt @@ -202,7 +202,7 @@ class HistoryScene : BaseScene() { val args = Bundle() args.putString(GalleryDetailScene.KEY_ACTION, GalleryDetailScene.ACTION_GALLERY_INFO) args.putParcelable(GalleryDetailScene.KEY_GALLERY_INFO, gi) - navigate(R.id.galleryDetailScene, args) + navAnimated(R.id.galleryDetailScene, args) } private val cardHeight = (3 * listThumbSize * 3).pxToDp.dp diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/MainNav.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/MainNav.kt new file mode 100644 index 000000000..d248c7104 --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/MainNav.kt @@ -0,0 +1,63 @@ +package com.hippo.ehviewer.ui.scene + +import android.annotation.SuppressLint +import android.os.Bundle +import androidx.annotation.MainThread +import androidx.fragment.app.Fragment +import androidx.navigation.NavController +import androidx.navigation.NavOptions +import androidx.navigation.fragment.findNavController +import com.hippo.ehviewer.R +import com.hippo.ehviewer.client.parser.GalleryDetailUrlParser +import com.hippo.ehviewer.client.parser.GalleryListUrlParser +import com.hippo.ehviewer.client.parser.GalleryPageUrlParser + +@MainThread +@SuppressLint("PrivateResource") +fun NavController.navAnimated(id: Int, args: Bundle?, singleTop: Boolean = false) { + val options: NavOptions = NavOptions.Builder().setLaunchSingleTop(singleTop) + .setEnterAnim(androidx.fragment.R.animator.fragment_open_enter) + .setExitAnim(androidx.fragment.R.animator.fragment_open_exit) + .setPopEnterAnim(androidx.fragment.R.animator.fragment_close_enter) + .setPopExitAnim(androidx.fragment.R.animator.fragment_close_exit) + .build() + navigate(id, args, options) +} + +@MainThread +fun NavController.navWithUrl(url: String): Boolean { + if (url.isEmpty()) return false + GalleryListUrlParser.parse(url)?.let { lub -> + Bundle().apply { + putString(GalleryListScene.KEY_ACTION, GalleryListScene.ACTION_LIST_URL_BUILDER) + putParcelable(GalleryListScene.KEY_LIST_URL_BUILDER, lub) + navAnimated(R.id.galleryListScene, this) + } + return true + } + + GalleryDetailUrlParser.parse(url)?.apply { + Bundle().apply { + putString(GalleryDetailScene.KEY_ACTION, GalleryDetailScene.ACTION_GID_TOKEN) + putLong(GalleryDetailScene.KEY_GID, gid) + putString(GalleryDetailScene.KEY_TOKEN, token) + navAnimated(R.id.galleryDetailScene, this) + } + return true + } + + GalleryPageUrlParser.parse(url)?.apply { + Bundle().apply { + putString(ProgressScene.KEY_ACTION, ProgressScene.ACTION_GALLERY_TOKEN) + putLong(ProgressScene.KEY_GID, gid) + putString(ProgressScene.KEY_PTOKEN, pToken) + putInt(ProgressScene.KEY_PAGE, page) + navAnimated(R.id.progressScene, this) + } + return true + } + return false +} + +@MainThread +fun Fragment.navAnimated(id: Int, args: Bundle?, singleTop: Boolean = false) = findNavController().navAnimated(id, args, singleTop) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/ProgressScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/ProgressScene.kt index 4ec2b36ad..550409f01 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/ProgressScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/ProgressScene.kt @@ -61,7 +61,7 @@ class ProgressScene : BaseScene() { arg.putInt(GalleryDetailScene.KEY_PAGE, page) withUIContext { findNavController().popBackStack() - navigate(R.id.galleryDetailScene, arg) + navAnimated(R.id.galleryDetailScene, arg) } }.onFailure { error = ExceptionUtils.getReadableString(it)