diff --git a/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt b/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt index 8c8ac6e12..d7e488be8 100644 --- a/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt +++ b/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt @@ -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 - ?: 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 { diff --git a/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.kt b/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.kt index 41b6e419e..b076b0f65 100644 --- a/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.kt +++ b/app/src/main/java/org/tasks/dialogs/MyDatePickerDialog.kt @@ -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) - ?: 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 + } } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/dialogs/MyTimePickerDialog.kt b/app/src/main/java/org/tasks/dialogs/MyTimePickerDialog.kt index 42881d29f..4df4f8ef0 100644 --- a/app/src/main/java/org/tasks/dialogs/MyTimePickerDialog.kt +++ b/app/src/main/java/org/tasks/dialogs/MyTimePickerDialog.kt @@ -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 + } } } \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 1254dd5b4..558943adf 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -270,4 +270,19 @@ 1 2 + + + @string/picker_mode_calendar + @string/picker_mode_text + + + + @string/picker_mode_clock + @string/picker_mode_text + + + + 0 + 1 + \ No newline at end of file diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml index 368c88499..88afae21e 100644 --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -443,4 +443,6 @@ legacy_etesync type map_theme + picker_mode_date + picker_mode_time diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a4bfc0aa5..67997a1f7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -698,4 +698,9 @@ File %1$s contained %2$s.\n\n Invite declined Invite awaiting response Invite invalid + Date picker mode + Time picker mode + Calendar + Clock + Text diff --git a/app/src/main/res/xml/preferences_date_and_time.xml b/app/src/main/res/xml/preferences_date_and_time.xml index e675c60b3..1e31c80fa 100644 --- a/app/src/main/res/xml/preferences_date_and_time.xml +++ b/app/src/main/res/xml/preferences_date_and_time.xml @@ -1,6 +1,7 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:key="@string/preference_screen"> + + + + + android:defaultValue="@integer/default_morning" + android:key="@string/p_date_shortcut_morning" + android:title="@string/date_shortcut_morning" + app:allowDividerAbove="true" />