mirror of
https://github.com/szkolny-eu/szkolny-android.git
synced 2025-01-31 05:48:19 +01:00
[Vulcan/Api] Remove Vulcan API implementation [*]
This commit is contained in:
parent
e34e4d6906
commit
045205754e
@ -183,7 +183,6 @@ dependencies {
|
|||||||
|
|
||||||
//implementation "org.redundent:kotlin-xml-builder:1.5.3"
|
//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 'com.github.wulkanowy.uonet-request-signer:hebe-jvm:a99ca50a31'
|
||||||
|
|
||||||
implementation "androidx.work:work-runtime-ktx:${versions.work}"
|
implementation "androidx.work:work-runtime-ktx:${versions.work}"
|
||||||
|
@ -90,11 +90,6 @@ const val IDZIENNIK_API_MESSAGES_SENT = "Wiadomosci/Wyslane"
|
|||||||
|
|
||||||
val MOBIDZIENNIK_USER_AGENT = SYSTEM_USER_AGENT
|
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_USER_AGENT = "Dart/2.10 (dart:io)"
|
||||||
const val VULCAN_HEBE_APP_NAME = "DzienniczekPlus 2.0"
|
const val VULCAN_HEBE_APP_NAME = "DzienniczekPlus 2.0"
|
||||||
const val VULCAN_HEBE_APP_VERSION = "21.02.09 (G)"
|
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
|
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_LUCKY_NUMBER = "Start.mvc/GetKidsLuckyNumbers"
|
||||||
const val VULCAN_WEB_ENDPOINT_REGISTER_DEVICE = "RejestracjaUrzadzeniaToken.mvc/Get"
|
const val VULCAN_WEB_ENDPOINT_REGISTER_DEVICE = "RejestracjaUrzadzeniaToken.mvc/Get"
|
||||||
const val VULCAN_HEBE_ENDPOINT_REGISTER_NEW = "api/mobile/register/new"
|
const val VULCAN_HEBE_ENDPOINT_REGISTER_NEW = "api/mobile/register/new"
|
||||||
|
@ -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_1_REMAINING = 311
|
||||||
const val ERROR_LOGIN_VULCAN_INVALID_PIN_2_REMAINING = 312
|
const val ERROR_LOGIN_VULCAN_INVALID_PIN_2_REMAINING = 312
|
||||||
const val ERROR_LOGIN_VULCAN_EXPIRED_TOKEN = 321
|
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_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_ATTACHMENT_DOWNLOAD = 343
|
||||||
const val ERROR_VULCAN_WEB_DATA_MISSING = 344
|
const val ERROR_VULCAN_WEB_DATA_MISSING = 344
|
||||||
const val ERROR_VULCAN_WEB_429 = 345
|
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_API_REQUEST = 904
|
||||||
const val EXCEPTION_LIBRUS_SYNERGIA_REQUEST = 905
|
const val EXCEPTION_LIBRUS_SYNERGIA_REQUEST = 905
|
||||||
const val EXCEPTION_MOBIDZIENNIK_WEB_REQUEST = 906
|
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_MOBIDZIENNIK_WEB_FILE_REQUEST = 908
|
||||||
const val EXCEPTION_LIBRUS_MESSAGES_FILE_REQUEST = 909
|
const val EXCEPTION_LIBRUS_MESSAGES_FILE_REQUEST = 909
|
||||||
const val EXCEPTION_NOTIFY = 910
|
const val EXCEPTION_NOTIFY = 910
|
||||||
|
@ -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.podlasie.login.PodlasieLoginApi
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.template.login.TemplateLoginApi
|
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.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.VulcanLoginHebe
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginWebMain
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginWebMain
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.LoginMethod
|
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_NEW = 200
|
||||||
const val LOGIN_METHOD_VULCAN_WEB_OLD = 300
|
const val LOGIN_METHOD_VULCAN_WEB_OLD = 300
|
||||||
const val LOGIN_METHOD_VULCAN_WEB_MESSAGES = 400
|
const val LOGIN_METHOD_VULCAN_WEB_MESSAGES = 400
|
||||||
const val LOGIN_METHOD_VULCAN_API = 500
|
|
||||||
const val LOGIN_METHOD_VULCAN_HEBE = 600
|
const val LOGIN_METHOD_VULCAN_HEBE = 600
|
||||||
val vulcanLoginMethods = listOf(
|
val vulcanLoginMethods = listOf(
|
||||||
LoginMethod(LOGIN_TYPE_VULCAN, LOGIN_METHOD_VULCAN_WEB_MAIN, VulcanLoginWebMain::class.java)
|
LoginMethod(LOGIN_TYPE_VULCAN, LOGIN_METHOD_VULCAN_WEB_MAIN, VulcanLoginWebMain::class.java)
|
||||||
@ -119,12 +117,6 @@ val vulcanLoginMethods = listOf(
|
|||||||
.withIsPossible { _, _ -> false }
|
.withIsPossible { _, _ -> false }
|
||||||
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_VULCAN_WEB_MAIN },*/
|
.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)
|
LoginMethod(LOGIN_TYPE_VULCAN, LOGIN_METHOD_VULCAN_HEBE, VulcanLoginHebe::class.java)
|
||||||
.withIsPossible { _, loginStore ->
|
.withIsPossible { _, loginStore ->
|
||||||
loginStore.mode != LOGIN_MODE_VULCAN_API
|
loginStore.mode != LOGIN_MODE_VULCAN_API
|
||||||
|
@ -5,16 +5,15 @@
|
|||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan
|
package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan
|
||||||
|
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
import pl.szczodrzynski.edziennik.*
|
import pl.szczodrzynski.edziennik.App
|
||||||
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_VULCAN_API
|
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_HEBE
|
||||||
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_VULCAN_WEB_MAIN
|
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.api.models.Data
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
|
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Team
|
import pl.szczodrzynski.edziennik.isNotNullNorEmpty
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils
|
|
||||||
import pl.szczodrzynski.fslogin.realm.RealmData
|
import pl.szczodrzynski.fslogin.realm.RealmData
|
||||||
|
|
||||||
class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app, profile, loginStore) {
|
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()
|
&& (webExpiryTime[symbol]?.toLongOrNull() ?: 0) - 30 > currentTimeUnix()
|
||||||
&& webAuthCookie[symbol].isNotNullNorEmpty()
|
&& webAuthCookie[symbol].isNotNullNorEmpty()
|
||||||
&& webRealmData != null
|
&& webRealmData != null
|
||||||
fun isApiLoginValid() = currentSemesterEndDate-30 > currentTimeUnix()
|
|
||||||
&& apiFingerprint[symbol].isNotNullNorEmpty()
|
|
||||||
&& apiPrivateKey[symbol].isNotNullNorEmpty()
|
|
||||||
&& symbol.isNotNullNorEmpty()
|
|
||||||
fun isHebeLoginValid() = hebePublicKey.isNotNullNorEmpty()
|
fun isHebeLoginValid() = hebePublicKey.isNotNullNorEmpty()
|
||||||
&& hebePrivateKey.isNotNullNorEmpty()
|
&& hebePrivateKey.isNotNullNorEmpty()
|
||||||
&& symbol.isNotNullNorEmpty()
|
&& symbol.isNotNullNorEmpty()
|
||||||
@ -35,34 +30,11 @@ class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
|
|||||||
if (isWebMainLoginValid()) {
|
if (isWebMainLoginValid()) {
|
||||||
loginMethods += LOGIN_METHOD_VULCAN_WEB_MAIN
|
loginMethods += LOGIN_METHOD_VULCAN_WEB_MAIN
|
||||||
}
|
}
|
||||||
if (isApiLoginValid()) {
|
|
||||||
loginMethods += LOGIN_METHOD_VULCAN_API
|
|
||||||
}
|
|
||||||
if (isHebeLoginValid()) {
|
if (isHebeLoginValid()) {
|
||||||
loginMethods += LOGIN_METHOD_VULCAN_HEBE
|
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"
|
override fun generateUserCode() = "$schoolCode:$studentId"
|
||||||
|
|
||||||
fun buildDeviceId(): String {
|
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() }
|
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 }
|
set(value) { loginStore.putLoginData("apiPin", app.gson.toJson(value)); mApiPin = value }
|
||||||
|
|
||||||
private var mApiFingerprint: Map<String?, String?>? = null
|
|
||||||
var apiFingerprint: Map<String?, String?> = 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<String?, String?>? = null
|
|
||||||
var apiPrivateKey: Map<String?, String?> = 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 }
|
|
||||||
|
|
||||||
/* _ _ _ _____ _____
|
/* _ _ _ _____ _____
|
||||||
| | | | | | /\ | __ \_ _|
|
| | | | | | /\ | __ \_ _|
|
||||||
| |__| | ___| |__ ___ / \ | |__) || |
|
| |__| | ___| |__ ___ / \ | |__) || |
|
||||||
|
@ -10,9 +10,6 @@ import pl.szczodrzynski.edziennik.App
|
|||||||
import pl.szczodrzynski.edziennik.data.api.*
|
import pl.szczodrzynski.edziennik.data.api.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.helper.OneDriveDownloadAttachment
|
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.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.VulcanHebeMessagesChangeStatus
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.VulcanHebeSendMessage
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.VulcanHebeSendMessage
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.firstlogin.VulcanFirstLogin
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.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) {
|
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}")
|
d(TAG, "Trying to login with ${data.targetLoginMethodIds}")
|
||||||
if (internalErrorList.isNotEmpty()) {
|
if (internalErrorList.isNotEmpty()) {
|
||||||
d(TAG, " - Internal errors:")
|
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) {
|
override fun getMessage(message: MessageFull) {
|
||||||
if (loginStore.mode != LOGIN_MODE_VULCAN_API) {
|
login(LOGIN_METHOD_VULCAN_HEBE) {
|
||||||
login(LOGIN_METHOD_VULCAN_HEBE) {
|
if (message.seen) {
|
||||||
if (message.seen) {
|
EventBus.getDefault().postSticky(MessageGetEvent(message))
|
||||||
EventBus.getDefault().postSticky(MessageGetEvent(message))
|
completed()
|
||||||
completed()
|
|
||||||
return@login
|
|
||||||
}
|
|
||||||
VulcanHebeMessagesChangeStatus(data, message) {
|
|
||||||
completed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
login(LOGIN_METHOD_VULCAN_API) {
|
|
||||||
if (message.attachmentIds != null) {
|
|
||||||
VulcanApiMessagesChangeStatus(data, message) {
|
|
||||||
completed()
|
|
||||||
}
|
|
||||||
return@login
|
return@login
|
||||||
}
|
}
|
||||||
val list = data.app.db.messageDao().getAllNow(data.profileId)
|
VulcanHebeMessagesChangeStatus(data, message) {
|
||||||
VulcanApiAttachments(data, list, message, MessageFull::class) { _ ->
|
completed()
|
||||||
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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun sendMessage(recipients: List<Teacher>, subject: String, text: String) {
|
override fun sendMessage(recipients: List<Teacher>, subject: String, text: String) {
|
||||||
if (loginStore.mode != LOGIN_MODE_VULCAN_API) {
|
login(LOGIN_METHOD_VULCAN_HEBE) {
|
||||||
login(LOGIN_METHOD_VULCAN_HEBE) {
|
VulcanHebeSendMessage(data, recipients, subject, text) {
|
||||||
VulcanHebeSendMessage(data, recipients, subject, text) {
|
|
||||||
completed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
login(LOGIN_METHOD_VULCAN_API) {
|
|
||||||
VulcanApiSendMessage(data, recipients, subject, text) {
|
|
||||||
completed()
|
completed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -200,27 +163,10 @@ class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, va
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getEvent(eventFull: EventFull) {
|
override fun getEvent(eventFull: EventFull) {
|
||||||
if (loginStore.mode != LOGIN_MODE_VULCAN_API) {
|
eventFull.homeworkBody = ""
|
||||||
eventFull.homeworkBody = ""
|
|
||||||
|
|
||||||
EventBus.getDefault().postSticky(EventGetEvent(eventFull))
|
EventBus.getDefault().postSticky(EventGetEvent(eventFull))
|
||||||
completed()
|
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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun firstLogin() { VulcanFirstLogin(data) { completed() } }
|
override fun firstLogin() { VulcanFirstLogin(data) { completed() } }
|
||||||
|
@ -7,19 +7,6 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan
|
|||||||
import pl.szczodrzynski.edziennik.data.api.*
|
import pl.szczodrzynski.edziennik.data.api.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.Feature
|
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_WEB_LUCKY_NUMBERS = 2010
|
||||||
|
|
||||||
const val ENDPOINT_VULCAN_HEBE_MAIN = 3000
|
const val ENDPOINT_VULCAN_HEBE_MAIN = 3000
|
||||||
@ -38,56 +25,31 @@ const val ENDPOINT_VULCAN_HEBE_LUCKY_NUMBER = 3200
|
|||||||
|
|
||||||
val VulcanFeatures = listOf(
|
val VulcanFeatures = listOf(
|
||||||
// timetable
|
// 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(
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_TIMETABLE, listOf(
|
||||||
ENDPOINT_VULCAN_HEBE_TIMETABLE to LOGIN_METHOD_VULCAN_HEBE
|
ENDPOINT_VULCAN_HEBE_TIMETABLE to LOGIN_METHOD_VULCAN_HEBE
|
||||||
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
||||||
// agenda
|
// 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(
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_AGENDA, listOf(
|
||||||
ENDPOINT_VULCAN_HEBE_EXAMS to LOGIN_METHOD_VULCAN_HEBE
|
ENDPOINT_VULCAN_HEBE_EXAMS to LOGIN_METHOD_VULCAN_HEBE
|
||||||
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
||||||
// grades
|
// 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(
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_GRADES, listOf(
|
||||||
ENDPOINT_VULCAN_HEBE_GRADES to LOGIN_METHOD_VULCAN_HEBE,
|
ENDPOINT_VULCAN_HEBE_GRADES to LOGIN_METHOD_VULCAN_HEBE,
|
||||||
ENDPOINT_VULCAN_HEBE_GRADE_SUMMARY to LOGIN_METHOD_VULCAN_HEBE
|
ENDPOINT_VULCAN_HEBE_GRADE_SUMMARY to LOGIN_METHOD_VULCAN_HEBE
|
||||||
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
||||||
// homework
|
// 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(
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_HOMEWORK, listOf(
|
||||||
ENDPOINT_VULCAN_HEBE_HOMEWORK to LOGIN_METHOD_VULCAN_HEBE
|
ENDPOINT_VULCAN_HEBE_HOMEWORK to LOGIN_METHOD_VULCAN_HEBE
|
||||||
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
||||||
// behaviour
|
// 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(
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_BEHAVIOUR, listOf(
|
||||||
ENDPOINT_VULCAN_HEBE_NOTICES to LOGIN_METHOD_VULCAN_HEBE
|
ENDPOINT_VULCAN_HEBE_NOTICES to LOGIN_METHOD_VULCAN_HEBE
|
||||||
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
||||||
// attendance
|
// 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(
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_ATTENDANCE, listOf(
|
||||||
ENDPOINT_VULCAN_HEBE_ATTENDANCE to LOGIN_METHOD_VULCAN_HEBE
|
ENDPOINT_VULCAN_HEBE_ATTENDANCE to LOGIN_METHOD_VULCAN_HEBE
|
||||||
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
||||||
// messages
|
// 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(
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_MESSAGES_INBOX, listOf(
|
||||||
ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX to LOGIN_METHOD_VULCAN_HEBE
|
ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX to LOGIN_METHOD_VULCAN_HEBE
|
||||||
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
||||||
@ -96,11 +58,6 @@ val VulcanFeatures = listOf(
|
|||||||
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
||||||
|
|
||||||
// push config
|
// 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(
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_PUSH_CONFIG, listOf(
|
||||||
ENDPOINT_VULCAN_HEBE_PUSH_CONFIG to LOGIN_METHOD_VULCAN_HEBE
|
ENDPOINT_VULCAN_HEBE_PUSH_CONFIG to LOGIN_METHOD_VULCAN_HEBE
|
||||||
), listOf(LOGIN_METHOD_VULCAN_HEBE)).withShouldSync { data ->
|
), listOf(LOGIN_METHOD_VULCAN_HEBE)).withShouldSync { data ->
|
||||||
@ -124,37 +81,8 @@ val VulcanFeatures = listOf(
|
|||||||
.withShouldSync { data -> data.shouldSyncLuckyNumber() }
|
.withShouldSync { data -> data.shouldSyncLuckyNumber() }
|
||||||
.withPriority(1),
|
.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(
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_ALWAYS_NEEDED, listOf(
|
||||||
ENDPOINT_VULCAN_HEBE_MAIN to LOGIN_METHOD_VULCAN_HEBE,
|
ENDPOINT_VULCAN_HEBE_MAIN to LOGIN_METHOD_VULCAN_HEBE,
|
||||||
ENDPOINT_VULCAN_HEBE_ADDRESSBOOK to LOGIN_METHOD_VULCAN_HEBE
|
ENDPOINT_VULCAN_HEBE_ADDRESSBOOK to LOGIN_METHOD_VULCAN_HEBE
|
||||||
), listOf(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)),*/
|
|
||||||
|
|
||||||
)
|
)
|
||||||
|
@ -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<String, Any> = 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()
|
|
||||||
}
|
|
||||||
}
|
|
@ -5,10 +5,7 @@
|
|||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data
|
package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.R
|
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.*
|
||||||
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.hebe.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.web.VulcanWebLuckyNumber
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.web.VulcanWebLuckyNumber
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Message
|
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
|
ENDPOINT_VULCAN_HEBE_LUCKY_NUMBER
|
||||||
)
|
)
|
||||||
|
|
||||||
init { run {
|
init {
|
||||||
if (data.loginStore.mode == LOGIN_MODE_VULCAN_API) {
|
|
||||||
data.error(TAG, ERROR_VULCAN_API_DEPRECATED)
|
|
||||||
return@run
|
|
||||||
}
|
|
||||||
if (data.studentSemesterNumber == 2 && data.profile?.empty != false) {
|
if (data.studentSemesterNumber == 2 && data.profile?.empty != false) {
|
||||||
firstSemesterSync = true
|
firstSemesterSync = true
|
||||||
// set to sync 1st semester first
|
// set to sync 1st semester first
|
||||||
@ -52,7 +45,7 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) {
|
|||||||
}
|
}
|
||||||
onSuccess()
|
onSuccess()
|
||||||
}
|
}
|
||||||
}}
|
}
|
||||||
|
|
||||||
private fun nextEndpoint(onSuccess: () -> Unit) {
|
private fun nextEndpoint(onSuccess: () -> Unit) {
|
||||||
if (data.targetEndpointIds.isEmpty()) {
|
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) {
|
private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
|
||||||
Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
|
Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
|
||||||
when (endpointId) {
|
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 -> {
|
ENDPOINT_VULCAN_WEB_LUCKY_NUMBERS -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_lucky_number)
|
data.startProgress(R.string.edziennik_progress_endpoint_lucky_number)
|
||||||
VulcanWebLuckyNumber(data, lastSync, onSuccess)
|
VulcanWebLuckyNumber(data, lastSync, onSuccess)
|
||||||
|
@ -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)
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
}
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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", "<br>"),
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
@ -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", "<br>"),
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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) }
|
|
||||||
}
|
|
@ -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<Teacher>,
|
|
||||||
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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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()
|
|
||||||
}
|
|
||||||
} */
|
|
||||||
}
|
|
||||||
}
|
|
@ -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<Int>()
|
|
||||||
val lessons = mutableListOf<Lesson>()
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
}
|
|
@ -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) }
|
|
||||||
}
|
|
@ -8,25 +8,21 @@ import org.greenrobot.eventbus.EventBus
|
|||||||
import pl.szczodrzynski.edziennik.*
|
import pl.szczodrzynski.edziennik.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.*
|
import pl.szczodrzynski.edziennik.data.api.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
|
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.VulcanHebe
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanWebMain
|
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.data.hebe.VulcanHebeMain
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.CufsCertificate
|
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.VulcanLoginHebe
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginWebMain
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginWebMain
|
||||||
import pl.szczodrzynski.edziennik.data.api.events.FirstLoginFinishedEvent
|
import pl.szczodrzynski.edziennik.data.api.events.FirstLoginFinishedEvent
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
|
||||||
|
|
||||||
class VulcanFirstLogin(val data: DataVulcan, val onSuccess: () -> Unit) {
|
class VulcanFirstLogin(val data: DataVulcan, val onSuccess: () -> Unit) {
|
||||||
companion object {
|
companion object {
|
||||||
const val TAG = "VulcanFirstLogin"
|
const val TAG = "VulcanFirstLogin"
|
||||||
}
|
}
|
||||||
|
|
||||||
private val api = VulcanApi(data, null)
|
|
||||||
private val web = VulcanWebMain(data, null)
|
private val web = VulcanWebMain(data, null)
|
||||||
private val hebe = VulcanHebe(data, null)
|
private val hebe = VulcanHebe(data, null)
|
||||||
private val profileList = mutableListOf<Profile>()
|
private val profileList = mutableListOf<Profile>()
|
||||||
@ -54,12 +50,6 @@ class VulcanFirstLogin(val data: DataVulcan, val onSuccess: () -> Unit) {
|
|||||||
checkSymbol(certificate)
|
checkSymbol(certificate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (data.loginStore.mode == LOGIN_MODE_VULCAN_API) {
|
|
||||||
registerDevice {
|
|
||||||
EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore))
|
|
||||||
onSuccess()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
registerDeviceHebe {
|
registerDeviceHebe {
|
||||||
EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore))
|
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) {
|
private fun registerDeviceHebe(onSuccess: () -> Unit) {
|
||||||
VulcanLoginHebe(data) {
|
VulcanLoginHebe(data) {
|
||||||
VulcanHebeMain(data).getStudents(
|
VulcanHebeMain(data).getStudents(
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login
|
package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.R
|
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_HEBE
|
||||||
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_VULCAN_WEB_MAIN
|
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_VULCAN_WEB_MAIN
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
|
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)
|
data.startProgress(R.string.edziennik_progress_login_vulcan_web_main)
|
||||||
VulcanLoginWebMain(data) { onSuccess(loginMethodId) }
|
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 -> {
|
LOGIN_METHOD_VULCAN_HEBE -> {
|
||||||
data.startProgress(R.string.edziennik_progress_login_vulcan_api)
|
data.startProgress(R.string.edziennik_progress_login_vulcan_api)
|
||||||
VulcanLoginHebe(data) { onSuccess(loginMethodId) }
|
VulcanLoginHebe(data) { onSuccess(loginMethodId) }
|
||||||
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
@ -32,7 +32,7 @@ class VulcanLoginHebe(val data: DataVulcan, val onSuccess: () -> Unit) {
|
|||||||
|
|
||||||
copyFromLoginStore()
|
copyFromLoginStore()
|
||||||
|
|
||||||
if (data.profile != null && data.isApiLoginValid()) {
|
if (data.profile != null && data.isHebeLoginValid()) {
|
||||||
onSuccess()
|
onSuccess()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 1.3 KiB |
@ -126,9 +126,6 @@
|
|||||||
<string name="error_322" translatable="false">ERROR_LOGIN_VULCAN_OTHER</string>
|
<string name="error_322" translatable="false">ERROR_LOGIN_VULCAN_OTHER</string>
|
||||||
<string name="error_330" translatable="false">ERROR_LOGIN_VULCAN_ONLY_KINDERGARTEN</string>
|
<string name="error_330" translatable="false">ERROR_LOGIN_VULCAN_ONLY_KINDERGARTEN</string>
|
||||||
<string name="error_331" translatable="false">ERROR_LOGIN_VULCAN_NO_PUPILS</string>
|
<string name="error_331" translatable="false">ERROR_LOGIN_VULCAN_NO_PUPILS</string>
|
||||||
<string name="error_340" translatable="false">ERROR_VULCAN_API_MAINTENANCE</string>
|
|
||||||
<string name="error_341" translatable="false">ERROR_VULCAN_API_BAD_REQUEST</string>
|
|
||||||
<string name="error_342" translatable="false">ERROR_VULCAN_API_OTHER</string>
|
|
||||||
<string name="error_343" translatable="false">ERROR_VULCAN_ATTACHMENT_DOWNLOAD</string>
|
<string name="error_343" translatable="false">ERROR_VULCAN_ATTACHMENT_DOWNLOAD</string>
|
||||||
<string name="error_390" translatable="false">ERROR_VULCAN_API_DEPRECATED</string>
|
<string name="error_390" translatable="false">ERROR_VULCAN_API_DEPRECATED</string>
|
||||||
|
|
||||||
@ -176,7 +173,6 @@
|
|||||||
<string name="error_904" translatable="false">EXCEPTION_LIBRUS_API_REQUEST</string>
|
<string name="error_904" translatable="false">EXCEPTION_LIBRUS_API_REQUEST</string>
|
||||||
<string name="error_905" translatable="false">EXCEPTION_LIBRUS_SYNERGIA_REQUEST</string>
|
<string name="error_905" translatable="false">EXCEPTION_LIBRUS_SYNERGIA_REQUEST</string>
|
||||||
<string name="error_906" translatable="false">EXCEPTION_MOBIDZIENNIK_WEB_REQUEST</string>
|
<string name="error_906" translatable="false">EXCEPTION_MOBIDZIENNIK_WEB_REQUEST</string>
|
||||||
<string name="error_907" translatable="false">EXCEPTION_VULCAN_API_REQUEST</string>
|
|
||||||
<string name="error_908" translatable="false">EXCEPTION_MOBIDZIENNIK_WEB_FILE_REQUEST</string>
|
<string name="error_908" translatable="false">EXCEPTION_MOBIDZIENNIK_WEB_FILE_REQUEST</string>
|
||||||
<string name="error_909" translatable="false">EXCEPTION_LIBRUS_MESSAGES_FILE_REQUEST</string>
|
<string name="error_909" translatable="false">EXCEPTION_LIBRUS_MESSAGES_FILE_REQUEST</string>
|
||||||
<string name="error_910" translatable="false">EXCEPTION_NOTIFY</string>
|
<string name="error_910" translatable="false">EXCEPTION_NOTIFY</string>
|
||||||
@ -315,9 +311,6 @@
|
|||||||
<string name="error_322_reason">Inny błąd logowania do dziennika VULCAN®</string>
|
<string name="error_322_reason">Inny błąd logowania do dziennika VULCAN®</string>
|
||||||
<string name="error_330_reason">Dziennik przedszkolny - logowanie niemożliwe</string>
|
<string name="error_330_reason">Dziennik przedszkolny - logowanie niemożliwe</string>
|
||||||
<string name="error_331_reason">Brak uczniów przypisanych do konta, bądź ukończyli oni już szkołę</string>
|
<string name="error_331_reason">Brak uczniów przypisanych do konta, bądź ukończyli oni już szkołę</string>
|
||||||
<string name="error_340_reason">VULCAN®: przerwa techniczna</string>
|
|
||||||
<string name="error_341_reason">VULCAN®: błąd żądania, zgłoś błąd</string>
|
|
||||||
<string name="error_342_reason">VULCAN®: inny błąd, wyślij zgłoszenie</string>
|
|
||||||
<string name="error_343_reason">VULCAN®: nie znaleziono adresu załącznika</string>
|
<string name="error_343_reason">VULCAN®: nie znaleziono adresu załącznika</string>
|
||||||
<string name="error_390_reason">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.</string>
|
<string name="error_390_reason">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.</string>
|
||||||
|
|
||||||
@ -365,7 +358,6 @@
|
|||||||
<string name="error_904_reason">Zgłoś błąd: wyjątek w API LIBRUS®</string>
|
<string name="error_904_reason">Zgłoś błąd: wyjątek w API LIBRUS®</string>
|
||||||
<string name="error_905_reason">EXCEPTION_LIBRUS_SYNERGIA_REQUEST</string>
|
<string name="error_905_reason">EXCEPTION_LIBRUS_SYNERGIA_REQUEST</string>
|
||||||
<string name="error_906_reason">EXCEPTION_MOBIDZIENNIK_WEB_REQUEST</string>
|
<string name="error_906_reason">EXCEPTION_MOBIDZIENNIK_WEB_REQUEST</string>
|
||||||
<string name="error_907_reason">EXCEPTION_VULCAN_API_REQUEST</string>
|
|
||||||
<string name="error_908_reason">EXCEPTION_MOBIDZIENNIK_WEB_FILE_REQUEST</string>
|
<string name="error_908_reason">EXCEPTION_MOBIDZIENNIK_WEB_FILE_REQUEST</string>
|
||||||
<string name="error_909_reason">EXCEPTION_LIBRUS_MESSAGES_FILE_REQUEST</string>
|
<string name="error_909_reason">EXCEPTION_LIBRUS_MESSAGES_FILE_REQUEST</string>
|
||||||
<string name="error_910_reason">EXCEPTION_NOTIFY</string>
|
<string name="error_910_reason">EXCEPTION_NOTIFY</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user