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