[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() {
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()

View File

@ -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)

View File

@ -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)

View File

@ -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")
}
}

View File

@ -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

View File

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

View File

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

View File

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