Skip to content

Instantly share code, notes, and snippets.

@kafri8889
Last active July 22, 2022 02:41
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kafri8889/f864b6bbde9c2f73ab6d2328c15e916d to your computer and use it in GitHub Desktop.
Save kafri8889/f864b6bbde9c2f73ab6d2328c15e916d to your computer and use it in GitHub Desktop.
class for picker dialog
/**
@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