Navigate with GalleryDetailScreenArgs directly
This commit is contained in:
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 {
|
||||
|
||||
Reference in new issue
Block a user