From 3f61ab8299c582dda78950a891efb26d969cebb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Wed, 29 Apr 2020 15:14:45 +0200 Subject: [PATCH] [DB] Refactor database and entities. --- .../java/pl/szczodrzynski/edziennik/App.kt | 1 + .../edziennik/data/api/Regexes.kt | 3 + .../data/web/EdudziennikWebAnnouncements.kt | 25 +-- .../data/web/EdudziennikWebAttendance.kt | 42 +++-- .../data/web/EdudziennikWebEvents.kt | 3 +- .../data/web/EdudziennikWebExams.kt | 5 +- .../data/web/EdudziennikWebGrades.kt | 12 +- .../data/web/EdudziennikWebHomework.kt | 5 +- .../data/web/EdudziennikWebLuckyNumber.kt | 9 +- .../data/web/EdudziennikWebNotes.kt | 18 +- .../data/web/EdudziennikWebTimetable.kt | 3 +- .../data/api/IdziennikApiCurrentRegister.kt | 9 +- .../data/api/IdziennikApiMessagesInbox.kt | 6 +- .../data/api/IdziennikApiMessagesSent.kt | 5 +- .../data/web/IdziennikWebAnnouncements.kt | 19 +- .../data/web/IdziennikWebAttendance.kt | 122 +++++++----- .../idziennik/data/web/IdziennikWebExams.kt | 5 +- .../data/web/IdziennikWebGetMessage.kt | 3 +- .../idziennik/data/web/IdziennikWebGrades.kt | 22 ++- .../data/web/IdziennikWebHomework.kt | 8 +- .../idziennik/data/web/IdziennikWebNotices.kt | 25 ++- .../data/web/IdziennikWebProposedGrades.kt | 32 ++-- .../data/web/IdziennikWebSendMessage.kt | 2 +- .../data/web/IdziennikWebTimetable.kt | 3 +- .../idziennik/login/IdziennikLoginWeb.kt | 9 +- .../api/LibrusApiAnnouncementMarkAsRead.kt | 3 +- .../librus/data/api/LibrusApiAnnouncements.kt | 23 +-- .../data/api/LibrusApiAttendanceTypes.kt | 34 +++- .../librus/data/api/LibrusApiAttendances.kt | 42 +++-- .../data/api/LibrusApiBehaviourGrades.kt | 18 +- .../data/api/LibrusApiDescriptiveGrades.kt | 6 +- .../librus/data/api/LibrusApiEvents.kt | 6 +- .../librus/data/api/LibrusApiGrades.kt | 6 +- .../librus/data/api/LibrusApiHomework.kt | 6 +- .../librus/data/api/LibrusApiLuckyNumber.kt | 9 +- .../librus/data/api/LibrusApiNotices.kt | 18 +- .../librus/data/api/LibrusApiPointGrades.kt | 6 +- .../librus/data/api/LibrusApiPtMeetings.kt | 3 +- .../data/api/LibrusApiTeacherFreeDays.kt | 21 +-- .../librus/data/api/LibrusApiTextGrades.kt | 6 +- .../librus/data/api/LibrusApiTimetables.kt | 3 +- .../data/messages/LibrusMessagesGetList.kt | 6 +- .../data/messages/LibrusMessagesGetMessage.kt | 3 +- .../messages/LibrusMessagesSendMessage.kt | 2 +- .../data/synergia/LibrusSynergiaHomework.kt | 8 +- .../data/api/MobidziennikApiAttendance.kt | 49 +++-- .../data/api/MobidziennikApiEvents.kt | 7 +- .../data/api/MobidziennikApiGrades.kt | 7 +- .../data/api/MobidziennikApiHomework.kt | 6 +- .../data/api/MobidziennikApiNotices.kt | 19 +- .../data/api/MobidziennikApiTimetable.kt | 5 +- .../web/MobidziennikLuckyNumberExtractor.kt | 9 +- .../data/web/MobidziennikWebAttendance.kt | 82 +++++--- .../data/web/MobidziennikWebCalendar.kt | 4 +- .../data/web/MobidziennikWebGetMessage.kt | 3 +- .../data/web/MobidziennikWebGrades.kt | 6 +- .../data/web/MobidziennikWebMessagesAll.kt | 5 +- .../data/web/MobidziennikWebMessagesInbox.kt | 6 +- .../data/web/MobidziennikWebMessagesSent.kt | 6 +- .../data/web/MobidziennikWebSendMessage.kt | 2 +- .../vulcan/data/api/VulcanApiAttendance.kt | 37 ++-- .../vulcan/data/api/VulcanApiDictionaries.kt | 32 +++- .../vulcan/data/api/VulcanApiEvents.kt | 5 +- .../vulcan/data/api/VulcanApiGrades.kt | 7 +- .../data/api/VulcanApiMessagesChangeStatus.kt | 3 +- .../vulcan/data/api/VulcanApiMessagesInbox.kt | 6 +- .../vulcan/data/api/VulcanApiMessagesSent.kt | 6 +- .../vulcan/data/api/VulcanApiNotices.kt | 24 ++- .../data/api/VulcanApiProposedGrades.kt | 3 +- .../vulcan/data/api/VulcanApiSendMessage.kt | 2 +- .../vulcan/data/api/VulcanApiTimetable.kt | 3 +- .../edziennik/data/api/models/Data.kt | 43 ++--- .../data/api/models/DataRemoveModel.kt | 8 +- .../edziennik/data/api/task/AppSync.kt | 3 +- .../edziennik/data/api/task/Notifications.kt | 28 +-- .../szczodrzynski/edziennik/data/db/AppDb.kt | 5 +- .../data/db/dao/AnnouncementDao.java | 82 -------- .../edziennik/data/db/dao/AnnouncementDao.kt | 69 +++++++ .../edziennik/data/db/dao/AttendanceDao.java | 108 ----------- .../edziennik/data/db/dao/AttendanceDao.kt | 74 ++++++++ .../edziennik/data/db/dao/BaseDao.kt | 23 ++- .../edziennik/data/db/dao/EventDao.kt | 7 +- .../edziennik/data/db/dao/GradeDao.kt | 139 +++++++------- .../edziennik/data/db/dao/LuckyNumberDao.java | 87 --------- .../edziennik/data/db/dao/LuckyNumberDao.kt | 74 ++++++++ .../edziennik/data/db/dao/MessageDao.kt | 10 +- .../edziennik/data/db/dao/MetadataDao.java | 42 ++--- .../edziennik/data/db/dao/NoticeDao.java | 82 -------- .../edziennik/data/db/dao/NoticeDao.kt | 72 +++++++ .../data/db/dao/TeacherAbsenceDao.kt | 99 +++++----- .../edziennik/data/db/dao/TimetableDao.kt | 173 +++++++---------- .../data/db/entity/Announcement.java | 58 ------ .../edziennik/data/db/entity/Announcement.kt | 40 ++++ .../edziennik/data/db/entity/Attendance.java | 65 ------- .../edziennik/data/db/entity/Attendance.kt | 68 +++++++ .../data/db/entity/AttendanceType.kt | 19 +- .../edziennik/data/db/entity/Event.kt | 3 +- .../edziennik/data/db/entity/Grade.kt | 26 +-- .../edziennik/data/db/entity/Lesson.kt | 12 +- .../edziennik/data/db/entity/LuckyNumber.java | 35 ---- .../edziennik/data/db/entity/LuckyNumber.kt | 22 +++ .../edziennik/data/db/entity/Message.kt | 5 +- .../edziennik/data/db/entity/Metadata.java | 5 +- .../edziennik/data/db/entity/Notice.java | 49 ----- .../edziennik/data/db/entity/Notice.kt | 43 +++++ .../data/db/entity/TeacherAbsence.kt | 58 +++--- .../data/db/full/AnnouncementFull.java | 16 -- .../data/db/full/AnnouncementFull.kt | 25 +++ .../data/db/full/AttendanceFull.java | 19 -- .../edziennik/data/db/full/AttendanceFull.kt | 28 +++ .../edziennik/data/db/full/EventFull.kt | 11 +- .../edziennik/data/db/full/GradeFull.kt | 10 +- .../edziennik/data/db/full/LessonFull.kt | 10 +- .../data/db/full/LuckyNumberFull.java | 15 -- .../edziennik/data/db/full/LuckyNumberFull.kt | 19 ++ .../edziennik/data/db/full/MessageFull.kt | 9 +- .../edziennik/data/db/full/NoticeFull.java | 16 -- .../edziennik/data/db/full/NoticeFull.kt | 22 +++ .../data/db/full/TeacherAbsenceFull.kt | 19 +- .../data/db/migration/Migration86.kt | 176 ++++++++++++++++++ .../data/firebase/SzkolnyAppFirebase.kt | 8 +- .../dialogs/bell/BellSyncTimeChooseDialog.kt | 2 +- .../edziennik/ui/dialogs/day/DayDialog.kt | 2 +- .../ui/dialogs/event/EventManualDialog.kt | 9 +- .../ui/dialogs/grade/GradeDetailsDialog.kt | 2 +- .../teacherabsence/TeacherAbsenceAdapter.kt | 2 +- .../teacherabsence/TeacherAbsenceDialog.kt | 2 +- .../ui/modules/agenda/AgendaFragment.kt | 4 +- .../announcements/AnnouncementsAdapter.java | 21 ++- .../announcements/AnnouncementsFragment.java | 10 +- .../modules/attendance/AttendanceAdapter.java | 17 +- .../attendance/AttendanceFragment.java | 24 +-- .../modules/behaviour/BehaviourFragment.java | 4 +- .../ui/modules/behaviour/NoticesAdapter.kt | 4 +- .../grades/editor/GradesEditorFragment.kt | 2 +- .../grades/viewholder/GradeViewHolder.kt | 2 +- .../ui/modules/home/CounterActivity.kt | 2 +- .../ui/modules/home/cards/HomeGradesCard.kt | 3 +- .../modules/home/cards/HomeLuckyNumberCard.kt | 2 +- .../modules/timetable/TimetableDayFragment.kt | 2 +- .../ui/modules/views/TimeDropdown.kt | 2 +- .../luckynumber/WidgetLuckyNumberProvider.kt | 2 +- .../utils/managers/AttendanceManager.kt | 50 +++++ .../main/res/layout/dialog_grade_details.xml | 2 +- 144 files changed, 1788 insertions(+), 1492 deletions(-) delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AnnouncementDao.java create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AnnouncementDao.kt delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AttendanceDao.java create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AttendanceDao.kt delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/LuckyNumberDao.java create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/LuckyNumberDao.kt delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/NoticeDao.java create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/NoticeDao.kt delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Announcement.java create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Announcement.kt delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Attendance.java create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Attendance.kt delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/LuckyNumber.java create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/LuckyNumber.kt delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Notice.java create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Notice.kt delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AnnouncementFull.java create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AnnouncementFull.kt delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AttendanceFull.java create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AttendanceFull.kt delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/LuckyNumberFull.java create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/LuckyNumberFull.kt delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/NoticeFull.java create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/NoticeFull.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/migration/Migration86.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/AttendanceManager.kt diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt index 7194aa04..051dff38 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt @@ -66,6 +66,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { val timetableManager by lazy { TimetableManager(this) } val eventManager by lazy { EventManager(this) } val permissionManager by lazy { PermissionManager(this) } + val attendanceManager by lazy { AttendanceManager(this) } val db get() = App.db diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt index 57dceb0e..92aecbd8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt @@ -68,6 +68,9 @@ object Regexes { } + val MOBIDZIENNIK_ATTENDANCE_TYPES by lazy { + """Legenda:.+?normal;">(.+?)""".toRegex(DOT_MATCHES_ALL) + } val MOBIDZIENNIK_ATTENDANCE_TABLE by lazy { """(.+?)
""".toRegex(DOT_MATCHES_ALL) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAnnouncements.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAnnouncements.kt index 11f048b5..32ca353c 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAnnouncements.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAnnouncements.kt @@ -45,24 +45,25 @@ class EdudziennikWebAnnouncements(override val data: DataEdudziennik, val addedDate = Date.fromIsoHm(dateString) val announcementObject = Announcement( - profileId, - id, - subject, - null, - startDate, - null, - teacher.id, - longId - ) + profileId = profileId, + id = id, + subject = subject, + text = null, + startDate = startDate, + endDate = null, + teacherId = teacher.id, + addedDate = addedDate + ).also { + it.idString = longId + } - data.announcementIgnoreList.add(announcementObject) + data.announcementList.add(announcementObject) data.metadataList.add(Metadata( profileId, Metadata.TYPE_ANNOUNCEMENT, id, profile.empty, - profile.empty, - addedDate + profile.empty )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAttendance.kt index 92545117..e6f75694 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAttendance.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAttendance.kt @@ -39,12 +39,12 @@ class EdudziennikWebAttendance(override val data: DataEdudziennik, val attendanceTypes = EDUDZIENNIK_ATTENDANCE_TYPES.find(text)?.get(1)?.split(',')?.map { val type = EDUDZIENNIK_ATTENDANCE_TYPE.find(it.trim()) - val symbol = type?.get(1)?.trim() - val name = type?.get(2)?.trim() + val symbol = type?.get(1)?.trim() ?: "?" + val name = type?.get(2)?.trim() ?: "nieznany rodzaj" return@map Triple( symbol, name, - when (name?.toLowerCase(Locale.ROOT)) { + when (name.toLowerCase(Locale.ROOT)) { "obecność" -> Attendance.TYPE_PRESENT "nieobecność" -> Attendance.TYPE_ABSENT "spóźnienie" -> Attendance.TYPE_BELATED @@ -52,7 +52,7 @@ class EdudziennikWebAttendance(override val data: DataEdudziennik, "dzień wolny" -> Attendance.TYPE_DAY_FREE "brak zajęć" -> Attendance.TYPE_DAY_FREE "oddelegowany" -> Attendance.TYPE_RELEASED - else -> Attendance.TYPE_CUSTOM + else -> Attendance.TYPE_UNKNOWN } ) } ?: emptyList() @@ -62,38 +62,42 @@ class EdudziennikWebAttendance(override val data: DataEdudziennik, val lessonNumber = attendanceElement[2].toInt() val attendanceSymbol = attendanceElement[3] - val lessons = data.app.db.timetableDao().getForDateNow(profileId, date) + val lessons = data.app.db.timetableDao().getAllForDateNow(profileId, date) val lesson = lessons.firstOrNull { it.lessonNumber == lessonNumber } val id = "${date.stringY_m_d}:$lessonNumber:$attendanceSymbol".crc32() - val (_, name, type) = attendanceTypes.firstOrNull { (symbol, _, _) -> symbol == attendanceSymbol } + val (typeSymbol, typeName, baseType) = attendanceTypes.firstOrNull { (symbol, _, _) -> symbol == attendanceSymbol } ?: return@forEach val startTime = data.lessonRanges.singleOrNull { it.lessonNumber == lessonNumber }?.startTime ?: return@forEach val attendanceObject = Attendance( - profileId, - id, - lesson?.displayTeacherId ?: -1, - lesson?.displaySubjectId ?: -1, - profile.currentSemester, - name, - date, - lesson?.displayStartTime ?: startTime, - type - ) + profileId = profileId, + id = id, + baseType = baseType, + typeName = typeName, + typeShort = data.app.attendanceManager.getTypeShort(baseType), + typeSymbol = typeSymbol, + typeColor = null, + date = date, + startTime = lesson?.displayStartTime ?: startTime, + semester = profile.currentSemester, + teacherId = lesson?.displayTeacherId ?: -1, + subjectId = lesson?.displaySubjectId ?: -1 + ).also { + it.lessonNumber = lessonNumber + } data.attendanceList.add(attendanceObject) - if(type != Attendance.TYPE_PRESENT) { + if (baseType != Attendance.TYPE_PRESENT) { data.metadataList.add(Metadata( profileId, Metadata.TYPE_ATTENDANCE, id, profile.empty, - profile.empty, - System.currentTimeMillis() + profile.empty )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebEvents.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebEvents.kt index 52833b9a..35c68478 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebEvents.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebEvents.kt @@ -57,8 +57,7 @@ class EdudziennikWebEvents(override val data: DataEdudziennik, Metadata.TYPE_EVENT, id, profile.empty, - profile.empty, - System.currentTimeMillis() + profile.empty )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebExams.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebExams.kt index 8e7836fd..f6abf637 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebExams.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebExams.kt @@ -46,7 +46,7 @@ class EdudziennikWebExams(override val data: DataEdudziennik, if (dateString.isBlank()) return@forEach val date = Date.fromY_m_d(dateString) - val lessons = data.app.db.timetableDao().getForDateNow(profileId, date) + val lessons = data.app.db.timetableDao().getAllForDateNow(profileId, date) val startTime = lessons.firstOrNull { it.displaySubjectId == subject.id }?.displayStartTime val eventTypeElement = examElement.child(3).child(0) @@ -74,8 +74,7 @@ class EdudziennikWebExams(override val data: DataEdudziennik, Metadata.TYPE_EVENT, id, profile.empty, - profile.empty, - System.currentTimeMillis() + profile.empty )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebGrades.kt index 50557333..459f13aa 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebGrades.kt @@ -126,7 +126,8 @@ class EdudziennikWebGrades(override val data: DataEdudziennik, comment = null, semester = semester, teacherId = teacher.id, - subjectId = subject.id + subjectId = subject.id, + addedDate = addedDate ) data.gradeList.add(gradeObject) @@ -135,8 +136,7 @@ class EdudziennikWebGrades(override val data: DataEdudziennik, Metadata.TYPE_GRADE, id, profile.empty, - profile.empty, - addedDate + profile.empty )) } @@ -168,8 +168,7 @@ class EdudziennikWebGrades(override val data: DataEdudziennik, Metadata.TYPE_GRADE, proposedGradeObject.id, profile.empty, - profile.empty, - System.currentTimeMillis() + profile.empty )) } @@ -201,8 +200,7 @@ class EdudziennikWebGrades(override val data: DataEdudziennik, Metadata.TYPE_GRADE, finalGradeObject.id, profile.empty, - profile.empty, - System.currentTimeMillis() + profile.empty )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebHomework.kt index acabcfa6..169a5127 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebHomework.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebHomework.kt @@ -43,7 +43,7 @@ class EdudziennikWebHomework(override val data: DataEdudziennik, val subjectName = subjectElement.text() val subject = data.getSubject(subjectId, subjectName) - val lessons = data.app.db.timetableDao().getForDateNow(profileId, date) + val lessons = data.app.db.timetableDao().getAllForDateNow(profileId, date) val startTime = lessons.firstOrNull { it.subjectId == subject.id }?.displayStartTime val teacherName = homeworkElement.child(2).text() @@ -72,8 +72,7 @@ class EdudziennikWebHomework(override val data: DataEdudziennik, Metadata.TYPE_HOMEWORK, id, profile.empty, - profile.empty, - System.currentTimeMillis() + profile.empty )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebLuckyNumber.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebLuckyNumber.kt index 70c6849a..db8164c8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebLuckyNumber.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebLuckyNumber.kt @@ -24,9 +24,9 @@ class EdudziennikWebLuckyNumber(override val data: DataEdudziennik, webGet(TAG, data.schoolEndpoint + "Lucky", xhr = true) { text -> text.toIntOrNull()?.also { luckyNumber -> val luckyNumberObject = LuckyNumber( - profileId, - Date.getToday(), - luckyNumber + profileId = profileId, + date = Date.getToday(), + number = luckyNumber ) data.luckyNumberList.add(luckyNumberObject) @@ -35,8 +35,7 @@ class EdudziennikWebLuckyNumber(override val data: DataEdudziennik, Metadata.TYPE_LUCKY_NUMBER, luckyNumberObject.date.value.toLong(), true, - profile.empty, - System.currentTimeMillis() + profile.empty )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebNotes.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebNotes.kt index a111ef79..35a78168 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebNotes.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebNotes.kt @@ -41,12 +41,15 @@ class EdudziennikWebNotes(override val data: DataEdudziennik, val description = noteElement.child(3).text() val noticeObject = Notice( - profileId, - id, - description, - profile.currentSemester, - Notice.TYPE_NEUTRAL, - teacher.id + profileId = profileId, + id = id, + type = Notice.TYPE_NEUTRAL, + semester = profile.currentSemester, + text = description, + category = null, + points = null, + teacherId = teacher.id, + addedDate = addedDate ) data.noticeList.add(noticeObject) @@ -55,8 +58,7 @@ class EdudziennikWebNotes(override val data: DataEdudziennik, Metadata.TYPE_NOTICE, id, profile.empty, - profile.empty, - addedDate + profile.empty )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebTimetable.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebTimetable.kt index 3a31e208..94db15ef 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebTimetable.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebTimetable.kt @@ -124,8 +124,7 @@ class EdudziennikWebTimetable(override val data: DataEdudziennik, Metadata.TYPE_LESSON_CHANGE, lessonObject.id, seen, - seen, - System.currentTimeMillis() + seen )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiCurrentRegister.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiCurrentRegister.kt index 0e000fb1..d5e59596 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiCurrentRegister.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiCurrentRegister.kt @@ -68,9 +68,9 @@ class IdziennikApiCurrentRegister(override val data: DataIdziennik, val luckyNumberObject = LuckyNumber( - data.profileId, - luckyNumberDate, - luckyNumber + profileId = data.profileId, + date = luckyNumberDate, + number = luckyNumber ) data.luckyNumberList.add(luckyNumberObject) @@ -80,8 +80,7 @@ class IdziennikApiCurrentRegister(override val data: DataIdziennik, Metadata.TYPE_LUCKY_NUMBER, luckyNumberObject.date.value.toLong(), true, - data.profile?.empty ?: false, - System.currentTimeMillis() + data.profile?.empty ?: false )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesInbox.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesInbox.kt index 58e7660c..622068e2 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesInbox.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesInbox.kt @@ -69,7 +69,8 @@ class IdziennikApiMessagesInbox(override val data: DataIdziennik, type = if (jMessage.getBoolean("rekordUsuniety") == true) TYPE_DELETED else TYPE_RECEIVED, subject = subject, body = body, - senderId = rTeacher.id + senderId = rTeacher.id, + addedDate = sentDate ) val messageRecipient = MessageRecipient( @@ -87,8 +88,7 @@ class IdziennikApiMessagesInbox(override val data: DataIdziennik, Metadata.TYPE_MESSAGE, message.id, readDate > 0, - readDate > 0 || profile?.empty ?: false, - sentDate + readDate > 0 || profile?.empty ?: false )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesSent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesSent.kt index 286c9896..87b3264d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesSent.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesSent.kt @@ -51,7 +51,8 @@ class IdziennikApiMessagesSent(override val data: DataIdziennik, type = TYPE_SENT, subject = subject, body = body, - senderId = null + senderId = null, + addedDate = sentDate ) for (recipientEl in jMessage.getAsJsonArray("odbiorcy")) { @@ -76,7 +77,7 @@ class IdziennikApiMessagesSent(override val data: DataIdziennik, } data.messageList.add(message) - data.metadataList.add(Metadata(profileId, Metadata.TYPE_MESSAGE, message.id, true, true, sentDate)) + data.metadataList.add(Metadata(profileId, Metadata.TYPE_MESSAGE, message.id, true, true)) } data.setSyncNext(ENDPOINT_IDZIENNIK_API_MESSAGES_SENT, DAY, DRAWER_ITEM_MESSAGES) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAnnouncements.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAnnouncements.kt index f8744efa..531cbeeb 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAnnouncements.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAnnouncements.kt @@ -52,14 +52,14 @@ class IdziennikWebAnnouncements(override val data: DataIdziennik, val startDate = jAnnouncement.getString("DataWydarzenia")?.replace("[^\\d]".toRegex(), "")?.toLongOrNull()?.let { Date.fromMillis(it) } val announcementObject = Announcement( - profileId, - announcementId, - jAnnouncement.get("Temat").asString, - jAnnouncement.get("Tresc").asString, - startDate, - null, - rTeacher.id, - null + profileId = profileId, + id = announcementId, + subject = jAnnouncement.get("Temat").asString, + text = jAnnouncement.get("Tresc").asString, + startDate = startDate, + endDate = null, + teacherId = rTeacher.id, + addedDate = addedDate ) data.announcementList.add(announcementObject) data.metadataList.add(Metadata( @@ -67,8 +67,7 @@ class IdziennikWebAnnouncements(override val data: DataIdziennik, Metadata.TYPE_ANNOUNCEMENT, announcementObject.id, profile?.empty ?: false, - profile?.empty ?: false, - addedDate + profile?.empty ?: false )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAttendance.kt index aa0a9998..d67acbdf 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAttendance.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAttendance.kt @@ -12,10 +12,18 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.ENDPOINT_IDZIENNI import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb import pl.szczodrzynski.edziennik.data.api.models.ApiError import pl.szczodrzynski.edziennik.data.db.entity.Attendance -import pl.szczodrzynski.edziennik.data.db.entity.Attendance.* +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_ABSENT +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_ABSENT_EXCUSED +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_BELATED +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_PRESENT +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_PRESENT_CUSTOM +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_RELEASED +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_UNKNOWN import pl.szczodrzynski.edziennik.data.db.entity.Metadata import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS +import pl.szczodrzynski.edziennik.getInt import pl.szczodrzynski.edziennik.getJsonObject +import pl.szczodrzynski.edziennik.getString import pl.szczodrzynski.edziennik.utils.models.Date import pl.szczodrzynski.edziennik.utils.models.Time @@ -51,71 +59,97 @@ class IdziennikWebAttendance(override val data: DataIdziennik, for (jAttendanceEl in json.getAsJsonArray("Obecnosci")) { val jAttendance = jAttendanceEl.asJsonObject // jAttendance - val attendanceTypeIdziennik = jAttendance.get("TypObecnosci").asInt - if (attendanceTypeIdziennik == 5 || attendanceTypeIdziennik == 7) - continue - val attendanceDate = Date.fromY_m_d(jAttendance.get("Data").asString) - val attendanceTime = Time.fromH_m(jAttendance.get("OdDoGodziny").asString) - if (attendanceDate.combineWith(attendanceTime) > System.currentTimeMillis()) + val type = jAttendance.get("TypObecnosci").asInt + + // skip "zajęcia nie odbyły się" and "Ferie" + if (type == 5 || type == 7) continue - val attendanceId = jAttendance.get("IdLesson").asString.crc16().toLong() + val date = Date.fromY_m_d(jAttendance.get("Data").asString) + val time = Time.fromH_m(jAttendance.get("OdDoGodziny").asString) + if (date.combineWith(time) > System.currentTimeMillis()) + continue + + val id = jAttendance.get("IdLesson").asString.crc16().toLong() val rSubject = data.getSubject(jAttendance.get("Przedmiot").asString, jAttendance.get("IdPrzedmiot").asLong, "") val rTeacher = data.getTeacherByFDotSpaceLast(jAttendance.get("PrzedmiotNauczyciel").asString) - var attendanceName = "obecność" - var attendanceType = Attendance.TYPE_CUSTOM + var baseType = TYPE_UNKNOWN + var typeName = "nieznany rodzaj" + var typeSymbol: String? = null + var typeColor: Long? = null - when (attendanceTypeIdziennik) { - 1 /* nieobecność usprawiedliwiona */ -> { - attendanceName = "nieobecność usprawiedliwiona" - attendanceType = TYPE_ABSENT_EXCUSED + /* https://iuczniowie.progman.pl/idziennik/mod_panelRodzica/obecnosci/obecnosciUcznia_lmt637231494660000000.js */ + /* https://iuczniowie.progman.pl/idziennik/mod_panelRodzica/obecnosci/obecnosci_lmt637231494660000000.css */ + when (type) { + 1 -> { + baseType = TYPE_ABSENT_EXCUSED + typeName = "nieobecność usprawiedliwiona" + typeColor = 0xffffe099 } - 2 /* spóźnienie */ -> { - attendanceName = "spóźnienie" - attendanceType = TYPE_BELATED + 2 -> { + baseType = TYPE_BELATED + typeName = "spóźnienie" + typeColor = 0xffffffaa } - 3 /* nieobecność nieusprawiedliwiona */ -> { - attendanceName = "nieobecność nieusprawiedliwiona" - attendanceType = TYPE_ABSENT + 3 -> { + baseType = TYPE_ABSENT + typeName = "nieobecność nieusprawiedliwiona" + typeColor = 0xffffad99 } - 4 /* zwolnienie */, 9 /* zwolniony / obecny */ -> { - attendanceType = TYPE_RELEASED - if (attendanceTypeIdziennik == 4) - attendanceName = "zwolnienie" - if (attendanceTypeIdziennik == 9) - attendanceName = "zwolnienie / obecność" + 4, 9 -> { + baseType = TYPE_RELEASED + if (type == 4) { + typeName = "zwolnienie" + typeColor = 0xffa8beff + } + if (type == 9) { + typeName = "zwolniony / obecny" + typeSymbol = "zb" + typeColor = 0xffff69b4 + } } - 0 /* obecny */, 8 /* Wycieczka */ -> { - attendanceType = TYPE_PRESENT - if (attendanceTypeIdziennik == 8) - attendanceName = "wycieczka" + 8 -> { + baseType = TYPE_PRESENT_CUSTOM + typeName = "wycieczka" + typeSymbol = "w" + typeColor = null + } + 0 -> { + baseType = TYPE_PRESENT + typeName = "obecny" + typeColor = 0xffccffcc } } - val semester = profile?.dateToSemester(attendanceDate) ?: 1 + val semester = profile?.dateToSemester(date) ?: 1 val attendanceObject = Attendance( - profileId, - attendanceId, - rTeacher.id, - rSubject.id, - semester, - attendanceName, - attendanceDate, - attendanceTime, - attendanceType - ) + profileId = profileId, + id = id, + baseType = baseType, + typeName = typeName, + typeShort = typeSymbol ?: data.app.attendanceManager.getTypeShort(baseType), + typeSymbol = typeSymbol ?: data.app.attendanceManager.getTypeShort(baseType), + typeColor = typeColor?.toInt(), + date = date, + startTime = time, + semester = semester, + teacherId = rTeacher.id, + subjectId = rSubject.id + ).also { + it.lessonTopic = jAttendance.getString("PrzedmiotTemat") + it.lessonNumber = jAttendance.getInt("Godzina") + } data.attendanceList.add(attendanceObject) - if (attendanceObject.type != TYPE_PRESENT) { + if (attendanceObject.baseType != TYPE_PRESENT) { data.metadataList.add(Metadata( profileId, Metadata.TYPE_ATTENDANCE, attendanceObject.id, profile?.empty ?: false, - profile?.empty ?: false, - System.currentTimeMillis() + profile?.empty ?: false )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebExams.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebExams.kt index 82e63e79..25c06945 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebExams.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebExams.kt @@ -68,7 +68,7 @@ class IdziennikWebExams(override val data: DataIdziennik, val teacherId = data.getTeacherByLastFirst(teacherName).id val topic = exam.getString("zakres")?.trim() ?: "" - val lessonList = data.db.timetableDao().getForDateNow(profileId, examDate) + val lessonList = data.db.timetableDao().getAllForDateNow(profileId, examDate) val startTime = lessonList.firstOrNull { it.subjectId == subjectId }?.startTime val eventType = when (exam.getString("rodzaj")?.toLowerCase(Locale.getDefault())) { @@ -98,8 +98,7 @@ class IdziennikWebExams(override val data: DataIdziennik, Metadata.TYPE_EVENT, eventObject.id, profile?.empty ?: false, - profile?.empty ?: false, - System.currentTimeMillis() + profile?.empty ?: false )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetMessage.kt index e709122d..bd1808df 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetMessage.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetMessage.kt @@ -94,8 +94,7 @@ class IdziennikWebGetMessage(override val data: DataIdziennik, Metadata.TYPE_MESSAGE, message.id, message.seen, - message.notified, - message.addedDate + message.notified )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGrades.kt index b3237c82..90e17401 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGrades.kt @@ -63,6 +63,8 @@ class IdziennikWebGrades(override val data: DataIdziennik, colorInt = Color.parseColor("#$gradeColor") } + val addedDate = grade.getString("Data_wystaw")?.let { Date.fromY_m_d(it).inMillis } ?: System.currentTimeMillis() + val gradeObject = Grade( profileId = profileId, id = id, @@ -76,7 +78,9 @@ class IdziennikWebGrades(override val data: DataIdziennik, comment = null, semester = semester, teacherId = teacher.id, - subjectId = subject.id) + subjectId = subject.id, + addedDate = addedDate + ) when (grade.getInt("Typ")) { 0 -> { @@ -100,6 +104,8 @@ class IdziennikWebGrades(override val data: DataIdziennik, colorInt = Color.parseColor("#$historyColor") } + val addedDate = historyItem.getString("Data_wystaw")?.let { Date.fromY_m_d(it).inMillis } ?: System.currentTimeMillis() + val historyObject = Grade( profileId = profileId, id = gradeObject.id * -1, @@ -113,19 +119,18 @@ class IdziennikWebGrades(override val data: DataIdziennik, comment = null, semester = historyItem.getInt("Semestr") ?: 1, teacherId = teacher.id, - subjectId = subject.id) + subjectId = subject.id, + addedDate = addedDate + ) historyObject.parentId = gradeObject.id - val addedDate = historyItem.getString("Data_wystaw")?.let { Date.fromY_m_d(it).inMillis } ?: System.currentTimeMillis() - data.gradeList.add(historyObject) data.metadataList.add(Metadata( profileId, Metadata.TYPE_GRADE, historyObject.id, true, - true, - addedDate + true )) } // update the current grade's value with an average of all historical grades and itself @@ -147,8 +152,6 @@ class IdziennikWebGrades(override val data: DataIdziennik, } } - val addedDate = grade.getString("Data_wystaw")?.let { Date.fromY_m_d(it).inMillis } ?: System.currentTimeMillis() - data.gradeList.add(gradeObject) data.metadataList.add( Metadata( @@ -156,8 +159,7 @@ class IdziennikWebGrades(override val data: DataIdziennik, Metadata.TYPE_GRADE, id, data.profile.empty, - data.profile.empty, - addedDate + data.profile.empty )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebHomework.kt index 2289e13d..10b4a0c3 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebHomework.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebHomework.kt @@ -57,7 +57,7 @@ class IdziennikWebHomework(override val data: DataIdziennik, val subjectId = data.getSubject(subjectName, null, subjectName).id val teacherName = homework.getString("usr") ?: return@forEach val teacherId = data.getTeacherByLastFirst(teacherName).id - val lessonList = data.db.timetableDao().getForDateNow(profileId, eventDate) + val lessonList = data.db.timetableDao().getAllForDateNow(profileId, eventDate) val startTime = lessonList.firstOrNull { it.subjectId == subjectId }?.displayStartTime val topic = homework.getString("tytul")?.trim() ?: "" @@ -77,7 +77,8 @@ class IdziennikWebHomework(override val data: DataIdziennik, type = Event.TYPE_HOMEWORK, teacherId = teacherId, subjectId = subjectId, - teamId = data.teamClass?.id ?: -1 + teamId = data.teamClass?.id ?: -1, + addedDate = addedDate.inMillis ) data.eventList.add(eventObject) @@ -86,8 +87,7 @@ class IdziennikWebHomework(override val data: DataIdziennik, Metadata.TYPE_HOMEWORK, eventObject.id, seen, - seen, - addedDate.inMillis + seen )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebNotices.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebNotices.kt index dcc560d5..64108bfd 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebNotices.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebNotices.kt @@ -13,9 +13,12 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb import pl.szczodrzynski.edziennik.data.api.models.ApiError import pl.szczodrzynski.edziennik.data.db.entity.Metadata import pl.szczodrzynski.edziennik.data.db.entity.Notice -import pl.szczodrzynski.edziennik.data.db.entity.Notice.* +import pl.szczodrzynski.edziennik.data.db.entity.Notice.Companion.TYPE_NEGATIVE +import pl.szczodrzynski.edziennik.data.db.entity.Notice.Companion.TYPE_NEUTRAL +import pl.szczodrzynski.edziennik.data.db.entity.Notice.Companion.TYPE_POSITIVE import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS import pl.szczodrzynski.edziennik.getJsonObject +import pl.szczodrzynski.edziennik.getString import pl.szczodrzynski.edziennik.utils.models.Date class IdziennikWebNotices(override val data: DataIdziennik, @@ -53,20 +56,24 @@ class IdziennikWebNotices(override val data: DataIdziennik, } val noticeObject = Notice( - profileId, - noticeId, - jNotice.get("Tresc").asString, - jNotice.get("Semestr").asInt, - nType, - rTeacher.id) + profileId = profileId, + id = noticeId, + type = nType, + semester = jNotice.get("Semestr").asInt, + text = jNotice.getString("Tresc") ?: "", + category = null, + points = null, + teacherId = rTeacher.id, + addedDate = addedDate.inMillis + ) + data.noticeList.add(noticeObject) data.metadataList.add(Metadata( profileId, Metadata.TYPE_NOTICE, noticeObject.id, profile?.empty ?: false, - profile?.empty ?: false, - addedDate.inMillis + profile?.empty ?: false )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebProposedGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebProposedGrades.kt index c2639e51..b23e9f98 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebProposedGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebProposedGrades.kt @@ -76,6 +76,11 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik, else -1 if (semester1Proposed != "") { + val addedDate = if (data.profile.empty) + data.profile.dateSemester1Start.inMillis + else + System.currentTimeMillis() + val gradeObject = Grade( profileId = profileId, id = semester1Id, @@ -89,26 +94,26 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik, comment = null, semester = 1, teacherId = -1, - subjectId = subjectObject.id + subjectId = subjectObject.id, + addedDate = addedDate ) - val addedDate = if (data.profile.empty) - data.profile.dateSemester1Start.inMillis - else - System.currentTimeMillis() - data.gradeList.add(gradeObject) data.metadataList.add(Metadata( profileId, Metadata.TYPE_GRADE, gradeObject.id, profile.empty, - profile.empty, - addedDate + profile.empty )) } if (semester2Proposed != "") { + val addedDate = if (data.profile.empty) + data.profile.dateSemester2Start.inMillis + else + System.currentTimeMillis() + val gradeObject = Grade( profileId = profileId, id = semester2Id, @@ -122,22 +127,17 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik, comment = null, semester = 2, teacherId = -1, - subjectId = subjectObject.id + subjectId = subjectObject.id, + addedDate = addedDate ) - val addedDate = if (data.profile.empty) - data.profile.dateSemester2Start.inMillis - else - System.currentTimeMillis() - data.gradeList.add(gradeObject) data.metadataList.add(Metadata( profileId, Metadata.TYPE_GRADE, gradeObject.id, profile.empty, - profile.empty, - addedDate + profile.empty )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebSendMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebSendMessage.kt index 973bc74f..343ebcac 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebSendMessage.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebSendMessage.kt @@ -59,7 +59,7 @@ class IdziennikWebSendMessage(override val data: DataIdziennik, IdziennikApiMessagesSent(data, null) { val message = data.messageList.firstOrNull { it.type == Message.TYPE_SENT && it.subject == subject } val metadata = data.metadataList.firstOrNull { it.thingType == Metadata.TYPE_MESSAGE && it.thingId == message?.id } - val event = MessageSentEvent(data.profileId, message, metadata?.addedDate) + val event = MessageSentEvent(data.profileId, message, message?.addedDate) EventBus.getDefault().postSticky(event) onSuccess() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebTimetable.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebTimetable.kt index 066346cd..e7d293c4 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebTimetable.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebTimetable.kt @@ -165,8 +165,7 @@ class IdziennikWebTimetable(override val data: DataIdziennik, Metadata.TYPE_LESSON_CHANGE, lessonObject.id, seen, - seen, - System.currentTimeMillis() + seen )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt index e15f9410..2c6ad0e7 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt @@ -74,9 +74,9 @@ class IdziennikLoginWeb(val data: DataIdziennik, val onSuccess: () -> Unit) { Regexes.IDZIENNIK_WEB_LUCKY_NUMBER.find(text)?.also { val number = it[1].toIntOrNull() ?: return@also val luckyNumberObject = LuckyNumber( - data.profileId, - Date.getToday(), - number + profileId = data.profileId, + date = Date.getToday(), + number = number ) data.luckyNumberList.add(luckyNumberObject) @@ -86,8 +86,7 @@ class IdziennikLoginWeb(val data: DataIdziennik, val onSuccess: () -> Unit) { Metadata.TYPE_LUCKY_NUMBER, luckyNumberObject.date.value.toLong(), true, - profile.empty, - System.currentTimeMillis() + profile.empty )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncementMarkAsRead.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncementMarkAsRead.kt index d40c1a9a..23cfceb4 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncementMarkAsRead.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncementMarkAsRead.kt @@ -37,8 +37,7 @@ class LibrusApiAnnouncementMarkAsRead(override val data: DataLibrus, Metadata.TYPE_ANNOUNCEMENT, announcement.id, announcement.seen, - announcement.notified, - announcement.addedDate + announcement.notified )) onSuccess() } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncements.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncements.kt index 8256b859..d19be231 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncements.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncements.kt @@ -38,15 +38,17 @@ class LibrusApiAnnouncements(override val data: DataLibrus, val read = announcement.getBoolean("WasRead") ?: false val announcementObject = Announcement( - profileId, - id, - subject, - text, - startDate, - endDate, - teacherId, - longId - ) + profileId = profileId, + id = id, + subject = subject, + text = text, + startDate = startDate, + endDate = endDate, + teacherId = teacherId, + addedDate = addedDate + ).also { + it.idString = longId + } data.announcementList.add(announcementObject) data.setSeenMetadataList.add(Metadata( @@ -54,8 +56,7 @@ class LibrusApiAnnouncements(override val data: DataLibrus, Metadata.TYPE_ANNOUNCEMENT, id, read, - profile.empty || read, - addedDate + profile.empty || read )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendanceTypes.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendanceTypes.kt index d7cbc00c..c620d13d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendanceTypes.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendanceTypes.kt @@ -26,25 +26,39 @@ class LibrusApiAttendanceTypes(override val data: DataLibrus, attendanceTypes?.forEach { attendanceType -> val id = attendanceType.getLong("Id") ?: return@forEach - val name = attendanceType.getString("Name") ?: "" - val color = attendanceType.getString("ColorRGB")?.let { Color.parseColor("#$it") } ?: -1 - val standardId = when (attendanceType.getBoolean("Standard") ?: false) { - true -> id - false -> attendanceType.getJsonObject("StandardType")?.getLong("Id") ?: id - } - val type = when (standardId) { + val typeName = attendanceType.getString("Name") ?: "" + val typeSymbol = attendanceType.getString("Short") ?: "" + val typeColor = attendanceType.getString("ColorRGB")?.let { Color.parseColor("#$it") } + + val isStandard = attendanceType.getBoolean("Standard") ?: false + val baseType = when (attendanceType.getJsonObject("StandardType")?.getLong("Id") ?: id) { 1L -> Attendance.TYPE_ABSENT 2L -> Attendance.TYPE_BELATED 3L -> Attendance.TYPE_ABSENT_EXCUSED 4L -> Attendance.TYPE_RELEASED - /*100*/else -> Attendance.TYPE_PRESENT + /*100*/else -> when (isStandard) { + true -> Attendance.TYPE_PRESENT + false -> Attendance.TYPE_PRESENT_CUSTOM + } + } + val typeShort = when (isStandard) { + true -> data.app.attendanceManager.getTypeShort(baseType) + false -> typeSymbol } - data.attendanceTypes.put(id, AttendanceType(profileId, id, name, type, color)) + data.attendanceTypes.put(id, AttendanceType( + profileId, + id, + baseType, + typeName, + typeShort, + typeSymbol, + typeColor + )) } - data.setSyncNext(ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES, 4*DAY) + data.setSyncNext(ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES, 2*DAY) onSuccess(ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendances.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendances.kt index 3727788d..cf9d7729 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendances.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendances.kt @@ -13,7 +13,6 @@ import pl.szczodrzynski.edziennik.data.db.entity.Attendance import pl.szczodrzynski.edziennik.data.db.entity.Metadata import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS import pl.szczodrzynski.edziennik.utils.models.Date -import pl.szczodrzynski.edziennik.utils.models.Time class LibrusApiAttendances(override val data: DataLibrus, override val lastSync: Long?, @@ -42,9 +41,9 @@ class LibrusApiAttendances(override val data: DataLibrus, val lessonDate = Date.fromY_m_d(attendance.getString("Date")) val teacherId = attendance.getJsonObject("AddedBy")?.getLong("Id") val semester = attendance.getInt("Semester") ?: return@forEach - val type = attendance.getJsonObject("Type")?.getLong("Id") ?: return@forEach - val typeObject = data.attendanceTypes[type] ?: null - val topic = typeObject?.name ?: "" + + val typeId = attendance.getJsonObject("Type")?.getLong("Id") ?: return@forEach + val type = data.attendanceTypes[typeId] ?: null val startTime = data.lessonRanges.get(lessonNo)?.startTime @@ -52,29 +51,34 @@ class LibrusApiAttendances(override val data: DataLibrus, data.librusLessons.singleOrNull { it.lessonId == lessonId } else null - val attendanceObject = Attendance( - profileId, - id, - teacherId ?: lesson?.teacherId ?: -1, - lesson?.subjectId ?: -1, - semester, - topic, - lessonDate, - startTime ?: Time(0, 0, 0), - typeObject?.type ?: Attendance.TYPE_CUSTOM - ) - val addedDate = Date.fromIso(attendance.getString("AddDate") ?: return@forEach) + val attendanceObject = Attendance( + profileId = profileId, + id = id, + baseType = type?.baseType ?: Attendance.TYPE_UNKNOWN, + typeName = type?.typeName ?: "nieznany rodzaj", + typeShort = type?.typeShort ?: "?", + typeSymbol = type?.typeSymbol ?: "?", + typeColor = type?.typeColor, + date = lessonDate, + startTime = startTime, + semester = semester, + teacherId = teacherId ?: lesson?.teacherId ?: -1, + subjectId = lesson?.subjectId ?: -1, + addedDate = addedDate + ).also { + it.lessonNumber = lessonNo + } + data.attendanceList.add(attendanceObject) - if(typeObject?.type != Attendance.TYPE_PRESENT) { + if(type?.baseType != Attendance.TYPE_PRESENT) { data.metadataList.add(Metadata( profileId, Metadata.TYPE_ATTENDANCE, id, profile?.empty ?: false, - profile?.empty ?: false, - addedDate + profile?.empty ?: false )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiBehaviourGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiBehaviourGrades.kt index 5a374ec9..fae79a50 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiBehaviourGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiBehaviourGrades.kt @@ -55,7 +55,8 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus, comment = null, semester = 1, teacherId = -1, - subjectId = 1 + subjectId = 1, + addedDate = profile.getSemesterStart(1).inMillis ) data.gradeList.add(semester1StartGradeObject) @@ -64,8 +65,7 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus, Metadata.TYPE_GRADE, semester1StartGradeObject.id, true, - true, - profile.getSemesterStart(1).inMillis + true )) } @@ -83,7 +83,8 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus, comment = null, semester = 2, teacherId = -1, - subjectId = 1 + subjectId = 1, + addedDate = profile.getSemesterStart(2).inMillis ) data.gradeList.add(semester2StartGradeObject) @@ -92,8 +93,7 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus, Metadata.TYPE_GRADE, semester2StartGradeObject.id, true, - true, - profile.getSemesterStart(2).inMillis + true )) } @@ -155,7 +155,8 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus, comment = if (text != null) description.join(" - ") else null, semester = semester, teacherId = teacherId, - subjectId = 1 + subjectId = 1, + addedDate = addedDate ).apply { valueMax = valueTo } @@ -166,8 +167,7 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus, Metadata.TYPE_GRADE, id, profile.empty, - profile.empty, - addedDate + profile.empty )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiDescriptiveGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiDescriptiveGrades.kt index 42e318e0..8cc4f1c1 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiDescriptiveGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiDescriptiveGrades.kt @@ -65,7 +65,8 @@ class LibrusApiDescriptiveGrades(override val data: DataLibrus, comment = null, semester = semester, teacherId = teacherId, - subjectId = subjectId + subjectId = subjectId, + addedDate = addedDate ) data.gradeList.add(gradeObject) @@ -74,8 +75,7 @@ class LibrusApiDescriptiveGrades(override val data: DataLibrus, Metadata.TYPE_GRADE, id, profile.empty, - profile.empty, - addedDate + profile.empty )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiEvents.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiEvents.kt index 52f52844..5999a48e 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiEvents.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiEvents.kt @@ -56,7 +56,8 @@ class LibrusApiEvents(override val data: DataLibrus, type = type, teacherId = teacherId, subjectId = subjectId, - teamId = teamId + teamId = teamId, + addedDate = addedDate ) data.eventList.add(eventObject) @@ -66,8 +67,7 @@ class LibrusApiEvents(override val data: DataLibrus, Metadata.TYPE_EVENT, id, profile?.empty ?: false, - profile?.empty ?: false, - addedDate + profile?.empty ?: false )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiGrades.kt index 7ff42fde..c2e2d0ce 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiGrades.kt @@ -79,7 +79,8 @@ class LibrusApiGrades(override val data: DataLibrus, comment = null, semester = semester, teacherId = teacherId, - subjectId = subjectId + subjectId = subjectId, + addedDate = addedDate ) grade.getJsonObject("Improvement")?.also { @@ -98,8 +99,7 @@ class LibrusApiGrades(override val data: DataLibrus, Metadata.TYPE_GRADE, id, profile.empty, - profile.empty, - addedDate + profile.empty )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiHomework.kt index d47fbfdf..c1183c19 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiHomework.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiHomework.kt @@ -43,7 +43,8 @@ class LibrusApiHomework(override val data: DataLibrus, type = -1, teacherId = teacherId, subjectId = -1, - teamId = -1 + teamId = -1, + addedDate = addedDate.inMillis ) data.eventList.add(eventObject) @@ -52,8 +53,7 @@ class LibrusApiHomework(override val data: DataLibrus, Metadata.TYPE_HOMEWORK, id, profile?.empty ?: false, - profile?.empty ?: false, - addedDate.inMillis + profile?.empty ?: false )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiLuckyNumber.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiLuckyNumber.kt index 5a52cd69..80e6e299 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiLuckyNumber.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiLuckyNumber.kt @@ -33,9 +33,9 @@ class LibrusApiLuckyNumber(override val data: DataLibrus, val luckyNumberDate = Date.fromY_m_d(luckyNumberEl.getString("LuckyNumberDay")) ?: Date.getToday() val luckyNumber = luckyNumberEl.getInt("LuckyNumber") ?: -1 val luckyNumberObject = LuckyNumber( - profileId, - luckyNumberDate, - luckyNumber + profileId = profileId, + date = luckyNumberDate, + number = luckyNumber ) if (luckyNumberDate >= Date.getToday()) @@ -50,8 +50,7 @@ class LibrusApiLuckyNumber(override val data: DataLibrus, Metadata.TYPE_LUCKY_NUMBER, luckyNumberObject.date.value.toLong(), true, - profile?.empty ?: false, - System.currentTimeMillis() + profile?.empty ?: false )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiNotices.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiNotices.kt index e05cbfd7..ba531afe 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiNotices.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiNotices.kt @@ -46,12 +46,15 @@ class LibrusApiNotices(override val data: DataLibrus, val semester = profile?.dateToSemester(addedDate) ?: 1 val noticeObject = Notice( - profileId, - id, - categoryText + "\n" + text, - semester, - type, - teacherId + profileId = profileId, + id = id, + type = type, + semester = semester, + text = text, + category = categoryText, + points = null, + teacherId = teacherId, + addedDate = addedDate.inMillis ) data.noticeList.add(noticeObject) @@ -61,8 +64,7 @@ class LibrusApiNotices(override val data: DataLibrus, Metadata.TYPE_NOTICE, id, profile?.empty ?: false, - profile?.empty ?: false, - addedDate.inMillis + profile?.empty ?: false )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPointGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPointGrades.kt index fae45318..9da2c435 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPointGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPointGrades.kt @@ -56,7 +56,8 @@ class LibrusApiPointGrades(override val data: DataLibrus, comment = null, semester = semester, teacherId = teacherId, - subjectId = subjectId + subjectId = subjectId, + addedDate = addedDate ).apply { valueMax = category?.valueTo ?: 0f } @@ -67,8 +68,7 @@ class LibrusApiPointGrades(override val data: DataLibrus, Metadata.TYPE_GRADE, id, profile.empty, - profile.empty, - addedDate + profile.empty )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPtMeetings.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPtMeetings.kt index de696a99..6c0a9dd7 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPtMeetings.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPtMeetings.kt @@ -58,8 +58,7 @@ class LibrusApiPtMeetings(override val data: DataLibrus, Metadata.TYPE_EVENT, id, profile?.empty ?: false, - profile?.empty ?: false, - System.currentTimeMillis() + profile?.empty ?: false )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTeacherFreeDays.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTeacherFreeDays.kt index 3d4db1aa..973ada46 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTeacherFreeDays.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTeacherFreeDays.kt @@ -43,15 +43,15 @@ class LibrusApiTeacherFreeDays(override val data: DataLibrus, val timeTo = teacherAbsence.getString("TimeTo")?.let { Time.fromH_m_s(it) } val teacherAbsenceObject = TeacherAbsence( - profileId, - id, - teacherId, - type, - name, - dateFrom, - dateTo, - timeFrom, - timeTo + profileId = profileId, + id = id, + type = type, + name = name, + dateFrom = dateFrom, + dateTo = dateTo, + timeFrom = timeFrom, + timeTo = timeTo, + teacherId = teacherId ) data.teacherAbsenceList.add(teacherAbsenceObject) @@ -60,8 +60,7 @@ class LibrusApiTeacherFreeDays(override val data: DataLibrus, Metadata.TYPE_TEACHER_ABSENCE, id, true, - profile?.empty ?: false, - System.currentTimeMillis() + profile?.empty ?: false )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTextGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTextGrades.kt index cf020425..7b7c8c6f 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTextGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTextGrades.kt @@ -60,7 +60,8 @@ class LibrusApiTextGrades(override val data: DataLibrus, comment = grade.getString("Phrase") /* whatever it is */, semester = semester, teacherId = teacherId, - subjectId = subjectId + subjectId = subjectId, + addedDate = addedDate ) data.gradeList.add(gradeObject) @@ -69,8 +70,7 @@ class LibrusApiTextGrades(override val data: DataLibrus, Metadata.TYPE_GRADE, id, profile.empty, - profile.empty, - addedDate + profile.empty )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTimetables.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTimetables.kt index 7c1eec61..9a463a6b 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTimetables.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTimetables.kt @@ -198,8 +198,7 @@ class LibrusApiTimetables(override val data: DataLibrus, Metadata.TYPE_LESSON_CHANGE, lessonObject.id, seen, - seen, - System.currentTimeMillis() + seen )) } data.lessonList.add(lessonObject) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetList.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetList.kt index 35148cef..9f962bf9 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetList.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetList.kt @@ -97,7 +97,8 @@ class LibrusMessagesGetList(override val data: DataLibrus, type = type, subject = subject, body = null, - senderId = senderId + senderId = senderId, + addedDate = sentDate ) val messageRecipientObject = MessageRecipient( @@ -120,8 +121,7 @@ class LibrusMessagesGetList(override val data: DataLibrus, Metadata.TYPE_MESSAGE, id, notified, - notified, - sentDate + notified )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetMessage.kt index bb4c620b..49ee0d52 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetMessage.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetMessage.kt @@ -150,8 +150,7 @@ class LibrusMessagesGetMessage(override val data: DataLibrus, Metadata.TYPE_MESSAGE, messageObject.id, true, - true, - messageObject.addedDate + true )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesSendMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesSendMessage.kt index 9364f2b8..d568135e 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesSendMessage.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesSendMessage.kt @@ -50,7 +50,7 @@ class LibrusMessagesSendMessage(override val data: DataLibrus, LibrusMessagesGetList(data, type = Message.TYPE_SENT, lastSync = null) { val message = data.messageList.firstOrNull { it.type == Message.TYPE_SENT && it.id == id } val metadata = data.metadataList.firstOrNull { it.thingType == Metadata.TYPE_MESSAGE && it.thingId == message?.id } - val event = MessageSentEvent(data.profileId, message, metadata?.addedDate) + val event = MessageSentEvent(data.profileId, message, message?.addedDate) EventBus.getDefault().postSticky(event) onSuccess() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaHomework.kt index 48f88ef4..d33f6911 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaHomework.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaHomework.kt @@ -58,7 +58,7 @@ class LibrusSynergiaHomework(override val data: DataLibrus, elements[9].select("input").attr("onclick") )?.get(1)?.toLong() ?: return@forEachIndexed - val lessons = data.db.timetableDao().getForDateNow(profileId, eventDate) + val lessons = data.db.timetableDao().getAllForDateNow(profileId, eventDate) val startTime = lessons.firstOrNull { it.subjectId == subjectId }?.startTime val seen = when (profile.empty) { @@ -76,7 +76,8 @@ class LibrusSynergiaHomework(override val data: DataLibrus, type = Event.TYPE_HOMEWORK, teacherId = teacherId, subjectId = subjectId, - teamId = data.teamClass?.id ?: -1 + teamId = data.teamClass?.id ?: -1, + addedDate = addedDate.inMillis ) data.eventList.add(eventObject) @@ -85,8 +86,7 @@ class LibrusSynergiaHomework(override val data: DataLibrus, Metadata.TYPE_HOMEWORK, id, seen, - seen, - addedDate.inMillis + seen )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiAttendance.kt index be68de4d..d9d7abb7 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiAttendance.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiAttendance.kt @@ -6,7 +6,10 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.api import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik import pl.szczodrzynski.edziennik.data.db.entity.Attendance -import pl.szczodrzynski.edziennik.data.db.entity.Attendance.* +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_ABSENT +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_ABSENT_EXCUSED +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_PRESENT +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_RELEASED import pl.szczodrzynski.edziennik.data.db.entity.Metadata class MobidziennikApiAttendance(val data: DataMobidziennik, rows: List) { @@ -23,7 +26,7 @@ class MobidziennikApiAttendance(val data: DataMobidziennik, rows: List) val id = cols[0].toLong() val lessonId = cols[1].toLong() data.mobiLessons.singleOrNull { it.id == lessonId }?.let { lesson -> - val type = when (cols[4]) { + val baseType = when (cols[4]) { "2" -> TYPE_ABSENT "5" -> TYPE_ABSENT_EXCUSED "4" -> TYPE_RELEASED @@ -31,16 +34,37 @@ class MobidziennikApiAttendance(val data: DataMobidziennik, rows: List) } val semester = data.profile?.dateToSemester(lesson.date) ?: 1 + val typeName = when (baseType) { + TYPE_ABSENT -> "nieobecność" + TYPE_ABSENT_EXCUSED -> "nieobecność usprawiedliwiona" + TYPE_RELEASED -> "zwolnienie" + TYPE_PRESENT -> "obecność" + else -> "nieznany rodzaj" + } + val typeSymbol = when (baseType) { + TYPE_ABSENT -> "|" + TYPE_ABSENT_EXCUSED -> "+" + TYPE_RELEASED -> "z" + TYPE_PRESENT -> "." + else -> "?" + } + val attendanceObject = Attendance( - data.profileId, - id, - lesson.teacherId, - lesson.subjectId, - semester, - lesson.topic, - lesson.date, - lesson.startTime, - type) + profileId = data.profileId, + id = id, + baseType = baseType, + typeName = typeName, + typeShort = data.app.attendanceManager.getTypeShort(baseType), + typeSymbol = typeSymbol, + typeColor = null, + date = lesson.date, + startTime = lesson.startTime, + semester = semester, + teacherId = lesson.teacherId, + subjectId = lesson.subjectId + ).also { + it.lessonTopic = lesson.topic + } data.attendanceList.add(attendanceObject) data.metadataList.add( @@ -49,8 +73,7 @@ class MobidziennikApiAttendance(val data: DataMobidziennik, rows: List) Metadata.TYPE_ATTENDANCE, id, data.profile?.empty ?: false, - data.profile?.empty ?: false, - System.currentTimeMillis() + data.profile?.empty ?: false )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiEvents.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiEvents.kt index 02fbb67e..7a72d3de 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiEvents.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiEvents.kt @@ -60,7 +60,9 @@ class MobidziennikApiEvents(val data: DataMobidziennik, rows: List) { type = type, teacherId = teacherId, subjectId = subjectId, - teamId = teamId) + teamId = teamId, + addedDate = addedDate + ) data.eventList.add(eventObject) data.metadataList.add( @@ -69,8 +71,7 @@ class MobidziennikApiEvents(val data: DataMobidziennik, rows: List) { Metadata.TYPE_EVENT, id, data.profile?.empty ?: false, - data.profile?.empty ?: false, - addedDate + data.profile?.empty ?: false )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiGrades.kt index 609c895c..c3c1b449 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiGrades.kt @@ -79,7 +79,9 @@ class MobidziennikApiGrades(val data: DataMobidziennik, rows: List) { comment = null, semester = semester, teacherId = teacherId, - subjectId = subjectId) + subjectId = subjectId, + addedDate = addedDate + ) if (data.profile?.empty == true) { addedDate = data.profile.dateSemester1Start.inMillis @@ -92,8 +94,7 @@ class MobidziennikApiGrades(val data: DataMobidziennik, rows: List) { Metadata.TYPE_GRADE, id, data.profile?.empty ?: false, - data.profile?.empty ?: false, - addedDate + data.profile?.empty ?: false )) addedDate++ } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiHomework.kt index 4623a26d..683a8820 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiHomework.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiHomework.kt @@ -40,7 +40,8 @@ class MobidziennikApiHomework(val data: DataMobidziennik, rows: List) { type = Event.TYPE_HOMEWORK, teacherId = teacherId, subjectId = subjectId, - teamId = teamId) + teamId = teamId + ) data.eventList.add(eventObject) data.metadataList.add( @@ -49,8 +50,7 @@ class MobidziennikApiHomework(val data: DataMobidziennik, rows: List) { Metadata.TYPE_HOMEWORK, id, data.profile?.empty ?: false, - data.profile?.empty ?: false, - System.currentTimeMillis() + data.profile?.empty ?: false )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiNotices.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiNotices.kt index f1d9aed2..66bfe1fd 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiNotices.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiNotices.kt @@ -33,12 +33,16 @@ class MobidziennikApiNotices(val data: DataMobidziennik, rows: List) { val addedDate = Date.fromYmd(cols[7]).inMillis val noticeObject = Notice( - data.profileId, - id, - text, - semester, - type, - teacherId) + profileId = data.profileId, + id = id, + type = type, + semester = semester, + text = text, + category = null, + points = null, + teacherId = teacherId, + addedDate = addedDate + ) data.noticeList.add(noticeObject) data.metadataList.add( @@ -47,8 +51,7 @@ class MobidziennikApiNotices(val data: DataMobidziennik, rows: List) { Metadata.TYPE_NOTICE, id, data.profile?.empty ?: false, - data.profile?.empty ?: false, - addedDate + data.profile?.empty ?: false )) } }} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiTimetable.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiTimetable.kt index 6a7ce02d..a82ab4ef 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiTimetable.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiTimetable.kt @@ -8,9 +8,9 @@ import android.util.SparseArray import androidx.core.util.set import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel +import pl.szczodrzynski.edziennik.data.db.entity.Lesson import pl.szczodrzynski.edziennik.data.db.entity.LessonRange import pl.szczodrzynski.edziennik.data.db.entity.Metadata -import pl.szczodrzynski.edziennik.data.db.entity.Lesson import pl.szczodrzynski.edziennik.fixName import pl.szczodrzynski.edziennik.keys import pl.szczodrzynski.edziennik.singleOrNull @@ -97,8 +97,7 @@ class MobidziennikApiTimetable(val data: DataMobidziennik, rows: List) { Metadata.TYPE_LESSON_CHANGE, it.id, seen, - seen, - System.currentTimeMillis() + seen )) } data.lessonList += it diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikLuckyNumberExtractor.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikLuckyNumberExtractor.kt index 5e1445ec..ece23d7f 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikLuckyNumberExtractor.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikLuckyNumberExtractor.kt @@ -17,9 +17,9 @@ class MobidziennikLuckyNumberExtractor(val data: DataMobidziennik, text: String) val luckyNumber = it.groupValues[1].toInt() val luckyNumberObject = LuckyNumber( - data.profileId, - Date.getToday(), - luckyNumber + profileId = data.profileId, + date = Date.getToday(), + number = luckyNumber ) data.luckyNumberList.add(luckyNumberObject) @@ -29,8 +29,7 @@ class MobidziennikLuckyNumberExtractor(val data: DataMobidziennik, text: String) Metadata.TYPE_LUCKY_NUMBER, luckyNumberObject.date.value.toLong(), true, - data.profile?.empty ?: false, - System.currentTimeMillis() + data.profile?.empty ?: false )) } catch (_: Exception){} } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebAttendance.kt index c56c56d9..57fef0a8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebAttendance.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebAttendance.kt @@ -11,7 +11,12 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.ENDPOINT_MOBID import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikWeb import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel import pl.szczodrzynski.edziennik.data.db.entity.Attendance -import pl.szczodrzynski.edziennik.data.db.entity.Attendance.* +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_ABSENT +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_ABSENT_EXCUSED +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_BELATED +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_PRESENT +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_RELEASED +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_UNKNOWN import pl.szczodrzynski.edziennik.data.db.entity.Metadata import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS import pl.szczodrzynski.edziennik.fixName @@ -71,6 +76,18 @@ class MobidziennikWebAttendance(override val data: DataMobidziennik, val start = System.currentTimeMillis() + val types = Regexes.MOBIDZIENNIK_ATTENDANCE_TYPES + .find(text) + ?.get(1) + ?.split("
") + ?.map { + it.trimEnd(',') + .split(" ", limit = 2) + .let { it.getOrNull(0) to it.getOrNull(1) } + } + ?.toMap() + val typeSymbols = types?.keys?.filterNotNull() ?: listOf() + Regexes.MOBIDZIENNIK_ATTENDANCE_TABLE.findAll(text).forEach { tableResult -> val table = tableResult[1] val lessonDates = mutableListOf() @@ -92,14 +109,14 @@ class MobidziennikWebAttendance(override val data: DataMobidziennik, return@forEach ranges.forEach { range -> val lessonDate = dateIterator.next() - val entry = entriesIterator.next() + var entry = entriesIterator.next() if (entry.isBlank()) return@forEach val startTime = Time.fromH_m(range[1]) - val entryIterator = entry.iterator() + range[2].split(" / ").mapNotNull { Regexes.MOBIDZIENNIK_ATTENDANCE_LESSON.find(it) }.forEachIndexed { index, lesson -> val topic = lesson[2] - if (topic.startsWith("Lekcja odwołana: ") || !entryIterator.hasNext()) + if (topic.startsWith("Lekcja odwołana: ") || entry.isEmpty()) return@forEachIndexed val subjectName = lesson[1] //val team = lesson[3] @@ -108,39 +125,58 @@ class MobidziennikWebAttendance(override val data: DataMobidziennik, val teacherId = data.teacherList.singleOrNull { it.fullNameLastFirst == teacherName }?.id ?: -1 val subjectId = data.subjectList.singleOrNull { it.longName == subjectName }?.id ?: -1 - val type = when (entryIterator.nextChar()) { - '.' -> TYPE_PRESENT - '|' -> TYPE_ABSENT - '+' -> TYPE_ABSENT_EXCUSED - 's' -> TYPE_BELATED - 'z' -> TYPE_RELEASED - else -> TYPE_PRESENT + var typeSymbol = "" + for (symbol in typeSymbols) { + if (entry.startsWith(symbol) && symbol.length > typeSymbol.length) + typeSymbol = symbol } + entry = entry.removePrefix(typeSymbol) + + val baseType = when (typeSymbol) { + "." -> TYPE_PRESENT + "|" -> TYPE_ABSENT + "+" -> TYPE_ABSENT_EXCUSED + "s" -> TYPE_BELATED + "z" -> TYPE_RELEASED + else -> TYPE_UNKNOWN + } + val typeName = types?.get(typeSymbol) ?: "" + + val typeShort = when (baseType) { + TYPE_UNKNOWN -> typeSymbol + else -> data.app.attendanceManager.getTypeShort(baseType) + } + val semester = data.profile?.dateToSemester(lessonDate) ?: 1 val id = lessonDate.combineWith(startTime) / 6L * 10L + (lesson[0].hashCode() and 0xFFFF) + index val attendanceObject = Attendance( - data.profileId, - id, - teacherId, - subjectId, - semester, - topic, - lessonDate, - startTime, - type) + profileId = profileId, + id = id, + baseType = baseType, + typeName = typeName, + typeShort = typeShort, + typeSymbol = typeSymbol, + typeColor = null, + date = lessonDate, + startTime = startTime, + semester = semester, + teacherId = teacherId, + subjectId = subjectId + ).also { + it.lessonTopic = topic + } data.attendanceList.add(attendanceObject) - if (type != TYPE_PRESENT) { + if (baseType != TYPE_PRESENT) { data.metadataList.add( Metadata( data.profileId, Metadata.TYPE_ATTENDANCE, id, data.profile?.empty ?: false, - data.profile?.empty ?: false, - System.currentTimeMillis() + data.profile?.empty ?: false )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebCalendar.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebCalendar.kt index c1749d76..95c1f6df 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebCalendar.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebCalendar.kt @@ -89,8 +89,8 @@ class MobidziennikWebCalendar(override val data: DataMobidziennik, Metadata.TYPE_EVENT, eventObject.id, profile?.empty ?: false, - profile?.empty ?: false, - System.currentTimeMillis() /* no addedDate here though */ + profile?.empty ?: false + /* no addedDate here though */ )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetMessage.kt index 1c44a219..105c0943 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetMessage.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetMessage.kt @@ -139,8 +139,7 @@ class MobidziennikWebGetMessage(override val data: DataMobidziennik, Metadata.TYPE_MESSAGE, message.id, true, - true, - message.addedDate + true )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGrades.kt index de058c91..9f5fab95 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGrades.kt @@ -125,7 +125,8 @@ class MobidziennikWebGrades(override val data: DataMobidziennik, comment = null, semester = gradeSemester, teacherId = teacherId, - subjectId = subjectId + subjectId = subjectId, + addedDate = gradeAddedDateMillis ) gradeObject.classAverage = gradeClassAverage @@ -137,8 +138,7 @@ class MobidziennikWebGrades(override val data: DataMobidziennik, Metadata.TYPE_GRADE, gradeObject.id, profile.empty, - profile.empty, - gradeAddedDateMillis + profile.empty )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesAll.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesAll.kt index c0373c54..4e8f900a 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesAll.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesAll.kt @@ -77,11 +77,12 @@ class MobidziennikWebMessagesAll(override val data: DataMobidziennik, type = type, subject = subject, body = null, - senderId = senderId + senderId = senderId, + addedDate = addedDate ) data.messageList.add(message) - data.metadataList.add(Metadata(profileId, Metadata.TYPE_MESSAGE, message.id, true, true, addedDate)) + data.metadataList.add(Metadata(profileId, Metadata.TYPE_MESSAGE, message.id, true, true)) } // sync every 7 days as we probably don't expect more than diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesInbox.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesInbox.kt index 385ea71e..be762228 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesInbox.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesInbox.kt @@ -63,7 +63,8 @@ class MobidziennikWebMessagesInbox(override val data: DataMobidziennik, type = Message.TYPE_RECEIVED, subject = subject, body = null, - senderId = senderId + senderId = senderId, + addedDate = addedDate ) if (hasAttachments) @@ -76,8 +77,7 @@ class MobidziennikWebMessagesInbox(override val data: DataMobidziennik, Metadata.TYPE_MESSAGE, message.id, isRead, - isRead || profile?.empty ?: false, - addedDate + isRead || profile?.empty ?: false )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesSent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesSent.kt index 918816c8..543df329 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesSent.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesSent.kt @@ -78,7 +78,8 @@ class MobidziennikWebMessagesSent(override val data: DataMobidziennik, type = Message.TYPE_SENT, subject = subject, body = null, - senderId = null + senderId = null, + addedDate = addedDate ) if (hasAttachments) @@ -91,8 +92,7 @@ class MobidziennikWebMessagesSent(override val data: DataMobidziennik, Metadata.TYPE_MESSAGE, message.id, true, - true, - addedDate + true )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebSendMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebSendMessage.kt index d0cee4dc..89178b8b 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebSendMessage.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebSendMessage.kt @@ -45,7 +45,7 @@ class MobidziennikWebSendMessage(override val data: DataMobidziennik, MobidziennikWebMessagesAll(data, null) { val message = data.messageList.firstOrNull { it.type == Message.TYPE_SENT && it.subject == subject } val metadata = data.metadataList.firstOrNull { it.thingType == Metadata.TYPE_MESSAGE && it.thingId == message?.id } - val event = MessageSentEvent(data.profileId, message, metadata?.addedDate) + val event = MessageSentEvent(data.profileId, message, message?.addedDate) EventBus.getDefault().postSticky(event) onSuccess() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttendance.kt index 2ec240a4..2fc816ee 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttendance.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttendance.kt @@ -7,7 +7,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_ATTENDANCE import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi import pl.szczodrzynski.edziennik.data.db.entity.Attendance -import pl.szczodrzynski.edziennik.data.db.entity.Attendance.TYPE_PRESENT +import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_PRESENT import pl.szczodrzynski.edziennik.data.db.entity.Metadata import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS import pl.szczodrzynski.edziennik.utils.models.Date @@ -38,38 +38,43 @@ class VulcanApiAttendance(override val data: DataVulcan, json.getJsonObject("Data")?.getJsonArray("Frekwencje")?.forEach { attendanceEl -> val attendance = attendanceEl.asJsonObject - val attendanceCategory = data.attendanceTypes.get(attendance.getLong("IdKategoria") ?: return@forEach) + val type = data.attendanceTypes.get(attendance.getLong("IdKategoria") ?: return@forEach) ?: return@forEach - val type = attendanceCategory.type - val id = (attendance.getInt("Dzien") ?: 0) + (attendance.getInt("Numer") ?: 0) val lessonDateMillis = Date.fromY_m_d(attendance.getString("DzienTekst")).inMillis val lessonDate = Date.fromMillis(lessonDateMillis) + val startTime = data.lessonRanges.get(attendance.getInt("Numer") ?: 0)?.startTime val lessonSemester = profile.dateToSemester(lessonDate) val attendanceObject = Attendance( - profileId, - id.toLong(), - -1, - attendance.getLong("IdPrzedmiot") ?: -1, - lessonSemester, - attendance.getString("PrzedmiotNazwa") + attendanceCategory.name.let { " - $it" }, - lessonDate, - data.lessonRanges.get(attendance.getInt("Numer") ?: 0)?.startTime, - type) + profileId = profileId, + id = id.toLong(), + baseType = type.baseType, + typeName = type.typeName, + typeShort = type.typeShort, + typeSymbol = type.typeSymbol, + typeColor = type.typeColor, + date = lessonDate, + startTime = startTime, + semester = lessonSemester, + teacherId = -1, + subjectId = attendance.getLong("IdPrzedmiot") ?: -1, + addedDate = lessonDate.combineWith(startTime) + ).also { + it.lessonNumber = attendance.getInt("Numer") + } data.attendanceList.add(attendanceObject) - if (attendanceObject.type != TYPE_PRESENT) { + if (type.baseType != TYPE_PRESENT) { data.metadataList.add(Metadata( profileId, Metadata.TYPE_ATTENDANCE, attendanceObject.id, profile.empty, - profile.empty, - attendanceObject.lessonDate.combineWith(attendanceObject.startTime) + profile.empty )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiDictionaries.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiDictionaries.kt index 76f53cf5..2dc9f6bc 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiDictionaries.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiDictionaries.kt @@ -114,11 +114,11 @@ class VulcanApiDictionaries(override val data: DataVulcan, private fun saveAttendanceType(attendanceType: JsonObject) { val id = attendanceType.getLong("Id") ?: return - val name = attendanceType.getString("Nazwa") ?: "" + val typeName = attendanceType.getString("Nazwa") ?: "" val absent = attendanceType.getBoolean("Nieobecnosc") ?: false val excused = attendanceType.getBoolean("Usprawiedliwione") ?: false - val type = if (absent) { + val baseType = if (absent) { if (excused) Attendance.TYPE_ABSENT_EXCUSED else @@ -137,15 +137,35 @@ class VulcanApiDictionaries(override val data: DataVulcan, else if (present) Attendance.TYPE_PRESENT else - Attendance.TYPE_CUSTOM + Attendance.TYPE_UNKNOWN + } + + val (typeColor, typeSymbol) = when (id.toInt()) { + 1 -> 0xffffffff to "●" // obecność + 2 -> 0xffffa687 to "—" // nieobecność + 3 -> 0xfffcc150 to "u" // nieobecność usprawiedliwiona + 4 -> 0xffede049 to "s" // spóźnienie + 5 -> 0xffbbdd5f to "su" // spóźnienie usprawiedliwione + 6 -> 0xffa9c9fd to "ns" // nieobecny z przyczyn szkolnych + 7 -> 0xffddbbe5 to "z" // zwolniony + 8 -> 0xffffffff to "" // usunięty wpis + else -> null to "?" + } + + val typeShort = when (id.toInt()) { + 6 -> "ns" // nieobecny z przyczyn szkolnych + 8 -> "" // usunięty wpis + else -> data.app.attendanceManager.getTypeShort(baseType) } val attendanceTypeObject = AttendanceType( profileId, id, - name, - type, - -1 + baseType, + typeName, + typeShort, + typeSymbol, + typeColor?.toInt() ) data.attendanceTypes.put(id, attendanceTypeObject) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiEvents.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiEvents.kt index 4ba7c460..4366807a 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiEvents.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiEvents.kt @@ -59,7 +59,7 @@ class VulcanApiEvents(override val data: DataVulcan, val teacherId = event.getLong("IdPracownik") ?: -1 val topic = event.getString("Opis")?.trim() ?: "" - val lessonList = data.db.timetableDao().getForDateNow(profileId, eventDate) + val lessonList = data.db.timetableDao().getAllForDateNow(profileId, eventDate) val startTime = lessonList.firstOrNull { it.subjectId == subjectId }?.startTime val type = when (isHomework) { @@ -90,8 +90,7 @@ class VulcanApiEvents(override val data: DataVulcan, if (isHomework) Metadata.TYPE_HOMEWORK else Metadata.TYPE_EVENT, id, profile.empty, - profile.empty, - System.currentTimeMillis() + profile.empty )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiGrades.kt index f62778fc..815bd83b 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiGrades.kt @@ -101,7 +101,8 @@ class VulcanApiGrades(override val data: DataVulcan, comment = null, semester = data.studentSemesterNumber, teacherId = teacherId, - subjectId = subjectId + subjectId = subjectId, + addedDate = addedDate ) data.gradeList.add(gradeObject) @@ -110,9 +111,7 @@ class VulcanApiGrades(override val data: DataVulcan, Metadata.TYPE_GRADE, id, profile.empty, - profile.empty, - addedDate - + profile.empty )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesChangeStatus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesChangeStatus.kt index 5e226849..b0b7795d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesChangeStatus.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesChangeStatus.kt @@ -37,8 +37,7 @@ class VulcanApiMessagesChangeStatus(override val data: DataVulcan, Metadata.TYPE_MESSAGE, messageObject.id, true, - true, - messageObject.addedDate + true )) messageObject.seen = true diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesInbox.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesInbox.kt index 388a97ad..dea913c5 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesInbox.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesInbox.kt @@ -72,7 +72,8 @@ class VulcanApiMessagesInbox(override val data: DataVulcan, type = TYPE_RECEIVED, subject = subject, body = body.replace("\n", "
"), - senderId = senderId + senderId = senderId, + addedDate = sentDate ) val messageRecipientObject = MessageRecipient( @@ -90,8 +91,7 @@ class VulcanApiMessagesInbox(override val data: DataVulcan, Metadata.TYPE_MESSAGE, id, readDate > 0, - readDate > 0, - sentDate + readDate > 0 )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesSent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesSent.kt index d190c00f..94cfdcba 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesSent.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesSent.kt @@ -97,7 +97,8 @@ class VulcanApiMessagesSent(override val data: DataVulcan, type = TYPE_SENT, subject = subject, body = body.replace("\n", "
"), - senderId = null + senderId = null, + addedDate = sentDate ) data.messageList.add(messageObject) @@ -106,8 +107,7 @@ class VulcanApiMessagesSent(override val data: DataVulcan, Metadata.TYPE_MESSAGE, id, true, - true, - sentDate + true )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiNotices.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiNotices.kt index b2202981..56b4d918 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiNotices.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiNotices.kt @@ -16,7 +16,6 @@ import pl.szczodrzynski.edziennik.getJsonArray import pl.szczodrzynski.edziennik.getLong import pl.szczodrzynski.edziennik.getString import pl.szczodrzynski.edziennik.toSparseArray -import pl.szczodrzynski.edziennik.utils.models.Date class VulcanApiNotices(override val data: DataVulcan, override val lastSync: Long?, @@ -41,15 +40,21 @@ class VulcanApiNotices(override val data: DataVulcan, val id = notice.getLong("Id") ?: return@forEach val text = notice.getString("TrescUwagi") ?: return@forEach val teacherId = notice.getLong("IdPracownik") ?: -1 - val addedDate = Date.fromY_m_d(notice.getString("DataWpisuTekst")).inMillis + val addedDate = notice.getLong("DataModyfikacji")?.times(1000) ?: System.currentTimeMillis() + + val categoryId = notice.getLong("IdKategoriaUwag") ?: -1 + val categoryText = data.noticeTypes[categoryId]?.name ?: "" val noticeObject = Notice( - profileId, - id, - text, - profile.currentSemester, - Notice.TYPE_NEUTRAL, - teacherId + profileId = profileId, + id = id, + type = Notice.TYPE_NEUTRAL, + semester = profile.currentSemester, + text = text, + category = categoryText, + points = null, + teacherId = teacherId, + addedDate = addedDate ) data.noticeList.add(noticeObject) @@ -58,8 +63,7 @@ class VulcanApiNotices(override val data: DataVulcan, Metadata.TYPE_NOTICE, id, profile.empty, - profile.empty, - addedDate + profile.empty )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiProposedGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiProposedGrades.kt index ee1e250f..771ee5c8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiProposedGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiProposedGrades.kt @@ -82,8 +82,7 @@ class VulcanApiProposedGrades(override val data: DataVulcan, Metadata.TYPE_GRADE, gradeObject.id, data.profile?.empty ?: false, - data.profile?.empty ?: false, - System.currentTimeMillis() + data.profile?.empty ?: false )) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiSendMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiSendMessage.kt index b88ccdb6..8c89b620 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiSendMessage.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiSendMessage.kt @@ -54,7 +54,7 @@ class VulcanApiSendMessage(override val data: DataVulcan, VulcanApiMessagesSent(data, null) { val message = data.messageList.firstOrNull { it.type == Message.TYPE_SENT && it.subject == subject } val metadata = data.metadataList.firstOrNull { it.thingType == Metadata.TYPE_MESSAGE && it.thingId == messageId } - val event = MessageSentEvent(data.profileId, message, metadata?.addedDate) + val event = MessageSentEvent(data.profileId, message, message?.addedDate) EventBus.getDefault().postSticky(event) onSuccess() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiTimetable.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiTimetable.kt index d8899dbf..74687a7b 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiTimetable.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiTimetable.kt @@ -184,8 +184,7 @@ class VulcanApiTimetable(override val data: DataVulcan, Metadata.TYPE_LESSON_CHANGE, lessonObject.id, seen, - seen, - System.currentTimeMillis() + seen )) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt index 2f0c88af..b6c31d84 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt @@ -88,6 +88,7 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt var teacherOnConflictStrategy = OnConflictStrategy.IGNORE var eventListReplace = false var messageListReplace = false + var announcementListReplace = false val classrooms = LongSparseArray() val attendanceTypes = LongSparseArray() @@ -120,7 +121,6 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt val attendanceList = mutableListOf() val announcementList = mutableListOf() - val announcementIgnoreList = mutableListOf() val luckyNumberList = mutableListOf() @@ -178,7 +178,6 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt noticeList.clear() attendanceList.clear() announcementList.clear() - announcementIgnoreList.clear() luckyNumberList.clear() teacherAbsenceList.clear() messageList.clear() @@ -284,39 +283,19 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt d("Metadata saved in ${System.currentTimeMillis()-startTime} ms") startTime = System.currentTimeMillis() - if (lessonList.isNotEmpty()) { - db.timetableDao() += lessonList - } - if (gradeList.isNotEmpty()) { - db.gradeDao().addAll(gradeList) - } - if (eventList.isNotEmpty()) { - if (eventListReplace) - db.eventDao().replaceAll(eventList) - else - db.eventDao().upsertAll(eventList, removeNotKept = true) - } + db.timetableDao().putAll(lessonList, removeNotKept = true) + db.gradeDao().putAll(gradeList, removeNotKept = true) + db.eventDao().putAll(eventList, forceReplace = eventListReplace, removeNotKept = true) if (noticeList.isNotEmpty()) { db.noticeDao().clear(profile.id) - db.noticeDao().addAll(noticeList) + db.noticeDao().putAll(noticeList) } - if (attendanceList.isNotEmpty()) - db.attendanceDao().addAll(attendanceList) - if (announcementList.isNotEmpty()) - db.announcementDao().addAll(announcementList) - if (announcementIgnoreList.isNotEmpty()) - db.announcementDao().addAllIgnore(announcementIgnoreList) - if (luckyNumberList.isNotEmpty()) - db.luckyNumberDao().addAll(luckyNumberList) - if (teacherAbsenceList.isNotEmpty()) - db.teacherAbsenceDao().addAll(teacherAbsenceList) + db.attendanceDao().putAll(attendanceList, removeNotKept = true) + db.announcementDao().putAll(announcementList, forceReplace = announcementListReplace, removeNotKept = false) + db.luckyNumberDao().putAll(luckyNumberList) + db.teacherAbsenceDao().putAll(teacherAbsenceList) - if (messageList.isNotEmpty()) { - if (messageListReplace) - db.messageDao().replaceAll(messageList) - else - db.messageDao().upsertAll(messageList, removeNotKept = false) // TODO dataRemoveModel for messages - } + db.messageDao().putAll(messageList, forceReplace = messageListReplace, removeNotKept = false) if (messageRecipientList.isNotEmpty()) db.messageRecipientDao().addAll(messageRecipientList) if (messageRecipientIgnoreList.isNotEmpty()) @@ -357,7 +336,7 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt } fun shouldSyncLuckyNumber(): Boolean { - return (db.luckyNumberDao().getNearestFutureNow(profileId, Date.getToday().value) ?: -1) == -1 + return db.luckyNumberDao().getNearestFutureNow(profileId, Date.getToday()) == null } /*fun error(tag: String, errorCode: Int, response: Response? = null, throwable: Throwable? = null, apiResponse: JsonObject? = null) { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/DataRemoveModel.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/DataRemoveModel.kt index f247ee19..fabf5f39 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/DataRemoveModel.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/DataRemoveModel.kt @@ -20,10 +20,10 @@ open class DataRemoveModel { fun commit(profileId: Int, dao: TimetableDao) { if (dateFrom != null && dateTo != null) { - dao.clearBetweenDates(profileId, dateFrom, dateTo) + dao.dontKeepBetweenDates(profileId, dateFrom, dateTo) } else { - dateFrom?.let { dateFrom -> dao.clearFromDate(profileId, dateFrom) } - dateTo?.let { dateTo -> dao.clearToDate(profileId, dateTo) } + dateFrom?.let { dateFrom -> dao.dontKeepFromDate(profileId, dateFrom) } + dateTo?.let { dateTo -> dao.dontKeepToDate(profileId, dateTo) } } } } @@ -69,7 +69,7 @@ open class DataRemoveModel { fun commit(profileId: Int, dao: AttendanceDao) { if (dateFrom != null) { - dao.clearAfterDate(profileId, dateFrom) + dao.dontKeepAfterDate(profileId, dateFrom) } } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/AppSync.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/AppSync.kt index 63d4ec88..c10bab3e 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/AppSync.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/AppSync.kt @@ -40,8 +40,7 @@ class AppSync(val app: App, val notifications: MutableList, val pr Metadata.TYPE_EVENT, event.id, isPast || markAsSeen || event.seen, - isPast || markAsSeen || event.notified, - event.addedDate + isPast || markAsSeen || event.notified ) }) return app.db.eventDao().upsertAll(events).size diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/Notifications.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/Notifications.kt index 39b68499..21a5c112 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/Notifications.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/Notifications.kt @@ -53,7 +53,7 @@ class Notifications(val app: App, val notifications: MutableList, profileId = lesson.profileId, profileName = profiles.singleOrNull { it.id == lesson.profileId }?.name, viewId = MainActivity.DRAWER_ITEM_TIMETABLE, - addedDate = lesson.addedDate + addedDate = System.currentTimeMillis() ).addExtra("timetableDate", lesson.displayDate?.stringY_m_d ?: "") } } @@ -117,7 +117,7 @@ class Notifications(val app: App, val notifications: MutableList, } private fun gradeNotifications() { - for (grade in app.db.gradeDao().notNotifiedNow) { + for (grade in app.db.gradeDao().getNotNotifiedNow()) { val gradeName = when (grade.type) { Grade.TYPE_SEMESTER1_PROPOSED, Grade.TYPE_SEMESTER2_PROPOSED -> app.getString(R.string.grade_semester_proposed_format_2, grade.name) Grade.TYPE_SEMESTER1_FINAL, Grade.TYPE_SEMESTER2_FINAL -> app.getString(R.string.grade_semester_final_format_2, grade.name) @@ -144,7 +144,7 @@ class Notifications(val app: App, val notifications: MutableList, } private fun behaviourNotifications() { - for (notice in app.db.noticeDao().notNotifiedNow) { + for (notice in app.db.noticeDao().getNotNotifiedNow()) { val noticeTypeStr = when (notice.type) { Notice.TYPE_POSITIVE -> app.getString(R.string.notification_notice_praise) @@ -155,7 +155,7 @@ class Notifications(val app: App, val notifications: MutableList, val text = app.getString( R.string.notification_notice_format, noticeTypeStr, - notice.teacherFullName, + notice.teacherName, Date.fromMillis(notice.addedDate).formattedString ) notifications += Notification( @@ -172,9 +172,9 @@ class Notifications(val app: App, val notifications: MutableList, } private fun attendanceNotifications() { - for (attendance in app.db.attendanceDao().notNotifiedNow) { + for (attendance in app.db.attendanceDao().getNotNotifiedNow()) { - val attendanceTypeStr = when (attendance.type) { + val attendanceTypeStr = when (attendance.baseType) { Attendance.TYPE_ABSENT -> app.getString(R.string.notification_absence) Attendance.TYPE_ABSENT_EXCUSED -> app.getString(R.string.notification_absence_excused) Attendance.TYPE_BELATED -> app.getString(R.string.notification_belated) @@ -191,7 +191,7 @@ class Notifications(val app: App, val notifications: MutableList, R.string.notification_attendance_format, attendanceTypeStr, attendance.subjectLongName, - attendance.lessonDate.formattedString + attendance.date.formattedString ) notifications += Notification( id = Notification.buildId(attendance.profileId, Notification.TYPE_NEW_ATTENDANCE, attendance.id), @@ -207,10 +207,10 @@ class Notifications(val app: App, val notifications: MutableList, } private fun announcementNotifications() { - for (announcement in app.db.announcementDao().notNotifiedNow) { + for (announcement in app.db.announcementDao().getNotNotifiedNow()) { val text = app.getString( R.string.notification_announcement_format, - announcement.teacherFullName, + announcement.teacherName, announcement.subject ) notifications += Notification( @@ -247,9 +247,9 @@ class Notifications(val app: App, val notifications: MutableList, } private fun luckyNumberNotifications() { - val luckyNumbers = app.db.luckyNumberDao().notNotifiedNow - luckyNumbers?.removeAll { it.date < today } - luckyNumbers?.forEach { luckyNumber -> + val luckyNumbers = app.db.luckyNumberDao().getNotNotifiedNow().toMutableList() + luckyNumbers.removeAll { it.date < today } + luckyNumbers.forEach { luckyNumber -> val profile = profiles.singleOrNull { it.id == luckyNumber.profileId } ?: return@forEach val text = when (profile.studentNumber != -1 && profile.studentNumber == luckyNumber.number) { true -> when (luckyNumber.date.value) { @@ -271,7 +271,7 @@ class Notifications(val app: App, val notifications: MutableList, profileId = luckyNumber.profileId, profileName = profile.name, viewId = MainActivity.DRAWER_ITEM_HOME, - addedDate = luckyNumber.addedDate + addedDate = System.currentTimeMillis() ) } } @@ -280,7 +280,7 @@ class Notifications(val app: App, val notifications: MutableList, for (teacherAbsence in app.db.teacherAbsenceDao().getNotNotifiedNow()) { val message = app.getString( R.string.notification_teacher_absence_new_format, - teacherAbsence.teacherFullName + teacherAbsence.teacherName ) notifications += Notification( id = Notification.buildId(teacherAbsence.profileId, Notification.TYPE_TEACHER_ABSENCE, teacherAbsence.id), diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt index b57cc4d4..0cd2fe26 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt @@ -43,7 +43,7 @@ import pl.szczodrzynski.edziennik.data.db.migration.* LibrusLesson::class, TimetableManual::class, Metadata::class -], version = 85) +], version = 86) @TypeConverters( ConverterTime::class, ConverterDate::class, @@ -170,7 +170,8 @@ abstract class AppDb : RoomDatabase() { Migration82(), Migration83(), Migration84(), - Migration85() + Migration85(), + Migration86() ).allowMainThreadQueries().build() } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AnnouncementDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AnnouncementDao.java deleted file mode 100644 index ab32fb7c..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AnnouncementDao.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 - */ - -package pl.szczodrzynski.edziennik.data.db.dao; - -import androidx.lifecycle.LiveData; -import androidx.room.Dao; -import androidx.room.Insert; -import androidx.room.OnConflictStrategy; -import androidx.room.Query; -import androidx.room.RawQuery; -import androidx.sqlite.db.SimpleSQLiteQuery; -import androidx.sqlite.db.SupportSQLiteQuery; - -import java.util.List; - -import pl.szczodrzynski.edziennik.data.db.entity.Announcement; -import pl.szczodrzynski.edziennik.data.db.entity.Metadata; -import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull; - -import static pl.szczodrzynski.edziennik.data.db.entity.Metadata.TYPE_ANNOUNCEMENT; - -@Dao -public abstract class AnnouncementDao { - @Insert(onConflict = OnConflictStrategy.REPLACE) - public abstract long add(Announcement announcement); - - @Insert(onConflict = OnConflictStrategy.REPLACE) - public abstract void addAll(List announcementList); - - @Insert(onConflict = OnConflictStrategy.IGNORE) - public abstract void addAllIgnore(List announcementList); - - @Query("DELETE FROM announcements WHERE profileId = :profileId") - public abstract void clear(int profileId); - - @RawQuery(observedEntities = {Announcement.class, Metadata.class}) - abstract LiveData> getAll(SupportSQLiteQuery query); - public LiveData> getAll(int profileId, String filter) { - return getAll(new SimpleSQLiteQuery("SELECT \n" + - "*, \n" + - "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" + - "FROM announcements \n" + - "LEFT JOIN teachers USING(profileId, teacherId)\n" + - "LEFT JOIN metadata ON announcementId = thingId AND thingType = "+TYPE_ANNOUNCEMENT+" AND metadata.profileId = "+profileId+"\n" + - "WHERE announcements.profileId = "+profileId+" AND "+filter+"\n" + - "ORDER BY addedDate DESC")); - } - public LiveData> getAll(int profileId) { - return getAll(profileId, "1"); - } - public LiveData> getAllWhere(int profileId, String filter) { - return getAll(profileId, filter); - } - - @RawQuery(observedEntities = {Announcement.class, Metadata.class}) - abstract List getAllNow(SupportSQLiteQuery query); - public List getAllNow(int profileId, String filter) { - return getAllNow(new SimpleSQLiteQuery("SELECT \n" + - "*, \n" + - "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" + - "FROM announcements \n" + - "LEFT JOIN teachers USING(profileId, teacherId)\n" + - "LEFT JOIN metadata ON announcementId = thingId AND thingType = "+TYPE_ANNOUNCEMENT+" AND metadata.profileId = "+profileId+"\n" + - "WHERE announcements.profileId = "+profileId+" AND "+filter+"\n" + - "ORDER BY addedDate DESC")); - } - public List getNotNotifiedNow(int profileId) { - return getAllNow(profileId, "notified = 0"); - } - - @Query("SELECT " + - "*, " + - "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName " + - "FROM announcements " + - "LEFT JOIN teachers USING(profileId, teacherId) " + - "LEFT JOIN metadata ON announcementId = thingId AND thingType = "+TYPE_ANNOUNCEMENT+" AND metadata.profileId = announcements.profileId " + - "WHERE notified = 0 " + - "ORDER BY addedDate DESC") - public abstract List getNotNotifiedNow(); -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AnnouncementDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AnnouncementDao.kt new file mode 100644 index 00000000..67e034c5 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AnnouncementDao.kt @@ -0,0 +1,69 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-25. + */ +package pl.szczodrzynski.edziennik.data.db.dao + +import androidx.lifecycle.LiveData +import androidx.room.Dao +import androidx.room.Query +import androidx.room.RawQuery +import androidx.sqlite.db.SupportSQLiteQuery +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.annotation.SelectiveDao +import pl.szczodrzynski.edziennik.annotation.UpdateSelective +import pl.szczodrzynski.edziennik.data.db.AppDb +import pl.szczodrzynski.edziennik.data.db.entity.Announcement +import pl.szczodrzynski.edziennik.data.db.entity.Metadata +import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull + +@Dao +@SelectiveDao(db = AppDb::class) +abstract class AnnouncementDao : BaseDao { + companion object { + private const val QUERY = """ + SELECT + *, + teachers.teacherName ||" "|| teachers.teacherSurname AS teacherName + FROM announcements + LEFT JOIN teachers USING(profileId, teacherId) + LEFT JOIN metadata ON announcementId = thingId AND thingType = ${Metadata.TYPE_ANNOUNCEMENT} AND metadata.profileId = announcements.profileId + """ + + private const val ORDER_BY = """ORDER BY addedDate DESC""" + } + + private val selective by lazy { AnnouncementDaoSelective(App.db) } + + @RawQuery(observedEntities = [Announcement::class]) + abstract override fun getRaw(query: SupportSQLiteQuery): LiveData> + @RawQuery(observedEntities = [Announcement::class]) + abstract override fun getOne(query: SupportSQLiteQuery): LiveData + + // SELECTIVE UPDATE + @UpdateSelective(primaryKeys = ["profileId", "announcementId"], skippedColumns = ["addedDate", "announcementText"]) + override fun update(item: Announcement) = selective.update(item) + override fun updateAll(items: List) = selective.updateAll(items) + + // CLEAR + @Query("DELETE FROM announcements WHERE profileId = :profileId") + abstract override fun clear(profileId: Int) + // REMOVE NOT KEPT + @Query("DELETE FROM announcements WHERE keep = 0") + abstract override fun removeNotKept() + + // GET ALL - LIVE DATA + fun getAll(profileId: Int) = + getRaw("$QUERY WHERE announcements.profileId = $profileId $ORDER_BY") + + // GET ALL - NOW + fun getAllNow(profileId: Int) = + getRawNow("$QUERY WHERE announcements.profileId = $profileId $ORDER_BY") + fun getNotNotifiedNow() = + getRawNow("$QUERY WHERE notified = 0 $ORDER_BY") + fun getNotNotifiedNow(profileId: Int) = + getRawNow("$QUERY WHERE announcements.profileId = $profileId AND notified = 0 $ORDER_BY") + + // GET ONE - NOW + fun getByIdNow(profileId: Int, id: Long) = + getOneNow("$QUERY WHERE announcements.profileId = $profileId AND announcementId = $id") +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AttendanceDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AttendanceDao.java deleted file mode 100644 index 95c3147f..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AttendanceDao.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 - */ - -package pl.szczodrzynski.edziennik.data.db.dao; - -import androidx.lifecycle.LiveData; -import androidx.room.Dao; -import androidx.room.Insert; -import androidx.room.OnConflictStrategy; -import androidx.room.Query; -import androidx.room.RawQuery; -import androidx.sqlite.db.SimpleSQLiteQuery; -import androidx.sqlite.db.SupportSQLiteQuery; - -import java.util.List; - -import pl.szczodrzynski.edziennik.data.db.entity.Attendance; -import pl.szczodrzynski.edziennik.data.db.full.AttendanceFull; -import pl.szczodrzynski.edziennik.utils.models.Date; - -import static pl.szczodrzynski.edziennik.data.db.entity.Metadata.TYPE_ATTENDANCE; - -@Dao -public abstract class AttendanceDao { - @Insert(onConflict = OnConflictStrategy.REPLACE) - public abstract long add(Attendance attendance); - - @Insert(onConflict = OnConflictStrategy.REPLACE) - public abstract void addAll(List attendanceList); - - @Query("DELETE FROM attendances WHERE profileId = :profileId") - public abstract void clear(int profileId); - - @Query("DELETE FROM attendances WHERE profileId = :profileId AND attendanceLessonDate > :date") - public abstract void clearAfterDate(int profileId, Date date); - - @RawQuery(observedEntities = {Attendance.class}) - abstract LiveData> getAll(SupportSQLiteQuery query); - public LiveData> getAll(int profileId, String filter) { - return getAll(new SimpleSQLiteQuery("SELECT \n" + - "*, \n" + - "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" + - "FROM attendances \n" + - "LEFT JOIN teachers USING(profileId, teacherId)\n" + - "LEFT JOIN subjects USING(profileId, subjectId)\n" + - "LEFT JOIN metadata ON attendanceId = thingId AND thingType = " + TYPE_ATTENDANCE + " AND metadata.profileId = "+profileId+"\n" + - "WHERE attendances.profileId = "+profileId+" AND "+filter+"\n" + - "ORDER BY attendanceLessonDate DESC, attendanceStartTime DESC")); - } - public LiveData> getAll(int profileId) { - return getAll(profileId, "1"); - } - public LiveData> getAllWhere(int profileId, String filter) { - return getAll(profileId, filter); - } - - @RawQuery - abstract List getAllNow(SupportSQLiteQuery query); - public List getAllNow(int profileId, String filter) { - return getAllNow(new SimpleSQLiteQuery("SELECT \n" + - "*, \n" + - "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" + - "FROM attendances \n" + - "LEFT JOIN teachers USING(profileId, teacherId)\n" + - "LEFT JOIN subjects USING(profileId, subjectId)\n" + - "LEFT JOIN metadata ON attendanceId = thingId AND thingType = " + TYPE_ATTENDANCE + " AND metadata.profileId = "+profileId+"\n" + - "WHERE attendances.profileId = "+profileId+" AND "+filter+"\n" + - "ORDER BY attendanceLessonDate DESC, attendanceStartTime DESC")); - } - public List getNotNotifiedNow(int profileId) { - return getAllNow(profileId, "notified = 0"); - } - - @Query("SELECT * FROM attendances " + - "LEFT JOIN subjects USING(profileId, subjectId) " + - "LEFT JOIN metadata ON attendanceId = thingId AND thingType = " + TYPE_ATTENDANCE + " AND metadata.profileId = attendances.profileId " + - "WHERE notified = 0 " + - "ORDER BY attendanceLessonDate DESC, attendanceStartTime DESC") - public abstract List getNotNotifiedNow(); - - // only absent and absent_excused count as absences - // all the other types are counted as being present - @Query("SELECT \n" + - "CAST(SUM(CASE WHEN attendanceType != "+Attendance.TYPE_ABSENT+" AND attendanceType != "+ Attendance.TYPE_ABSENT_EXCUSED+" THEN 1 ELSE 0 END) AS float)\n" + - " / \n" + - "CAST(count() AS float)*100 \n" + - "FROM attendances \n" + - "WHERE profileId = :profileId") - public abstract LiveData getAttendancePercentage(int profileId); - - @Query("SELECT \n" + - "CAST(SUM(CASE WHEN attendanceType != "+Attendance.TYPE_ABSENT+" AND attendanceType != "+Attendance.TYPE_ABSENT_EXCUSED+" THEN 1 ELSE 0 END) AS float)\n" + - " / \n" + - "CAST(count() AS float)*100 \n" + - "FROM attendances \n" + - "WHERE profileId = :profileId AND attendanceSemester = :semester") - public abstract float getAttendancePercentageNow(int profileId, int semester); - - @Query("SELECT \n" + - "CAST(SUM(CASE WHEN attendanceType != "+Attendance.TYPE_ABSENT+" AND attendanceType != "+Attendance.TYPE_ABSENT_EXCUSED+" THEN 1 ELSE 0 END) AS float)\n" + - " / \n" + - "CAST(count() AS float)*100 \n" + - "FROM attendances \n" + - "WHERE profileId = :profileId") - public abstract float getAttendancePercentageNow(int profileId); -} - diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AttendanceDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AttendanceDao.kt new file mode 100644 index 00000000..de04c919 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AttendanceDao.kt @@ -0,0 +1,74 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-24. + */ +package pl.szczodrzynski.edziennik.data.db.dao + +import androidx.lifecycle.LiveData +import androidx.room.Dao +import androidx.room.Query +import androidx.room.RawQuery +import androidx.sqlite.db.SupportSQLiteQuery +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.annotation.SelectiveDao +import pl.szczodrzynski.edziennik.annotation.UpdateSelective +import pl.szczodrzynski.edziennik.data.db.AppDb +import pl.szczodrzynski.edziennik.data.db.entity.Attendance +import pl.szczodrzynski.edziennik.data.db.entity.Metadata +import pl.szczodrzynski.edziennik.data.db.full.AttendanceFull +import pl.szczodrzynski.edziennik.utils.models.Date + +@Dao +@SelectiveDao(db = AppDb::class) +abstract class AttendanceDao : BaseDao { + companion object { + private const val QUERY = """ + SELECT + *, + teachers.teacherName ||" "|| teachers.teacherSurname AS teacherName + FROM attendances + LEFT JOIN teachers USING(profileId, teacherId) + LEFT JOIN subjects USING(profileId, subjectId) + LEFT JOIN metadata ON attendanceId = thingId AND thingType = ${Metadata.TYPE_ATTENDANCE} AND metadata.profileId = attendances.profileId + """ + + private const val ORDER_BY = """ORDER BY attendanceDate DESC, attendanceTime DESC""" + } + + private val selective by lazy { AttendanceDaoSelective(App.db) } + + @RawQuery(observedEntities = [Attendance::class]) + abstract override fun getRaw(query: SupportSQLiteQuery): LiveData> + @RawQuery(observedEntities = [Attendance::class]) + abstract override fun getOne(query: SupportSQLiteQuery): LiveData + + // SELECTIVE UPDATE + @UpdateSelective(primaryKeys = ["profileId", "attendanceId"], skippedColumns = ["addedDate", "announcementText"]) + override fun update(item: Attendance) = selective.update(item) + override fun updateAll(items: List) = selective.updateAll(items) + + // CLEAR + @Query("DELETE FROM attendances WHERE profileId = :profileId") + abstract override fun clear(profileId: Int) + // REMOVE NOT KEPT + @Query("DELETE FROM attendances WHERE keep = 0") + abstract override fun removeNotKept() + + // GET ALL - LIVE DATA + fun getAll(profileId: Int) = + getRaw("$QUERY WHERE attendances.profileId = $profileId $ORDER_BY") + + // GET ALL - NOW + fun getAllNow(profileId: Int) = + getRawNow("$QUERY WHERE attendances.profileId = $profileId $ORDER_BY") + fun getNotNotifiedNow() = + getRawNow("$QUERY WHERE notified = 0 $ORDER_BY") + fun getNotNotifiedNow(profileId: Int) = + getRawNow("$QUERY WHERE attendances.profileId = $profileId AND notified = 0 $ORDER_BY") + + // GET ONE - NOW + fun getByIdNow(profileId: Int, id: Long) = + getOneNow("$QUERY WHERE attendances.profileId = $profileId AND attendanceId = $id") + + @Query("UPDATE attendances SET keep = 0 WHERE profileId = :profileId AND attendanceDate > :date") + abstract fun dontKeepAfterDate(profileId: Int, date: Date?) +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/BaseDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/BaseDao.kt index 8c13dca9..94677d70 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/BaseDao.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/BaseDao.kt @@ -16,13 +16,15 @@ interface BaseDao { fun getRaw(query: SupportSQLiteQuery): LiveData> fun getRaw(query: String) = getRaw(SimpleSQLiteQuery(query)) @RawQuery + fun getOne(query: SupportSQLiteQuery): LiveData + fun getOne(query: String) = getOne(SimpleSQLiteQuery(query)) + @RawQuery fun getRawNow(query: SupportSQLiteQuery): List fun getRawNow(query: String) = getRawNow(SimpleSQLiteQuery(query)) @RawQuery fun getOneNow(query: SupportSQLiteQuery): F? fun getOneNow(query: String) = getOneNow(SimpleSQLiteQuery(query)) - @Query("DELETE FROM events WHERE keep = 0") fun removeNotKept() /** @@ -41,12 +43,14 @@ interface BaseDao { /** * REPLACE an [item] in the database, * removing any conflicting rows. + * Creates the item if it does not exist yet. */ @Insert(onConflict = OnConflictStrategy.REPLACE) fun replace(item: T) /** * REPLACE [items] in the database, * removing any conflicting rows. + * Creates items if it does not exist yet. */ @Insert(onConflict = OnConflictStrategy.REPLACE) fun replaceAll(items: List) @@ -97,4 +101,21 @@ interface BaseDao { if (removeNotKept) removeNotKept() return insertResult } + + /** + * Make sure that [items] are in the database. + * When [forceReplace] == false, do a selective update (UPSERT). + * When [forceReplace] == true, add all items replacing any conflicting ones (REPLACE). + * + * @param forceReplace whether to replace all items instead of selectively updating + * @param removeNotKept whether to remove all items whose [keep] parameter is false + */ + fun putAll(items: List, forceReplace: Boolean = false, removeNotKept: Boolean = false) { + if (items.isEmpty()) + return + if (forceReplace) + replaceAll(items) + else + upsertAll(items) + } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventDao.kt index b2017cc5..44b2962d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventDao.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventDao.kt @@ -31,8 +31,8 @@ abstract class EventDao : BaseDao { eventTypes.eventTypeName AS typeName, eventTypes.eventTypeColor AS typeColor FROM events - LEFT JOIN subjects USING(profileId, subjectId) LEFT JOIN teachers USING(profileId, teacherId) + LEFT JOIN subjects USING(profileId, subjectId) LEFT JOIN teams USING(profileId, teamId) LEFT JOIN eventTypes USING(profileId, eventType) LEFT JOIN metadata ON eventId = thingId AND (thingType = ${Metadata.TYPE_EVENT} OR thingType = ${Metadata.TYPE_HOMEWORK}) AND metadata.profileId = events.profileId @@ -47,6 +47,8 @@ abstract class EventDao : BaseDao { @RawQuery(observedEntities = [Event::class]) abstract override fun getRaw(query: SupportSQLiteQuery): LiveData> + @RawQuery(observedEntities = [Event::class]) + abstract override fun getOne(query: SupportSQLiteQuery): LiveData // SELECTIVE UPDATE @UpdateSelective(primaryKeys = ["profileId", "eventId"], skippedColumns = ["eventIsDone", "eventBlacklisted", "homeworkBody", "attachmentIds", "attachmentNames"]) @@ -56,6 +58,9 @@ abstract class EventDao : BaseDao { // CLEAR @Query("DELETE FROM events WHERE profileId = :profileId") abstract override fun clear(profileId: Int) + // REMOVE NOT KEPT + @Query("DELETE FROM events WHERE keep = 0") + abstract override fun removeNotKept() // GET ALL - LIVE DATA fun getAll(profileId: Int) = diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/GradeDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/GradeDao.kt index 9c3e93c5..5862859e 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/GradeDao.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/GradeDao.kt @@ -1,32 +1,86 @@ /* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 + * Copyright (c) Kuba Szczodrzyński 2020-4-24. */ package pl.szczodrzynski.edziennik.data.db.dao import androidx.lifecycle.LiveData -import androidx.room.* -import androidx.sqlite.db.SimpleSQLiteQuery +import androidx.room.Dao +import androidx.room.Query +import androidx.room.RawQuery +import androidx.room.Transaction import androidx.sqlite.db.SupportSQLiteQuery +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.annotation.SelectiveDao +import pl.szczodrzynski.edziennik.annotation.UpdateSelective +import pl.szczodrzynski.edziennik.data.db.AppDb import pl.szczodrzynski.edziennik.data.db.entity.Grade import pl.szczodrzynski.edziennik.data.db.entity.Metadata import pl.szczodrzynski.edziennik.data.db.full.GradeFull +import pl.szczodrzynski.edziennik.utils.models.Date import java.util.* -import kotlin.collections.List import kotlin.collections.component1 import kotlin.collections.component2 -import kotlin.collections.iterator import kotlin.collections.set @Dao -abstract class GradeDao { - @Insert(onConflict = OnConflictStrategy.REPLACE) - abstract fun add(grade: Grade): Long +@SelectiveDao(db = AppDb::class) +abstract class GradeDao : BaseDao { + companion object { + private const val QUERY = """ + SELECT + *, + teachers.teacherName ||" "|| teachers.teacherSurname AS teacherName + FROM grades + LEFT JOIN teachers USING(profileId, teacherId) + LEFT JOIN subjects USING(profileId, subjectId) + LEFT JOIN metadata ON gradeId = thingId AND thingType = ${Metadata.TYPE_GRADE} AND metadata.profileId = grades.profileId + """ - @Insert(onConflict = OnConflictStrategy.REPLACE) - abstract fun addAll(gradeList: List) + private const val ORDER_BY = """ORDER BY addedDate DESC""" + } + private val selective by lazy { GradeDaoSelective(App.db) } + + @RawQuery(observedEntities = [Grade::class]) + abstract override fun getRaw(query: SupportSQLiteQuery): LiveData> + @RawQuery(observedEntities = [Grade::class]) + abstract override fun getOne(query: SupportSQLiteQuery): LiveData + + // SELECTIVE UPDATE + @UpdateSelective(primaryKeys = ["profileId", "gradeId"], skippedColumns = ["addedDate", "gradeClassAverage"]) + override fun update(item: Grade) = selective.update(item) + override fun updateAll(items: List) = selective.updateAll(items) + + // CLEAR @Query("DELETE FROM grades WHERE profileId = :profileId") - abstract fun clear(profileId: Int) + abstract override fun clear(profileId: Int) + // REMOVE NOT KEPT + @Query("DELETE FROM grades WHERE keep = 0") + abstract override fun removeNotKept() + + // GET ALL - LIVE DATA + fun getAll(profileId: Int) = + getRaw("$QUERY WHERE grades.profileId = $profileId $ORDER_BY") + fun getAllFromDate(profileId: Int, date: Date) = + getRaw("$QUERY WHERE grades.profileId = $profileId AND addedDate > ${date.inMillis} $ORDER_BY") + fun getAllBySubject(profileId: Int, subjectId: Long) = + getRaw("$QUERY WHERE grades.profileId = $profileId AND subjectId = $subjectId $ORDER_BY") + fun getAllOrderBy(profileId: Int, orderBy: String) = + getRaw("$QUERY WHERE grades.profileId = $profileId ORDER BY $orderBy") + + // GET ALL - NOW + fun getAllNow(profileId: Int) = + getRawNow("$QUERY WHERE grades.profileId = $profileId $ORDER_BY") + fun getNotNotifiedNow() = + getRawNow("$QUERY WHERE notified = 0 $ORDER_BY") + fun getNotNotifiedNow(profileId: Int) = + getRawNow("$QUERY WHERE grades.profileId = $profileId AND notified = 0 $ORDER_BY") + fun getByParentIdNow(profileId: Int, parentId: Long) = + getRawNow("$QUERY WHERE grades.profileId = $profileId AND gradeParentId = $parentId $ORDER_BY") + + // GET ONE - NOW + fun getByIdNow(profileId: Int, id: Long) = + getOneNow("$QUERY WHERE grades.profileId = $profileId AND gradeId = $id") @Query("DELETE FROM grades WHERE profileId = :profileId AND gradeType = :type") abstract fun clearWithType(profileId: Int, type: Int) @@ -37,66 +91,13 @@ abstract class GradeDao { @Query("DELETE FROM grades WHERE profileId = :profileId AND gradeSemester = :semester AND gradeType = :type") abstract fun clearForSemesterWithType(profileId: Int, semester: Int, type: Int) - @RawQuery(observedEntities = [Grade::class]) - abstract fun getAll(query: SupportSQLiteQuery?): LiveData> - fun getAll(profileId: Int, filter: String, orderBy: String): LiveData> { - return getAll(SimpleSQLiteQuery("SELECT \n" + - "*, \n" + - "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" + - "FROM grades \n" + - "LEFT JOIN subjects USING(profileId, subjectId)\n" + - "LEFT JOIN teachers USING(profileId, teacherId)\n" + - "LEFT JOIN metadata ON gradeId = thingId AND thingType = " + Metadata.TYPE_GRADE + " AND metadata.profileId = " + profileId + "\n" + - "WHERE grades.profileId = " + profileId + " AND " + filter + "\n" + - "ORDER BY " + orderBy)) // TODO: 2019-04-30 why did I add sorting by gradeType??? - } - - fun getAllOrderBy(profileId: Int, orderBy: String): LiveData> { - return getAll(profileId, "1", orderBy) - } - - fun getAllWhere(profileId: Int, filter: String): LiveData> { - return getAll(profileId, filter, "addedDate DESC") - } - - @RawQuery - abstract fun getAllNow(query: SupportSQLiteQuery?): List - - fun getAllNow(profileId: Int, filter: String): List { - return getAllNow(SimpleSQLiteQuery("SELECT \n" + - "*, \n" + - "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" + - "FROM grades \n" + - "LEFT JOIN subjects USING(profileId, subjectId)\n" + - "LEFT JOIN teachers USING(profileId, teacherId)\n" + - "LEFT JOIN metadata ON gradeId = thingId AND thingType = " + Metadata.TYPE_GRADE + " AND metadata.profileId = " + profileId + "\n" + - "WHERE grades.profileId = " + profileId + " AND " + filter + "\n" + - "ORDER BY addedDate DESC")) - } - - fun getNotNotifiedNow(profileId: Int): List { - return getAllNow(profileId, "notified = 0") - } - - fun getAllWithParentIdNow(profileId: Int, parentId: Long): List { - return getAllNow(profileId, "gradeParentId = $parentId") - } - - @get:Query("SELECT * FROM grades " + - "LEFT JOIN subjects USING(profileId, subjectId) " + - "LEFT JOIN metadata ON gradeId = thingId AND thingType = " + Metadata.TYPE_GRADE + " AND metadata.profileId = grades.profileId " + - "WHERE notified = 0 " + - "ORDER BY addedDate DESC") - abstract val notNotifiedNow: List - - @RawQuery - abstract fun getNow(query: SupportSQLiteQuery): GradeFull? + // GRADE DETAILS - MOBIDZIENNIK @Query("UPDATE grades SET gradeClassAverage = :classAverage, gradeColor = :color WHERE profileId = :profileId AND gradeId = :gradeId") abstract fun updateDetailsById(profileId: Int, gradeId: Long, classAverage: Float, color: Int) - @Query("UPDATE metadata SET addedDate = :addedDate WHERE profileId = :profileId AND thingType = " + Metadata.TYPE_GRADE + " AND thingId = :gradeId") + @Query("UPDATE grades SET addedDate = :addedDate WHERE profileId = :profileId AND gradeId = :gradeId") abstract fun updateAddedDateById(profileId: Int, gradeId: Long, addedDate: Long) @Transaction @@ -118,7 +119,7 @@ abstract class GradeDao { @Query("SELECT gradeColor FROM grades WHERE profileId = :profileId ORDER BY gradeId") abstract fun getColors(profileId: Int): List - @Query("SELECT addedDate FROM metadata WHERE profileId = :profileId AND thingType = " + Metadata.TYPE_GRADE + " ORDER BY thingId") + @Query("SELECT addedDate FROM grades WHERE profileId = :profileId ORDER BY gradeId") abstract fun getAddedDates(profileId: Int): List @Transaction @@ -134,8 +135,4 @@ abstract class GradeDao { gradeAddedDates[gradeId] = addedDates.next() } } - - fun getAllFromDate(profileId: Int, date: Long): LiveData> { - return getAllWhere(profileId, "addedDate > $date") - } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/LuckyNumberDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/LuckyNumberDao.java deleted file mode 100644 index c1c33c23..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/LuckyNumberDao.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 - */ - -package pl.szczodrzynski.edziennik.data.db.dao; - -import androidx.annotation.Nullable; -import androidx.lifecycle.LiveData; -import androidx.room.Dao; -import androidx.room.Insert; -import androidx.room.OnConflictStrategy; -import androidx.room.Query; -import androidx.room.RawQuery; -import androidx.sqlite.db.SimpleSQLiteQuery; -import androidx.sqlite.db.SupportSQLiteQuery; - -import java.util.List; - -import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber; -import pl.szczodrzynski.edziennik.data.db.entity.Metadata; -import pl.szczodrzynski.edziennik.data.db.entity.Notice; -import pl.szczodrzynski.edziennik.data.db.full.LuckyNumberFull; -import pl.szczodrzynski.edziennik.utils.models.Date; - -import static pl.szczodrzynski.edziennik.data.db.entity.Metadata.TYPE_LUCKY_NUMBER; - -@Dao -public abstract class LuckyNumberDao { - @Insert(onConflict = OnConflictStrategy.REPLACE) - public abstract void add(LuckyNumber luckyNumber); - - @Insert(onConflict = OnConflictStrategy.REPLACE) - public abstract void addAll(List luckyNumberList); - - @Query("DELETE FROM luckyNumbers WHERE profileId = :profileId") - public abstract void clear(int profileId); - - @Query("SELECT * FROM luckyNumbers WHERE profileId = :profileId AND luckyNumberDate = :date") - public abstract LiveData getByDate(int profileId, Date date); - - @Query("SELECT * FROM luckyNumbers WHERE profileId = :profileId AND luckyNumberDate = :date") - public abstract LuckyNumber getByDateNow(int profileId, Date date); - - @Nullable - @Query("SELECT * FROM luckyNumbers WHERE profileId = :profileId AND luckyNumberDate >= :date ORDER BY luckyNumberDate DESC LIMIT 1") - public abstract LuckyNumber getNearestFutureNow(int profileId, int date); - - @Query("SELECT * FROM luckyNumbers WHERE profileId = :profileId AND luckyNumberDate >= :date ORDER BY luckyNumberDate DESC LIMIT 1") - public abstract LiveData getNearestFuture(int profileId, int date); - - @RawQuery(observedEntities = {LuckyNumber.class}) - abstract LiveData> getAll(SupportSQLiteQuery query); - public LiveData> getAll(int profileId, String filter) { - return getAll(new SimpleSQLiteQuery("SELECT\n" + - "*\n" + - "FROM luckyNumbers\n" + - "LEFT JOIN metadata ON luckyNumberDate = thingId AND thingType = "+TYPE_LUCKY_NUMBER+" AND metadata.profileId = "+profileId+"\n" + - "WHERE luckyNumbers.profileId = "+profileId+" AND "+filter+"\n" + - "ORDER BY addedDate DESC")); - } - public LiveData> getAll(int profileId) { - return getAll(profileId, "1"); - } - public LiveData> getAllWhere(int profileId, String filter) { - return getAll(profileId, filter); - } - - @RawQuery(observedEntities = {Notice.class, Metadata.class}) - abstract List getAllNow(SupportSQLiteQuery query); - public List getAllNow(int profileId, String filter) { - return getAllNow(new SimpleSQLiteQuery("SELECT\n" + - "*\n" + - "FROM luckyNumbers\n" + - "LEFT JOIN metadata ON luckyNumberDate = thingId AND thingType = "+TYPE_LUCKY_NUMBER+" AND metadata.profileId = "+profileId+"\n" + - "WHERE luckyNumbers.profileId = "+profileId+" AND "+filter+"\n" + - "ORDER BY addedDate DESC")); - } - public List getNotNotifiedNow(int profileId) { - return getAllNow(profileId, "notified = 0"); - } - - @Query("SELECT * FROM luckyNumbers\n" + - "LEFT JOIN metadata ON luckyNumberDate = thingId AND thingType = "+TYPE_LUCKY_NUMBER+" AND metadata.profileId = luckyNumbers.profileId " + - "WHERE notified = 0 " + - "ORDER BY addedDate DESC") - public abstract List getNotNotifiedNow(); -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/LuckyNumberDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/LuckyNumberDao.kt new file mode 100644 index 00000000..ad44c0d3 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/LuckyNumberDao.kt @@ -0,0 +1,74 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-25. + */ +package pl.szczodrzynski.edziennik.data.db.dao + +import androidx.lifecycle.LiveData +import androidx.room.Dao +import androidx.room.Query +import androidx.room.RawQuery +import androidx.sqlite.db.SupportSQLiteQuery +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.annotation.SelectiveDao +import pl.szczodrzynski.edziennik.annotation.UpdateSelective +import pl.szczodrzynski.edziennik.data.db.AppDb +import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber +import pl.szczodrzynski.edziennik.data.db.entity.Metadata +import pl.szczodrzynski.edziennik.data.db.full.LuckyNumberFull +import pl.szczodrzynski.edziennik.utils.models.Date + +@Dao +@SelectiveDao(db = AppDb::class) +abstract class LuckyNumberDao : BaseDao { + companion object { + private const val QUERY = """ + SELECT + * + FROM luckyNumbers + LEFT JOIN metadata ON luckyNumberDate = thingId AND thingType = ${Metadata.TYPE_LUCKY_NUMBER} AND metadata.profileId = luckyNumbers.profileId + """ + + private const val ORDER_BY = """ORDER BY luckyNumberDate DESC""" + } + + private val selective by lazy { LuckyNumberDaoSelective(App.db) } + + @RawQuery(observedEntities = [LuckyNumber::class]) + abstract override fun getRaw(query: SupportSQLiteQuery): LiveData> + @RawQuery(observedEntities = [LuckyNumber::class]) + abstract override fun getOne(query: SupportSQLiteQuery): LiveData + + // SELECTIVE UPDATE + @UpdateSelective(primaryKeys = ["profileId", "luckyNumberDate"], skippedColumns = ["addedDate"]) + override fun update(item: LuckyNumber) = selective.update(item) + override fun updateAll(items: List) = selective.updateAll(items) + + // CLEAR + @Query("DELETE FROM luckyNumbers WHERE profileId = :profileId") + abstract override fun clear(profileId: Int) + // REMOVE NOT KEPT + @Query("DELETE FROM luckyNumbers WHERE keep = 0") + abstract override fun removeNotKept() + + // GET ALL - LIVE DATA + fun getAll(profileId: Int) = + getRaw("$QUERY WHERE luckyNumbers.profileId = $profileId $ORDER_BY") + + // GET ALL - NOW + fun getAllNow(profileId: Int) = + getRawNow("$QUERY WHERE luckyNumbers.profileId = $profileId $ORDER_BY") + fun getNotNotifiedNow() = + getRawNow("$QUERY WHERE notified = 0 $ORDER_BY") + fun getNotNotifiedNow(profileId: Int) = + getRawNow("$QUERY WHERE luckyNumbers.profileId = $profileId AND notified = 0 $ORDER_BY") + + // GET ONE - LIVE DATA + fun getNearestFuture(profileId: Int, today: Date) = + getOne("$QUERY WHERE luckyNumbers.profileId = $profileId AND luckyNumberDate >= ${today.value} $ORDER_BY LIMIT 1") + + // GET ONE - NOW + fun getByIdNow(profileId: Int, id: Long) = + getOneNow("$QUERY WHERE attendances.profileId = $profileId AND attendanceId = $id") + fun getNearestFutureNow(profileId: Int, today: Date) = + getOneNow("$QUERY WHERE luckyNumbers.profileId = $profileId AND luckyNumberDate >= ${today.value} $ORDER_BY LIMIT 1") +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/MessageDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/MessageDao.kt index 606f29a7..a0be36ab 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/MessageDao.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/MessageDao.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 + * Copyright (c) Kuba Szczodrzyński 2020-4-25. */ package pl.szczodrzynski.edziennik.data.db.dao @@ -36,7 +36,10 @@ abstract class MessageDao : BaseDao { @RawQuery(observedEntities = [Message::class]) abstract override fun getRaw(query: SupportSQLiteQuery): LiveData> + @RawQuery(observedEntities = [Message::class]) + abstract override fun getOne(query: SupportSQLiteQuery): LiveData + // SELECTIVE UPDATE @UpdateSelective(primaryKeys = ["profileId", "messageId"], skippedColumns = ["messageType", "messageBody", "messageIsPinned", "attachmentIds", "attachmentNames", "attachmentSizes"]) override fun update(item: Message) = selective.update(item) override fun updateAll(items: List) = selective.updateAll(items) @@ -44,6 +47,9 @@ abstract class MessageDao : BaseDao { // CLEAR @Query("DELETE FROM messages WHERE profileId = :profileId") abstract override fun clear(profileId: Int) + // REMOVE NOT KEPT + @Query("DELETE FROM messages WHERE keep = 0") + abstract override fun removeNotKept() // GET ALL - LIVE DATA fun getAll(profileId: Int) = @@ -64,4 +70,6 @@ abstract class MessageDao : BaseDao { // GET ONE - NOW fun getByIdNow(profileId: Int, id: Long) = getOneNow("$QUERY WHERE messages.profileId = $profileId AND messageId = $id") + + } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/MetadataDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/MetadataDao.java index 7a074bca..eac92f21 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/MetadataDao.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/MetadataDao.java @@ -63,37 +63,37 @@ public abstract class MetadataDao { @Transaction public void setSeen(int profileId, Object o, boolean seen) { if (o instanceof Grade) { - if (add(new Metadata(profileId, TYPE_GRADE, ((Grade) o).getId(), seen, false, 0)) == -1) { + if (add(new Metadata(profileId, TYPE_GRADE, ((Grade) o).getId(), seen, false)) == -1) { updateSeen(profileId, TYPE_GRADE, ((Grade) o).getId(), seen); } } if (o instanceof Attendance) { - if (add(new Metadata(profileId, TYPE_ATTENDANCE, ((Attendance) o).id, seen, false, 0)) == -1) { - updateSeen(profileId, TYPE_ATTENDANCE, ((Attendance) o).id, seen); + if (add(new Metadata(profileId, TYPE_ATTENDANCE, ((Attendance) o).getId(), seen, false)) == -1) { + updateSeen(profileId, TYPE_ATTENDANCE, ((Attendance) o).getId(), seen); } } if (o instanceof Notice) { - if (add(new Metadata(profileId, TYPE_NOTICE, ((Notice) o).id, seen, false, 0)) == -1) { - updateSeen(profileId, TYPE_NOTICE, ((Notice) o).id, seen); + if (add(new Metadata(profileId, TYPE_NOTICE, ((Notice) o).getId(), seen, false)) == -1) { + updateSeen(profileId, TYPE_NOTICE, ((Notice) o).getId(), seen); } } if (o instanceof Event) { - if (add(new Metadata(profileId, ((Event) o).getType() == Event.TYPE_HOMEWORK ? TYPE_HOMEWORK : TYPE_EVENT, ((Event) o).getId(), seen, false, 0)) == -1) { + if (add(new Metadata(profileId, ((Event) o).getType() == Event.TYPE_HOMEWORK ? TYPE_HOMEWORK : TYPE_EVENT, ((Event) o).getId(), seen, false)) == -1) { updateSeen(profileId, ((Event) o).getType() == Event.TYPE_HOMEWORK ? TYPE_HOMEWORK : TYPE_EVENT, ((Event) o).getId(), seen); } } if (o instanceof LessonFull) { - if (add(new Metadata(profileId, TYPE_LESSON_CHANGE, ((LessonFull) o).getId(), seen, false, 0)) == -1) { + if (add(new Metadata(profileId, TYPE_LESSON_CHANGE, ((LessonFull) o).getId(), seen, false)) == -1) { updateSeen(profileId, TYPE_LESSON_CHANGE, ((LessonFull) o).getId(), seen); } } if (o instanceof Announcement) { - if (add(new Metadata(profileId, TYPE_ANNOUNCEMENT, ((Announcement) o).id, seen, false, 0)) == -1) { - updateSeen(profileId, TYPE_ANNOUNCEMENT, ((Announcement) o).id, seen); + if (add(new Metadata(profileId, TYPE_ANNOUNCEMENT, ((Announcement) o).getId(), seen, false)) == -1) { + updateSeen(profileId, TYPE_ANNOUNCEMENT, ((Announcement) o).getId(), seen); } } if (o instanceof Message) { - if (add(new Metadata(profileId, TYPE_MESSAGE, ((Message) o).getId(), seen, false, 0)) == -1) { + if (add(new Metadata(profileId, TYPE_MESSAGE, ((Message) o).getId(), seen, false)) == -1) { updateSeen(profileId, TYPE_MESSAGE, ((Message) o).getId(), seen); } } @@ -102,37 +102,37 @@ public abstract class MetadataDao { @Transaction public void setNotified(int profileId, Object o, boolean notified) { if (o instanceof Grade) { - if (add(new Metadata(profileId, TYPE_GRADE, ((Grade) o).getId(), false, notified, 0)) == -1) { + if (add(new Metadata(profileId, TYPE_GRADE, ((Grade) o).getId(), false, notified)) == -1) { updateNotified(profileId, TYPE_GRADE, ((Grade) o).getId(), notified); } } if (o instanceof Attendance) { - if (add(new Metadata(profileId, TYPE_ATTENDANCE, ((Attendance) o).id, false, notified, 0)) == -1) { - updateNotified(profileId, TYPE_ATTENDANCE, ((Attendance) o).id, notified); + if (add(new Metadata(profileId, TYPE_ATTENDANCE, ((Attendance) o).getId(), false, notified)) == -1) { + updateNotified(profileId, TYPE_ATTENDANCE, ((Attendance) o).getId(), notified); } } if (o instanceof Notice) { - if (add(new Metadata(profileId, TYPE_NOTICE, ((Notice) o).id, false, notified, 0)) == -1) { - updateNotified(profileId, TYPE_NOTICE, ((Notice) o).id, notified); + if (add(new Metadata(profileId, TYPE_NOTICE, ((Notice) o).getId(), false, notified)) == -1) { + updateNotified(profileId, TYPE_NOTICE, ((Notice) o).getId(), notified); } } if (o instanceof Event) { - if (add(new Metadata(profileId, ((Event) o).getType() == Event.TYPE_HOMEWORK ? TYPE_HOMEWORK : TYPE_EVENT, ((Event) o).getId(), false, notified, 0)) == -1) { + if (add(new Metadata(profileId, ((Event) o).getType() == Event.TYPE_HOMEWORK ? TYPE_HOMEWORK : TYPE_EVENT, ((Event) o).getId(), false, notified)) == -1) { updateNotified(profileId, ((Event) o).getType() == Event.TYPE_HOMEWORK ? TYPE_HOMEWORK : TYPE_EVENT, ((Event) o).getId(), notified); } } if (o instanceof LessonFull) { - if (add(new Metadata(profileId, TYPE_LESSON_CHANGE, ((LessonFull) o).getId(), false, notified, 0)) == -1) { + if (add(new Metadata(profileId, TYPE_LESSON_CHANGE, ((LessonFull) o).getId(), false, notified)) == -1) { updateNotified(profileId, TYPE_LESSON_CHANGE, ((LessonFull) o).getId(), notified); } } if (o instanceof Announcement) { - if (add(new Metadata(profileId, TYPE_ANNOUNCEMENT, ((Announcement) o).id, false, notified, 0)) == -1) { - updateNotified(profileId, TYPE_ANNOUNCEMENT, ((Announcement) o).id, notified); + if (add(new Metadata(profileId, TYPE_ANNOUNCEMENT, ((Announcement) o).getId(), false, notified)) == -1) { + updateNotified(profileId, TYPE_ANNOUNCEMENT, ((Announcement) o).getId(), notified); } } if (o instanceof Message) { - if (add(new Metadata(profileId, TYPE_MESSAGE, ((Message) o).getId(), false, notified, 0)) == -1) { + if (add(new Metadata(profileId, TYPE_MESSAGE, ((Message) o).getId(), false, notified)) == -1) { updateNotified(profileId, TYPE_MESSAGE, ((Message) o).getId(), notified); } } @@ -141,7 +141,7 @@ public abstract class MetadataDao { @Transaction public void setBoth(int profileId, Event o, boolean seen, boolean notified, long addedDate) { if (o != null) { - if (add(new Metadata(profileId, o.getType() == Event.TYPE_HOMEWORK ? TYPE_HOMEWORK : TYPE_EVENT, o.getId(), seen, notified, addedDate)) == -1) { + if (add(new Metadata(profileId, o.getType() == Event.TYPE_HOMEWORK ? TYPE_HOMEWORK : TYPE_EVENT, o.getId(), seen, notified)) == -1) { updateSeen(profileId, o.getType() == Event.TYPE_HOMEWORK ? TYPE_HOMEWORK : TYPE_EVENT, o.getId(), seen); updateNotified(profileId, o.getType() == Event.TYPE_HOMEWORK ? TYPE_HOMEWORK : TYPE_EVENT, o.getId(), notified); } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/NoticeDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/NoticeDao.java deleted file mode 100644 index 110544e4..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/NoticeDao.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 - */ - -package pl.szczodrzynski.edziennik.data.db.dao; - -import androidx.lifecycle.LiveData; -import androidx.room.Dao; -import androidx.room.Insert; -import androidx.room.OnConflictStrategy; -import androidx.room.Query; -import androidx.room.RawQuery; -import androidx.sqlite.db.SimpleSQLiteQuery; -import androidx.sqlite.db.SupportSQLiteQuery; - -import java.util.List; - -import pl.szczodrzynski.edziennik.data.db.entity.Metadata; -import pl.szczodrzynski.edziennik.data.db.entity.Notice; -import pl.szczodrzynski.edziennik.data.db.full.NoticeFull; - -import static pl.szczodrzynski.edziennik.data.db.entity.Metadata.TYPE_NOTICE; - -@Dao -public abstract class NoticeDao { - @Insert(onConflict = OnConflictStrategy.REPLACE) - public abstract long add(Notice notice); - - @Insert(onConflict = OnConflictStrategy.REPLACE) - public abstract void addAll(List noticeList); - - @Query("DELETE FROM notices WHERE profileId = :profileId") - public abstract void clear(int profileId); - - @Query("DELETE FROM notices WHERE profileId = :profileId AND noticeSemester = :semester") - public abstract void clearForSemester(int profileId, int semester); - - @RawQuery(observedEntities = {Notice.class}) - abstract LiveData> getAll(SupportSQLiteQuery query); - public LiveData> getAll(int profileId, String filter) { - return getAll(new SimpleSQLiteQuery("SELECT \n" + - "*, \n" + - "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" + - "FROM notices \n" + - "LEFT JOIN teachers USING(profileId, teacherId)\n" + - "LEFT JOIN metadata ON noticeId = thingId AND thingType = "+TYPE_NOTICE+" AND metadata.profileId = "+profileId+"\n" + - "WHERE notices.profileId = "+profileId+" AND "+filter+"\n" + - "ORDER BY addedDate DESC")); - } - public LiveData> getAll(int profileId) { - return getAll(profileId, "1"); - } - public LiveData> getAllWhere(int profileId, String filter) { - return getAll(profileId, filter); - } - - @RawQuery(observedEntities = {Notice.class, Metadata.class}) - abstract List getAllNow(SupportSQLiteQuery query); - public List getAllNow(int profileId, String filter) { - return getAllNow(new SimpleSQLiteQuery("SELECT \n" + - "*, \n" + - "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" + - "FROM notices \n" + - "LEFT JOIN teachers USING(profileId, teacherId)\n" + - "LEFT JOIN metadata ON noticeId = thingId AND thingType = "+TYPE_NOTICE+" AND metadata.profileId = "+profileId+"\n" + - "WHERE notices.profileId = "+profileId+" AND "+filter+"\n" + - "ORDER BY addedDate DESC")); - } - public List getNotNotifiedNow(int profileId) { - return getAllNow(profileId, "notified = 0"); - } - - @Query("SELECT " + - "*, " + - "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName " + - "FROM notices " + - "LEFT JOIN teachers USING(profileId, teacherId) " + - "LEFT JOIN metadata ON noticeId = thingId AND thingType = "+TYPE_NOTICE+" AND metadata.profileId = notices.profileId " + - "WHERE notified = 0 " + - "ORDER BY addedDate DESC") - public abstract List getNotNotifiedNow(); -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/NoticeDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/NoticeDao.kt new file mode 100644 index 00000000..79bae175 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/NoticeDao.kt @@ -0,0 +1,72 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-25. + */ +package pl.szczodrzynski.edziennik.data.db.dao + +import androidx.lifecycle.LiveData +import androidx.room.Dao +import androidx.room.Query +import androidx.room.RawQuery +import androidx.sqlite.db.SupportSQLiteQuery +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.annotation.SelectiveDao +import pl.szczodrzynski.edziennik.annotation.UpdateSelective +import pl.szczodrzynski.edziennik.data.db.AppDb +import pl.szczodrzynski.edziennik.data.db.entity.Metadata +import pl.szczodrzynski.edziennik.data.db.entity.Notice +import pl.szczodrzynski.edziennik.data.db.full.NoticeFull + +@Dao +@SelectiveDao(db = AppDb::class) +abstract class NoticeDao : BaseDao { + companion object { + private const val QUERY = """ + SELECT + *, + teachers.teacherName ||" "|| teachers.teacherSurname AS teacherName + FROM notices + LEFT JOIN teachers USING(profileId, teacherId) + LEFT JOIN metadata ON noticeId = thingId AND thingType = ${Metadata.TYPE_NOTICE} AND metadata.profileId = notices.profileId + """ + + private const val ORDER_BY = """ORDER BY addedDate DESC""" + } + + private val selective by lazy { NoticeDaoSelective(App.db) } + + @RawQuery(observedEntities = [Notice::class]) + abstract override fun getRaw(query: SupportSQLiteQuery): LiveData> + @RawQuery(observedEntities = [Notice::class]) + abstract override fun getOne(query: SupportSQLiteQuery): LiveData + + // SELECTIVE UPDATE + @UpdateSelective(primaryKeys = ["profileId", "noticeId"], skippedColumns = ["addedDate"]) + override fun update(item: Notice) = selective.update(item) + override fun updateAll(items: List) = selective.updateAll(items) + + // CLEAR + @Query("DELETE FROM notices WHERE profileId = :profileId") + abstract override fun clear(profileId: Int) + // REMOVE NOT KEPT + @Query("DELETE FROM notices WHERE keep = 0") + abstract override fun removeNotKept() + + // GET ALL - LIVE DATA + fun getAll(profileId: Int) = + getRaw("$QUERY WHERE notices.profileId = $profileId $ORDER_BY") + + // GET ALL - NOW + fun getAllNow(profileId: Int) = + getRawNow("$QUERY WHERE notices.profileId = $profileId $ORDER_BY") + fun getNotNotifiedNow() = + getRawNow("$QUERY WHERE notified = 0 $ORDER_BY") + fun getNotNotifiedNow(profileId: Int) = + getRawNow("$QUERY WHERE notices.profileId = $profileId AND notified = 0 $ORDER_BY") + + // GET ONE - NOW + fun getByIdNow(profileId: Int, id: Long) = + getOneNow("$QUERY WHERE notices.profileId = $profileId AND noticeId = $id") + + @Query("UPDATE notices SET keep = 0 WHERE profileId = :profileId AND noticeSemester = :semester") + abstract fun dontKeepSemester(profileId: Int, semester: Int) +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/TeacherAbsenceDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/TeacherAbsenceDao.kt index 1d4881bb..1528adf1 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/TeacherAbsenceDao.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/TeacherAbsenceDao.kt @@ -1,65 +1,74 @@ /* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 + * Copyright (c) Kuba Szczodrzyński 2020-4-25. */ - package pl.szczodrzynski.edziennik.data.db.dao import androidx.lifecycle.LiveData import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy import androidx.room.Query +import androidx.room.RawQuery +import androidx.sqlite.db.SupportSQLiteQuery +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.annotation.SelectiveDao +import pl.szczodrzynski.edziennik.annotation.UpdateSelective +import pl.szczodrzynski.edziennik.data.db.AppDb import pl.szczodrzynski.edziennik.data.db.entity.Metadata import pl.szczodrzynski.edziennik.data.db.entity.TeacherAbsence import pl.szczodrzynski.edziennik.data.db.full.TeacherAbsenceFull import pl.szczodrzynski.edziennik.utils.models.Date @Dao -interface TeacherAbsenceDao { +@SelectiveDao(db = AppDb::class) +abstract class TeacherAbsenceDao : BaseDao { + companion object { + private const val QUERY = """ + SELECT + *, + teachers.teacherName ||" "|| teachers.teacherSurname AS teacherName + FROM teacherAbsence + LEFT JOIN teachers USING(profileId, teacherId) + LEFT JOIN metadata ON teacherAbsenceId = thingId AND thingType = ${Metadata.TYPE_TEACHER_ABSENCE} AND metadata.profileId = teacherAbsence.profileId + """ - @Insert(onConflict = OnConflictStrategy.REPLACE) - fun add(teacherAbsence: TeacherAbsence) + private const val ORDER_BY = """ORDER BY teacherAbsenceDateFrom ASC""" + } - @Insert(onConflict = OnConflictStrategy.REPLACE) - fun addAll(teacherAbsenceList: List) + private val selective by lazy { TeacherAbsenceDaoSelective(App.db) } - @Query("SELECT * FROM teacherAbsence WHERE profileId = :profileId") - fun getAll(profileId: Int): List + @RawQuery(observedEntities = [TeacherAbsence::class]) + abstract override fun getRaw(query: SupportSQLiteQuery): LiveData> + @RawQuery(observedEntities = [TeacherAbsence::class]) + abstract override fun getOne(query: SupportSQLiteQuery): LiveData - @Query("SELECT *, teachers.teacherName || ' ' || teachers.teacherSurname as teacherFullName, " + - "metadata.seen, metadata.notified, metadata.addedDate FROM teacherAbsence " + - "LEFT JOIN teachers USING (profileId, teacherId) " + - "LEFT JOIN metadata ON teacherAbsenceId = thingId AND metadata.thingType = " + Metadata.TYPE_TEACHER_ABSENCE + - " AND metadata.profileId = :profileId WHERE teachers.profileId = :profileId") - fun getAllFullNow(profileId: Int): List - - @Query("SELECT *, teachers.teacherName || ' ' || teachers.teacherSurname as teacherFullName, " + - "metadata.seen, metadata.notified, metadata.addedDate FROM teacherAbsence " + - "LEFT JOIN teachers USING (profileId, teacherId) " + - "LEFT JOIN metadata ON teacherAbsenceId = thingId AND metadata.thingType = " + Metadata.TYPE_TEACHER_ABSENCE + - " AND metadata.profileId = :profileId WHERE teachers.profileId = :profileId " + - "AND :date BETWEEN teacherAbsenceDateFrom AND teacherAbsenceDateTo") - fun getAllByDateFull(profileId: Int, date: Date): LiveData> - - @Query("SELECT *, teachers.teacherName || ' ' || teachers.teacherSurname as teacherFullName, " + - "metadata.seen, metadata.notified, metadata.addedDate FROM teacherAbsence " + - "LEFT JOIN teachers USING (profileId, teacherId) " + - "LEFT JOIN metadata ON teacherAbsenceId = thingId AND metadata.thingType = " + Metadata.TYPE_TEACHER_ABSENCE + - " AND metadata.profileId = :profileId WHERE teachers.profileId = :profileId " + - "AND :date BETWEEN teacherAbsenceDateFrom AND teacherAbsenceDateTo") - fun getAllByDateNow(profileId: Int, date: Date): List - - @Query(""" - SELECT *, - teachers.teacherName || ' ' || teachers.teacherSurname as teacherFullName - FROM teacherAbsence - LEFT JOIN teachers USING (profileId, teacherId) - LEFT JOIN metadata ON teacherAbsenceId = thingId AND metadata.thingType = ${Metadata.TYPE_TEACHER_ABSENCE} - AND teachers.profileId = metadata.profileId WHERE metadata.notified = 0 - ORDER BY addedDate DESC - """) - fun getNotNotifiedNow(): List + // SELECTIVE UPDATE + @UpdateSelective(primaryKeys = ["profileId", "teacherAbsenceId"], skippedColumns = ["addedDate"]) + override fun update(item: TeacherAbsence) = selective.update(item) + override fun updateAll(items: List) = selective.updateAll(items) + // CLEAR @Query("DELETE FROM teacherAbsence WHERE profileId = :profileId") - fun clear(profileId: Int) + abstract override fun clear(profileId: Int) + // REMOVE NOT KEPT + @Query("DELETE FROM teacherAbsence WHERE keep = 0") + abstract override fun removeNotKept() + + // GET ALL - LIVE DATA + fun getAll(profileId: Int) = + getRaw("$QUERY WHERE teacherAbsence.profileId = $profileId $ORDER_BY") + fun getAllByDate(profileId: Int, date: Date) = + getRaw("$QUERY WHERE teacherAbsence.profileId = $profileId AND '${date.stringY_m_d}' BETWEEN teacherAbsenceDateFrom AND teacherAbsenceDateTo $ORDER_BY") + + // GET ALL - NOW + fun getAllNow(profileId: Int) = + getRawNow("$QUERY WHERE teacherAbsence.profileId = $profileId $ORDER_BY") + fun getNotNotifiedNow() = + getRawNow("$QUERY WHERE notified = 0 $ORDER_BY") + fun getNotNotifiedNow(profileId: Int) = + getRawNow("$QUERY WHERE teacherAbsence.profileId = $profileId AND notified = 0 $ORDER_BY") + fun getAllByDateNow(profileId: Int, date: Date) = + getRawNow("$QUERY WHERE teacherAbsence.profileId = $profileId AND '${date.stringY_m_d}' BETWEEN teacherAbsenceDateFrom AND teacherAbsenceDateTo $ORDER_BY") + + // GET ONE - NOW + fun getByIdNow(profileId: Int, id: Long) = + getOneNow("$QUERY WHERE teacherAbsence.profileId = $profileId AND teacherAbsenceId = $id") } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/TimetableDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/TimetableDao.kt index 9ac9709b..cc236dc6 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/TimetableDao.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/TimetableDao.kt @@ -1,20 +1,25 @@ /* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 + * Copyright (c) Kuba Szczodrzyński 2020-4-25. */ - package pl.szczodrzynski.edziennik.data.db.dao import androidx.lifecycle.LiveData -import androidx.room.* -import androidx.sqlite.db.SimpleSQLiteQuery +import androidx.room.Dao +import androidx.room.Query +import androidx.room.RawQuery import androidx.sqlite.db.SupportSQLiteQuery +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.annotation.SelectiveDao +import pl.szczodrzynski.edziennik.annotation.UpdateSelective +import pl.szczodrzynski.edziennik.data.db.AppDb import pl.szczodrzynski.edziennik.data.db.entity.Lesson import pl.szczodrzynski.edziennik.data.db.entity.Metadata import pl.szczodrzynski.edziennik.data.db.full.LessonFull import pl.szczodrzynski.edziennik.utils.models.Date @Dao -interface TimetableDao { +@SelectiveDao(db = AppDb::class) +abstract class TimetableDao : BaseDao { companion object { private const val QUERY = """ SELECT @@ -25,7 +30,7 @@ interface TimetableDao { oldS.subjectLongName AS oldSubjectName, oldT.teacherName ||" "|| oldT.teacherSurname AS oldTeacherName, oldG.teamName AS oldTeamName, - metadata.seen, metadata.notified, metadata.addedDate + metadata.seen, metadata.notified FROM timetable LEFT JOIN subjects USING(profileId, subjectId) LEFT JOIN teachers USING(profileId, teacherId) @@ -35,111 +40,77 @@ interface TimetableDao { LEFT JOIN teams AS oldG ON timetable.profileId = oldG.profileId AND timetable.oldTeamId = oldG.teamId LEFT JOIN metadata ON id = thingId AND thingType = ${Metadata.TYPE_LESSON_CHANGE} AND metadata.profileId = timetable.profileId """ + + private const val ORDER_BY = """ORDER BY profileId, id, type""" + private const val IS_CHANGED = """type != -1 AND type != 0""" } - @Insert(onConflict = OnConflictStrategy.REPLACE) - operator fun plusAssign(lessonList: List) - - @Query("DELETE FROM timetable WHERE profileId = :profileId") - fun clear(profileId: Int) - - @Query("DELETE FROM timetable WHERE profileId = :profileId AND type != -1 AND ((type != 3 AND date >= :dateFrom) OR ((type = 3 OR type = 1) AND oldDate >= :dateFrom))") - fun clearFromDate(profileId: Int, dateFrom: Date) - - @Query("DELETE FROM timetable WHERE profileId = :profileId AND type != -1 AND ((type != 3 AND date <= :dateTo) OR ((type = 3 OR type = 1) AND oldDate <= :dateTo))") - fun clearToDate(profileId: Int, dateTo: Date) - - @Query("DELETE FROM timetable WHERE profileId = :profileId AND type != -1 AND ((type != 3 AND date >= :dateFrom AND date <= :dateTo) OR ((type = 3 OR type = 1) AND oldDate >= :dateFrom AND oldDate <= :dateTo))") - fun clearBetweenDates(profileId: Int, dateFrom: Date, dateTo: Date) + private val selective by lazy { TimetableDaoSelective(App.db) } @RawQuery(observedEntities = [Lesson::class]) - fun getRaw(query: SupportSQLiteQuery): LiveData> + abstract override fun getRaw(query: SupportSQLiteQuery): LiveData> + @RawQuery(observedEntities = [Lesson::class]) + abstract override fun getOne(query: SupportSQLiteQuery): LiveData - @Query(""" - $QUERY - WHERE timetable.profileId = :profileId AND type != -1 AND type != 0 - ORDER BY id, type - """) - fun getAllChangesNow(profileId: Int): List + // SELECTIVE UPDATE + @UpdateSelective(primaryKeys = ["profileId", "id"], skippedColumns = ["addedDate"]) + override fun update(item: Lesson) = selective.update(item) + override fun updateAll(items: List) = selective.updateAll(items) - @Query(""" - $QUERY - WHERE timetable.profileId = :profileId AND type != -1 AND type != 0 AND ((type != 3 AND date = :date) OR ((type = 3 OR type = 1) AND oldDate = :date)) - ORDER BY id, type - """) - fun getChangesForDateNow(profileId: Int, date: Date): List + // CLEAR + @Query("DELETE FROM timetable WHERE profileId = :profileId") + abstract override fun clear(profileId: Int) + // REMOVE NOT KEPT + @Query("DELETE FROM timetable WHERE keep = 0") + abstract override fun removeNotKept() - fun getForDate(profileId: Int, date: Date) = getRaw(SimpleSQLiteQuery(""" - $QUERY - WHERE timetable.profileId = $profileId AND ((type != 3 AND date = "${date.stringY_m_d}") OR ((type = 3 OR type = 1) AND oldDate = "${date.stringY_m_d}")) - ORDER BY id, type - """)) + // GET ALL - LIVE DATA + fun getAll(profileId: Int) = + getRaw("$QUERY WHERE timetable.profileId = $profileId $ORDER_BY") + fun getAllForDate(profileId: Int, date: Date) = + getRaw("$QUERY WHERE timetable.profileId = $profileId AND ((type != 3 AND date = '${date.stringY_m_d}') OR ((type = 3 OR type = 1) AND oldDate = '${date.stringY_m_d}')) $ORDER_BY") + fun getNextWithSubject(profileId: Int, date: Date, subjectId: Long) = + getOne("$QUERY " + + "WHERE timetable.profileId = $profileId " + + "AND ((type != 3 AND date > '${date.stringY_m_d}') OR ((type = 3 OR type = 1) AND oldDate > '${date.stringY_m_d}')) " + + "AND timetable.subjectId = $subjectId " + + "LIMIT 1") + fun getNextWithSubjectAndTeam(profileId: Int, date: Date, subjectId: Long, teamId: Long) = + getOne("$QUERY " + + "WHERE timetable.profileId = $profileId " + + "AND ((type != 3 AND date > '${date.stringY_m_d}') OR ((type = 3 OR type = 1) AND oldDate > '${date.stringY_m_d}')) " + + "AND timetable.subjectId = $subjectId " + + "AND timetable.teamId = $teamId " + + "LIMIT 1") + fun getBetweenDates(dateFrom: Date, dateTo: Date) = + getRaw("$QUERY WHERE (type != 3 AND date >= '${dateFrom.stringY_m_d}' AND date <= '${dateTo.stringY_m_d}') OR ((type = 3 OR type = 1) AND oldDate >= '${dateFrom.stringY_m_d}' AND oldDate <= '${dateTo.stringY_m_d}') $ORDER_BY") - @Query(""" - $QUERY - WHERE timetable.profileId = :profileId AND ((type != 3 AND date = :date) OR ((type = 3 OR type = 1) AND oldDate = :date)) - ORDER BY id, type - """) - fun getForDateNow(profileId: Int, date: Date): List + // GET ALL - NOW + fun getAllNow(profileId: Int) = + getRawNow("$QUERY WHERE timetable.profileId = $profileId $ORDER_BY") + fun getNotNotifiedNow() = + getRawNow("$QUERY WHERE notified = 0 AND timetable.type NOT IN (${Lesson.TYPE_NORMAL}, ${Lesson.TYPE_NO_LESSONS}, ${Lesson.TYPE_SHIFTED_SOURCE}) $ORDER_BY") + fun getNotNotifiedNow(profileId: Int) = + getRawNow("$QUERY WHERE timetable.profileId = $profileId AND notified = 0 AND timetable.type NOT IN (${Lesson.TYPE_NORMAL}, ${Lesson.TYPE_NO_LESSONS}, ${Lesson.TYPE_SHIFTED_SOURCE}) $ORDER_BY") + fun getAllForDateNow(profileId: Int, date: Date) = + getRawNow("$QUERY WHERE timetable.profileId = $profileId AND ((type != 3 AND date = '${date.stringY_m_d}') OR ((type = 3 OR type = 1) AND oldDate = '${date.stringY_m_d}')) $ORDER_BY") + fun getChangesNow(profileId: Int) = + getRawNow("$QUERY WHERE timetable.profileId = $profileId AND $IS_CHANGED $ORDER_BY") + fun getChangesForDateNow(profileId: Int, date: Date) = + getRawNow("$QUERY WHERE timetable.profileId = $profileId AND $IS_CHANGED AND ((type != 3 AND date = '${date.stringY_m_d}') OR ((type = 3 OR type = 1) AND oldDate = '${date.stringY_m_d}')) $ORDER_BY") + fun getBetweenDatesNow(dateFrom: Date, dateTo: Date) = + getRawNow("$QUERY WHERE (type != 3 AND date >= '${dateFrom.stringY_m_d}' AND date <= '${dateTo.stringY_m_d}') OR ((type = 3 OR type = 1) AND oldDate >= '${dateFrom.stringY_m_d}' AND oldDate <= '${dateTo.stringY_m_d}') $ORDER_BY") - @Query(""" - $QUERY - WHERE timetable.profileId = :profileId AND ((type != 3 AND date > :today) OR ((type = 3 OR type = 1) AND oldDate > :today)) AND timetable.subjectId = :subjectId - ORDER BY id, type - LIMIT 1 - """) - fun getNextWithSubject(profileId: Int, today: Date, subjectId: Long): LiveData + // GET ONE - NOW + fun getByIdNow(profileId: Int, id: Long) = + getOneNow("$QUERY WHERE timetable.profileId = $profileId AND timetable.id = $id") - @Query(""" - $QUERY - WHERE timetable.profileId = :profileId AND ((type != 3 AND date > :today) OR ((type = 3 OR type = 1) AND oldDate > :today)) AND timetable.subjectId = :subjectId AND timetable.teamId = :teamId - ORDER BY id, type - LIMIT 1 - """) - fun getNextWithSubjectAndTeam(profileId: Int, today: Date, subjectId: Long, teamId: Long): LiveData + @Query("UPDATE timetable SET keep = 0 WHERE profileId = :profileId AND type != -1 AND ((type != 3 AND date >= :dateFrom) OR ((type = 3 OR type = 1) AND oldDate >= :dateFrom))") + abstract fun dontKeepFromDate(profileId: Int, dateFrom: Date) - @Query(""" - $QUERY - WHERE (type != 3 AND date >= :dateFrom AND date <= :dateTo) OR ((type = 3 OR type = 1) AND oldDate >= :dateFrom AND oldDate <= :dateTo) - ORDER BY profileId, id, type - """) - fun getBetweenDatesNow(dateFrom: Date, dateTo: Date): List + @Query("UPDATE timetable SET keep = 0 WHERE profileId = :profileId AND type != -1 AND ((type != 3 AND date <= :dateTo) OR ((type = 3 OR type = 1) AND oldDate <= :dateTo))") + abstract fun dontKeepToDate(profileId: Int, dateTo: Date) - @Query(""" - $QUERY - WHERE (type != 3 AND date >= :dateFrom AND date <= :dateTo) OR ((type = 3 OR type = 1) AND oldDate >= :dateFrom AND oldDate <= :dateTo) - ORDER BY profileId, id, type - """) - fun getBetweenDates(dateFrom: Date, dateTo: Date): LiveData> - - @Query(""" - $QUERY - WHERE timetable.profileId = :profileId AND timetable.id = :lessonId - ORDER BY id, type - """) - fun getByIdNow(profileId: Int, lessonId: Long): LessonFull? - - @Query(""" - $QUERY - WHERE timetable.profileId = :profileId AND timetable.type NOT IN (${Lesson.TYPE_NORMAL}, ${Lesson.TYPE_NO_LESSONS}, ${Lesson.TYPE_SHIFTED_SOURCE}) AND metadata.notified = 0 - """) - fun getNotNotifiedNow(profileId: Int): List - - @Query(""" - SELECT - timetable.*, - subjects.subjectLongName AS subjectName, - teachers.teacherName ||" "|| teachers.teacherSurname AS teacherName, - oldS.subjectLongName AS oldSubjectName, - oldT.teacherName ||" "|| oldT.teacherSurname AS oldTeacherName, - metadata.seen, metadata.notified, metadata.addedDate - FROM timetable - LEFT JOIN subjects USING(profileId, subjectId) - LEFT JOIN teachers USING(profileId, teacherId) - LEFT JOIN subjects AS oldS ON timetable.profileId = oldS.profileId AND timetable.oldSubjectId = oldS.subjectId - LEFT JOIN teachers AS oldT ON timetable.profileId = oldT.profileId AND timetable.oldTeacherId = oldT.teacherId - LEFT JOIN metadata ON id = thingId AND thingType = ${Metadata.TYPE_LESSON_CHANGE} AND metadata.profileId = timetable.profileId - WHERE timetable.type NOT IN (${Lesson.TYPE_NORMAL}, ${Lesson.TYPE_NO_LESSONS}, ${Lesson.TYPE_SHIFTED_SOURCE}) AND metadata.notified = 0 - """) - fun getNotNotifiedNow(): List + @Query("UPDATE timetable SET keep = 0 WHERE profileId = :profileId AND type != -1 AND ((type != 3 AND date >= :dateFrom AND date <= :dateTo) OR ((type = 3 OR type = 1) AND oldDate >= :dateFrom AND oldDate <= :dateTo))") + abstract fun dontKeepBetweenDates(profileId: Int, dateFrom: Date, dateTo: Date) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Announcement.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Announcement.java deleted file mode 100644 index af17e0c3..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Announcement.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 - */ - -package pl.szczodrzynski.edziennik.data.db.entity; - -import androidx.annotation.Nullable; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.Ignore; -import androidx.room.Index; - -import pl.szczodrzynski.edziennik.utils.models.Date; - -@Entity(tableName = "announcements", - primaryKeys = {"profileId", "announcementId"}, - indices = {@Index(value = {"profileId"})}) -public class Announcement { - public int profileId; - - @ColumnInfo(name = "announcementId") - public long id; - - @ColumnInfo(name = "announcementSubject") - public String subject; - @Nullable - @ColumnInfo(name = "announcementText") - public String text; - @Nullable - @ColumnInfo(name = "announcementStartDate") - public Date startDate; - @Nullable - @ColumnInfo(name = "announcementEndDate") - public Date endDate; - - public long teacherId; - - @Nullable - @ColumnInfo(name = "announcementIdString") - public String idString; - - @Ignore - public Announcement() {} - - public Announcement(int profileId, long id, String subject, String text, @Nullable Date startDate, @Nullable Date endDate, long teacherId, @Nullable String idString) { - this.profileId = profileId; - this.id = id; - this.subject = subject; - this.text = text; - this.startDate = startDate; - this.endDate = endDate; - this.teacherId = teacherId; - this.idString = idString; - } -} - - - diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Announcement.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Announcement.kt new file mode 100644 index 00000000..82f7bb78 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Announcement.kt @@ -0,0 +1,40 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-24. + */ +package pl.szczodrzynski.edziennik.data.db.entity + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Ignore +import androidx.room.Index +import pl.szczodrzynski.edziennik.utils.models.Date + +@Entity(tableName = "announcements", + primaryKeys = ["profileId", "announcementId"], + indices = [ + Index(value = ["profileId"]) + ]) +open class Announcement( + val profileId: Int, + @ColumnInfo(name = "announcementId") + var id: Long, + @ColumnInfo(name = "announcementSubject") + var subject: String, + @ColumnInfo(name = "announcementText") + var text: String?, + + @ColumnInfo(name = "announcementStartDate") + var startDate: Date?, + @ColumnInfo(name = "announcementEndDate") + var endDate: Date?, + + var teacherId: Long, + var addedDate: Long = System.currentTimeMillis() +) : Keepable() { + + @ColumnInfo(name = "announcementIdString") + var idString: String? = null + + @Ignore + var showAsUnseen: Boolean? = null +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Attendance.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Attendance.java deleted file mode 100644 index 039dcb0c..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Attendance.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 - */ - -package pl.szczodrzynski.edziennik.data.db.entity; - -import androidx.annotation.NonNull; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.Ignore; -import androidx.room.Index; - -import pl.szczodrzynski.edziennik.utils.models.Date; -import pl.szczodrzynski.edziennik.utils.models.Time; - -@Entity(tableName = "attendances", - primaryKeys = {"profileId", "attendanceId", "attendanceLessonDate", "attendanceStartTime"}, - indices = {@Index(value = {"profileId"})}) -public class Attendance { - public int profileId; - - @ColumnInfo(name = "attendanceId") - public long id; - - @NonNull - @ColumnInfo(name = "attendanceLessonDate") - public Date lessonDate; - @NonNull - @ColumnInfo(name = "attendanceStartTime") - public Time startTime; - @ColumnInfo(name = "attendanceLessonTopic") - public String lessonTopic; - @ColumnInfo(name = "attendanceSemester") - public int semester; - public static final int TYPE_PRESENT = 0; - public static final int TYPE_ABSENT = 1; - public static final int TYPE_ABSENT_EXCUSED = 2; - public static final int TYPE_RELEASED = 3; - public static final int TYPE_BELATED = 4; - public static final int TYPE_BELATED_EXCUSED = 5; - public static final int TYPE_CUSTOM = 6; - public static final int TYPE_DAY_FREE = 7; - @ColumnInfo(name = "attendanceType") - public int type = TYPE_PRESENT; - - public long teacherId; - public long subjectId; - - @Ignore - public Attendance() { - this(-1, -1, -1, -1, 0, "", Date.getToday(), Time.getNow(), TYPE_PRESENT); - } - - public Attendance(int profileId, long id, long teacherId, long subjectId, int semester, String lessonTopic, Date lessonDate, Time startTime, int type) { - this.profileId = profileId; - this.id = id; - this.teacherId = teacherId; - this.subjectId = subjectId; - this.semester = semester; - this.lessonTopic = lessonTopic; - this.lessonDate = lessonDate; - this.startTime = startTime; - this.type = type; - } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Attendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Attendance.kt new file mode 100644 index 00000000..af165b07 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Attendance.kt @@ -0,0 +1,68 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-24. + */ +package pl.szczodrzynski.edziennik.data.db.entity + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Ignore +import androidx.room.Index +import pl.szczodrzynski.edziennik.utils.models.Date +import pl.szczodrzynski.edziennik.utils.models.Time + +@Entity(tableName = "attendances", + primaryKeys = ["profileId", "attendanceId"], + indices = [ + Index(value = ["profileId"]) + ]) +open class Attendance( + val profileId: Int, + @ColumnInfo(name = "attendanceId") + var id: Long, + /** Base type ID used to count attendance stats */ + @ColumnInfo(name = "attendanceBaseType") + var baseType: Int, + /** A full type name coming from the e-register */ + @ColumnInfo(name = "attendanceTypeName") + var typeName: String, + /** A short name to display by default, might be different for non-standard types */ + @ColumnInfo(name = "attendanceTypeShort") + val typeShort: String, + /** A short name that the e-register would display */ + @ColumnInfo(name = "attendanceTypeSymbol") + var typeSymbol: String, + /** A color that the e-register would display, null falls back to app's default */ + @ColumnInfo(name = "attendanceTypeColor") + var typeColor: Int?, + + @ColumnInfo(name = "attendanceDate") + var date: Date, + @ColumnInfo(name = "attendanceTime") + var startTime: Time?, + @ColumnInfo(name = "attendanceSemester") + var semester: Int, + + var teacherId: Long, + var subjectId: Long, + var addedDate: Long = System.currentTimeMillis() +) : Keepable() { + companion object { + const val TYPE_UNKNOWN = -1 + const val TYPE_PRESENT = 0 + const val TYPE_PRESENT_CUSTOM = 10 // count as presence AND show in the list + const val TYPE_ABSENT = 1 + const val TYPE_ABSENT_EXCUSED = 2 + const val TYPE_RELEASED = 3 + const val TYPE_BELATED = 4 + const val TYPE_BELATED_EXCUSED = 5 + const val TYPE_DAY_FREE = 6 + } + + @ColumnInfo(name = "attendanceLessonTopic") + var lessonTopic: String? = null + @ColumnInfo(name = "attendanceLessonNumber") + var lessonNumber: Int? = null + + @Ignore + var showAsUnseen = false +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/AttendanceType.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/AttendanceType.kt index 0e3e86f9..f70c7bc6 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/AttendanceType.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/AttendanceType.kt @@ -9,15 +9,16 @@ import androidx.room.Entity @Entity(tableName = "attendanceTypes", primaryKeys = ["profileId", "id"]) data class AttendanceType ( - val profileId: Int, - val id: Long, - - val name: String, - - val type: Int, - - val color: Int - + /** Base type ID used to count attendance stats */ + val baseType: Int, + /** A full type name coming from the e-register */ + val typeName: String, + /** A short name to display by default, might be different for non-standard types */ + val typeShort: String, + /** A short name that the e-register would display */ + val typeSymbol: String, + /** A color that the e-register would display, null falls back to app's default */ + val typeColor: Int? ) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Event.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Event.kt index b811ff61..9d13e883 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Event.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Event.kt @@ -41,7 +41,8 @@ open class Event( var teacherId: Long, var subjectId: Long, - var teamId: Long + var teamId: Long, + var addedDate: Long = System.currentTimeMillis() ) : Keepable() { companion object { const val TYPE_UNDEFINED = -2L diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Grade.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Grade.kt index 393ab332..5bf3bd86 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Grade.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Grade.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 + * Copyright (c) Kuba Szczodrzyński 2020-4-24. */ package pl.szczodrzynski.edziennik.data.db.entity @@ -8,23 +8,11 @@ import androidx.room.Entity import androidx.room.Ignore import androidx.room.Index -/*public Grade(int profileId, long id, String category, int color, String description, String name, float value, float weight, int semester, long teacherId, long subjectId) { - this.profileId = profileId; - this.id = id; - this.category = category; - this.color = color; - this.description = description; - this.name = name; - this.value = value; - this.weight = weight; - this.semester = semester; - this.teacherId = teacherId; - this.subjectId = subjectId; - }*/ - @Entity(tableName = "grades", primaryKeys = ["profileId", "gradeId"], - indices = [Index(value = ["profileId"])]) + indices = [ + Index(value = ["profileId"]) + ]) open class Grade( val profileId: Int, @ColumnInfo(name = "gradeId") @@ -40,6 +28,7 @@ open class Grade( var weight: Float, @ColumnInfo(name = "gradeColor") var color: Int, + @ColumnInfo(name = "gradeCategory") var category: String?, @ColumnInfo(name = "gradeDescription") @@ -50,8 +39,9 @@ open class Grade( @ColumnInfo(name = "gradeSemester") val semester: Int, val teacherId: Long, - val subjectId: Long -) { + val subjectId: Long, + var addedDate: Long = System.currentTimeMillis() +) : Keepable() { companion object { const val TYPE_NORMAL = 0 const val TYPE_SEMESTER1_PROPOSED = 1 diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Lesson.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Lesson.kt index ceb6cf9c..0c97ba24 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Lesson.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Lesson.kt @@ -1,7 +1,6 @@ /* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 + * Copyright (c) Kuba Szczodrzyński 2020-4-25. */ - package pl.szczodrzynski.edziennik.data.db.entity import androidx.room.Entity @@ -11,12 +10,15 @@ import pl.szczodrzynski.edziennik.utils.models.Date import pl.szczodrzynski.edziennik.utils.models.Time @Entity(tableName = "timetable", + primaryKeys = ["profileId", "id"], indices = [ Index(value = ["profileId", "type", "date"]), Index(value = ["profileId", "type", "oldDate"]) - ], - primaryKeys = ["profileId", "id"]) -open class Lesson(val profileId: Int, var id: Long) { + ]) +open class Lesson( + val profileId: Int, + var id: Long +) : Keepable() { companion object { const val TYPE_NO_LESSONS = -1 const val TYPE_NORMAL = 0 diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/LuckyNumber.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/LuckyNumber.java deleted file mode 100644 index bca49ec5..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/LuckyNumber.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 - */ - -package pl.szczodrzynski.edziennik.data.db.entity; - -import androidx.annotation.NonNull; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.Ignore; - -import pl.szczodrzynski.edziennik.utils.models.Date; - -@Entity(tableName = "luckyNumbers", - primaryKeys = {"profileId", "luckyNumberDate"}) -public class LuckyNumber { - public int profileId; - - @NonNull - @ColumnInfo(name = "luckyNumberDate", typeAffinity = 3) - public Date date; - @ColumnInfo(name = "luckyNumber") - public int number; - - public LuckyNumber(int profileId, @NonNull Date date, int number) { - this.profileId = profileId; - this.date = date; - this.number = number; - } - - @Ignore - public LuckyNumber() { - this.date = Date.getToday(); - } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/LuckyNumber.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/LuckyNumber.kt new file mode 100644 index 00000000..6fb943c9 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/LuckyNumber.kt @@ -0,0 +1,22 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-24. + */ +package pl.szczodrzynski.edziennik.data.db.entity + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Ignore +import pl.szczodrzynski.edziennik.utils.models.Date + +@Entity(tableName = "luckyNumbers", + primaryKeys = ["profileId", "luckyNumberDate"]) +open class LuckyNumber( + val profileId: Int, + @ColumnInfo(name = "luckyNumberDate", typeAffinity = ColumnInfo.INTEGER) + var date: Date, + @ColumnInfo(name = "luckyNumber") + var number: Int +) : Keepable() { + @Ignore + var showAsUnseen = false +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Message.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Message.kt index 1cf9b3ba..98105057 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Message.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Message.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 + * Copyright (c) Kuba Szczodrzyński 2020-4-25. */ package pl.szczodrzynski.edziennik.data.db.entity @@ -30,7 +30,8 @@ open class Message( * Keep in mind that this being null does NOT * necessarily mean the message is sent. */ - var senderId: Long? + var senderId: Long?, + var addedDate: Long = System.currentTimeMillis() ) : Keepable() { companion object { const val TYPE_RECEIVED = 0 diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Metadata.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Metadata.java index 6ea94f4e..7374d915 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Metadata.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Metadata.java @@ -36,7 +36,6 @@ public class Metadata { public boolean seen; public boolean notified; - public long addedDate; @Ignore public Metadata() { @@ -45,13 +44,12 @@ public class Metadata { this.notified = false; } - public Metadata(int profileId, int thingType, long thingId, boolean seen, boolean notified, long addedDate) { + public Metadata(int profileId, int thingType, long thingId, boolean seen, boolean notified) { this.profileId = profileId; this.thingType = thingType; this.thingId = thingId; this.seen = seen; this.notified = notified; - this.addedDate = addedDate; } public String thingType() { @@ -86,7 +84,6 @@ public class Metadata { ", thingId=" + thingId + ", seen=" + seen + ", notified=" + notified + - ", addedDate=" + addedDate + '}'; } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Notice.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Notice.java deleted file mode 100644 index 306e6f92..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Notice.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 - */ - -package pl.szczodrzynski.edziennik.data.db.entity; - -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.Ignore; -import androidx.room.Index; - -@Entity(tableName = "notices", - primaryKeys = {"profileId", "noticeId"}, - indices = {@Index(value = {"profileId"})}) -public class Notice { - public int profileId; - - @ColumnInfo(name = "noticeId") - public long id; - - @ColumnInfo(name = "noticeText") - public String text; - @ColumnInfo(name = "noticeSemester") - public int semester; - public static final int TYPE_NEUTRAL = 0; - public static final int TYPE_POSITIVE = 1; - public static final int TYPE_NEGATIVE = 2; - @ColumnInfo(name = "noticeType") - public int type = TYPE_NEUTRAL; - - public float points = 0; - public String category = null; - - public long teacherId; - - @Ignore - public Notice() {} - - public Notice(int profileId, long id, String text, int semester, int type, long teacherId) { - this.profileId = profileId; - this.id = id; - this.text = text; - this.semester = semester; - this.type = type; - this.teacherId = teacherId; - } -} - - diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Notice.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Notice.kt new file mode 100644 index 00000000..0e1f21fe --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Notice.kt @@ -0,0 +1,43 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-25. + */ +package pl.szczodrzynski.edziennik.data.db.entity + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Ignore +import androidx.room.Index + +@Entity(tableName = "notices", + primaryKeys = ["profileId", "noticeId"], + indices = [ + Index(value = ["profileId"]) + ]) +open class Notice( + val profileId: Int, + @ColumnInfo(name = "noticeId") + var id: Long, + @ColumnInfo(name = "noticeType") + var type: Int, + @ColumnInfo(name = "noticeSemester") + var semester: Int, + + @ColumnInfo(name = "noticeText") + var text: String, + @ColumnInfo(name = "noticeCategory") + var category: String?, + @ColumnInfo(name = "noticePoints") + var points: Float?, + + var teacherId: Long, + var addedDate: Long = System.currentTimeMillis() +) : Keepable() { + companion object { + const val TYPE_NEUTRAL = 0 + const val TYPE_POSITIVE = 1 + const val TYPE_NEGATIVE = 2 + } + + @Ignore + var showAsUnseen = false +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/TeacherAbsence.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/TeacherAbsence.kt index af037851..9ec5f828 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/TeacherAbsence.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/TeacherAbsence.kt @@ -1,37 +1,41 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-25. + */ package pl.szczodrzynski.edziennik.data.db.entity import androidx.room.ColumnInfo import androidx.room.Entity +import androidx.room.Ignore +import androidx.room.Index import pl.szczodrzynski.edziennik.utils.models.Date import pl.szczodrzynski.edziennik.utils.models.Time @Entity(tableName = "teacherAbsence", - primaryKeys = ["profileId", "teacherAbsenceId"]) -open class TeacherAbsence ( + primaryKeys = ["profileId", "teacherAbsenceId"], + indices = [ + Index(value = ["profileId"]) + ]) +open class TeacherAbsence( + val profileId: Int, + @ColumnInfo(name = "teacherAbsenceId") + val id: Long, + @ColumnInfo(name = "teacherAbsenceType") + val type: Long, + @ColumnInfo(name = "teacherAbsenceName") + val name: String?, - val profileId: Int, + @ColumnInfo(name = "teacherAbsenceDateFrom") + val dateFrom: Date, + @ColumnInfo(name = "teacherAbsenceDateTo") + val dateTo: Date, + @ColumnInfo(name = "teacherAbsenceTimeFrom") + val timeFrom: Time?, + @ColumnInfo(name = "teacherAbsenceTimeTo") + val timeTo: Time?, - @ColumnInfo(name = "teacherAbsenceId") - val id: Long, - - val teacherId: Long, - - @ColumnInfo(name = "teacherAbsenceType") - val type: Long, - - @ColumnInfo(name = "teacherAbsenceName") - val name: String?, - - @ColumnInfo(name = "teacherAbsenceDateFrom") - val dateFrom: Date, - - @ColumnInfo(name = "teacherAbsenceDateTo") - val dateTo: Date, - - @ColumnInfo(name = "teacherAbsenceTimeFrom") - val timeFrom: Time?, - - @ColumnInfo(name = "teacherAbsenceTimeTo") - val timeTo: Time? - -) + val teacherId: Long, + var addedDate: Long = System.currentTimeMillis() +) : Keepable() { + @Ignore + var showAsUnseen = false +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AnnouncementFull.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AnnouncementFull.java deleted file mode 100644 index 2811a0c7..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AnnouncementFull.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 - */ - -package pl.szczodrzynski.edziennik.data.db.full; - -import pl.szczodrzynski.edziennik.data.db.entity.Announcement; - -public class AnnouncementFull extends Announcement { - public String teacherFullName = ""; - - // metadata - public boolean seen; - public boolean notified; - public long addedDate; -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AnnouncementFull.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AnnouncementFull.kt new file mode 100644 index 00000000..5b4cb711 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AnnouncementFull.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-25. + */ +package pl.szczodrzynski.edziennik.data.db.full + +import pl.szczodrzynski.edziennik.data.db.entity.Announcement +import pl.szczodrzynski.edziennik.utils.models.Date + +class AnnouncementFull( + profileId: Int, id: Long, + subject: String, text: String?, + startDate: Date?, endDate: Date?, + teacherId: Long, addedDate: Long = System.currentTimeMillis() +) : Announcement( + profileId, id, + subject, text, + startDate, endDate, + teacherId, addedDate +) { + var teacherName: String? = null + + // metadata + var seen = false + var notified = false +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AttendanceFull.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AttendanceFull.java deleted file mode 100644 index 605d06b2..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AttendanceFull.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 - */ - -package pl.szczodrzynski.edziennik.data.db.full; - -import pl.szczodrzynski.edziennik.data.db.entity.Attendance; - -public class AttendanceFull extends Attendance { - public String teacherFullName = ""; - - public String subjectLongName = ""; - public String subjectShortName = ""; - - // metadata - public boolean seen; - public boolean notified; - public long addedDate; -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AttendanceFull.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AttendanceFull.kt new file mode 100644 index 00000000..223ceb38 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/AttendanceFull.kt @@ -0,0 +1,28 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-24. + */ +package pl.szczodrzynski.edziennik.data.db.full + +import pl.szczodrzynski.edziennik.data.db.entity.Attendance +import pl.szczodrzynski.edziennik.utils.models.Date +import pl.szczodrzynski.edziennik.utils.models.Time + +class AttendanceFull( + profileId: Int, id: Long, + baseType: Int, typeName: String, typeShort: String, typeSymbol: String, typeColor: Int?, + date: Date, startTime: Time, semester: Int, + teacherId: Long, subjectId: Long, addedDate: Long = System.currentTimeMillis() +) : Attendance( + profileId, id, + baseType, typeName, typeShort, typeSymbol, typeColor, + date, startTime, semester, + teacherId, subjectId, addedDate +) { + var teacherName: String? = null + var subjectLongName: String? = null + var subjectShortName: String? = null + + // metadata + var seen = false + var notified = false +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/EventFull.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/EventFull.kt index a3dcc2cb..01e85395 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/EventFull.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/EventFull.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 + * Copyright (c) Kuba Szczodrzyński 2020-4-25. */ package pl.szczodrzynski.edziennik.data.db.full @@ -11,16 +11,16 @@ import pl.szczodrzynski.edziennik.utils.models.Time class EventFull( profileId: Int, id: Long, date: Date, time: Time?, topic: String, color: Int?, type: Long, - teacherId: Long, subjectId: Long, teamId: Long + teacherId: Long, subjectId: Long, teamId: Long, addedDate: Long = System.currentTimeMillis() ) : Event( profileId, id, date, time, topic, color, type, - teacherId, subjectId, teamId + teacherId, subjectId, teamId, addedDate ) { constructor(event: Event, metadata: Metadata? = null) : this( event.profileId, event.id, event.date, event.time, event.topic, event.color, event.type, - event.teacherId, event.subjectId, event.teamId) { + event.teacherId, event.subjectId, event.teamId, event.addedDate) { event.let { addedManually = it.addedManually sharedBy = it.sharedBy @@ -33,7 +33,6 @@ class EventFull( metadata?.let { seen = it.seen notified = it.notified - addedDate = it.addedDate } } @@ -45,10 +44,10 @@ class EventFull( var subjectShortName: String? = null var teamName: String? = null var teamCode: String? = null + // metadata var seen = false var notified = false - var addedDate: Long = 0 val eventColor get() = color ?: typeColor ?: 0xff2196f3.toInt() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/GradeFull.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/GradeFull.kt index 8cc80974..f8d90c05 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/GradeFull.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/GradeFull.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 + * Copyright (c) Kuba Szczodrzyński 2020-4-24. */ package pl.szczodrzynski.edziennik.data.db.full @@ -9,18 +9,18 @@ class GradeFull( profileId: Int, id: Long, name: String, type: Int, value: Float, weight: Float, color: Int, category: String?, description: String?, comment: String?, - semester: Int, teacherId: Long, subjectId: Long + semester: Int, teacherId: Long, subjectId: Long, addedDate: Long = System.currentTimeMillis() ) : Grade( profileId, id, name, type, value, weight, color, category, description, comment, - semester, teacherId, subjectId + semester, teacherId, subjectId, addedDate ) { + var teacherName: String? = null var subjectLongName: String? = null var subjectShortName: String? = null - var teacherFullName: String? = null + // metadata var seen = false var notified = false - var addedDate: Long = 0 } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/LessonFull.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/LessonFull.kt index 5661a614..0e9542b6 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/LessonFull.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/LessonFull.kt @@ -1,3 +1,6 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-25. + */ package pl.szczodrzynski.edziennik.data.db.full import android.content.Context @@ -5,7 +8,11 @@ import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.data.db.entity.Lesson import pl.szczodrzynski.edziennik.utils.models.Time -class LessonFull(profileId: Int, id: Long) : Lesson(profileId, id) { +class LessonFull( + profileId: Int, id: Long +) : Lesson( + profileId, id +) { var subjectName: String? = null var teacherName: String? = null var teamName: String? = null @@ -126,5 +133,4 @@ class LessonFull(profileId: Int, id: Long) : Lesson(profileId, id) { // metadata var seen: Boolean = false var notified: Boolean = false - var addedDate: Long = 0 } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/LuckyNumberFull.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/LuckyNumberFull.java deleted file mode 100644 index d73cb95f..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/LuckyNumberFull.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 - */ - -package pl.szczodrzynski.edziennik.data.db.full; - -import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber; - -public class LuckyNumberFull extends LuckyNumber { - // metadata - public boolean seen; - public boolean notified; - public long addedDate; -} - diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/LuckyNumberFull.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/LuckyNumberFull.kt new file mode 100644 index 00000000..bb24724a --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/LuckyNumberFull.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-25. + */ +package pl.szczodrzynski.edziennik.data.db.full + +import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber +import pl.szczodrzynski.edziennik.utils.models.Date + +class LuckyNumberFull( + profileId: Int, date: Date, + number: Int +) : LuckyNumber( + profileId, date, + number +) { + // metadata + var seen = false + var notified = false +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/MessageFull.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/MessageFull.kt index 5b873b7a..3fdcdd0d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/MessageFull.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/MessageFull.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 + * Copyright (c) Kuba Szczodrzyński 2020-4-25. */ package pl.szczodrzynski.edziennik.data.db.full @@ -10,10 +10,12 @@ import pl.szczodrzynski.edziennik.data.db.entity.MessageRecipient class MessageFull( profileId: Int, id: Long, type: Int, - subject: String, body: String?, senderId: Long? + subject: String, body: String?, senderId: Long?, + addedDate: Long = System.currentTimeMillis() ) : Message( profileId, id, type, - subject, body, senderId + subject, body, senderId, + addedDate ) { var senderName: String? = null @Relation(parentColumn = "messageId", entityColumn = "messageId", entity = MessageRecipient::class) @@ -33,5 +35,4 @@ class MessageFull( // metadata var seen = false var notified = false - var addedDate: Long = 0 } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/NoticeFull.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/NoticeFull.java deleted file mode 100644 index 372650fd..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/NoticeFull.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2020-1-6 - */ - -package pl.szczodrzynski.edziennik.data.db.full; - -import pl.szczodrzynski.edziennik.data.db.entity.Notice; - -public class NoticeFull extends Notice { - public String teacherFullName = ""; - - // metadata - public boolean seen; - public boolean notified; - public long addedDate; -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/NoticeFull.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/NoticeFull.kt new file mode 100644 index 00000000..25aee14d --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/NoticeFull.kt @@ -0,0 +1,22 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-25. + */ +package pl.szczodrzynski.edziennik.data.db.full + +import pl.szczodrzynski.edziennik.data.db.entity.Notice + +class NoticeFull( + profileId: Int, id: Long, type: Int, semester: Int, + text: String, category: String?, points: Float?, + teacherId: Long, addedDate: Long = System.currentTimeMillis() +) : Notice( + profileId, id, type, semester, + text, category, points, + teacherId, addedDate +) { + var teacherName: String? = null + + // metadata + var seen = false + var notified = false +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/TeacherAbsenceFull.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/TeacherAbsenceFull.kt index e9d53a59..39a88e0f 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/TeacherAbsenceFull.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/full/TeacherAbsenceFull.kt @@ -1,17 +1,24 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-25. + */ package pl.szczodrzynski.edziennik.data.db.full import pl.szczodrzynski.edziennik.data.db.entity.TeacherAbsence import pl.szczodrzynski.edziennik.utils.models.Date import pl.szczodrzynski.edziennik.utils.models.Time -class TeacherAbsenceFull(profileId: Int, id: Long, teacherId: Long, type: Long, name: String?, - dateFrom: Date, dateTo: Date, timeFrom: Time?, timeTo: Time?) - : TeacherAbsence(profileId, id, teacherId, type, name, dateFrom, dateTo, timeFrom, timeTo) { - - var teacherFullName = "" +class TeacherAbsenceFull( + profileId: Int, id: Long, type: Long, name: String?, + dateFrom: Date, dateTo: Date, timeFrom: Time?, timeTo: Time?, + teacherId: Long, addedDate: Long = System.currentTimeMillis() +) : TeacherAbsence( + profileId, id, type, name, + dateFrom, dateTo, timeFrom, timeTo, + teacherId, addedDate +) { + var teacherName: String? = null // metadata var seen: Boolean = false var notified: Boolean = false - var addedDate: Long = 0 } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/migration/Migration86.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/migration/Migration86.kt new file mode 100644 index 00000000..6d505edf --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/migration/Migration86.kt @@ -0,0 +1,176 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-29. + */ + +package pl.szczodrzynski.edziennik.data.db.migration + +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase + +class Migration86 : Migration(85, 86) { + override fun migrate(database: SupportSQLiteDatabase) { + // Migrating some models, moving addedDate from metadata to entities + + // Announcements + database.execSQL("""ALTER TABLE announcements RENAME TO _announcements""") + database.execSQL("""CREATE TABLE `announcements` ( + `announcementIdString` TEXT, + `profileId` INTEGER NOT NULL, + `announcementId` INTEGER NOT NULL, + `announcementSubject` TEXT NOT NULL, + `announcementText` TEXT, + `announcementStartDate` TEXT, + `announcementEndDate` TEXT, + `teacherId` INTEGER NOT NULL, + `addedDate` INTEGER NOT NULL, + `keep` INTEGER NOT NULL, + PRIMARY KEY(`profileId`, `announcementId`) + )""") + database.execSQL("""DROP INDEX IF EXISTS index_announcements_profileId""") + database.execSQL("""CREATE INDEX `index_announcements_profileId` ON `announcements` (`profileId`)""") + database.execSQL("""REPLACE INTO announcements ( + announcementIdString, profileId, announcementId, announcementSubject, announcementText, announcementStartDate, announcementEndDate, teacherId, addedDate, keep + ) SELECT + announcementIdString, profileId, announcementId, IFNULL(announcementSubject, ""), announcementText, announcementStartDate, announcementEndDate, teacherId, 0, 1 + FROM _announcements""") + database.execSQL("""DROP TABLE _announcements""") + + // Attendance Types + database.execSQL("""ALTER TABLE attendanceTypes RENAME TO _attendanceTypes""") + database.execSQL("""CREATE TABLE `attendanceTypes` ( + `profileId` INTEGER NOT NULL, + `id` INTEGER NOT NULL, + `baseType` INTEGER NOT NULL, + `typeName` TEXT NOT NULL, + `typeShort` TEXT NOT NULL, + `typeSymbol` TEXT NOT NULL, + `typeColor` INTEGER, + PRIMARY KEY(`profileId`, `id`) + )""") + database.execSQL("""REPLACE INTO attendanceTypes ( + profileId, id, + baseType, + typeName, + typeShort, + typeSymbol, + typeColor + ) SELECT + profileId, id, + CASE WHEN id > 100 AND type = 0 THEN 10 ELSE type END, + name, + CASE type WHEN 0 THEN "ob" WHEN 1 THEN "nb" WHEN 2 THEN "u" WHEN 3 THEN "zw" WHEN 4 THEN "sp" WHEN 5 THEN "su" WHEN 6 THEN "w" ELSE "?" END, + CASE type WHEN 0 THEN "ob" WHEN 1 THEN "nb" WHEN 2 THEN "u" WHEN 3 THEN "zw" WHEN 4 THEN "sp" WHEN 5 THEN "su" WHEN 6 THEN "w" ELSE "?" END, + CASE color WHEN -1 THEN NULL ELSE color END + FROM _attendanceTypes""") + database.execSQL("""DROP TABLE _attendanceTypes""") + + // Attendance + database.execSQL("""ALTER TABLE attendances RENAME TO _attendances""") + database.execSQL("""CREATE TABLE `attendances` ( + `attendanceLessonTopic` TEXT, + `attendanceLessonNumber` INTEGER, + `profileId` INTEGER NOT NULL, + `attendanceId` INTEGER NOT NULL, + `attendanceBaseType` INTEGER NOT NULL, + `attendanceTypeName` TEXT NOT NULL, + `attendanceTypeShort` TEXT NOT NULL, + `attendanceTypeSymbol` TEXT NOT NULL, + `attendanceTypeColor` INTEGER, + `attendanceDate` TEXT NOT NULL, + `attendanceTime` TEXT, + `attendanceSemester` INTEGER NOT NULL, + `teacherId` INTEGER NOT NULL, + `subjectId` INTEGER NOT NULL, + `addedDate` INTEGER NOT NULL, + `keep` INTEGER NOT NULL, + PRIMARY KEY(`profileId`, `attendanceId`) + )""") + database.execSQL("""DROP INDEX IF EXISTS index_attendances_profileId""") + database.execSQL("""CREATE INDEX `index_attendances_profileId` ON `attendances` (`profileId`)""") + database.execSQL("""REPLACE INTO attendances ( + attendanceLessonTopic, attendanceLessonNumber, profileId, attendanceId, + attendanceBaseType, + attendanceTypeName, + attendanceTypeShort, + attendanceTypeSymbol, + attendanceTypeColor, attendanceDate, attendanceTime, attendanceSemester, teacherId, subjectId, addedDate, keep + ) SELECT + attendanceLessonTopic, NULL, profileId, attendanceId, + attendanceType, + CASE attendanceType WHEN 0 THEN "ob" WHEN 1 THEN "nb" WHEN 2 THEN "u" WHEN 3 THEN "zw" WHEN 4 THEN "sp" WHEN 5 THEN "su" WHEN 6 THEN "w" ELSE "?" END, + CASE attendanceType WHEN 0 THEN "ob" WHEN 1 THEN "nb" WHEN 2 THEN "u" WHEN 3 THEN "zw" WHEN 4 THEN "sp" WHEN 5 THEN "su" WHEN 6 THEN "w" ELSE "?" END, + CASE attendanceType WHEN 0 THEN "ob" WHEN 1 THEN "nb" WHEN 2 THEN "u" WHEN 3 THEN "zw" WHEN 4 THEN "sp" WHEN 5 THEN "su" WHEN 6 THEN "w" ELSE "?" END, + NULL, attendanceLessonDate, attendanceStartTime, attendanceSemester, teacherId, subjectId, 0, 1 + FROM _attendances""") + database.execSQL("""DROP TABLE _attendances""") + + // Events + database.execSQL("""ALTER TABLE events ADD COLUMN addedDate INTEGER NOT NULL DEFAULT 0""") + + // Grades + database.execSQL("""ALTER TABLE grades ADD COLUMN addedDate INTEGER NOT NULL DEFAULT 0""") + database.execSQL("""ALTER TABLE grades ADD COLUMN keep INTEGER NOT NULL DEFAULT 1""") + + // Lucky Numbers + database.execSQL("""ALTER TABLE luckyNumbers ADD COLUMN keep INTEGER NOT NULL DEFAULT 1""") + + // Messages + database.execSQL("""ALTER TABLE messages ADD COLUMN addedDate INTEGER NOT NULL DEFAULT 0""") + + // Notices + database.execSQL("""ALTER TABLE notices RENAME TO _notices""") + database.execSQL("""CREATE TABLE `notices` ( + `profileId` INTEGER NOT NULL, + `noticeId` INTEGER NOT NULL, + `noticeType` INTEGER NOT NULL, + `noticeSemester` INTEGER NOT NULL, + `noticeText` TEXT NOT NULL, + `noticeCategory` TEXT, + `noticePoints` REAL, + `teacherId` INTEGER NOT NULL, + `addedDate` INTEGER NOT NULL, + `keep` INTEGER NOT NULL, + PRIMARY KEY(`profileId`, `noticeId`) + )""") + database.execSQL("""DROP INDEX IF EXISTS index_notices_profileId""") + database.execSQL("""CREATE INDEX `index_notices_profileId` ON `notices` (`profileId`)""") + database.execSQL("""REPLACE INTO notices ( + profileId, noticeId, noticeType, noticeSemester, + noticeText, + noticeCategory, + noticePoints, + teacherId, addedDate, keep + ) SELECT + profileId, noticeId, noticeType, noticeSemester, + CASE noticeText WHEN NULL THEN "" ELSE noticeText END, + category, + CASE points WHEN 0 THEN NULL ELSE points END, + teacherId, 0, 1 + FROM _notices""") + database.execSQL("""DROP TABLE _notices""") + + // Teacher Absence + database.execSQL("""ALTER TABLE teacherAbsence ADD COLUMN addedDate INTEGER NOT NULL DEFAULT 0""") + database.execSQL("""ALTER TABLE teacherAbsence ADD COLUMN keep INTEGER NOT NULL DEFAULT 1""") + database.execSQL("""CREATE INDEX IF NOT EXISTS `index_teacherAbsence_profileId` ON `teacherAbsence` (`profileId`)""") + + // Timetable + database.execSQL("""ALTER TABLE timetable ADD COLUMN keep INTEGER NOT NULL DEFAULT 1""") + + // Metadata - copy AddedDate to entities + database.execSQL("""UPDATE grades SET addedDate = IFNULL((SELECT metadata.addedDate FROM metadata WHERE metadata.profileId = grades.profileId AND metadata.thingId = grades.gradeId AND metadata.thingType = 1), 0)""") + database.execSQL("""UPDATE notices SET addedDate = IFNULL((SELECT metadata.addedDate FROM metadata WHERE metadata.profileId = notices.profileId AND metadata.thingId = notices.noticeId AND metadata.thingType = 2), 0)""") + database.execSQL("""UPDATE attendances SET addedDate = IFNULL((SELECT metadata.addedDate FROM metadata WHERE metadata.profileId = attendances.profileId AND metadata.thingId = attendances.attendanceId AND metadata.thingType = 3), 0)""") + database.execSQL("""UPDATE events SET addedDate = IFNULL((SELECT metadata.addedDate FROM metadata WHERE metadata.profileId = events.profileId AND metadata.thingId = events.eventId AND metadata.thingType = 4), 0)""") + database.execSQL("""UPDATE announcements SET addedDate = IFNULL((SELECT metadata.addedDate FROM metadata WHERE metadata.profileId = announcements.profileId AND metadata.thingId = announcements.announcementId AND metadata.thingType = 7), 0)""") + database.execSQL("""UPDATE messages SET addedDate = IFNULL((SELECT metadata.addedDate FROM metadata WHERE metadata.profileId = messages.profileId AND metadata.thingId = messages.messageId AND metadata.thingType = 8), 0)""") + + // Metadata - drop AddedDate column + database.execSQL("""ALTER TABLE metadata RENAME TO _metadata""") + database.execSQL("""CREATE TABLE metadata (profileId INTEGER NOT NULL, metadataId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, thingType INTEGER NOT NULL, thingId INTEGER NOT NULL, seen INTEGER NOT NULL, notified INTEGER NOT NULL)""") + database.execSQL("""DROP INDEX IF EXISTS index_metadata_profileId_thingType_thingId""") + database.execSQL("""CREATE UNIQUE INDEX index_metadata_profileId_thingType_thingId ON "metadata" (profileId, thingType, thingId)""") + database.execSQL("""INSERT INTO metadata (profileId, metadataId, thingType, thingId, seen, notified) SELECT profileId, metadataId, thingType, thingId, seen, notified FROM _metadata""") + database.execSQL("""DROP TABLE _metadata""") + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyAppFirebase.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyAppFirebase.kt index c394c7cc..2ebb8c66 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyAppFirebase.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyAppFirebase.kt @@ -114,7 +114,8 @@ class SzkolnyAppFirebase(val app: App, val profiles: List, val message: type = json.getLong("type") ?: 0, teacherId = json.getLong("teacherId") ?: -1, subjectId = json.getLong("subjectId") ?: -1, - teamId = team.id + teamId = team.id, + addedDate = json.getLong("addedDate") ?: System.currentTimeMillis() ) if (event.color == -1) event.color = null @@ -128,8 +129,7 @@ class SzkolnyAppFirebase(val app: App, val profiles: List, val message: if (event.type == Event.TYPE_HOMEWORK) Metadata.TYPE_HOMEWORK else Metadata.TYPE_EVENT, event.id, false, - true, - json.getLong("addedDate") ?: System.currentTimeMillis() + true ) val type = if (event.type == Event.TYPE_HOMEWORK) Notification.TYPE_NEW_SHARED_HOMEWORK else Notification.TYPE_NEW_SHARED_EVENT @@ -144,7 +144,7 @@ class SzkolnyAppFirebase(val app: App, val profiles: List, val message: profileId = profile.id, profileName = profile.name, viewId = if (event.type == Event.TYPE_HOMEWORK) MainActivity.DRAWER_ITEM_HOMEWORK else MainActivity.DRAWER_ITEM_AGENDA, - addedDate = metadata.addedDate + addedDate = event.addedDate ).addExtra("eventId", event.id).addExtra("eventDate", event.date.value.toLong()) notificationList += notification } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt index 63601c76..4116ab83 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/bell/BellSyncTimeChooseDialog.kt @@ -100,7 +100,7 @@ class BellSyncTimeChooseDialog( private fun loadTimeList() { launch { val timeItems = withContext(Dispatchers.Default) { - val lessons = app.db.timetableDao().getForDateNow(App.profileId, today) + val lessons = app.db.timetableDao().getAllForDateNow(App.profileId, today) val items = mutableListOf() lessons.forEach { 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 index 03cc4879..c6a7b2f9 100644 --- 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 @@ -86,7 +86,7 @@ class DayDialog( ) val lessons = withContext(Dispatchers.Default) { - app.db.timetableDao().getForDateNow(profileId, date) + app.db.timetableDao().getAllForDateNow(profileId, date) }.filter { it.type != Lesson.TYPE_NO_LESSONS } if (lessons.isNotEmpty()) { run { 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 d6d175d9..06b5f1a6 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 @@ -484,7 +484,8 @@ class EventManualDialog( type = type ?: Event.TYPE_DEFAULT, teacherId = teacherId ?: -1, subjectId = subjectId ?: -1, - teamId = teamId ?: -1 + teamId = teamId ?: -1, + addedDate = editingEvent?.addedDate ?: System.currentTimeMillis() ).also { it.addedManually = true } @@ -497,8 +498,7 @@ class EventManualDialog( }, eventObject.id, true, - true, - editingEvent?.addedDate ?: System.currentTimeMillis() + true ) launch { @@ -536,10 +536,9 @@ class EventManualDialog( eventObject.apply { sharedBy = profile?.userCode sharedByName = profile?.studentNameLong + addedDate = System.currentTimeMillis() } - metadataObject.addedDate = System.currentTimeMillis() - api.runCatching(activity) { shareEvent(eventObject.withMetadata(metadataObject)) } ?: run { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/grade/GradeDetailsDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/grade/GradeDetailsDialog.kt index 0e063758..20f3ad21 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/grade/GradeDetailsDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/grade/GradeDetailsDialog.kt @@ -71,7 +71,7 @@ class GradeDetailsDialog( launch { val historyList = withContext(Dispatchers.Default) { - app.db.gradeDao().getAllWithParentIdNow(App.profileId, grade.id) + app.db.gradeDao().getByParentIdNow(App.profileId, grade.id) } if (historyList.isEmpty()) { b.historyVisible = false diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceAdapter.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceAdapter.kt index d8c11307..443d4734 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceAdapter.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceAdapter.kt @@ -29,7 +29,7 @@ class TeacherAbsenceAdapter( override fun onBindViewHolder(holder: ViewHolder, position: Int) { val teacherAbsence: TeacherAbsenceFull = teacherAbsenceList[position] - holder.teacherAbsenceTeacher.text = teacherAbsence.teacherFullName + holder.teacherAbsenceTeacher.text = teacherAbsence.teacherName val time = when (teacherAbsence.timeFrom != null && teacherAbsence.timeTo != null) { true -> when (teacherAbsence.dateFrom.compareTo(teacherAbsence.dateTo)) { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceDialog.kt index 836197f0..7ffab515 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceDialog.kt @@ -46,7 +46,7 @@ class TeacherAbsenceDialog( b.teacherAbsenceView.setHasFixedSize(true) b.teacherAbsenceView.layoutManager = LinearLayoutManager(activity) - app.db.teacherAbsenceDao().getAllByDateFull(profileId, date).observe(activity as LifecycleOwner, Observer { absenceList -> + app.db.teacherAbsenceDao().getAllByDate(profileId, date).observe(activity as LifecycleOwner, Observer { absenceList -> val adapter = TeacherAbsenceAdapter(activity, date, absenceList) b.teacherAbsenceView.adapter = adapter b.teacherAbsenceView.visibility = View.VISIBLE diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.kt index 9ee93be9..ec212cea 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.kt @@ -144,7 +144,7 @@ class AgendaFragment : Fragment(), CoroutineScope { if (!isAdded) return@launch - val lessons = withContext(Dispatchers.Default) { app.db.timetableDao().getAllChangesNow(app.profileId) } + val lessons = withContext(Dispatchers.Default) { app.db.timetableDao().getChangesNow(app.profileId) } val lessonChangeCounters = mutableListOf() lessons.forEach { lesson -> @@ -180,7 +180,7 @@ class AgendaFragment : Fragment(), CoroutineScope { val showTeacherAbsences = app.profile.getStudentData("showTeacherAbsences", true) if (showTeacherAbsences) { - val teacherAbsenceList = withContext(Dispatchers.Default) { app.db.teacherAbsenceDao().getAllFullNow(app.profileId) } + val teacherAbsenceList = withContext(Dispatchers.Default) { app.db.teacherAbsenceDao().getAllNow(app.profileId) } val teacherAbsenceCounters = mutableListOf() teacherAbsenceList.forEach { absence -> diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/announcements/AnnouncementsAdapter.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/announcements/AnnouncementsAdapter.java index 7f9b600d..ee88da07 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/announcements/AnnouncementsAdapter.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/announcements/AnnouncementsAdapter.java @@ -59,17 +59,20 @@ public class AnnouncementsAdapter extends RecyclerView.Adapter { - if (announcement.text == null || (app.getProfile().getLoginStoreType() == LOGIN_TYPE_LIBRUS && !announcement.seen && app.getNetworkUtils().isOnline())) { + if (announcement.getText() == null || (app.getProfile().getLoginStoreType() == LOGIN_TYPE_LIBRUS && !announcement.getSeen() && app.getNetworkUtils().isOnline())) { EdziennikTask.Companion.announcementGet(App.Companion.getProfileId(), announcement).enqueue(requireContext()); } else { showAnnouncementDetailsDialog(announcement); @@ -162,14 +162,14 @@ public class AnnouncementsFragment extends Fragment { private void showAnnouncementDetailsDialog(AnnouncementFull announcement) { MaterialDialog dialog = new MaterialDialog.Builder(activity) - .title(announcement.subject) + .title(announcement.getSubject()) .customView(R.layout.dialog_announcement, true) .positiveText(R.string.ok) .show(); DialogAnnouncementBinding b = DialogAnnouncementBinding.bind(dialog.getCustomView()); - b.text.setText(announcement.teacherFullName+"\n\n"+ (announcement.startDate != null ? announcement.startDate.getFormattedString() : "-") + (announcement.endDate != null ? " do " + announcement.endDate.getFormattedString() : "")+"\n\n" +announcement.text); - if (!announcement.seen && app.getProfile().getLoginStoreType() != LOGIN_TYPE_LIBRUS) { - announcement.seen = true; + b.text.setText(announcement.getTeacherName() +"\n\n"+ (announcement.getStartDate() != null ? announcement.getStartDate().getFormattedString() : "-") + (announcement.getEndDate() != null ? " do " + announcement.getEndDate().getFormattedString() : "")+"\n\n" +announcement.getText()); + if (!announcement.getSeen() && app.getProfile().getLoginStoreType() != LOGIN_TYPE_LIBRUS) { + announcement.setSeen(true); AsyncTask.execute(() -> App.db.metadataDao().setSeen(App.Companion.getProfileId(), announcement, true)); if (recyclerView.getAdapter() != null) recyclerView.getAdapter().notifyDataSetChanged(); diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/attendance/AttendanceAdapter.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/attendance/AttendanceAdapter.java index 7b057395..3b7fa0e9 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/attendance/AttendanceAdapter.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/attendance/AttendanceAdapter.java @@ -51,13 +51,13 @@ public class AttendanceAdapter extends RecyclerView.Adapter { App.db.metadataDao().setSeen(App.Companion.getProfileId(), attendance, true); //Intent i = new Intent("android.intent.action.MAIN").putExtra(MainActivity.ACTION_UPDATE_BADGES, "yes, sure"); diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/attendance/AttendanceFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/attendance/AttendanceFragment.java index 2b5317a6..2b6d3332 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/attendance/AttendanceFragment.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/attendance/AttendanceFragment.java @@ -217,21 +217,21 @@ public class AttendanceFragment extends Fragment { subjectTotalCount = new LongSparseArray<>(); subjectAbsentCount = new LongSparseArray<>(); for (AttendanceFull attendance: attendanceList) { - if (app.getProfile().getLoginStoreType() == LOGIN_TYPE_VULCAN && attendance.type == TYPE_RELEASED) + if (app.getProfile().getLoginStoreType() == LOGIN_TYPE_VULCAN && attendance.getBaseType() == TYPE_RELEASED) continue; - int[] subjectTotal = subjectTotalCount.get(attendance.subjectId, new int[3]); - int[] subjectAbsent = subjectAbsentCount.get(attendance.subjectId, new int[3]); + int[] subjectTotal = subjectTotalCount.get(attendance.getSubjectId(), new int[3]); + int[] subjectAbsent = subjectAbsentCount.get(attendance.getSubjectId(), new int[3]); subjectTotal[0]++; - subjectTotal[attendance.semester]++; + subjectTotal[attendance.getSemester()]++; - if (attendance.type == TYPE_ABSENT || attendance.type == TYPE_ABSENT_EXCUSED) { + if (attendance.getBaseType() == TYPE_ABSENT || attendance.getBaseType() == TYPE_ABSENT_EXCUSED) { subjectAbsent[0]++; - subjectAbsent[attendance.semester]++; + subjectAbsent[attendance.getSemester()]++; } - subjectTotalCount.put(attendance.subjectId, subjectTotal); - subjectAbsentCount.put(attendance.subjectId, subjectAbsent); + subjectTotalCount.put(attendance.getSubjectId(), subjectTotal); + subjectAbsentCount.put(attendance.getSubjectId(), subjectAbsent); } } @@ -247,13 +247,13 @@ public class AttendanceFragment extends Fragment { List filteredList = new ArrayList<>(); for (AttendanceFull attendance: attendanceList) { - if (displayMode != MODE_YEAR && attendance.semester != displayMode) + if (displayMode != MODE_YEAR && attendance.getSemester() != displayMode) continue; - if (subjectIdFilter != -1 && attendance.subjectId != subjectIdFilter) + if (subjectIdFilter != -1 && attendance.getSubjectId() != subjectIdFilter) continue; - if (attendance.type != TYPE_PRESENT) + if (attendance.getBaseType() != TYPE_PRESENT) filteredList.add(attendance); - switch (attendance.type) { + switch (attendance.getBaseType()) { case TYPE_PRESENT: presentCount++; break; diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/behaviour/BehaviourFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/behaviour/BehaviourFragment.java index 4ec8b4c6..d0b46f4a 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/behaviour/BehaviourFragment.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/behaviour/BehaviourFragment.java @@ -134,10 +134,10 @@ public class BehaviourFragment extends Fragment { List filteredList = new ArrayList<>(); for (NoticeFull notice: noticeList) { - if (displayMode != MODE_YEAR && notice.semester != displayMode) + if (displayMode != MODE_YEAR && notice.getSemester() != displayMode) continue; filteredList.add(notice); - switch (notice.type) { + switch (notice.getType()) { case Notice.TYPE_POSITIVE: praisesCount++; break; diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/behaviour/NoticesAdapter.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/behaviour/NoticesAdapter.kt index b1b85780..f495d61e 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/behaviour/NoticesAdapter.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/behaviour/NoticesAdapter.kt @@ -41,10 +41,10 @@ class NoticesAdapter//getting the context and product list with constructor if (app.profile.loginStoreType == LOGIN_TYPE_MOBIDZIENNIK && false) { holder.noticesItemReason.text = bs(null, notice.category, "\n") + notice.text - holder.noticesItemTeacherName.text = app.getString(R.string.notices_points_format, notice.teacherFullName, if (notice.points > 0) "+" + notice.points else notice.points) + holder.noticesItemTeacherName.text = app.getString(R.string.notices_points_format, notice.teacherName, if (notice.points ?: 0f > 0) "+" + notice.points else notice.points) } else { holder.noticesItemReason.text = notice.text - holder.noticesItemTeacherName.text = notice.teacherFullName + holder.noticesItemTeacherName.text = notice.teacherName } holder.noticesItemAddedDate.text = Date.fromMillis(notice.addedDate).formattedString diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/editor/GradesEditorFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/editor/GradesEditorFragment.kt index 3e5978ee..6520ce54 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/editor/GradesEditorFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/editor/GradesEditorFragment.kt @@ -206,7 +206,7 @@ class GradesEditorFragment : Fragment() { gradeCountSemester = 0f averageSemester = 0f - app.db.gradeDao().getAllWhere(App.profileId, "subjectId = " + subject.id).observe(this, Observer { grades -> + app.db.gradeDao().getAllBySubject(App.profileId, subject.id).observe(this, Observer { grades -> for (grade in grades) { if (grade.type == Grade.TYPE_NORMAL) { if (grade.weight < 0) { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/viewholder/GradeViewHolder.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/viewholder/GradeViewHolder.kt index e71b7819..2af79ba3 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/viewholder/GradeViewHolder.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/viewholder/GradeViewHolder.kt @@ -52,7 +52,7 @@ class GradeViewHolder( b.gradeWeight.text = weightText b.gradeWeight.isVisible = weightText != null - b.gradeTeacherName.text = grade.teacherFullName + b.gradeTeacherName.text = grade.teacherName b.gradeAddedDate.text = Date.fromMillis(grade.addedDate).let { it.getRelativeString(app, 5) ?: it.formattedStringShort } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/CounterActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/CounterActivity.kt index 36002444..e337f720 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/CounterActivity.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/CounterActivity.kt @@ -51,7 +51,7 @@ class CounterActivity : AppCompatActivity(), CoroutineScope { withContext(Dispatchers.Default) { lessonList.apply { clear() - addAll(app.db.timetableDao().getForDateNow(App.profileId, Date.getToday()) + addAll(app.db.timetableDao().getAllForDateNow(App.profileId, Date.getToday()) .filter { it.type != Lesson.TYPE_NO_LESSONS && it.type != Lesson.TYPE_CANCELLED && it.type != Lesson.TYPE_SHIFTED_SOURCE diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeGradesCard.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeGradesCard.kt index 0e26eb2c..498beeb6 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeGradesCard.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeGradesCard.kt @@ -35,6 +35,7 @@ import pl.szczodrzynski.edziennik.ui.modules.home.HomeCard import pl.szczodrzynski.edziennik.ui.modules.home.HomeCardAdapter import pl.szczodrzynski.edziennik.ui.modules.home.HomeFragment import pl.szczodrzynski.edziennik.utils.Utils +import pl.szczodrzynski.edziennik.utils.models.Date import pl.szczodrzynski.edziennik.utils.models.ItemGradesSubjectModel import kotlin.coroutines.CoroutineContext @@ -63,7 +64,7 @@ class HomeGradesCard( } holder.root += b.root - val sevenDaysAgo = System.currentTimeMillis() - 7 * 24 * 60 * 60 * 1000 + val sevenDaysAgo = Date.getToday().stepForward(0, 0, -7) app.db.gradeDao().getAllFromDate(profile.id, sevenDaysAgo).observe(fragment, Observer { grades.apply { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeLuckyNumberCard.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeLuckyNumberCard.kt index c5e4aede..31611e48 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeLuckyNumberCard.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeLuckyNumberCard.kt @@ -60,7 +60,7 @@ class HomeLuckyNumberCard( R.string.home_lucky_number_details b.subText.setText(subTextRes, profile.name ?: "", profile.studentNumber) - app.db.luckyNumberDao().getNearestFuture(profile.id, todayValue).observe(fragment, Observer { luckyNumber -> + app.db.luckyNumberDao().getNearestFuture(profile.id, today).observe(fragment, Observer { luckyNumber -> val isYours = luckyNumber?.number == profile.studentNumber val res: Pair> = when { luckyNumber == null -> R.string.home_lucky_number_no_info to emptyArray() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/TimetableDayFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/TimetableDayFragment.kt index 848d0801..e6464d7d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/TimetableDayFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/TimetableDayFragment.kt @@ -105,7 +105,7 @@ class TimetableDayFragment : LazyFragment(), CoroutineScope { override fun onPageCreated(): Boolean { // observe lesson database - app.db.timetableDao().getForDate(App.profileId, date).observe(this, Observer { lessons -> + app.db.timetableDao().getAllForDate(App.profileId, date).observe(this, Observer { lessons -> launch { val events = withContext(Dispatchers.Default) { app.db.eventDao().getAllByDateNow(App.profileId, 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 08eda003..e60f24f8 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 @@ -87,7 +87,7 @@ class TimeDropdown : TextInputDropDown { ) } } else if (displayMode == DISPLAY_LESSONS && lessonsDate != null) { - val lessons = db.timetableDao().getForDateNow(profileId, lessonsDate!!) + val lessons = db.timetableDao().getAllForDateNow(profileId, lessonsDate!!) if (lessons.isEmpty()) { hours += Item( diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/luckynumber/WidgetLuckyNumberProvider.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/luckynumber/WidgetLuckyNumberProvider.kt index 014f5bbe..3dfa12f6 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/luckynumber/WidgetLuckyNumberProvider.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/widgets/luckynumber/WidgetLuckyNumberProvider.kt @@ -48,7 +48,7 @@ class WidgetLuckyNumberProvider : AppWidgetProvider() { val tomorrowValue = tomorrow.value val profile = app.db.profileDao().getByIdNow(config.profileId) - val luckyNumber = app.db.luckyNumberDao().getNearestFutureNow(config.profileId, todayValue) + val luckyNumber = app.db.luckyNumberDao().getNearestFutureNow(config.profileId, today) val isYours = luckyNumber?.number == profile?.studentNumber var noNumberText = false diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/AttendanceManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/AttendanceManager.kt new file mode 100644 index 00000000..953d792c --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/AttendanceManager.kt @@ -0,0 +1,50 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2020-4-28. + */ + +package pl.szczodrzynski.edziennik.utils.managers + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.data.db.entity.Attendance +import pl.szczodrzynski.edziennik.data.db.full.AttendanceFull +import pl.szczodrzynski.edziennik.startCoroutineTimer +import kotlin.coroutines.CoroutineContext + +class AttendanceManager(val app: App) : CoroutineScope { + + private val job = Job() + override val coroutineContext: CoroutineContext + get() = job + Dispatchers.Default + + fun getTypeShort(baseType: Int): String { + return when (baseType) { + Attendance.TYPE_PRESENT -> "ob" + Attendance.TYPE_PRESENT_CUSTOM -> "ob?" + Attendance.TYPE_ABSENT -> "nb" + Attendance.TYPE_ABSENT_EXCUSED -> "u" + Attendance.TYPE_RELEASED -> "zw" + Attendance.TYPE_BELATED -> "sp" + Attendance.TYPE_BELATED_EXCUSED -> "su" + Attendance.TYPE_DAY_FREE -> "w" + else -> "?" + } + } + + /* _ _ _____ _____ _ __ _ + | | | |_ _| / ____| (_)/ _(_) + | | | | | | | (___ _ __ ___ ___ _| |_ _ ___ + | | | | | | \___ \| '_ \ / _ \/ __| | _| |/ __| + | |__| |_| |_ ____) | |_) | __/ (__| | | | | (__ + \____/|_____| |_____/| .__/ \___|\___|_|_| |_|\___| + | | + |*/ + fun markAsSeen(attendance: AttendanceFull) { + attendance.seen = true + startCoroutineTimer(500L, 0L) { + app.db.metadataDao().setSeen(attendance.profileId, attendance, true) + } + } +} diff --git a/app/src/main/res/layout/dialog_grade_details.xml b/app/src/main/res/layout/dialog_grade_details.xml index 7a176c02..92781772 100644 --- a/app/src/main/res/layout/dialog_grade_details.xml +++ b/app/src/main/res/layout/dialog_grade_details.xml @@ -125,7 +125,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="0dp" - android:text="@{grade.teacherFullName}" + android:text="@{grade.teacherName}" android:textIsSelectable="true" tools:text="Janósz Kowalski" />