Skip to content

Commit c8e2d19

Browse files
committed
[#617] Migrate template compose to navigation 3
1 parent 62a16de commit c8e2d19

24 files changed

Lines changed: 693 additions & 150 deletions

template-compose/app/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ plugins {
55
alias(libs.plugins.compose.compiler)
66
alias(libs.plugins.kotlin.android)
77
alias(libs.plugins.kotlin.parcelize)
8+
alias(libs.plugins.kotlin.serialization)
89
alias(libs.plugins.ksp)
910
alias(libs.plugins.hilt)
1011
alias(libs.plugins.kover)
@@ -138,6 +139,7 @@ dependencies {
138139
ksp(libs.hilt.compiler)
139140

140141
implementation(libs.kotlinx.collections.immutable)
142+
implementation(libs.kotlinx.serialization.json)
141143

142144
implementation(libs.timber)
143145
debugImplementation(libs.chucker)
Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,34 @@
11
package co.nimblehq.template.compose.di.modules.main
22

3+
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
4+
import co.nimblehq.template.compose.navigation.EntryProviderInstaller
5+
import co.nimblehq.template.compose.navigation.Navigator
6+
import co.nimblehq.template.compose.navigation.NavigatorImpl
7+
import co.nimblehq.template.compose.ui.screens.main.home.Home
8+
import co.nimblehq.template.compose.ui.screens.main.home.HomeScreen
39
import dagger.Module
10+
import dagger.Provides
411
import dagger.hilt.InstallIn
5-
import dagger.hilt.android.components.ActivityComponent
12+
import dagger.hilt.android.components.ActivityRetainedComponent
13+
import dagger.hilt.android.scopes.ActivityRetainedScoped
14+
import dagger.multibindings.IntoSet
615

716
@Module
8-
@InstallIn(ActivityComponent::class)
9-
class MainActivityModule
17+
@InstallIn(ActivityRetainedComponent::class)
18+
object MainActivityModule {
19+
20+
@Provides
21+
@ActivityRetainedScoped
22+
fun provideNavigator(): Navigator = NavigatorImpl(startDestination = Home)
23+
24+
@IntoSet
25+
@Provides
26+
fun provideEntryProviderInstaller(navigator: Navigator): EntryProviderInstaller = {
27+
entry<Home> {
28+
HomeScreen(
29+
viewModel = hiltViewModel(),
30+
navigator = navigator
31+
)
32+
}
33+
}
34+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package co.nimblehq.template.compose.extensions
2+
3+
import android.os.Build
4+
import androidx.activity.ComponentActivity
5+
import androidx.activity.enableEdgeToEdge
6+
7+
fun ComponentActivity.setEdgeToEdgeConfig() {
8+
enableEdgeToEdge()
9+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
10+
// Force the 3-button navigation bar to be transparent
11+
// See: https://developer.android.com/develop/ui/views/layout/edge-to-edge#create-transparent
12+
window.isNavigationBarContrastEnforced = false
13+
}
14+
}

template-compose/app/src/main/java/co/nimblehq/template/compose/extensions/SavedStateHandleExt.kt

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package co.nimblehq.template.compose.navigation
2+
3+
import androidx.compose.runtime.snapshots.SnapshotStateList
4+
import androidx.navigation3.runtime.EntryProviderScope
5+
import kotlin.reflect.KClass
6+
7+
typealias EntryProviderInstaller = EntryProviderScope<Any>.() -> Unit
8+
9+
interface Navigator {
10+
11+
val backStack: SnapshotStateList<Any>
12+
13+
fun goTo(destination: Any)
14+
15+
fun goBack()
16+
17+
fun goBackToLast(destinationClass: KClass<*>)
18+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package co.nimblehq.template.compose.navigation
2+
3+
import androidx.compose.runtime.mutableStateListOf
4+
import androidx.compose.runtime.snapshots.SnapshotStateList
5+
import dagger.hilt.android.scopes.ActivityRetainedScoped
6+
import kotlin.reflect.KClass
7+
8+
@ActivityRetainedScoped
9+
class NavigatorImpl(startDestination: Any) : Navigator {
10+
override val backStack: SnapshotStateList<Any> = mutableStateListOf(startDestination)
11+
12+
override fun goTo(destination: Any) {
13+
backStack.add(destination)
14+
}
15+
16+
override fun goBack() {
17+
backStack.removeLastOrNull()
18+
}
19+
20+
override fun goBackToLast(destinationClass: KClass<*>) {
21+
val index = backStack.indexOfLast {
22+
destinationClass.isInstance(it)
23+
}
24+
25+
if (index in backStack.indices) {
26+
backStack.removeRange(index + 1, backStack.size)
27+
}
28+
}
29+
}

template-compose/app/src/main/java/co/nimblehq/template/compose/ui/AppDestination.kt

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

template-compose/app/src/main/java/co/nimblehq/template/compose/ui/AppNavGraph.kt

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

template-compose/app/src/main/java/co/nimblehq/template/compose/ui/base/BaseDestination.kt

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

template-compose/app/src/main/java/co/nimblehq/template/compose/ui/base/BaseViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ abstract class BaseViewModel : ViewModel() {
1818
protected val _error = MutableSharedFlow<Throwable>()
1919
val error = _error.asSharedFlow()
2020

21-
protected val _navigator = MutableSharedFlow<BaseDestination>()
21+
protected val _navigator = MutableSharedFlow<Any>()
2222
val navigator = _navigator.asSharedFlow()
2323

2424
/**

0 commit comments

Comments
 (0)