From b7904216933c042b15b64e04784b83fbdf420534 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Thu, 2 Apr 2020 11:17:47 +0200 Subject: [PATCH] [API/Idziennik] Correct showing proposed descriptive grades. Clarify some connection errors. --- .../data/web/IdziennikWebProposedGrades.kt | 62 ++++++++++++++----- .../edziennik/utils/managers/GradesManager.kt | 55 ++++++++++++++++ app/src/main/res/values/errors.xml | 6 +- 3 files changed, 103 insertions(+), 20 deletions(-) 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 fe5a0156..c2639e51 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 @@ -13,6 +13,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb import pl.szczodrzynski.edziennik.data.api.models.ApiError import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel import pl.szczodrzynski.edziennik.data.db.entity.Grade +import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_DESCRIPTIVE import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_SEMESTER1_PROPOSED import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_YEAR_PROPOSED import pl.szczodrzynski.edziennik.data.db.entity.Metadata @@ -20,7 +21,6 @@ import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS import pl.szczodrzynski.edziennik.getJsonArray import pl.szczodrzynski.edziennik.getJsonObject import pl.szczodrzynski.edziennik.getString -import pl.szczodrzynski.edziennik.utils.Utils.getWordGradeValue class IdziennikWebProposedGrades(override val data: DataIdziennik, override val lastSync: Long?, @@ -39,36 +39,64 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik, .withApiResponse(result)) return@webApiGet } + val manager = data.app.gradesManager json.getJsonArray("Przedmioty")?.asJsonObjectList()?.forEach { subject -> val subjectName = subject.getString("Przedmiot") ?: return@forEach val subjectObject = data.getSubject(subjectName, null, subjectName) val semester1Proposed = subject.getString("OcenaSem1") ?: "" - val semester1Value = getWordGradeValue(semester1Proposed) + val semester1Value = manager.getGradeValue(semester1Proposed) val semester1Id = subjectObject.id * (-100) - 1 + val semester1Type = + if (semester1Value == 0f) TYPE_DESCRIPTIVE + else TYPE_SEMESTER1_PROPOSED + val semester1Name = when { + semester1Value == 0f -> " " + semester1Value % 1.0f == 0f -> semester1Value.toInt().toString() + else -> semester1Value.toString() + } + val semester1Color = + if (semester1Value == 0f) 0xff536dfe.toInt() + else -1 val semester2Proposed = subject.getString("OcenaSem2") ?: "" - val semester2Value = getWordGradeValue(semester2Proposed) + val semester2Value = manager.getGradeValue(semester2Proposed) val semester2Id = subjectObject.id * (-100) - 2 + val semester2Type = + if (semester2Value == 0f) TYPE_DESCRIPTIVE + else TYPE_YEAR_PROPOSED + val semester2Name = when { + semester2Value == 0f -> " " + semester2Value % 1.0f == 0f -> semester2Value.toInt().toString() + else -> semester2Value.toString() + } + val semester2Color = + if (semester2Value == 0f) 0xffff4081.toInt() + else -1 if (semester1Proposed != "") { val gradeObject = Grade( profileId = profileId, id = semester1Id, - name = semester1Value.toString(), - type = TYPE_SEMESTER1_PROPOSED, - value = semester1Value.toFloat(), + name = semester1Name, + type = semester1Type, + value = semester1Value, weight = 0f, - color = -1, - category = null, - description = null, + color = semester1Color, + category = if (semester1Value == 0f) "Ocena opisowa semestralna" else null, + description = if (semester1Value == 0f) semester1Proposed else null, comment = null, semester = 1, teacherId = -1, subjectId = subjectObject.id ) + val addedDate = if (data.profile.empty) + data.profile.dateSemester1Start.inMillis + else + System.currentTimeMillis() + data.gradeList.add(gradeObject) data.metadataList.add(Metadata( profileId, @@ -76,7 +104,7 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik, gradeObject.id, profile.empty, profile.empty, - System.currentTimeMillis() + addedDate )) } @@ -84,13 +112,13 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik, val gradeObject = Grade( profileId = profileId, id = semester2Id, - name = semester2Value.toString(), - type = TYPE_YEAR_PROPOSED, - value = semester2Value.toFloat(), + name = semester2Name, + type = semester2Type, + value = semester2Value, weight = 0f, - color = -1, - category = null, - description = null, + color = semester2Color, + category = if (semester2Value == 0f) "Ocena opisowa końcoworoczna" else null, + description = if (semester2Value == 0f) semester2Proposed else null, comment = null, semester = 2, teacherId = -1, @@ -98,7 +126,7 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik, ) val addedDate = if (data.profile.empty) - data.profile.dateSemester1Start.inMillis + data.profile.dateSemester2Start.inMillis else System.currentTimeMillis() 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 27fdd18b..8a09df3d 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 @@ -82,10 +82,19 @@ class GradesManager(val app: App) : CoroutineScope { else -> null } + /** + * Returns the "rounded" grade value as an integer. + * The decimal value is rounded to ceil if >= 0.75. + */ fun getRoundedGrade(value: Float): Int { return floor(value.toDouble()).toInt() + if (value % 1.0f >= 0.75) 1 else 0 } + /** + * Get a grade value, either saved in the [grade] + * or calculated including the [plusValue] and + * [minusValue]. + */ fun getGradeValue(grade: Grade): Float { if (plusValue == null && minusValue == null) return grade.value @@ -102,6 +111,10 @@ class GradesManager(val app: App) : CoroutineScope { return grade.value } + /** + * Returns a weight if the grade should be counted + * to the average, 0f otherwise. + */ fun getGradeWeight(dontCountEnabled: Boolean, dontCountGrades: List, grade: Grade): Float { if (!dontCountEnabled) return grade.weight @@ -161,6 +174,48 @@ class GradesManager(val app: App) : CoroutineScope { return color or 0xff000000.toInt() } + /** + * Calculate the grade's value using + * the specified [name]. + */ + fun getGradeValue(name: String): Float { + return when (name.toLowerCase()) { + "1-" -> 0.75f + "1" -> 1.00f + "1+" -> 1.50f + "2-" -> 1.75f + "2" -> 2.00f + "2+" -> 2.50f + "3-" -> 2.75f + "3" -> 3.00f + "3+" -> 3.50f + "4-" -> 3.75f + "4" -> 4.00f + "4+" -> 4.50f + "5-" -> 4.75f + "5" -> 5.00f + "5+" -> 5.50f + "6-" -> 5.75f + "6" -> 6.00f + "6+" -> 6.50f + "niedostateczny", "f" -> 1f + "dopuszczający", "e" -> 2f + "dostateczny", "d" -> 3f + "dobry", "c" -> 4f + "bardzo dobry", "b" -> 5f + "celujący", "a" -> 6f + else -> 0f + } + } + + /* _ _ _____ _____ _ __ _ + | | | |_ _| / ____| (_)/ _(_) + | | | | | | | (___ _ __ ___ ___ _| |_ _ ___ + | | | | | | \___ \| '_ \ / _ \/ __| | _| |/ __| + | |__| |_| |_ ____) | |_) | __/ (__| | | | | (__ + \____/|_____| |_____/| .__/ \___|\___|_|_| |_|\___| + | | + |*/ fun markAsSeen(grade: GradeFull) { grade.seen = true startCoroutineTimer(500L, 0L) { diff --git a/app/src/main/res/values/errors.xml b/app/src/main/res/values/errors.xml index 132b888b..b0eb94dd 100644 --- a/app/src/main/res/values/errors.xml +++ b/app/src/main/res/values/errors.xml @@ -182,7 +182,7 @@ Aplikacja przestała działać Nie udało się wysłać wiadomości: nowa wiadomość nie została odnaleziona na liście wiadomości wysłanych - Błąd odpowiedzi serwera + Błąd odpowiedzi serwera. Dziennik może być przeciążony lub mieć przerwę techniczną. Błąd serwera: nieprawidłowe zapytanie. Dziennik może być przeciążony lub mieć przerwę techniczną. Błąd serwera: odmowa dostępu Błąd serwera: dostęp zabroniony @@ -193,9 +193,9 @@ Wewnętrzny błąd serwera. Dziennik może być przeciążony lub mieć przerwę techniczną. Dziennik jest tymczasowo niedostępny Brak internetu: nie znaleziono adresu serwera - Brak internetu: przekroczono czas oczekiwania. Dziennik może być przeciążony lub mieć przerwę techniczną. + Przekroczono czas oczekiwania. Dziennik może być przeciążony lub mieć przerwę techniczną. Brak internetu - Brak internetu: połączenie SSL nie powiodło się + Połączenie bezpieczne nie powiodło się. Sprawdź, czy masz ustawioną poprawnie datę i godzinę. Brak odpowiedzi serwera. Dziennik może być przeciążony lub mieć przerwę techniczną. Dane logowania niekompletne. Skontaktuj się z twórcą aplikacji. Nieprawidłowe dane logowania