From 9023f139325174f9be891983342d33e431e212b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 22 Feb 2021 17:18:40 +0100 Subject: [PATCH 01/39] [Vulcan/Hebe] Add missing copyright to files. --- .../edziennik/data/api/edziennik/vulcan/data/VulcanHebe.kt | 4 ++++ .../data/api/edziennik/vulcan/data/hebe/HebeFilterType.kt | 4 ++++ .../api/edziennik/vulcan/data/hebe/VulcanHebeAddressbook.kt | 4 ++++ .../data/api/edziennik/vulcan/data/hebe/VulcanHebeExams.kt | 4 ++++ .../data/api/edziennik/vulcan/data/hebe/VulcanHebeGrades.kt | 4 ++++ .../data/api/edziennik/vulcan/data/hebe/VulcanHebeHomework.kt | 4 ++++ .../data/api/edziennik/vulcan/data/hebe/VulcanHebeMain.kt | 4 ++++ .../data/api/edziennik/vulcan/data/hebe/VulcanHebeMessages.kt | 4 ++++ .../vulcan/data/hebe/VulcanHebeMessagesChangeStatus.kt | 4 ++++ .../api/edziennik/vulcan/data/hebe/VulcanHebeTimetable.kt | 4 ++++ .../data/api/edziennik/vulcan/login/VulcanLoginHebe.kt | 4 ++++ 11 files changed, 44 insertions(+) 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 c61140c4..c2e80dc4 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,3 +1,7 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-20. + */ + package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data import android.os.Build diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/HebeFilterType.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/HebeFilterType.kt index 6734ab71..a4ea84b1 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/HebeFilterType.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/HebeFilterType.kt @@ -1,3 +1,7 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-20. + */ + package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe enum class HebeFilterType(val endpoint: String) { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAddressbook.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAddressbook.kt index c96142aa..5069838e 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAddressbook.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAddressbook.kt @@ -1,3 +1,7 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-21. + */ + package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe import androidx.core.util.set diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeExams.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeExams.kt index 54388a86..52fbead2 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeExams.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeExams.kt @@ -1,3 +1,7 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-21. + */ + package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe import pl.szczodrzynski.edziennik.* 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 index 11a7fdbc..9c0591de 100644 --- 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 @@ -1,3 +1,7 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-20. + */ + package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe import pl.szczodrzynski.edziennik.* diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeHomework.kt index 9ab8ede0..2a746e71 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeHomework.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeHomework.kt @@ -1,3 +1,7 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-21. + */ + package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe import pl.szczodrzynski.edziennik.data.api.VULCAN_HEBE_ENDPOINT_HOMEWORK 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 b3d88d04..c017e3c9 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 @@ -1,3 +1,7 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-20. + */ + package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe import com.google.gson.JsonArray diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessages.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessages.kt index 22fb39b7..fcaa30eb 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessages.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessages.kt @@ -1,3 +1,7 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-21. + */ + package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe import androidx.core.util.set diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessagesChangeStatus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessagesChangeStatus.kt index 74d3f759..ff5dbe4c 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessagesChangeStatus.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessagesChangeStatus.kt @@ -1,3 +1,7 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-21. + */ + package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe import org.greenrobot.eventbus.EventBus diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeTimetable.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeTimetable.kt index 48d06018..03a28a9e 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeTimetable.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeTimetable.kt @@ -1,3 +1,7 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-21. + */ + package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe import com.google.gson.JsonObject diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginHebe.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginHebe.kt index 1308f449..e6334299 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginHebe.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginHebe.kt @@ -1,3 +1,7 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-20. + */ + package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login import com.google.gson.JsonObject From 13c2640ed51ec64f0f1cbeb737abd196fa1792de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 22 Feb 2021 17:43:34 +0100 Subject: [PATCH 02/39] [UI] Hide API deprecation message on other profiles. --- .../main/java/pl/szczodrzynski/edziennik/MainActivity.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt index d5a1adde..1e73e267 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt @@ -751,6 +751,11 @@ class MainActivity : AppCompatActivity(), CoroutineScope { @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) fun onApiTaskErrorEvent(event: ApiTaskErrorEvent) { EventBus.getDefault().removeStickyEvent(event) + if (event.error.errorCode == ERROR_VULCAN_API_DEPRECATED) { + if (event.error.profileId != App.profileId) + return + ErrorDetailsDialog(this, listOf(event.error)) + } navView.toolbar.apply { subtitleFormat = R.string.toolbar_subtitle subtitleFormatWithUnread = R.plurals.toolbar_subtitle_with_unread @@ -758,9 +763,6 @@ class MainActivity : AppCompatActivity(), CoroutineScope { } mainSnackbar.dismiss() errorSnackbar.addError(event.error).show() - if (event.error.errorCode == ERROR_VULCAN_API_DEPRECATED) { - ErrorDetailsDialog(this, listOf(event.error)) - } } @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) fun onAppManagerDetectedEvent(event: AppManagerDetectedEvent) { From ede101ea2076cf55cca3600c2caed9a8d78dbe8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 22 Feb 2021 17:51:52 +0100 Subject: [PATCH 03/39] [Vulcan/Hebe] Add saving lesson topic in attendance. --- .../data/api/edziennik/vulcan/data/hebe/VulcanHebeAttendance.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAttendance.kt index 3d207388..9e41bb6d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAttendance.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAttendance.kt @@ -85,6 +85,7 @@ class VulcanHebeAttendance( subjectId = subjectId, addedDate = addedDate ).also { + it.lessonTopic = attendance.getString("Topic") it.lessonNumber = lessonNumber it.isCounted = isCounted } From 552acd404346ed141d948935d1444556e06ba114 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 22 Feb 2021 18:23:27 +0100 Subject: [PATCH 04/39] [Vulcan/Web] Fix web login. --- .../pl/szczodrzynski/edziennik/data/api/LoginMethods.kt | 6 ++---- .../data/api/edziennik/vulcan/data/VulcanWebMain.kt | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/LoginMethods.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/LoginMethods.kt index d70dd54e..b154e96e 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/LoginMethods.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/LoginMethods.kt @@ -121,11 +121,9 @@ val vulcanLoginMethods = listOf( LoginMethod(LOGIN_TYPE_VULCAN, LOGIN_METHOD_VULCAN_API, VulcanLoginApi::class.java) .withIsPossible { _, loginStore -> - loginStore.mode != LOGIN_MODE_VULCAN_HEBE + loginStore.mode == LOGIN_MODE_VULCAN_API } - .withRequiredLoginMethod { _, loginStore -> - if (loginStore.mode == LOGIN_MODE_VULCAN_WEB) LOGIN_METHOD_VULCAN_WEB_MAIN else LOGIN_METHOD_NOT_NEEDED - }, + .withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED }, LoginMethod(LOGIN_TYPE_VULCAN, LOGIN_METHOD_VULCAN_HEBE, VulcanLoginHebe::class.java) .withIsPossible { _, loginStore -> diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt index 39433657..5d51839e 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt @@ -144,7 +144,7 @@ open class VulcanWebMain(open val data: DataVulcan, open val lastSync: Long?) { var count = 0 while (clientIndex != -1 && count < 100) { val startIndex = clientIndex + clientUrl.length - val endIndex = text.indexOf('/', startIndex = startIndex) + val endIndex = text.indexOf('"', startIndex = startIndex) val schoolSymbol = text.substring(startIndex, endIndex) schoolSymbols += schoolSymbol clientIndex = text.indexOf(clientUrl, startIndex = endIndex) From c8ee6ff1e768d0448beee1e980b7023b426c2b6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 22 Feb 2021 18:49:24 +0100 Subject: [PATCH 05/39] [Vulcan/Hebe] Add getting lucky number. --- .../edziennik/data/api/Constants.kt | 1 + .../api/edziennik/vulcan/VulcanFeatures.kt | 13 +++- .../api/edziennik/vulcan/data/VulcanData.kt | 4 ++ .../api/edziennik/vulcan/data/VulcanHebe.kt | 4 +- .../vulcan/data/hebe/VulcanHebeLuckyNumber.kt | 72 +++++++++++++++++++ 5 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeLuckyNumber.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 614d5f3a..dda53fd9 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 @@ -136,6 +136,7 @@ const val VULCAN_HEBE_ENDPOINT_HOMEWORK = "api/mobile/homework" const val VULCAN_HEBE_ENDPOINT_ATTENDANCE = "api/mobile/lesson" const val VULCAN_HEBE_ENDPOINT_MESSAGES = "api/mobile/message" const val VULCAN_HEBE_ENDPOINT_MESSAGES_STATUS = "api/mobile/message/status" +const val VULCAN_HEBE_ENDPOINT_LUCKY_NUMBER = "api/mobile/school/lucky" 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 9e247575..9444c224 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 @@ -29,6 +29,7 @@ const val ENDPOINT_VULCAN_HEBE_HOMEWORK = 3060 const val ENDPOINT_VULCAN_HEBE_ATTENDANCE = 3080 const val ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX = 3090 const val ENDPOINT_VULCAN_HEBE_MESSAGES_SENT = 3100 +const val ENDPOINT_VULCAN_HEBE_LUCKY_NUMBER = 3200 val VulcanFeatures = listOf( // timetable @@ -97,7 +98,17 @@ val VulcanFeatures = listOf( */ Feature(LOGIN_TYPE_VULCAN, FEATURE_LUCKY_NUMBER, listOf( ENDPOINT_VULCAN_WEB_LUCKY_NUMBERS to LOGIN_METHOD_VULCAN_WEB_MAIN - ), listOf(LOGIN_METHOD_VULCAN_WEB_MAIN)).withShouldSync { data -> data.shouldSyncLuckyNumber() }, + ), listOf(LOGIN_METHOD_VULCAN_WEB_MAIN)) + .withShouldSync { data -> data.shouldSyncLuckyNumber() } + .withPriority(2), + /** + * Lucky number - using Hebe API + */ + Feature(LOGIN_TYPE_VULCAN, FEATURE_LUCKY_NUMBER, listOf( + ENDPOINT_VULCAN_HEBE_LUCKY_NUMBER to LOGIN_METHOD_VULCAN_HEBE + ), listOf(LOGIN_METHOD_VULCAN_HEBE)) + .withShouldSync { data -> data.shouldSyncLuckyNumber() } + .withPriority(1), Feature(LOGIN_TYPE_VULCAN, FEATURE_ALWAYS_NEEDED, listOf( ENDPOINT_VULCAN_API_UPDATE_SEMESTER 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 2fc21190..79310249 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 @@ -180,6 +180,10 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) { data.startProgress(R.string.edziennik_progress_endpoint_attendance) VulcanHebeAttendance(data, lastSync, onSuccess) } + ENDPOINT_VULCAN_HEBE_LUCKY_NUMBER -> { + data.startProgress(R.string.edziennik_progress_endpoint_lucky_number) + VulcanHebeLuckyNumber(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 c2e80dc4..169c7e20 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 @@ -210,7 +210,9 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) { .withApiResponse(json.toString())) } - val envelope = when (T::class.java) { + val envelope = if (json.get("Envelope").isJsonNull && null is T) + null as T + else when (T::class.java) { JsonObject::class.java -> json.getJsonObject("Envelope") as T JsonArray::class.java -> json.getJsonArray("Envelope") as T java.lang.Boolean::class.java -> json.getBoolean("Envelope") as T diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeLuckyNumber.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeLuckyNumber.kt new file mode 100644 index 00000000..8ff1631b --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeLuckyNumber.kt @@ -0,0 +1,72 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-22. + */ + +package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe + +import com.google.gson.JsonObject +import pl.szczodrzynski.edziennik.data.api.VULCAN_HEBE_ENDPOINT_LUCKY_NUMBER +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_HEBE_LUCKY_NUMBER +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanHebe +import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber +import pl.szczodrzynski.edziennik.data.db.entity.Metadata +import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS +import pl.szczodrzynski.edziennik.getInt +import pl.szczodrzynski.edziennik.getString +import pl.szczodrzynski.edziennik.utils.models.Date +import pl.szczodrzynski.edziennik.utils.models.Time +import pl.szczodrzynski.edziennik.utils.models.Week + +class VulcanHebeLuckyNumber( + override val data: DataVulcan, + override val lastSync: Long?, + val onSuccess: (endpointId: Int) -> Unit +) : VulcanHebe(data, lastSync) { + companion object { + const val TAG = "VulcanHebeLuckyNumber" + } + + init { + apiGet( + TAG, + VULCAN_HEBE_ENDPOINT_LUCKY_NUMBER, + query = mapOf( + "constituentId" to data.studentConstituentId.toString(), + "day" to Date.getToday().stringY_m_d + ) + ) { lucky: JsonObject?, _ -> + // sync tomorrow if lucky number set or is weekend or afternoon + var nextSync = Date.getToday().stepForward(0, 0, 1).inMillis + if (lucky == null) { + if (Date.getToday().weekDay <= Week.FRIDAY && Time.getNow().hour < 12) { + // working days morning, sync always + nextSync = SYNC_ALWAYS + } + } + else { + val luckyNumberDate = Date.fromY_m_d(lucky.getString("Day")) ?: Date.getToday() + val luckyNumber = lucky.getInt("Number") ?: -1 + val luckyNumberObject = LuckyNumber( + profileId = profileId, + date = luckyNumberDate, + number = luckyNumber + ) + + data.luckyNumberList.add(luckyNumberObject) + data.metadataList.add( + Metadata( + profileId, + Metadata.TYPE_LUCKY_NUMBER, + luckyNumberObject.date.value.toLong(), + true, + profile?.empty ?: false + ) + ) + } + + data.setSyncNext(ENDPOINT_VULCAN_HEBE_LUCKY_NUMBER, syncAt = nextSync) + onSuccess(ENDPOINT_VULCAN_HEBE_LUCKY_NUMBER) + } + } +} From c7a44f5ced7db5babe10d8fae05c6b7f8fcfb938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 22 Feb 2021 19:13:25 +0100 Subject: [PATCH 06/39] [Vulcan/Hebe] Implement push notifications. --- .../edziennik/data/api/Constants.kt | 1 + .../api/edziennik/vulcan/VulcanFeatures.kt | 8 +++++ .../api/edziennik/vulcan/data/VulcanData.kt | 4 +++ .../vulcan/data/hebe/VulcanHebePushConfig.kt | 36 +++++++++++++++++++ .../data/firebase/SzkolnyVulcanFirebase.kt | 6 ++-- 5 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebePushConfig.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 dda53fd9..8eeefdb9 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_PUSH_ALL = "api/mobile/push/all" const val VULCAN_HEBE_ENDPOINT_TIMETABLE = "api/mobile/schedule" const val VULCAN_HEBE_ENDPOINT_TIMETABLE_CHANGES = "api/mobile/schedule/changes" const val VULCAN_HEBE_ENDPOINT_ADDRESSBOOK = "api/mobile/addressbook" 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 9444c224..1d305a9e 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 @@ -19,8 +19,11 @@ const val ENDPOINT_VULCAN_API_NOTICES = 1070 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_PUSH_CONFIG = 3005 const val ENDPOINT_VULCAN_HEBE_ADDRESSBOOK = 3010 const val ENDPOINT_VULCAN_HEBE_TIMETABLE = 3020 const val ENDPOINT_VULCAN_HEBE_EXAMS = 3030 @@ -92,6 +95,11 @@ val VulcanFeatures = listOf( ), listOf(LOGIN_METHOD_VULCAN_API)).withShouldSync { data -> !data.app.config.sync.tokenVulcanList.contains(data.profileId) }, + Feature(LOGIN_TYPE_VULCAN, FEATURE_PUSH_CONFIG, listOf( + ENDPOINT_VULCAN_HEBE_PUSH_CONFIG to LOGIN_METHOD_VULCAN_HEBE + ), listOf(LOGIN_METHOD_VULCAN_HEBE)).withShouldSync { data -> + !data.app.config.sync.tokenVulcanList.contains(data.profileId) + }, /** * Lucky number - using WEB Main. 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 79310249..0105abc2 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 @@ -148,6 +148,10 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) { onSuccess(ENDPOINT_VULCAN_HEBE_MAIN) } } + ENDPOINT_VULCAN_HEBE_PUSH_CONFIG -> { + data.startProgress(R.string.edziennik_progress_endpoint_push_config) + VulcanHebePushConfig(data, lastSync, onSuccess) + } ENDPOINT_VULCAN_HEBE_ADDRESSBOOK -> { data.startProgress(R.string.edziennik_progress_endpoint_teachers) VulcanHebeAddressbook(data, lastSync, onSuccess) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebePushConfig.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebePushConfig.kt new file mode 100644 index 00000000..fdf81bcb --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebePushConfig.kt @@ -0,0 +1,36 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-22. + */ + +package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe + +import com.google.gson.JsonPrimitive +import pl.szczodrzynski.edziennik.data.api.VULCAN_HEBE_ENDPOINT_PUSH_ALL +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_HEBE_PUSH_CONFIG +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanHebe +import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS + +class VulcanHebePushConfig( + override val data: DataVulcan, + override val lastSync: Long?, + val onSuccess: (endpointId: Int) -> Unit +) : VulcanHebe(data, lastSync) { + companion object { + const val TAG = "VulcanHebePushConfig" + } + + init { + apiPost( + TAG, + VULCAN_HEBE_ENDPOINT_PUSH_ALL, + payload = JsonPrimitive("on") + ) { _: Boolean, _ -> + // sync always: this endpoint has .shouldSync set + data.setSyncNext(ENDPOINT_VULCAN_HEBE_PUSH_CONFIG, SYNC_ALWAYS) + data.app.config.sync.tokenVulcanList = + data.app.config.sync.tokenVulcanList + profileId + onSuccess(ENDPOINT_VULCAN_HEBE_PUSH_CONFIG) + } + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyVulcanFirebase.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyVulcanFirebase.kt index b7d3af9e..06c2f171 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyVulcanFirebase.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyVulcanFirebase.kt @@ -29,6 +29,7 @@ class SzkolnyVulcanFirebase(val app: App, val profiles: List, val messa val data = message.data.getString("data")?.toJsonObject() ?: return@run val type = data.getString("table") ?: return@run val studentId = data.getInt("pupilid") + val loginId = data.getInt("loginid") /* pl.vulcan.uonetmobile.auxilary.enums.CDCPushEnum */ val viewIdPair = when (type.toLowerCase(Locale.ROOT)) { @@ -42,8 +43,9 @@ class SzkolnyVulcanFirebase(val app: App, val profiles: List, val messa } val tasks = profiles.filter { - it.loginStoreType == LOGIN_TYPE_VULCAN && - it.getStudentData("studentId", 0) == studentId + it.loginStoreType == LOGIN_TYPE_VULCAN + && (it.getStudentData("studentId", 0) == studentId + || it.getStudentData("studentLoginId", 0) == loginId) }.map { EdziennikTask.syncProfile(it.id, listOf(viewIdPair)) } From c698dfdb7376c89142ca2f801e39c9656b7dde5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 22 Feb 2021 21:33:42 +0100 Subject: [PATCH 07/39] [Vulcan/Hebe] Add getting grade summary. --- .../edziennik/data/api/Constants.kt | 1 + .../api/edziennik/vulcan/VulcanFeatures.kt | 4 +- .../api/edziennik/vulcan/data/VulcanData.kt | 4 + .../data/hebe/VulcanHebeGradeSummary.kt | 88 +++++++++++++++++++ 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeGradeSummary.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 8eeefdb9..034b5972 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 @@ -133,6 +133,7 @@ const val VULCAN_HEBE_ENDPOINT_TIMETABLE_CHANGES = "api/mobile/schedule/changes" const val VULCAN_HEBE_ENDPOINT_ADDRESSBOOK = "api/mobile/addressbook" const val VULCAN_HEBE_ENDPOINT_EXAMS = "api/mobile/exam" const val VULCAN_HEBE_ENDPOINT_GRADES = "api/mobile/grade" +const val VULCAN_HEBE_ENDPOINT_GRADE_SUMMARY = "api/mobile/grade/summary" const val VULCAN_HEBE_ENDPOINT_HOMEWORK = "api/mobile/homework" const val VULCAN_HEBE_ENDPOINT_ATTENDANCE = "api/mobile/lesson" const val VULCAN_HEBE_ENDPOINT_MESSAGES = "api/mobile/message" 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 1d305a9e..16457989 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 @@ -28,6 +28,7 @@ const val ENDPOINT_VULCAN_HEBE_ADDRESSBOOK = 3010 const val ENDPOINT_VULCAN_HEBE_TIMETABLE = 3020 const val ENDPOINT_VULCAN_HEBE_EXAMS = 3030 const val ENDPOINT_VULCAN_HEBE_GRADES = 3040 +const val ENDPOINT_VULCAN_HEBE_GRADE_SUMMARY = 3050 const val ENDPOINT_VULCAN_HEBE_HOMEWORK = 3060 const val ENDPOINT_VULCAN_HEBE_ATTENDANCE = 3080 const val ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX = 3090 @@ -55,7 +56,8 @@ val VulcanFeatures = listOf( 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 + ENDPOINT_VULCAN_HEBE_GRADES to LOGIN_METHOD_VULCAN_HEBE, + ENDPOINT_VULCAN_HEBE_GRADE_SUMMARY to LOGIN_METHOD_VULCAN_HEBE ), listOf(LOGIN_METHOD_VULCAN_HEBE)), // homework Feature(LOGIN_TYPE_VULCAN, FEATURE_HOMEWORK, listOf( 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 0105abc2..f93d104d 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 @@ -168,6 +168,10 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) { data.startProgress(R.string.edziennik_progress_endpoint_grades) VulcanHebeGrades(data, lastSync, onSuccess) } + ENDPOINT_VULCAN_HEBE_GRADE_SUMMARY -> { + data.startProgress(R.string.edziennik_progress_endpoint_proposed_grades) + VulcanHebeGradeSummary(data, lastSync, onSuccess) + } ENDPOINT_VULCAN_HEBE_HOMEWORK -> { data.startProgress(R.string.edziennik_progress_endpoint_homework) VulcanHebeHomework(data, lastSync, onSuccess) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeGradeSummary.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeGradeSummary.kt new file mode 100644 index 00000000..e38ac393 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeGradeSummary.kt @@ -0,0 +1,88 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-22. + */ + +package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe + +import pl.szczodrzynski.edziennik.DAY +import pl.szczodrzynski.edziennik.data.api.VULCAN_HEBE_ENDPOINT_GRADE_SUMMARY +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_HEBE_GRADE_SUMMARY +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 pl.szczodrzynski.edziennik.getString +import pl.szczodrzynski.edziennik.utils.Utils + +class VulcanHebeGradeSummary( + override val data: DataVulcan, + override val lastSync: Long?, + val onSuccess: (endpointId: Int) -> Unit +) : VulcanHebe(data, lastSync) { + companion object { + const val TAG = "VulcanHebeGradeSummary" + } + + init { + val entries = mapOf( + "Entry_1" to + if (data.studentSemesterNumber == 1) + Grade.TYPE_SEMESTER1_PROPOSED + else Grade.TYPE_SEMESTER2_PROPOSED, + "Entry_2" to + if (data.studentSemesterNumber == 1) + Grade.TYPE_SEMESTER1_FINAL + else Grade.TYPE_SEMESTER2_FINAL + ) + + apiGetList( + TAG, + VULCAN_HEBE_ENDPOINT_GRADE_SUMMARY, + HebeFilterType.BY_PUPIL, + lastSync = lastSync + ) { list, _ -> + list.forEach { grade -> + val subjectId = getSubjectId(grade, "Subject") ?: return@forEach + val addedDate = getDateTime(grade, "DateModify") + + entries.onEach { (key, type) -> + val id = subjectId * -100 - type + val entry = grade.getString(key) ?: return@onEach + val value = Utils.getGradeValue(entry) + val color = Utils.getVulcanGradeColor(entry) + + val gradeObject = Grade( + profileId = profileId, + id = id, + name = entry, + type = type, + value = value, + weight = 0f, + color = color, + category = "", + description = null, + comment = null, + semester = data.studentSemesterNumber, + teacherId = -1, + subjectId = subjectId, + addedDate = addedDate + ) + + data.gradeList.add(gradeObject) + data.metadataList.add( + Metadata( + profileId, + Metadata.TYPE_GRADE, + id, + profile?.empty ?: true, + profile?.empty ?: true + ) + ) + } + } + + data.setSyncNext(ENDPOINT_VULCAN_HEBE_GRADE_SUMMARY, 1 * DAY) + onSuccess(ENDPOINT_VULCAN_HEBE_GRADE_SUMMARY) + } + } +} From 1eecd24d9181cdb47d5b6f4e3de94e435784857d Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Mon, 22 Feb 2021 22:39:33 +0100 Subject: [PATCH 08/39] [Vulcan/Hebe] Add getting notices. --- .../edziennik/data/api/Constants.kt | 1 + .../api/edziennik/vulcan/VulcanFeatures.kt | 4 + .../api/edziennik/vulcan/data/VulcanData.kt | 15 +++- .../api/edziennik/vulcan/data/VulcanHebe.kt | 43 ++++++++--- .../vulcan/data/hebe/VulcanHebeAttendance.kt | 6 -- .../vulcan/data/hebe/VulcanHebeNotices.kt | 77 +++++++++++++++++++ 6 files changed, 125 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeNotices.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 034b5972..b98c0f33 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 @@ -135,6 +135,7 @@ const val VULCAN_HEBE_ENDPOINT_EXAMS = "api/mobile/exam" const val VULCAN_HEBE_ENDPOINT_GRADES = "api/mobile/grade" const val VULCAN_HEBE_ENDPOINT_GRADE_SUMMARY = "api/mobile/grade/summary" const val VULCAN_HEBE_ENDPOINT_HOMEWORK = "api/mobile/homework" +const val VULCAN_HEBE_ENDPOINT_NOTICES = "api/mobile/note" const val VULCAN_HEBE_ENDPOINT_ATTENDANCE = "api/mobile/lesson" const val VULCAN_HEBE_ENDPOINT_MESSAGES = "api/mobile/message" const val VULCAN_HEBE_ENDPOINT_MESSAGES_STATUS = "api/mobile/message/status" 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 16457989..df231693 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 @@ -30,6 +30,7 @@ const val ENDPOINT_VULCAN_HEBE_EXAMS = 3030 const val ENDPOINT_VULCAN_HEBE_GRADES = 3040 const val ENDPOINT_VULCAN_HEBE_GRADE_SUMMARY = 3050 const val ENDPOINT_VULCAN_HEBE_HOMEWORK = 3060 +const val ENDPOINT_VULCAN_HEBE_NOTICES = 3070 const val ENDPOINT_VULCAN_HEBE_ATTENDANCE = 3080 const val ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX = 3090 const val ENDPOINT_VULCAN_HEBE_MESSAGES_SENT = 3100 @@ -70,6 +71,9 @@ val VulcanFeatures = listOf( Feature(LOGIN_TYPE_VULCAN, FEATURE_BEHAVIOUR, listOf( ENDPOINT_VULCAN_API_NOTICES to LOGIN_METHOD_VULCAN_API ), listOf(LOGIN_METHOD_VULCAN_API)), + Feature(LOGIN_TYPE_VULCAN, FEATURE_BEHAVIOUR, listOf( + ENDPOINT_VULCAN_HEBE_NOTICES to LOGIN_METHOD_VULCAN_HEBE + ), listOf(LOGIN_METHOD_VULCAN_HEBE)), // attendance Feature(LOGIN_TYPE_VULCAN, FEATURE_ATTENDANCE, listOf( ENDPOINT_VULCAN_API_ATTENDANCE 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 f93d104d..ddb5d8be 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 @@ -24,6 +24,9 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) { ENDPOINT_VULCAN_HEBE_MAIN, ENDPOINT_VULCAN_HEBE_ADDRESSBOOK, ENDPOINT_VULCAN_HEBE_TIMETABLE, + ENDPOINT_VULCAN_HEBE_EXAMS, + ENDPOINT_VULCAN_HEBE_HOMEWORK, + ENDPOINT_VULCAN_HEBE_NOTICES, ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX, ENDPOINT_VULCAN_HEBE_MESSAGES_SENT ) @@ -176,6 +179,14 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) { data.startProgress(R.string.edziennik_progress_endpoint_homework) VulcanHebeHomework(data, lastSync, onSuccess) } + ENDPOINT_VULCAN_HEBE_NOTICES -> { + data.startProgress(R.string.edziennik_progress_endpoint_notices) + VulcanHebeNotices(data, lastSync, onSuccess) + } + ENDPOINT_VULCAN_HEBE_ATTENDANCE -> { + data.startProgress(R.string.edziennik_progress_endpoint_attendance) + VulcanHebeAttendance(data, lastSync, onSuccess) + } ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX -> { data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox) VulcanHebeMessages(data, lastSync, onSuccess).getMessages(Message.TYPE_RECEIVED) @@ -184,10 +195,6 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) { data.startProgress(R.string.edziennik_progress_endpoint_messages_outbox) VulcanHebeMessages(data, lastSync, onSuccess).getMessages(Message.TYPE_SENT) } - ENDPOINT_VULCAN_HEBE_ATTENDANCE -> { - data.startProgress(R.string.edziennik_progress_endpoint_attendance) - VulcanHebeAttendance(data, lastSync, onSuccess) - } ENDPOINT_VULCAN_HEBE_LUCKY_NUMBER -> { data.startProgress(R.string.edziennik_progress_endpoint_lucky_number) VulcanHebeLuckyNumber(data, lastSync, onSuccess) 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 169c7e20..ba943388 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 @@ -46,7 +46,11 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) { val profile get() = data.profile - fun getDateTime(json: JsonObject?, key: String, default: Long = System.currentTimeMillis()): Long { + fun getDateTime( + json: JsonObject?, + key: String, + default: Long = System.currentTimeMillis() + ): Long { val date = json.getJsonObject(key) return date.getLong("Timestamp") ?: return default } @@ -146,6 +150,12 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) { 2 } + fun isCurrentYear(date: Date): Boolean { + return profile?.let { profile -> + return@let profile.dateSemester1Start >= date + } ?: false + } + inline fun apiRequest( tag: String, endpoint: String, @@ -197,7 +207,8 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) { val callback = object : JsonCallbackHandler() { override fun onSuccess(json: JsonObject?, response: Response?) { if (json == null) { - data.error(ApiError(TAG, ERROR_RESPONSE_EMPTY) + data.error( + ApiError(TAG, ERROR_RESPONSE_EMPTY) .withResponse(response) ) return @@ -205,9 +216,11 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) { val status = json.getJsonObject("Status") if (status?.getInt("Code") != 0) { - data.error(ApiError(tag, ERROR_VULCAN_HEBE_OTHER) - .withResponse(response) - .withApiResponse(json.toString())) + data.error( + ApiError(tag, ERROR_VULCAN_HEBE_OTHER) + .withResponse(response) + .withApiResponse(json.toString()) + ) } val envelope = if (json.get("Envelope").isJsonNull && null is T) @@ -217,9 +230,10 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) { JsonArray::class.java -> json.getJsonArray("Envelope") as T java.lang.Boolean::class.java -> json.getBoolean("Envelope") as T else -> { - data.error(ApiError(tag, ERROR_RESPONSE_EMPTY) - .withResponse(response) - .withApiResponse(json) + data.error( + ApiError(tag, ERROR_RESPONSE_EMPTY) + .withResponse(response) + .withApiResponse(json) ) return } @@ -228,7 +242,8 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) { try { onSuccess(envelope, response) } catch (e: Exception) { - data.error(ApiError(tag, EXCEPTION_VULCAN_HEBE_REQUEST) + data.error( + ApiError(tag, EXCEPTION_VULCAN_HEBE_REQUEST) .withResponse(response) .withThrowable(e) .withApiResponse(json) @@ -237,7 +252,8 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) { } override fun onFailure(response: Response?, throwable: Throwable?) { - data.error(ApiError(tag, ERROR_REQUEST_FAILURE) + data.error( + ApiError(tag, ERROR_REQUEST_FAILURE) .withResponse(response) .withThrowable(throwable) ) @@ -353,10 +369,15 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) { if (folder != null) query["folder"] = folder.toString() + val semester1Start = profile?.dateSemester1Start?.inMillis + query["lastId"] = "-2147483648" // don't ask, it's just Vulcan query["pageSize"] = "500" query["lastSyncDate"] = LocalDateTime - .ofInstant(Instant.ofEpochMilli(lastSync ?: 0), ZoneId.systemDefault()) + .ofInstant( + Instant.ofEpochMilli(lastSync ?: semester1Start ?: 0), + ZoneId.systemDefault() + ) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) apiGet(tag, url, query) { json: JsonArray, response -> diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAttendance.kt index 9e41bb6d..ec1ce6eb 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAttendance.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAttendance.kt @@ -25,16 +25,10 @@ class VulcanHebeAttendance( } init { - val semesterNumber = data.studentSemesterNumber - val startDate = profile?.getSemesterStart(semesterNumber) - val endDate = profile?.getSemesterEnd(semesterNumber) - apiGetList( TAG, VULCAN_HEBE_ENDPOINT_ATTENDANCE, HebeFilterType.BY_PUPIL, - dateFrom = startDate, - dateTo = endDate, lastSync = lastSync ) { list, _ -> list.forEach { attendance -> diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeNotices.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeNotices.kt new file mode 100644 index 00000000..d8c71e1d --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeNotices.kt @@ -0,0 +1,77 @@ +/* + * Copyright (c) Kacper Ziubryniewicz 2021-2-22 + */ + +package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe + +import pl.szczodrzynski.edziennik.* +import pl.szczodrzynski.edziennik.data.api.VULCAN_HEBE_ENDPOINT_NOTICES +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_HEBE_NOTICES +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanHebe +import pl.szczodrzynski.edziennik.data.db.entity.Metadata +import pl.szczodrzynski.edziennik.data.db.entity.Notice +import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS + +class VulcanHebeNotices( + override val data: DataVulcan, + override val lastSync: Long?, + val onSuccess: (endpointId: Int) -> Unit +) : VulcanHebe(data, lastSync) { + + companion object { + const val TAG = "VulcanHebeNotices" + } + + init { + apiGetList( + VulcanHebeAttendance.TAG, + VULCAN_HEBE_ENDPOINT_NOTICES, + HebeFilterType.BY_PUPIL, + lastSync = lastSync + ) { list, _ -> + list.forEach { notice -> + val id = notice.getLong("Id") ?: return@forEach + val type = when (notice.getBoolean("Positive")) { + true -> Notice.TYPE_POSITIVE + else -> Notice.TYPE_NEUTRAL + } + val date = getDate(notice, "DateValid") ?: return@forEach + val semester = profile?.dateToSemester(date) ?: return@forEach + val text = notice.getString("Content") ?: "" + val category = notice.getJsonObject("Category")?.getString("Name") + val points = notice.getFloat("Points") + val teacherId = getTeacherId(notice, "Creator") ?: -1 + val addedDate = getDateTime(notice, "DateModify") + + if (!isCurrentYear(date)) return@forEach + + val noticeObject = Notice( + profileId = profileId, + id = id, + type = type, + semester = semester, + text = text, + category = category, + points = points, + teacherId = teacherId, + addedDate = addedDate + ) + + data.noticeList.add(noticeObject) + data.metadataList.add( + Metadata( + profileId, + Metadata.TYPE_NOTICE, + id, + profile?.empty ?: true, + profile?.empty ?: true + ) + ) + } + + data.setSyncNext(ENDPOINT_VULCAN_HEBE_NOTICES, SYNC_ALWAYS) + onSuccess(ENDPOINT_VULCAN_HEBE_NOTICES) + } + } +} From b599d679c4d76166f4f4cfebef183b6932b7b435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 22 Feb 2021 22:43:36 +0100 Subject: [PATCH 09/39] [Vulcan/Hebe] Implement sending messages. --- .../pl/szczodrzynski/edziennik/Extensions.kt | 6 ++ .../edziennik/data/api/Constants.kt | 1 + .../data/api/edziennik/vulcan/Vulcan.kt | 10 +++ .../vulcan/data/hebe/VulcanHebeSendMessage.kt | 82 +++++++++++++++++++ .../edziennik/data/db/entity/Teacher.kt | 4 + 5 files changed, 103 insertions(+) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeSendMessage.kt diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt index d4c6a2e0..a34f6af5 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt @@ -538,6 +538,12 @@ fun String.md5(): String { return BigInteger(1, md.digest(toByteArray())).toString(16).padStart(32, '0') } +fun String.sha1Hex(): String { + val md = MessageDigest.getInstance("SHA-1") + md.update(toByteArray()) + return md.digest().joinToString("") { "%02x".format(it) } +} + fun String.sha256(): ByteArray { val md = MessageDigest.getInstance("SHA-256") md.update(toByteArray()) 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 b98c0f33..f16c4f43 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 @@ -139,6 +139,7 @@ const val VULCAN_HEBE_ENDPOINT_NOTICES = "api/mobile/note" const val VULCAN_HEBE_ENDPOINT_ATTENDANCE = "api/mobile/lesson" const val VULCAN_HEBE_ENDPOINT_MESSAGES = "api/mobile/message" const val VULCAN_HEBE_ENDPOINT_MESSAGES_STATUS = "api/mobile/message/status" +const val VULCAN_HEBE_ENDPOINT_MESSAGES_SEND = "api/mobile/message" const val VULCAN_HEBE_ENDPOINT_LUCKY_NUMBER = "api/mobile/school/lucky" const val EDUDZIENNIK_USER_AGENT = "Szkolny.eu/${BuildConfig.VERSION_NAME}" diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt index 9dfc1572..d6c2c770 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt @@ -14,6 +14,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api.VulcanApiAt import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api.VulcanApiMessagesChangeStatus import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api.VulcanApiSendMessage import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.VulcanHebeMessagesChangeStatus +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.VulcanHebeSendMessage import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.firstlogin.VulcanFirstLogin import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLogin import pl.szczodrzynski.edziennik.data.api.events.AttachmentGetEvent @@ -135,6 +136,15 @@ class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, va } override fun sendMessage(recipients: List, subject: String, text: String) { + if (loginStore.mode != LOGIN_MODE_VULCAN_API) { + login(LOGIN_METHOD_VULCAN_HEBE) { + VulcanHebeSendMessage(data, recipients, subject, text) { + completed() + } + } + return + } + login(LOGIN_METHOD_VULCAN_API) { VulcanApiSendMessage(data, recipients, subject, text) { completed() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeSendMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeSendMessage.kt new file mode 100644 index 00000000..8f5f5afa --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeSendMessage.kt @@ -0,0 +1,82 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2021-2-22. + */ + +package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe + +import com.google.gson.JsonObject +import org.greenrobot.eventbus.EventBus +import pl.szczodrzynski.edziennik.* +import pl.szczodrzynski.edziennik.data.api.VULCAN_HEBE_ENDPOINT_MESSAGES_SEND +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan +import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanHebe +import pl.szczodrzynski.edziennik.data.api.events.MessageSentEvent +import pl.szczodrzynski.edziennik.data.db.entity.Message +import pl.szczodrzynski.edziennik.data.db.entity.Metadata +import pl.szczodrzynski.edziennik.data.db.entity.Teacher + +class VulcanHebeSendMessage( + override val data: DataVulcan, + val recipients: List, + val subject: String, + val text: String, + val onSuccess: () -> Unit +) : VulcanHebe(data, null) { + companion object { + const val TAG = "VulcanHebeSendMessage" + } + + init { + val recipientsArray = JsonArray() + recipients.forEach { teacher -> + recipientsArray += JsonObject( + "Address" to teacher.fullNameLastFirst, + "LoginId" to (teacher.loginId?.toIntOrNull() ?: return@forEach), + "Initials" to teacher.initialsLastFirst, + "AddressHash" to teacher.fullNameLastFirst.sha1Hex() + ) + } + + val senderName = (profile?.accountName ?: profile?.studentNameLong) + ?.swapFirstLastName() ?: "" + val sender = JsonObject( + "Address" to senderName, + "LoginId" to data.studentLoginId.toString(), + "Initials" to senderName.getNameInitials(), + "AddressHash" to senderName.sha1Hex() + ) + + apiPost( + TAG, + VULCAN_HEBE_ENDPOINT_MESSAGES_SEND, + payload = JsonObject( + "Status" to 1, + "Sender" to sender, + "DateSent" to null, + "DateRead" to null, + "Content" to text, + "Receiver" to recipientsArray, + "Id" to 0, + "Subject" to subject, + "Attachments" to null, + "Self" to null + ) + ) { json: JsonObject, _ -> + val messageId = json.getLong("Id") + + if (messageId == null) { + // TODO error + return@apiPost + } + + VulcanHebeMessages(data, null) { + val message = data.messageList.firstOrNull { it.type == Message.TYPE_SENT && it.subject == subject } + val metadata = data.metadataList.firstOrNull { it.thingType == Metadata.TYPE_MESSAGE && it.thingId == messageId } + val event = MessageSentEvent(data.profileId, message, message?.addedDate) + + EventBus.getDefault().postSticky(event) + onSuccess() + }.getMessages(Message.TYPE_SENT) + } + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Teacher.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Teacher.kt index 27431a4f..c41b8a7a 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Teacher.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Teacher.kt @@ -11,6 +11,7 @@ import androidx.room.Entity import androidx.room.Ignore import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.fixName +import pl.szczodrzynski.edziennik.getNameInitials import pl.szczodrzynski.edziennik.join import java.util.* @@ -180,6 +181,9 @@ open class Teacher { @delegate:Ignore val fullNameLastFirst by lazy { "$surname $name".fixName() } + @delegate:Ignore + val initialsLastFirst by lazy { fullNameLastFirst.getNameInitials() } + val shortName: String get() = (if (name == null || name?.length == 0) "" else name!![0].toString()) + "." + surname From 30aeb70647312d07e2998ce2f82a4be4727dd458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 22 Feb 2021 22:54:13 +0100 Subject: [PATCH 10/39] [Vulcan/Hebe] Add filtering data by current school year. --- .../edziennik/data/api/edziennik/vulcan/data/VulcanHebe.kt | 6 ++++++ .../data/api/edziennik/vulcan/data/hebe/VulcanHebeExams.kt | 2 ++ .../api/edziennik/vulcan/data/hebe/VulcanHebeHomework.kt | 2 ++ .../api/edziennik/vulcan/data/hebe/VulcanHebeMessages.kt | 2 ++ 4 files changed, 12 insertions(+) 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 ba943388..929a2230 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 @@ -156,6 +156,12 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) { } ?: false } + fun isCurrentYear(dateTime: Long): Boolean { + return profile?.let { profile -> + return@let profile.dateSemester1Start.inMillis >= dateTime + } ?: false + } + inline fun apiRequest( tag: String, endpoint: String, diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeExams.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeExams.kt index 52fbead2..64b52e2b 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeExams.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeExams.kt @@ -40,6 +40,8 @@ class VulcanHebeExams( ?: -1 val topic = exam.getString("Content")?.trim() ?: "" + if (!isCurrentYear(eventDate)) return@forEach + val lessonList = data.db.timetableDao().getAllForDateNow(profileId, eventDate) val startTime = lessonList.firstOrNull { it.subjectId == subjectId }?.startTime diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeHomework.kt index 2a746e71..fb6f2d6d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeHomework.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeHomework.kt @@ -38,6 +38,8 @@ class VulcanHebeHomework( val teamId = data.teamClass?.id ?: -1 val topic = exam.getString("Content")?.trim() ?: "" + if (!isCurrentYear(eventDate)) return@forEach + val lessonList = data.db.timetableDao().getAllForDateNow(profileId, eventDate) val startTime = lessonList.firstOrNull { it.subjectId == subjectId }?.startTime diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessages.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessages.kt index fcaa30eb..1e9a3b09 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessages.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessages.kt @@ -80,6 +80,8 @@ class VulcanHebeMessages( val sentDate = getDateTime(message, "DateSent") val readDate = getDateTime(message, "DateRead", default = 0) + if (!isCurrentYear(sentDate)) return@forEach + val messageObject = Message( profileId = profileId, id = id, From 97c5acd6ba7a6b3c24946f7e68f6d4a854f6707c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 22 Feb 2021 22:59:02 +0100 Subject: [PATCH 11/39] [Vulcan/Hebe] Fix checking for current year. --- .../edziennik/data/api/edziennik/vulcan/data/VulcanHebe.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 929a2230..ebbdb608 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 @@ -152,13 +152,13 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) { fun isCurrentYear(date: Date): Boolean { return profile?.let { profile -> - return@let profile.dateSemester1Start >= date + return@let date >= profile.dateSemester1Start } ?: false } fun isCurrentYear(dateTime: Long): Boolean { return profile?.let { profile -> - return@let profile.dateSemester1Start.inMillis >= dateTime + return@let dateTime >= profile.dateSemester1Start.inMillis } ?: false } From 0cf24c527bae3ad55a1c9fd763ef1ada222433c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 22 Feb 2021 23:04:10 +0100 Subject: [PATCH 12/39] [Vulcan/Hebe] Fix logging tag in notices class. --- .../data/api/edziennik/vulcan/data/hebe/VulcanHebeNotices.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeNotices.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeNotices.kt index d8c71e1d..5b67b272 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeNotices.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeNotices.kt @@ -25,7 +25,7 @@ class VulcanHebeNotices( init { apiGetList( - VulcanHebeAttendance.TAG, + TAG, VULCAN_HEBE_ENDPOINT_NOTICES, HebeFilterType.BY_PUPIL, lastSync = lastSync From 93e3d5994a534f3f518004e3c931aff1e1d47aba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 22 Feb 2021 23:20:32 +0100 Subject: [PATCH 13/39] [Vulcan/Hebe] Restore sending date range when getting attendance. --- .../api/edziennik/vulcan/data/hebe/VulcanHebeAttendance.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAttendance.kt index ec1ce6eb..9e41bb6d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAttendance.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeAttendance.kt @@ -25,10 +25,16 @@ class VulcanHebeAttendance( } init { + val semesterNumber = data.studentSemesterNumber + val startDate = profile?.getSemesterStart(semesterNumber) + val endDate = profile?.getSemesterEnd(semesterNumber) + apiGetList( TAG, VULCAN_HEBE_ENDPOINT_ATTENDANCE, HebeFilterType.BY_PUPIL, + dateFrom = startDate, + dateTo = endDate, lastSync = lastSync ) { list, _ -> list.forEach { attendance -> From 85ac5769a138181c66e1d39aff84d5da4aec5b6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 22 Feb 2021 23:25:44 +0100 Subject: [PATCH 14/39] [4.5.1-beta.1] Update build.gradle, signing and changelog. --- app/src/main/assets/pl-changelog.html | 7 ++++--- app/src/main/cpp/szkolny-signing.cpp | 2 +- .../edziennik/data/api/szkolny/interceptor/Signing.kt | 2 +- build.gradle | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/src/main/assets/pl-changelog.html b/app/src/main/assets/pl-changelog.html index f22c959b..1295333f 100644 --- a/app/src/main/assets/pl-changelog.html +++ b/app/src/main/assets/pl-changelog.html @@ -1,7 +1,8 @@ -

Wersja 4.5, 2021-02-21

+

Wersja 4.5.1-beta.1, 2021-02-22

    -
  • Vulcan: aplikacja Szkolny.eu zaktualizowana w związku z wygaszeniem aplikacji Dzienniczek+.
  • -
  • Mogą pojawić się brakujące funkcje, np. wysyłanie wiadomości - zostaną one wprowadzone w najbliższych dniach.
  • +
  • Vulcan: dodano wyświetlanie szczęśliwego numerka.
  • +
  • Vulcan: przywrócono uwagi oraz wysyłanie wiadomości.
  • +
  • Vulcan: usunięto wyświetlanie zadań domowych i sprawdzianów z poprzednich lat.


diff --git a/app/src/main/cpp/szkolny-signing.cpp b/app/src/main/cpp/szkolny-signing.cpp index 0176acf6..fc19fa9d 100644 --- a/app/src/main/cpp/szkolny-signing.cpp +++ b/app/src/main/cpp/szkolny-signing.cpp @@ -9,7 +9,7 @@ /*secret password - removed for source code publication*/ static toys AES_IV[16] = { - 0x4f, 0x43, 0x04, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + 0x42, 0xe5, 0x9a, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; unsigned char *agony(unsigned int laugh, unsigned char *box, unsigned char *heat); diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt index c6d7ac07..bef1bba8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt @@ -46,6 +46,6 @@ object Signing { /*fun provideKey(param1: String, param2: Long): ByteArray {*/ fun pleaseStopRightNow(param1: String, param2: Long): ByteArray { - return "$param1.MTIzNDU2Nzg5MD5LwH9bSc===.$param2".sha256() + return "$param1.MTIzNDU2Nzg5MD8+8LPFtX===.$param2".sha256() } } diff --git a/build.gradle b/build.gradle index c1279034..4d4c3e4e 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,8 @@ buildscript { kotlin_version = '1.4.30' release = [ - versionName: "4.5", - versionCode: 4050099 + versionName: "4.5.1-beta.1", + versionCode: 4050101 ] setup = [ From 3e8b3de2b7cd4306d8cf2b96685a57b08bdfb33e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Tue, 23 Feb 2021 12:00:01 +0100 Subject: [PATCH 15/39] [Vulcan/Web] Move web data to loginStore per-symbol. --- .../data/api/edziennik/vulcan/DataVulcan.kt | 31 +++++++++---------- .../edziennik/vulcan/data/VulcanWebMain.kt | 26 ++++++++++------ 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/DataVulcan.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/DataVulcan.kt index 90ba3dd6..b822f660 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/DataVulcan.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/DataVulcan.kt @@ -16,12 +16,11 @@ import pl.szczodrzynski.edziennik.data.db.entity.Team import pl.szczodrzynski.edziennik.utils.Utils class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app, profile, loginStore) { - - fun isWebMainLoginValid() = webExpiryTime-30 > currentTimeUnix() - && webAuthCookie.isNotNullNorEmpty() + fun isWebMainLoginValid() = symbol.isNotNullNorEmpty() + && (webExpiryTime[symbol] ?: 0) - 30 > currentTimeUnix() + && webAuthCookie[symbol].isNotNullNorEmpty() && webHost.isNotNullNorEmpty() && webType.isNotNullNorEmpty() - && symbol.isNotNullNorEmpty() fun isApiLoginValid() = currentSemesterEndDate-30 > currentTimeUnix() && apiFingerprint[symbol].isNotNullNorEmpty() && apiPrivateKey[symbol].isNotNullNorEmpty() @@ -359,24 +358,24 @@ class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app * If the time passes, the certificate needs to be POSTed again (if valid) * or re-generated. */ - var webExpiryTime: Long - get() { mWebExpiryTime = mWebExpiryTime ?: profile?.getStudentData("webExpiryTime", 0L); return mWebExpiryTime ?: 0L } - set(value) { profile?.putStudentData("webExpiryTime", value); mWebExpiryTime = value } - private var mWebExpiryTime: Long? = null + var webExpiryTime: Map = mapOf() + get() { mWebExpiryTime = mWebExpiryTime ?: loginStore.getLoginData("webExpiryTime", null)?.let { app.gson.fromJson(it, field.toMutableMap()::class.java) }; return mWebExpiryTime ?: mapOf() } + set(value) { loginStore.putLoginData("webExpiryTime", app.gson.toJson(value)); mWebExpiryTime = value } + private var mWebExpiryTime: Map? = null /** * EfebSsoAuthCookie retrieved after posting a certificate */ - var webAuthCookie: String? - get() { mWebAuthCookie = mWebAuthCookie ?: profile?.getStudentData("webAuthCookie", null); return mWebAuthCookie } - set(value) { profile?.putStudentData("webAuthCookie", value); mWebAuthCookie = value } - private var mWebAuthCookie: String? = null + var webAuthCookie: Map = mapOf() + get() { mWebAuthCookie = mWebAuthCookie ?: loginStore.getLoginData("webAuthCookie", null)?.let { app.gson.fromJson(it, field.toMutableMap()::class.java) }; return mWebAuthCookie ?: mapOf() } + set(value) { loginStore.putLoginData("webAuthCookie", app.gson.toJson(value)); mWebAuthCookie = value } + private var mWebAuthCookie: Map? = null /** * Permissions needed to get JSONs from home page */ - var webPermissions: String? - get() { mWebPermissions = mWebPermissions ?: profile?.getStudentData("webPermissions", null); return mWebPermissions } - set(value) { profile?.putStudentData("webPermissions", value); mWebPermissions = value } - private var mWebPermissions: String? = null + var webPermissions: Map = mapOf() + get() { mWebPermissions = mWebPermissions ?: loginStore.getLoginData("webPermissions", null)?.let { app.gson.fromJson(it, field.toMutableMap()::class.java) }; return mWebPermissions ?: mapOf() } + set(value) { loginStore.putLoginData("webPermissions", app.gson.toJson(value)); mWebPermissions = value } + private var mWebPermissions: Map? = null } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt index 5d51839e..309aec70 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt @@ -83,10 +83,12 @@ open class VulcanWebMain(open val data: DataVulcan, open val lastSync: Long?) { onResult(symbol, STATE_NO_REGISTER) return } - if (!validateCallback(text, response, jsonResponse = false)) { + if (!validateCallback(symbol, text, response, jsonResponse = false)) { return } - data.webExpiryTime = Date.fromIso(certificate.expiryDate) / 1000L + data.webExpiryTime = data.webExpiryTime.toMutableMap().also { map -> + map[symbol] = Date.fromIso(certificate.expiryDate) / 1000L + } onResult(symbol, STATE_SUCCESS) } @@ -120,7 +122,7 @@ open class VulcanWebMain(open val data: DataVulcan, open val lastSync: Long?) { fun getStartPage(symbol: String = data.symbol ?: "default", postErrors: Boolean = true, onSuccess: (html: String, schoolSymbols: List) -> Unit) { val callback = object : TextCallbackHandler() { override fun onSuccess(text: String?, response: Response?) { - if (!validateCallback(text, response, jsonResponse = false) || text == null) { + if (!validateCallback(symbol, text, response, jsonResponse = false) || text == null) { return } @@ -136,7 +138,9 @@ open class VulcanWebMain(open val data: DataVulcan, open val lastSync: Long?) { } } - data.webPermissions = Regexes.VULCAN_WEB_PERMISSIONS.find(text)?.let { it[1] } + data.webPermissions = data.webPermissions.toMutableMap().also { map -> + map[symbol] = Regexes.VULCAN_WEB_PERMISSIONS.find(text)?.let { it[1] } + } val schoolSymbols = mutableListOf() val clientUrl = "://uonetplus-uczen.${data.webHost}/$symbol/" @@ -186,7 +190,7 @@ open class VulcanWebMain(open val data: DataVulcan, open val lastSync: Long?) { .enqueue() } - private fun validateCallback(text: String?, response: Response?, jsonResponse: Boolean = true): Boolean { + private fun validateCallback(symbol: String, text: String?, response: Response?, jsonResponse: Boolean = true): Boolean { if (text == null) { data.error(ApiError(TAG, ERROR_RESPONSE_EMPTY) .withResponse(response)) @@ -207,11 +211,13 @@ open class VulcanWebMain(open val data: DataVulcan, open val lastSync: Long?) { val cookies = data.app.cookieJar.getAll(data.webHost ?: "vulcan.net.pl") val authCookie = cookies["EfebSsoAuthCookie"] - if ((authCookie == null || authCookie == "null") && data.webAuthCookie != null) { - data.app.cookieJar.set(data.webHost ?: "vulcan.net.pl", "EfebSsoAuthCookie", data.webAuthCookie) + if ((authCookie == null || authCookie == "null") && data.webAuthCookie[symbol] != null) { + data.app.cookieJar.set(data.webHost ?: "vulcan.net.pl", "EfebSsoAuthCookie", data.webAuthCookie[symbol]) } - else if (authCookie.isNotNullNorBlank() && authCookie != "null" && authCookie != data.webAuthCookie) { - data.webAuthCookie = authCookie + else if (authCookie.isNotNullNorBlank() && authCookie != "null" && authCookie != data.webAuthCookie[symbol]) { + data.webAuthCookie = data.webAuthCookie.toMutableMap().also { map -> + map[symbol] = authCookie + } } return true } @@ -250,7 +256,7 @@ open class VulcanWebMain(open val data: DataVulcan, open val lastSync: Long?) { val callback = object : TextCallbackHandler() { override fun onSuccess(text: String?, response: Response?) { - if (!validateCallback(text, response)) + if (!validateCallback(data.symbol ?: "default", text, response)) return try { From 66444ae35bad17f1d993564d2dec1f5f5b6839f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Tue, 23 Feb 2021 12:47:20 +0100 Subject: [PATCH 16/39] [Vulcan/Web] Fix extracting permissions string. --- .../main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt index 919131f0..5d847e3f 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt @@ -156,7 +156,7 @@ object Regexes { """\(przeniesiona (z|na) lekcj[ię] ([0-9]+), (.+)\)""".toRegex() } val VULCAN_WEB_PERMISSIONS by lazy { - """permissions: '([A-z0-9/=+\-_]+?)'""".toRegex() + """permissions: '([A-z0-9/=+\-_|]+?)'""".toRegex() } val VULCAN_WEB_SYMBOL_VALIDATE by lazy { """[A-z0-9]+""".toRegex(IGNORE_CASE) From 9da6dbccb38f917687b03d46534fe8667b404ff5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Tue, 23 Feb 2021 12:47:52 +0100 Subject: [PATCH 17/39] [Vulcan/Web] Fix registering mobile device. --- .../edziennik/vulcan/data/VulcanWebMain.kt | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt index 309aec70..f49e99c7 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt @@ -11,12 +11,11 @@ import im.wangchao.mhttp.Request import im.wangchao.mhttp.Response import im.wangchao.mhttp.callback.TextCallbackHandler import pl.droidsonroids.jspoon.Jspoon +import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.data.api.* import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.CufsCertificate import pl.szczodrzynski.edziennik.data.api.models.ApiError -import pl.szczodrzynski.edziennik.get -import pl.szczodrzynski.edziennik.isNotNullNorBlank import pl.szczodrzynski.edziennik.utils.Utils import pl.szczodrzynski.edziennik.utils.models.Date import java.io.File @@ -139,7 +138,28 @@ open class VulcanWebMain(open val data: DataVulcan, open val lastSync: Long?) { } data.webPermissions = data.webPermissions.toMutableMap().also { map -> - map[symbol] = Regexes.VULCAN_WEB_PERMISSIONS.find(text)?.let { it[1] } + val permissions = Regexes.VULCAN_WEB_PERMISSIONS.find(text)?.let { it[1] } + if (permissions?.isNotBlank() == true) { + val studentId = permissions.split("|") + .getOrNull(0) + ?.base64DecodeToString() + ?.toJsonObject() + ?.getJsonArray("AuthInfos") + ?.asJsonObjectList() + ?.flatMap { authInfo -> + authInfo.getJsonArray("UczenIds") + ?.map { it.asInt } + ?: listOf() + } + ?.firstOrNull() + ?.toString() + data.app.cookieJar.set( + data.webHost ?: "vulcan.net.pl", + "idBiezacyUczen", + studentId + ) + } + map[symbol] = permissions } val schoolSymbols = mutableListOf() From b75ab76c2ad621b27c1f034acb1bee6adc0e7648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Tue, 23 Feb 2021 12:48:17 +0100 Subject: [PATCH 18/39] [Vulcan/Web] Fix checking login expiry time. --- .../edziennik/data/api/edziennik/vulcan/DataVulcan.kt | 6 +++--- .../data/api/edziennik/vulcan/data/VulcanWebMain.kt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/DataVulcan.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/DataVulcan.kt index b822f660..649991d6 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/DataVulcan.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/DataVulcan.kt @@ -17,7 +17,7 @@ import pl.szczodrzynski.edziennik.utils.Utils class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app, profile, loginStore) { fun isWebMainLoginValid() = symbol.isNotNullNorEmpty() - && (webExpiryTime[symbol] ?: 0) - 30 > currentTimeUnix() + && (webExpiryTime[symbol]?.toLongOrNull() ?: 0) - 30 > currentTimeUnix() && webAuthCookie[symbol].isNotNullNorEmpty() && webHost.isNotNullNorEmpty() && webType.isNotNullNorEmpty() @@ -358,10 +358,10 @@ class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app * If the time passes, the certificate needs to be POSTed again (if valid) * or re-generated. */ - var webExpiryTime: Map = mapOf() + var webExpiryTime: Map = mapOf() get() { mWebExpiryTime = mWebExpiryTime ?: loginStore.getLoginData("webExpiryTime", null)?.let { app.gson.fromJson(it, field.toMutableMap()::class.java) }; return mWebExpiryTime ?: mapOf() } set(value) { loginStore.putLoginData("webExpiryTime", app.gson.toJson(value)); mWebExpiryTime = value } - private var mWebExpiryTime: Map? = null + private var mWebExpiryTime: Map? = null /** * EfebSsoAuthCookie retrieved after posting a certificate diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt index f49e99c7..3cd52394 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt @@ -86,7 +86,7 @@ open class VulcanWebMain(open val data: DataVulcan, open val lastSync: Long?) { return } data.webExpiryTime = data.webExpiryTime.toMutableMap().also { map -> - map[symbol] = Date.fromIso(certificate.expiryDate) / 1000L + map[symbol] = (Date.fromIso(certificate.expiryDate) / 1000L).toString() } onResult(symbol, STATE_SUCCESS) } From 4c081c970e3148cd2a62a6f8b8c2db93ad98671b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Tue, 23 Feb 2021 12:50:37 +0100 Subject: [PATCH 19/39] [Vulcan/Hebe] Exclude more endpoints from first semester sync. --- .../edziennik/data/api/edziennik/vulcan/data/VulcanData.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 ddb5d8be..48c12836 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 @@ -22,13 +22,15 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) { private var firstSemesterSync = false private val firstSemesterSyncExclude = listOf( ENDPOINT_VULCAN_HEBE_MAIN, + ENDPOINT_VULCAN_HEBE_PUSH_CONFIG, ENDPOINT_VULCAN_HEBE_ADDRESSBOOK, ENDPOINT_VULCAN_HEBE_TIMETABLE, ENDPOINT_VULCAN_HEBE_EXAMS, ENDPOINT_VULCAN_HEBE_HOMEWORK, ENDPOINT_VULCAN_HEBE_NOTICES, ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX, - ENDPOINT_VULCAN_HEBE_MESSAGES_SENT + ENDPOINT_VULCAN_HEBE_MESSAGES_SENT, + ENDPOINT_VULCAN_HEBE_LUCKY_NUMBER ) init { run { From a939d95ea31f98b5abdb5e34b9dda22e99cb053e Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Wed, 24 Feb 2021 21:18:35 +0100 Subject: [PATCH 20/39] [Vulcan/Hebe] Add getting attachments in messages. --- .../vulcan/data/hebe/VulcanHebeMessages.kt | 18 ++++++++++++++++++ .../ui/modules/views/AttachmentsView.kt | 18 ++++++++++-------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessages.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessages.kt index 1e9a3b09..eb4091e0 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessages.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/hebe/VulcanHebeMessages.kt @@ -17,6 +17,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.* import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_DELETED import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_RECEIVED import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_SENT +import pl.szczodrzynski.edziennik.utils.Utils import pl.szczodrzynski.navlib.crc16 import kotlin.text.replace @@ -110,6 +111,23 @@ class VulcanHebeMessages( data.messageRecipientList.add(messageRecipientObject) } + val attachments = message.getJsonArray("Attachments") + ?.asJsonObjectList() + ?: return@forEach + + for (attachment in attachments) { + val fileName = attachment.getString("Name") ?: continue + val url = attachment.getString("Link") ?: continue + val attachmentName = "$fileName:$url" + val attachmentId = Utils.crc32(attachmentName.toByteArray()) + + messageObject.addAttachment( + id = attachmentId, + name = attachmentName, + size = -1 + ) + } + data.messageList.add(messageObject) data.setSeenMetadataList.add( Metadata( diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/views/AttachmentsView.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/views/AttachmentsView.kt index 482ab847..354a8921 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/views/AttachmentsView.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/views/AttachmentsView.kt @@ -121,19 +121,21 @@ class AttachmentsView @JvmOverloads constructor( // open file by name, or first part before ':' (Vulcan OneDrive) Utils.openFile(context, File(Utils.getStorageDir(), attachment.name.substringBefore(":"))) return - } + } else if (attachment.name.contains(":")) { + Utils.openUrl(context, attachment.name.substringAfter(":")) + } else { + attachment.isDownloading = true + (adapter as? AttachmentAdapter)?.let { + it.notifyItemChanged(it.items.indexOf(attachment)) + } - attachment.isDownloading = true - (adapter as? AttachmentAdapter)?.let { - it.notifyItemChanged(it.items.indexOf(attachment)) - } - - EdziennikTask.attachmentGet( + EdziennikTask.attachmentGet( attachment.profileId, attachment.owner, attachment.id, attachment.name - ).enqueue(context) + ).enqueue(context) + } } private val lastUpdate: Long = 0 From a5bb7d9c6e46377224b743bda4a00b61ada16bfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Wed, 24 Feb 2021 21:53:59 +0100 Subject: [PATCH 21/39] [Lab] Add option to full sync and clear profile. --- .../ui/dialogs/settings/ProfileRemoveDialog.kt | 14 +++++++++----- .../ui/modules/debug/LabPageFragment.kt | 10 ++++++++++ .../modules/settings/SettingsNewFragment.java | 2 +- app/src/main/res/layout/lab_fragment.xml | 17 +++++++++++++++++ 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/settings/ProfileRemoveDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/settings/ProfileRemoveDialog.kt index 14321317..1fa16230 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/settings/ProfileRemoveDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/settings/ProfileRemoveDialog.kt @@ -17,7 +17,8 @@ import kotlin.coroutines.CoroutineContext class ProfileRemoveDialog( val activity: MainActivity, val profileId: Int, - val profileName: String + val profileName: String, + val noProfileRemoval: Boolean = false ) : CoroutineScope { companion object { private const val TAG = "ProfileRemoveDialog" @@ -52,7 +53,6 @@ class ProfileRemoveDialog( app.db.attendanceDao().clear(profileId) app.db.attendanceTypeDao().clear(profileId) app.db.classroomDao().clear(profileId) - app.db.configDao().clear(profileId) app.db.endpointTimerDao().clear(profileId) app.db.eventDao().clear(profileId) app.db.eventTypeDao().clear(profileId) @@ -65,23 +65,27 @@ class ProfileRemoveDialog( app.db.messageRecipientDao().clear(profileId) app.db.noticeDao().clear(profileId) app.db.noticeTypeDao().clear(profileId) - app.db.noticeTypeDao().clear(profileId) app.db.notificationDao().clear(profileId) app.db.subjectDao().clear(profileId) app.db.teacherAbsenceDao().clear(profileId) - app.db.teacherAbsenceDao().clear(profileId) app.db.teacherAbsenceTypeDao().clear(profileId) app.db.teacherDao().clear(profileId) app.db.teamDao().clear(profileId) app.db.timetableDao().clear(profileId) + app.db.metadataDao().deleteAll(profileId) + + if (noProfileRemoval) + return@async + + app.db.configDao().clear(profileId) + val loginStoreId = profileObject.loginStoreId val profilesUsingLoginStore = app.db.profileDao().getIdsByLoginStoreIdNow(loginStoreId) if (profilesUsingLoginStore.size == 1) { app.db.loginStoreDao().remove(loginStoreId) } app.db.profileDao().remove(profileId) - app.db.metadataDao().deleteAll(profileId) if (App.profileId == profileId) { app.profileLoadLast { } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/debug/LabPageFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/debug/LabPageFragment.kt index c6fbcbc6..29a0b2b3 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/debug/LabPageFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/debug/LabPageFragment.kt @@ -16,6 +16,7 @@ import kotlinx.coroutines.launch import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.data.db.entity.Event import pl.szczodrzynski.edziennik.databinding.LabFragmentBinding +import pl.szczodrzynski.edziennik.ui.dialogs.settings.ProfileRemoveDialog import pl.szczodrzynski.edziennik.ui.modules.base.lazypager.LazyFragment import pl.szczodrzynski.edziennik.utils.TextInputDropDown import pl.szczodrzynski.fslogin.decode @@ -60,6 +61,15 @@ class LabPageFragment : LazyFragment(), CoroutineScope { b.rodo.onClick { app.db.teacherDao().query(SimpleSQLiteQuery("UPDATE teachers SET teacherSurname = \"\" WHERE profileId = ${App.profileId}")) } + + b.fullSync.onClick { + app.db.query(SimpleSQLiteQuery("UPDATE profiles SET empty = 1 WHERE profileId = ${App.profileId}")) + app.db.query(SimpleSQLiteQuery("DELETE FROM endpointTimers WHERE profileId = ${App.profileId}")) + } + + b.clearProfile.onClick { + ProfileRemoveDialog(activity, App.profileId, "FAKE", noProfileRemoval = true) + } b.removeHomework.onClick { app.db.eventDao().getRawNow("UPDATE events SET homeworkBody = NULL WHERE profileId = ${App.profileId}") diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java index 551efd01..555bc3fd 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java @@ -258,7 +258,7 @@ public class SettingsNewFragment extends MaterialAboutFragment { .color(IconicsColor.colorInt(iconColor)) ) .setOnClickAction(() -> { - new ProfileRemoveDialog(activity, app.getProfile().getId(), app.getProfile().getName()); + new ProfileRemoveDialog(activity, app.getProfile().getId(), app.getProfile().getName(), false); }) ); diff --git a/app/src/main/res/layout/lab_fragment.xml b/app/src/main/res/layout/lab_fragment.xml index 356c11c0..8152f917 100644 --- a/app/src/main/res/layout/lab_fragment.xml +++ b/app/src/main/res/layout/lab_fragment.xml @@ -45,6 +45,22 @@ android:text="Set last 10 as unseen" android:textAllCaps="false" /> +