Skip to content

Commit 4e51e8f

Browse files
authored
Merge pull request #20 from RevenueCat/migrate/nav3
Migrate to Navigation3
2 parents 395b237 + 25e95b7 commit 4e51e8f

File tree

25 files changed

+310
-596
lines changed

25 files changed

+310
-596
lines changed

app/build.gradle.kts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ dependencies {
6161
// Core
6262
implementation(projects.core.designsystem)
6363
implementation(projects.core.navigation)
64+
implementation(projects.core.model)
6465

6566
// Features
6667
implementation(projects.feature.home)
@@ -76,7 +77,8 @@ dependencies {
7677
// Compose
7778
implementation(platform(libs.androidx.compose.bom))
7879
implementation(libs.androidx.activity.compose)
79-
implementation(libs.androidx.navigation.compose)
80+
implementation(libs.androidx.navigation3.runtime)
81+
implementation(libs.androidx.navigation3.ui)
8082
implementation(libs.androidx.compose.ui)
8183
implementation(libs.androidx.compose.ui.tooling.preview)
8284
implementation(libs.androidx.compose.runtime)

app/src/main/kotlin/com/revenuecat/articles/paywall/compose/MainActivity.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,17 @@ import androidx.activity.ComponentActivity
2020
import androidx.activity.compose.setContent
2121
import androidx.activity.enableEdgeToEdge
2222
import com.revenuecat.articles.paywall.compose.ui.CatArticlesMain
23-
import com.revenuecat.articles.paywall.core.navigation.AppComposeNavigator
24-
import com.revenuecat.articles.paywall.core.navigation.CatArticlesScreen
2523
import dagger.hilt.android.AndroidEntryPoint
26-
import javax.inject.Inject
2724

2825
@AndroidEntryPoint
2926
class MainActivity : ComponentActivity() {
3027

31-
@Inject
32-
internal lateinit var composeNavigator: AppComposeNavigator<CatArticlesScreen>
33-
3428
override fun onCreate(savedInstanceState: Bundle?) {
3529
super.onCreate(savedInstanceState)
3630
enableEdgeToEdge()
3731

3832
setContent {
39-
CatArticlesMain(composeNavigator = composeNavigator)
33+
CatArticlesMain()
4034
}
4135
}
4236
}

app/src/main/kotlin/com/revenuecat/articles/paywall/compose/navigation/CatArticlesNavHost.kt

Lines changed: 58 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,69 @@
1515
*/
1616
package com.revenuecat.articles.paywall.compose.navigation
1717

18+
import androidx.compose.animation.ExperimentalSharedTransitionApi
1819
import androidx.compose.animation.SharedTransitionLayout
1920
import androidx.compose.runtime.Composable
20-
import androidx.navigation.NavHostController
21-
import androidx.navigation.compose.NavHost
21+
import androidx.compose.runtime.CompositionLocalProvider
22+
import androidx.compose.runtime.remember
23+
import androidx.navigation3.runtime.NavKey
24+
import androidx.navigation3.runtime.entryProvider
25+
import androidx.navigation3.runtime.rememberNavBackStack
26+
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
27+
import androidx.navigation3.ui.LocalNavAnimatedContentScope
28+
import androidx.navigation3.ui.NavDisplay
29+
import com.revenuecat.articles.paywall.core.navigation.CatArticlesNavigatorImpl
2230
import com.revenuecat.articles.paywall.core.navigation.CatArticlesScreen
31+
import com.revenuecat.articles.paywall.core.navigation.LocalComposeNavigator
32+
import com.revenuecat.articles.paywall.feature.account.AccountScreen
33+
import com.revenuecat.articles.paywall.feature.article.CatArticlesDetail
34+
import com.revenuecat.articles.paywall.feature.home.CatArticlesHome
35+
import com.revenuecat.articles.paywall.feature.subscriptions.SubscriptionManagementScreen
36+
import com.revenuecat.articles.paywall.paywalls.CatCustomPaywalls
2337

38+
@OptIn(ExperimentalSharedTransitionApi::class)
2439
@Composable
25-
fun CatArticlesNavHost(navHostController: NavHostController) {
26-
SharedTransitionLayout {
27-
NavHost(
28-
navController = navHostController,
29-
startDestination = CatArticlesScreen.CatHome,
30-
) {
31-
catArticlesNavigation(this@SharedTransitionLayout)
40+
fun CatArticlesNavHost() {
41+
val backStack = rememberNavBackStack(CatArticlesScreen.CatHome)
42+
val navigator = remember(backStack) { CatArticlesNavigatorImpl(backStack) }
43+
44+
CompositionLocalProvider(
45+
LocalComposeNavigator provides navigator,
46+
) {
47+
SharedTransitionLayout {
48+
NavDisplay(
49+
backStack = backStack,
50+
onBack = { backStack.removeLastOrNull() },
51+
entryDecorators = listOf(rememberSaveableStateHolderNavEntryDecorator()),
52+
entryProvider = entryProvider<NavKey> {
53+
entry<CatArticlesScreen.CatHome> {
54+
CatArticlesHome(
55+
sharedTransitionScope = this@SharedTransitionLayout,
56+
animatedContentScope = LocalNavAnimatedContentScope.current,
57+
)
58+
}
59+
60+
entry<CatArticlesScreen.CatArticle> { screen ->
61+
CatArticlesDetail(
62+
sharedTransitionScope = this@SharedTransitionLayout,
63+
animatedContentScope = LocalNavAnimatedContentScope.current,
64+
article = screen.article,
65+
)
66+
}
67+
68+
entry<CatArticlesScreen.Paywalls> {
69+
CatCustomPaywalls()
70+
}
71+
72+
entry<CatArticlesScreen.Account> {
73+
AccountScreen()
74+
}
75+
76+
entry<CatArticlesScreen.SubscriptionManagement> {
77+
SubscriptionManagementScreen()
78+
}
79+
},
80+
)
3281
}
3382
}
3483
}

app/src/main/kotlin/com/revenuecat/articles/paywall/compose/navigation/CatArticlesNavigation.kt

Lines changed: 0 additions & 52 deletions
This file was deleted.

app/src/main/kotlin/com/revenuecat/articles/paywall/compose/ui/CatArticlesMain.kt

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,12 @@
1616
package com.revenuecat.articles.paywall.compose.ui
1717

1818
import androidx.compose.runtime.Composable
19-
import androidx.compose.runtime.LaunchedEffect
20-
import androidx.navigation.compose.rememberNavController
2119
import com.revenuecat.articles.paywall.compose.navigation.CatArticlesNavHost
2220
import com.revenuecat.articles.paywall.core.designsystem.theme.CatArticlesTheme
23-
import com.revenuecat.articles.paywall.core.navigation.AppComposeNavigator
24-
import com.revenuecat.articles.paywall.core.navigation.CatArticlesScreen
2521

2622
@Composable
27-
fun CatArticlesMain(composeNavigator: AppComposeNavigator<CatArticlesScreen>) {
23+
fun CatArticlesMain() {
2824
CatArticlesTheme {
29-
val navHostController = rememberNavController()
30-
31-
LaunchedEffect(Unit) {
32-
composeNavigator.handleNavigationCommands(navHostController)
33-
}
34-
35-
CatArticlesNavHost(navHostController = navHostController)
25+
CatArticlesNavHost()
3626
}
3727
}

core/navigation/build.gradle.kts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
plugins {
1717
id("revenuecat.android.library")
1818
id("revenuecat.android.library.compose")
19-
id("revenuecat.android.hilt")
2019
id("org.jetbrains.kotlin.plugin.serialization")
2120
id("revenuecat.spotless")
2221
}
@@ -28,6 +27,10 @@ android {
2827
dependencies {
2928
implementation(projects.core.model)
3029

31-
implementation(libs.kotlinx.coroutines.android)
32-
api(libs.androidx.navigation.compose)
30+
// Navigation3
31+
api(libs.androidx.navigation3.runtime)
32+
api(libs.androidx.navigation3.ui)
33+
34+
// json parsing
35+
implementation(libs.kotlinx.serialization.json)
3336
}

core/navigation/src/main/kotlin/com/revenuecat/articles/paywall/core/navigation/CatArticlesComposeNavigator.kt

Lines changed: 0 additions & 53 deletions
This file was deleted.

core/navigation/src/main/kotlin/com/revenuecat/articles/paywall/core/navigation/CatArticlesScreen.kt

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515
*/
1616
package com.revenuecat.articles.paywall.core.navigation
1717

18+
import androidx.navigation3.runtime.NavKey
1819
import com.revenuecat.articles.paywall.core.model.Article
1920
import kotlinx.serialization.Serializable
20-
import kotlin.reflect.typeOf
2121

22-
sealed interface CatArticlesScreen {
22+
sealed interface CatArticlesScreen : NavKey {
2323

2424
@Serializable
2525
data object CatHome : CatArticlesScreen
@@ -28,11 +28,7 @@ sealed interface CatArticlesScreen {
2828
data object Paywalls : CatArticlesScreen
2929

3030
@Serializable
31-
data class CatArticle(val article: Article) : CatArticlesScreen {
32-
companion object {
33-
val typeMap = mapOf(typeOf<Article>() to CatArticlesType)
34-
}
35-
}
31+
data class CatArticle(val article: Article) : CatArticlesScreen
3632

3733
@Serializable
3834
data object Account : CatArticlesScreen

core/navigation/src/main/kotlin/com/revenuecat/articles/paywall/core/navigation/CatArticlesType.kt

Lines changed: 0 additions & 39 deletions
This file was deleted.

core/navigation/src/main/kotlin/com/revenuecat/articles/paywall/core/navigation/NavigationModule.kt renamed to core/navigation/src/main/kotlin/com/revenuecat/articles/paywall/core/navigation/LocalComposeNavigator.kt

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,20 @@
1515
*/
1616
package com.revenuecat.articles.paywall.core.navigation
1717

18-
import dagger.Binds
19-
import dagger.Module
20-
import dagger.hilt.InstallIn
21-
import dagger.hilt.components.SingletonComponent
22-
import javax.inject.Singleton
18+
import androidx.compose.runtime.Composable
19+
import androidx.compose.runtime.ProvidableCompositionLocal
20+
import androidx.compose.runtime.ReadOnlyComposable
21+
import androidx.compose.runtime.compositionLocalOf
2322

24-
@Module
25-
@InstallIn(SingletonComponent::class)
26-
internal interface NavigationModule {
23+
val LocalComposeNavigator: ProvidableCompositionLocal<CatArticlesNavigator> =
24+
compositionLocalOf {
25+
error(
26+
"No CatArticlesNavigator provided! Make sure to wrap your " +
27+
"content with CompositionLocalProvider.",
28+
)
29+
}
2730

28-
@Binds
29-
@Singleton
30-
fun provideComposeNavigator(
31-
catArticlesComposeNavigator: CatArticlesComposeNavigator,
32-
): AppComposeNavigator<CatArticlesScreen>
33-
}
31+
val currentComposeNavigator: CatArticlesNavigator
32+
@Composable
33+
@ReadOnlyComposable
34+
get() = LocalComposeNavigator.current

0 commit comments

Comments
 (0)