1717package com.example.compose.snippets.components
1818
1919import 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
2023import androidx.compose.foundation.layout.Arrangement
2124import androidx.compose.foundation.layout.Box
2225import androidx.compose.foundation.layout.Column
@@ -49,12 +52,24 @@ import androidx.compose.runtime.setValue
4952import androidx.compose.ui.Alignment
5053import androidx.compose.ui.Modifier
5154import 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
5258import androidx.compose.ui.unit.dp
5359import androidx.compose.ui.window.Popup
60+ import com.example.compose.snippets.touchinput.userinteractions.MyAppTheme
5461import java.text.SimpleDateFormat
5562import java.util.Date
5663import 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+
262317fun convertMillisToDate (millis : Long ): String {
263318 val formatter = SimpleDateFormat (" MM/dd/yyyy" , Locale .getDefault())
264319 return formatter.format(Date (millis))
0 commit comments