From 5ca57888995c237e61872469f2905dd693c8f5cb Mon Sep 17 00:00:00 2001 From: denizk0461 Date: Thu, 4 May 2023 13:29:34 +0200 Subject: [PATCH] Replaced custom TimePickerFragment.kt with standard MaterialTimePicker --- .../studip/activity/FetcherActivity.kt | 2 + .../studip/dialog/TimePickerFragment.kt | 62 ------------- .../studip/sheet/ScheduleUpdateSheet.kt | 89 ++++++++----------- app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values-night/themes.xml | 15 ++++ app/src/main/res/values/strings.xml | 2 + app/src/main/res/values/themes.xml | 15 ++++ 7 files changed, 73 insertions(+), 114 deletions(-) delete mode 100644 app/src/main/java/com/denizk0461/studip/dialog/TimePickerFragment.kt diff --git a/app/src/main/java/com/denizk0461/studip/activity/FetcherActivity.kt b/app/src/main/java/com/denizk0461/studip/activity/FetcherActivity.kt index 6422fe7..4d54a7b 100644 --- a/app/src/main/java/com/denizk0461/studip/activity/FetcherActivity.kt +++ b/app/src/main/java/com/denizk0461/studip/activity/FetcherActivity.kt @@ -91,6 +91,8 @@ class FetcherActivity : FragmentActivity() { */ binding.webview.loadUrl("https://elearning.uni-bremen.de/index.php?again=yes") + binding.webview + binding.fab.setOnClickListener { if (binding.webview.url?.contains( diff --git a/app/src/main/java/com/denizk0461/studip/dialog/TimePickerFragment.kt b/app/src/main/java/com/denizk0461/studip/dialog/TimePickerFragment.kt deleted file mode 100644 index 5942412..0000000 --- a/app/src/main/java/com/denizk0461/studip/dialog/TimePickerFragment.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.denizk0461.studip.dialog - -import android.app.Dialog -import androidx.fragment.app.DialogFragment -import android.app.TimePickerDialog -import android.os.Bundle -import android.os.Parcelable -import android.widget.TimePicker -import com.denizk0461.studip.data.getParcelableCompat - -/** - * Dialogue used for letting the user pick a timestamp. - */ -class TimePickerFragment : DialogFragment(), TimePickerDialog.OnTimeSetListener { - - private lateinit var listener: OnTimeSetListener - private var isEventStart: Boolean = false - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - - // Retrieve listener for when the user finishes setting a time - listener = arguments.getParcelableCompat("interface") - - // Retrieve whether the timestamp to be edited is the start of the event - isEventStart = arguments?.getBoolean("isEventStart") == true - - // Retrieve timestamp to edit - val timestampSplit = (arguments?.getString("timestamp") ?: "").split(":") - - return TimePickerDialog( - activity, - this, - timestampSplit[0].toInt(), - timestampSplit[1].toInt(), - true, - ) - } - - /** - * Override the implementation of TimePickerDialog#OnTimeSetListener. - */ - override fun onTimeSet(picker: TimePicker?, hours: Int, minutes: Int) { - // Use custom implementation of OnTimeSetListener - listener.onTimeSet(hours, minutes, isEventStart) - } - - /** - * Custom implementation of TimePickerDialog#OnTimeSetListener that includes a boolean to find - * out whether the start or the end timestamp has been edited. - */ - interface OnTimeSetListener : Parcelable { - - /** - * Timestamp has been edited by the user. - * - * @param hours hour of the timestamp - * @param minutes minute of the timestamp - * @param isEventStart whether the timestamp to be edited is the start of the event - */ - fun onTimeSet(hours: Int, minutes: Int, isEventStart: Boolean) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/studip/sheet/ScheduleUpdateSheet.kt b/app/src/main/java/com/denizk0461/studip/sheet/ScheduleUpdateSheet.kt index e9e5af1..cbebbf7 100644 --- a/app/src/main/java/com/denizk0461/studip/sheet/ScheduleUpdateSheet.kt +++ b/app/src/main/java/com/denizk0461/studip/sheet/ScheduleUpdateSheet.kt @@ -1,13 +1,10 @@ package com.denizk0461.studip.sheet import android.os.Bundle -import android.os.Parcel -import android.os.Parcelable import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.PopupMenu import androidx.core.widget.addTextChangedListener -import androidx.fragment.app.FragmentActivity import androidx.fragment.app.viewModels import androidx.transition.TransitionManager import com.denizk0461.studip.R @@ -19,16 +16,17 @@ import com.denizk0461.studip.data.showToast import com.denizk0461.studip.data.timeslotsForAcademicQuarter import com.denizk0461.studip.data.viewBinding import com.denizk0461.studip.databinding.SheetScheduleUpdateBinding -import com.denizk0461.studip.dialog.TimePickerFragment import com.denizk0461.studip.exception.AcademicQuarterNotApplicableException import com.denizk0461.studip.exception.ParcelNotFoundException import com.denizk0461.studip.model.StudIPEvent import com.denizk0461.studip.viewmodel.ScheduleUpdateViewModel +import com.google.android.material.timepicker.MaterialTimePicker +import com.google.android.material.timepicker.TimeFormat /** * Update sheet to allow the user to edit attributes for a specific schedule event. */ -class ScheduleUpdateSheet() : AppSheet(R.layout.sheet_schedule_update), TimePickerFragment.OnTimeSetListener { +class ScheduleUpdateSheet : AppSheet(R.layout.sheet_schedule_update) { // Editable fields private var timeslotStart = "12:00" @@ -50,15 +48,6 @@ class ScheduleUpdateSheet() : AppSheet(R.layout.sheet_schedule_update), TimePick // Day the event is scheduled for, default is Monday private var selectedDay = 0 - constructor(parcel: Parcel) : this() { - timeslotStart = parcel.readString() ?: "" - timeslotEnd = parcel.readString() ?: "" - colour = parcel.readInt() - hasClickedDelete = parcel.readByte() != 0.toByte() - isEditing = parcel.readByte() != 0.toByte() - selectedDay = parcel.readInt() - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -281,28 +270,26 @@ class ScheduleUpdateSheet() : AppSheet(R.layout.sheet_schedule_update), TimePick } } - // Prepare timestamp buttons + // Prepare timestamp start button binding.buttonTimeStart.text = timeslotStart binding.buttonTimeStart.setOnClickListener { // Launch a time picker dialogue to pick a new start timestamp - TimePickerFragment().also { sheet -> - val bundle = Bundle() - bundle.putParcelable("interface", this) - bundle.putBoolean("isEventStart", true) - bundle.putString("timestamp", binding.buttonTimeStart.text.toString()) - sheet.arguments = bundle - }.show((context as FragmentActivity).supportFragmentManager, "timePicker") + createTimePicker(binding.buttonTimeStart.text.toString(), true).also { picker -> + picker.addOnPositiveButtonClickListener { + onTimeSet(picker.hour, picker.minute, true) + } + }.show(childFragmentManager, "timePickerStart") } + + // Prepare timestamp end button binding.buttonTimeEnd.text = timeslotEnd binding.buttonTimeEnd.setOnClickListener { // Launch a time picker dialogue to pick a new end timestamp - TimePickerFragment().also { sheet -> - val bundle = Bundle() - bundle.putParcelable("interface", this) - bundle.putBoolean("isEventStart", false) - bundle.putString("timestamp", binding.buttonTimeEnd.text.toString()) - sheet.arguments = bundle - }.show((context as FragmentActivity).supportFragmentManager, "timePicker") + createTimePicker(binding.buttonTimeEnd.text.toString(), false).also { picker -> + picker.addOnPositiveButtonClickListener { + onTimeSet(picker.hour, picker.minute, false) + } + }.show(childFragmentManager, "timePickerEnd") } // Set up close button @@ -313,13 +300,13 @@ class ScheduleUpdateSheet() : AppSheet(R.layout.sheet_schedule_update), TimePick } /** - * Checks and stores a new timestamp after the user picks one through [TimePickerFragment]. + * Checks and stores a new timestamp after the user picks one through [MaterialTimePicker]. * * @param hours newly set hour * @param minutes newly set minute * @param isEventStart whether this timestamp is for the start of the course */ - override fun onTimeSet(hours: Int, minutes: Int, isEventStart: Boolean) { + private fun onTimeSet(hours: Int, minutes: Int, isEventStart: Boolean) { // Parse the separate ints into a timestamp string. Add a leading zero if necessary. val newTimestamp = "$hours:${String.format("%02d", minutes)}" @@ -408,26 +395,24 @@ class ScheduleUpdateSheet() : AppSheet(R.layout.sheet_schedule_update), TimePick View.GONE } - override fun writeToParcel(parcel: Parcel, flags: Int) { - parcel.writeString(timeslotStart) - parcel.writeString(timeslotEnd) - parcel.writeInt(colour) - parcel.writeByte(if (hasClickedDelete) 1 else 0) - parcel.writeByte(if (isEditing) 1 else 0) - parcel.writeInt(selectedDay) - } - - override fun describeContents(): Int { - return 0 - } - - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): ScheduleUpdateSheet { - return ScheduleUpdateSheet(parcel) - } - - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } + /** + * Creates a new time picker dialog. + * + * @param timestamp timestamp to edit + * @param isEventStart whether the user is editing the start or the end of the event + * @return new [MaterialTimePicker] + */ + private fun createTimePicker(timestamp: String, isEventStart: Boolean): MaterialTimePicker { + val timestampSplit = timestamp.split(":") + return MaterialTimePicker.Builder() + .setTimeFormat(TimeFormat.CLOCK_24H) + .setHour(timestampSplit[0].toInt()) + .setMinute(timestampSplit[1].toInt()) + .setTitleText(getString(if (isEventStart) { + R.string.sheet_schedule_update_time_dialog_start_hint + } else { + R.string.sheet_schedule_update_time_dialog_end_hint + })) + .build() } } \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 01d292c..3a3e924 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -53,6 +53,8 @@ Der Kurs kann nicht anfangen nachdem er aufhört! Der Kurs kann nicht enden bevor er anfängt! Dieses Feld darf nicht leer sein + Startzeit der Veranstaltung + Schlusszeit der Veranstaltung Kein Angebot Für diesen Tag sind keine Angebote vorhanden diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 147a69e..0580aa6 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -80,9 +80,24 @@ @color/game_dark_onPrimary @color/game_dark_container @color/game_dark_onContainer + + @style/TimeDialogTheme + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 54f3be5..c4f3478 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -54,6 +54,8 @@ The course can\'t begin after it ends! The course can\'t end before it begins! This field cannot be empty + Event start time + Event end time No offers There are no offers available for this day diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index e4cda17..16a3722 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -80,6 +80,8 @@ @color/game_light_onPrimary @color/game_light_container @color/game_light_onContainer + + @style/TimeDialogTheme + + + + \ No newline at end of file