Add preferences for date and time picker modes

Choose whether to use calendar, clock, or text by default
pull/1419/head
Alex Baker 4 years ago
parent 3ac3600c66
commit fe02ea8c34

@ -5,9 +5,11 @@ import android.os.Bundle
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.timepicker.MaterialTimePicker
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.dialogs.MyDatePickerDialog.Companion.dateInputMode
import org.tasks.dialogs.MyDatePickerDialog.Companion.newDatePicker
import org.tasks.dialogs.MyTimePickerDialog
import org.tasks.dialogs.MyTimePickerDialog.Companion.newTimePicker
import org.tasks.dialogs.MyTimePickerDialog.Companion.timeInputMode
import org.tasks.injection.InjectingAppCompatActivity
import org.tasks.preferences.Preferences
import org.tasks.themes.ThemeAccent
@ -44,7 +46,7 @@ class DateAndTimePickerActivity : InjectingAppCompatActivity() {
val picker =
supportFragmentManager
.findFragmentByTag(FRAG_TAG_DATE_PICKER) as? MaterialDatePicker<Long>
?: newDatePicker(date.millis).apply {
?: newDatePicker(date.millis, preferences.dateInputMode).apply {
show(supportFragmentManager, FRAG_TAG_DATE_PICKER)
}
picker.apply {
@ -65,7 +67,8 @@ class DateAndTimePickerActivity : InjectingAppCompatActivity() {
?: newTimePicker(
this,
DateTime(dateSelected!!.year, dateSelected!!.monthOfYear, dateSelected!!.dayOfMonth)
.withMillisOfDay(initial!!.millisOfDay).millis
.withMillisOfDay(initial!!.millisOfDay).millis,
preferences.timeInputMode
).apply { show(fragmentManager, FRAG_TAG_TIME_PICKER) }
picker.apply {
addOnCancelListener {

@ -7,18 +7,27 @@ import android.os.Bundle
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.datepicker.MaterialDatePicker.INPUT_MODE_CALENDAR
import com.google.android.material.datepicker.MaterialDatePicker.INPUT_MODE_TEXT
import com.todoroo.andlib.utility.DateUtilities
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R
import org.tasks.preferences.Preferences
import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils.currentTimeMillis
import org.tasks.time.DateTimeUtils.startOfDay
import javax.inject.Inject
@AndroidEntryPoint
class MyDatePickerDialog : DialogFragment() {
@Inject lateinit var preferences: Preferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val fragment =
(childFragmentManager.findFragmentByTag(FRAG_TAG_DATE_PICKER) as? MaterialDatePicker<Long>)
?: newDatePicker(initial)
?: newDatePicker(initial, preferences.dateInputMode)
.let {
childFragmentManager
.beginTransaction()
@ -67,10 +76,17 @@ class MyDatePickerDialog : DialogFragment() {
}
@JvmStatic
fun newDatePicker(initial: Long) = MaterialDatePicker.Builder.datePicker()
// TODO: setInputMode for calendar or text
// TODO: figure out hack for first day of week
.setSelection(if (initial > 0) initial else currentTimeMillis())
.build()
fun newDatePicker(initial: Long, inputMode: Int) =
MaterialDatePicker.Builder.datePicker()
// TODO: figure out hack for first day of week
.setInputMode(inputMode)
.setSelection(if (initial > 0) initial else currentTimeMillis())
.build()
val Preferences.dateInputMode: Int
get() = when (getIntegerFromString(R.string.p_picker_mode_date, 0)) {
1 -> INPUT_MODE_TEXT
else -> INPUT_MODE_CALENDAR
}
}
}

@ -9,20 +9,29 @@ import android.text.format.DateFormat.is24HourFormat
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import com.google.android.material.timepicker.MaterialTimePicker
import com.google.android.material.timepicker.MaterialTimePicker.INPUT_MODE_CLOCK
import com.google.android.material.timepicker.MaterialTimePicker.INPUT_MODE_KEYBOARD
import com.google.android.material.timepicker.TimeFormat.CLOCK_12H
import com.google.android.material.timepicker.TimeFormat.CLOCK_24H
import com.todoroo.andlib.utility.DateUtilities.now
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R
import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.preferences.Preferences
import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils.startOfDay
import javax.inject.Inject
@AndroidEntryPoint
class MyTimePickerDialog : DialogFragment() {
@Inject lateinit var preferences: Preferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val fragment =
(childFragmentManager.findFragmentByTag(FRAG_TAG_TIME_PICKER) as? MaterialTimePicker)
?: newTimePicker(requireContext(), initial)
?: newTimePicker(requireContext(), initial, preferences.timeInputMode)
.let {
childFragmentManager
.beginTransaction()
@ -66,7 +75,11 @@ class MyTimePickerDialog : DialogFragment() {
const val FRAG_TAG_TIME_PICKER = "frag_time_picker"
const val EXTRA_TIMESTAMP = "extra_timestamp"
fun newTimePicker(target: Fragment, rc: Int, initial: Long) =
fun newTimePicker(
target: Fragment,
rc: Int,
initial: Long,
) =
MyTimePickerDialog().apply {
arguments = Bundle().apply {
putLong(EXTRA_TIMESTAMP, initial)
@ -75,12 +88,20 @@ class MyTimePickerDialog : DialogFragment() {
}
@JvmStatic
fun newTimePicker(context: Context?, initial: Long) = DateTime(initial).let {
MaterialTimePicker.Builder()
.setTimeFormat(if (is24HourFormat(context)) CLOCK_24H else CLOCK_12H)
.setHour(it.hourOfDay)
.setMinute(it.minuteOfHour)
.build()
}
fun newTimePicker(context: Context?, initial: Long, inputMode: Int) =
DateTime(initial).let {
MaterialTimePicker.Builder()
.setInputMode(inputMode)
.setTimeFormat(if (is24HourFormat(context)) CLOCK_24H else CLOCK_12H)
.setHour(it.hourOfDay)
.setMinute(it.minuteOfHour)
.build()
}
val Preferences.timeInputMode: Int
get() = when (getIntegerFromString(R.string.p_picker_mode_time, 0)) {
1 -> INPUT_MODE_KEYBOARD
else -> INPUT_MODE_CLOCK
}
}
}

@ -270,4 +270,19 @@
<item>1</item>
<item>2</item>
</string-array>
<string-array name="date_picker_modes">
<item>@string/picker_mode_calendar</item>
<item>@string/picker_mode_text</item>
</string-array>
<string-array name="time_picker_modes">
<item>@string/picker_mode_clock</item>
<item>@string/picker_mode_text</item>
</string-array>
<string-array name="two_values">
<item>0</item>
<item>1</item>
</string-array>
</resources>

@ -443,4 +443,6 @@
<string name="legacy_etesync">legacy_etesync</string>
<string name="param_type">type</string>
<string name="p_map_theme">map_theme</string>
<string name="p_picker_mode_date">picker_mode_date</string>
<string name="p_picker_mode_time">picker_mode_time</string>
</resources>

@ -698,4 +698,9 @@ File %1$s contained %2$s.\n\n
<string name="invite_declined">Invite declined</string>
<string name="invite_awaiting_response">Invite awaiting response</string>
<string name="invite_invalid">Invite invalid</string>
<string name="picker_mode_date">Date picker mode</string>
<string name="picker_mode_time">Time picker mode</string>
<string name="picker_mode_calendar">Calendar</string>
<string name="picker_mode_clock">Clock</string>
<string name="picker_mode_text">Text</string>
</resources>

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="@string/preference_screen">
xmlns:app="http://schemas.android.com/apk/res-auto"
android:key="@string/preference_screen">
<ListPreference
android:defaultValue="0"
@ -13,10 +14,28 @@
android:key="@string/p_always_display_full_date"
android:title="@string/always_display_full_date" />
<ListPreference
android:defaultValue="0"
android:key="@string/p_picker_mode_date"
android:title="@string/picker_mode_date"
android:entries="@array/date_picker_modes"
android:entryValues="@array/two_values"
android:summary="%s"
app:allowDividerAbove="true" />
<ListPreference
android:defaultValue="0"
android:key="@string/p_picker_mode_time"
android:title="@string/picker_mode_time"
android:entries="@array/time_picker_modes"
android:entryValues="@array/two_values"
android:summary="%s" />
<org.tasks.ui.TimePreference
android:defaultValue="@integer/default_morning"
android:key="@string/p_date_shortcut_morning"
android:title="@string/date_shortcut_morning" />
android:defaultValue="@integer/default_morning"
android:key="@string/p_date_shortcut_morning"
android:title="@string/date_shortcut_morning"
app:allowDividerAbove="true" />
<org.tasks.ui.TimePreference
android:defaultValue="@integer/default_afternoon"

Loading…
Cancel
Save