Skip to content

Commit d480c57

Browse files
authored
Merge pull request #14 from NordicPlayground/dialog-navigation
Dialog navigation
2 parents 796dc47 + 458af99 commit d480c57

File tree

6 files changed

+74
-11
lines changed

6 files changed

+74
-11
lines changed

app/src/main/java/no/nordicsemi/android/common/test/MainActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ class MainActivity : NordicActivity() {
158158
topBar = {
159159
NordicAppBar(
160160
text = stringResource(id = R.string.title_main),
161-
showBackButton = listOf(Hello, Scanner).contains(currentDestination),
161+
showBackButton = listOf(Hello, HelloDialog, Scanner).contains(currentDestination),
162162
onNavigationButtonClick = { navigator.navigateUp() },
163163
onHamburgerButtonClick = {
164164
scope.launch { drawerState.open() }

app/src/main/java/no/nordicsemi/android/common/test/main/Main.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import no.nordicsemi.android.common.navigation.createSimpleDestination
77
import no.nordicsemi.android.common.navigation.defineDestination
88
import no.nordicsemi.android.common.test.main.page.*
99
import no.nordicsemi.android.common.test.scanner.ScannerDestination
10-
import no.nordicsemi.android.common.test.simple.HelloDestination
10+
import no.nordicsemi.android.common.test.simple.HelloDestinations
1111
import no.nordicsemi.android.common.theme.view.PagerView
1212
import no.nordicsemi.android.common.theme.view.PagerViewEntity
1313

@@ -21,7 +21,7 @@ private val MainDestination = defineDestination(Main) {
2121
MainScreen()
2222
}
2323

24-
val MainDestinations = MainDestination + ScannerDestination + HelloDestination
24+
val MainDestinations = MainDestination + ScannerDestination + HelloDestinations
2525

2626
@Composable
2727
private fun MainScreen() {

app/src/main/java/no/nordicsemi/android/common/test/simple/Hello.kt

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package no.nordicsemi.android.common.test.simple
22

3-
import androidx.compose.foundation.layout.*
3+
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.foundation.layout.fillMaxSize
6+
import androidx.compose.foundation.layout.fillMaxWidth
7+
import androidx.compose.material3.AlertDialog
48
import androidx.compose.material3.Button
5-
import androidx.compose.material3.ExperimentalMaterial3Api
69
import androidx.compose.material3.Text
710
import androidx.compose.runtime.Composable
811
import androidx.compose.ui.Alignment
@@ -13,10 +16,10 @@ import androidx.compose.ui.unit.dp
1316
import androidx.hilt.navigation.compose.hiltViewModel
1417
import no.nordicsemi.android.common.navigation.createDestination
1518
import no.nordicsemi.android.common.navigation.defineDestination
19+
import no.nordicsemi.android.common.navigation.defineDialogDestination
1620
import no.nordicsemi.android.common.navigation.viewmodel.SimpleNavigationViewModel
1721
import no.nordicsemi.android.common.test.R
1822
import no.nordicsemi.android.common.theme.NordicTheme
19-
import no.nordicsemi.android.common.theme.view.NordicAppBar
2023

2124
/**
2225
* This is an example of a simple destination.
@@ -25,19 +28,43 @@ import no.nordicsemi.android.common.theme.view.NordicAppBar
2528
*/
2629
val Hello = createDestination<Int, Unit>("hello")
2730

28-
val HelloDestination = defineDestination(Hello) {
31+
private val HelloDestination = defineDestination(Hello) {
2932
val vm: SimpleNavigationViewModel = hiltViewModel()
3033
val param = vm.parameterOf(Hello)
3134

3235
HelloScreen(
3336
param = param,
37+
onShowDialog = { vm.navigateTo(HelloDialog, "Hello World!") },
3438
modifier = Modifier.fillMaxWidth(),
3539
)
3640
}
3741

42+
val HelloDialog = createDestination<String, Unit>("hello-dialog")
43+
44+
private val HelloDialogDestination = defineDialogDestination(HelloDialog) {
45+
val vm: SimpleNavigationViewModel = hiltViewModel()
46+
val param = vm.parameterOf(HelloDialog)
47+
48+
// This should not be AlertDialog, but AlertDialogContent. This is already wrapped in Dialog.
49+
// Unfortunately, the AlertDialogContent is internal.
50+
AlertDialog(
51+
onDismissRequest = { vm.navigateUp() },
52+
title = { Text(text = param) },
53+
text = { Text(text = "This is a dialog.") },
54+
confirmButton = {
55+
Button(onClick = { vm.navigateUp() }) {
56+
Text(text = "OK")
57+
}
58+
},
59+
)
60+
}
61+
62+
val HelloDestinations = HelloDestination + HelloDialogDestination
63+
3864
@Composable
3965
private fun HelloScreen(
4066
param: Int,
67+
onShowDialog: () -> Unit,
4168
modifier: Modifier = Modifier,
4269
) {
4370
Column(
@@ -52,7 +79,7 @@ private fun HelloScreen(
5279

5380
Text(text = stringResource(id = R.string.hello_param, param))
5481

55-
Button(onClick = { }) {
82+
Button(onClick = onShowDialog) {
5683
Text(text = stringResource(id = R.string.action_dialog))
5784
}
5885
}
@@ -65,6 +92,7 @@ private fun SimpleContentPreview() {
6592
NordicTheme {
6693
HelloScreen(
6794
param = 0,
95+
onShowDialog = {},
6896
)
6997
}
7098
}

app/src/main/java/no/nordicsemi/android/common/test/tab/Second.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import no.nordicsemi.android.common.navigation.defineDestination
1717
import no.nordicsemi.android.common.navigation.viewmodel.SimpleNavigationViewModel
1818
import no.nordicsemi.android.common.test.R
1919
import no.nordicsemi.android.common.test.simple.Hello
20-
import no.nordicsemi.android.common.test.simple.HelloDestination
20+
import no.nordicsemi.android.common.test.simple.HelloDestinations
2121
import no.nordicsemi.android.common.theme.NordicTheme
2222

2323
val Second = createSimpleDestination("second")
@@ -30,7 +30,7 @@ private val SecondDestination = defineDestination(Second) {
3030
)
3131
}
3232

33-
val SecondDestinations = SecondDestination + HelloDestination
33+
val SecondDestinations = SecondDestination + HelloDestinations
3434

3535
@Composable
3636
private fun SecondScreen(

navigation/src/main/java/no/nordicsemi/android/common/navigation/NavigationDestination.kt

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
package no.nordicsemi.android.common.navigation
3535

3636
import androidx.compose.runtime.Composable
37+
import androidx.compose.ui.window.DialogProperties
3738

3839
/**
3940
* A navigation view allows navigating between different destinations.
@@ -73,6 +74,21 @@ internal class InnerNavigationDestination(
7374
val destinations: List<NavigationDestination>,
7475
): NavigationDestination(id)
7576

77+
/**
78+
* Definition of a dialog destination.
79+
*
80+
* This class binds a destination identifier with a composable function that will be used to
81+
* render the content.
82+
*
83+
* @property id The destination identifier.
84+
* @property content The composable function that will be used to render the content.
85+
*/
86+
internal class DialogDestination(
87+
id: DestinationId<*, *>,
88+
val dialogProperties: DialogProperties = DialogProperties(),
89+
val content: @Composable () -> Unit,
90+
): NavigationDestination(id)
91+
7692
/**
7793
* Helper method for creating a composable [NavigationDestination].
7894
*/
@@ -94,4 +110,13 @@ fun defineDestinationWithInnerNavigation(
94110
*/
95111
infix fun DestinationId<*, *>.with(destinations: List<NavigationDestination>): NavigationDestination {
96112
return defineDestinationWithInnerNavigation(this, destinations)
97-
}
113+
}
114+
115+
/**
116+
* Helper method for creating a dialog [NavigationDestination].
117+
*/
118+
fun defineDialogDestination(
119+
id: DestinationId<*, *>,
120+
dialogProperties: DialogProperties = DialogProperties(),
121+
content: @Composable () -> Unit,
122+
): NavigationDestination = DialogDestination(id, dialogProperties, content)

navigation/src/main/java/no/nordicsemi/android/common/navigation/NavigationView.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import androidx.navigation.NavGraph.Companion.findStartDestination
4444
import androidx.navigation.NavGraphBuilder
4545
import androidx.navigation.compose.NavHost
4646
import androidx.navigation.compose.composable
47+
import androidx.navigation.compose.dialog
4748
import androidx.navigation.compose.rememberNavController
4849
import androidx.navigation.navigation
4950
import no.nordicsemi.android.common.navigation.internal.NavigationManager.Event
@@ -145,6 +146,15 @@ private fun NavGraphBuilder.create(
145146
create(destination.destinations, navigation)
146147
}
147148
}
149+
is DialogDestination -> {
150+
dialog(
151+
route = destination.id.name,
152+
dialogProperties = destination.dialogProperties,
153+
) {
154+
navigation.use(it.savedStateHandle)
155+
destination.content()
156+
}
157+
}
148158
}
149159
}
150160
}

0 commit comments

Comments
 (0)