Skip to content

Commit a9ee19d

Browse files
authored
Merge branch 'main' into navigation-drawer
2 parents ab7e32a + 4baf477 commit a9ee19d

File tree

7 files changed

+714
-1
lines changed

7 files changed

+714
-1
lines changed

compose/snippets/src/main/java/com/example/compose/snippets/SnippetsActivity.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,13 @@ import com.example.compose.snippets.components.ScaffoldExample
4949
import com.example.compose.snippets.components.SliderExamples
5050
import com.example.compose.snippets.components.SwitchExamples
5151
import com.example.compose.snippets.components.TimePickerExamples
52+
import com.example.compose.snippets.components.TooltipExamples
5253
import com.example.compose.snippets.graphics.ApplyPolygonAsClipImage
5354
import com.example.compose.snippets.graphics.BitmapFromComposableFullSnippet
5455
import com.example.compose.snippets.graphics.BrushExamplesScreen
5556
import com.example.compose.snippets.images.ImageExamplesScreen
5657
import com.example.compose.snippets.landing.LandingScreen
58+
import com.example.compose.snippets.layouts.PagerExamples
5759
import com.example.compose.snippets.navigation.Destination
5860
import com.example.compose.snippets.navigation.TopComponentsDestination
5961
import com.example.compose.snippets.ui.theme.SnippetsTheme
@@ -88,6 +90,7 @@ class SnippetsActivity : ComponentActivity() {
8890
}
8991
Destination.ShapesExamples -> ApplyPolygonAsClipImage()
9092
Destination.SharedElementExamples -> PlaceholderSizeAnimated_Demo()
93+
Destination.PagerExamples -> PagerExamples()
9194
}
9295
}
9396
}
@@ -114,6 +117,7 @@ class SnippetsActivity : ComponentActivity() {
114117
TopComponentsDestination.DatePickerExamples -> DatePickerExamples()
115118
TopComponentsDestination.CarouselExamples -> CarouselExamples()
116119
TopComponentsDestination.MenusExample -> MenusExamples()
120+
TopComponentsDestination.TooltipExamples -> TooltipExamples()
117121
TopComponentsDestination.NavigationDrawerExamples -> NavigationDrawerExamples()
118122
}
119123
}

compose/snippets/src/main/java/com/example/compose/snippets/components/DatePickers.kt

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
package com.example.compose.snippets.components
1818

1919
import androidx.compose.foundation.background
20+
import androidx.compose.foundation.gestures.awaitEachGesture
21+
import androidx.compose.foundation.gestures.awaitFirstDown
22+
import androidx.compose.foundation.gestures.waitForUpOrCancellation
2023
import androidx.compose.foundation.layout.Arrangement
2124
import androidx.compose.foundation.layout.Box
2225
import androidx.compose.foundation.layout.Column
@@ -49,12 +52,24 @@ import androidx.compose.runtime.setValue
4952
import androidx.compose.ui.Alignment
5053
import androidx.compose.ui.Modifier
5154
import androidx.compose.ui.draw.shadow
55+
import androidx.compose.ui.input.pointer.PointerEventPass
56+
import androidx.compose.ui.input.pointer.pointerInput
57+
import androidx.compose.ui.tooling.preview.Preview
5258
import androidx.compose.ui.unit.dp
5359
import androidx.compose.ui.window.Popup
60+
import com.example.compose.snippets.touchinput.userinteractions.MyAppTheme
5461
import java.text.SimpleDateFormat
5562
import java.util.Date
5663
import java.util.Locale
5764

65+
@Preview
66+
@Composable
67+
private fun DatePickerPreview() {
68+
MyAppTheme {
69+
DatePickerExamples()
70+
}
71+
}
72+
5873
// [START android_compose_components_datepicker_examples]
5974
// [START_EXCLUDE]
6075
@Composable
@@ -77,6 +92,9 @@ fun DatePickerExamples() {
7792
Text("Docked date picker:")
7893
DatePickerDocked()
7994

95+
Text("Open modal picker on click")
96+
DatePickerFieldToModal()
97+
8098
Text("Modal date pickers:")
8199
Button(onClick = { showModal = true }) {
82100
Text("Show Modal Date Picker")
@@ -259,6 +277,43 @@ fun DatePickerDocked() {
259277
}
260278
}
261279

280+
@Composable
281+
fun DatePickerFieldToModal(modifier: Modifier = Modifier) {
282+
var selectedDate by remember { mutableStateOf<Long?>(null) }
283+
var showModal by remember { mutableStateOf(false) }
284+
285+
OutlinedTextField(
286+
value = selectedDate?.let { convertMillisToDate(it) } ?: "",
287+
onValueChange = { },
288+
label = { Text("DOB") },
289+
placeholder = { Text("MM/DD/YYYY") },
290+
trailingIcon = {
291+
Icon(Icons.Default.DateRange, contentDescription = "Select date")
292+
},
293+
modifier = modifier
294+
.fillMaxWidth()
295+
.pointerInput(selectedDate) {
296+
awaitEachGesture {
297+
// Modifier.clickable doesn't work for text fields, so we use Modifier.pointerInput
298+
// in the Initial pass to observe events before the text field consumes them
299+
// in the Main pass.
300+
awaitFirstDown(pass = PointerEventPass.Initial)
301+
val upEvent = waitForUpOrCancellation(pass = PointerEventPass.Initial)
302+
if (upEvent != null) {
303+
showModal = true
304+
}
305+
}
306+
}
307+
)
308+
309+
if (showModal) {
310+
DatePickerModal(
311+
onDateSelected = { selectedDate = it },
312+
onDismiss = { showModal = false }
313+
)
314+
}
315+
}
316+
262317
fun convertMillisToDate(millis: Long): String {
263318
val formatter = SimpleDateFormat("MM/dd/yyyy", Locale.getDefault())
264319
return formatter.format(Date(millis))

compose/snippets/src/main/java/com/example/compose/snippets/components/Menus.kt

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,34 @@
1616

1717
package com.example.compose.snippets.components
1818

19+
import androidx.compose.foundation.layout.Arrangement
1920
import androidx.compose.foundation.layout.Box
2021
import androidx.compose.foundation.layout.Column
22+
import androidx.compose.foundation.layout.Row
2123
import androidx.compose.foundation.layout.fillMaxSize
2224
import androidx.compose.foundation.layout.fillMaxWidth
2325
import androidx.compose.foundation.layout.padding
26+
import androidx.compose.foundation.layout.wrapContentSize
2427
import androidx.compose.material.icons.Icons
28+
import androidx.compose.material.icons.automirrored.filled.DirectionsBike
29+
import androidx.compose.material.icons.automirrored.filled.DirectionsRun
30+
import androidx.compose.material.icons.automirrored.filled.DirectionsWalk
2531
import androidx.compose.material.icons.automirrored.outlined.Help
2632
import androidx.compose.material.icons.automirrored.outlined.OpenInNew
2733
import androidx.compose.material.icons.automirrored.outlined.Send
34+
import androidx.compose.material.icons.filled.ArrowDropDown
35+
import androidx.compose.material.icons.filled.Check
36+
import androidx.compose.material.icons.filled.Hiking
2837
import androidx.compose.material.icons.filled.MoreVert
38+
import androidx.compose.material.icons.filled.Tune
2939
import androidx.compose.material.icons.outlined.Feedback
3040
import androidx.compose.material.icons.outlined.Info
3141
import androidx.compose.material.icons.outlined.Person
3242
import androidx.compose.material.icons.outlined.Settings
3343
import androidx.compose.material3.Button
3444
import androidx.compose.material3.DropdownMenu
3545
import androidx.compose.material3.DropdownMenuItem
46+
import androidx.compose.material3.FilterChip
3647
import androidx.compose.material3.FloatingActionButton
3748
import androidx.compose.material3.HorizontalDivider
3849
import androidx.compose.material3.Icon
@@ -76,6 +87,9 @@ fun MenusExamples() {
7687
Button(onClick = { currentExample = { DropdownMenuWithDetails() } }) {
7788
Text("Dropdown menu with sections and icons")
7889
}
90+
Button(onClick = { currentExample = { DropdownFilter() } }) {
91+
Text("Menu for applying a filter, attached to a filter chip")
92+
}
7993
}
8094
}
8195
}
@@ -212,3 +226,79 @@ fun DropdownMenuWithDetails() {
212226
fun DropdownMenuWithDetailsPreview() {
213227
DropdownMenuWithDetails()
214228
}
229+
230+
@Composable
231+
fun DropdownFilter(modifier: Modifier = Modifier) {
232+
Row(
233+
modifier = modifier
234+
.padding(16.dp)
235+
.wrapContentSize(unbounded = true),
236+
horizontalArrangement = Arrangement.spacedBy(8.dp),
237+
verticalAlignment = Alignment.CenterVertically
238+
) {
239+
Icon(Icons.Default.Tune, "Filters")
240+
FilterChip(selected = false, onClick = { /*TODO*/ }, label = { Text("Time") })
241+
DropdownFilterChip()
242+
FilterChip(selected = false, onClick = { /*TODO*/ }, label = { Text("Wheelchair accessible") })
243+
}
244+
}
245+
246+
// [START android_compose_components_dropdownfilterchip]
247+
@Composable
248+
fun DropdownFilterChip(modifier: Modifier = Modifier) {
249+
var isDropdownExpanded by remember { mutableStateOf(false) }
250+
var selectedChipText by remember { mutableStateOf<String?>(null) }
251+
Box(modifier) {
252+
FilterChip(
253+
selected = selectedChipText != null,
254+
onClick = { isDropdownExpanded = !isDropdownExpanded },
255+
label = { Text(if (selectedChipText == null) "Type" else "$selectedChipText") },
256+
leadingIcon = { if (selectedChipText != null) Icon(Icons.Default.Check, null) },
257+
trailingIcon = { Icon(Icons.Default.ArrowDropDown, null) },
258+
)
259+
DropdownMenu(
260+
expanded = isDropdownExpanded,
261+
onDismissRequest = { isDropdownExpanded = !isDropdownExpanded }
262+
) {
263+
DropdownMenuItem(
264+
text = { Text("Running") },
265+
leadingIcon = { Icon(Icons.AutoMirrored.Default.DirectionsRun, null) },
266+
onClick = {
267+
selectedChipText =
268+
if (selectedChipText == "Running") null else "Running"
269+
}
270+
)
271+
DropdownMenuItem(
272+
text = { Text("Walking") },
273+
leadingIcon = { Icon(Icons.AutoMirrored.Default.DirectionsWalk, null) },
274+
onClick = {
275+
selectedChipText =
276+
if (selectedChipText == "Walking") null else "Walking"
277+
}
278+
)
279+
DropdownMenuItem(
280+
text = { Text("Hiking") },
281+
leadingIcon = { Icon(Icons.Default.Hiking, null) },
282+
onClick = {
283+
selectedChipText =
284+
if (selectedChipText == "Hiking") null else "Hiking"
285+
}
286+
)
287+
DropdownMenuItem(
288+
text = { Text("Cycling") },
289+
leadingIcon = { Icon(Icons.AutoMirrored.Default.DirectionsBike, null) },
290+
onClick = {
291+
selectedChipText =
292+
if (selectedChipText == "Cycling") null else "Cycling"
293+
}
294+
)
295+
}
296+
}
297+
}
298+
// [END android_compose_components_dropdownfilterchip]
299+
300+
@Preview
301+
@Composable
302+
private fun DropdownFilterPreview() {
303+
DropdownFilter()
304+
}

0 commit comments

Comments
 (0)