From 9ba1bf130f2e622233538eac941ec54ff8ca7712 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Tue, 30 Mar 2021 22:55:46 +0200 Subject: [PATCH] [UI] Migrate MaterialDateTimePicker to material-components. --- app/build.gradle | 1 - .../pl/szczodrzynski/edziennik/Extensions.kt | 8 +++++ .../timetable/GenerateBlockTimetableDialog.kt | 18 +++++------ .../settings/SettingsLicenseActivity.kt | 8 ----- .../ui/modules/timetable/TimetableFragment.kt | 30 +++++++++++-------- .../ui/modules/views/DateDropdown.kt | 19 ++++++------ .../ui/modules/views/TimeDropdown.kt | 21 +++++++------ .../edziennik/utils/models/Date.java | 15 ++++++++++ app/src/main/res/values/colors.xml | 4 --- app/src/main/res/values/styles.xml | 4 --- 10 files changed, 70 insertions(+), 58 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 302fb9b0..f4131317 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -147,7 +147,6 @@ dependencies { implementation "com.jaredrummler:colorpicker:1.1.0" implementation "com.qifan.powerpermission:powerpermission-coroutines:1.3.0" implementation "com.qifan.powerpermission:powerpermission:1.3.0" - implementation "com.wdullaer:materialdatetimepicker:4.2.3" implementation "com.yuyh.json:jsonviewer:1.0.6" implementation "io.coil-kt:coil:1.1.1" implementation "me.dm7.barcodescanner:zxing:1.9.8" diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt index af15b543..7f72a564 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt @@ -37,6 +37,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.viewpager.widget.ViewPager import com.google.android.material.button.MaterialButton +import com.google.android.material.datepicker.CalendarConstraints import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.gson.* import com.google.gson.JsonArray @@ -1256,3 +1257,10 @@ fun Context.getSyncInterval(interval: Int): String { "" return hoursText?.plus(" $minutesText") ?: minutesText } + +fun Profile.getSchoolYearConstrains(): CalendarConstraints { + return CalendarConstraints.Builder() + .setStart(dateSemester1Start.inMillisUtc) + .setEnd(dateYearEnd.inMillisUtc) + .build() +} 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 aefd16f9..d847fbab 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,16 +116,16 @@ class GenerateBlockTimetableDialog( }} private fun selectDate() { - val date = Date.getToday() - DatePickerDialog - .newInstance({ _, year, monthOfYear, dayOfMonth -> - val dateSelected = Date(year, monthOfYear, dayOfMonth) + MaterialDatePicker.Builder.datePicker() + .setCalendarConstraints(app.profile.getSchoolYearConstrains()) + .build() + .apply { + addOnPositiveButtonClickListener { millis -> + val dateSelected = Date.fromMillisUtc(millis) generateBlockTimetable(dateSelected.weekStart, dateSelected.weekEnd) - }, date.year, date.month, date.day) - .apply { - accentColor = R.attr.colorPrimary.resolveAttr(this@GenerateBlockTimetableDialog.activity) - show(this@GenerateBlockTimetableDialog.activity.supportFragmentManager, "DatePickerDialog") } + } + .show(activity.supportFragmentManager, TAG) } @Subscribe(threadMode = ThreadMode.MAIN) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsLicenseActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsLicenseActivity.kt index e0c6be5e..c73d4c48 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsLicenseActivity.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsLicenseActivity.kt @@ -308,14 +308,6 @@ class SettingsLicenseActivity : MaterialAboutActivity() { "https://github.com/underwindfall/PowerPermission" ), - license( - "Material DateTime Picker", - "2015", - "Wouter Dullaert", - OpenSourceLicense.APACHE_2, - "https://github.com/wdullaer/MaterialDateTimePicker" - ), - license( "JsonViewer", "2017", 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 d7b1b9a7..970daeec 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,8 +16,8 @@ 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.wdullaer.materialdatetimepicker.date.DatePickerDialog import eu.szkolny.font.SzkolnyFont import kotlinx.coroutines.* import pl.szczodrzynski.edziennik.App @@ -25,7 +25,7 @@ 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.getSchoolYearConstrains import pl.szczodrzynski.edziennik.ui.dialogs.event.EventManualDialog import pl.szczodrzynski.edziennik.ui.dialogs.timetable.GenerateBlockTimetableDialog import pl.szczodrzynski.edziennik.utils.models.Date @@ -167,19 +167,23 @@ class TimetableFragment : Fragment(), CoroutineScope { BottomSheetPrimaryItem(true) .withTitle(R.string.timetable_select_day) .withIcon(SzkolnyFont.Icon.szf_calendar_today_outline) - .withOnClickListener(View.OnClickListener { + .withOnClickListener { _ -> activity.bottomSheet.close() - 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 { - accentColor = R.attr.colorPrimary.resolveAttr(this@TimetableFragment.activity) - show(this@TimetableFragment.activity.supportFragmentManager, "DatePickerDialog") + val date = pageSelection ?: Date.getToday() + MaterialDatePicker.Builder.datePicker() + .setSelection(date.inMillisUtc) + .setCalendarConstraints(app.profile.getSchoolYearConstrains()) + .build() + .apply { + addOnPositiveButtonClickListener { millis -> + val dateSelected = Date.fromMillisUtc(millis) + val index = items.indexOfFirst { it == dateSelected } + if (index != -1) + b.tabLayout.setCurrentItem(index, true) } - }), + } + .show(activity.supportFragmentManager, TAG) + }, BottomSheetPrimaryItem(true) .withTitle(R.string.menu_add_event) .withDescription(R.string.menu_add_event_desc) 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 3d3ef4c7..92bf0515 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,14 +10,13 @@ import android.util.AttributeSet import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Observer -import com.wdullaer.materialdatetimepicker.date.DatePickerDialog +import com.google.android.material.datepicker.MaterialDatePicker 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 @@ -179,17 +178,17 @@ class DateDropdown : TextInputDropDown { fun pickerDialog() { val date = getSelected() as? Date ?: Date.getToday() - DatePickerDialog - .newInstance({ _, year, monthOfYear, dayOfMonth -> - val dateSelected = Date(year, monthOfYear+1, dayOfMonth) + MaterialDatePicker.Builder.datePicker() + .setSelection(date.inMillisUtc) + .build() + .apply { + addOnPositiveButtonClickListener { millis -> + val dateSelected = Date.fromMillisUtc(millis) selectDate(dateSelected) onDateSelected?.invoke(dateSelected, null) - }, date.year, date.month-1, date.day) - .apply { - this@DateDropdown.activity ?: return@apply - accentColor = R.attr.colorPrimary.resolveAttr(this@DateDropdown.activity) - show(this@DateDropdown.activity!!.supportFragmentManager, "DatePickerDialog") } + } + .show(activity!!.supportFragmentManager, "DateDropdown") } fun selectDate(date: Date) { 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 e60f24f8..989184af 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,7 +8,8 @@ import android.content.Context import android.content.ContextWrapper import android.util.AttributeSet import androidx.appcompat.app.AppCompatActivity -import com.wdullaer.materialdatetimepicker.time.TimePickerDialog +import com.google.android.material.timepicker.MaterialTimePicker +import com.google.android.material.timepicker.TimeFormat import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import pl.szczodrzynski.edziennik.* @@ -177,17 +178,19 @@ class TimeDropdown : TextInputDropDown { fun pickerDialog() { val time = (getSelected() as? Pair<*, *>)?.first as? Time ?: Time.getNow() - TimePickerDialog - .newInstance({ _, hourOfDay, minute, second -> - val timeSelected = Time(hourOfDay, minute, second) + MaterialTimePicker.Builder() + .setTimeFormat(TimeFormat.CLOCK_24H) + .setHour(time.hour) + .setMinute(time.minute) + .build() + .also { dialog -> + dialog.addOnPositiveButtonClickListener { + val timeSelected = Time(dialog.hour, dialog.minute, 0) selectTime(timeSelected) onTimeSelected?.invoke(timeSelected, null, null) - }, time.hour, time.minute, 0, true) - .apply { - this@TimeDropdown.activity ?: return@apply - accentColor = R.attr.colorPrimary.resolveAttr(this@TimeDropdown.activity) - show(this@TimeDropdown.activity!!.supportFragmentManager, "TimePickerDialog") } + } + .show(activity!!.supportFragmentManager, "TimeDropdown") } fun selectTime(time: Time) { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/Date.java b/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/Date.java index 3604b83d..b39d0298 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/Date.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/Date.java @@ -70,6 +70,13 @@ public class Date implements Comparable { return new Date(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1, c.get(Calendar.DAY_OF_MONTH)); } + public static Date fromMillisUtc(long millis) { + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(millis); + c.setTimeZone(TimeZone.getTimeZone("UTC")); + return new Date(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1, c.get(Calendar.DAY_OF_MONTH)); + } + public static Date fromCalendar(Calendar c) { return new Date(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1, c.get(Calendar.DAY_OF_MONTH)); } @@ -94,6 +101,14 @@ public class Date implements Comparable { return c.getTimeInMillis(); } + public long getInMillisUtc() { + Calendar c = Calendar.getInstance(); + c.set(year, month - 1, day, 0, 0, 0); + c.set(Calendar.MILLISECOND, 0); + c.setTimeZone(TimeZone.getTimeZone("UTC")); + return c.getTimeInMillis(); + } + public long getInUnix() { return getInMillis() / 1000; } diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c4bda241..3c17d618 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -12,10 +12,6 @@ #3e7f7f7f - #2196f3 - #64b5f6 - - #ffffffff #ffffffff diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 0aa039a7..4f22fc81 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -96,8 +96,6 @@