From 59e46aeeea51e9ae87937a8371a64c3561b0be2c Mon Sep 17 00:00:00 2001 From: Lokesh Gidra Date: Fri, 17 Nov 2023 23:05:31 +0800 Subject: [PATCH] Navigate with GalleryDetailScreenArgs directly --- .../com/hippo/ehviewer/ui/MainActivity.kt | 13 ++-- .../hippo/ehviewer/ui/scene/DownloadsScene.kt | 10 ++- .../hippo/ehviewer/ui/scene/FavoritesScene.kt | 5 +- .../ehviewer/ui/scene/GalleryDetailScene.kt | 63 ++++++------------- .../ehviewer/ui/scene/GalleryListScene.kt | 11 +--- .../ehviewer/ui/scene/HistoryFragment.kt | 5 +- .../com/hippo/ehviewer/ui/scene/MainNav.kt | 6 +- .../ehviewer/ui/scene/ProgressFragment.kt | 7 +-- 8 files changed, 38 insertions(+), 82 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt index a0715aba0..e2bbab1ec 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/MainActivity.kt @@ -69,6 +69,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidViewBinding +import androidx.core.os.bundleOf import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat @@ -95,6 +96,7 @@ import com.hippo.ehviewer.ui.scene.BaseScene import com.hippo.ehviewer.ui.scene.GalleryDetailScene import com.hippo.ehviewer.ui.scene.GalleryListScene.Companion.toStartArgs import com.hippo.ehviewer.ui.scene.ProgressFragment +import com.hippo.ehviewer.ui.scene.TokenArgs import com.hippo.ehviewer.ui.scene.navAnimated import com.hippo.ehviewer.ui.scene.navWithUrl import com.hippo.ehviewer.ui.settings.showNewVersion @@ -447,11 +449,12 @@ class MainActivity : EhActivity() { val result1 = GalleryDetailUrlParser.parse(text, false) var launch: (() -> Unit)? = null if (result1 != null) { - val args = Bundle() - 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.navAnimated(R.id.galleryDetailScene, args) } + launch = { + navController.navAnimated( + R.id.galleryDetailScene, + bundleOf(GalleryDetailScene.KEY_ARGS to TokenArgs(result1.gid, result1.token)), + ) + } } val result2 = GalleryPageUrlParser.parse(text, false) if (result2 != null) { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/DownloadsScene.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/DownloadsScene.kt index a6a78f8a2..78bf9e03e 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/DownloadsScene.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/DownloadsScene.kt @@ -62,6 +62,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.util.fastForEachReversed import androidx.core.content.ContextCompat +import androidx.core.os.bundleOf import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ItemTouchHelper @@ -773,13 +774,10 @@ class DownloadsScene : } when (v) { binding.thumb -> { - val args = Bundle() - args.putString( - GalleryDetailScene.KEY_ACTION, - GalleryDetailScene.ACTION_GALLERY_INFO, + navAnimated( + R.id.galleryDetailScene, + bundleOf(GalleryDetailScene.KEY_ARGS to GalleryInfoArgs(list[index].galleryInfo)), ) - args.putParcelable(GalleryDetailScene.KEY_GALLERY_INFO, list[index].galleryInfo) - navAnimated(R.id.galleryDetailScene, args) } binding.start -> { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesScene.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesScene.kt index 974b2fe9f..b68b44525 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesScene.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesScene.kt @@ -317,10 +317,7 @@ class FavoritesScene : SearchBarScene() { { info -> navAnimated( R.id.galleryDetailScene, - bundleOf( - GalleryDetailScene.KEY_ACTION to GalleryDetailScene.ACTION_GALLERY_INFO, - GalleryDetailScene.KEY_GALLERY_INFO to info, - ), + bundleOf(GalleryDetailScene.KEY_ARGS to GalleryInfoArgs(info)), ) }, {}, diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt index 715c19c6c..0a8bdcb4b 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt @@ -187,19 +187,19 @@ import okhttp3.HttpUrl.Companion.toHttpUrl import splitties.systemservices.downloadManager import splitties.systemservices.layoutInflater -sealed interface GalleryDetailScreenArgs : Parcelable { - @Parcelize - data class GalleryDetailScreenArgsGalleryInfo( - val galleryInfo: BaseGalleryInfo, - ) : GalleryDetailScreenArgs +sealed interface GalleryDetailScreenArgs : Parcelable - @Parcelize - data class GalleryDetailScreenArgsToken( - val gid: Long, - val token: String, - val page: Int, - ) : GalleryDetailScreenArgs -} +@Parcelize +data class GalleryInfoArgs( + val galleryInfo: BaseGalleryInfo, +) : GalleryDetailScreenArgs + +@Parcelize +data class TokenArgs( + val gid: Long, + val token: String, + val page: Int = 0, +) : GalleryDetailScreenArgs @StringRes private fun getRatingText(rating: Float): Int { @@ -232,20 +232,20 @@ private fun List.getArtist(): String? { @Composable fun GalleryDetailScreen(args: GalleryDetailScreenArgs, navigator: NavController) { var galleryInfo by rememberSaveable { - val casted = args as? GalleryDetailScreenArgs.GalleryDetailScreenArgsGalleryInfo + val casted = args as? GalleryInfoArgs mutableStateOf(casted?.galleryInfo) } val (gid, token) = remember { when (args) { - is GalleryDetailScreenArgs.GalleryDetailScreenArgsGalleryInfo -> args.galleryInfo.run { gid to token } - is GalleryDetailScreenArgs.GalleryDetailScreenArgsToken -> args.gid to args.token + is GalleryInfoArgs -> args.galleryInfo.run { gid to token } + is TokenArgs -> args.gid to args.token } } val galleryDetailUrl = remember { EhUrl.getGalleryDetailUrl(gid, token, 0, false) } val context = LocalContext.current val activity = remember(context) { context.findActivity() } LaunchedEffect(args, galleryInfo) { - val page = (args as? GalleryDetailScreenArgs.GalleryDetailScreenArgsToken)?.page ?: 0 + val page = (args as? TokenArgs)?.page ?: 0 val gi = galleryInfo if (page != 0 && gi != null) { Snackbar.make( @@ -451,7 +451,7 @@ fun GalleryDetailScreen(args: GalleryDetailScreenArgs, navigator: NavController) navigator.navAnimated( R.id.galleryPreviewsScene, bundleOf( - GalleryDetailScene.KEY_GALLERY_DETAIL to it, + KEY_GALLERY_DETAIL to it, KEY_NEXT_PAGE to nextPage, ), ) @@ -553,11 +553,7 @@ fun GalleryDetailScreen(args: GalleryDetailScreenArgs, navigator: NavController) ) to { navigator.navAnimated( R.id.galleryDetailScene, - bundleOf( - GalleryDetailScene.KEY_ACTION to GalleryDetailScene.ACTION_GID_TOKEN, - GalleryDetailScene.KEY_GID to it.gid, - GalleryDetailScene.KEY_TOKEN to it.token, - ), + bundleOf(GalleryDetailScene.KEY_ARGS to GalleryInfoArgs(it)), ) } }.toTypedArray() @@ -1278,19 +1274,7 @@ fun GalleryDetailScreen(args: GalleryDetailScreenArgs, navigator: NavController) class GalleryDetailScene : BaseScene() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { val args = requireNotNull(arguments) - val composeArgs = when (requireNotNull(args.getString(KEY_ACTION))) { - ACTION_GID_TOKEN -> { - val gid = args.getLong(KEY_GID) - val token = requireNotNull(args.getString(KEY_TOKEN)) - val page = args.getInt(KEY_PAGE) - GalleryDetailScreenArgs.GalleryDetailScreenArgsToken(gid, token, page) - } - ACTION_GALLERY_INFO -> { - val info = requireNotNull(args.getParcelableCompat(KEY_GALLERY_INFO)) - GalleryDetailScreenArgs.GalleryDetailScreenArgsGalleryInfo(info) - } - else -> error("Action is not ACTION_GALLERY_INFO neither ACTION_GALLERY_INFO!!!") - } + val composeArgs = requireNotNull(args.getParcelableCompat(KEY_ARGS)) return ComposeWithMD3 { val navigator = remember { findNavController() } GalleryDetailScreen(composeArgs, navigator) @@ -1298,13 +1282,6 @@ class GalleryDetailScene : BaseScene() { } companion object { - const val KEY_ACTION = "action" - const val ACTION_GALLERY_INFO = "action_gallery_info" - const val ACTION_GID_TOKEN = "action_gid_token" - const val KEY_GALLERY_INFO = "gallery_info" - const val KEY_GID = "gid" - const val KEY_TOKEN = "token" - const val KEY_PAGE = "page" - const val KEY_GALLERY_DETAIL = "gallery_detail" + const val KEY_ARGS = "args" } } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryListScene.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryListScene.kt index 47bbd8f4a..54faccca0 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryListScene.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryListScene.kt @@ -303,10 +303,7 @@ class GalleryListScene : SearchBarScene() { { info -> navAnimated( R.id.galleryDetailScene, - bundleOf( - GalleryDetailScene.KEY_ACTION to GalleryDetailScene.ACTION_GALLERY_INFO, - GalleryDetailScene.KEY_GALLERY_INFO to info, - ), + bundleOf(GalleryDetailScene.KEY_ARGS to GalleryInfoArgs(info)), ) }, { info -> @@ -877,11 +874,7 @@ class GalleryListScene : SearchBarScene() { token: String, ) : UrlSuggestion() { override val destination = R.id.galleryDetailScene - override val args = bundleOf( - GalleryDetailScene.KEY_ACTION to GalleryDetailScene.ACTION_GID_TOKEN, - GalleryDetailScene.KEY_GID to gid, - GalleryDetailScene.KEY_TOKEN to token, - ) + override val args = bundleOf(GalleryDetailScene.KEY_ARGS to TokenArgs(gid, token)) } private inner class GalleryPageUrlSuggestion( diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/HistoryFragment.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/HistoryFragment.kt index dd484800d..9059903fa 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/HistoryFragment.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/HistoryFragment.kt @@ -154,10 +154,7 @@ fun HistoryScreen(navigator: NavController) { onClick = { navigator.navAnimated( R.id.galleryDetailScene, - bundleOf( - GalleryDetailScene.KEY_ACTION to GalleryDetailScene.ACTION_GALLERY_INFO, - GalleryDetailScene.KEY_GALLERY_INFO to info, - ), + bundleOf(GalleryDetailScene.KEY_ARGS to GalleryInfoArgs(info)), ) }, onLongClick = { diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/MainNav.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/MainNav.kt index 0dbf3a005..3cbc9e480 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/MainNav.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/MainNav.kt @@ -42,11 +42,7 @@ fun NavController.navWithUrl(url: String): Boolean { GalleryDetailUrlParser.parse(url)?.apply { navAnimated( R.id.galleryDetailScene, - bundleOf( - GalleryDetailScene.KEY_ACTION to GalleryDetailScene.ACTION_GID_TOKEN, - GalleryDetailScene.KEY_GID to gid, - GalleryDetailScene.KEY_TOKEN to token, - ), + bundleOf(GalleryDetailScene.KEY_ARGS to TokenArgs(gid, token)), ) return true } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/ProgressFragment.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/ProgressFragment.kt index 234906308..e7a210811 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/ProgressFragment.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/ProgressFragment.kt @@ -53,12 +53,7 @@ fun ProgressScreen(gid: Long, token: String, page: Int, navigator: NavController navigator.popBackStack() navigator.navAnimated( R.id.galleryDetailScene, - bundleOf( - GalleryDetailScene.KEY_ACTION to GalleryDetailScene.ACTION_GID_TOKEN, - GalleryDetailScene.KEY_GID to gid, - GalleryDetailScene.KEY_TOKEN to it, - GalleryDetailScene.KEY_PAGE to page, - ), + bundleOf(GalleryDetailScene.KEY_ARGS to TokenArgs(gid, it, page)), ) } }.onFailure {