Skip to content

Commit d2d9f2c

Browse files
author
Josh
committed
nav3 migration
1 parent 2fcd365 commit d2d9f2c

43 files changed

Lines changed: 1653 additions & 1261 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.editorconfig

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
root = true
2+
3+
[*.{kt,kts}]
4+
max_line_length = 160
5+
ktlint_code_style = ktlint_official
6+
ktlint_standard_chain-method-continuation = disabled
7+
ktlint_standard_multiline-expression-wrapping = disabled
8+
ktlint_standard_no-wildcard-imports = disabled
9+
ktlint_standard_no-single-line-block-comment = disabled
10+
ktlint_standard_parameter-list-wrapping = enabled
11+
ktlint_standard_function-expression-body = disabled
12+
ktlint_function_naming_ignore_when_annotated_with = Composable,Preview,PreviewLightDark
13+
ktlint_function_signature_body_expression_wrapping = default

app/build.gradle.kts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@ plugins {
1010
}
1111

1212
ksp {
13-
arg("KOIN_CONFIG_CHECK", "true")
13+
arg("KOIN_CONFIG_CHECK", "false")
1414
}
1515

1616
android {
1717
namespace = "net.frozendevelopment.openletters"
18-
compileSdk = 35
18+
compileSdk = 36
1919

2020
defaultConfig {
2121
applicationId = "net.frozendevelopment.openletters"
2222
minSdk = 26
23-
targetSdk = 35
23+
targetSdk = 36
2424
versionCode = Integer.parseInt(System.getenv("GITHUB_RUN_NUMBER") ?: "1")
2525
versionName = "0.1.0"
2626

@@ -120,22 +120,26 @@ dependencies {
120120
implementation(libs.androidx.material3)
121121
implementation(libs.androidx.material.icons)
122122
implementation(libs.androidx.material.icons.extended)
123-
implementation(libs.androidx.navigation)
124-
implementation(libs.androidx.navigation.common.ktx)
123+
// implementation(libs.androidx.navigation)
124+
// implementation(libs.androidx.navigation.common.ktx)
125+
implementation(libs.androidx.nav3.runtime)
126+
implementation(libs.androidx.nav3.ui)
125127
implementation(libs.androidx.lifecycle.runtime.compose.android)
126128
implementation(libs.androidx.splashscreen)
127129

128130
implementation(platform(libs.koin.bom))
129131
implementation(libs.koin.android)
130132
implementation(libs.koin.compose)
131133
implementation(libs.koin.workmanager)
132-
implementation(libs.koin.compose.navigation)
134+
// implementation(libs.koin.compose.navigation)
135+
implementation(libs.koin.nav3)
136+
133137
implementation(libs.androidx.adaptive.android)
134138
implementation(libs.androidx.core.animation)
135139
implementation(libs.androidx.ui.text.google.fonts)
136140
implementation(libs.androidx.datastore.core.android)
137-
compileOnly(libs.koin.annotations)
138-
ksp(libs.koin.ksp)
141+
// compileOnly(libs.koin.annotations)
142+
// ksp(libs.koin.ksp)
139143

140144
implementation(libs.sqldelight)
141145
implementation(libs.sqldelight.coroutines)

app/src/main/java/net/frozendevelopment/openletters/MainActivity.kt

Lines changed: 66 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ import android.os.Bundle
55
import androidx.activity.ComponentActivity
66
import androidx.activity.compose.setContent
77
import androidx.activity.enableEdgeToEdge
8+
import androidx.compose.animation.core.tween
9+
import androidx.compose.animation.slideInHorizontally
10+
import androidx.compose.animation.slideOutHorizontally
11+
import androidx.compose.animation.togetherWith
812
import androidx.compose.foundation.layout.Box
913
import androidx.compose.foundation.layout.WindowInsets
1014
import androidx.compose.foundation.layout.WindowInsetsSides
@@ -13,46 +17,47 @@ import androidx.compose.foundation.layout.only
1317
import androidx.compose.foundation.layout.safeDrawing
1418
import androidx.compose.foundation.layout.statusBarsPadding
1519
import androidx.compose.foundation.layout.windowInsetsPadding
16-
import androidx.compose.material3.DrawerState
1720
import androidx.compose.material3.DrawerValue
1821
import androidx.compose.material3.Scaffold
1922
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
2023
import androidx.compose.material3.rememberDrawerState
24+
import androidx.compose.runtime.CompositionLocalProvider
2125
import androidx.compose.runtime.getValue
26+
import androidx.compose.runtime.remember
2227
import androidx.compose.runtime.rememberCoroutineScope
2328
import androidx.compose.ui.Modifier
2429
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
2530
import androidx.lifecycle.compose.collectAsStateWithLifecycle
26-
import androidx.navigation.compose.NavHost
27-
import androidx.navigation.compose.rememberNavController
31+
import androidx.navigation3.ui.NavDisplay
2832
import androidx.window.core.layout.WindowWidthSizeClass
2933
import kotlinx.coroutines.launch
3034
import net.frozendevelopment.openletters.data.sqldelight.LetterQueries
31-
import net.frozendevelopment.openletters.extensions.newRoot
32-
import net.frozendevelopment.openletters.feature.category.categories
3335
import net.frozendevelopment.openletters.feature.category.form.CategoryFormDestination
3436
import net.frozendevelopment.openletters.feature.category.manage.ManageCategoryDestination
35-
import net.frozendevelopment.openletters.feature.letter.letters
3637
import net.frozendevelopment.openletters.feature.letter.list.LetterListDestination
37-
import net.frozendevelopment.openletters.feature.letter.scan.ScanLetterDestination
3838
import net.frozendevelopment.openletters.feature.reminder.form.ReminderFormDestination
3939
import net.frozendevelopment.openletters.feature.reminder.list.ReminderListDestination
40-
import net.frozendevelopment.openletters.feature.reminder.reminders
4140
import net.frozendevelopment.openletters.feature.settings.SettingsDestination
42-
import net.frozendevelopment.openletters.feature.settings.settings
4341
import net.frozendevelopment.openletters.ui.animation.navigationEnterTransition
44-
import net.frozendevelopment.openletters.ui.animation.navigationExitTransition
45-
import net.frozendevelopment.openletters.ui.animation.navigationPopEnterTransition
46-
import net.frozendevelopment.openletters.ui.animation.navigationPopExitTransition
47-
import net.frozendevelopment.openletters.ui.components.LettersNavDrawer
42+
import net.frozendevelopment.openletters.ui.navigation.EntryProvider
43+
import net.frozendevelopment.openletters.ui.navigation.LettersNavDrawer
44+
import net.frozendevelopment.openletters.ui.navigation.LocalDrawerState
45+
import net.frozendevelopment.openletters.ui.navigation.LocalNavigationState
46+
import net.frozendevelopment.openletters.ui.navigation.LocalNavigator
47+
import net.frozendevelopment.openletters.ui.navigation.Navigator
48+
import net.frozendevelopment.openletters.ui.navigation.koinEntryProvider
49+
import net.frozendevelopment.openletters.ui.navigation.rememberNavigationState
50+
import net.frozendevelopment.openletters.ui.navigation.toEntries
4851
import net.frozendevelopment.openletters.ui.theme.OpenLettersTheme
4952
import net.frozendevelopment.openletters.util.ThemeManagerType
5053
import org.koin.android.ext.android.inject
54+
import org.koin.core.annotation.KoinExperimentalAPI
5155

5256
class MainActivity : ComponentActivity() {
5357
private val themeManager: ThemeManagerType by inject()
5458
private val letterQueries: LetterQueries by inject()
5559

60+
@OptIn(KoinExperimentalAPI::class)
5661
override fun onCreate(savedInstanceState: Bundle?) {
5762
installSplashScreen()
5863

@@ -68,8 +73,14 @@ class MainActivity : ComponentActivity() {
6873
colorPalette = currentTheme.second,
6974
) {
7075
val coroutineScope = rememberCoroutineScope()
71-
val drawerState: DrawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
72-
val navHostController = rememberNavController()
76+
val drawerState = rememberDrawerState(DrawerValue.Closed)
77+
val navigationState =
78+
rememberNavigationState(
79+
LetterListDestination,
80+
setOf(LetterListDestination, ManageCategoryDestination, ReminderListDestination),
81+
)
82+
val navigator = remember { Navigator(navigationState) }
83+
val entryProvider: EntryProvider = koinEntryProvider()
7384

7485
// lock the app to portrait for phone users
7586
if (currentWindowAdaptiveInfo().windowSizeClass.windowWidthSizeClass == WindowWidthSizeClass.COMPACT) {
@@ -80,27 +91,27 @@ class MainActivity : ComponentActivity() {
8091
drawerState = drawerState,
8192
goToMail = {
8293
coroutineScope.launch { drawerState.close() }
83-
navHostController.newRoot(LetterListDestination)
94+
navigator.navigate(LetterListDestination)
8495
},
8596
goToManageCategories = {
8697
coroutineScope.launch { drawerState.close() }
87-
navHostController.newRoot(ManageCategoryDestination)
98+
navigator.navigate(ManageCategoryDestination)
8899
},
89100
goToCreateCategory = {
90101
coroutineScope.launch { drawerState.close() }
91-
navHostController.navigate(CategoryFormDestination())
102+
navigator.navigate(CategoryFormDestination())
92103
},
93104
goToReminders = {
94105
coroutineScope.launch { drawerState.close() }
95-
navHostController.newRoot(ReminderListDestination)
106+
navigator.navigate(ReminderListDestination)
96107
},
97108
goToCreateReminder = {
98109
coroutineScope.launch { drawerState.close() }
99-
navHostController.navigate(ReminderFormDestination())
110+
navigator.navigate(ReminderFormDestination())
100111
},
101112
goToSettings = {
102113
coroutineScope.launch { drawerState.close() }
103-
navHostController.navigate(SettingsDestination)
114+
navigator.navigate(SettingsDestination)
104115
},
105116
) {
106117
Scaffold(modifier = Modifier.fillMaxSize()) { _ ->
@@ -115,23 +126,40 @@ class MainActivity : ComponentActivity() {
115126
),
116127
),
117128
) {
118-
NavHost(
119-
navController = navHostController,
120-
startDestination =
121-
if (letterQueries.hasLetters().executeAsOne() == 1L) {
122-
LetterListDestination
123-
} else {
124-
ScanLetterDestination(canNavigateBack = false)
125-
},
126-
enterTransition = { navigationEnterTransition() },
127-
exitTransition = { navigationExitTransition() },
128-
popEnterTransition = { navigationPopEnterTransition() },
129-
popExitTransition = { navigationPopExitTransition() },
130-
) {
131-
categories(navHostController, drawerState)
132-
letters(navHostController, drawerState)
133-
reminders(navHostController, drawerState)
134-
settings(navHostController)
129+
CompositionLocalProvider(LocalDrawerState provides drawerState) {
130+
CompositionLocalProvider(LocalNavigationState provides navigationState) {
131+
CompositionLocalProvider(
132+
LocalNavigator provides navigator,
133+
) {
134+
NavDisplay(
135+
entries = navigationState.toEntries(entryProvider),
136+
onBack = { navigator.pop() },
137+
transitionSpec = { navigationEnterTransition() },
138+
popTransitionSpec = {
139+
// Slide in from left when navigating back
140+
slideInHorizontally(
141+
initialOffsetX = { -it },
142+
animationSpec = tween(400),
143+
) togetherWith
144+
slideOutHorizontally(
145+
targetOffsetX = { it },
146+
animationSpec = tween(400),
147+
)
148+
},
149+
predictivePopTransitionSpec = {
150+
// Slide in from left when navigating back
151+
slideInHorizontally(
152+
initialOffsetX = { -it },
153+
animationSpec = tween(400),
154+
) togetherWith
155+
slideOutHorizontally(
156+
targetOffsetX = { it },
157+
animationSpec = tween(400),
158+
)
159+
},
160+
)
161+
}
162+
}
135163
}
136164
}
137165
}

app/src/main/java/net/frozendevelopment/openletters/OpenLettersApplication.kt

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,20 @@ import android.app.NotificationChannel
55
import android.app.NotificationManager
66
import androidx.work.OneTimeWorkRequestBuilder
77
import androidx.work.WorkManager
8-
import net.frozendevelopment.openletters.data.sqldelight.SqlDelightKoin
9-
import net.frozendevelopment.openletters.feature.FeatureKoin
10-
import net.frozendevelopment.openletters.migration.AppMigrationKoin
11-
import net.frozendevelopment.openletters.usecase.UseCaseKoin
12-
import net.frozendevelopment.openletters.util.UtilKoin
8+
import net.frozendevelopment.openletters.data.sqldelight.sqlDelightKoinModule
9+
import net.frozendevelopment.openletters.feature.category.categoryKoinModule
10+
import net.frozendevelopment.openletters.feature.letter.letterKoinModule
11+
import net.frozendevelopment.openletters.feature.reminder.reminderKoinModule
12+
import net.frozendevelopment.openletters.feature.settings.settingsKoinModule
13+
import net.frozendevelopment.openletters.migration.appMigrationKoinModule
14+
import net.frozendevelopment.openletters.usecase.useCaseKoinModule
15+
import net.frozendevelopment.openletters.util.utilKoinModule
1316
import net.frozendevelopment.openletters.work.AppMigrationWorker
14-
import net.frozendevelopment.openletters.work.WorkKoin
17+
import net.frozendevelopment.openletters.work.workKoinModule
1518
import org.koin.android.ext.koin.androidContext
1619
import org.koin.androidx.workmanager.koin.workManagerFactory
1720
import org.koin.core.component.KoinComponent
1821
import org.koin.core.context.startKoin
19-
import org.koin.ksp.generated.module
2022

2123
class OpenLettersApplication :
2224
Application(),
@@ -28,12 +30,21 @@ class OpenLettersApplication :
2830
androidContext(this@OpenLettersApplication)
2931
workManagerFactory()
3032
modules(
31-
SqlDelightKoin().module,
32-
FeatureKoin().module,
33-
UseCaseKoin().module,
34-
AppMigrationKoin().module,
35-
WorkKoin().module,
36-
UtilKoin().module,
33+
// SqlDelightKoin().module,
34+
sqlDelightKoinModule,
35+
// FeatureKoin().module,
36+
letterKoinModule,
37+
categoryKoinModule,
38+
reminderKoinModule,
39+
settingsKoinModule,
40+
// UseCaseKoin().module,
41+
useCaseKoinModule,
42+
// AppMigrationKoin().module,
43+
appMigrationKoinModule,
44+
// WorkKoin().module,
45+
workKoinModule,
46+
// UtilKoin().module,
47+
utilKoinModule,
3748
)
3849
}
3950

0 commit comments

Comments
 (0)