Skip to content

Commit 0fc880e

Browse files
committed
Update Rotary snippet to M3, uses M3 scroll indicator
Change-Id: I7e3810b633ab4e54db26d5771b44558941c61333
1 parent e508fb7 commit 0fc880e

File tree

1 file changed

+30
-81
lines changed
  • wear/src/main/java/com.example.wear.snippets.m3/rotary

1 file changed

+30
-81
lines changed

wear/src/main/java/com.example.wear.snippets.m3/rotary/Rotary.kt

Lines changed: 30 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -37,76 +37,32 @@ import androidx.compose.runtime.remember
3737
import androidx.compose.runtime.rememberCoroutineScope
3838
import androidx.compose.runtime.setValue
3939
import androidx.compose.ui.Alignment
40-
import androidx.compose.ui.ExperimentalComposeUiApi
4140
import androidx.compose.ui.Modifier
4241
import androidx.compose.ui.focus.FocusRequester
4342
import androidx.compose.ui.focus.focusRequester
4443
import androidx.compose.ui.input.pointer.pointerInteropFilter
4544
import androidx.compose.ui.input.rotary.onRotaryScrollEvent
4645
import androidx.compose.ui.unit.dp
47-
import androidx.wear.compose.foundation.ExperimentalWearFoundationApi
4846
import androidx.wear.compose.foundation.lazy.ScalingLazyColumn
4947
import androidx.wear.compose.foundation.lazy.ScalingLazyColumnDefaults
5048
import androidx.wear.compose.foundation.lazy.rememberScalingLazyListState
51-
import androidx.wear.compose.foundation.rememberActiveFocusRequester
52-
import androidx.wear.compose.material.Chip
53-
import androidx.wear.compose.material.ChipDefaults
54-
import androidx.wear.compose.material.ListHeader
55-
import androidx.wear.compose.material.MaterialTheme
56-
import androidx.wear.compose.material.Picker
57-
import androidx.wear.compose.material.PositionIndicator
58-
import androidx.wear.compose.material.Scaffold
59-
import androidx.wear.compose.material.Text
60-
import androidx.wear.compose.material.rememberPickerState
49+
import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState
50+
import androidx.wear.compose.material3.Button
51+
import androidx.wear.compose.material3.ListHeader
52+
import androidx.wear.compose.material3.MaterialTheme
53+
import androidx.wear.compose.material3.Picker
54+
import androidx.wear.compose.material3.ButtonDefaults
55+
import androidx.wear.compose.material3.ScreenScaffold
56+
import androidx.wear.compose.material3.ScrollIndicator
57+
import androidx.wear.compose.material3.Text
58+
import androidx.wear.compose.material3.rememberPickerState
6159
import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices
6260
import androidx.wear.compose.ui.tooling.preview.WearPreviewFontScales
6361
import kotlinx.coroutines.launch
6462

65-
@OptIn(ExperimentalWearFoundationApi::class)
66-
@Composable
67-
fun ScrollableScreen() {
68-
// This sample doesn't add a Time Text at the top of the screen.
69-
// If using Time Text, add padding to ensure content does not overlap with Time Text.
70-
// [START android_wear_rotary_input]
71-
val listState = rememberScalingLazyListState()
72-
Scaffold(
73-
positionIndicator = {
74-
PositionIndicator(scalingLazyListState = listState)
75-
}
76-
) {
77-
78-
val focusRequester = rememberActiveFocusRequester()
79-
val coroutineScope = rememberCoroutineScope()
80-
81-
ScalingLazyColumn(
82-
modifier = Modifier
83-
.onRotaryScrollEvent {
84-
coroutineScope.launch {
85-
listState.scrollBy(it.verticalScrollPixels)
86-
listState.animateScrollBy(0f)
87-
}
88-
true
89-
}
90-
.focusRequester(focusRequester)
91-
.focusable()
92-
.fillMaxSize(),
93-
state = listState
94-
) {
95-
// Content goes here
96-
// [START_EXCLUDE]
97-
items(count = 5) {
98-
Chip(onClick = { }, label = { Text("Item #$it") })
99-
}
100-
// [END_EXCLUDE]
101-
}
102-
}
103-
// [END android_wear_rotary_input]
104-
}
105-
106-
@OptIn(ExperimentalComposeUiApi::class)
10763
@Composable
10864
fun TimePicker() {
109-
val textStyle = MaterialTheme.typography.display1
65+
val textStyle = MaterialTheme.typography.displayMedium
11066

11167
// [START android_wear_rotary_input_picker]
11268
var selectedColumn by remember { mutableIntStateOf(0) }
@@ -120,8 +76,8 @@ fun TimePicker() {
12076
fun Option(column: Int, text: String) = Box(modifier = Modifier.fillMaxSize()) {
12177
Text(
12278
text = text, style = textStyle,
123-
color = if (selectedColumn == column) MaterialTheme.colors.secondary
124-
else MaterialTheme.colors.onBackground,
79+
color = if (selectedColumn == column) MaterialTheme.colorScheme.secondary
80+
else MaterialTheme.colorScheme.onBackground,
12581
modifier = Modifier
12682
.pointerInteropFilter {
12783
if (it.action == MotionEvent.ACTION_DOWN) selectedColumn = column
@@ -130,7 +86,7 @@ fun TimePicker() {
13086
)
13187
}
13288
// [END_EXCLUDE]
133-
Scaffold(modifier = Modifier.fillMaxSize()) {
89+
ScreenScaffold(modifier = Modifier.fillMaxSize()) {
13490
Row(
13591
// [START_EXCLUDE]
13692
modifier = Modifier.fillMaxSize(),
@@ -142,10 +98,10 @@ fun TimePicker() {
14298
// [START_EXCLUDE]
14399
val hourState = rememberPickerState(
144100
initialNumberOfOptions = 12,
145-
initiallySelectedOption = 5
101+
initiallySelectedIndex = 5
146102
)
147103
val hourContentDescription by remember {
148-
derivedStateOf { "${hourState.selectedOption + 1 } hours" }
104+
derivedStateOf { "${hourState.selectedOptionIndex + 1 } hours" }
149105
}
150106
// [END_EXCLUDE]
151107
Picker(
@@ -163,18 +119,18 @@ fun TimePicker() {
163119
// ...
164120
// [START_EXCLUDE]
165121
state = hourState,
166-
contentDescription = hourContentDescription,
122+
contentDescription = {hourContentDescription},
167123
option = { hour: Int -> Option(0, "%2d".format(hour + 1)) }
168124
// [END_EXCLUDE]
169125
)
170126
// [START_EXCLUDE]
171127
Spacer(Modifier.width(8.dp))
172-
Text(text = ":", style = textStyle, color = MaterialTheme.colors.onBackground)
128+
Text(text = ":", style = textStyle, color = MaterialTheme.colorScheme.onBackground)
173129
Spacer(Modifier.width(8.dp))
174130
val minuteState =
175-
rememberPickerState(initialNumberOfOptions = 60, initiallySelectedOption = 0)
131+
rememberPickerState(initialNumberOfOptions = 60, initiallySelectedIndex = 0)
176132
val minuteContentDescription by remember {
177-
derivedStateOf { "${minuteState.selectedOption} minutes" }
133+
derivedStateOf { "${minuteState.selectedOptionIndex} minutes" }
178134
}
179135
// [END_EXCLUDE]
180136
Picker(
@@ -192,7 +148,7 @@ fun TimePicker() {
192148
// ...
193149
// [START_EXCLUDE]
194150
state = minuteState,
195-
contentDescription = minuteContentDescription,
151+
contentDescription = {minuteContentDescription},
196152
option = { minute: Int -> Option(1, "%02d".format(minute)) }
197153
// [END_EXCLUDE]
198154
)
@@ -214,9 +170,9 @@ fun SnapScrollableScreen() {
214170
// If using Time Text, add padding to ensure content does not overlap with Time Text.
215171
// [START android_wear_rotary_input_snap_fling]
216172
val listState = rememberScalingLazyListState()
217-
Scaffold(
218-
positionIndicator = {
219-
PositionIndicator(scalingLazyListState = listState)
173+
ScreenScaffold(
174+
scrollIndicator = {
175+
ScrollIndicator(state = listState)
220176
}
221177
) {
222178

@@ -230,10 +186,10 @@ fun SnapScrollableScreen() {
230186
// [START_EXCLUDE]
231187
item { ListHeader { Text(text = "List Header") } }
232188
items(20) {
233-
Chip(
189+
Button(
234190
onClick = {},
235191
label = { Text("List item $it") },
236-
colors = ChipDefaults.secondaryChipColors()
192+
colors = ButtonDefaults.filledTonalButtonColors()
237193
)
238194
}
239195
// [END_EXCLUDE]
@@ -245,10 +201,10 @@ fun SnapScrollableScreen() {
245201
@Composable
246202
fun PositionScrollIndicator() {
247203
// [START android_wear_rotary_position_indicator]
248-
val listState = rememberScalingLazyListState()
249-
Scaffold(
250-
positionIndicator = {
251-
PositionIndicator(scalingLazyListState = listState)
204+
val listState = rememberTransformingLazyColumnState()
205+
ScreenScaffold(
206+
scrollIndicator = {
207+
ScrollIndicator(state = listState)
252208
}
253209
) {
254210
// ...
@@ -263,13 +219,6 @@ fun TimePickerPreview() {
263219
TimePicker()
264220
}
265221

266-
@WearPreviewDevices
267-
@WearPreviewFontScales
268-
@Composable
269-
fun ScrollableScreenPreview() {
270-
ScrollableScreen()
271-
}
272-
273222
@WearPreviewDevices
274223
@WearPreviewFontScales
275224
@Composable

0 commit comments

Comments
 (0)