From e282af0e80d38a262d12a821ec6b492136951b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sun, 8 Mar 2020 17:57:44 +0100 Subject: [PATCH] [Grades] Add option to hide improved grades. Make counting average without weight configurable. --- .../edziennik/config/ProfileConfigGrades.kt | 10 +++ .../ui/dialogs/settings/GradesConfigDialog.kt | 14 +++- .../ui/modules/grades/GradesFragment.kt | 16 +++- .../edziennik/utils/managers/GradesManager.kt | 6 +- .../main/res/layout/dialog_config_grades.xml | 83 ++++++++++++++----- app/src/main/res/values/strings.xml | 6 ++ 6 files changed, 109 insertions(+), 26 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 af6c8349..07e88c45 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/config/ProfileConfigGrades.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/config/ProfileConfigGrades.kt @@ -26,6 +26,16 @@ class ProfileConfigGrades(private val config: ProfileConfig) { get() { mCountZeroToAvg = mCountZeroToAvg ?: config.values.get("countZeroToAvg", true); return mCountZeroToAvg ?: true } set(value) { config.set("countZeroToAvg", value); mCountZeroToAvg = value } + private var mHideImproved: Boolean? = null + var hideImproved: Boolean + get() { mHideImproved = mHideImproved ?: config.values.get("hideImproved", true); return mHideImproved ?: true } + set(value) { config.set("hideImproved", value); mHideImproved = value } + + private var mAverageWithoutWeight: Boolean? = null + var averageWithoutWeight: Boolean + get() { mAverageWithoutWeight = mAverageWithoutWeight ?: config.values.get("averageWithoutWeight", true); return mAverageWithoutWeight ?: true } + set(value) { config.set("averageWithoutWeight", value); mAverageWithoutWeight = value } + private var mPlusValue: Float? = null var plusValue: Float? get() { mPlusValue = mPlusValue ?: config.values.getFloat("plusValue"); return mPlusValue } 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 666dec3c..4f195b0a 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 @@ -89,6 +89,8 @@ class GradesConfigDialog( }?.isChecked = true b.dontCountZeroToAverage.isChecked = !profileConfig.countZeroToAvg + b.hideImproved.isChecked = profileConfig.hideImproved + b.averageWithoutWeight.isChecked = profileConfig.averageWithoutWeight } private fun saveConfig() { @@ -125,6 +127,16 @@ class GradesConfigDialog( b.gradeAverageMode2.setOnSelectedListener { profileConfig.yearAverageMode = YEAR_1_AVG_2_SEM } b.gradeAverageMode3.setOnSelectedListener { profileConfig.yearAverageMode = YEAR_1_SEM_2_SEM } - b.dontCountZeroToAverage.setOnCheckedChangeListener { _, isChecked -> profileConfig.countZeroToAvg = !isChecked } + b.dontCountZeroToAverage.onChange { _, isChecked -> profileConfig.countZeroToAvg = !isChecked } + b.hideImproved.onChange { _, isChecked -> profileConfig.hideImproved = isChecked } + b.averageWithoutWeight.onChange { _, isChecked -> profileConfig.averageWithoutWeight = isChecked } + + b.averageWithoutWeightHelp.onClick { + MaterialAlertDialogBuilder(activity) + .setTitle(R.string.grades_config_average_without_weight) + .setMessage(R.string.grades_config_average_without_weight_message) + .setPositiveButton(R.string.ok, null) + .show() + } } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/GradesFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/GradesFragment.kt index 0e80f806..ed0c6220 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/GradesFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/grades/GradesFragment.kt @@ -121,6 +121,8 @@ class GradesFragment : Fragment(), CoroutineScope { var subject = GradesSubject(subjectId, "") var semester = GradesSemester(0, 1) + val hideImproved = manager.hideImproved + // grades returned by the query are ordered // by the subject ID, so it's easier and probably // a bit faster to build all the models @@ -152,7 +154,10 @@ class GradesFragment : Fragment(), CoroutineScope { Grade.TYPE_YEAR_PROPOSED -> subject.proposedGrade = grade Grade.TYPE_YEAR_FINAL -> subject.finalGrade = grade else -> { - semester.grades += grade + if (!hideImproved || grade.parentId ?: -1L == -1L) { + // hide improved grades if parent(new grade) ID is not set + semester.grades += grade + } countGrade(grade, subject.averages) countGrade(grade, semester.averages) } @@ -247,8 +252,13 @@ class GradesFragment : Fragment(), CoroutineScope { val weight = manager.getGradeWeight(dontCountGrades, grade) when (grade.type) { Grade.TYPE_NORMAL -> { - averages.normalSum += value - averages.normalCount ++ + if (grade.value > 0f) { + // count to the arithmetic average + // only if value more than 0 + // to exclude "+", "-", "np" etc. + averages.normalSum += value + averages.normalCount++ + } averages.normalWeightedSum += value * weight averages.normalWeightedCount += weight } 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 294264a5..94028e8f 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 @@ -45,6 +45,10 @@ class GradesManager(val app: App) { get() = app.config.forProfile().grades.minusValue val dontCountGrades get() = app.config.forProfile().grades.dontCountGrades + val hideImproved + get() = app.config.forProfile().grades.hideImproved + val averageWithoutWeight + get() = app.config.forProfile().grades.averageWithoutWeight fun getOrderByString() = when (orderBy) { @@ -142,7 +146,7 @@ class GradesManager(val app: App) { averages.normalWeightedCount > 0f -> { averages.normalWeightedSum / averages.normalWeightedCount } - averages.normalSum > 0f && averages.normalCount > 0f -> { + averageWithoutWeight && averages.normalSum > 0f && averages.normalCount > 0f -> { averages.normalSum / averages.normalCount } else -> null diff --git a/app/src/main/res/layout/dialog_config_grades.xml b/app/src/main/res/layout/dialog_config_grades.xml index 205e59f4..e8d35953 100644 --- a/app/src/main/res/layout/dialog_config_grades.xml +++ b/app/src/main/res/layout/dialog_config_grades.xml @@ -4,7 +4,8 @@ --> + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> @@ -13,12 +14,21 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="24dp"> + android:paddingStart="24dp" + android:paddingEnd="24dp"> + + @@ -28,7 +38,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:minHeight="0dp" - android:text="Własna wartość plusa" /> + android:text="@string/grades_config_plus_value" /> @@ -54,7 +64,7 @@ android:layout_height="wrap_content" android:layout_weight="1" android:minHeight="0dp" - android:text="Własna wartość minusa" /> + android:text="@string/grades_config_minus_value" /> + + + + + + + + + + + + + @@ -167,21 +223,6 @@ android:minHeight="0dp" android:text="@string/settings_register_avg_mode_3"/> - - - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a50d00fe..bc38d7a0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1249,4 +1249,10 @@ Wg. przedmiotu Jednorazowo Cyklicznie + Konfiguracja ocen + Ukrywaj oceny poprawione z listy + Licz średnią jeśli wszystkie wagi to 0 + Pozwala na liczenie średniej arytmetycznej z przedmiotów, w których wszystkie wystawione oceny mają wagę 0 (nie są liczone do średniej).\n\nJeśli taki przedmiot celowo nie powinien być liczony, odznacz okienko przy tym ustawieniu. + Własna wartość minusa + Własna wartość plusa