Unify MainActivity nav behaviour

This commit is contained in:
tarsin committed 2023-06-27 11:54:09 +08:00
1 parent 2e23167e94
commit 2da8cfde01
12 files changed
+89 -79

No files matched your search

@@ -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
@@ -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 {
@@ -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
}
@@ -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
@@ -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
@@ -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
@@ -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)
@@ -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)
}
}
@@ -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) {
@@ -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
@@ -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)
@@ -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)