diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/vulcan/DataVulcan.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/vulcan/DataVulcan.kt index a6710b8c..1998899a 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/vulcan/DataVulcan.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/vulcan/DataVulcan.kt @@ -7,15 +7,14 @@ package pl.szczodrzynski.edziennik.api.v2.vulcan import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.api.v2.LOGIN_METHOD_VULCAN_API import pl.szczodrzynski.edziennik.api.v2.models.Data -import pl.szczodrzynski.edziennik.currentTimeUnix import pl.szczodrzynski.edziennik.data.db.modules.login.LoginStore import pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile import pl.szczodrzynski.edziennik.isNotNullNorEmpty class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app, profile, loginStore) { - fun isApiLoginValid() = apiCertificateExpiryTime-30 > currentTimeUnix() - && apiCertificateKey.isNotNullNorEmpty() + fun isApiLoginValid() = /*apiCertificateExpiryTime-30 > currentTimeUnix() + &&*/ apiCertificateKey.isNotNullNorEmpty() && apiCertificatePrivate.isNotNullNorEmpty() && symbol.isNotNullNorEmpty() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/vulcan/data/api/VulcanApiTimetable.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/vulcan/data/api/VulcanApiTimetable.kt index a7a2c83e..1dcd65aa 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/vulcan/data/api/VulcanApiTimetable.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/vulcan/data/api/VulcanApiTimetable.kt @@ -4,6 +4,7 @@ package pl.szczodrzynski.edziennik.api.v2.vulcan.data.api +import androidx.core.util.set import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.api.v2.Regexes import pl.szczodrzynski.edziennik.api.v2.VULCAN_API_ENDPOINT_TIMETABLE @@ -14,6 +15,7 @@ import pl.szczodrzynski.edziennik.api.v2.vulcan.data.VulcanApi import pl.szczodrzynski.edziennik.data.db.modules.api.SYNC_ALWAYS import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata import pl.szczodrzynski.edziennik.data.db.modules.subjects.Subject +import pl.szczodrzynski.edziennik.data.db.modules.teams.Team import pl.szczodrzynski.edziennik.data.db.modules.timetable.Lesson import pl.szczodrzynski.edziennik.utils.Utils.crc16 import pl.szczodrzynski.edziennik.utils.Utils.d @@ -24,163 +26,180 @@ class VulcanApiTimetable(override val data: DataVulcan, val onSuccess: () -> Uni const val TAG = "VulcanApiTimetable" } - init { - data.profile?.also { profile -> - val currentWeekStart = Date.getToday().let { it.stepForward(0, 0, -it.weekDay) } - val getDate = data.arguments?.getString("weekStart") ?: currentWeekStart.stringY_m_d + init { data.profile?.also { profile -> + val currentWeekStart = Date.getToday().let { it.stepForward(0, 0, -it.weekDay) } + val getDate = data.arguments?.getString("weekStart") ?: currentWeekStart.stringY_m_d - val weekStart = Date.fromY_m_d(getDate) - val weekEnd = weekStart.clone().stepForward(0, 0, 6) + val weekStart = Date.fromY_m_d(getDate) + val weekEnd = weekStart.clone().stepForward(0, 0, 6) - apiGet(TAG, VULCAN_API_ENDPOINT_TIMETABLE, parameters = mapOf( - "DataPoczatkowa" to weekStart.stringY_m_d, - "DataKoncowa" to weekEnd.stringY_m_d, - "IdUczen" to data.studentId, - "IdOddzial" to data.studentClassId, - "IdOkresKlasyfikacyjny" to data.studentSemesterId - )) { json, _ -> - val dates: MutableSet = mutableSetOf() - val lessons: MutableList = mutableListOf() + apiGet(TAG, VULCAN_API_ENDPOINT_TIMETABLE, parameters = mapOf( + "DataPoczatkowa" to weekStart.stringY_m_d, + "DataKoncowa" to weekEnd.stringY_m_d, + "IdUczen" to data.studentId, + "IdOddzial" to data.studentClassId, + "IdOkresKlasyfikacyjny" to data.studentSemesterId + )) { json, _ -> + val dates: MutableSet = mutableSetOf() + val lessons: MutableList = mutableListOf() - json.getJsonArray("Data")?.asJsonObjectList()?.forEach { lesson -> - val lessonDate = Date.fromY_m_d(lesson.getString("DzienTekst")) - val lessonNumber = lesson.getInt("NumerLekcji") - val lessonRange = data.lessonRanges.singleOrNull { it.lessonNumber == lessonNumber } - val startTime = lessonRange?.startTime - val endTime = lessonRange?.endTime - val teacherId = lesson.getLong("IdPracownik") - val teamId = data.studentClassId.toLong() - val classroom = lesson.getString("Classroom") + json.getJsonArray("Data")?.asJsonObjectList()?.forEach { lesson -> + if (lesson.getBoolean("PlanUcznia") != true) + return@forEach + val lessonDate = Date.fromY_m_d(lesson.getString("DzienTekst")) + val lessonNumber = lesson.getInt("NumerLekcji") + val lessonRange = data.lessonRanges.singleOrNull { it.lessonNumber == lessonNumber } + val startTime = lessonRange?.startTime + val endTime = lessonRange?.endTime + val teacherId = lesson.getLong("IdPracownik") + val classroom = lesson.getString("Sala") - val oldTeacherId = lesson.getLong("IdPracownikOld") + val oldTeacherId = lesson.getLong("IdPracownikOld") - val changeAnnotation = lesson.getString("AdnotacjaOZmianie") ?: "" - val type = when { - changeAnnotation.startsWith("(przeniesiona z") -> Lesson.TYPE_SHIFTED_TARGET - changeAnnotation.startsWith("(przeniesiona na") -> Lesson.TYPE_SHIFTED_SOURCE - changeAnnotation.startsWith("(zastępstwo") -> Lesson.TYPE_CHANGE - lesson.getBoolean("PrzekreslonaNazwa") == true -> Lesson.TYPE_CANCELLED - else -> Lesson.TYPE_NORMAL + val changeAnnotation = lesson.getString("AdnotacjaOZmianie") ?: "" + val type = when { + changeAnnotation.startsWith("(przeniesiona z") -> Lesson.TYPE_SHIFTED_TARGET + changeAnnotation.startsWith("(przeniesiona na") -> Lesson.TYPE_SHIFTED_SOURCE + changeAnnotation.startsWith("(zastępstwo") -> Lesson.TYPE_CHANGE + lesson.getBoolean("PrzekreslonaNazwa") == true -> Lesson.TYPE_CANCELLED + else -> Lesson.TYPE_NORMAL + } + + val teamId = lesson.getString("PodzialSkrot")?.let { teamName -> + val name = "${data.teamClass?.name} $teamName" + val id = name.crc16().toLong() + var team = data.teamList.singleOrNull { it.name == name } + if (team == null) { + team = Team( + profileId, + id, + name, + Team.TYPE_VIRTUAL, + "${data.schoolName}:$name", + teacherId ?: oldTeacherId ?: -1 + ) + data.teamList[id] = team } + team.id + } ?: data.studentClassId.toLong() - val subjectId = lesson.getLong("IdPrzedmiot")?.let { - when (it) { - 0L -> { - val subjectName = lesson.getString("PrzedmiotNazwa") ?: "" + val subjectId = lesson.getLong("IdPrzedmiot")?.let { + when (it) { + 0L -> { + val subjectName = lesson.getString("PrzedmiotNazwa") ?: "" - data.subjectList.singleOrNull { subject -> subject.longName == subjectName }?.id - ?: { - /** - * CREATE A NEW SUBJECT IF IT DOESN'T EXIST - */ + data.subjectList.singleOrNull { subject -> subject.longName == subjectName }?.id + ?: { + /** + * CREATE A NEW SUBJECT IF IT DOESN'T EXIST + */ - val subjectObject = Subject( - profileId, - -1 * crc16(subjectName.toByteArray()).toLong(), - subjectName, - subjectName - ) - data.subjectList.put(subjectObject.id, subjectObject) - subjectObject.id - }.invoke() - } - else -> it + val subjectObject = Subject( + profileId, + -1 * crc16(subjectName.toByteArray()).toLong(), + subjectName, + subjectName + ) + data.subjectList.put(subjectObject.id, subjectObject) + subjectObject.id + }.invoke() + } + else -> it + } + } + + val id = lessonDate.combineWith(startTime) / 6L * 10L + (lesson.hashCode() and 0xFFFF) + + val lessonObject = Lesson(profileId, id).apply { + this.type = type + + when (type) { + Lesson.TYPE_NORMAL, Lesson.TYPE_CHANGE, Lesson.TYPE_SHIFTED_TARGET -> { + this.date = lessonDate + this.lessonNumber = lessonNumber + this.startTime = startTime + this.endTime = endTime + this.subjectId = subjectId + this.teacherId = teacherId + this.teamId = teamId + this.classroom = classroom + + this.oldTeacherId = oldTeacherId + } + + Lesson.TYPE_CANCELLED, Lesson.TYPE_SHIFTED_SOURCE -> { + this.oldDate = lessonDate + this.oldLessonNumber = lessonNumber + this.oldStartTime = startTime + this.oldEndTime = endTime + this.oldSubjectId = subjectId + this.oldTeacherId = teacherId + this.oldTeamId = teamId + this.oldClassroom = classroom } } - val id = lessonDate.combineWith(startTime) / 6L * 10L + (lesson.hashCode() and 0xFFFF) + if (type == Lesson.TYPE_SHIFTED_SOURCE || type == Lesson.TYPE_SHIFTED_TARGET) { + val shift = Regexes.VULCAN_SHITFT_ANNOTATION.find(changeAnnotation) + val oldLessonNumber = shift?.get(2)?.toInt() + val oldLessonDate = shift?.get(3)?.let { Date.fromd_m_Y(it) } - val lessonObject = Lesson(profileId, id).apply { - this.type = type + val oldLessonRange = data.lessonRanges.singleOrNull { it.lessonNumber == oldLessonNumber } + val oldStartTime = oldLessonRange?.startTime + val oldEndTime = oldLessonRange?.endTime when (type) { - Lesson.TYPE_NORMAL, Lesson.TYPE_CHANGE, Lesson.TYPE_SHIFTED_TARGET -> { - this.date = lessonDate - this.lessonNumber = lessonNumber - this.startTime = startTime - this.endTime = endTime - this.subjectId = subjectId - this.teacherId = teacherId - this.teamId = teamId - this.classroom = classroom - - this.oldTeacherId = oldTeacherId + Lesson.TYPE_SHIFTED_SOURCE -> { + this.lessonNumber = oldLessonNumber + this.date = oldLessonDate + this.startTime = oldStartTime + this.endTime = oldEndTime } - Lesson.TYPE_CANCELLED, Lesson.TYPE_SHIFTED_SOURCE -> { - this.oldDate = lessonDate - this.oldLessonNumber = lessonNumber - this.oldStartTime = startTime - this.oldEndTime = endTime - this.oldSubjectId = subjectId - this.oldTeacherId = teacherId - this.oldTeamId = teamId - this.oldClassroom = classroom - } - } - - if (type == Lesson.TYPE_SHIFTED_SOURCE || type == Lesson.TYPE_SHIFTED_TARGET) { - val shift = Regexes.VULCAN_SHITFT_ANNOTATION.find(changeAnnotation) - val oldLessonNumber = shift?.get(2)?.toInt() - val oldLessonDate = shift?.get(3)?.let { Date.fromd_m_Y(it) } - - val oldLessonRange = data.lessonRanges.singleOrNull { it.lessonNumber == oldLessonNumber } - val oldStartTime = oldLessonRange?.startTime - val oldEndTime = oldLessonRange?.endTime - - when (type) { - Lesson.TYPE_SHIFTED_SOURCE -> { - this.lessonNumber = oldLessonNumber - this.date = oldLessonDate - this.startTime = oldStartTime - this.endTime = oldEndTime - } - - Lesson.TYPE_SHIFTED_TARGET -> { - this.oldLessonNumber = oldLessonNumber - this.oldDate = oldLessonDate - this.oldStartTime = oldStartTime - this.oldEndTime = oldEndTime - } + Lesson.TYPE_SHIFTED_TARGET -> { + this.oldLessonNumber = oldLessonNumber + this.oldDate = oldLessonDate + this.oldStartTime = oldStartTime + this.oldEndTime = oldEndTime } } } - - if (type != Lesson.TYPE_NORMAL) { - data.metadataList.add(Metadata( - profileId, - Metadata.TYPE_LESSON_CHANGE, - id, - profile.empty, - profile.empty, - System.currentTimeMillis() - )) - } - - dates.add(lessonDate.value) - lessons.add(lessonObject) } - val date: Date = weekStart.clone() - while (date <= weekEnd) { - if (!dates.contains(date.value)) { - lessons.add(Lesson(profileId, date.value.toLong()).apply { - this.type = Lesson.TYPE_NO_LESSONS - this.date = date.clone() - }) - } - - date.stepForward(0, 0, 1) + if (type != Lesson.TYPE_NORMAL) { + data.metadataList.add(Metadata( + profileId, + Metadata.TYPE_LESSON_CHANGE, + id, + profile.empty, + profile.empty, + System.currentTimeMillis() + )) } - d(TAG, "Clearing lessons between ${weekStart.stringY_m_d} and ${weekEnd.stringY_m_d} - timetable downloaded for $getDate") - - data.lessonNewList.addAll(lessons) - data.toRemove.add(DataRemoveModel.Timetable.between(weekStart, weekEnd)) - - data.setSyncNext(ENDPOINT_VULCAN_API_TIMETABLE, SYNC_ALWAYS) - onSuccess() + dates.add(lessonDate.value) + lessons.add(lessonObject) } + + val date: Date = weekStart.clone() + while (date <= weekEnd) { + if (!dates.contains(date.value)) { + lessons.add(Lesson(profileId, date.value.toLong()).apply { + this.type = Lesson.TYPE_NO_LESSONS + this.date = date.clone() + }) + } + + date.stepForward(0, 0, 1) + } + + d(TAG, "Clearing lessons between ${weekStart.stringY_m_d} and ${weekEnd.stringY_m_d} - timetable downloaded for $getDate") + + data.lessonNewList.addAll(lessons) + data.toRemove.add(DataRemoveModel.Timetable.between(weekStart, weekEnd)) + + data.setSyncNext(ENDPOINT_VULCAN_API_TIMETABLE, SYNC_ALWAYS) + onSuccess() } - } + }} }