-
Notifications
You must be signed in to change notification settings - Fork 1
/
MainActivity.kt
145 lines (135 loc) · 5.67 KB
/
MainActivity.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package dev.funkymuse.fosho.sample
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.CornerSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController
import com.google.accompanist.navigation.material.BottomSheetNavigator
import com.google.accompanist.navigation.material.ModalBottomSheetLayout
import com.google.accompanist.navigation.material.rememberBottomSheetNavigator
import dagger.hilt.android.AndroidEntryPoint
import dev.funkymuse.fosho.navigator.android.GraphFactory
import dev.funkymuse.fosho.navigator.android.LocalNavHostController
import dev.funkymuse.fosho.navigator.android.addGraphs
import dev.funkymuse.fosho.navigator.android.navigator.NavHostControllerEvents
import dev.funkymuse.fosho.navigator.android.navigator.NavigatorDirections
import dev.funkymuse.fosho.navigator.android.navigator.impl.Navigator
import dev.funkymuse.fosho.navigator.android.wrapped.hideBottomNavigation
import dev.funkymuse.fosho.sample.bottom_navigation.BottomNavigation
import dev.funkymuse.fosho.sample.bottom_navigation.BottomNavigationEntry
import dev.funkymuse.fosho.sample.theme.FoShoLibThemeSurface
import kotlinx.collections.immutable.ImmutableList
import javax.inject.Inject
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
@Inject
lateinit var topDestinationsProvider: TopDestinationsProvider
override fun onCreate(savedInstanceState: Bundle?) {
if (savedInstanceState == null) {
installSplashScreen()
}
super.onCreate(savedInstanceState)
setContent {
FoShoLibThemeSurface {
AppScaffold(
startingDestination = topDestinationsProvider.getStartingDestination(),
showAnimations = true,
navigatorDirections = Navigator,
bottomNavigationEntries = topDestinationsProvider.bottomNavigationEntries
)
}
}
}
}
@Composable
private fun AppScaffold(
startingDestination: String,
showAnimations: Boolean,
navigatorDirections: NavigatorDirections,
bottomNavigationEntries: ImmutableList<BottomNavigationEntry>,
) {
val bottomSheetNavigator: BottomSheetNavigator = rememberBottomSheetNavigator()
val navController: NavHostController = rememberNavController(bottomSheetNavigator)
val navBackStackEntry: NavBackStackEntry? by navController.currentBackStackEntryFlow.collectAsStateWithLifecycle(
null
)
val showBottomNav: Boolean by remember {
derivedStateOf { !navBackStackEntry.hideBottomNavigation }
}
val currentRoute by remember {
derivedStateOf { navBackStackEntry?.destination?.route }
}
LaunchedEffect(currentRoute) {
Log.d(
"Current destination",
"${navBackStackEntry?.destination} with arguments ${navBackStackEntry?.arguments}",
)
}
CompositionLocalProvider(LocalNavHostController provides navController) {
ModalBottomSheetLayout(
modifier = Modifier.fillMaxSize(),
bottomSheetNavigator = bottomSheetNavigator,
sheetShape = MaterialTheme.shapes.large.copy(
topStart = CornerSize(16.dp),
topEnd = CornerSize(16.dp)
),
sheetElevation = 0.dp,
sheetBackgroundColor = MaterialTheme.colorScheme.background
) {
Scaffold(
modifier = Modifier.fillMaxSize(),
) { paddingValues ->
Box(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues),
) {
NavHost(
navController = navController,
startDestination = startingDestination,
enterTransition = { fadeIn() },
exitTransition = { fadeOut() },
) {
addGraphs(
navigationGraphs = GraphFactory.graphs,
showAnimations = showAnimations
)
}
BottomNavigation(
bottomEntries = bottomNavigationEntries,
modifier = Modifier.align(Alignment.BottomStart),
showBottomNav = showBottomNav,
navBackStackEntry = navBackStackEntry,
onTopLevelClick = Navigator::navigateTopLevel
)
}
}
}
}
NavHostControllerEvents(
navigator = navigatorDirections,
navController = navController,
)
}