/
BaseDateTimePickerPreference.kt
64 lines (51 loc) · 1.87 KB
/
BaseDateTimePickerPreference.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.imangazalievm.materialprefs.dsl
import android.widget.TextView
import com.imangazalievm.materialprefs.R
import com.imangazalievm.materialprefs.dsl.preferences.BasePreference
import com.imangazalievm.materialprefs.views.simple.LabelPreferenceView
import java.text.SimpleDateFormat
import java.util.*
@PreferencesMarker
abstract class BaseDateTimePickerPreference<P>(
key: String,
container: PrefsContainer,
appearanceManager: PreferencesAppearance
) : BasePreference<P, LabelPreferenceView, Unit>(
key = key,
container = container,
appearanceManager = appearanceManager
) where P : BaseDateTimePickerPreference<P> {
private var valueConverter: ((Calendar) -> String)? = null
protected var onValueSelected: ((Calendar) -> Unit)? = null
protected abstract val defaultFormatter: SimpleDateFormat
fun valuePresenter(converter: (Calendar) -> String) {
this.valueConverter = converter
}
fun onValueSelected(listener: (Calendar) -> Unit) {
this.onValueSelected = listener
}
override fun createView(): LabelPreferenceView {
return LabelPreferenceView(context)
}
override fun loadValue(view: LabelPreferenceView) {
val value = getValue()
val text = valueConverter?.invoke(value) ?: defaultFormatter.format(value.time)
view.setLabelText(text)
}
override fun initView(view: LabelPreferenceView) {
super.initView(view)
view.setOnClickListener {
showPickerDialog(getValue())
}
}
private fun getValue(): Calendar {
val calendar = GregorianCalendar.getInstance()
calendar.timeInMillis = valueLong()
return calendar
}
protected fun onSelected(value: Calendar) {
saveValue(value.timeInMillis)
onValueSelected?.invoke(value)
}
protected abstract fun showPickerDialog(value: Calendar)
}