1+ package live.ditto.dittotoolsviewer.presentation
2+
3+ import androidx.compose.foundation.layout.PaddingValues
4+ import androidx.compose.foundation.layout.padding
5+ import androidx.compose.material.icons.Icons
6+ import androidx.compose.material.icons.filled.Build
7+ import androidx.compose.material3.BottomAppBar
8+ import androidx.compose.material3.Button
9+ import androidx.compose.material3.ExtendedFloatingActionButton
10+ import androidx.compose.material3.Icon
11+ import androidx.compose.material3.Scaffold
12+ import androidx.compose.material3.Text
13+ import androidx.compose.runtime.Composable
14+ import androidx.compose.ui.Modifier
15+ import androidx.compose.ui.res.stringResource
16+ import androidx.compose.ui.tooling.preview.Preview
17+ import androidx.navigation.NavHostController
18+ import androidx.navigation.compose.NavHost
19+ import androidx.navigation.compose.composable
20+ import androidx.navigation.compose.rememberNavController
21+ import ditto.live.dittopresenceviewer.DittoPresenceViewer
22+ import live.ditto.Ditto
23+ import live.ditto.dittodatabrowser.DittoDataBrowser
24+ import live.ditto.dittodiskusage.DittoDiskUsage
25+ import live.ditto.dittoexportlogs.ExportLogs
26+ import live.ditto.dittotoolsviewer.R
27+ import live.ditto.dittotoolsviewer.presentation.navigation.Screens
28+ import live.ditto.dittotoolsviewer.presentation.viewmodel.ToolsViewerViewModel
29+ import live.ditto.health.HealthScreen
30+ import live.ditto.presencedegradationreporter.PresenceDegradationReporterScreen
31+
32+ /* *
33+ * A Composable that you can include in your app that will give a single entry point for all Ditto
34+ * Tools.
35+ *
36+ * @param modifier an optional modifier if you need to adjust the layout to fit the view
37+ * @param ditto your instance of [Ditto] that is required
38+ * @param onExitTools an optional lambda function that will be called whenever a user taps the
39+ * "Exit Tools" button. Use this to do any back navigation or dismissal/hiding of the Tools Viewer
40+ */
41+ @Composable
42+ fun DittoToolsViewer (
43+ modifier : Modifier = Modifier ,
44+ ditto : Ditto ,
45+ onExitTools : () -> Unit = { }
46+ ) {
47+ DittoToolsViewerScaffold (
48+ modifier = modifier,
49+ ditto = ditto,
50+ onExitTools = onExitTools
51+ )
52+ }
53+
54+ @Composable
55+ private fun DittoToolsViewerScaffold (
56+ modifier : Modifier ,
57+ ditto : Ditto ,
58+ onExitTools : () -> Unit ,
59+ viewModel : ToolsViewerViewModel = ToolsViewerViewModel ()
60+ ) {
61+
62+ val navController = rememberNavController()
63+
64+ Scaffold (
65+ modifier = modifier,
66+ bottomBar = {
67+ BottomAppBar (
68+ actions = {
69+ Button (onClick = { onExitTools() }) {
70+ Text (text = " Exit Tools" )
71+ }
72+ },
73+ floatingActionButton = {
74+ MenuFloatingActionButton {
75+ if (navController.currentDestination?.route != Screens .MainScreen .route) {
76+ navController.popBackStack()
77+ }
78+ }
79+ }
80+ )
81+ }
82+ ) { contentPadding ->
83+ ToolsViewerContent (
84+ navController = navController,
85+ viewModel = viewModel,
86+ contentPadding = contentPadding,
87+ ditto = ditto
88+ )
89+ }
90+ }
91+
92+ @Composable
93+ private fun ToolsViewerContent (
94+ navController : NavHostController ,
95+ viewModel : ToolsViewerViewModel ,
96+ contentPadding : PaddingValues ,
97+ ditto : Ditto ,
98+ ) {
99+ ToolsViewerNavHost (
100+ navController = navController,
101+ contentPadding = contentPadding,
102+ ditto = ditto,
103+ toolMenuItems = viewModel.toolsMenuItems()
104+ )
105+ }
106+
107+ @Composable
108+ private fun ToolsViewerNavHost (
109+ navController : NavHostController ,
110+ contentPadding : PaddingValues ,
111+ ditto : Ditto ,
112+ toolMenuItems : List <ToolMenuItem >
113+ ) {
114+ NavHost (
115+ modifier = Modifier .padding(contentPadding),
116+ navController = navController,
117+ startDestination = Screens .MainScreen .route,
118+ ) {
119+ composable(Screens .MainScreen .route) {
120+ ToolsMenu (
121+ navController = navController,
122+ menuItems = toolMenuItems,
123+ )
124+ }
125+ composable(Screens .PresenceViewerScreen .route) {
126+ DittoPresenceViewer (ditto = ditto)
127+ }
128+ composable(Screens .DataBrowserScreen .route) {
129+ DittoDataBrowser (ditto = ditto)
130+ }
131+ composable(Screens .ExportLogsScreen .route) {
132+ ExportLogs (
133+ onDismiss = {
134+ navController.popBackStack()
135+ }
136+ )
137+ }
138+ composable(Screens .DiskUsageScreen .route) {
139+ DittoDiskUsage (ditto = ditto)
140+ }
141+ composable(Screens .HealthScreen .route) {
142+ HealthScreen ()
143+ }
144+ composable(Screens .HeartbeatScreen .route) {
145+ HeartbeatScreen (ditto = ditto)
146+ }
147+ composable(Screens .PresenceDegradationReporterScreen .route) {
148+ PresenceDegradationReporterScreen (ditto = ditto)
149+ }
150+ }
151+ }
152+
153+ @Composable
154+ private fun MenuFloatingActionButton (onClick : () -> Unit ) {
155+ ExtendedFloatingActionButton (
156+ onClick = { onClick() },
157+ icon = { Icon (Icons .Filled .Build , stringResource(R .string.tools_menu_content_description)) },
158+ text = { Text (text = stringResource(R .string.tools_menu)) }
159+ )
160+ }
161+
162+ @Preview
163+ @Composable
164+ private fun MenuFloatingActionButtonPreview () {
165+ MenuFloatingActionButton (
166+ onClick = { }
167+ )
168+ }
0 commit comments