From 48b7adb56493298c88b2179c5a59b08af2f4dba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 14 Mar 2022 17:05:16 +0100 Subject: [PATCH 1/3] [UI/Grades] Group unknown subjects without specified name. --- .../edziennik/ui/grades/GradesAdapter.kt | 23 ++++++++++---- .../edziennik/ui/grades/GradesListFragment.kt | 30 +++++++++++++++++-- .../ui/grades/models/GradesSemester.kt | 1 + .../ui/grades/models/GradesSubject.kt | 1 + .../ui/grades/models/GradesUnknownSubject.kt | 7 +++++ .../grades/viewholder/SemesterViewHolder.kt | 2 ++ .../ui/grades/viewholder/SubjectViewHolder.kt | 11 ++++--- .../viewholder/UnknownSubjectViewHolder.kt | 29 ++++++++++++++++++ .../edziennik/ui/home/cards/HomeGradesCard.kt | 3 ++ .../layout/grades_item_unknown_subject.xml | 19 ++++++++++++ app/src/main/res/values/strings.xml | 2 ++ 11 files changed, 116 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/models/GradesUnknownSubject.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/UnknownSubjectViewHolder.kt create mode 100644 app/src/main/res/layout/grades_item_unknown_subject.xml diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradesAdapter.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradesAdapter.kt index 6d661c6f..05bb1da0 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradesAdapter.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradesAdapter.kt @@ -36,6 +36,7 @@ class GradesAdapter( private const val ITEM_TYPE_EMPTY = 2 private const val ITEM_TYPE_GRADE = 3 private const val ITEM_TYPE_STATS = 4 + private const val ITEM_TYPE_UNKNOWN_SUBJECT = 5 const val STATE_CLOSED = 0 const val STATE_OPENED = 1 } @@ -58,6 +59,7 @@ class GradesAdapter( ITEM_TYPE_EMPTY -> EmptyViewHolder(inflater, parent) ITEM_TYPE_GRADE -> GradeViewHolder(inflater, parent) ITEM_TYPE_STATS -> StatsViewHolder(inflater, parent) + ITEM_TYPE_UNKNOWN_SUBJECT -> UnknownSubjectViewHolder(inflater, parent) else -> throw IllegalArgumentException("Incorrect viewType") } } @@ -69,6 +71,7 @@ class GradesAdapter( is GradesEmpty -> ITEM_TYPE_EMPTY is Grade -> ITEM_TYPE_GRADE is GradesStats -> ITEM_TYPE_STATS + is GradesUnknownSubject -> ITEM_TYPE_UNKNOWN_SUBJECT else -> throw IllegalArgumentException("Incorrect viewType") } } @@ -86,7 +89,7 @@ class GradesAdapter( fun expandModel(model: ExpandableItemModel<*>?, view: View?, notifyAdapter: Boolean = true) { model ?: return - val position = items.indexOf(model) + var position = items.indexOf(model) if (position == -1) return @@ -138,9 +141,16 @@ class GradesAdapter( else -> model.items } + if (model is GradesSubject && model.isUnknown) { + position++ + items.add(position, GradesUnknownSubject()) + if (notifyAdapter) notifyItemInserted(position) + } + + position++ model.state = STATE_OPENED - items.addAll(position + 1, subItems.filterNotNull()) - if (notifyAdapter) notifyItemRangeInserted(position + 1, subItems.size) + items.addAll(position, subItems.filterNotNull()) + if (notifyAdapter) notifyItemRangeInserted(position, subItems.size) if (model is GradesSubject) { // auto expand first semester @@ -156,9 +166,10 @@ class GradesAdapter( else -> semester.grades } + position++ semester.state = STATE_OPENED - items.addAll(position + 2 + semesterIndex, grades) - if (notifyAdapter) notifyItemRangeInserted(position + 2 + semesterIndex, grades.size) + items.addAll(position + semesterIndex, grades) + if (notifyAdapter) notifyItemRangeInserted(position + semesterIndex, grades.size) } } } @@ -198,6 +209,7 @@ class GradesAdapter( is EmptyViewHolder -> ITEM_TYPE_EMPTY is GradeViewHolder -> ITEM_TYPE_GRADE is StatsViewHolder -> ITEM_TYPE_STATS + is UnknownSubjectViewHolder -> ITEM_TYPE_UNKNOWN_SUBJECT else -> throw IllegalArgumentException("Incorrect viewType") } holder.itemView.setTag(R.string.tag_key_view_type, viewType) @@ -210,6 +222,7 @@ class GradesAdapter( holder is EmptyViewHolder && item is GradesEmpty -> holder.onBind(activity, app, item, position, this) holder is GradeViewHolder && item is GradeFull -> holder.onBind(activity, app, item, position, this) holder is StatsViewHolder && item is GradesStats -> holder.onBind(activity, app, item, position, this) + holder is UnknownSubjectViewHolder && item is GradesUnknownSubject -> holder.onBind(activity, app, item, position, this) } if (holder is SemesterViewHolder && item is GradesSemester) { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradesListFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradesListFragment.kt index c6cf9474..83ecb671 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradesListFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/GradesListFragment.kt @@ -182,6 +182,7 @@ class GradesListFragment : Fragment(), CoroutineScope { @Suppress("SuspendFunctionOnCoroutineScope") private fun processGrades(grades: List): MutableList { val items = mutableListOf() + var unknownSubjectItem: GradesSubject? = null var subjectId = -1L var semesterNumber = 0 @@ -200,17 +201,31 @@ class GradesListFragment : Fragment(), CoroutineScope { subjectId = grade.subjectId semesterNumber = 0 - subject = items.firstOrNull { it.subjectId == subjectId } - ?: GradesSubject(grade.subjectId, grade.subjectLongName ?: "").also { + subject = items.firstOrNull { it.subjectId == subjectId } ?: run { + if (grade.subjectLongName != null) { + return@run GradesSubject(grade.subjectId, grade.subjectLongName!!).also { items += it it.semester = 2 } + } + if (unknownSubjectItem == null) { + unknownSubjectItem = GradesSubject(-1, "unknown").also { + items += it + it.semester = 2 + it.isUnknown = true + } + } + return@run unknownSubjectItem!! + } } if (grade.semester != semesterNumber) { semesterNumber = grade.semester semester = subject.semesters.firstOrNull { it.number == semesterNumber } - ?: GradesSemester(subject.subjectId, grade.semester).also { subject.semesters += it } + ?: GradesSemester(subject.subjectId, grade.semester).also { + subject.semesters += it + it.hideEditor = subject.isUnknown + } } grade.showAsUnseen = !grade.seen @@ -221,6 +236,11 @@ class GradesListFragment : Fragment(), CoroutineScope { semester.hasUnseen = true } + if (subject.isUnknown) { + // unknown subjects may have final grades (i.e. Mobidziennik) + grade.type = Grade.TYPE_NORMAL + } + when (grade.type) { Grade.TYPE_SEMESTER1_PROPOSED, Grade.TYPE_SEMESTER2_PROPOSED -> semester.proposedGrade = grade @@ -255,6 +275,10 @@ class GradesListFragment : Fragment(), CoroutineScope { val yearlyPoint = mutableListOf() for (item in items) { + if (item.isUnknown) { + // do not count averages for "unknown" subjects + continue + } item.semesters.forEach { sem -> manager.calculateAverages(sem.averages) if (sem.number == 1) { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/models/GradesSemester.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/models/GradesSemester.kt index 51f063df..edc3b2ff 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/models/GradesSemester.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/models/GradesSemester.kt @@ -14,6 +14,7 @@ data class GradesSemester( override var level = 2 var hasUnseen = false + var hideEditor = false val averages = GradesAverages() var proposedGrade: GradeFull? = null diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/models/GradesSubject.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/models/GradesSubject.kt index c1495815..59407cb1 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/models/GradesSubject.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/models/GradesSubject.kt @@ -15,6 +15,7 @@ data class GradesSubject( var lastAddedDate = 0L var semester: Int = 1 + var isUnknown = false var hasUnseen: Boolean = false get() = field || semesters.any { it.hasUnseen } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/models/GradesUnknownSubject.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/models/GradesUnknownSubject.kt new file mode 100644 index 00000000..8768ed93 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/models/GradesUnknownSubject.kt @@ -0,0 +1,7 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2022-3-14. + */ + +package pl.szczodrzynski.edziennik.ui.grades.models + +class GradesUnknownSubject diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/SemesterViewHolder.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/SemesterViewHolder.kt index 7f05d78d..895fa699 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/SemesterViewHolder.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/SemesterViewHolder.kt @@ -61,6 +61,8 @@ class SemesterViewHolder( } } + b.editButton.isVisible = !item.hideEditor + b.average.text = manager.getAverageString(app, item.averages) b.proposedGrade.setGrade(item.proposedGrade, manager) b.finalGrade.setGrade(item.finalGrade, manager) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/SubjectViewHolder.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/SubjectViewHolder.kt index eb6cf25e..1033fd65 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/SubjectViewHolder.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/SubjectViewHolder.kt @@ -19,9 +19,7 @@ import androidx.recyclerview.widget.RecyclerView import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.databinding.GradesItemSubjectBinding -import pl.szczodrzynski.edziennik.ext.dp -import pl.szczodrzynski.edziennik.ext.resolveAttr -import pl.szczodrzynski.edziennik.ext.setText +import pl.szczodrzynski.edziennik.ext.* import pl.szczodrzynski.edziennik.ui.grades.GradeView import pl.szczodrzynski.edziennik.ui.grades.GradesAdapter import pl.szczodrzynski.edziennik.ui.grades.GradesAdapter.Companion.STATE_CLOSED @@ -41,7 +39,12 @@ class SubjectViewHolder( val manager = app.gradesManager val contextWrapper = ContextThemeWrapper(activity, Themes.appTheme) - b.subjectName.text = item.subjectName + if (!item.isUnknown) { + b.subjectName.text = item.subjectName + } + else { + b.subjectName.text = R.string.grades_subject_unknown.resolveString(activity).asItalicSpannable() + } b.dropdownIcon.rotation = when (item.state) { STATE_CLOSED -> 0f else -> 180f diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/UnknownSubjectViewHolder.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/UnknownSubjectViewHolder.kt new file mode 100644 index 00000000..04ea1829 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/grades/viewholder/UnknownSubjectViewHolder.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2022-3-14. + */ + +package pl.szczodrzynski.edziennik.ui.grades.viewholder + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.RecyclerView +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.databinding.GradesItemUnknownSubjectBinding +import pl.szczodrzynski.edziennik.ui.grades.GradesAdapter +import pl.szczodrzynski.edziennik.ui.grades.models.GradesUnknownSubject + +class UnknownSubjectViewHolder( + inflater: LayoutInflater, + parent: ViewGroup, + val b: GradesItemUnknownSubjectBinding = GradesItemUnknownSubjectBinding.inflate(inflater, parent, false) +) : RecyclerView.ViewHolder(b.root), BindableViewHolder { + companion object { + private const val TAG = "UnknownSubjectViewHolder" + } + + override fun onBind(activity: AppCompatActivity, app: App, item: GradesUnknownSubject, position: Int, adapter: GradesAdapter) { + + } +} + diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/home/cards/HomeGradesCard.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/home/cards/HomeGradesCard.kt index 0b0386a4..c990b2b8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/home/cards/HomeGradesCard.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/home/cards/HomeGradesCard.kt @@ -85,6 +85,9 @@ class HomeGradesCard( grades.forEach { grade -> val model = ItemGradesSubjectModel.searchModelBySubjectId(subjects, grade.subjectId) ?: run { + if (grade.subjectLongName == null) { + return@forEach + } subjects.add(ItemGradesSubjectModel( profile, Subject(profile.id, grade.subjectId, grade.subjectLongName, grade.subjectShortName), diff --git a/app/src/main/res/layout/grades_item_unknown_subject.xml b/app/src/main/res/layout/grades_item_unknown_subject.xml new file mode 100644 index 00000000..fe7b6938 --- /dev/null +++ b/app/src/main/res/layout/grades_item_unknown_subject.xml @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ba7f7458..aa04fd00 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1549,4 +1549,6 @@ Najnowsze notatki (uczeń) (rodzic) + - nieznany przedmiot - + {cmd-information-outline} Oceny, których przedmiot nie został podany w dzienniku. Może to być na przykład taki, który nie jest prowadzony w tym roku szkolnym. From 2990fc547999fade47fe8b0ddd761b4f72a3e2ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 14 Mar 2022 17:08:35 +0100 Subject: [PATCH 2/3] [Firebase] Disable notifications for past shared events. --- .../szczodrzynski/edziennik/data/firebase/SzkolnyAppFirebase.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c1a6d781..4f90ac67 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 @@ -164,7 +164,7 @@ class SzkolnyAppFirebase(val app: App, val profiles: List, val message: val type = if (event.isHomework) Notification.TYPE_NEW_SHARED_HOMEWORK else Notification.TYPE_NEW_SHARED_EVENT val notificationFilter = app.config.getFor(event.profileId).sync.notificationFilter - if (!notificationFilter.contains(type) && event.sharedBy != "self") { + if (!notificationFilter.contains(type) && event.sharedBy != "self" && event.date >= Date.getToday()) { val notification = Notification( id = Notification.buildId(event.profileId, type, event.id), title = app.getNotificationTitle(type), From 8911ce2bc12d057ba0e1f7ba50ed50870b15dc68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 14 Mar 2022 17:45:11 +0100 Subject: [PATCH 3/3] [4.11.4] Update build.gradle, signing and changelog. --- app/src/main/assets/pl-changelog.html | 4 ++-- app/src/main/cpp/szkolny-signing.cpp | 2 +- .../edziennik/data/api/szkolny/interceptor/Signing.kt | 2 +- build.gradle | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/assets/pl-changelog.html b/app/src/main/assets/pl-changelog.html index 40490597..780a002b 100644 --- a/app/src/main/assets/pl-changelog.html +++ b/app/src/main/assets/pl-changelog.html @@ -1,6 +1,6 @@ -

Wersja 4.11.3, 2022-02-21

+

Wersja 4.11.4, 2022-03-14

    -
  • Naprawiono odświeżanie planu lekcji po pobraniu wybranego tygodnia.
  • +
  • Poprawiono wyświetlanie ocen w przypadku przedmiotów z nieznaną nazwą.


diff --git a/app/src/main/cpp/szkolny-signing.cpp b/app/src/main/cpp/szkolny-signing.cpp index cb7abb6a..2a2cd7b9 100644 --- a/app/src/main/cpp/szkolny-signing.cpp +++ b/app/src/main/cpp/szkolny-signing.cpp @@ -9,7 +9,7 @@ /*secret password - removed for source code publication*/ static toys AES_IV[16] = { - 0x90, 0xe9, 0x2f, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + 0x3d, 0x32, 0x00, 0x89, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; unsigned char *agony(unsigned int laugh, unsigned char *box, unsigned char *heat); diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt index 13c9c762..afe258b4 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt @@ -46,6 +46,6 @@ object Signing { /*fun provideKey(param1: String, param2: Long): ByteArray {*/ fun pleaseStopRightNow(param1: String, param2: Long): ByteArray { - return "$param1.MTIzNDU2Nzg5MDw/KY+My+===.$param2".sha256() + return "$param1.MTIzNDU2Nzg5MDvXV/n0BA===.$param2".sha256() } } diff --git a/build.gradle b/build.gradle index ad977b77..5969c97a 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,8 @@ buildscript { kotlin_version = '1.5.30' release = [ - versionName: "4.11.3", - versionCode: 4110399 + versionName: "4.11.4", + versionCode: 4110499 ] setup = [