From d70b0c0c3f2ce07ca3618c45f19a3f86a8d00447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 16 Dec 2019 22:26:00 +0100 Subject: [PATCH] [UI] Implement new Event Adapter and Day Dialog (partially). --- .../edziennik/ui/dialogs/day/DayDialog.kt | 124 ++++++++++++++++++ .../ui/dialogs/event/EventListAdapter.kt | 65 ++++++--- .../ui/dialogs/event/EventListDialog.kt | 9 +- .../ui/dialogs/event/EventManualDialog.kt | 4 +- .../dialogs/timetable/LessonDetailsDialog.kt | 18 --- .../ui/modules/agenda/AgendaFragment.java | 31 +++-- app/src/main/res/drawable/ic_no_events.xml | 52 ++++++++ app/src/main/res/layout/dialog_day.xml | 98 ++++++++++++++ app/src/main/res/layout/dialog_event_list.xml | 11 +- app/src/main/res/layout/event_list_item.xml | 76 +++++++++++ app/src/main/res/values/strings.xml | 3 + 11 files changed, 436 insertions(+), 55 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/day/DayDialog.kt create mode 100644 app/src/main/res/drawable/ic_no_events.xml create mode 100644 app/src/main/res/layout/dialog_day.xml create mode 100644 app/src/main/res/layout/event_list_item.xml diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/day/DayDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/day/DayDialog.kt new file mode 100644 index 00000000..89af0ed3 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/day/DayDialog.kt @@ -0,0 +1,124 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2019-12-16. + */ + +package pl.szczodrzynski.edziennik.ui.dialogs.day + +import android.view.View +import android.widget.Toast +import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.R +import pl.szczodrzynski.edziennik.databinding.DialogDayBinding +import pl.szczodrzynski.edziennik.onClick +import pl.szczodrzynski.edziennik.setText +import pl.szczodrzynski.edziennik.ui.dialogs.event.EventListAdapter +import pl.szczodrzynski.edziennik.ui.dialogs.event.EventManualDialog +import pl.szczodrzynski.edziennik.utils.SimpleDividerItemDecoration +import pl.szczodrzynski.edziennik.utils.models.Date +import pl.szczodrzynski.edziennik.utils.models.Week +import kotlin.coroutines.CoroutineContext + +class DayDialog( + val activity: AppCompatActivity, + val profileId: Int, + val date: Date, + val onShowListener: ((tag: String) -> Unit)? = null, + val onDismissListener: ((tag: String) -> Unit)? = null +) : CoroutineScope { + companion object { + private const val TAG = "DayDialog" + } + + private lateinit var app: App + private lateinit var b: DialogDayBinding + private lateinit var dialog: AlertDialog + + private val job = Job() + override val coroutineContext: CoroutineContext + get() = job + Dispatchers.Main + + private lateinit var adapter: EventListAdapter + + init { run { + if (activity.isFinishing) + return@run + onShowListener?.invoke(TAG) + app = activity.applicationContext as App + b = DialogDayBinding.inflate(activity.layoutInflater) + dialog = MaterialAlertDialogBuilder(activity) + .setView(b.root) + .setPositiveButton(R.string.close) { dialog, _ -> + dialog.dismiss() + } + .setNeutralButton(R.string.add, null) + .setOnDismissListener { + onDismissListener?.invoke(TAG) + } + .show() + + dialog.getButton(AlertDialog.BUTTON_NEUTRAL)?.onClick { + EventManualDialog( + activity, + profileId, + defaultDate = date, + onShowListener = onShowListener, + onDismissListener = onDismissListener + ) + } + + update() + }} + + private fun update() { + b.dayDate.setText( + R.string.dialog_day_date_format, + Week.getFullDayName(date.weekDay), + date.formattedString + ) + + adapter = EventListAdapter( + activity, + onItemClick = { + Toast.makeText(activity, "Event clicked ${it.topic}", Toast.LENGTH_SHORT).show() + }, + onEventEditClick = { + EventManualDialog( + activity, + profileId, + editingEvent = it, + onShowListener = onShowListener, + onDismissListener = onDismissListener + ) + } + ) + + app.db.eventDao().getAllByDate(profileId, date).observe(activity, Observer { events -> + adapter.items = events + if (b.eventsView.adapter == null) { + b.eventsView.adapter = adapter + b.eventsView.apply { + setHasFixedSize(true) + layoutManager = LinearLayoutManager(context) + addItemDecoration(SimpleDividerItemDecoration(context)) + } + } + adapter.notifyDataSetChanged() + + if (events != null && events.isNotEmpty()) { + b.eventsView.visibility = View.VISIBLE + b.eventsNoData.visibility = View.GONE + } else { + b.eventsView.visibility = View.GONE + b.eventsNoData.visibility = View.VISIBLE + } + }) + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventListAdapter.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventListAdapter.kt index d4a7a549..8106f64f 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventListAdapter.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventListAdapter.kt @@ -5,41 +5,72 @@ package pl.szczodrzynski.edziennik.ui.dialogs.event import android.content.Context -import android.graphics.PorterDuff -import android.graphics.PorterDuffColorFilter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.RecyclerView -import pl.szczodrzynski.edziennik.App -import pl.szczodrzynski.edziennik.MainActivity -import pl.szczodrzynski.edziennik.R -import pl.szczodrzynski.edziennik.data.db.modules.events.Event +import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.data.db.modules.events.EventFull -import pl.szczodrzynski.edziennik.databinding.RowDialogEventListItemBinding -import pl.szczodrzynski.edziennik.utils.Utils.bs +import pl.szczodrzynski.edziennik.databinding.EventListItemBinding import pl.szczodrzynski.edziennik.utils.models.Date class EventListAdapter( val context: Context, - val parentDialog: EventListDialog + val onItemClick: ((event: EventFull) -> Unit)? = null, + val onEventEditClick: ((event: EventFull) -> Unit)? = null ) : RecyclerView.Adapter() { private val app by lazy { context.applicationContext as App } - val eventList = mutableListOf() + var items = listOf() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val inflater = LayoutInflater.from(parent.context) - val view: RowDialogEventListItemBinding = DataBindingUtil.inflate(inflater, R.layout.row_dialog_event_list_item, parent, false) + val view = EventListItemBinding.inflate(inflater, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val event = eventList[position] + val event = items[position] + val b = holder.b - holder.apply { + b.root.onClick { + onItemClick?.invoke(event) + } + + val bullet = " • " + + b.topic.text = event.topic + + b.details.text = mutableListOf( + event.typeName, + event.startTime?.stringHM ?: app.getString(R.string.event_all_day), + event.subjectLongName + ).concat(bullet) + + b.addedBy.setText( + when (event.sharedBy) { + null -> when { + event.addedManually -> R.string.event_list_added_by_self_format + event.teacherFullName == null -> R.string.event_list_added_by_unknown_format + else -> R.string.event_list_added_by_format + } + "self" -> R.string.event_list_shared_by_self_format + else -> R.string.event_list_shared_by_format + }, + Date.fromMillis(event.addedDate).formattedString, + event.sharedByName ?: event.teacherFullName ?: "", + event.teamName?.let { bullet+it } ?: "" + ) + + b.typeColor.background?.setTintColor(event.getColor()) + + b.editButton.visibility = if (event.addedManually) View.VISIBLE else View.GONE + b.editButton.onClick { + onEventEditClick?.invoke(event) + } + + /*with(holder) { b.eventListItemRoot.background.colorFilter = when (event.type) { Event.TYPE_HOMEWORK -> PorterDuffColorFilter(0xffffffff.toInt(), PorterDuff.Mode.CLEAR) else -> PorterDuffColorFilter(event.color, PorterDuff.Mode.MULTIPLY) @@ -67,10 +98,10 @@ class EventListAdapter( onDismissListener = parentDialog.onDismissListener ) } - } + }*/ } - override fun getItemCount(): Int = eventList.size + override fun getItemCount() = items.size - class ViewHolder(val b: RowDialogEventListItemBinding) : RecyclerView.ViewHolder(b.root) + class ViewHolder(val b: EventListItemBinding) : RecyclerView.ViewHolder(b.root) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventListDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventListDialog.kt index 8a6e390e..e5690648 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventListDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventListDialog.kt @@ -6,6 +6,7 @@ package pl.szczodrzynski.edziennik.ui.dialogs.event import android.graphics.Typeface import android.view.View +import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Observer @@ -117,7 +118,9 @@ class EventListDialog( layoutManager = LinearLayoutManager(activity) } - adapter = EventListAdapter(activity, this@EventListDialog) + adapter = EventListAdapter(activity) { + Toast.makeText(activity, "Event clicked ${it.topic}", Toast.LENGTH_SHORT).show() + } b.eventListView.adapter = adapter app.db.eventDao().getAllByDateTime(profileId, date, time).observe(activity, Observer { events -> @@ -126,10 +129,10 @@ class EventListDialog( b.textNoEvents.visibility = View.VISIBLE } else { adapter.run { - eventList.apply { + /*items.apply { clear() addAll(events) - } + }*/ notifyDataSetChanged() } } 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 fdd6ec61..fe529f5c 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 @@ -94,8 +94,8 @@ class EventManualDialog( saveEvent() } - val negativeButton = dialog.getButton(BUTTON_NEUTRAL) - negativeButton?.setOnClickListener { + val neutralButton = dialog.getButton(BUTTON_NEUTRAL) + neutralButton?.setOnClickListener { showRemoveEventDialog() } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/timetable/LessonDetailsDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/timetable/LessonDetailsDialog.kt index 47412beb..a5d645bd 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/timetable/LessonDetailsDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/timetable/LessonDetailsDialog.kt @@ -50,24 +50,6 @@ class LessonDetailsDialog( onShowListener = onShowListener, onDismissListener = onDismissListener ) - /*MaterialAlertDialogBuilder(activity) - .setItems(R.array.main_menu_add_options) { dialog2, which -> - dialog2.dismiss() - EventManualDialogOld(activity, lesson.profileId) - .show( - activity.application as App, - null, - lesson.displayDate, - lesson.displayStartTime, - when (which) { - 1 -> EventManualDialogOld.DIALOG_HOMEWORK - else -> EventManualDialogOld.DIALOG_EVENT - } - ) - - } - .setNegativeButton(R.string.cancel) { dialog2, _ -> dialog2.dismiss() } - .show()*/ } .setOnDismissListener { onDismissListener?.invoke(TAG) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java index b5092603..9b1b0339 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java @@ -42,7 +42,7 @@ import pl.szczodrzynski.edziennik.data.db.modules.lessons.LessonFull; import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsenceFull; import pl.szczodrzynski.edziennik.databinding.FragmentAgendaCalendarBinding; import pl.szczodrzynski.edziennik.databinding.FragmentAgendaDefaultBinding; -import pl.szczodrzynski.edziennik.ui.dialogs.event.EventListDialog; +import pl.szczodrzynski.edziennik.ui.dialogs.day.DayDialog; import pl.szczodrzynski.edziennik.ui.dialogs.event.EventManualDialog; import pl.szczodrzynski.edziennik.ui.dialogs.lessonchange.LessonChangeDialog; import pl.szczodrzynski.edziennik.ui.dialogs.teacherabsence.TeacherAbsenceDialog; @@ -56,7 +56,6 @@ import pl.szczodrzynski.edziennik.utils.Colors; import pl.szczodrzynski.edziennik.utils.Themes; import pl.szczodrzynski.edziennik.utils.Utils; import pl.szczodrzynski.edziennik.utils.models.Date; -import pl.szczodrzynski.edziennik.utils.models.Time; import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetPrimaryItem; import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetSeparatorItem; @@ -332,7 +331,7 @@ public class AgendaFragment extends Fragment { @Override public void onEventSelected(CalendarEvent calendarEvent) { if (calendarEvent instanceof BaseCalendarEvent) { - if (!calendarEvent.isPlaceholder() && !calendarEvent.isAllDay()) { + /*if (!calendarEvent.isPlaceholder() && !calendarEvent.isAllDay()) { // new EventListDialogOld(activity).show(app, Date.fromCalendar(calendarEvent.getInstanceDay()), Time.fromMillis(calendarEvent.getStartTime().getTimeInMillis()), true); new EventListDialog( activity, @@ -341,16 +340,23 @@ public class AgendaFragment extends Fragment { Time.fromMillis(calendarEvent.getStartTime().getTimeInMillis()), null, null); - } else { + } else {*/ // new EventListDialogOld(activity).show(app, Date.fromCalendar(calendarEvent.getInstanceDay())); - new EventListDialog( + new DayDialog( + activity, + App.profileId, + Date.fromCalendar(calendarEvent.getInstanceDay()), + null, + null + ); + /*new EventListDialog( activity, App.profileId, Date.fromCalendar(calendarEvent.getInstanceDay()), null, null, - null); - } + null);*/ + //} } else if (calendarEvent instanceof LessonChangeEvent) { new LessonChangeDialog(activity).show(app, Date.fromCalendar(calendarEvent.getInstanceDay())); //Toast.makeText(app, "Clicked "+((LessonChangeEvent) calendarEvent).getLessonChangeDate().getFormattedString(), Toast.LENGTH_SHORT).show(); @@ -434,15 +440,22 @@ public class AgendaFragment extends Fragment { unreadEventDates.remove((Integer) scrolledDate); } + new DayDialog( + activity, + App.profileId, + dayDate, + null, + null + ); // new EventListDialogOld(getContext()).show(app, dayDate); - new EventListDialog( + /*new EventListDialog( activity, App.profileId, dayDate, null, null, null - ); + );*/ }); b_calendar.progressBar.setVisibility(View.GONE); }); diff --git a/app/src/main/res/drawable/ic_no_events.xml b/app/src/main/res/drawable/ic_no_events.xml new file mode 100644 index 00000000..4271148e --- /dev/null +++ b/app/src/main/res/drawable/ic_no_events.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_day.xml b/app/src/main/res/layout/dialog_day.xml new file mode 100644 index 00000000..0450559b --- /dev/null +++ b/app/src/main/res/layout/dialog_day.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_event_list.xml b/app/src/main/res/layout/dialog_event_list.xml index ed244c27..7e1c08fe 100644 --- a/app/src/main/res/layout/dialog_event_list.xml +++ b/app/src/main/res/layout/dialog_event_list.xml @@ -1,10 +1,9 @@ - + + android:layout_height="match_parent"> diff --git a/app/src/main/res/layout/event_list_item.xml b/app/src/main/res/layout/event_list_item.xml new file mode 100644 index 00000000..0cdaa733 --- /dev/null +++ b/app/src/main/res/layout/event_list_item.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 74be80c5..7030806e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1069,8 +1069,11 @@ Podaj kod Dodano %1$s przez %2$s%3$s Dodano %1$s%3$s + Dodano %1$s przez Ciebie%3$s Udostępniono %1$s przez %2$s%3$s Udostępniono %1$s przez Ciebie%3$s Pada śnieg, pada śnieg Dzwonią dzwonki sań + Brak wydarzeń tego dnia. + %s, %s