From 74db524db6047358790864f8dbfb59c01a16119a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 11 Nov 2019 23:59:45 +0100 Subject: [PATCH] [Timetable] Add lesson details dialog. --- .idea/misc.xml | 5 +- .../pl/szczodrzynski/edziennik/Binding.java | 21 ++ .../szczodrzynski/edziennik/MainActivity.kt | 7 +- .../dialogs/timetable/LessonDetailsDialog.kt | 139 ++++++++++ .../modules/timetable/v2/TimetableFragment.kt | 28 ++- .../timetable/v2/day/TimetableDayFragment.kt | 27 +- .../main/res/layout/dialog_lesson_details.xml | 237 ++++++++++++++++++ app/src/main/res/values/strings.xml | 7 + 8 files changed, 448 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/Binding.java create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/timetable/LessonDetailsDialog.kt create mode 100644 app/src/main/res/layout/dialog_lesson_details.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 4ccf11f8..e4b2b0ee 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -6,8 +6,9 @@ - - + + + diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/Binding.java b/app/src/main/java/pl/szczodrzynski/edziennik/Binding.java new file mode 100644 index 00000000..d9c97a16 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/Binding.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2019-11-11. + */ + +package pl.szczodrzynski.edziennik; + +import android.graphics.Paint; +import android.widget.TextView; + +import androidx.databinding.BindingAdapter; + +public class Binding { + @BindingAdapter("strikeThrough") + public static void strikeThrough(TextView textView, Boolean strikeThrough) { + if (strikeThrough) { + textView.setPaintFlags(textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); + } else { + textView.setPaintFlags(textView.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG); + } + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt index e84f210f..7e2de44d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt @@ -345,7 +345,7 @@ class MainActivity : AppCompatActivity() { if (!profileListEmpty) { handleIntent(intent?.extras) } - app.db.profileDao().getAllFull().observe(this, Observer { profiles -> + app.db.profileDao().allFull.observe(this, Observer { profiles -> // TODO fix weird -1 profiles ??? profiles.removeAll { it.id < 0 } drawer.setProfileList(profiles) @@ -362,7 +362,7 @@ class MainActivity : AppCompatActivity() { if (app.profile != null) setDrawerItems() - app.db.metadataDao().getUnreadCounts().observe(this, Observer { unreadCounters -> + app.db.metadataDao().unreadCounts.observe(this, Observer { unreadCounters -> unreadCounters.map { it.type = it.thingType } @@ -701,7 +701,8 @@ class MainActivity : AppCompatActivity() { } intentTargetId != -1 -> { drawer.currentProfile = app.profile.id - loadTarget(intentTargetId, extras) + if (navTargetId != intentTargetId) + loadTarget(intentTargetId, extras) } else -> { drawer.currentProfile = app.profile.id 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 new file mode 100644 index 00000000..06f924d0 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/timetable/LessonDetailsDialog.kt @@ -0,0 +1,139 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2019-11-11. + */ + +package pl.szczodrzynski.edziennik.ui.dialogs.timetable + +import android.app.Activity +import android.content.Intent +import android.view.View +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.R +import pl.szczodrzynski.edziennik.data.db.modules.timetable.Lesson +import pl.szczodrzynski.edziennik.data.db.modules.timetable.LessonFull +import pl.szczodrzynski.edziennik.databinding.DialogLessonDetailsBinding +import pl.szczodrzynski.edziennik.setText +import pl.szczodrzynski.edziennik.ui.dialogs.event.EventManualDialog +import pl.szczodrzynski.edziennik.ui.modules.timetable.v2.TimetableFragment +import pl.szczodrzynski.edziennik.utils.models.Date +import pl.szczodrzynski.edziennik.utils.models.Week + +class LessonDetailsDialog( + val activity: Activity, + val lesson: LessonFull +) { + companion object { + private const val TAG = "LessonDetailsDialog" + } + + init { run { + val b = DialogLessonDetailsBinding.inflate(activity.layoutInflater) + val dialog = MaterialAlertDialogBuilder(activity) + .setView(b.root) + .setPositiveButton(R.string.close) { dialog, _ -> + dialog.dismiss() + } + .setNeutralButton(R.string.add) { dialog, _ -> + dialog.dismiss() + MaterialAlertDialogBuilder(activity) + .setItems(R.array.main_menu_add_options) { dialog2, which -> + dialog2.dismiss() + EventManualDialog(activity, lesson.profileId) + .show( + activity.application as App, + null, + lesson.displayDate, + lesson.displayStartTime, + when (which) { + 1 -> EventManualDialog.DIALOG_HOMEWORK + else -> EventManualDialog.DIALOG_EVENT + } + ) + + } + .setNegativeButton(R.string.cancel) { dialog2, _ -> dialog2.dismiss() } + .show() + } + .show() + b.lesson = lesson + val lessonDate = lesson.displayDate ?: return@run + b.lessonDate.text = Week.getFullDayName(lessonDate.weekDay) + ", " + lessonDate.formattedString + + if (lesson.type >= Lesson.TYPE_SHIFTED_SOURCE) { + b.shiftedLayout.visibility = View.VISIBLE + var otherLessonDate: Date? = null + when (lesson.type) { + Lesson.TYPE_SHIFTED_SOURCE -> { + otherLessonDate = lesson.date + when { + lesson.date != lesson.oldDate -> b.shiftedText.setText( + R.string.timetable_lesson_shifted_other_day, + lesson.date?.stringY_m_d ?: "?", + lesson.startTime?.stringHM ?: "?" + ) + lesson.startTime != lesson.oldStartTime -> b.shiftedText.setText( + R.string.timetable_lesson_shifted_same_day, + lesson.startTime?.stringHM ?: "?" + ) + else -> b.shiftedText.setText(R.string.timetable_lesson_shifted) + } + } + Lesson.TYPE_SHIFTED_TARGET -> { + otherLessonDate = lesson.oldDate + when { + lesson.date != lesson.oldDate -> b.shiftedText.setText( + R.string.timetable_lesson_shifted_from_other_day, + lesson.oldDate?.stringY_m_d ?: "?", + lesson.oldStartTime?.stringHM ?: "?" + ) + lesson.startTime != lesson.oldStartTime -> b.shiftedText.setText( + R.string.timetable_lesson_shifted_from_same_day, + lesson.oldStartTime?.stringHM ?: "?" + ) + else -> b.shiftedText.setText(R.string.timetable_lesson_shifted_from) + } + } + } + b.shiftedGoTo.setOnClickListener { + dialog.dismiss() + val dateStr = otherLessonDate?.stringY_m_d ?: return@setOnClickListener + val intent = Intent(TimetableFragment.ACTION_SCROLL_TO_DATE).apply { + putExtra("date", dateStr) + } + activity.sendBroadcast(intent) + } + } + else { + b.shiftedLayout.visibility = View.GONE + } + + if (lesson.type < Lesson.TYPE_SHIFTED_SOURCE && lesson.oldSubjectId != null && lesson.subjectId != lesson.oldSubjectId) { + b.oldSubjectName = lesson.oldSubjectName + } + if (lesson.type != Lesson.TYPE_CANCELLED && lesson.subjectId != null) { + b.subjectName = lesson.subjectName + } + + if (lesson.type < Lesson.TYPE_SHIFTED_SOURCE && lesson.oldTeacherId != null && lesson.teacherId != lesson.oldTeacherId) { + b.oldTeacherName = lesson.oldTeacherName + } + if (lesson.type != Lesson.TYPE_CANCELLED && lesson.teacherId != null) { + b.teacherName = lesson.teacherName + } + + if (lesson.oldClassroom != null && lesson.classroom != lesson.oldClassroom) { + b.oldClassroom = lesson.oldClassroom + } + if (lesson.type != Lesson.TYPE_CANCELLED && lesson.classroom != null) { + b.classroom = lesson.classroom + } + + if (lesson.type < Lesson.TYPE_SHIFTED_SOURCE && lesson.oldTeamId != null && lesson.teamId != lesson.oldTeamId) { + b.oldTeamName = lesson.oldTeamName + } + if (lesson.type != Lesson.TYPE_CANCELLED && lesson.teamId != null) { + b.teamName = lesson.teamName + } + }} +} \ No newline at end of file diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/v2/TimetableFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/v2/TimetableFragment.kt index ac489ab6..56627dc0 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/v2/TimetableFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/v2/TimetableFragment.kt @@ -1,5 +1,9 @@ package pl.szczodrzynski.edziennik.ui.modules.timetable.v2 +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -18,12 +22,14 @@ import pl.szczodrzynski.edziennik.utils.models.Date class TimetableFragment : Fragment() { companion object { private const val TAG = "TimetableFragment" + const val ACTION_SCROLL_TO_DATE = "pl.szczodrzynski.edziennik.timetable.SCROLL_TO_DATE" } private lateinit var app: App private lateinit var activity: MainActivity private lateinit var b: FragmentTimetableV2Binding private var fabShown = false + private val items = mutableListOf() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { activity = (getActivity() as MainActivity?) ?: return null @@ -38,6 +44,24 @@ class TimetableFragment : Fragment() { return b.root } + private val broadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, i: Intent) { + if (!isAdded) + return + val dateStr = i.extras?.getString("date", null) ?: return + val date = Date.fromY_m_d(dateStr) + b.viewPager.setCurrentItem(items.indexOf(date), true) + } + } + override fun onResume() { + super.onResume() + activity.registerReceiver(broadcastReceiver, IntentFilter(ACTION_SCROLL_TO_DATE)) + } + override fun onPause() { + super.onPause() + activity.unregisterReceiver(broadcastReceiver) + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { // TODO check if app, activity, b can be null if (app.profile == null || !isAdded) @@ -51,7 +75,7 @@ class TimetableFragment : Fragment() { b.timetableLayout.visibility = View.VISIBLE b.timetableNotPublicLayout.visibility = View.GONE - val items = mutableListOf() + items.clear() val monthDayCount = listOf(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) @@ -99,7 +123,7 @@ class TimetableFragment : Fragment() { b.tabLayout.setCurrentItem(items.indexOfFirst { it.value == today }, false) //activity.navView.bottomBar.fabEnable = true - activity.navView.bottomBar.fabExtendedText = getString(R.string.timetable_today) + activity.navView.bottomBar.fabExtendedText = getString(pl.szczodrzynski.edziennik.R.string.timetable_today) activity.navView.bottomBar.fabIcon = CommunityMaterial.Icon.cmd_calendar_today activity.navView.setFabOnClickListener(View.OnClickListener { b.tabLayout.setCurrentItem(items.indexOfFirst { it.value == today }, true) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/v2/day/TimetableDayFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/v2/day/TimetableDayFragment.kt index 3e09faad..885cbb9c 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/v2/day/TimetableDayFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/v2/day/TimetableDayFragment.kt @@ -19,6 +19,7 @@ import pl.szczodrzynski.edziennik.data.db.modules.timetable.Lesson import pl.szczodrzynski.edziennik.data.db.modules.timetable.LessonFull import pl.szczodrzynski.edziennik.databinding.FragmentTimetableV2DayBinding import pl.szczodrzynski.edziennik.databinding.TimetableLessonBinding +import pl.szczodrzynski.edziennik.ui.dialogs.timetable.LessonDetailsDialog import pl.szczodrzynski.edziennik.utils.models.Date import pl.szczodrzynski.navlib.getColorFromAttr import java.util.* @@ -133,6 +134,8 @@ class TimetableDayFragment(val date: Date) : Fragment() { eventView.setOnClickListener { Log.d(TAG, "Clicked ${it.tag}") + if (isAdded && it.tag is LessonFull) + LessonDetailsDialog(activity, it.tag as LessonFull) } @@ -221,21 +224,17 @@ class TimetableDayFragment(val date: Date) : Fragment() { } Lesson.TYPE_SHIFTED_SOURCE -> { lb.annotationVisible = true - if (lesson.date != lesson.oldDate) { - lb.annotation.setText( + when { + lesson.date != lesson.oldDate -> lb.annotation.setText( R.string.timetable_lesson_shifted_other_day, lesson.date?.stringY_m_d ?: "?", lesson.startTime?.stringHM ?: "?" ) - } - else if (lesson.startTime != lesson.oldStartTime) { - lb.annotation.setText( + lesson.startTime != lesson.oldStartTime -> lb.annotation.setText( R.string.timetable_lesson_shifted_same_day, lesson.startTime?.stringHM ?: "?" ) - } - else { - lb.annotation.setText(R.string.timetable_lesson_shifted) + else -> lb.annotation.setText(R.string.timetable_lesson_shifted) } lb.annotation.background.colorFilter = PorterDuffColorFilter( @@ -245,21 +244,17 @@ class TimetableDayFragment(val date: Date) : Fragment() { } Lesson.TYPE_SHIFTED_TARGET -> { lb.annotationVisible = true - if (lesson.date != lesson.oldDate) { - lb.annotation.setText( + when { + lesson.date != lesson.oldDate -> lb.annotation.setText( R.string.timetable_lesson_shifted_from_other_day, lesson.oldDate?.stringY_m_d ?: "?", lesson.oldStartTime?.stringHM ?: "?" ) - } - else if (lesson.startTime != lesson.oldStartTime) { - lb.annotation.setText( + lesson.startTime != lesson.oldStartTime -> lb.annotation.setText( R.string.timetable_lesson_shifted_from_same_day, lesson.oldStartTime?.stringHM ?: "?" ) - } - else { - lb.annotation.setText(R.string.timetable_lesson_shifted_from) + else -> lb.annotation.setText(R.string.timetable_lesson_shifted_from) } lb.annotation.background.colorFilter = PorterDuffColorFilter( diff --git a/app/src/main/res/layout/dialog_lesson_details.xml b/app/src/main/res/layout/dialog_lesson_details.xml new file mode 100644 index 00000000..2e12a33e --- /dev/null +++ b/app/src/main/res/layout/dialog_lesson_details.xml @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +