Navigate with GalleryDetailScreenArgs directly

This commit is contained in:
Lokesh Gidra authored and Vladimir Dostoyevskiy committed 2023-11-17 23:54:19 +08:00
1 parent 4404531171
commit 59e46aeeea
8 files changed
+38 -82

No files matched your search

@@ -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) {
@@ -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 -> {
@@ -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)),
)
},
{},
@@ -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<GalleryTagGroup>.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<GalleryInfo?>(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<MainActivity>() }
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<BaseGalleryInfo>(KEY_GALLERY_INFO))
GalleryDetailScreenArgs.GalleryDetailScreenArgsGalleryInfo(info)
}
else -> error("Action is not ACTION_GALLERY_INFO neither ACTION_GALLERY_INFO!!!")
}
val composeArgs = requireNotNull(args.getParcelableCompat<GalleryDetailScreenArgs>(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"
}
}
@@ -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(
@@ -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 = {
@@ -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
}
@@ -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 {