Skip to content

Commit fcc7775

Browse files
authored
Merge pull request #283 from android/wear
Adds snippet for Wear Navigation page
2 parents 0e33487 + 6da9f02 commit fcc7775

File tree

5 files changed

+145
-1
lines changed

5 files changed

+145
-1
lines changed

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ targetSdk = "34"
4848
version-catalog-update = "0.8.3"
4949
wearComposeFoundation = "1.3.0"
5050
wearComposeMaterial = "1.3.0"
51+
composeUiTooling = "1.3.1"
5152

5253
[libraries]
5354
accompanist-adaptive = { module = "com.google.accompanist:accompanist-adaptive", version.ref = "accompanist" }
@@ -121,6 +122,7 @@ kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.re
121122
kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
122123
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" }
123124
play-services-wearable = { module = "com.google.android.gms:play-services-wearable", version.ref = "playServicesWearable" }
125+
compose-ui-tooling = { group = "androidx.wear.compose", name = "compose-ui-tooling", version.ref = "composeUiTooling" }
124126

125127
[plugins]
126128
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }

wear/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ dependencies {
5454
implementation(composeBom)
5555
androidTestImplementation(composeBom)
5656

57+
implementation(libs.compose.ui.tooling)
5758
implementation(libs.play.services.wearable)
5859
implementation(platform(libs.androidx.compose.bom))
5960
implementation(libs.androidx.compose.ui)

wear/src/main/java/com/example/wear/snippets/MainActivity.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ import android.os.Bundle
2020
import androidx.activity.ComponentActivity
2121
import androidx.activity.compose.setContent
2222
import androidx.compose.runtime.Composable
23+
import com.example.wear.snippets.navigation.navigation
2324
import com.example.wear.snippets.voiceinput.VoiceInputScreen
2425
import com.google.android.horologist.annotations.ExperimentalHorologistApi
26+
import com.google.android.horologist.compose.layout.AppScaffold
2527

2628
class MainActivity : ComponentActivity() {
2729
override fun onCreate(savedInstanceState: Bundle?) {
@@ -39,5 +41,7 @@ class MainActivity : ComponentActivity() {
3941
@OptIn(ExperimentalHorologistApi::class)
4042
@Composable
4143
fun WearApp() {
42-
VoiceInputScreen()
44+
AppScaffold {
45+
navigation()
46+
}
4347
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
/*
2+
* Copyright 2022 The Android Open Source Project
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.example.wear.snippets.navigation
18+
19+
import androidx.compose.foundation.layout.Arrangement
20+
import androidx.compose.foundation.layout.Column
21+
import androidx.compose.foundation.layout.fillMaxSize
22+
import androidx.compose.foundation.layout.padding
23+
import androidx.compose.foundation.rememberScrollState
24+
import androidx.compose.foundation.verticalScroll
25+
import androidx.compose.runtime.Composable
26+
import androidx.compose.ui.Modifier
27+
import androidx.compose.ui.res.stringResource
28+
import androidx.compose.ui.text.style.TextAlign
29+
import androidx.wear.compose.material.Text
30+
import androidx.wear.compose.navigation.SwipeDismissableNavHost
31+
import androidx.wear.compose.navigation.composable
32+
import androidx.wear.compose.navigation.rememberSwipeDismissableNavController
33+
import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices
34+
import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales
35+
import com.example.wear.R
36+
import com.google.android.horologist.annotations.ExperimentalHorologistApi
37+
import com.google.android.horologist.compose.layout.ScalingLazyColumn
38+
import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults
39+
import com.google.android.horologist.compose.layout.ScalingLazyColumnDefaults.ItemType
40+
import com.google.android.horologist.compose.layout.ScreenScaffold
41+
import com.google.android.horologist.compose.layout.rememberResponsiveColumnState
42+
import com.google.android.horologist.compose.material.Chip
43+
import com.google.android.horologist.compose.material.ListHeaderDefaults.firstItemPadding
44+
import com.google.android.horologist.compose.material.ResponsiveListHeader
45+
import com.google.android.horologist.compose.rotaryinput.rotaryWithScroll
46+
47+
@Composable
48+
fun navigation() {
49+
// [START android_wear_navigation]
50+
val navController = rememberSwipeDismissableNavController()
51+
SwipeDismissableNavHost(
52+
navController = navController,
53+
startDestination = "message_list"
54+
) {
55+
composable("message_list") {
56+
MessageList(onMessageClick = { id ->
57+
navController.navigate("message_detail/$id")
58+
})
59+
}
60+
composable("message_detail/{id}") {
61+
MessageDetail(id = it.arguments?.getString("id")!!)
62+
}
63+
}
64+
// [END android_wear_navigation]
65+
}
66+
67+
@OptIn(ExperimentalHorologistApi::class)
68+
@Composable
69+
fun MessageDetail(id: String){
70+
val scrollState = rememberScrollState()
71+
72+
ScreenScaffold(scrollState = scrollState) {
73+
val padding = ScalingLazyColumnDefaults.padding(
74+
first = ItemType.Text,
75+
last = ItemType.Text
76+
)()
77+
Column(
78+
modifier = Modifier
79+
.fillMaxSize()
80+
.verticalScroll(scrollState)
81+
.rotaryWithScroll(scrollState)
82+
.padding(padding),
83+
verticalArrangement = Arrangement.Center
84+
) {
85+
Text(text= id,
86+
textAlign = TextAlign.Center,
87+
modifier = Modifier.fillMaxSize())
88+
}
89+
}
90+
}
91+
92+
@OptIn(ExperimentalHorologistApi::class)
93+
@Composable
94+
fun MessageList(onMessageClick: (String) -> Unit){
95+
val columnState = rememberResponsiveColumnState(
96+
contentPadding = ScalingLazyColumnDefaults.padding(
97+
first = ItemType.Text,
98+
last = ItemType.Chip
99+
)
100+
)
101+
102+
ScreenScaffold(scrollState = columnState) {
103+
ScalingLazyColumn(
104+
columnState = columnState,
105+
modifier = Modifier
106+
.fillMaxSize()
107+
) {
108+
item {
109+
ResponsiveListHeader(contentPadding = firstItemPadding()) {
110+
Text(text = stringResource(R.string.message_list))
111+
}
112+
}
113+
item {
114+
Chip(label = "Message 1", onClick = { onMessageClick("message1")})
115+
}
116+
item {
117+
Chip(label = "Message 2", onClick = { onMessageClick("message2")})
118+
}
119+
}
120+
}
121+
}
122+
123+
@WearPreviewDevices
124+
@WearPreviewFontScales
125+
@Composable
126+
fun MessageDetailPreview() {
127+
MessageDetail("test")
128+
}
129+
130+
@WearPreviewDevices
131+
@WearPreviewFontScales
132+
@Composable
133+
fun MessageListPreview() {
134+
MessageList(onMessageClick = {})
135+
}
136+

wear/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
<string name="app_name">Wear Snippets</string>
33
<string name="voice_text_entry_label">Voice Input</string>
44
<string name="voice_input_label">Voice Text Entry</string>
5+
<string name="message_list">Message List</string>
56
</resources>

0 commit comments

Comments
 (0)