From af3b6f3a9727a9f6cd210625c9812c1a7731a956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Wed, 11 Mar 2020 21:11:35 +0100 Subject: [PATCH] [UI] Replace material date pickers with the DatePickerDialog. Add time picker to time dropdown. --- .../ui/dialogs/event/EventManualDialog.kt | 15 ++++++++-- .../timetable/GenerateBlockTimetableDialog.kt | 20 ++++++------- .../ui/modules/timetable/TimetableFragment.kt | 20 ++++++------- .../ui/modules/views/DateDropdown.kt | 28 ++++++++----------- .../ui/modules/views/TimeDropdown.kt | 28 ++++++++++--------- app/src/main/res/values/colors.xml | 3 ++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/styles.xml | 4 +++ 8 files changed, 66 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventManualDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventManualDialog.kt index 29f1162a..88611f1b 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventManualDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventManualDialog.kt @@ -365,13 +365,12 @@ class EventManualDialog( private fun saveEvent() { val date = b.dateDropdown.getSelected() as? Date - val startTimePair = b.timeDropdown.getSelected() as? Pair<*, *> - val startTime = startTimePair?.first as? Time + val timeSelected = b.timeDropdown.getSelected() val teamId = b.teamDropdown.getSelected() as? Long val type = b.typeDropdown.selected?.id val topic = b.topic.text?.toString() val subjectId = b.subjectDropdown.getSelected() as? Long - val teacherId = b.teacherDropdown.getSelected() as? Long + val teacherId = b.teacherDropdown.getSelected() val share = b.shareSwitch.isChecked @@ -387,6 +386,11 @@ class EventManualDialog( isError = true } + if (timeSelected == null || timeSelected !is Pair<*, *>) { + b.dateDropdown.error = app.getString(R.string.dialog_event_manual_time_choose) + isError = true + } + if (share && teamId == null) { b.teamDropdown.error = app.getString(R.string.dialog_event_manual_team_choose) isError = true @@ -402,6 +406,11 @@ class EventManualDialog( isError = true } + val startTime = if (timeSelected == 0L) + null + else + (timeSelected as? Pair<*, *>)?.first as? Time + if (isError) return val id = System.currentTimeMillis() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/timetable/GenerateBlockTimetableDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/timetable/GenerateBlockTimetableDialog.kt index 23f6ba66..aefd16f9 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/timetable/GenerateBlockTimetableDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/timetable/GenerateBlockTimetableDialog.kt @@ -18,8 +18,8 @@ import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.cardview.widget.CardView import androidx.core.content.FileProvider -import com.google.android.material.datepicker.MaterialDatePicker import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.wdullaer.materialdatetimepicker.date.DatePickerDialog import kotlinx.coroutines.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe @@ -116,18 +116,16 @@ class GenerateBlockTimetableDialog( }} private fun selectDate() { - MaterialDatePicker.Builder - .datePicker() - .setSelection(Date.getToday().inMillis) - .build() + val date = Date.getToday() + DatePickerDialog + .newInstance({ _, year, monthOfYear, dayOfMonth -> + val dateSelected = Date(year, monthOfYear, dayOfMonth) + generateBlockTimetable(dateSelected.weekStart, dateSelected.weekEnd) + }, date.year, date.month, date.day) .apply { - addOnPositiveButtonClickListener { dateInMillis -> - dismiss() - val selectedDate = Date.fromMillis(dateInMillis) - generateBlockTimetable(selectedDate.weekStart, selectedDate.weekEnd) - } + accentColor = R.attr.colorPrimary.resolveAttr(this@GenerateBlockTimetableDialog.activity) + show(this@GenerateBlockTimetableDialog.activity.supportFragmentManager, "DatePickerDialog") } - .show(activity.supportFragmentManager, "MaterialDatePicker") } @Subscribe(threadMode = ThreadMode.MAIN) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/TimetableFragment.kt index 158f3549..52441e25 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/TimetableFragment.kt @@ -16,16 +16,17 @@ import android.view.ViewGroup import android.widget.Toast import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager -import com.google.android.material.datepicker.MaterialDatePicker import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial.Icon2 import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont +import com.wdullaer.materialdatetimepicker.date.DatePickerDialog import kotlinx.coroutines.* import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.MainActivity import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.data.db.entity.Metadata import pl.szczodrzynski.edziennik.databinding.FragmentTimetableV2Binding +import pl.szczodrzynski.edziennik.resolveAttr import pl.szczodrzynski.edziennik.ui.dialogs.event.EventManualDialog import pl.szczodrzynski.edziennik.ui.dialogs.timetable.GenerateBlockTimetableDialog import pl.szczodrzynski.edziennik.utils.models.Date @@ -169,16 +170,15 @@ class TimetableFragment : Fragment(), CoroutineScope { .withIcon(SzkolnyFont.Icon.szf_calendar_today_outline) .withOnClickListener(View.OnClickListener { activity.bottomSheet.close() - MaterialDatePicker.Builder - .datePicker() - .setSelection(Date.getToday().inMillis) - .build() + val date = Date.getToday() + DatePickerDialog + .newInstance({ _, year, monthOfYear, dayOfMonth -> + val dateSelected = Date(year, monthOfYear, dayOfMonth) + b.tabLayout.setCurrentItem(items.indexOfFirst { it == dateSelected }, true) + }, date.year, date.month, date.day) .apply { - addOnPositiveButtonClickListener { dateInMillis -> - val dateSelected = Date.fromMillis(dateInMillis) - b.tabLayout.setCurrentItem(items.indexOfFirst { it == dateSelected }, true) - } - show(this@TimetableFragment.activity.supportFragmentManager, "MaterialDatePicker") + accentColor = R.attr.colorPrimary.resolveAttr(this@TimetableFragment.activity) + show(this@TimetableFragment.activity.supportFragmentManager, "DatePickerDialog") } }), BottomSheetPrimaryItem(true) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/views/DateDropdown.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/views/DateDropdown.kt index c5377c6e..b6fbad95 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/views/DateDropdown.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/views/DateDropdown.kt @@ -10,13 +10,14 @@ import android.util.AttributeSet import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Observer -import com.google.android.material.datepicker.MaterialDatePicker +import com.wdullaer.materialdatetimepicker.date.DatePickerDialog import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.data.db.AppDb import pl.szczodrzynski.edziennik.data.db.full.LessonFull import pl.szczodrzynski.edziennik.observeOnce +import pl.szczodrzynski.edziennik.resolveAttr import pl.szczodrzynski.edziennik.utils.TextInputDropDown import pl.szczodrzynski.edziennik.utils.models.Date import pl.szczodrzynski.edziennik.utils.models.Week @@ -176,23 +177,18 @@ class DateDropdown : TextInputDropDown { } fun pickerDialog() { - MaterialDatePicker.Builder - .datePicker() - .setSelection( - if (selected?.tag is Date) - (selected?.tag as Date).inMillis - else - Date.getToday().inMillis - ) - .build() + val date = getSelected() as? Date ?: Date.getToday() + + DatePickerDialog + .newInstance({ _, year, monthOfYear, dayOfMonth -> + val dateSelected = Date(year, monthOfYear, dayOfMonth) + selectDate(dateSelected) + onDateSelected?.invoke(dateSelected, null) + }, date.year, date.month, date.day) .apply { - addOnPositiveButtonClickListener { - val dateSelected = Date.fromMillis(it) - selectDate(dateSelected) - onDateSelected?.invoke(dateSelected, null) - } this@DateDropdown.activity ?: return@apply - show(this@DateDropdown.activity!!.supportFragmentManager, "MaterialDatePicker") + accentColor = R.attr.colorPrimary.resolveAttr(this@DateDropdown.activity) + show(this@DateDropdown.activity!!.supportFragmentManager, "DatePickerDialog") } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/views/TimeDropdown.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/views/TimeDropdown.kt index 14892d3e..08eda003 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/views/TimeDropdown.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/views/TimeDropdown.kt @@ -8,6 +8,7 @@ import android.content.Context import android.content.ContextWrapper import android.util.AttributeSet import androidx.appcompat.app.AppCompatActivity +import com.wdullaer.materialdatetimepicker.time.TimePickerDialog import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import pl.szczodrzynski.edziennik.* @@ -174,19 +175,19 @@ class TimeDropdown : TextInputDropDown { } fun pickerDialog() { - /*MaterialDatePicker.Builder - .datePicker() - .setSelection((selectedId?.let { Date.fromValue(it.toInt()) } - ?: Date.getToday()).inMillis) - .build() + val time = (getSelected() as? Pair<*, *>)?.first as? Time ?: Time.getNow() + + TimePickerDialog + .newInstance({ _, hourOfDay, minute, second -> + val timeSelected = Time(hourOfDay, minute, second) + selectTime(timeSelected) + onTimeSelected?.invoke(timeSelected, null, null) + }, time.hour, time.minute, 0, true) .apply { - addOnPositiveButtonClickListener { - val dateSelected = Date.fromMillis(it) - selectDate(dateSelected) - } - this@DateDropdown.activity ?: return@apply - show(this@DateDropdown.activity!!.supportFragmentManager, "MaterialDatePicker") - }*/ + this@TimeDropdown.activity ?: return@apply + accentColor = R.attr.colorPrimary.resolveAttr(this@TimeDropdown.activity) + show(this@TimeDropdown.activity!!.supportFragmentManager, "TimePickerDialog") + } } fun selectTime(time: Time) { @@ -208,12 +209,13 @@ class TimeDropdown : TextInputDropDown { * Get the currently selected time. * ### Returns: * - null if no valid time is selected + * - 0L if 'all day' is selected * - a [Pair] of [Time] and [Time]? - the selected time object, if [displayMode] == [DISPLAY_LESSONS] or [showCustomTime] * - [LessonRange] - the selected lesson range object, if [displayMode] == [DISPLAY_LESSON_RANGES] */ fun getSelected(): Any? { return when (val tag = selected?.tag) { - 0L -> null + 0L -> 0L is LessonFull -> if (tag.displayStartTime != null) tag.displayStartTime!! to tag.displayEndTime diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 5d04d97c..a5e975f1 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -13,6 +13,9 @@ #3e7f7f7f + #2196f3 + #64b5f6 + #ffffffff diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a8ef2af8..6175c664 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1267,4 +1267,5 @@ Plan lekcji Ostatnie oceny Najbliższe wydarzenia + Wybierz godzinę diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 6e97f2e9..52f26f20 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -88,6 +88,8 @@