From db444d89f0991221dcdf4c79558e07b731cc21b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sat, 1 Feb 2025 23:00:21 +0100 Subject: [PATCH] [UI/Grades] Add config options for university grades --- .../edziennik/config/ProfileConfigGrades.kt | 4 + .../ui/dialogs/settings/GradesConfigDialog.kt | 23 ++++++ .../edziennik/ui/grades/GradesListFragment.kt | 33 ++++++-- .../edziennik/utils/managers/GradesManager.kt | 2 + .../main/res/layout/dialog_config_grades.xml | 80 ++++++++++++++++--- app/src/main/res/values/strings.xml | 5 ++ 6 files changed, 132 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/config/ProfileConfigGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/config/ProfileConfigGrades.kt index cfe4bc3e..99450da7 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/config/ProfileConfigGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/config/ProfileConfigGrades.kt @@ -4,6 +4,7 @@ package pl.szczodrzynski.edziennik.config +import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.UNIVERSITY_AVERAGE_MODE_ECTS import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.COLOR_MODE_WEIGHTED import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_ALL_GRADES @@ -15,8 +16,11 @@ class ProfileConfigGrades(base: ProfileConfig) { var dontCountEnabled by base.config(false) var dontCountGrades by base.config> { listOf() } var hideImproved by base.config(false) + var hideNoGrade by base.config(false) var hideSticksFromOld by base.config(false) var minusValue by base.config(null) var plusValue by base.config(null) var yearAverageMode by base.config(YEAR_ALL_GRADES) + var universityAverageMode by base.config(UNIVERSITY_AVERAGE_MODE_ECTS) + var countEctsInProgress by base.config(false) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/settings/GradesConfigDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/settings/GradesConfigDialog.kt index b1c0c86f..a20c1c26 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/settings/GradesConfigDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/settings/GradesConfigDialog.kt @@ -21,6 +21,8 @@ import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.COLOR_M import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.COLOR_MODE_WEIGHTED import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.ORDER_BY_DATE_DESC import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.ORDER_BY_SUBJECT_ASC +import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.UNIVERSITY_AVERAGE_MODE_ECTS +import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.UNIVERSITY_AVERAGE_MODE_SIMPLE import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_AVG_2_AVG import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_AVG_2_SEM import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_1_SEM_2_AVG @@ -47,6 +49,8 @@ class GradesConfigDialog( @SuppressLint("SetTextI18n") override suspend fun loadConfig() { + b.isUniversity = app.gradesManager.isUniversity + b.customPlusCheckBox.isChecked = app.profile.config.grades.plusValue != null b.customPlusValue.isVisible = b.customPlusCheckBox.isChecked b.customMinusCheckBox.isChecked = app.profile.config.grades.minusValue != null @@ -76,10 +80,18 @@ class GradesConfigDialog( else -> null }?.isChecked = true + when (app.profile.config.grades.universityAverageMode) { + UNIVERSITY_AVERAGE_MODE_ECTS -> b.gradeUniversityAverageMode1 + UNIVERSITY_AVERAGE_MODE_SIMPLE -> b.gradeUniversityAverageMode0 + else -> null + }?.isChecked = true + b.dontCountGrades.isChecked = app.profile.config.grades.dontCountEnabled && app.profile.config.grades.dontCountGrades.isNotEmpty() b.hideImproved.isChecked = app.profile.config.grades.hideImproved + b.hideNoGrade.isChecked = app.profile.config.grades.hideNoGrade b.averageWithoutWeight.isChecked = app.profile.config.grades.averageWithoutWeight + b.countEctsInProgress.isChecked = app.profile.config.grades.countEctsInProgress if (app.profile.config.grades.dontCountGrades.isEmpty()) { b.dontCountGradesText.setText("nb, 0, bz, bd") @@ -149,10 +161,21 @@ class GradesConfigDialog( app.profile.config.grades.yearAverageMode = YEAR_1_SEM_2_SEM } + b.gradeUniversityAverageMode1.setOnSelectedListener { + app.profile.config.grades.universityAverageMode = UNIVERSITY_AVERAGE_MODE_ECTS + } + b.gradeUniversityAverageMode0.setOnSelectedListener { + app.profile.config.grades.universityAverageMode = UNIVERSITY_AVERAGE_MODE_SIMPLE + } + b.hideImproved.onChange { _, isChecked -> app.profile.config.grades.hideImproved = isChecked } + b.hideNoGrade.onChange { _, isChecked -> app.profile.config.grades.hideNoGrade = isChecked } b.averageWithoutWeight.onChange { _, isChecked -> app.profile.config.grades.averageWithoutWeight = isChecked } + b.countEctsInProgress.onChange { _, isChecked -> + app.profile.config.grades.countEctsInProgress = isChecked + } b.averageWithoutWeightHelp.onClick { MaterialAlertDialogBuilder(activity) 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 ff9a843a..80e7a06c 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 @@ -31,6 +31,8 @@ import pl.szczodrzynski.edziennik.ui.grades.models.GradesStats import pl.szczodrzynski.edziennik.ui.grades.models.GradesSubject import pl.szczodrzynski.edziennik.utils.TextInputDropDown import pl.szczodrzynski.edziennik.utils.managers.GradesManager +import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.UNIVERSITY_AVERAGE_MODE_ECTS +import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.UNIVERSITY_AVERAGE_MODE_SIMPLE import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetPrimaryItem import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetSeparatorItem import kotlin.coroutines.CoroutineContext @@ -222,7 +224,9 @@ class GradesListFragment : Fragment(), CoroutineScope { val isUniversity = manager.isUniversity val filterTermId = b.semesterDropdown.selected?.tag - val hideImproved = manager.hideImproved + val hideNoGrade = app.profile.config.grades.hideNoGrade + val countEctsInProgress = app.profile.config.grades.countEctsInProgress + val universityAverageMode = app.profile.config.grades.universityAverageMode // grades returned by the query are ordered // by the subject ID, so it's easier and probably @@ -231,6 +235,9 @@ class GradesListFragment : Fragment(), CoroutineScope { if (isUniversity && filterTermId != null && grade.comment != filterTermId) continue + if (hideNoGrade && grade.type == TYPE_NO_GRADE) + continue + /*if (grade.parentId != null && grade.parentId != -1L) continue // the grade is hidden as a new, improved one is available*/ if (grade.subjectId != subjectId) { @@ -309,13 +316,16 @@ class GradesListFragment : Fragment(), CoroutineScope { val ectsPoints = mutableMapOf, Float>() for (grade in grades) { val pointsPair = grade.subjectId to grade.comment - if (grade.type == TYPE_NO_GRADE) + if (grade.type == TYPE_NO_GRADE && !countEctsInProgress) // reset points if there's an exam that isn't passed yet ectsPoints[pointsPair] = 0.0f if (grade.value == 0.0f || grade.weight == 0.0f) continue - totalSum.add(grade.value * grade.weight) + if (universityAverageMode == UNIVERSITY_AVERAGE_MODE_ECTS) + totalSum.add(grade.value * grade.weight) + else + totalSum.add(grade.value) totalCount.add(grade.weight) if (grade.value < 3.0) @@ -328,11 +338,22 @@ class GradesListFragment : Fragment(), CoroutineScope { if (filterTermId != null && grade.comment != filterTermId) continue - semesterSum.add(grade.value * grade.weight) + if (universityAverageMode == UNIVERSITY_AVERAGE_MODE_ECTS) + semesterSum.add(grade.value * grade.weight) + else + semesterSum.add(grade.value) semesterCount.add(grade.weight) } - stats.universitySem = semesterSum.sum() / semesterCount.sum() - stats.universityTotal = totalSum.sum() / totalCount.sum() + when (universityAverageMode) { + UNIVERSITY_AVERAGE_MODE_SIMPLE -> { + stats.universitySem = semesterSum.sum() / semesterCount.size + stats.universityTotal = totalSum.sum() / totalCount.size + } + UNIVERSITY_AVERAGE_MODE_ECTS -> { + stats.universitySem = semesterSum.sum() / semesterCount.sum() + stats.universityTotal = totalSum.sum() / totalCount.sum() + } + } stats.universityEcts = ectsPoints.values.sum() return (items + stats).toMutableList() } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/GradesManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/GradesManager.kt index b8f152a0..e4e59730 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/GradesManager.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/GradesManager.kt @@ -44,6 +44,8 @@ class GradesManager(val app: App) : CoroutineScope { const val YEAR_ALL_GRADES = 4 const val COLOR_MODE_DEFAULT = 0 const val COLOR_MODE_WEIGHTED = 1 + const val UNIVERSITY_AVERAGE_MODE_SIMPLE = 0 + const val UNIVERSITY_AVERAGE_MODE_ECTS = 1 } private val job = Job() diff --git a/app/src/main/res/layout/dialog_config_grades.xml b/app/src/main/res/layout/dialog_config_grades.xml index 1e0e9058..76f6d2ae 100644 --- a/app/src/main/res/layout/dialog_config_grades.xml +++ b/app/src/main/res/layout/dialog_config_grades.xml @@ -6,6 +6,14 @@ + + + + + + @@ -19,16 +27,18 @@ + android:orientation="horizontal" + android:isVisible="@{!isUniversity}"> + android:orientation="horizontal" + android:isVisible="@{!isUniversity}"> + android:background="@drawable/divider" + android:isVisible="@{!isUniversity}" /> + android:text="@string/grades_config_dont_count_grades" + android:isVisible="@{!isUniversity}" /> + android:enabled="@{dontCountGrades.checked}" + android:isVisible="@{!isUniversity}"> + + + android:orientation="horizontal" + android:isVisible="@{!isUniversity}"> + + + android:text="@string/menu_grades_average_mode" + android:isVisible="@{!isUniversity}" /> + android:layout_height="wrap_content" + android:isVisible="@{!isUniversity}"> + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 84a73c90..79c9cfb2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -445,6 +445,8 @@ Oceny oddziel przecinkiem Podaj oceny… Ukrywaj oceny poprawione z listy + Licz ECTS przed zaliczeniem całego przedmiotu + Ukrywaj pozycje \"brak oceny\" Własna wartość minusa Własna wartość plusa Konfiguracja ocen @@ -695,6 +697,7 @@ Ustawienia ocen Symulator edycji ocen Sortuj oceny + Sposób obliczania średniej za studia Pomoc Strona główna Zadania domowe @@ -976,6 +979,8 @@ Nie wliczaj oceny 0 do średniej Ten e-dziennik nie został jeszcze zaimplementowany w aplikacji. Pokazuj nieobecności nauczycieli w Terminarzu + Średnia arytmetyczna ocen + Średnia ważona ocen (ECTS = waga) Tablica ogłoszeń Obecności/nieobecności Dni wolne klasy