[go: nahoru, domu]

Add samples for popUpTo and singleTop

Adding samples for the new NavOptions feature.

Test: tested in demo app
Bug: 171468994
Change-Id: Ibff40345ca8562549d8580b9b04b0955035fba1c
diff --git a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavPopUpToDemo.kt b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavPopUpToDemo.kt
new file mode 100644
index 0000000..fd00b02
--- /dev/null
+++ b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavPopUpToDemo.kt
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.navigation.compose.demos
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material.Button
+import androidx.compose.material.ButtonConstants
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
+import androidx.navigation.NavController
+import androidx.navigation.compose.NavHost
+import androidx.navigation.compose.composable
+import androidx.navigation.compose.navigate
+import androidx.navigation.compose.popUpTo
+import androidx.navigation.compose.rememberNavController
+
+@Composable
+fun NavPopUpToDemo() {
+    val navController = rememberNavController()
+    NavHost(navController, startDestination = "1") {
+        composable("1") { NumberedScreen(navController, 1) }
+        composable("2") { NumberedScreen(navController, 2) }
+        composable("3") { NumberedScreen(navController, 3) }
+        composable("4") { NumberedScreen(navController, 4) }
+        composable("5") { NumberedScreen(navController, 5) }
+    }
+}
+
+@Composable
+fun NumberedScreen(navController: NavController, number: Int) {
+    Column(Modifier.fillMaxSize().then(Modifier.padding(8.dp))) {
+        val next = number + 1
+        if (number < 5) {
+            Button(
+                 navController.navigate("$next") },
+                colors = ButtonConstants.defaultButtonColors(backgroundColor = Color.LightGray),
+                modifier = Modifier.fillMaxWidth()
+            ) {
+                Text(text = "Navigate to Screen $next")
+            }
+        }
+        Text("This is screen $number", Modifier.weight(1f))
+        if (navController.previousBackStackEntry != null) {
+            Button(
+                 navController.navigate("1") { popUpTo("1") { inclusive = true } } },
+                colors = ButtonConstants.defaultButtonColors(backgroundColor = Color.LightGray),
+                modifier = Modifier.fillMaxWidth()
+            ) {
+                Text(text = "PopUpTo Screen 1")
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavSingleTopDemo.kt b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavSingleTopDemo.kt
new file mode 100644
index 0000000..05f2abc
--- /dev/null
+++ b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavSingleTopDemo.kt
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.navigation.compose.demos
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material.Divider
+import androidx.compose.material.Text
+import androidx.compose.material.TextField
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.savedinstancestate.savedInstanceState
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.ui.unit.dp
+import androidx.navigation.compose.NavHost
+import androidx.navigation.compose.composable
+import androidx.navigation.compose.navigate
+import androidx.navigation.compose.rememberNavController
+import androidx.navigation.compose.samples.NavigateButton
+
+@Composable
+fun NavSingleTopDemo() {
+    val navController = rememberNavController()
+    val query = savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }
+    Column(Modifier.fillMaxSize().then(Modifier.padding(8.dp))) {
+        TextField(
+            value = query.value,
+             query.value = it },
+            placeholder = { Text("Search") }
+        )
+        NavigateButton("Search") {
+            navController.navigate("search/" + query.value.text) {
+                launchSingleTop = true
+            }
+        }
+        NavHost(navController, startDestination = "start") {
+            composable("start") { StartScreen() }
+            composable("search/{query}") { backStackEntry ->
+                SearchResultScreen(
+                    backStackEntry.arguments!!.getString("query", "no query entered")
+                )
+            }
+        }
+    }
+}
+
+@Composable
+fun StartScreen() {
+    Divider(color = Color.Black)
+    Text(text = "Start a search above")
+}
+
+@Composable
+fun SearchResultScreen(query: String) {
+    Text("You searched for $query")
+}
diff --git a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavigationDemos.kt b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavigationDemos.kt
index 8c8b507..3e8b40e 100644
--- a/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavigationDemos.kt
+++ b/navigation/navigation-compose/integration-tests/navigation-demos/src/main/java/androidx/navigation/compose/demos/NavigationDemos.kt
@@ -25,6 +25,8 @@
         ComposableDemo("Basic Nav Demo") { BasicNavDemo() },
         ComposableDemo("Bottom Bar Nav Demo") { BottomBarNavDemo() },
         ComposableDemo("Navigation with Args") { NavWithArgsDemo() },
-        ComposableDemo("Navigation by DeepLink") { NavByDeepLinkDemo() }
+        ComposableDemo("Navigation by DeepLink") { NavByDeepLinkDemo() },
+        ComposableDemo("Navigation PopUpTo") { NavPopUpToDemo() },
+        ComposableDemo("Navigation SingleTop") { NavSingleTopDemo() }
     )
 )