diff --git a/app/build.gradle b/app/build.gradle index b6bab7f2..880d6f0f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -183,7 +183,6 @@ dependencies { //implementation "org.redundent:kotlin-xml-builder:1.5.3" - implementation "io.github.wulkanowy:signer-android:0.1.1" implementation 'com.github.wulkanowy.uonet-request-signer:hebe-jvm:a99ca50a31' implementation "androidx.work:work-runtime-ktx:${versions.work}" 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 f16c4f43..f06ef354 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 @@ -90,11 +90,6 @@ const val IDZIENNIK_API_MESSAGES_SENT = "Wiadomosci/Wyslane" val MOBIDZIENNIK_USER_AGENT = SYSTEM_USER_AGENT -const val VULCAN_API_USER_AGENT = "MobileUserAgent" -const val VULCAN_API_APP_NAME = "VULCAN-Android-ModulUcznia" -const val VULCAN_API_APP_VERSION = "20.5.1.470" -const val VULCAN_API_PASSWORD = "CE75EA598C7743AD9B0B7328DED85B06" -const val VULCAN_API_PASSWORD_FAKELOG = "012345678901234567890123456789AB" const val VULCAN_HEBE_USER_AGENT = "Dart/2.10 (dart:io)" const val VULCAN_HEBE_APP_NAME = "DzienniczekPlus 2.0" const val VULCAN_HEBE_APP_VERSION = "21.02.09 (G)" @@ -106,23 +101,6 @@ val VULCAN_API_DEVICE_NAME by lazy { base.take(baseMaxLength) + VULCAN_API_DEVICE_NAME_SUFFIX } -const val VULCAN_API_ENDPOINT_CERTIFICATE = "mobile-api/Uczen.v3.UczenStart/Certyfikat" -const val VULCAN_API_ENDPOINT_STUDENT_LIST = "mobile-api/Uczen.v3.UczenStart/ListaUczniow" -const val VULCAN_API_ENDPOINT_DICTIONARIES = "mobile-api/Uczen.v3.Uczen/Slowniki" -const val VULCAN_API_ENDPOINT_TIMETABLE = "mobile-api/Uczen.v3.Uczen/PlanLekcjiZeZmianami" -const val VULCAN_API_ENDPOINT_GRADES = "mobile-api/Uczen.v3.Uczen/Oceny" -const val VULCAN_API_ENDPOINT_GRADES_PROPOSITIONS = "mobile-api/Uczen.v3.Uczen/OcenyPodsumowanie" -const val VULCAN_API_ENDPOINT_EVENTS = "mobile-api/Uczen.v3.Uczen/Sprawdziany" -const val VULCAN_API_ENDPOINT_HOMEWORK = "mobile-api/Uczen.v3.Uczen/ZadaniaDomowe" -const val VULCAN_API_ENDPOINT_NOTICES = "mobile-api/Uczen.v3.Uczen/UwagiUcznia" -const val VULCAN_API_ENDPOINT_ATTENDANCE = "mobile-api/Uczen.v3.Uczen/Frekwencje" -const val VULCAN_API_ENDPOINT_MESSAGES_RECEIVED = "mobile-api/Uczen.v3.Uczen/WiadomosciOdebrane" -const val VULCAN_API_ENDPOINT_MESSAGES_SENT = "mobile-api/Uczen.v3.Uczen/WiadomosciWyslane" -const val VULCAN_API_ENDPOINT_MESSAGES_CHANGE_STATUS = "mobile-api/Uczen.v3.Uczen/ZmienStatusWiadomosci" -const val VULCAN_API_ENDPOINT_MESSAGES_ADD = "mobile-api/Uczen.v3.Uczen/DodajWiadomosc" -const val VULCAN_API_ENDPOINT_PUSH = "mobile-api/Uczen.v3.Uczen/UstawPushToken" -const val VULCAN_API_ENDPOINT_MESSAGES_ATTACHMENTS = "mobile-api/Uczen.v3.Uczen/WiadomosciZalacznik" -const val VULCAN_API_ENDPOINT_HOMEWORK_ATTACHMENTS = "mobile-api/Uczen.v3.Uczen/ZadaniaDomoweZalacznik" 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" diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Errors.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Errors.kt index 74b0276f..d4227c2c 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Errors.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Errors.kt @@ -153,12 +153,7 @@ const val ERROR_LOGIN_VULCAN_INVALID_PIN_0_REMAINING = 310 const val ERROR_LOGIN_VULCAN_INVALID_PIN_1_REMAINING = 311 const val ERROR_LOGIN_VULCAN_INVALID_PIN_2_REMAINING = 312 const val ERROR_LOGIN_VULCAN_EXPIRED_TOKEN = 321 -const val ERROR_LOGIN_VULCAN_OTHER = 322 -const val ERROR_LOGIN_VULCAN_ONLY_KINDERGARTEN = 330 const val ERROR_LOGIN_VULCAN_NO_PUPILS = 331 -const val ERROR_VULCAN_API_MAINTENANCE = 340 -const val ERROR_VULCAN_API_BAD_REQUEST = 341 -const val ERROR_VULCAN_API_OTHER = 342 const val ERROR_VULCAN_ATTACHMENT_DOWNLOAD = 343 const val ERROR_VULCAN_WEB_DATA_MISSING = 344 const val ERROR_VULCAN_WEB_429 = 345 @@ -223,7 +218,6 @@ const val EXCEPTION_LIBRUS_PORTAL_SYNERGIA_TOKEN = 903 const val EXCEPTION_LIBRUS_API_REQUEST = 904 const val EXCEPTION_LIBRUS_SYNERGIA_REQUEST = 905 const val EXCEPTION_MOBIDZIENNIK_WEB_REQUEST = 906 -const val EXCEPTION_VULCAN_API_REQUEST = 907 const val EXCEPTION_MOBIDZIENNIK_WEB_FILE_REQUEST = 908 const val EXCEPTION_LIBRUS_MESSAGES_FILE_REQUEST = 909 const val EXCEPTION_NOTIFY = 910 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 aea07936..876cb73a 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 @@ -16,7 +16,6 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.login.Mobidzie import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.login.PodlasieLoginApi import pl.szczodrzynski.edziennik.data.api.edziennik.template.login.TemplateLoginApi import pl.szczodrzynski.edziennik.data.api.edziennik.template.login.TemplateLoginWeb -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginApi import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginHebe import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginWebMain import pl.szczodrzynski.edziennik.data.api.models.LoginMethod @@ -104,7 +103,6 @@ const val LOGIN_METHOD_VULCAN_WEB_MAIN = 100 const val LOGIN_METHOD_VULCAN_WEB_NEW = 200 const val LOGIN_METHOD_VULCAN_WEB_OLD = 300 const val LOGIN_METHOD_VULCAN_WEB_MESSAGES = 400 -const val LOGIN_METHOD_VULCAN_API = 500 const val LOGIN_METHOD_VULCAN_HEBE = 600 val vulcanLoginMethods = listOf( LoginMethod(LOGIN_TYPE_VULCAN, LOGIN_METHOD_VULCAN_WEB_MAIN, VulcanLoginWebMain::class.java) @@ -119,12 +117,6 @@ val vulcanLoginMethods = listOf( .withIsPossible { _, _ -> false } .withRequiredLoginMethod { _, _ -> LOGIN_METHOD_VULCAN_WEB_MAIN },*/ - LoginMethod(LOGIN_TYPE_VULCAN, LOGIN_METHOD_VULCAN_API, VulcanLoginApi::class.java) - .withIsPossible { _, loginStore -> - loginStore.mode == LOGIN_MODE_VULCAN_API - } - .withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED }, - LoginMethod(LOGIN_TYPE_VULCAN, LOGIN_METHOD_VULCAN_HEBE, VulcanLoginHebe::class.java) .withIsPossible { _, loginStore -> loginStore.mode != LOGIN_MODE_VULCAN_API 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 665943c6..55185745 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 @@ -5,16 +5,15 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan import com.google.gson.JsonObject -import pl.szczodrzynski.edziennik.* -import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_VULCAN_API +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.crc16 +import pl.szczodrzynski.edziennik.currentTimeUnix import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_VULCAN_HEBE import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_VULCAN_WEB_MAIN -import pl.szczodrzynski.edziennik.data.api.LOGIN_MODE_VULCAN_API import pl.szczodrzynski.edziennik.data.api.models.Data import pl.szczodrzynski.edziennik.data.db.entity.LoginStore import pl.szczodrzynski.edziennik.data.db.entity.Profile -import pl.szczodrzynski.edziennik.data.db.entity.Team -import pl.szczodrzynski.edziennik.utils.Utils +import pl.szczodrzynski.edziennik.isNotNullNorEmpty import pl.szczodrzynski.fslogin.realm.RealmData class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app, profile, loginStore) { @@ -22,10 +21,6 @@ class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app && (webExpiryTime[symbol]?.toLongOrNull() ?: 0) - 30 > currentTimeUnix() && webAuthCookie[symbol].isNotNullNorEmpty() && webRealmData != null - fun isApiLoginValid() = currentSemesterEndDate-30 > currentTimeUnix() - && apiFingerprint[symbol].isNotNullNorEmpty() - && apiPrivateKey[symbol].isNotNullNorEmpty() - && symbol.isNotNullNorEmpty() fun isHebeLoginValid() = hebePublicKey.isNotNullNorEmpty() && hebePrivateKey.isNotNullNorEmpty() && symbol.isNotNullNorEmpty() @@ -35,34 +30,11 @@ class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app if (isWebMainLoginValid()) { loginMethods += LOGIN_METHOD_VULCAN_WEB_MAIN } - if (isApiLoginValid()) { - loginMethods += LOGIN_METHOD_VULCAN_API - } if (isHebeLoginValid()) { loginMethods += LOGIN_METHOD_VULCAN_HEBE } } - init { - // during the first sync `profile.studentClassName` is already set - if (loginStore.mode == LOGIN_MODE_VULCAN_API - && teamList.values().none { it.type == Team.TYPE_CLASS }) { - profile?.studentClassName?.also { name -> - val id = Utils.crc16(name.toByteArray()).toLong() - - val teamObject = Team( - profileId, - id, - name, - Team.TYPE_CLASS, - "$schoolCode:$name", - -1 - ) - teamList.put(id, teamObject) - } - } - } - override fun generateUserCode() = "$schoolCode:$studentId" fun buildDeviceId(): String { @@ -224,16 +196,6 @@ class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app get() { mApiPin = mApiPin ?: loginStore.getLoginData("apiPin", null)?.let { app.gson.fromJson(it, field.toMutableMap()::class.java) }; return mApiPin ?: mapOf() } set(value) { loginStore.putLoginData("apiPin", app.gson.toJson(value)); mApiPin = value } - private var mApiFingerprint: Map? = null - var apiFingerprint: Map = mapOf() - get() { mApiFingerprint = mApiFingerprint ?: loginStore.getLoginData("apiFingerprint", null)?.let { app.gson.fromJson(it, field.toMutableMap()::class.java) }; return mApiFingerprint ?: mapOf() } - set(value) { loginStore.putLoginData("apiFingerprint", app.gson.toJson(value)); mApiFingerprint = value } - - private var mApiPrivateKey: Map? = null - var apiPrivateKey: Map = mapOf() - get() { mApiPrivateKey = mApiPrivateKey ?: loginStore.getLoginData("apiPrivateKey", null)?.let { app.gson.fromJson(it, field.toMutableMap()::class.java) }; return mApiPrivateKey ?: mapOf() } - set(value) { loginStore.putLoginData("apiPrivateKey", app.gson.toJson(value)); mApiPrivateKey = value } - /* _ _ _ _____ _____ | | | | | | /\ | __ \_ _| | |__| | ___| |__ ___ / \ | |__) || | 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 328450cb..d066aca0 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 @@ -10,9 +10,6 @@ import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.data.api.* import pl.szczodrzynski.edziennik.data.api.edziennik.helper.OneDriveDownloadAttachment import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanData -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api.VulcanApiAttachments -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 @@ -69,6 +66,11 @@ class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, va } private fun login(loginMethodId: Int? = null, afterLogin: (() -> Unit)? = null) { + if (data.loginStore.mode == LOGIN_MODE_VULCAN_API) { + data.error(TAG, ERROR_VULCAN_API_DEPRECATED) + return + } + d(TAG, "Trying to login with ${data.targetLoginMethodIds}") if (internalErrorList.isNotEmpty()) { d(TAG, " - Internal errors:") @@ -93,60 +95,21 @@ class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, va } override fun getMessage(message: MessageFull) { - if (loginStore.mode != LOGIN_MODE_VULCAN_API) { - login(LOGIN_METHOD_VULCAN_HEBE) { - if (message.seen) { - EventBus.getDefault().postSticky(MessageGetEvent(message)) - completed() - return@login - } - VulcanHebeMessagesChangeStatus(data, message) { - completed() - } - } - return - } - - login(LOGIN_METHOD_VULCAN_API) { - if (message.attachmentIds != null) { - VulcanApiMessagesChangeStatus(data, message) { - completed() - } + login(LOGIN_METHOD_VULCAN_HEBE) { + if (message.seen) { + EventBus.getDefault().postSticky(MessageGetEvent(message)) + completed() return@login } - val list = data.app.db.messageDao().getAllNow(data.profileId) - VulcanApiAttachments(data, list, message, MessageFull::class) { _ -> - list.forEach { - if (it.attachmentIds == null) - it.attachmentIds = mutableListOf() - data.messageList.add(it) - } - data.messageListReplace = true - - if (message.seen) { - EventBus.getDefault().postSticky(MessageGetEvent(message)) - completed() - return@VulcanApiAttachments - } - VulcanApiMessagesChangeStatus(data, message) { - completed() - } + VulcanHebeMessagesChangeStatus(data, message) { + completed() } } } 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) { + login(LOGIN_METHOD_VULCAN_HEBE) { + VulcanHebeSendMessage(data, recipients, subject, text) { completed() } } @@ -200,27 +163,10 @@ class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, va } override fun getEvent(eventFull: EventFull) { - if (loginStore.mode != LOGIN_MODE_VULCAN_API) { - eventFull.homeworkBody = "" + eventFull.homeworkBody = "" - EventBus.getDefault().postSticky(EventGetEvent(eventFull)) - completed() - return - } - - login(LOGIN_METHOD_VULCAN_API) { - val list = data.app.db.eventDao().getAllNow(data.profileId).filter { !it.addedManually } - VulcanApiAttachments(data, list, eventFull, EventFull::class) { _ -> - list.forEach { - it.homeworkBody = "" - data.eventList.add(it) - } - data.eventListReplace = true - - EventBus.getDefault().postSticky(EventGetEvent(eventFull)) - completed() - } - } + EventBus.getDefault().postSticky(EventGetEvent(eventFull)) + completed() } override fun firstLogin() { VulcanFirstLogin(data) { completed() } } 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 df231693..2e239a7e 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 @@ -7,19 +7,6 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan import pl.szczodrzynski.edziennik.data.api.* import pl.szczodrzynski.edziennik.data.api.models.Feature -const val ENDPOINT_VULCAN_API_UPDATE_SEMESTER = 1000 -const val ENDPOINT_VULCAN_API_PUSH_CONFIG = 1005 -const val ENDPOINT_VULCAN_API_DICTIONARIES = 1010 -const val ENDPOINT_VULCAN_API_TIMETABLE = 1020 -const val ENDPOINT_VULCAN_API_EVENTS = 1030 -const val ENDPOINT_VULCAN_API_GRADES = 1040 -const val ENDPOINT_VULCAN_API_GRADES_SUMMARY = 1050 -const val ENDPOINT_VULCAN_API_HOMEWORK = 1060 -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 @@ -38,56 +25,31 @@ const val ENDPOINT_VULCAN_HEBE_LUCKY_NUMBER = 3200 val VulcanFeatures = listOf( // timetable - Feature(LOGIN_TYPE_VULCAN, FEATURE_TIMETABLE, listOf( - ENDPOINT_VULCAN_API_TIMETABLE to LOGIN_METHOD_VULCAN_API - ), listOf(LOGIN_METHOD_VULCAN_API)), Feature(LOGIN_TYPE_VULCAN, FEATURE_TIMETABLE, listOf( ENDPOINT_VULCAN_HEBE_TIMETABLE to LOGIN_METHOD_VULCAN_HEBE ), listOf(LOGIN_METHOD_VULCAN_HEBE)), // agenda - Feature(LOGIN_TYPE_VULCAN, FEATURE_AGENDA, listOf( - ENDPOINT_VULCAN_API_EVENTS to LOGIN_METHOD_VULCAN_API - ), listOf(LOGIN_METHOD_VULCAN_API)), Feature(LOGIN_TYPE_VULCAN, FEATURE_AGENDA, listOf( ENDPOINT_VULCAN_HEBE_EXAMS to LOGIN_METHOD_VULCAN_HEBE ), listOf(LOGIN_METHOD_VULCAN_HEBE)), // grades - Feature(LOGIN_TYPE_VULCAN, FEATURE_GRADES, listOf( - ENDPOINT_VULCAN_API_GRADES to LOGIN_METHOD_VULCAN_API, - ENDPOINT_VULCAN_API_GRADES_SUMMARY to LOGIN_METHOD_VULCAN_API - ), listOf(LOGIN_METHOD_VULCAN_API)), Feature(LOGIN_TYPE_VULCAN, FEATURE_GRADES, listOf( ENDPOINT_VULCAN_HEBE_GRADES to LOGIN_METHOD_VULCAN_HEBE, ENDPOINT_VULCAN_HEBE_GRADE_SUMMARY to LOGIN_METHOD_VULCAN_HEBE ), listOf(LOGIN_METHOD_VULCAN_HEBE)), // homework - Feature(LOGIN_TYPE_VULCAN, FEATURE_HOMEWORK, listOf( - ENDPOINT_VULCAN_API_HOMEWORK to LOGIN_METHOD_VULCAN_API - ), listOf(LOGIN_METHOD_VULCAN_API)), Feature(LOGIN_TYPE_VULCAN, FEATURE_HOMEWORK, listOf( ENDPOINT_VULCAN_HEBE_HOMEWORK to LOGIN_METHOD_VULCAN_HEBE ), listOf(LOGIN_METHOD_VULCAN_HEBE)), // behaviour - 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 - ), listOf(LOGIN_METHOD_VULCAN_API)), Feature(LOGIN_TYPE_VULCAN, FEATURE_ATTENDANCE, listOf( ENDPOINT_VULCAN_HEBE_ATTENDANCE to LOGIN_METHOD_VULCAN_HEBE ), listOf(LOGIN_METHOD_VULCAN_HEBE)), // messages - Feature(LOGIN_TYPE_VULCAN, FEATURE_MESSAGES_INBOX, listOf( - ENDPOINT_VULCAN_API_MESSAGES_INBOX to LOGIN_METHOD_VULCAN_API - ), listOf(LOGIN_METHOD_VULCAN_API)), - Feature(LOGIN_TYPE_VULCAN, FEATURE_MESSAGES_SENT, listOf( - ENDPOINT_VULCAN_API_MESSAGES_SENT to LOGIN_METHOD_VULCAN_API - ), listOf(LOGIN_METHOD_VULCAN_API)), Feature(LOGIN_TYPE_VULCAN, FEATURE_MESSAGES_INBOX, listOf( ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX to LOGIN_METHOD_VULCAN_HEBE ), listOf(LOGIN_METHOD_VULCAN_HEBE)), @@ -96,11 +58,6 @@ val VulcanFeatures = listOf( ), listOf(LOGIN_METHOD_VULCAN_HEBE)), // push config - Feature(LOGIN_TYPE_VULCAN, FEATURE_PUSH_CONFIG, listOf( - ENDPOINT_VULCAN_API_PUSH_CONFIG to LOGIN_METHOD_VULCAN_API - ), 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 -> @@ -124,37 +81,8 @@ val VulcanFeatures = listOf( .withShouldSync { data -> data.shouldSyncLuckyNumber() } .withPriority(1), - Feature(LOGIN_TYPE_VULCAN, FEATURE_ALWAYS_NEEDED, listOf( - ENDPOINT_VULCAN_API_UPDATE_SEMESTER to LOGIN_METHOD_VULCAN_API, - ENDPOINT_VULCAN_API_DICTIONARIES to LOGIN_METHOD_VULCAN_API - ), listOf(LOGIN_METHOD_VULCAN_API)), Feature(LOGIN_TYPE_VULCAN, FEATURE_ALWAYS_NEEDED, listOf( ENDPOINT_VULCAN_HEBE_MAIN to LOGIN_METHOD_VULCAN_HEBE, ENDPOINT_VULCAN_HEBE_ADDRESSBOOK to LOGIN_METHOD_VULCAN_HEBE ), listOf(LOGIN_METHOD_VULCAN_HEBE)) - /*Feature(LOGIN_TYPE_VULCAN, FEATURE_STUDENT_INFO, listOf( - ENDPOINT_VULCAN_API to LOGIN_METHOD_VULCAN_WEB - ), listOf(LOGIN_METHOD_VULCAN_WEB)), - Feature(LOGIN_TYPE_VULCAN, FEATURE_STUDENT_NUMBER, listOf( - ENDPOINT_VULCAN_API to LOGIN_METHOD_VULCAN_WEB - ), listOf(LOGIN_METHOD_VULCAN_WEB)), - Feature(LOGIN_TYPE_VULCAN, FEATURE_SCHOOL_INFO, listOf( - ENDPOINT_VULCAN_API to LOGIN_METHOD_VULCAN_WEB - ), listOf(LOGIN_METHOD_VULCAN_WEB)), - Feature(LOGIN_TYPE_VULCAN, FEATURE_CLASS_INFO, listOf( - ENDPOINT_VULCAN_API to LOGIN_METHOD_VULCAN_WEB - ), listOf(LOGIN_METHOD_VULCAN_WEB)), - Feature(LOGIN_TYPE_VULCAN, FEATURE_TEAM_INFO, listOf( - ENDPOINT_VULCAN_API to LOGIN_METHOD_VULCAN_WEB - ), listOf(LOGIN_METHOD_VULCAN_WEB)), - Feature(LOGIN_TYPE_VULCAN, FEATURE_TEACHERS, listOf( - ENDPOINT_VULCAN_API to LOGIN_METHOD_VULCAN_WEB - ), listOf(LOGIN_METHOD_VULCAN_WEB)), - Feature(LOGIN_TYPE_VULCAN, FEATURE_SUBJECTS, listOf( - ENDPOINT_VULCAN_API to LOGIN_METHOD_VULCAN_WEB - ), listOf(LOGIN_METHOD_VULCAN_WEB)), - Feature(LOGIN_TYPE_VULCAN, FEATURE_CLASSROOMS, listOf( - ENDPOINT_VULCAN_API to LOGIN_METHOD_VULCAN_WEB - ), listOf(LOGIN_METHOD_VULCAN_WEB)),*/ - ) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanApi.kt deleted file mode 100644 index c500e3e7..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanApi.kt +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2019-10-19 - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data - -import com.google.gson.JsonArray -import com.google.gson.JsonObject -import im.wangchao.mhttp.Request -import im.wangchao.mhttp.Response -import im.wangchao.mhttp.callback.JsonCallbackHandler -import io.github.wulkanowy.signer.android.signContent -import pl.szczodrzynski.edziennik.data.api.* -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.models.ApiError -import pl.szczodrzynski.edziennik.utils.Utils.d -import java.net.HttpURLConnection -import java.util.* - -open class VulcanApi(open val data: DataVulcan, open val lastSync: Long?) { - companion object { - const val TAG = "VulcanApi" - } - - val profileId - get() = data.profile?.id ?: -1 - - val profile - get() = data.profile - - fun apiGet( - tag: String, - endpoint: String, - method: Int = POST, - parameters: Map = emptyMap(), - baseUrl: Boolean = false, - onSuccess: (json: JsonObject, response: Response?) -> Unit - ) { - val url = "${if (baseUrl) data.apiUrl else data.fullApiUrl}$endpoint" - - d(tag, "Request: Vulcan/Api - $url") - - val finalPayload = JsonObject() - parameters.map { (name, value) -> - when (value) { - is JsonObject -> finalPayload.add(name, value) - is JsonArray -> finalPayload.add(name, value) - is String -> finalPayload.addProperty(name, value) - is Int -> finalPayload.addProperty(name, value) - is Long -> finalPayload.addProperty(name, value) - is Float -> finalPayload.addProperty(name, value) - is Char -> finalPayload.addProperty(name, value) - is Boolean -> finalPayload.addProperty(name, value) - } - } - finalPayload.addProperty("RemoteMobileTimeKey", System.currentTimeMillis() / 1000) - finalPayload.addProperty("TimeKey", System.currentTimeMillis() / 1000 - 1) - finalPayload.addProperty("RequestId", UUID.randomUUID().toString()) - finalPayload.addProperty("RemoteMobileAppVersion", VULCAN_API_APP_VERSION) - finalPayload.addProperty("RemoteMobileAppName", VULCAN_API_APP_NAME) - - val callback = object : JsonCallbackHandler() { - override fun onSuccess(json: JsonObject?, response: Response?) { - if (json == null && response?.parserErrorBody == null) { - data.error(ApiError(TAG, ERROR_RESPONSE_EMPTY) - .withResponse(response)) - return - } - - if (response?.code() ?: 200 != 200) { - when (response?.code()) { - 503 -> ERROR_VULCAN_API_MAINTENANCE - 400 -> ERROR_VULCAN_API_BAD_REQUEST - else -> ERROR_VULCAN_API_OTHER - }.let { errorCode -> - data.error(ApiError(tag, errorCode) - .withResponse(response) - .withApiResponse(json?.toString() ?: response?.parserErrorBody)) - return - } - } - - if (json == null) { - data.error(ApiError(tag, ERROR_RESPONSE_EMPTY) - .withResponse(response)) - return - } - - try { - onSuccess(json, response) - } catch (e: Exception) { - data.error(ApiError(tag, EXCEPTION_VULCAN_API_REQUEST) - .withResponse(response) - .withThrowable(e) - .withApiResponse(json)) - } - } - - override fun onFailure(response: Response?, throwable: Throwable?) { - data.error(ApiError(tag, ERROR_REQUEST_FAILURE) - .withResponse(response) - .withThrowable(throwable)) - } - } - - Request.builder() - .url(url) - .userAgent(VULCAN_API_USER_AGENT) - .addHeader("RequestCertificateKey", data.apiFingerprint[data.symbol]) - .addHeader("RequestSignatureValue", - try { - signContent( - data.apiPrivateKey[data.symbol] ?: "", - finalPayload.toString() - ) - } catch (e: Exception) {e.printStackTrace();""}) - .apply { - when (method) { - GET -> get() - POST -> post() - } - } - .setJsonBody(finalPayload) - .allowErrorCode(HttpURLConnection.HTTP_BAD_REQUEST) - .allowErrorCode(HttpURLConnection.HTTP_FORBIDDEN) - .allowErrorCode(HttpURLConnection.HTTP_UNAUTHORIZED) - .allowErrorCode(HttpURLConnection.HTTP_UNAVAILABLE) - .callback(callback) - .build() - .enqueue() - } -} 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 48c12836..0724ca46 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 @@ -5,10 +5,7 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data import pl.szczodrzynski.edziennik.R -import pl.szczodrzynski.edziennik.data.api.ERROR_VULCAN_API_DEPRECATED -import pl.szczodrzynski.edziennik.data.api.LOGIN_MODE_VULCAN_API import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.* -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api.* import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.* import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.web.VulcanWebLuckyNumber import pl.szczodrzynski.edziennik.data.db.entity.Message @@ -33,11 +30,7 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) { ENDPOINT_VULCAN_HEBE_LUCKY_NUMBER ) - init { run { - if (data.loginStore.mode == LOGIN_MODE_VULCAN_API) { - data.error(TAG, ERROR_VULCAN_API_DEPRECATED) - return@run - } + init { if (data.studentSemesterNumber == 2 && data.profile?.empty != false) { firstSemesterSync = true // set to sync 1st semester first @@ -52,7 +45,7 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) { } onSuccess() } - }} + } private fun nextEndpoint(onSuccess: () -> Unit) { if (data.targetEndpointIds.isEmpty()) { @@ -88,54 +81,6 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) { private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) { Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync") when (endpointId) { - ENDPOINT_VULCAN_API_UPDATE_SEMESTER -> { - data.startProgress(R.string.edziennik_progress_endpoint_student_info) - VulcanApiUpdateSemester(data, lastSync, onSuccess) - } - ENDPOINT_VULCAN_API_PUSH_CONFIG -> { - data.startProgress(R.string.edziennik_progress_endpoint_push_config) - VulcanApiPushConfig(data, lastSync, onSuccess) - } - ENDPOINT_VULCAN_API_DICTIONARIES -> { - data.startProgress(R.string.edziennik_progress_endpoint_dictionaries) - VulcanApiDictionaries(data, lastSync, onSuccess) - } - ENDPOINT_VULCAN_API_GRADES -> { - data.startProgress(R.string.edziennik_progress_endpoint_grades) - VulcanApiGrades(data, lastSync, onSuccess) - } - ENDPOINT_VULCAN_API_GRADES_SUMMARY -> { - data.startProgress(R.string.edziennik_progress_endpoint_proposed_grades) - VulcanApiProposedGrades(data, lastSync, onSuccess) - } - ENDPOINT_VULCAN_API_EVENTS -> { - data.startProgress(R.string.edziennik_progress_endpoint_events) - VulcanApiEvents(data, isHomework = false, lastSync = lastSync, onSuccess = onSuccess) - } - ENDPOINT_VULCAN_API_HOMEWORK -> { - data.startProgress(R.string.edziennik_progress_endpoint_homework) - VulcanApiEvents(data, isHomework = true, lastSync = lastSync, onSuccess = onSuccess) - } - ENDPOINT_VULCAN_API_NOTICES -> { - data.startProgress(R.string.edziennik_progress_endpoint_notices) - VulcanApiNotices(data, lastSync, onSuccess) - } - ENDPOINT_VULCAN_API_ATTENDANCE -> { - data.startProgress(R.string.edziennik_progress_endpoint_attendance) - VulcanApiAttendance(data, lastSync, onSuccess) - } - ENDPOINT_VULCAN_API_TIMETABLE -> { - data.startProgress(R.string.edziennik_progress_endpoint_timetable) - VulcanApiTimetable(data, lastSync, onSuccess) - } - ENDPOINT_VULCAN_API_MESSAGES_INBOX -> { - data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox) - VulcanApiMessagesInbox(data, lastSync, onSuccess) - } - ENDPOINT_VULCAN_API_MESSAGES_SENT -> { - data.startProgress(R.string.edziennik_progress_endpoint_messages_outbox) - VulcanApiMessagesSent(data, lastSync, onSuccess) - } ENDPOINT_VULCAN_WEB_LUCKY_NUMBERS -> { data.startProgress(R.string.edziennik_progress_endpoint_lucky_number) VulcanWebLuckyNumber(data, lastSync, onSuccess) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttachments.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttachments.kt deleted file mode 100644 index a7b2b23b..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttachments.kt +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) Kuba Szczodrzyński 2020-4-6. - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import pl.szczodrzynski.edziennik.asJsonObjectList -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_HOMEWORK_ATTACHMENTS -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_MESSAGES_ATTACHMENTS -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi -import pl.szczodrzynski.edziennik.data.db.full.EventFull -import pl.szczodrzynski.edziennik.data.db.full.MessageFull -import pl.szczodrzynski.edziennik.getJsonArray -import pl.szczodrzynski.edziennik.getLong -import pl.szczodrzynski.edziennik.getString -import pl.szczodrzynski.edziennik.utils.models.Date -import kotlin.reflect.KClass - -class VulcanApiAttachments(override val data: DataVulcan, - val list: List<*>, - val owner: Any?, - val ownerClass: KClass<*>, - val onSuccess: (list: List<*>) -> Unit -) : VulcanApi(data, null) { - companion object { - const val TAG = "VulcanApiAttachments" - } - - init { run { - val endpoint = when (ownerClass) { - MessageFull::class -> VULCAN_API_ENDPOINT_MESSAGES_ATTACHMENTS - EventFull::class -> VULCAN_API_ENDPOINT_HOMEWORK_ATTACHMENTS - else -> null - } ?: return@run - - val idName = when (ownerClass) { - MessageFull::class -> "IdWiadomosc" - EventFull::class -> "IdZadanieDomowe" - else -> null - } ?: return@run - - val startDate = profile?.getSemesterStart(profile?.currentSemester ?: 1)?.inUnix ?: 0 - val endDate = Date.getToday().stepForward(0, 1, 0).inUnix - - apiGet(TAG, endpoint, parameters = mapOf( - "DataPoczatkowa" to startDate, - "DataKoncowa" to endDate, - "LoginId" to data.studentLoginId, - "IdUczen" to data.studentId - )) { json, _ -> - - json.getJsonArray("Data")?.asJsonObjectList()?.forEach { attachment -> - val id = attachment.getLong("Id") ?: return@forEach - val itemId = attachment.getLong(idName) ?: return@forEach - val url = attachment.getString("Url") ?: return@forEach - val fileName = "${attachment.getString("NazwaPliku")}:$url" - - list.forEach { - if (it is MessageFull - && it.profileId == profileId - && it.id == itemId - && it.attachmentIds?.contains(id) != true) { - if (it.attachmentIds == null) - it.attachmentIds = mutableListOf() - if (it.attachmentNames == null) - it.attachmentNames = mutableListOf() - it.attachmentIds?.add(id) - it.attachmentNames?.add(fileName) - } - - if (it is EventFull - && it.profileId == profileId - && it.id == itemId - && it.attachmentIds?.contains(id) != true) { - if (it.attachmentIds == null) - it.attachmentIds = mutableListOf() - if (it.attachmentNames == null) - it.attachmentNames = mutableListOf() - it.attachmentIds?.add(id) - it.attachmentNames?.add(fileName) - } - - if (owner is MessageFull - && it is MessageFull - && owner.profileId == it.profileId - && owner.id == it.id) { - owner.attachmentIds = it.attachmentIds - owner.attachmentNames = it.attachmentNames - } - - if (owner is EventFull - && it is EventFull - && owner.profileId == it.profileId - && owner.id == it.id) { - owner.attachmentIds = it.attachmentIds - owner.attachmentNames = it.attachmentNames - } - } - } - - /*if (owner is MessageFull) { - list.forEach { - (it as? MessageFull)?.let { message -> - data.messageList.add(message) - } - } - data.messageListReplace = true - } - - if (owner is EventFull) { - list.forEach { - (it as? EventFull)?.let { it1 -> - it1.homeworkBody = "" - data.eventList.add(it1) - } - } - data.eventListReplace = true - }*/ - - onSuccess(list) - } - }} -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttendance.kt deleted file mode 100644 index 2814a1cf..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttendance.kt +++ /dev/null @@ -1,110 +0,0 @@ -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import androidx.core.util.isEmpty -import pl.szczodrzynski.edziennik.* -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_ATTENDANCE -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_ATTENDANCE -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi -import pl.szczodrzynski.edziennik.data.db.entity.Attendance -import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_PRESENT -import pl.szczodrzynski.edziennik.data.db.entity.Metadata -import pl.szczodrzynski.edziennik.data.db.entity.Profile -import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS -import pl.szczodrzynski.edziennik.utils.models.Date - -class VulcanApiAttendance(override val data: DataVulcan, - override val lastSync: Long?, - val onSuccess: (endpointId: Int) -> Unit -) : VulcanApi(data, lastSync) { - companion object { - const val TAG = "VulcanApiAttendance" - } - - init { data.profile?.also { profile -> - if (data.attendanceTypes.isEmpty()) { - data.db.attendanceTypeDao().getAllNow(profileId).toSparseArray(data.attendanceTypes) { it.id } - } - - val semesterId = data.studentSemesterId - val semesterNumber = data.studentSemesterNumber - if (semesterNumber == 2 && lastSync ?: 0 < profile.dateSemester1Start.inMillis) { - getAttendance(profile, semesterId - 1, semesterNumber - 1) { - getAttendance(profile, semesterId, semesterNumber) { - finish() - } - } - } - else { - getAttendance(profile, semesterId, semesterNumber) { - finish() - } - } - - } ?: onSuccess(ENDPOINT_VULCAN_API_ATTENDANCE) } - - private fun finish() { - data.setSyncNext(ENDPOINT_VULCAN_API_ATTENDANCE, SYNC_ALWAYS) - onSuccess(ENDPOINT_VULCAN_API_ATTENDANCE) - } - - private fun getAttendance(profile: Profile, semesterId: Int, semesterNumber: Int, onSuccess: () -> Unit) { - val startDate = profile.getSemesterStart(semesterNumber).stringY_m_d - val endDate = profile.getSemesterEnd(semesterNumber).stringY_m_d - - apiGet(TAG, VULCAN_API_ENDPOINT_ATTENDANCE, parameters = mapOf( - "DataPoczatkowa" to startDate, - "DataKoncowa" to endDate, - "IdOddzial" to data.studentClassId, - "IdUczen" to data.studentId, - "IdOkresKlasyfikacyjny" to semesterId - )) { json, _ -> - json.getJsonObject("Data")?.getJsonArray("Frekwencje")?.forEach { attendanceEl -> - val attendance = attendanceEl.asJsonObject - - val type = data.attendanceTypes.get(attendance.getLong("IdKategoria") ?: return@forEach) - ?: return@forEach - - val id = (attendance.getInt("Dzien") ?: 0) + (attendance.getInt("Numer") ?: 0) - - val lessonDateMillis = Date.fromY_m_d(attendance.getString("DzienTekst")).inMillis - val lessonDate = Date.fromMillis(lessonDateMillis) - val startTime = data.lessonRanges.get(attendance.getInt("Numer") ?: 0)?.startTime - - val lessonSemester = semesterNumber - - val attendanceObject = Attendance( - profileId = profileId, - id = id.toLong(), - baseType = type.baseType, - typeName = type.typeName, - typeShort = type.typeShort, - typeSymbol = type.typeSymbol, - typeColor = type.typeColor, - date = lessonDate, - startTime = startTime, - semester = lessonSemester, - teacherId = -1, - subjectId = attendance.getLong("IdPrzedmiot") ?: -1, - addedDate = lessonDate.combineWith(startTime) - ).also { - it.lessonNumber = attendance.getInt("Numer") - it.isCounted = it.baseType != Attendance.TYPE_RELEASED - } - - data.attendanceList.add(attendanceObject) - if (type.baseType != TYPE_PRESENT) { - data.metadataList.add(Metadata( - profileId, - Metadata.TYPE_ATTENDANCE, - attendanceObject.id, - profile.empty || type.baseType == Attendance.TYPE_PRESENT_CUSTOM || type.baseType == Attendance.TYPE_UNKNOWN, - profile.empty || type.baseType == Attendance.TYPE_PRESENT_CUSTOM || type.baseType == Attendance.TYPE_UNKNOWN - )) - } - } - - onSuccess() - } - } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiDictionaries.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiDictionaries.kt deleted file mode 100644 index 2dc9f6bc..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiDictionaries.kt +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2019-10-20 - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import com.google.gson.JsonObject -import pl.szczodrzynski.edziennik.* -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_DICTIONARIES -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_DICTIONARIES -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi -import pl.szczodrzynski.edziennik.data.db.entity.* -import pl.szczodrzynski.edziennik.utils.models.Time - -class VulcanApiDictionaries(override val data: DataVulcan, - override val lastSync: Long?, - val onSuccess: (endpointId: Int) -> Unit -) : VulcanApi(data, lastSync) { - companion object { - const val TAG = "VulcanApiDictionaries" - } - - init { - apiGet(TAG, VULCAN_API_ENDPOINT_DICTIONARIES) { json, _ -> - val elements = json.getJsonObject("Data") - - elements?.getJsonArray("Pracownicy")?.forEach { saveTeacher(it.asJsonObject) } - elements?.getJsonArray("Przedmioty")?.forEach { saveSubject(it.asJsonObject) } - elements?.getJsonArray("PoryLekcji")?.forEach { saveLessonRange(it.asJsonObject) } - elements?.getJsonArray("KategorieOcen")?.forEach { saveGradeCategory(it.asJsonObject) } - elements?.getJsonArray("KategorieUwag")?.forEach { saveNoticeType(it.asJsonObject) } - elements?.getJsonArray("KategorieFrekwencji")?.forEach { saveAttendanceType(it.asJsonObject) } - - data.setSyncNext(ENDPOINT_VULCAN_API_DICTIONARIES, 4 * DAY) - onSuccess(ENDPOINT_VULCAN_API_DICTIONARIES) - } - } - - private fun saveTeacher(teacher: JsonObject) { - val id = teacher.getLong("Id") ?: return - val name = teacher.getString("Imie") ?: "" - val surname = teacher.getString("Nazwisko") ?: "" - val loginId = teacher.getString("LoginId") ?: "-1" - - val teacherObject = Teacher( - profileId, - id, - name, - surname, - loginId - ) - - data.teacherList.put(id, teacherObject) - } - - private fun saveSubject(subject: JsonObject) { - val id = subject.getLong("Id") ?: return - val longName = subject.getString("Nazwa") ?: "" - val shortName = subject.getString("Kod") ?: "" - - val subjectObject = Subject( - profileId, - id, - longName, - shortName - ) - - data.subjectList.put(id, subjectObject) - } - - private fun saveLessonRange(lessonRange: JsonObject) { - val lessonNumber = lessonRange.getInt("Numer") ?: return - val startTime = lessonRange.getString("PoczatekTekst")?.let { Time.fromH_m(it) } ?: return - val endTime = lessonRange.getString("KoniecTekst")?.let { Time.fromH_m(it) } ?: return - - val lessonRangeObject = LessonRange( - profileId, - lessonNumber, - startTime, - endTime - ) - - data.lessonRanges.put(lessonNumber, lessonRangeObject) - } - - private fun saveGradeCategory(gradeCategory: JsonObject) { - val id = gradeCategory.getLong("Id") ?: return - val name = gradeCategory.getString("Nazwa") ?: "" - - val gradeCategoryObject = GradeCategory( - profileId, - id, - 0.0f, - -1, - name - ) - - data.gradeCategories.put(id, gradeCategoryObject) - } - - private fun saveNoticeType(noticeType: JsonObject) { - val id = noticeType.getLong("Id") ?: return - val name = noticeType.getString("Nazwa") ?: "" - - val noticeTypeObject = NoticeType( - profileId, - id, - name - ) - - data.noticeTypes.put(id, noticeTypeObject) - } - - private fun saveAttendanceType(attendanceType: JsonObject) { - val id = attendanceType.getLong("Id") ?: return - val typeName = attendanceType.getString("Nazwa") ?: "" - - val absent = attendanceType.getBoolean("Nieobecnosc") ?: false - val excused = attendanceType.getBoolean("Usprawiedliwione") ?: false - val baseType = if (absent) { - if (excused) - Attendance.TYPE_ABSENT_EXCUSED - else - Attendance.TYPE_ABSENT - } else { - val belated = attendanceType.getBoolean("Spoznienie") ?: false - val released = attendanceType.getBoolean("Zwolnienie") ?: false - val present = attendanceType.getBoolean("Obecnosc") ?: true - if (belated) - if (excused) - Attendance.TYPE_BELATED_EXCUSED - else - Attendance.TYPE_BELATED - else if (released) - Attendance.TYPE_RELEASED - else if (present) - Attendance.TYPE_PRESENT - else - Attendance.TYPE_UNKNOWN - } - - val (typeColor, typeSymbol) = when (id.toInt()) { - 1 -> 0xffffffff to "●" // obecność - 2 -> 0xffffa687 to "—" // nieobecność - 3 -> 0xfffcc150 to "u" // nieobecność usprawiedliwiona - 4 -> 0xffede049 to "s" // spóźnienie - 5 -> 0xffbbdd5f to "su" // spóźnienie usprawiedliwione - 6 -> 0xffa9c9fd to "ns" // nieobecny z przyczyn szkolnych - 7 -> 0xffddbbe5 to "z" // zwolniony - 8 -> 0xffffffff to "" // usunięty wpis - else -> null to "?" - } - - val typeShort = when (id.toInt()) { - 6 -> "ns" // nieobecny z przyczyn szkolnych - 8 -> "" // usunięty wpis - else -> data.app.attendanceManager.getTypeShort(baseType) - } - - val attendanceTypeObject = AttendanceType( - profileId, - id, - baseType, - typeName, - typeShort, - typeSymbol, - typeColor?.toInt() - ) - - data.attendanceTypes.put(id, attendanceTypeObject) - } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiEvents.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiEvents.kt deleted file mode 100644 index 6f045828..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiEvents.kt +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2019-10-20 - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_EVENTS -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_HOMEWORK -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_EVENTS -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_HOMEWORK -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi -import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel -import pl.szczodrzynski.edziennik.data.db.entity.Event -import pl.szczodrzynski.edziennik.data.db.entity.Metadata -import pl.szczodrzynski.edziennik.data.db.entity.Profile -import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS -import pl.szczodrzynski.edziennik.getBoolean -import pl.szczodrzynski.edziennik.getJsonArray -import pl.szczodrzynski.edziennik.getLong -import pl.szczodrzynski.edziennik.getString -import pl.szczodrzynski.edziennik.utils.models.Date - -class VulcanApiEvents(override val data: DataVulcan, - override val lastSync: Long?, - private val isHomework: Boolean, - val onSuccess: (endpointId: Int) -> Unit -) : VulcanApi(data, lastSync) { - companion object { - const val TAG = "VulcanApiEvents" - } - - init { data.profile?.also { profile -> - - val semesterId = data.studentSemesterId - val semesterNumber = data.studentSemesterNumber - if (semesterNumber == 2 && lastSync ?: 0 < profile.dateSemester1Start.inMillis) { - getEvents(profile, semesterId - 1, semesterNumber - 1) { - getEvents(profile, semesterId, semesterNumber) { - finish() - } - } - } - else { - getEvents(profile, semesterId, semesterNumber) { - finish() - } - } - - } ?: onSuccess(if (isHomework) ENDPOINT_VULCAN_API_HOMEWORK else ENDPOINT_VULCAN_API_EVENTS) } - - private fun finish() { - when (isHomework) { - true -> { - data.toRemove.add(DataRemoveModel.Events.futureWithType(Event.TYPE_HOMEWORK)) - data.setSyncNext(ENDPOINT_VULCAN_API_HOMEWORK, SYNC_ALWAYS) - } - false -> { - data.toRemove.add(DataRemoveModel.Events.futureExceptType(Event.TYPE_HOMEWORK)) - data.setSyncNext(ENDPOINT_VULCAN_API_EVENTS, SYNC_ALWAYS) - } - } - onSuccess(if (isHomework) ENDPOINT_VULCAN_API_HOMEWORK else ENDPOINT_VULCAN_API_EVENTS) - } - - private fun getEvents(profile: Profile, semesterId: Int, semesterNumber: Int, onSuccess: () -> Unit) { - val startDate = when (profile.empty) { - true -> profile.getSemesterStart(semesterNumber).stringY_m_d - else -> Date.getToday().stepForward(0, -1, 0).stringY_m_d - } - val endDate = profile.getSemesterEnd(semesterNumber).stringY_m_d - - val endpoint = when (isHomework) { - true -> VULCAN_API_ENDPOINT_HOMEWORK - else -> VULCAN_API_ENDPOINT_EVENTS - } - apiGet(TAG, endpoint, parameters = mapOf( - "DataPoczatkowa" to startDate, - "DataKoncowa" to endDate, - "IdOddzial" to data.studentClassId, - "IdUczen" to data.studentId, - "IdOkresKlasyfikacyjny" to semesterId - )) { json, _ -> - val events = json.getJsonArray("Data") - - events?.forEach { eventEl -> - val event = eventEl.asJsonObject - - val id = event?.getLong("Id") ?: return@forEach - val eventDate = Date.fromY_m_d(event.getString("DataTekst") ?: return@forEach) - val subjectId = event.getLong("IdPrzedmiot") ?: -1 - val teacherId = event.getLong("IdPracownik") ?: -1 - val topic = event.getString("Opis")?.trim() ?: "" - - val lessonList = data.db.timetableDao().getAllForDateNow(profileId, eventDate) - val startTime = lessonList.firstOrNull { it.subjectId == subjectId }?.startTime - - val type = when (isHomework) { - true -> Event.TYPE_HOMEWORK - else -> when (event.getBoolean("Rodzaj")) { - false -> Event.TYPE_SHORT_QUIZ - else -> Event.TYPE_EXAM - } - } - val teamId = event.getLong("IdOddzial") ?: data.teamClass?.id ?: -1 - - val eventObject = Event( - profileId = profileId, - id = id, - date = eventDate, - time = startTime, - topic = topic, - color = null, - type = type, - teacherId = teacherId, - subjectId = subjectId, - teamId = teamId - ) - - data.eventList.add(eventObject) - data.metadataList.add(Metadata( - profileId, - if (isHomework) Metadata.TYPE_HOMEWORK else Metadata.TYPE_EVENT, - id, - profile.empty, - profile.empty - )) - } - - onSuccess() - } - } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiGrades.kt deleted file mode 100644 index 9a354ea5..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiGrades.kt +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2019-10-19 - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import pl.szczodrzynski.edziennik.* -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_GRADES -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_GRADES -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi -import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel -import pl.szczodrzynski.edziennik.data.db.entity.Grade -import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_NORMAL -import pl.szczodrzynski.edziennik.data.db.entity.Metadata -import pl.szczodrzynski.edziennik.data.db.entity.Profile -import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS -import java.text.DecimalFormat -import kotlin.math.roundToInt - -class VulcanApiGrades(override val data: DataVulcan, - override val lastSync: Long?, - val onSuccess: (endpointId: Int) -> Unit -) : VulcanApi(data, lastSync) { - companion object { - const val TAG = "VulcanApiGrades" - } - - init { data.profile?.also { profile -> - - val semesterId = data.studentSemesterId - val semesterNumber = data.studentSemesterNumber - if (semesterNumber == 2 && lastSync ?: 0 < profile.dateSemester1Start.inMillis) { - getGrades(profile, semesterId - 1, semesterNumber - 1) { - getGrades(profile, semesterId, semesterNumber) { - finish() - } - } - } - else { - getGrades(profile, semesterId, semesterNumber) { - finish() - } - } - - } ?: onSuccess(ENDPOINT_VULCAN_API_GRADES) } - - private fun finish() { - data.toRemove.add(DataRemoveModel.Grades.semesterWithType(data.studentSemesterNumber, TYPE_NORMAL)) - data.setSyncNext(ENDPOINT_VULCAN_API_GRADES, SYNC_ALWAYS) - onSuccess(ENDPOINT_VULCAN_API_GRADES) - } - - private fun getGrades(profile: Profile, semesterId: Int, semesterNumber: Int, onSuccess: () -> Unit) { - apiGet(TAG, VULCAN_API_ENDPOINT_GRADES, parameters = mapOf( - "IdUczen" to data.studentId, - "IdOkresKlasyfikacyjny" to semesterId - )) { json, _ -> - val grades = json.getJsonArray("Data") - - grades?.forEach { gradeEl -> - val grade = gradeEl.asJsonObject - - val id = grade.getLong("Id") ?: return@forEach - val categoryId = grade.getLong("IdKategoria") ?: -1 - val category = data.gradeCategories.singleOrNull{ it.categoryId == categoryId }?.text - ?: "" - val teacherId = grade.getLong("IdPracownikD") ?: -1 - val subjectId = grade.getLong("IdPrzedmiot") ?: -1 - val description = grade.getString("Opis") - val comment = grade.getString("Komentarz") - var value = grade.getFloat("Wartosc") - var weight = grade.getFloat("WagaOceny") ?: 0.0f - val modificatorValue = grade.getFloat("WagaModyfikatora") - val numerator = grade.getFloat("Licznik") - val denominator = grade.getFloat("Mianownik") - val addedDate = (grade.getLong("DataModyfikacji") ?: return@forEach) * 1000 - - var finalDescription = "" - - var name = when (numerator != null && denominator != null) { - true -> { - value = numerator / denominator - finalDescription += DecimalFormat("#.##").format(numerator) + - "/" + DecimalFormat("#.##").format(denominator) - weight = 0.0f - (value * 100).roundToInt().toString() + "%" - } - else -> { - if (value != null) modificatorValue?.also { value += it } - else weight = 0.0f - - grade.getString("Wpis") ?: "" - } - } - - comment?.also { - if (name == "") name = it - else finalDescription = (if (finalDescription == "") "" else " ") + it - } - - description?.also { - finalDescription = (if (finalDescription == "") "" else " - ") + it - } - - val color = when (name) { - "1-", "1", "1+" -> 0xffd65757 - "2-", "2", "2+" -> 0xff9071b3 - "3-", "3", "3+" -> 0xffd2ab24 - "4-", "4", "4+" -> 0xff50b6d6 - "5-", "5", "5+" -> 0xff2cbd92 - "6-", "6", "6+" -> 0xff91b43c - else -> 0xff3D5F9C - }.toInt() - - val gradeObject = Grade( - profileId = profileId, - id = id, - name = name, - type = TYPE_NORMAL, - value = value ?: 0.0f, - weight = weight, - color = color, - category = category, - description = finalDescription, - comment = null, - semester = semesterNumber, - teacherId = teacherId, - subjectId = subjectId, - addedDate = addedDate - ) - - data.gradeList.add(gradeObject) - data.metadataList.add(Metadata( - profileId, - Metadata.TYPE_GRADE, - id, - profile.empty, - profile.empty - )) - } - - onSuccess() - } - } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesChangeStatus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesChangeStatus.kt deleted file mode 100644 index b0b7795d..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesChangeStatus.kt +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2019-11-12 - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import org.greenrobot.eventbus.EventBus -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_MESSAGES_CHANGE_STATUS -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi -import pl.szczodrzynski.edziennik.data.api.events.MessageGetEvent -import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_SENT -import pl.szczodrzynski.edziennik.data.db.entity.MessageRecipient -import pl.szczodrzynski.edziennik.data.db.entity.Metadata -import pl.szczodrzynski.edziennik.data.db.full.MessageFull - -class VulcanApiMessagesChangeStatus(override val data: DataVulcan, - private val messageObject: MessageFull, - val onSuccess: () -> Unit -) : VulcanApi(data, null) { - companion object { - const val TAG = "VulcanApiMessagesChangeStatus" - } - - init { - apiGet(TAG, VULCAN_API_ENDPOINT_MESSAGES_CHANGE_STATUS, parameters = mapOf( - "WiadomoscId" to messageObject.id, - "FolderWiadomosci" to "Odebrane", - "Status" to "Widoczna", - "LoginId" to data.studentLoginId, - "IdUczen" to data.studentId - )) { _, _ -> - - if (!messageObject.seen) { - data.setSeenMetadataList.add(Metadata( - profileId, - Metadata.TYPE_MESSAGE, - messageObject.id, - true, - true - )) - - messageObject.seen = true - } - - if (messageObject.type != TYPE_SENT) { - val messageRecipientObject = MessageRecipient( - profileId, - -1, - -1, - System.currentTimeMillis(), - messageObject.id - ) - - data.messageRecipientList.add(messageRecipientObject) - } - - EventBus.getDefault().postSticky(MessageGetEvent(messageObject)) - - onSuccess() - } - } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesInbox.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesInbox.kt deleted file mode 100644 index dea913c5..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesInbox.kt +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2019-11-01 - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import pl.szczodrzynski.edziennik.* -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_MESSAGES_RECEIVED -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_MESSAGES_INBOX -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi -import pl.szczodrzynski.edziennik.data.db.entity.* -import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_RECEIVED -import pl.szczodrzynski.edziennik.utils.Utils -import pl.szczodrzynski.edziennik.utils.models.Date -import kotlin.text.replace - -class VulcanApiMessagesInbox(override val data: DataVulcan, - override val lastSync: Long?, - val onSuccess: (endpointId: Int) -> Unit -) : VulcanApi(data, lastSync) { - companion object { - const val TAG = "VulcanApiMessagesInbox" - } - - init { - data.profile?.also { profile -> - - val startDate = when (profile.empty) { - true -> profile.getSemesterStart(profile.currentSemester).inUnix - else -> Date.getToday().stepForward(0, -2, 0).inUnix - } - val endDate = Date.getToday().stepForward(0, 1, 0).inUnix - - apiGet(TAG, VULCAN_API_ENDPOINT_MESSAGES_RECEIVED, parameters = mapOf( - "DataPoczatkowa" to startDate, - "DataKoncowa" to endDate, - "LoginId" to data.studentLoginId, - "IdUczen" to data.studentId - )) { json, _ -> - json.getJsonArray("Data")?.asJsonObjectList()?.forEach { message -> - val id = message.getLong("WiadomoscId") ?: return@forEach - val subject = message.getString("Tytul") ?: "" - val body = message.getString("Tresc") ?: "" - - val senderLoginId = message.getString("NadawcaId") ?: return@forEach - val senderId = data.teacherList.singleOrNull { it.loginId == senderLoginId }?.id ?: { - - val senderName = message.getString("Nadawca") ?: "" - - senderName.splitName()?.let { (senderLastName, senderFirstName) -> - val teacherObject = Teacher( - profileId, - -1 * Utils.crc16(senderName.toByteArray()).toLong(), - senderFirstName, - senderLastName, - senderLoginId - ) - data.teacherList.put(teacherObject.id, teacherObject) - teacherObject.id - } - }.invoke() - - val sentDate = message.getLong("DataWyslaniaUnixEpoch")?.let { it * 1000 } - ?: -1 - val readDate = message.getLong("DataPrzeczytaniaUnixEpoch")?.let { it * 1000 } - ?: -1 - - val messageObject = Message( - profileId = profileId, - id = id, - type = TYPE_RECEIVED, - subject = subject, - body = body.replace("\n", "
"), - senderId = senderId, - addedDate = sentDate - ) - - val messageRecipientObject = MessageRecipient( - profileId, - -1, - -1, - readDate, - id - ) - - data.messageList.add(messageObject) - data.messageRecipientList.add(messageRecipientObject) - data.setSeenMetadataList.add(Metadata( - profileId, - Metadata.TYPE_MESSAGE, - id, - readDate > 0, - readDate > 0 - )) - } - - data.setSyncNext(ENDPOINT_VULCAN_API_MESSAGES_INBOX, SYNC_ALWAYS) - onSuccess(ENDPOINT_VULCAN_API_MESSAGES_INBOX) - } - } ?: onSuccess(ENDPOINT_VULCAN_API_MESSAGES_INBOX) - } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesSent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesSent.kt deleted file mode 100644 index 94cfdcba..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesSent.kt +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2019-11-5 - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import pl.szczodrzynski.edziennik.* -import pl.szczodrzynski.edziennik.MainActivity.Companion.DRAWER_ITEM_MESSAGES -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_MESSAGES_SENT -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_MESSAGES_SENT -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi -import pl.szczodrzynski.edziennik.data.db.entity.Message -import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_SENT -import pl.szczodrzynski.edziennik.data.db.entity.MessageRecipient -import pl.szczodrzynski.edziennik.data.db.entity.Metadata -import pl.szczodrzynski.edziennik.data.db.entity.Teacher -import pl.szczodrzynski.edziennik.utils.Utils -import pl.szczodrzynski.edziennik.utils.models.Date -import kotlin.text.replace - -class VulcanApiMessagesSent(override val data: DataVulcan, - override val lastSync: Long?, - val onSuccess: (endpointId: Int) -> Unit -) : VulcanApi(data, lastSync) { - companion object { - const val TAG = "VulcanApiMessagesSent" - } - - init { - data.profile?.also { profile -> - - val startDate = when (profile.empty) { - true -> profile.getSemesterStart(profile.currentSemester).inUnix - else -> Date.getToday().stepForward(0, -2, 0).inUnix - } - val endDate = Date.getToday().stepForward(0, 1, 0).inUnix - - apiGet(TAG, VULCAN_API_ENDPOINT_MESSAGES_SENT, parameters = mapOf( - "DataPoczatkowa" to startDate, - "DataKoncowa" to endDate, - "LoginId" to data.studentLoginId, - "IdUczen" to data.studentId - )) { json, _ -> - json.getJsonArray("Data")?.asJsonObjectList()?.forEach { message -> - val id = message.getLong("WiadomoscId") ?: return@forEach - val subject = message.getString("Tytul") ?: "" - val body = message.getString("Tresc") ?: "" - val readBy = message.getInt("Przeczytane") ?: 0 - val unreadBy = message.getInt("Nieprzeczytane") ?: 0 - val sentDate = message.getLong("DataWyslaniaUnixEpoch")?.let { it * 1000 } ?: -1 - - message.getJsonArray("Adresaci")?.asJsonObjectList() - ?.onEach { receiver -> - - val receiverLoginId = receiver.getString("LoginId") - ?: return@onEach - val receiverId = data.teacherList.singleOrNull { it.loginId == receiverLoginId }?.id - ?: { - val receiverName = receiver.getString("Nazwa") ?: "" - - receiverName.splitName()?.let { (receiverLastName, receiverFirstName) -> - val teacherObject = Teacher( - profileId, - -1 * Utils.crc16(receiverName.toByteArray()).toLong(), - receiverFirstName, - receiverLastName, - receiverLoginId - ) - data.teacherList.put(teacherObject.id, teacherObject) - teacherObject.id - } - }.invoke() ?: -1 - - val readDate: Long = when (readBy) { - 0 -> 0 - else -> when (unreadBy) { - 0 -> 1 - else -> -1 - } - } - - val messageRecipientObject = MessageRecipient( - profileId, - receiverId, - -1, - readDate, - id - ) - - data.messageRecipientList.add(messageRecipientObject) - } - - val messageObject = Message( - profileId = profileId, - id = id, - type = TYPE_SENT, - subject = subject, - body = body.replace("\n", "
"), - senderId = null, - addedDate = sentDate - ) - - data.messageList.add(messageObject) - data.setSeenMetadataList.add(Metadata( - profileId, - Metadata.TYPE_MESSAGE, - id, - true, - true - )) - } - - data.setSyncNext(ENDPOINT_VULCAN_API_MESSAGES_SENT, 1 * DAY, DRAWER_ITEM_MESSAGES) - onSuccess(ENDPOINT_VULCAN_API_MESSAGES_SENT) - } - } - } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiNotices.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiNotices.kt deleted file mode 100644 index 45155a5b..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiNotices.kt +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2019-10-23 - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import androidx.core.util.isEmpty -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_NOTICES -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_NOTICES -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi -import pl.szczodrzynski.edziennik.data.db.entity.Metadata -import pl.szczodrzynski.edziennik.data.db.entity.Notice -import pl.szczodrzynski.edziennik.data.db.entity.Profile -import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS -import pl.szczodrzynski.edziennik.getJsonArray -import pl.szczodrzynski.edziennik.getLong -import pl.szczodrzynski.edziennik.getString -import pl.szczodrzynski.edziennik.toSparseArray - -class VulcanApiNotices(override val data: DataVulcan, - override val lastSync: Long?, - val onSuccess: (endpointId: Int) -> Unit -) : VulcanApi(data, lastSync) { - companion object { - const val TAG = "VulcanApiNotices" - } - - init { data.profile?.also { profile -> - if (data.noticeTypes.isEmpty()) { - data.db.noticeTypeDao().getAllNow(profileId).toSparseArray(data.noticeTypes) { it.id } - } - - val semesterId = data.studentSemesterId - val semesterNumber = data.studentSemesterNumber - if (semesterNumber == 2 && lastSync ?: 0 < profile.dateSemester1Start.inMillis) { - getNotices(profile, semesterId - 1, semesterNumber - 1) { - getNotices(profile, semesterId, semesterNumber) { - finish() - } - } - } - else { - getNotices(profile, semesterId, semesterNumber) { - finish() - } - } - - } ?: onSuccess(ENDPOINT_VULCAN_API_NOTICES) } - - private fun finish() { - data.setSyncNext(ENDPOINT_VULCAN_API_NOTICES, SYNC_ALWAYS) - onSuccess(ENDPOINT_VULCAN_API_NOTICES) - } - - private fun getNotices(profile: Profile, semesterId: Int, semesterNumber: Int, onSuccess: () -> Unit) { - apiGet(TAG, VULCAN_API_ENDPOINT_NOTICES, parameters = mapOf( - "IdUczen" to data.studentId, - "IdOkresKlasyfikacyjny" to data.studentSemesterId - )) { json, _ -> - json.getJsonArray("Data")?.forEach { noticeEl -> - val notice = noticeEl.asJsonObject - - val id = notice.getLong("Id") ?: return@forEach - val text = notice.getString("TrescUwagi") ?: return@forEach - val teacherId = notice.getLong("IdPracownik") ?: -1 - val addedDate = notice.getLong("DataModyfikacji")?.times(1000) ?: System.currentTimeMillis() - - val categoryId = notice.getLong("IdKategoriaUwag") ?: -1 - val categoryText = data.noticeTypes[categoryId]?.name ?: "" - - val noticeObject = Notice( - profileId = profileId, - id = id, - type = Notice.TYPE_NEUTRAL, - semester = profile.currentSemester, - text = text, - category = categoryText, - points = null, - teacherId = teacherId, - addedDate = addedDate - ) - - data.noticeList.add(noticeObject) - data.metadataList.add(Metadata( - profileId, - Metadata.TYPE_NOTICE, - id, - profile.empty, - profile.empty - )) - } - - onSuccess() - } - } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiProposedGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiProposedGrades.kt deleted file mode 100644 index e897df92..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiProposedGrades.kt +++ /dev/null @@ -1,112 +0,0 @@ -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import com.google.gson.JsonArray -import pl.szczodrzynski.edziennik.HOUR -import pl.szczodrzynski.edziennik.asJsonObjectList -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_GRADES_PROPOSITIONS -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_GRADES_SUMMARY -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi -import pl.szczodrzynski.edziennik.data.db.entity.Grade -import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_SEMESTER1_FINAL -import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_SEMESTER1_PROPOSED -import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_SEMESTER2_FINAL -import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_SEMESTER2_PROPOSED -import pl.szczodrzynski.edziennik.data.db.entity.Metadata -import pl.szczodrzynski.edziennik.data.db.entity.Profile -import pl.szczodrzynski.edziennik.getJsonArray -import pl.szczodrzynski.edziennik.getJsonObject -import pl.szczodrzynski.edziennik.utils.Utils - -class VulcanApiProposedGrades(override val data: DataVulcan, - override val lastSync: Long?, - val onSuccess: (endpointId: Int) -> Unit -) : VulcanApi(data, lastSync) { - companion object { - const val TAG = "VulcanApiProposedGrades" - } - - init { data.profile?.also { profile -> - - val semesterId = data.studentSemesterId - val semesterNumber = data.studentSemesterNumber - if (semesterNumber == 2 && lastSync ?: 0 < profile.dateSemester1Start.inMillis) { - getProposedGrades(profile, semesterId - 1, semesterNumber - 1) { - getProposedGrades(profile, semesterId, semesterNumber) { - finish() - } - } - } - else { - getProposedGrades(profile, semesterId, semesterNumber) { - finish() - } - } - - } ?: onSuccess(ENDPOINT_VULCAN_API_GRADES_SUMMARY) } - - private fun finish() { - data.setSyncNext(ENDPOINT_VULCAN_API_GRADES_SUMMARY, 6*HOUR) - onSuccess(ENDPOINT_VULCAN_API_GRADES_SUMMARY) - } - - private fun getProposedGrades(profile: Profile, semesterId: Int, semesterNumber: Int, onSuccess: () -> Unit) { - apiGet(TAG, VULCAN_API_ENDPOINT_GRADES_PROPOSITIONS, parameters = mapOf( - "IdUczen" to data.studentId, - "IdOkresKlasyfikacyjny" to semesterId - )) { json, _ -> - val grades = json.getJsonObject("Data") - - grades.getJsonArray("OcenyPrzewidywane")?.let { - processGradeList(it, semesterNumber, isFinal = false) - } - - grades.getJsonArray("OcenyKlasyfikacyjne")?.let { - processGradeList(it, semesterNumber, isFinal = true) - } - - onSuccess() - } - } - - private fun processGradeList(grades: JsonArray, semesterNumber: Int, isFinal: Boolean) { - grades.asJsonObjectList().forEach { grade -> - val name = grade.get("Wpis").asString - val value = Utils.getGradeValue(name) - val subjectId = grade.get("IdPrzedmiot").asLong - - val id = subjectId * -100 - semesterNumber - - val color = Utils.getVulcanGradeColor(name) - - val gradeObject = Grade( - profileId = profileId, - id = id, - name = name, - type = if (semesterNumber == 1) { - if (isFinal) TYPE_SEMESTER1_FINAL else TYPE_SEMESTER1_PROPOSED - } else { - if (isFinal) TYPE_SEMESTER2_FINAL else TYPE_SEMESTER2_PROPOSED - }, - value = value, - weight = 0f, - color = color, - category = "", - description = null, - comment = null, - semester = semesterNumber, - teacherId = -1, - subjectId = subjectId - ) - - data.gradeList.add(gradeObject) - data.metadataList.add(Metadata( - profileId, - Metadata.TYPE_GRADE, - gradeObject.id, - data.profile?.empty ?: false, - data.profile?.empty ?: false - )) - } - } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiPushConfig.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiPushConfig.kt deleted file mode 100644 index b7e291e2..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiPushConfig.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) Kuba Szczodrzyński 2020-2-20. - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_PUSH -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_PUSH_CONFIG -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi -import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS - -class VulcanApiPushConfig(override val data: DataVulcan, - override val lastSync: Long?, - val onSuccess: (endpointId: Int) -> Unit -) : VulcanApi(data, lastSync) { - companion object { - const val TAG = "VulcanApiPushConfig" - } - - init { data.app.config.sync.tokenVulcan?.also { tokenVulcan -> - apiGet(TAG, VULCAN_API_ENDPOINT_PUSH, parameters = mapOf( - "Token" to tokenVulcan, - "IdUczen" to data.studentId, - "PushOcena" to true, - "PushFrekwencja" to true, - "PushUwaga" to true, - "PushWiadomosc" to true - )) { _, _ -> - // sync always: this endpoint has .shouldSync set - data.setSyncNext(ENDPOINT_VULCAN_API_PUSH_CONFIG, SYNC_ALWAYS) - data.app.config.sync.tokenVulcanList = - data.app.config.sync.tokenVulcanList + profileId - onSuccess(ENDPOINT_VULCAN_API_PUSH_CONFIG) - } - } ?: onSuccess(ENDPOINT_VULCAN_API_PUSH_CONFIG) } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiSendMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiSendMessage.kt deleted file mode 100644 index 8c89b620..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiSendMessage.kt +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) Kuba Szczodrzyński 2019-12-29. - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import org.greenrobot.eventbus.EventBus -import pl.szczodrzynski.edziennik.* -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_MESSAGES_ADD -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi -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 VulcanApiSendMessage(override val data: DataVulcan, - val recipients: List, - val subject: String, - val text: String, - val onSuccess: () -> Unit -) : VulcanApi(data, null) { - companion object { - private const val TAG = "VulcanApiSendMessage" - } - - init { - val recipientsArray = JsonArray() - for (teacher in recipients) { - teacher.loginId?.let { - recipientsArray += JsonObject( - "LoginId" to it, - "Nazwa" to "${teacher.fullNameLastFirst} - pracownik" - ) - } - } - val params = mapOf( - "NadawcaWiadomosci" to (profile?.accountName ?: profile?.studentNameLong ?: ""), - "Tytul" to subject, - "Tresc" to text, - "Adresaci" to recipientsArray, - "LoginId" to data.studentLoginId, - "IdUczen" to data.studentId - ) - - apiGet(TAG, VULCAN_API_ENDPOINT_MESSAGES_ADD, parameters = params) { json, _ -> - val messageId = json.getJsonObject("Data").getLong("WiadomoscId") - - if (messageId == null) { - // TODO error - return@apiGet - } - - VulcanApiMessagesSent(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() - } - } - } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiTemplate.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiTemplate.kt deleted file mode 100644 index 4148be44..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiTemplate.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2019-10-20 - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi - -class VulcanApiTemplate(override val data: DataVulcan, - override val lastSync: Long?, - val onSuccess: (endpointId: Int) -> Unit -) : VulcanApi(data, lastSync) { - companion object { - const val TAG = "VulcanApi" - } - - init { - /* data.profile?.also { profile -> - apiGet(TAG, VULCAN_API_ENDPOINT_) { json, _ -> - - data.setSyncNext(ENDPOINT_VULCAN_API_, SYNC_ALWAYS) - onSuccess() - } - } */ - } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiTimetable.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiTimetable.kt deleted file mode 100644 index 46b52de5..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiTimetable.kt +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (c) Kacper Ziubryniewicz 2019-11-13 - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import androidx.core.util.set -import pl.szczodrzynski.edziennik.* -import pl.szczodrzynski.edziennik.data.api.Regexes.VULCAN_SHIFT_ANNOTATION -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_TIMETABLE -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_TIMETABLE -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi -import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel -import pl.szczodrzynski.edziennik.data.db.entity.* -import pl.szczodrzynski.edziennik.utils.Utils.crc16 -import pl.szczodrzynski.edziennik.utils.Utils.d -import pl.szczodrzynski.edziennik.utils.models.Date -import pl.szczodrzynski.edziennik.utils.models.Week - -class VulcanApiTimetable(override val data: DataVulcan, - override val lastSync: Long?, - val onSuccess: (endpointId: Int) -> Unit -) : VulcanApi(data, lastSync) { - companion object { - const val TAG = "VulcanApiTimetable" - } - - init { data.profile?.also { profile -> - val currentWeekStart = Week.getWeekStart() - - if (Date.getToday().weekDay > 4) { - currentWeekStart.stepForward(0, 0, 7) - } - - 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) - - 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 = mutableSetOf() - val lessons = mutableListOf() - - 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 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.schoolCode}:$name", - teacherId ?: oldTeacherId ?: -1 - ) - data.teamList[id] = team - } - team.id - } ?: data.teamClass?.id ?: -1 - - val subjectId = lesson.getLong("IdPrzedmiot").let { id -> - // get the specified subject name - val subjectName = lesson.getString("PrzedmiotNazwa") ?: "" - - val condition = when (id) { - // "special" subject - e.g. one time classes, a trip, etc. - 0L -> { subject: Subject -> subject.longName == subjectName } - // normal subject, check if it exists - else -> { subject: Subject -> subject.id == id } - } - - data.subjectList.singleOrNull(condition)?.id ?: { - /** - * CREATE A NEW SUBJECT IF IT DOESN'T EXIST - */ - - val subjectObject = Subject( - profileId, - if (id == null || id == 0L) - -1 * crc16(subjectName.toByteArray()).toLong() - else - id, - subjectName, - subjectName - ) - data.subjectList.put(subjectObject.id, subjectObject) - subjectObject.id - }() - } - - val lessonObject = Lesson(profileId, -1).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 - } - } - - if (type == Lesson.TYPE_SHIFTED_SOURCE || type == Lesson.TYPE_SHIFTED_TARGET) { - val shift = VULCAN_SHIFT_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 - } - } - } - - this.id = buildId() - } - - val seen = profile.empty || lessonDate < Date.getToday() - - if (type != Lesson.TYPE_NORMAL) { - data.metadataList.add(Metadata( - profileId, - Metadata.TYPE_LESSON_CHANGE, - lessonObject.id, - seen, - seen - )) - } - - 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.lessonList.addAll(lessons) - data.toRemove.add(DataRemoveModel.Timetable.between(weekStart, weekEnd)) - - data.setSyncNext(ENDPOINT_VULCAN_API_TIMETABLE, SYNC_ALWAYS) - onSuccess(ENDPOINT_VULCAN_API_TIMETABLE) - } - }} -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiUpdateSemester.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiUpdateSemester.kt deleted file mode 100644 index 50fb178a..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiUpdateSemester.kt +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) Kuba Szczodrzyński 2020-2-1. - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api - -import pl.szczodrzynski.edziennik.* -import pl.szczodrzynski.edziennik.data.api.ERROR_NO_STUDENTS_IN_ACCOUNT -import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_STUDENT_LIST -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_UPDATE_SEMESTER -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi -import pl.szczodrzynski.edziennik.data.api.models.ApiError -import pl.szczodrzynski.edziennik.utils.models.Date - -class VulcanApiUpdateSemester(override val data: DataVulcan, - override val lastSync: Long?, - val onSuccess: (endpointId: Int) -> Unit -) : VulcanApi(data, lastSync) { - companion object { - const val TAG = "VulcanApiUpdateSemester" - } - - init { data.profile?.also { profile -> - apiGet(TAG, VULCAN_API_ENDPOINT_STUDENT_LIST, baseUrl = true) { json, response -> - val students = json.getJsonArray("Data") - - if (students == null || students.isEmpty()) { - data.error(ApiError(TAG, ERROR_NO_STUDENTS_IN_ACCOUNT) - .withResponse(response) - .withApiResponse(json)) - return@apiGet - } - - students.asJsonObjectList().firstOrNull { - it.getInt("Id") == data.studentId - }?.let { student -> - val studentClassId = student.getInt("IdOddzial") ?: return@let - val studentClassName = student.getString("OkresPoziom").toString() + (student.getString("OddzialSymbol") ?: return@let) - val studentSemesterId = student.getInt("IdOkresKlasyfikacyjny") ?: return@let - - val currentSemesterStartDate = student.getLong("OkresDataOd") ?: return@let - val currentSemesterEndDate = (student.getLong("OkresDataDo") ?: return@let) + 86400 - val studentSemesterNumber = student.getInt("OkresNumer") ?: return@let - - var dateSemester1Start: Date? = null - var dateSemester2Start: Date? = null - var dateYearEnd: Date? = null - when (studentSemesterNumber) { - 1 -> { - dateSemester1Start = Date.fromMillis(currentSemesterStartDate * 1000) - dateSemester2Start = Date.fromMillis(currentSemesterEndDate * 1000) - } - 2 -> { - dateSemester2Start = Date.fromMillis(currentSemesterStartDate * 1000) - dateYearEnd = Date.fromMillis(currentSemesterEndDate * 1000) - } - } - - data.studentClassId = studentClassId - data.studentSemesterId = studentSemesterId - data.studentSemesterNumber = studentSemesterNumber - data.profile.studentData["semester${studentSemesterNumber}Id"] = studentSemesterId - data.currentSemesterEndDate = currentSemesterEndDate - profile.studentClassName = studentClassName - dateSemester1Start?.let { - profile.dateSemester1Start = it - profile.studentSchoolYearStart = it.year - } - dateSemester2Start?.let { profile.dateSemester2Start = it } - dateYearEnd?.let { profile.dateYearEnd = it } - } - - data.setSyncNext(ENDPOINT_VULCAN_API_UPDATE_SEMESTER, if (data.studentSemesterNumber == 2) 7*DAY else 2*DAY) - onSuccess(ENDPOINT_VULCAN_API_UPDATE_SEMESTER) - } - } ?: onSuccess(ENDPOINT_VULCAN_API_UPDATE_SEMESTER) } -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/firstlogin/VulcanFirstLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/firstlogin/VulcanFirstLogin.kt index 02d8b9bd..2bf633f8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/firstlogin/VulcanFirstLogin.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/firstlogin/VulcanFirstLogin.kt @@ -8,25 +8,21 @@ import org.greenrobot.eventbus.EventBus 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.data.VulcanApi import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanHebe import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanWebMain import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.VulcanHebeMain import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.CufsCertificate -import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginApi import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginHebe import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginWebMain import pl.szczodrzynski.edziennik.data.api.events.FirstLoginFinishedEvent import pl.szczodrzynski.edziennik.data.api.models.ApiError import pl.szczodrzynski.edziennik.data.db.entity.Profile -import pl.szczodrzynski.edziennik.utils.models.Date class VulcanFirstLogin(val data: DataVulcan, val onSuccess: () -> Unit) { companion object { const val TAG = "VulcanFirstLogin" } - private val api = VulcanApi(data, null) private val web = VulcanWebMain(data, null) private val hebe = VulcanHebe(data, null) private val profileList = mutableListOf() @@ -54,12 +50,6 @@ class VulcanFirstLogin(val data: DataVulcan, val onSuccess: () -> Unit) { checkSymbol(certificate) } } - else if (data.loginStore.mode == LOGIN_MODE_VULCAN_API) { - registerDevice { - EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore)) - onSuccess() - } - } else { registerDeviceHebe { EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore)) @@ -118,96 +108,6 @@ class VulcanFirstLogin(val data: DataVulcan, val onSuccess: () -> Unit) { } } - private fun registerDevice(onSuccess: () -> Unit) { - VulcanLoginApi(data) { - api.apiGet(TAG, VULCAN_API_ENDPOINT_STUDENT_LIST, baseUrl = true) { json, _ -> - val students = json.getJsonArray("Data") - - if (students == null || students.isEmpty()) { - EventBus.getDefault().postSticky(FirstLoginFinishedEvent(listOf(), data.loginStore)) - onSuccess() - return@apiGet - } - - students.forEach { studentEl -> - val student = studentEl.asJsonObject - - val schoolSymbol = student.getString("JednostkaSprawozdawczaSymbol") ?: return@forEach - val schoolShort = student.getString("JednostkaSprawozdawczaSkrot") ?: return@forEach - val schoolCode = "${data.symbol}_$schoolSymbol" - val studentId = student.getInt("Id") ?: return@forEach - val studentLoginId = student.getInt("UzytkownikLoginId") ?: return@forEach - val studentClassId = student.getInt("IdOddzial") ?: return@forEach - val studentClassName = student.getString("OkresPoziom").toString() + (student.getString("OddzialSymbol") ?: return@forEach) - val studentSemesterId = student.getInt("IdOkresKlasyfikacyjny") ?: return@forEach - val studentFirstName = student.getString("Imie") ?: "" - val studentLastName = student.getString("Nazwisko") ?: "" - val studentNameLong = "$studentFirstName $studentLastName".fixName() - val studentNameShort = "$studentFirstName ${studentLastName[0]}.".fixName() - - val userLogin = student.getString("UzytkownikLogin") ?: "" - val currentSemesterStartDate = student.getLong("OkresDataOd") ?: return@forEach - val currentSemesterEndDate = (student.getLong("OkresDataDo") ?: return@forEach) + 86400 - val studentSemesterNumber = student.getInt("OkresNumer") ?: return@forEach - - val isParent = student.getString("UzytkownikRola") == "opiekun" - val accountName = if (isParent) - student.getString("UzytkownikNazwa")?.swapFirstLastName()?.fixName() - else null - - var dateSemester1Start: Date? = null - var dateSemester2Start: Date? = null - var dateYearEnd: Date? = null - when (studentSemesterNumber) { - 1 -> { - dateSemester1Start = Date.fromMillis(currentSemesterStartDate * 1000) - dateSemester2Start = Date.fromMillis(currentSemesterEndDate * 1000) - } - 2 -> { - dateSemester2Start = Date.fromMillis(currentSemesterStartDate * 1000) - dateYearEnd = Date.fromMillis(currentSemesterEndDate * 1000) - } - } - - val profile = Profile( - firstProfileId++, - loginStoreId, - LOGIN_TYPE_VULCAN, - studentNameLong, - userLogin, - studentNameLong, - studentNameShort, - accountName - ).apply { - this.studentClassName = studentClassName - studentData["symbol"] = data.symbol - - studentData["studentId"] = studentId - studentData["studentLoginId"] = studentLoginId - studentData["studentClassId"] = studentClassId - studentData["studentSemesterId"] = studentSemesterId - studentData["studentSemesterNumber"] = studentSemesterNumber - studentData["semester${studentSemesterNumber}Id"] = studentSemesterId - studentData["schoolSymbol"] = schoolSymbol - studentData["schoolShort"] = schoolShort - studentData["schoolName"] = schoolCode - studentData["currentSemesterEndDate"] = currentSemesterEndDate - } - dateSemester1Start?.let { - profile.dateSemester1Start = it - profile.studentSchoolYearStart = it.year - } - dateSemester2Start?.let { profile.dateSemester2Start = it } - dateYearEnd?.let { profile.dateYearEnd = it } - - profileList.add(profile) - } - - onSuccess() - } - } - } - private fun registerDeviceHebe(onSuccess: () -> Unit) { VulcanLoginHebe(data) { VulcanHebeMain(data).getStudents( diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLogin.kt index b92dea88..3cbb7ea7 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLogin.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLogin.kt @@ -5,7 +5,6 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login import pl.szczodrzynski.edziennik.R -import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_VULCAN_API import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_VULCAN_HEBE import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_VULCAN_WEB_MAIN import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan @@ -51,10 +50,6 @@ class VulcanLogin(val data: DataVulcan, val onSuccess: () -> Unit) { data.startProgress(R.string.edziennik_progress_login_vulcan_web_main) VulcanLoginWebMain(data) { onSuccess(loginMethodId) } } - LOGIN_METHOD_VULCAN_API -> { - data.startProgress(R.string.edziennik_progress_login_vulcan_api) - VulcanLoginApi(data) { onSuccess(loginMethodId) } - } LOGIN_METHOD_VULCAN_HEBE -> { data.startProgress(R.string.edziennik_progress_login_vulcan_api) VulcanLoginHebe(data) { onSuccess(loginMethodId) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginApi.kt deleted file mode 100644 index def1d7e3..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginApi.kt +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (c) Kuba Szczodrzyński 2019-10-6. - */ - -package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login - -import android.os.Build -import com.google.gson.JsonObject -import im.wangchao.mhttp.Request -import im.wangchao.mhttp.Response -import im.wangchao.mhttp.callback.JsonCallbackHandler -import io.github.wulkanowy.signer.android.getPrivateKeyFromCert -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.data.api.VulcanApiUpdateSemester -import pl.szczodrzynski.edziennik.data.api.models.ApiError -import pl.szczodrzynski.edziennik.data.api.szkolny.SzkolnyApi -import pl.szczodrzynski.edziennik.utils.Utils.d -import java.net.HttpURLConnection.HTTP_BAD_REQUEST -import java.util.* -import java.util.regex.Pattern - -class VulcanLoginApi(val data: DataVulcan, val onSuccess: () -> Unit) { - companion object { - private const val TAG = "VulcanLoginApi" - } - - init { run { - if (data.studentSemesterNumber == 1 && data.semester1Id == 0) - data.semester1Id = data.studentSemesterNumber - if (data.studentSemesterNumber == 2 && data.semester2Id == 0) - data.semester2Id = data.studentSemesterNumber - - copyFromLoginStore() - - if (data.profile != null && data.isApiLoginValid()) { - onSuccess() - } - else { - if (data.apiFingerprint[data.symbol].isNotNullNorEmpty() - && data.apiPrivateKey[data.symbol].isNotNullNorEmpty() - && data.symbol.isNotNullNorEmpty()) { - // (see data.isApiLoginValid()) - // the semester end date is over - VulcanApiUpdateSemester(data, null) { onSuccess() } - return@run - } - - if (data.symbol.isNotNullNorEmpty() && data.apiToken[data.symbol].isNotNullNorEmpty() && data.apiPin[data.symbol].isNotNullNorEmpty()) { - loginWithToken() - } - else { - data.error(ApiError(TAG, ERROR_LOGIN_DATA_MISSING)) - } - } - }} - - private fun copyFromLoginStore() { - data.loginStore.data.apply { - // < v4.0 - PFX to Private Key migration - if (has("certificatePfx")) { - try { - val privateKey = getPrivateKeyFromCert( - if (data.apiToken[data.symbol]?.get(0) == 'F') VULCAN_API_PASSWORD_FAKELOG else VULCAN_API_PASSWORD, - getString("certificatePfx") ?: "" - ) - data.apiPrivateKey = mapOf( - data.symbol to privateKey - ) - remove("certificatePfx") - } catch (e: Throwable) { - e.printStackTrace() - } - } - - // 4.0 - new login form - copy user input to profile - if (has("symbol")) { - data.symbol = getString("symbol") - remove("symbol") - } - - // 4.0 - before Vulcan Web impl - migrate from strings to Map of Symbol to String - if (has("deviceSymbol")) { - data.symbol = getString("deviceSymbol") - remove("deviceSymbol") - } - if (has("certificateKey")) { - data.apiFingerprint = data.apiFingerprint.toMutableMap().also { - it[data.symbol] = getString("certificateKey") - } - remove("certificateKey") - } - if (has("certificatePrivate")) { - data.apiPrivateKey = data.apiPrivateKey.toMutableMap().also { - it[data.symbol] = getString("certificatePrivate") - } - remove("certificatePrivate") - } - - // map form inputs to the symbol - if (has("deviceToken")) { - data.apiToken = data.apiToken.toMutableMap().also { - it[data.symbol] = getString("deviceToken") - } - remove("deviceToken") - } - if (has("devicePin")) { - data.apiPin = data.apiPin.toMutableMap().also { - it[data.symbol] = getString("devicePin") - } - remove("devicePin") - } - } - } - - private fun loginWithToken() { - d(TAG, "Request: Vulcan/Login/Api - ${data.apiUrl}/$VULCAN_API_ENDPOINT_CERTIFICATE") - - val callback = object : JsonCallbackHandler() { - override fun onSuccess(json: JsonObject?, response: Response?) { - if (json == null) { - if (response?.code() == HTTP_BAD_REQUEST) { - data.error(TAG, ERROR_LOGIN_VULCAN_INVALID_SYMBOL, response) - return - } - data.error(ApiError(TAG, ERROR_RESPONSE_EMPTY) - .withResponse(response)) - return - } - - var tokenStatus = json.getString("TokenStatus") - if (tokenStatus == "Null" || tokenStatus == "CertGenerated") - tokenStatus = null - val error = tokenStatus ?: json.getString("Message") - error?.let { code -> - when (code) { - "TokenNotFound" -> ERROR_LOGIN_VULCAN_INVALID_TOKEN - "TokenDead" -> ERROR_LOGIN_VULCAN_EXPIRED_TOKEN - "WrongPIN" -> { - Pattern.compile("Liczba pozostałych prób: ([0-9])", Pattern.DOTALL).matcher(tokenStatus).let { matcher -> - if (matcher.matches()) - ERROR_LOGIN_VULCAN_INVALID_PIN + 1 + matcher.group(1).toInt() - else - ERROR_LOGIN_VULCAN_INVALID_PIN - } - } - "Broken" -> ERROR_LOGIN_VULCAN_INVALID_PIN_0_REMAINING - "OnlyKindergarten" -> ERROR_LOGIN_VULCAN_ONLY_KINDERGARTEN - "NoPupils" -> ERROR_LOGIN_VULCAN_NO_PUPILS - else -> ERROR_LOGIN_VULCAN_OTHER - }.let { errorCode -> - data.error(ApiError(TAG, errorCode) - .withApiResponse(json) - .withResponse(response)) - return - } - } - - val cert = json.getJsonObject("TokenCert") - if (cert == null) { - data.error(ApiError(TAG, ERROR_LOGIN_VULCAN_OTHER) - .withApiResponse(json) - .withResponse(response)) - return - } - - val privateKey = getPrivateKeyFromCert( - if (data.apiToken[data.symbol]?.get(0) == 'F') VULCAN_API_PASSWORD_FAKELOG else VULCAN_API_PASSWORD, - cert.getString("CertyfikatPfx") ?: "" - ) - - data.apiFingerprint = data.apiFingerprint.toMutableMap().also { - it[data.symbol] = cert.getString("CertyfikatKlucz") - } - data.apiToken = data.apiToken.toMutableMap().also { - it[data.symbol] = it[data.symbol]?.substring(0, 3) - } - data.apiPrivateKey = data.apiPrivateKey.toMutableMap().also { - it[data.symbol] = privateKey - } - data.loginStore.removeLoginData("certificatePfx") - data.loginStore.removeLoginData("apiPin") - onSuccess() - } - - override fun onFailure(response: Response?, throwable: Throwable?) { - data.error(ApiError(TAG, ERROR_REQUEST_FAILURE) - .withResponse(response) - .withThrowable(throwable)) - } - } - - val szkolnyApi = SzkolnyApi(data.app) - val firebaseToken = szkolnyApi.runCatching({ - getFirebaseToken("vulcan") - }, onError = { - // screw errors - }) ?: data.app.config.sync.tokenVulcan - - Request.builder() - .url("${data.apiUrl}$VULCAN_API_ENDPOINT_CERTIFICATE") - .userAgent(VULCAN_API_USER_AGENT) - .addHeader("RequestMobileType", "RegisterDevice") - .addParameter("PIN", data.apiPin[data.symbol]) - .addParameter("TokenKey", data.apiToken[data.symbol]) - .addParameter("DeviceId", data.buildDeviceId()) - .addParameter("DeviceName", VULCAN_API_DEVICE_NAME) - .addParameter("DeviceNameUser", "") - .addParameter("DeviceDescription", "") - .addParameter("DeviceSystemType", "Android") - .addParameter("DeviceSystemVersion", Build.VERSION.RELEASE) - .addParameter("RemoteMobileTimeKey", currentTimeUnix()) - .addParameter("TimeKey", currentTimeUnix() - 1) - .addParameter("RequestId", UUID.randomUUID().toString()) - .addParameter("AppVersion", VULCAN_API_APP_VERSION) - .addParameter("RemoteMobileAppVersion", VULCAN_API_APP_VERSION) - .addParameter("RemoteMobileAppName", VULCAN_API_APP_NAME) - .addParameter("FirebaseTokenKey", firebaseToken ?: "") - .postJson() - .allowErrorCode(HTTP_BAD_REQUEST) - .callback(callback) - .build() - .enqueue() - } -} 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 e6334299..ded6e937 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 @@ -32,7 +32,7 @@ class VulcanLoginHebe(val data: DataVulcan, val onSuccess: () -> Unit) { copyFromLoginStore() - if (data.profile != null && data.isApiLoginValid()) { + if (data.profile != null && data.isHebeLoginValid()) { onSuccess() } else { diff --git a/app/src/main/res/drawable/login_mode_vulcan_api.png b/app/src/main/res/drawable/login_mode_vulcan_api.png deleted file mode 100644 index a8ec0993..00000000 Binary files a/app/src/main/res/drawable/login_mode_vulcan_api.png and /dev/null differ diff --git a/app/src/main/res/values/errors.xml b/app/src/main/res/values/errors.xml index 91fae735..9c855142 100644 --- a/app/src/main/res/values/errors.xml +++ b/app/src/main/res/values/errors.xml @@ -126,9 +126,6 @@ ERROR_LOGIN_VULCAN_OTHER ERROR_LOGIN_VULCAN_ONLY_KINDERGARTEN ERROR_LOGIN_VULCAN_NO_PUPILS - ERROR_VULCAN_API_MAINTENANCE - ERROR_VULCAN_API_BAD_REQUEST - ERROR_VULCAN_API_OTHER ERROR_VULCAN_ATTACHMENT_DOWNLOAD ERROR_VULCAN_API_DEPRECATED @@ -176,7 +173,6 @@ EXCEPTION_LIBRUS_API_REQUEST EXCEPTION_LIBRUS_SYNERGIA_REQUEST EXCEPTION_MOBIDZIENNIK_WEB_REQUEST - EXCEPTION_VULCAN_API_REQUEST EXCEPTION_MOBIDZIENNIK_WEB_FILE_REQUEST EXCEPTION_LIBRUS_MESSAGES_FILE_REQUEST EXCEPTION_NOTIFY @@ -315,9 +311,6 @@ Inny błąd logowania do dziennika VULCAN® Dziennik przedszkolny - logowanie niemożliwe Brak uczniów przypisanych do konta, bądź ukończyli oni już szkołę - VULCAN®: przerwa techniczna - VULCAN®: błąd żądania, zgłoś błąd - VULCAN®: inny błąd, wyślij zgłoszenie VULCAN®: nie znaleziono adresu załącznika W związku z wygaszeniem aplikacji Dzienniczek+ przez firmę Vulcan, należy zalogować się ponownie.\n\nAby móc dalej korzystać z aplikacji Szkolny.eu, otwórz Ustawienia i wybierz opcję Dodaj nowego ucznia.\nNastępnie zaloguj się do dziennika Vulcan zgodnie z instrukcją.\n\nPrzepraszamy za niedogodności. @@ -365,7 +358,6 @@ Zgłoś błąd: wyjątek w API LIBRUS® EXCEPTION_LIBRUS_SYNERGIA_REQUEST EXCEPTION_MOBIDZIENNIK_WEB_REQUEST - EXCEPTION_VULCAN_API_REQUEST EXCEPTION_MOBIDZIENNIK_WEB_FILE_REQUEST EXCEPTION_LIBRUS_MESSAGES_FILE_REQUEST EXCEPTION_NOTIFY