Last active
July 22, 2022 02:41
-
-
Save kafri8889/f864b6bbde9c2f73ab6d2328c15e916d to your computer and use it in GitHub Desktop.
class for picker dialog
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
@author kafri8889 | |
**/ | |
class PickerManager( | |
private val context: FragmentActivity, | |
private val listener: PickerListener | |
) { | |
fun datePicker( | |
data: Any? = null, | |
min: Long = 0, | |
selection: Long = MaterialDatePicker.todayInUtcMilliseconds() | |
) { | |
val datePicker = MaterialDatePicker.Builder.datePicker() | |
.setTitleText(context.getString(R.string.select_date)) | |
.setSelection(selection) | |
.setCalendarConstraints(CalendarConstraints.Builder().setStart(min).build()) | |
.build() | |
datePicker.addOnPositiveButtonClickListener { | |
listener.onDateSelected(data, it) | |
} | |
datePicker.addOnNegativeButtonClickListener { | |
listener.onDismissRequest() | |
} | |
datePicker.addOnCancelListener { | |
listener.onDismissRequest() | |
} | |
datePicker.show(context.supportFragmentManager, datePicker.tag) | |
} | |
fun dateRangePicker( | |
data: Any? = null, | |
min: Long = 0, | |
selection: Pair<Long, Long> = Pair( | |
MaterialDatePicker.thisMonthInUtcMilliseconds(), | |
MaterialDatePicker.todayInUtcMilliseconds() | |
) | |
) { | |
val dateRangePicker = MaterialDatePicker.Builder.dateRangePicker() | |
.setTitleText(context.getString(R.string.select_date)) | |
.setSelection(selection.toAndroidXPair()) | |
.setCalendarConstraints(CalendarConstraints.Builder().setStart(min).build()) | |
.build() | |
dateRangePicker.addOnPositiveButtonClickListener { | |
listener.onDateRangeSelected(data, it.first, it.second) | |
} | |
dateRangePicker.addOnNegativeButtonClickListener { | |
listener.onDismissRequest() | |
} | |
dateRangePicker.addOnCancelListener { | |
listener.onDismissRequest() | |
} | |
dateRangePicker.show(context.supportFragmentManager, dateRangePicker.tag) | |
} | |
fun timePicker( | |
data: Any? = null, | |
hour: Int? = null, | |
minute: Int? = null, | |
timeFormat: Int = TimeFormat.CLOCK_24H, | |
inputMode: Int = MaterialTimePicker.INPUT_MODE_CLOCK, | |
) { | |
val calendar = Calendar.getInstance() | |
val mMinute = calendar.get(Calendar.MINUTE) | |
val mHour = if (timeFormat == TimeFormat.CLOCK_12H) calendar.get(Calendar.HOUR) | |
else calendar.get(Calendar.HOUR_OF_DAY) | |
val timePicker = MaterialTimePicker.Builder() | |
.setTimeFormat(timeFormat) | |
.setHour(hour ?: mHour) | |
.setMinute(minute ?: mMinute) | |
.setInputMode(inputMode) | |
.setTitleText("Select Appointment time") | |
.build() | |
timePicker.addOnPositiveButtonClickListener { | |
listener.onTimeSelected(data, timePicker.hour, timePicker.minute) | |
} | |
timePicker.addOnNegativeButtonClickListener { | |
listener.onDismissRequest() | |
} | |
timePicker.addOnCancelListener { | |
listener.onDismissRequest() | |
} | |
timePicker.show(context.supportFragmentManager, timePicker.tag) | |
} | |
} | |
class PickerListenerWrapper( | |
private val onDismissRequest: () -> Unit = {}, | |
private val onDateSelected: (data: Any?, timeInMillis: Long) -> Unit = { _, _ -> }, | |
private val onDateRangeSelected: (data: Any?, from: Long, to: Long) -> Unit = { _, _, _ -> }, | |
private val onTimeSelected: (data: Any?, hour: Int, minute: Int) -> Unit = { _, _, _ -> }, | |
): PickerListener { | |
override fun onDismissRequest() { | |
onDismissRequest.invoke() | |
} | |
override fun onDateSelected(data: Any?, timeInMillis: Long) { | |
onDateSelected.invoke(data, timeInMillis) | |
} | |
override fun onDateRangeSelected(data: Any?, from: Long, to: Long) { | |
onDateRangeSelected.invoke(data, from, to) | |
} | |
override fun onTimeSelected(data: Any?, hour: Int, minute: Int) { | |
onTimeSelected.invoke(data, hour, minute) | |
} | |
} | |
interface PickerListener { | |
fun onDismissRequest() | |
fun onDateSelected(data: Any?, timeInMillis: Long) | |
fun onDateRangeSelected(data: Any?, from: Long, to: Long) | |
fun onTimeSelected(data: Any?, hour: Int, minute: Int) | |
} | |
// --------------------------------------------------------- Example ------------------------------------------------------------- | |
@Composable | |
fun Screen() { | |
val context = LocalContext.current | |
val focusManager = LocalFocusManager.current | |
val pickerManager = remember { | |
PickerManager(context as FragmentActivity, object: PickerListener { | |
override fun onDismissRequest() { | |
focusManager.clearFocus() | |
} | |
override fun onDateSelected(data: Any?, timeInMillis: Long) { | |
focusManager.clearFocus() | |
} | |
override fun onDateRangeSelected(data: Any?, from: Long, to: Long) { | |
focusManager.clearFocus() | |
} | |
override fun onTimeSelected(data: Any?, hour: Int, minute: Int) { | |
focusManager.clearFocus() | |
} | |
}) | |
} | |
// Or | |
val pickerManager = remember { | |
PickerManager(context as FragmentActivity, PickerListenerWrapper( | |
onDismissRequest = { | |
... | |
}, | |
onDateSelected = { data, timeInMillis -> | |
... | |
} | |
)) | |
} | |
OutlinedTextField( | |
... | |
modifier = Modifier | |
.fillMaxWidth() | |
.onFocusChanged { focusState -> | |
if (focusState.hasFocus) pickerManager.datePicker() | |
} | |
) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment