diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e9392e59..50a36b20 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -170,6 +170,17 @@ + + + + + + + + + @@ -269,42 +280,7 @@ android:windowSoftInputMode="adjustResize" /> - - - - - - - - - - - - - - - - - - - - - + android:exported="true" /> > { throw IllegalStateException("not allowed here!") } @@ -194,12 +201,61 @@ class MainActivityV2 : BaseComposeActivity() { ) } - private var myNavCollector: NavHostController? = null + private var direction: Direction? = null + private var waitingNavCollectorToNavigate = AtomicBoolean(false) + private var myNavController: NavHostController? = null + set(value) { + field = value + if (value != null && waitingNavCollectorToNavigate.get() && direction != null) { + launch { + value.currentDestinationFlow + .take(1) + .collect { + if (waitingNavCollectorToNavigate.get() && direction != null) { + value.navigate(direction!!) + waitingNavCollectorToNavigate.set(false) + direction = null + } + } + } + } + } + + private fun navigate(direction: Direction) { + if (myNavController == null) { + waitingNavCollectorToNavigate.set(true) + this.direction = direction + } else { + myNavController?.navigate(direction) + } + } + + private fun checkIntent(intent: Intent): Boolean { + return if (intent.data?.scheme == "com.baidu.tieba" && intent.data?.host == "unidispatch") { + val uri = intent.data!! + when (uri.path.orEmpty().lowercase()) { + "/frs" -> { + val forumName = uri.getQueryParameter("kw") ?: return true + navigate(ForumPageDestination(forumName)) + } + + "/pb" -> { + val threadId = uri.getQueryParameter("tid")?.toLongOrNull() ?: return true + navigate(ThreadPageDestination(threadId)) + } + } + true + } else { + false + } + } override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) intent?.let { - myNavCollector?.handleDeepLink(it) + if (!checkIntent(it)) { + myNavController?.handleDeepLink(it) + } } } @@ -265,6 +321,7 @@ class MainActivityV2 : BaseComposeActivity() { launch { ClientUtils.setActiveTimestamp() } + intent?.let { checkIntent(it) } } override fun onCreateContent(systemUiController: SystemUiController) { @@ -276,11 +333,11 @@ class MainActivityV2 : BaseComposeActivity() { private fun openClipBoardLink(link: ClipBoardLink) { when (link) { is ClipBoardThreadLink -> { - myNavCollector?.navigate(Uri.parse("tblite://thread/${link.threadId}")) + myNavController?.navigate(Uri.parse("tblite://thread/${link.threadId}")) } is ClipBoardForumLink -> { - myNavCollector?.navigate(Uri.parse("tblite://forum/${link.forumName}")) + myNavController?.navigate(Uri.parse("tblite://forum/${link.forumName}")) } else -> { @@ -409,9 +466,6 @@ class MainActivityV2 : BaseComposeActivity() { TiebaLiteLocalProvider { TranslucentThemeBackground { val navController = rememberNavController() - SideEffect { - myNavCollector = navController - } val engine = TiebaNavHostDefaults.rememberNavHostEngine() val navigator = TiebaNavHostDefaults.rememberBottomSheetNavigator() val currentDestination by navController.currentDestinationAsState() @@ -447,6 +501,10 @@ class MainActivityV2 : BaseComposeActivity() { ) } } + + SideEffect { + myNavController = navController + } } } }