Skip to content

Commit c30410b

Browse files
committed
Implement deeplink in Nav3
1 parent 474f545 commit c30410b

File tree

4 files changed

+39
-8
lines changed

4 files changed

+39
-8
lines changed

JetNews/app/src/main/AndroidManifest.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@
4040
android:pathPrefix="/jetnews"
4141
android:scheme="https" />
4242
</intent-filter>
43+
<intent-filter android:autoVerify="true">
44+
<action android:name="android.intent.action.VIEW" />
45+
<category android:name="android.intent.category.DEFAULT" />
46+
<category android:name="android.intent.category.BROWSABLE" />
47+
<data android:scheme="https"
48+
android:host="developer.android.com"
49+
android:pathPrefix="/jetnews/home" />
50+
</intent-filter>
4351
</activity>
4452

4553
<receiver

JetNews/app/src/main/java/com/example/jetnews/ui/JetnewsApp.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
2525
import androidx.compose.runtime.Composable
2626
import androidx.compose.runtime.remember
2727
import androidx.compose.runtime.rememberCoroutineScope
28+
import androidx.navigation3.runtime.NavKey
2829
import com.example.jetnews.data.AppContainer
2930
import com.example.jetnews.ui.components.AppNavRail
31+
import com.example.jetnews.ui.navigation.HomeKey
3032
import com.example.jetnews.ui.navigation.JetnewsNavDisplay
3133
import com.example.jetnews.ui.navigation.NavigationState
3234
import com.example.jetnews.ui.navigation.Navigator
@@ -35,14 +37,14 @@ import com.example.jetnews.ui.theme.JetnewsTheme
3537
import kotlinx.coroutines.launch
3638

3739
@Composable
38-
fun JetnewsApp(appContainer: AppContainer, widthSizeClass: WindowWidthSizeClass) {
40+
fun JetnewsApp(appContainer: AppContainer, widthSizeClass: WindowWidthSizeClass, deeplinkKey: NavKey?) {
3941
JetnewsTheme {
4042
val coroutineScope = rememberCoroutineScope()
4143

4244
val isExpandedScreen = widthSizeClass == WindowWidthSizeClass.Expanded
4345
val sizeAwareDrawerState = rememberSizeAwareDrawerState(isExpandedScreen)
4446

45-
val navigationState = rememberNavigationState()
47+
val navigationState = rememberNavigationState(deeplinkKey ?: HomeKey())
4648
val navigator = Navigator(navigationState)
4749

4850
ModalNavigationDrawer(

JetNews/app/src/main/java/com/example/jetnews/ui/MainActivity.kt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,18 @@
1616

1717
package com.example.jetnews.ui
1818

19+
import android.content.Intent
20+
import android.net.Uri
1921
import android.os.Bundle
2022
import androidx.activity.ComponentActivity
2123
import androidx.activity.compose.setContent
2224
import androidx.activity.enableEdgeToEdge
2325
import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
2426
import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
27+
import androidx.navigation3.runtime.NavKey
2528
import com.example.jetnews.JetnewsApplication
29+
import com.example.jetnews.ui.navigation.HomeKey
30+
import com.example.jetnews.ui.navigation.POST_ID
2631

2732
class MainActivity : ComponentActivity() {
2833

@@ -34,7 +39,18 @@ class MainActivity : ComponentActivity() {
3439
val appContainer = (application as JetnewsApplication).container
3540
setContent {
3641
val widthSizeClass = calculateWindowSizeClass(this).widthSizeClass
37-
JetnewsApp(appContainer, widthSizeClass)
42+
JetnewsApp(appContainer, widthSizeClass, getDeepLinkKey(intent))
3843
}
3944
}
4045
}
46+
47+
private fun getDeepLinkKey(intent: Intent): NavKey? {
48+
val uri: Uri = intent.data ?: return null
49+
val pathParams = uri.pathSegments
50+
if (pathParams.lastOrNull() != "home") return null
51+
52+
val queryParams = uri.getQueryParameters(POST_ID)
53+
if (queryParams.isEmpty() || queryParams.size > 1) return null
54+
// "https://developer.android.com/jetnews/home?postId={$POST_ID}"
55+
return HomeKey(postId = Uri.decode(queryParams.firstOrNull()))
56+
}

JetNews/app/src/main/java/com/example/jetnews/ui/navigation/JetnewsNavigation.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,18 @@ object InterestsKey : NavKey
3737

3838
val NAVIGATION_KEYS = listOf(HomeKey(), InterestsKey)
3939

40+
fun getNavigationKeys(startKey: NavKey) = listOf(startKey, InterestsKey)
41+
4042
@Composable
41-
fun rememberNavigationState(startKey: NavKey = HomeKey()): NavigationState {
43+
fun rememberNavigationState(startKey: NavKey): NavigationState {
4244
val currentKeys = rememberNavBackStack(startKey)
43-
val backStacks = buildMap { NAVIGATION_KEYS.forEach { put(it::class.toString(), rememberNavBackStack(it)) } }.toMutableMap()
44-
return remember(startKey) {
45-
NavigationState(currentKeys, backStacks)
46-
}
45+
val backStacks = buildMap {
46+
getNavigationKeys(startKey)
47+
.forEach {
48+
put(it::class.toString(), rememberNavBackStack(it))
49+
}
50+
}.toMutableMap()
51+
return remember(startKey) { NavigationState(currentKeys, backStacks) }
4752
}
4853

4954
/**

0 commit comments

Comments
 (0)