From c7d2ac4e3ee9cdd812418610b9278f4babd6c620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sat, 20 Feb 2021 23:07:23 +0100 Subject: [PATCH] [Vulcan/Hebe] Add getting grades. --- .../edziennik/data/api/Constants.kt | 1 + .../api/edziennik/vulcan/VulcanFeatures.kt | 5 + .../api/edziennik/vulcan/data/VulcanData.kt | 5 + .../api/edziennik/vulcan/data/VulcanHebe.kt | 48 ++++++- .../vulcan/data/hebe/VulcanHebeGrades.kt | 119 ++++++++++++++++++ .../vulcan/data/hebe/VulcanHebeMain.kt | 5 +- 6 files changed, 179 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeGrades.kt diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt index 016d0eb4..f8a0e48b 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt @@ -127,6 +127,7 @@ const val VULCAN_WEB_ENDPOINT_LUCKY_NUMBER = "Start.mvc/GetKidsLuckyNumbers" const val VULCAN_WEB_ENDPOINT_REGISTER_DEVICE = "RejestracjaUrzadzeniaToken.mvc/Get" const val VULCAN_HEBE_ENDPOINT_REGISTER_NEW = "api/mobile/register/new" const val VULCAN_HEBE_ENDPOINT_MAIN = "api/mobile/register/hebe" +const val VULCAN_HEBE_ENDPOINT_GRADES = "api/mobile/grade" const val EDUDZIENNIK_USER_AGENT = "Szkolny.eu/${BuildConfig.VERSION_NAME}" diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/VulcanFeatures.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/VulcanFeatures.kt index ab032e0c..a5121572 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/VulcanFeatures.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/VulcanFeatures.kt @@ -20,6 +20,8 @@ const val ENDPOINT_VULCAN_API_ATTENDANCE = 1080 const val ENDPOINT_VULCAN_API_MESSAGES_INBOX = 1090 const val ENDPOINT_VULCAN_API_MESSAGES_SENT = 1100 const val ENDPOINT_VULCAN_WEB_LUCKY_NUMBERS = 2010 +const val ENDPOINT_VULCAN_HEBE_MAIN = 3000 +const val ENDPOINT_VULCAN_HEBE_GRADES = 3040 val VulcanFeatures = listOf( // timetable @@ -35,6 +37,9 @@ val VulcanFeatures = listOf( ENDPOINT_VULCAN_API_GRADES to LOGIN_METHOD_VULCAN_API, ENDPOINT_VULCAN_API_GRADES_SUMMARY to LOGIN_METHOD_VULCAN_API ), listOf(LOGIN_METHOD_VULCAN_API)), + Feature(LOGIN_TYPE_VULCAN, FEATURE_GRADES, listOf( + ENDPOINT_VULCAN_HEBE_GRADES to LOGIN_METHOD_VULCAN_HEBE + ), listOf(LOGIN_METHOD_VULCAN_HEBE)), // homework Feature(LOGIN_TYPE_VULCAN, FEATURE_HOMEWORK, listOf( ENDPOINT_VULCAN_API_HOMEWORK to LOGIN_METHOD_VULCAN_API diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanData.kt index 491e8ea6..793485f4 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanData.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanData.kt @@ -7,6 +7,7 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.* import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api.* +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.VulcanHebeGrades import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.web.VulcanWebLuckyNumber import pl.szczodrzynski.edziennik.utils.Utils @@ -91,6 +92,10 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) { data.startProgress(R.string.edziennik_progress_endpoint_lucky_number) VulcanWebLuckyNumber(data, lastSync, onSuccess) } + ENDPOINT_VULCAN_HEBE_GRADES -> { + data.startProgress(R.string.edziennik_progress_endpoint_grades) + VulcanHebeGrades(data, lastSync, onSuccess) + } else -> onSuccess(endpointId) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanHebe.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanHebe.kt index dd8913f1..cae27d43 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanHebe.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanHebe.kt @@ -1,6 +1,7 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data import android.os.Build +import androidx.core.util.set import com.google.gson.JsonArray import com.google.gson.JsonElement import com.google.gson.JsonObject @@ -14,6 +15,8 @@ import pl.szczodrzynski.edziennik.data.api.* import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.HebeFilterType import pl.szczodrzynski.edziennik.data.api.models.ApiError +import pl.szczodrzynski.edziennik.data.db.entity.Subject +import pl.szczodrzynski.edziennik.data.db.entity.Teacher import pl.szczodrzynski.edziennik.utils.Utils.d import pl.szczodrzynski.edziennik.utils.models.Date import java.net.HttpURLConnection @@ -36,6 +39,47 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) { val profile get() = data.profile + fun getDate(json: JsonObject?, key: String): Long { + val date = json.getJsonObject(key) + return date.getLong("Timestamp") ?: return System.currentTimeMillis() + } + + fun getTeacherId(json: JsonObject?, key: String): Long { + val teacher = json.getJsonObject(key) + val teacherId = teacher.getLong("Id") ?: return -1 + if (data.teacherList[teacherId] == null) { + data.teacherList[teacherId] = Teacher( + data.profileId, + teacherId, + teacher.getString("Name") ?: "", + teacher.getString("Surname") ?: "" + ) + } + return teacherId + } + + fun getSubjectId(json: JsonObject?, key: String): Long { + val subject = json.getJsonObject(key) + val subjectId = subject.getLong("Id") ?: return -1 + if (data.subjectList[subjectId] == null) { + data.subjectList[subjectId] = Subject( + data.profileId, + subjectId, + subject.getString("Name") ?: "", + subject.getString("Kod") ?: "" + ) + } + return subjectId + } + + fun getSemester(json: JsonObject?): Int { + val periodId = json.getInt("PeriodId") ?: return 1 + return if (periodId == data.semester1Id) + 1 + else + 2 + } + inline fun apiRequest( tag: String, endpoint: String, @@ -168,7 +212,9 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) { firebaseToken: String? = null, crossinline onSuccess: (json: T, response: Response?) -> Unit ) { - val queryPath = query.map { it.key + "=" + URLEncoder.encode(it.value, "UTF-8") }.join("&") + val queryPath = query.map { + it.key + "=" + URLEncoder.encode(it.value, "UTF-8").replace("+", "%20") + }.join("&") apiRequest( tag, if (query.isNotEmpty()) "$endpoint?$queryPath" else endpoint, diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeGrades.kt new file mode 100644 index 00000000..6d78a673 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeGrades.kt @@ -0,0 +1,119 @@ +package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe + +import pl.szczodrzynski.edziennik.* +import pl.szczodrzynski.edziennik.data.api.VULCAN_HEBE_ENDPOINT_GRADES +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_HEBE_GRADES +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanHebe +import pl.szczodrzynski.edziennik.data.db.entity.Grade +import pl.szczodrzynski.edziennik.data.db.entity.Metadata +import java.text.DecimalFormat +import kotlin.math.roundToInt + +class VulcanHebeGrades( + override val data: DataVulcan, + override val lastSync: Long?, + val onSuccess: (endpointId: Int) -> Unit +) : VulcanHebe(data, lastSync) { + companion object { + const val TAG = "VulcanApiGrades" + } + + init { + apiGetList( + TAG, + VULCAN_HEBE_ENDPOINT_GRADES, + HebeFilterType.BY_PUPIL, + lastSync = lastSync + ) { list, _ -> + list.forEach { grade -> + val id = grade.getLong("Id") ?: return@forEach + + val column = grade.getJsonObject("Column") + val category = column.getJsonObject("Category") + val categoryText = category.getString("Name") + + val teacherId = getTeacherId(grade, "Creator") + val subjectId = getSubjectId(column, "Subject") + + val description = column.getString("Name") + val comment = grade.getString("Comment") + var value = grade.getFloat("Value") + var weight = column.getFloat("Weight") ?: 0.0f + val numerator = grade.getFloat("Numerator ") + val denominator = grade.getFloat("Denominator") + val addedDate = getDate(grade, "DateModify") + + var finalDescription = "" + + var name = when (numerator != null && denominator != null) { + true -> { + value = numerator / denominator + finalDescription += DecimalFormat("#.##").format(numerator) + + "/" + DecimalFormat("#.##").format(denominator) + weight = 0.0f + (value * 100).roundToInt().toString() + "%" + } + else -> { + if (value == null) weight = 0.0f + + grade.getString("Content") ?: "" + } + } + + comment?.also { + if (name == "") name = it + else finalDescription = (if (finalDescription == "") "" else " ") + it + } + + description?.also { + finalDescription = (if (finalDescription == "") "" else " - ") + it + } + + val columnColor = column.getInt("Color") ?: 0 + val color = if (columnColor == 0) + when (name) { + "1-", "1", "1+" -> 0xffd65757 + "2-", "2", "2+" -> 0xff9071b3 + "3-", "3", "3+" -> 0xffd2ab24 + "4-", "4", "4+" -> 0xff50b6d6 + "5-", "5", "5+" -> 0xff2cbd92 + "6-", "6", "6+" -> 0xff91b43c + else -> 0xff3D5F9C + }.toInt() + else + columnColor + + val gradeObject = Grade( + profileId = profileId, + id = id, + name = name, + type = Grade.TYPE_NORMAL, + value = value ?: 0.0f, + weight = weight, + color = color, + category = categoryText, + description = finalDescription, + comment = null, + semester = getSemester(column), + teacherId = teacherId, + subjectId = subjectId, + addedDate = addedDate + ) + + data.gradeList.add(gradeObject) + data.metadataList.add( + Metadata( + profileId, + Metadata.TYPE_GRADE, + id, + profile?.empty ?: true, + profile?.empty ?: true + ) + ) + } + + onSuccess(ENDPOINT_VULCAN_HEBE_GRADES) + } + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMain.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMain.kt index 4b37bf5e..438c50ae 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMain.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMain.kt @@ -5,10 +5,9 @@ import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.data.api.LOGIN_TYPE_VULCAN import pl.szczodrzynski.edziennik.data.api.VULCAN_HEBE_ENDPOINT_MAIN import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_PUSH_CONFIG +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_HEBE_MAIN import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanHebe import pl.szczodrzynski.edziennik.data.db.entity.Profile -import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS import pl.szczodrzynski.edziennik.utils.models.Date class VulcanHebeMain( @@ -146,7 +145,7 @@ class VulcanHebeMain( dateYearEnd?.let { newProfile.dateYearEnd = it } if (profile != null) - data.setSyncNext(ENDPOINT_VULCAN_API_PUSH_CONFIG, SYNC_ALWAYS) + data.setSyncNext(ENDPOINT_VULCAN_HEBE_MAIN, 1 * DAY) profileList?.add(newProfile) }