[UI] Replace material date pickers with the DatePickerDialog. Add time picker to time dropdown.

This commit is contained in:
Kuba Szczodrzyński 2020-03-11 21:11:35 +01:00
parent d855118610
commit af3b6f3a97
8 changed files with 66 additions and 53 deletions

View File

@ -365,13 +365,12 @@ class EventManualDialog(
private fun saveEvent() { private fun saveEvent() {
val date = b.dateDropdown.getSelected() as? Date val date = b.dateDropdown.getSelected() as? Date
val startTimePair = b.timeDropdown.getSelected() as? Pair<*, *> val timeSelected = b.timeDropdown.getSelected()
val startTime = startTimePair?.first as? Time
val teamId = b.teamDropdown.getSelected() as? Long val teamId = b.teamDropdown.getSelected() as? Long
val type = b.typeDropdown.selected?.id val type = b.typeDropdown.selected?.id
val topic = b.topic.text?.toString() val topic = b.topic.text?.toString()
val subjectId = b.subjectDropdown.getSelected() as? Long val subjectId = b.subjectDropdown.getSelected() as? Long
val teacherId = b.teacherDropdown.getSelected() as? Long val teacherId = b.teacherDropdown.getSelected()
val share = b.shareSwitch.isChecked val share = b.shareSwitch.isChecked
@ -387,6 +386,11 @@ class EventManualDialog(
isError = true 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) { if (share && teamId == null) {
b.teamDropdown.error = app.getString(R.string.dialog_event_manual_team_choose) b.teamDropdown.error = app.getString(R.string.dialog_event_manual_team_choose)
isError = true isError = true
@ -402,6 +406,11 @@ class EventManualDialog(
isError = true isError = true
} }
val startTime = if (timeSelected == 0L)
null
else
(timeSelected as? Pair<*, *>)?.first as? Time
if (isError) return if (isError) return
val id = System.currentTimeMillis() val id = System.currentTimeMillis()

View File

@ -18,8 +18,8 @@ import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.cardview.widget.CardView import androidx.cardview.widget.CardView
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.wdullaer.materialdatetimepicker.date.DatePickerDialog
import kotlinx.coroutines.* import kotlinx.coroutines.*
import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.Subscribe
@ -116,19 +116,17 @@ class GenerateBlockTimetableDialog(
}} }}
private fun selectDate() { private fun selectDate() {
MaterialDatePicker.Builder val date = Date.getToday()
.datePicker() DatePickerDialog
.setSelection(Date.getToday().inMillis) .newInstance({ _, year, monthOfYear, dayOfMonth ->
.build() val dateSelected = Date(year, monthOfYear, dayOfMonth)
generateBlockTimetable(dateSelected.weekStart, dateSelected.weekEnd)
}, date.year, date.month, date.day)
.apply { .apply {
addOnPositiveButtonClickListener { dateInMillis -> accentColor = R.attr.colorPrimary.resolveAttr(this@GenerateBlockTimetableDialog.activity)
dismiss() show(this@GenerateBlockTimetableDialog.activity.supportFragmentManager, "DatePickerDialog")
val selectedDate = Date.fromMillis(dateInMillis)
generateBlockTimetable(selectedDate.weekStart, selectedDate.weekEnd)
} }
} }
.show(activity.supportFragmentManager, "MaterialDatePicker")
}
@Subscribe(threadMode = ThreadMode.MAIN) @Subscribe(threadMode = ThreadMode.MAIN)
fun onApiTaskFinishedEvent(event: ApiTaskFinishedEvent) { fun onApiTaskFinishedEvent(event: ApiTaskFinishedEvent) {

View File

@ -16,16 +16,17 @@ import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.viewpager.widget.ViewPager 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
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial.Icon2 import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial.Icon2
import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont
import com.wdullaer.materialdatetimepicker.date.DatePickerDialog
import kotlinx.coroutines.* import kotlinx.coroutines.*
import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.MainActivity import pl.szczodrzynski.edziennik.MainActivity
import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.db.entity.Metadata import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.databinding.FragmentTimetableV2Binding 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.event.EventManualDialog
import pl.szczodrzynski.edziennik.ui.dialogs.timetable.GenerateBlockTimetableDialog import pl.szczodrzynski.edziennik.ui.dialogs.timetable.GenerateBlockTimetableDialog
import pl.szczodrzynski.edziennik.utils.models.Date import pl.szczodrzynski.edziennik.utils.models.Date
@ -169,16 +170,15 @@ class TimetableFragment : Fragment(), CoroutineScope {
.withIcon(SzkolnyFont.Icon.szf_calendar_today_outline) .withIcon(SzkolnyFont.Icon.szf_calendar_today_outline)
.withOnClickListener(View.OnClickListener { .withOnClickListener(View.OnClickListener {
activity.bottomSheet.close() activity.bottomSheet.close()
MaterialDatePicker.Builder val date = Date.getToday()
.datePicker() DatePickerDialog
.setSelection(Date.getToday().inMillis) .newInstance({ _, year, monthOfYear, dayOfMonth ->
.build() val dateSelected = Date(year, monthOfYear, dayOfMonth)
.apply {
addOnPositiveButtonClickListener { dateInMillis ->
val dateSelected = Date.fromMillis(dateInMillis)
b.tabLayout.setCurrentItem(items.indexOfFirst { it == dateSelected }, true) b.tabLayout.setCurrentItem(items.indexOfFirst { it == dateSelected }, true)
} }, date.year, date.month, date.day)
show(this@TimetableFragment.activity.supportFragmentManager, "MaterialDatePicker") .apply {
accentColor = R.attr.colorPrimary.resolveAttr(this@TimetableFragment.activity)
show(this@TimetableFragment.activity.supportFragmentManager, "DatePickerDialog")
} }
}), }),
BottomSheetPrimaryItem(true) BottomSheetPrimaryItem(true)

View File

@ -10,13 +10,14 @@ import android.util.AttributeSet
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import com.google.android.material.datepicker.MaterialDatePicker import com.wdullaer.materialdatetimepicker.date.DatePickerDialog
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.db.AppDb import pl.szczodrzynski.edziennik.data.db.AppDb
import pl.szczodrzynski.edziennik.data.db.full.LessonFull import pl.szczodrzynski.edziennik.data.db.full.LessonFull
import pl.szczodrzynski.edziennik.observeOnce import pl.szczodrzynski.edziennik.observeOnce
import pl.szczodrzynski.edziennik.resolveAttr
import pl.szczodrzynski.edziennik.utils.TextInputDropDown import pl.szczodrzynski.edziennik.utils.TextInputDropDown
import pl.szczodrzynski.edziennik.utils.models.Date import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Week import pl.szczodrzynski.edziennik.utils.models.Week
@ -176,23 +177,18 @@ class DateDropdown : TextInputDropDown {
} }
fun pickerDialog() { fun pickerDialog() {
MaterialDatePicker.Builder val date = getSelected() as? Date ?: Date.getToday()
.datePicker()
.setSelection( DatePickerDialog
if (selected?.tag is Date) .newInstance({ _, year, monthOfYear, dayOfMonth ->
(selected?.tag as Date).inMillis val dateSelected = Date(year, monthOfYear, dayOfMonth)
else
Date.getToday().inMillis
)
.build()
.apply {
addOnPositiveButtonClickListener {
val dateSelected = Date.fromMillis(it)
selectDate(dateSelected) selectDate(dateSelected)
onDateSelected?.invoke(dateSelected, null) onDateSelected?.invoke(dateSelected, null)
} }, date.year, date.month, date.day)
.apply {
this@DateDropdown.activity ?: return@apply 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")
} }
} }

View File

@ -8,6 +8,7 @@ import android.content.Context
import android.content.ContextWrapper import android.content.ContextWrapper
import android.util.AttributeSet import android.util.AttributeSet
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.wdullaer.materialdatetimepicker.time.TimePickerDialog
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.*
@ -174,19 +175,19 @@ class TimeDropdown : TextInputDropDown {
} }
fun pickerDialog() { fun pickerDialog() {
/*MaterialDatePicker.Builder val time = (getSelected() as? Pair<*, *>)?.first as? Time ?: Time.getNow()
.datePicker()
.setSelection((selectedId?.let { Date.fromValue(it.toInt()) } TimePickerDialog
?: Date.getToday()).inMillis) .newInstance({ _, hourOfDay, minute, second ->
.build() val timeSelected = Time(hourOfDay, minute, second)
selectTime(timeSelected)
onTimeSelected?.invoke(timeSelected, null, null)
}, time.hour, time.minute, 0, true)
.apply { .apply {
addOnPositiveButtonClickListener { this@TimeDropdown.activity ?: return@apply
val dateSelected = Date.fromMillis(it) accentColor = R.attr.colorPrimary.resolveAttr(this@TimeDropdown.activity)
selectDate(dateSelected) show(this@TimeDropdown.activity!!.supportFragmentManager, "TimePickerDialog")
} }
this@DateDropdown.activity ?: return@apply
show(this@DateDropdown.activity!!.supportFragmentManager, "MaterialDatePicker")
}*/
} }
fun selectTime(time: Time) { fun selectTime(time: Time) {
@ -208,12 +209,13 @@ class TimeDropdown : TextInputDropDown {
* Get the currently selected time. * Get the currently selected time.
* ### Returns: * ### Returns:
* - null if no valid time is selected * - 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] * - 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] * - [LessonRange] - the selected lesson range object, if [displayMode] == [DISPLAY_LESSON_RANGES]
*/ */
fun getSelected(): Any? { fun getSelected(): Any? {
return when (val tag = selected?.tag) { return when (val tag = selected?.tag) {
0L -> null 0L -> 0L
is LessonFull -> is LessonFull ->
if (tag.displayStartTime != null) if (tag.displayStartTime != null)
tag.displayStartTime!! to tag.displayEndTime tag.displayStartTime!! to tag.displayEndTime

View File

@ -13,6 +13,9 @@
<color name="dividerColor">#3e7f7f7f</color> <color name="dividerColor">#3e7f7f7f</color>
<color name="mdtp_accent_color">#2196f3</color>
<color name="mdtp_accent_color_dark">#64b5f6</color>
<!-- LIGHT THEME --> <!-- LIGHT THEME -->
<color name="windowBackgroundLight">#ffffffff</color> <color name="windowBackgroundLight">#ffffffff</color>

View File

@ -1267,4 +1267,5 @@
<string name="card_type_timetable">Plan lekcji</string> <string name="card_type_timetable">Plan lekcji</string>
<string name="card_type_grades">Ostatnie oceny</string> <string name="card_type_grades">Ostatnie oceny</string>
<string name="card_type_events">Najbliższe wydarzenia</string> <string name="card_type_events">Najbliższe wydarzenia</string>
<string name="dialog_event_manual_time_choose">Wybierz godzinę</string>
</resources> </resources>

View File

@ -88,6 +88,8 @@
<style name="AppTheme" parent="NavView" /> <style name="AppTheme" parent="NavView" />
<style name="mdtp_ActionButton.Text" parent="Widget.MaterialComponents.Button.TextButton.Dialog"/>
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="AppTheme.Light" parent="NavView.Light"> <style name="AppTheme.Light" parent="NavView.Light">
<item name="colorPrimary">#2196f3</item> <item name="colorPrimary">#2196f3</item>
@ -123,6 +125,7 @@
<item name="halfHourDividerColor">#e0e0e0</item> <item name="halfHourDividerColor">#e0e0e0</item>
<item name="materialAlertDialogTheme">@style/AppTheme.MaterialAlertDialog</item> <item name="materialAlertDialogTheme">@style/AppTheme.MaterialAlertDialog</item>
<item name="mdtp_theme_dark">false</item>
</style> </style>
<style name="AppTheme.Dark" parent="NavView.Dark"> <style name="AppTheme.Dark" parent="NavView.Dark">
<item name="colorPrimary">#64b5f6</item> <item name="colorPrimary">#64b5f6</item>
@ -158,6 +161,7 @@
<item name="halfHourDividerColor">#40ffffff</item> <item name="halfHourDividerColor">#40ffffff</item>
<item name="materialAlertDialogTheme">@style/AppTheme.MaterialAlertDialog</item> <item name="materialAlertDialogTheme">@style/AppTheme.MaterialAlertDialog</item>
<item name="mdtp_theme_dark">true</item>
</style> </style>