@@ -15,20 +15,31 @@ import androidx.compose.foundation.layout.statusBarsPadding
1515import androidx.compose.foundation.layout.windowInsetsPadding
1616import androidx.compose.material3.DrawerValue
1717import androidx.compose.material3.Scaffold
18+ import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
1819import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
20+ import androidx.compose.material3.adaptive.layout.calculatePaneScaffoldDirective
21+ import androidx.compose.material3.adaptive.navigation.BackNavigationBehavior
22+ import androidx.compose.material3.adaptive.navigation3.rememberSupportingPaneSceneStrategy
1923import androidx.compose.material3.rememberDrawerState
2024import androidx.compose.runtime.CompositionLocalProvider
2125import androidx.compose.runtime.getValue
2226import androidx.compose.runtime.remember
2327import androidx.compose.runtime.rememberCoroutineScope
2428import androidx.compose.ui.Modifier
29+ import androidx.compose.ui.unit.dp
2530import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
2631import androidx.lifecycle.compose.collectAsStateWithLifecycle
32+ import androidx.navigation3.runtime.NavKey
2733import androidx.navigation3.runtime.entryProvider
34+ import androidx.navigation3.scene.SceneStrategy
35+ import androidx.navigation3.scene.SinglePaneSceneStrategy
2836import androidx.navigation3.ui.NavDisplay
37+ import androidx.window.core.layout.WindowSizeClass.Companion.WIDTH_DP_MEDIUM_LOWER_BOUND
2938import androidx.window.core.layout.WindowWidthSizeClass
3039import kotlinx.coroutines.launch
3140import net.frozendevelopment.openletters.data.sqldelight.LetterQueries
41+ import net.frozendevelopment.openletters.extensions.EntryProvider
42+ import net.frozendevelopment.openletters.extensions.koinEntryProvider
3243import net.frozendevelopment.openletters.feature.category.form.CategoryFormDestination
3344import net.frozendevelopment.openletters.feature.category.manage.ManageCategoryDestination
3445import net.frozendevelopment.openletters.feature.letter.list.LetterListDestination
@@ -37,13 +48,12 @@ import net.frozendevelopment.openletters.feature.reminder.list.ReminderListDesti
3748import net.frozendevelopment.openletters.feature.settings.SettingsDestination
3849import net.frozendevelopment.openletters.ui.animation.popTransitionSpec
3950import net.frozendevelopment.openletters.ui.animation.pushTransitionSpec
40- import net.frozendevelopment.openletters.ui.navigation.EntryProvider
4151import net.frozendevelopment.openletters.ui.navigation.LettersNavDrawer
4252import net.frozendevelopment.openletters.ui.navigation.LocalDrawerState
4353import net.frozendevelopment.openletters.ui.navigation.LocalNavigationState
4454import net.frozendevelopment.openletters.ui.navigation.LocalNavigator
4555import net.frozendevelopment.openletters.ui.navigation.Navigator
46- import net.frozendevelopment.openletters.ui.navigation.koinEntryProvider
56+ import net.frozendevelopment.openletters.ui.navigation.rememberListDetailSceneStrategy
4757import net.frozendevelopment.openletters.ui.navigation.rememberNavigationState
4858import net.frozendevelopment.openletters.ui.navigation.toEntries
4959import net.frozendevelopment.openletters.ui.theme.OpenLettersTheme
@@ -55,7 +65,7 @@ class MainActivity : ComponentActivity() {
5565 private val themeManager: ThemeManagerType by inject()
5666 private val letterQueries: LetterQueries by inject()
5767
58- @OptIn(KoinExperimentalAPI ::class )
68+ @OptIn(KoinExperimentalAPI ::class , ExperimentalMaterial3AdaptiveApi :: class , ExperimentalMaterial3AdaptiveApi :: class )
5969 override fun onCreate (savedInstanceState : Bundle ? ) {
6070 installSplashScreen()
6171
@@ -65,28 +75,39 @@ class MainActivity : ComponentActivity() {
6575
6676 setContent {
6777 val currentTheme by themeManager.current.collectAsStateWithLifecycle()
78+ val listDetailSceneStrategy = rememberListDetailSceneStrategy<NavKey >()
79+
80+ val coroutineScope = rememberCoroutineScope()
81+ val drawerState = rememberDrawerState(DrawerValue .Closed )
82+ val navigationState = rememberNavigationState(
83+ LetterListDestination ,
84+ setOf (
85+ LetterListDestination ,
86+ ManageCategoryDestination ,
87+ ReminderListDestination ,
88+ ),
89+ )
90+ val navigator = remember { Navigator (navigationState) }
91+ val entryProvider: EntryProvider = koinEntryProvider()
92+
93+ val windowAdaptiveInfo = currentWindowAdaptiveInfo()
94+ val directive = remember(windowAdaptiveInfo) {
95+ calculatePaneScaffoldDirective(windowAdaptiveInfo)
96+ .copy(horizontalPartitionSpacerSize = 0 .dp, verticalPartitionSpacerSize = 0 .dp)
97+ }
98+
99+ // Override the defaults so that the supporting pane can be dismissed by pressing back.
100+ // See b/445826749
101+ val supportingPaneStrategy = rememberSupportingPaneSceneStrategy<NavKey >(
102+ backNavigationBehavior = BackNavigationBehavior .PopUntilCurrentDestinationChange ,
103+ directive = directive
104+ )
105+
68106
69107 OpenLettersTheme (
70108 appTheme = currentTheme.first,
71109 colorPalette = currentTheme.second,
72110 ) {
73- val coroutineScope = rememberCoroutineScope()
74- val drawerState = rememberDrawerState(DrawerValue .Closed )
75- val navigationState = rememberNavigationState(
76- LetterListDestination ,
77- setOf (
78- LetterListDestination ,
79- ManageCategoryDestination ,
80- ReminderListDestination ,
81- ),
82- )
83- val navigator = remember { Navigator (navigationState) }
84- val entryProvider: EntryProvider = koinEntryProvider()
85-
86- // lock the app to portrait for phone users
87- if (currentWindowAdaptiveInfo().windowSizeClass.windowWidthSizeClass == WindowWidthSizeClass .COMPACT ) {
88- requestedOrientation = ActivityInfo .SCREEN_ORIENTATION_PORTRAIT
89- }
90111
91112 LettersNavDrawer (
92113 drawerState = drawerState,
@@ -134,10 +155,7 @@ class MainActivity : ComponentActivity() {
134155 ) {
135156 NavDisplay (
136157 entries = navigationState.toEntries(entryProvider),
137- // entryDecorators = listOf(
138- // rememberSaveableStateHolderNavEntryDecorator(),
139- // rememberViewModelStoreNavEntryDecorator()
140- // ),
158+ sceneStrategy = supportingPaneStrategy,
141159 onBack = { navigator.pop() },
142160 transitionSpec = { pushTransitionSpec() },
143161 popTransitionSpec = { popTransitionSpec() },
0 commit comments