mirror of
https://github.com/szkolny-eu/szkolny-android.git
synced 2025-06-21 09:33:06 +02:00
Compare commits
16 Commits
v4.5-beta.
...
v4.5
Author | SHA1 | Date | |
---|---|---|---|
9b48041cd9 | |||
46cecf3474 | |||
c27254bcad | |||
80333cdea4 | |||
6aee3ea420 | |||
a11a44b768 | |||
e869107101 | |||
5903bbe59d | |||
6c0ddd3e6d | |||
621a7ac642 | |||
e86b47fb1b | |||
98fb7ac8c9 | |||
f49e39e858 | |||
8fc57cd3f5 | |||
a9eda087e0 | |||
b08e4c2d3d |
@ -151,7 +151,7 @@ dependencies {
|
|||||||
implementation "com.jaredrummler:colorpicker:1.0.2"
|
implementation "com.jaredrummler:colorpicker:1.0.2"
|
||||||
implementation("com.squareup.okhttp3:okhttp") {
|
implementation("com.squareup.okhttp3:okhttp") {
|
||||||
version {
|
version {
|
||||||
strictly "3.12.2"
|
strictly "3.12.13"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
implementation "com.theartofdev.edmodo:android-image-cropper:2.8.0" // do not update
|
implementation "com.theartofdev.edmodo:android-image-cropper:2.8.0" // do not update
|
||||||
|
@ -66,4 +66,4 @@
|
|||||||
|
|
||||||
-keepclassmembers class pl.szczodrzynski.edziennik.data.api.szkolny.request.** { *; }
|
-keepclassmembers class pl.szczodrzynski.edziennik.data.api.szkolny.request.** { *; }
|
||||||
-keepclassmembers class pl.szczodrzynski.edziennik.data.api.szkolny.response.** { *; }
|
-keepclassmembers class pl.szczodrzynski.edziennik.data.api.szkolny.response.** { *; }
|
||||||
-keepclassmembernames class pl.szczodrzynski.edziennik.ui.modules.login.LoginInfo.Platform { *; }
|
-keepclassmembernames class pl.szczodrzynski.edziennik.ui.modules.login.LoginInfo$Platform { *; }
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
<h3>Wersja 4.5-beta.1, 2021-02-21</h3>
|
<h3>Wersja 4.5, 2021-02-21</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Vulcan: aplikacja Szkolny.eu zaktualizowana w związku z wygaszeniem aplikacji Dzienniczek+.</li>
|
<li>Vulcan: aplikacja Szkolny.eu zaktualizowana w związku z wygaszeniem aplikacji Dzienniczek+.</li>
|
||||||
|
<li><b>Mogą pojawić się brakujące funkcje, np. wysyłanie wiadomości - zostaną one wprowadzone w najbliższych dniach.</b></li>
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
/*secret password - removed for source code publication*/
|
/*secret password - removed for source code publication*/
|
||||||
static toys AES_IV[16] = {
|
static toys AES_IV[16] = {
|
||||||
0x35, 0x4c, 0x9d, 0x0e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
0x4f, 0x43, 0x04, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||||
|
|
||||||
unsigned char *agony(unsigned int laugh, unsigned char *box, unsigned char *heat);
|
unsigned char *agony(unsigned int laugh, unsigned char *box, unsigned char *heat);
|
||||||
|
|
||||||
|
@ -96,30 +96,30 @@ fun List<Teacher>.byNameFDotSpaceLast(nameFDotSpaceLast: String) = firstOrNull {
|
|||||||
|
|
||||||
fun JsonObject?.get(key: String): JsonElement? = this?.get(key)
|
fun JsonObject?.get(key: String): JsonElement? = this?.get(key)
|
||||||
|
|
||||||
fun JsonObject?.getBoolean(key: String): Boolean? = get(key)?.let { if (it.isJsonNull) null else it.asBoolean }
|
fun JsonObject?.getBoolean(key: String): Boolean? = get(key)?.let { if (!it.isJsonPrimitive) null else it.asBoolean }
|
||||||
fun JsonObject?.getString(key: String): String? = get(key)?.let { if (it.isJsonNull) null else it.asString }
|
fun JsonObject?.getString(key: String): String? = get(key)?.let { if (!it.isJsonPrimitive) null else it.asString }
|
||||||
fun JsonObject?.getInt(key: String): Int? = get(key)?.let { if (it.isJsonNull) null else it.asInt }
|
fun JsonObject?.getInt(key: String): Int? = get(key)?.let { if (!it.isJsonPrimitive) null else it.asInt }
|
||||||
fun JsonObject?.getLong(key: String): Long? = get(key)?.let { if (it.isJsonNull) null else it.asLong }
|
fun JsonObject?.getLong(key: String): Long? = get(key)?.let { if (!it.isJsonPrimitive) null else it.asLong }
|
||||||
fun JsonObject?.getFloat(key: String): Float? = get(key)?.let { if(it.isJsonNull) null else it.asFloat }
|
fun JsonObject?.getFloat(key: String): Float? = get(key)?.let { if(!it.isJsonPrimitive) null else it.asFloat }
|
||||||
fun JsonObject?.getChar(key: String): Char? = get(key)?.let { if(it.isJsonNull) null else it.asCharacter }
|
fun JsonObject?.getChar(key: String): Char? = get(key)?.let { if(!it.isJsonPrimitive) null else it.asCharacter }
|
||||||
fun JsonObject?.getJsonObject(key: String): JsonObject? = get(key)?.let { if (it.isJsonObject) it.asJsonObject else null }
|
fun JsonObject?.getJsonObject(key: String): JsonObject? = get(key)?.let { if (it.isJsonObject) it.asJsonObject else null }
|
||||||
fun JsonObject?.getJsonArray(key: String): JsonArray? = get(key)?.let { if (it.isJsonArray) it.asJsonArray else null }
|
fun JsonObject?.getJsonArray(key: String): JsonArray? = get(key)?.let { if (it.isJsonArray) it.asJsonArray else null }
|
||||||
|
|
||||||
fun JsonObject?.getBoolean(key: String, defaultValue: Boolean): Boolean = get(key)?.let { if (it.isJsonNull) defaultValue else it.asBoolean } ?: defaultValue
|
fun JsonObject?.getBoolean(key: String, defaultValue: Boolean): Boolean = get(key)?.let { if (!it.isJsonPrimitive) defaultValue else it.asBoolean } ?: defaultValue
|
||||||
fun JsonObject?.getString(key: String, defaultValue: String): String = get(key)?.let { if (it.isJsonNull) defaultValue else it.asString } ?: defaultValue
|
fun JsonObject?.getString(key: String, defaultValue: String): String = get(key)?.let { if (!it.isJsonPrimitive) defaultValue else it.asString } ?: defaultValue
|
||||||
fun JsonObject?.getInt(key: String, defaultValue: Int): Int = get(key)?.let { if (it.isJsonNull) defaultValue else it.asInt } ?: defaultValue
|
fun JsonObject?.getInt(key: String, defaultValue: Int): Int = get(key)?.let { if (!it.isJsonPrimitive) defaultValue else it.asInt } ?: defaultValue
|
||||||
fun JsonObject?.getLong(key: String, defaultValue: Long): Long = get(key)?.let { if (it.isJsonNull) defaultValue else it.asLong } ?: defaultValue
|
fun JsonObject?.getLong(key: String, defaultValue: Long): Long = get(key)?.let { if (!it.isJsonPrimitive) defaultValue else it.asLong } ?: defaultValue
|
||||||
fun JsonObject?.getFloat(key: String, defaultValue: Float): Float = get(key)?.let { if(it.isJsonNull) defaultValue else it.asFloat } ?: defaultValue
|
fun JsonObject?.getFloat(key: String, defaultValue: Float): Float = get(key)?.let { if(!it.isJsonPrimitive) defaultValue else it.asFloat } ?: defaultValue
|
||||||
fun JsonObject?.getChar(key: String, defaultValue: Char): Char = get(key)?.let { if(it.isJsonNull) defaultValue else it.asCharacter } ?: defaultValue
|
fun JsonObject?.getChar(key: String, defaultValue: Char): Char = get(key)?.let { if(!it.isJsonPrimitive) defaultValue else it.asCharacter } ?: defaultValue
|
||||||
fun JsonObject?.getJsonObject(key: String, defaultValue: JsonObject): JsonObject = get(key)?.let { if (it.isJsonObject) it.asJsonObject else defaultValue } ?: defaultValue
|
fun JsonObject?.getJsonObject(key: String, defaultValue: JsonObject): JsonObject = get(key)?.let { if (it.isJsonObject) it.asJsonObject else defaultValue } ?: defaultValue
|
||||||
fun JsonObject?.getJsonArray(key: String, defaultValue: JsonArray): JsonArray = get(key)?.let { if (it.isJsonArray) it.asJsonArray else defaultValue } ?: defaultValue
|
fun JsonObject?.getJsonArray(key: String, defaultValue: JsonArray): JsonArray = get(key)?.let { if (it.isJsonArray) it.asJsonArray else defaultValue } ?: defaultValue
|
||||||
|
|
||||||
fun JsonArray.getBoolean(key: Int): Boolean? = if (key >= size()) null else get(key)?.let { if (it.isJsonNull) null else it.asBoolean }
|
fun JsonArray.getBoolean(key: Int): Boolean? = if (key >= size()) null else get(key)?.let { if (!it.isJsonPrimitive) null else it.asBoolean }
|
||||||
fun JsonArray.getString(key: Int): String? = if (key >= size()) null else get(key)?.let { if (it.isJsonNull) null else it.asString }
|
fun JsonArray.getString(key: Int): String? = if (key >= size()) null else get(key)?.let { if (!it.isJsonPrimitive) null else it.asString }
|
||||||
fun JsonArray.getInt(key: Int): Int? = if (key >= size()) null else get(key)?.let { if (it.isJsonNull) null else it.asInt }
|
fun JsonArray.getInt(key: Int): Int? = if (key >= size()) null else get(key)?.let { if (!it.isJsonPrimitive) null else it.asInt }
|
||||||
fun JsonArray.getLong(key: Int): Long? = if (key >= size()) null else get(key)?.let { if (it.isJsonNull) null else it.asLong }
|
fun JsonArray.getLong(key: Int): Long? = if (key >= size()) null else get(key)?.let { if (!it.isJsonPrimitive) null else it.asLong }
|
||||||
fun JsonArray.getFloat(key: Int): Float? = if (key >= size()) null else get(key)?.let { if(it.isJsonNull) null else it.asFloat }
|
fun JsonArray.getFloat(key: Int): Float? = if (key >= size()) null else get(key)?.let { if(!it.isJsonPrimitive) null else it.asFloat }
|
||||||
fun JsonArray.getChar(key: Int): Char? = if (key >= size()) null else get(key)?.let { if(it.isJsonNull) null else it.asCharacter }
|
fun JsonArray.getChar(key: Int): Char? = if (key >= size()) null else get(key)?.let { if(!it.isJsonPrimitive) null else it.asCharacter }
|
||||||
fun JsonArray.getJsonObject(key: Int): JsonObject? = if (key >= size()) null else get(key)?.let { if (it.isJsonObject) it.asJsonObject else null }
|
fun JsonArray.getJsonObject(key: Int): JsonObject? = if (key >= size()) null else get(key)?.let { if (it.isJsonObject) it.asJsonObject else null }
|
||||||
fun JsonArray.getJsonArray(key: Int): JsonArray? = if (key >= size()) null else get(key)?.let { if (it.isJsonArray) it.asJsonArray else null }
|
fun JsonArray.getJsonArray(key: Int): JsonArray? = if (key >= size()) null else get(key)?.let { if (it.isJsonArray) it.asJsonArray else null }
|
||||||
|
|
||||||
|
@ -38,6 +38,7 @@ import org.greenrobot.eventbus.EventBus
|
|||||||
import org.greenrobot.eventbus.Subscribe
|
import org.greenrobot.eventbus.Subscribe
|
||||||
import org.greenrobot.eventbus.ThreadMode
|
import org.greenrobot.eventbus.ThreadMode
|
||||||
import pl.droidsonroids.gif.GifDrawable
|
import pl.droidsonroids.gif.GifDrawable
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.ERROR_VULCAN_API_DEPRECATED
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.EdziennikTask
|
import pl.szczodrzynski.edziennik.data.api.edziennik.EdziennikTask
|
||||||
import pl.szczodrzynski.edziennik.data.api.events.*
|
import pl.szczodrzynski.edziennik.data.api.events.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
@ -64,6 +65,7 @@ import pl.szczodrzynski.edziennik.ui.modules.base.MainSnackbar
|
|||||||
import pl.szczodrzynski.edziennik.ui.modules.behaviour.BehaviourFragment
|
import pl.szczodrzynski.edziennik.ui.modules.behaviour.BehaviourFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.debug.DebugFragment
|
import pl.szczodrzynski.edziennik.ui.modules.debug.DebugFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.debug.LabFragment
|
import pl.szczodrzynski.edziennik.ui.modules.debug.LabFragment
|
||||||
|
import pl.szczodrzynski.edziennik.ui.modules.error.ErrorDetailsDialog
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.error.ErrorSnackbar
|
import pl.szczodrzynski.edziennik.ui.modules.error.ErrorSnackbar
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.feedback.FeedbackFragment
|
import pl.szczodrzynski.edziennik.ui.modules.feedback.FeedbackFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.feedback.HelpFragment
|
import pl.szczodrzynski.edziennik.ui.modules.feedback.HelpFragment
|
||||||
@ -756,6 +758,9 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
|||||||
}
|
}
|
||||||
mainSnackbar.dismiss()
|
mainSnackbar.dismiss()
|
||||||
errorSnackbar.addError(event.error).show()
|
errorSnackbar.addError(event.error).show()
|
||||||
|
if (event.error.errorCode == ERROR_VULCAN_API_DEPRECATED) {
|
||||||
|
ErrorDetailsDialog(this, listOf(event.error))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
|
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
|
||||||
fun onAppManagerDetectedEvent(event: AppManagerDetectedEvent) {
|
fun onAppManagerDetectedEvent(event: AppManagerDetectedEvent) {
|
||||||
|
@ -129,9 +129,13 @@ const val VULCAN_HEBE_ENDPOINT_REGISTER_NEW = "api/mobile/register/new"
|
|||||||
const val VULCAN_HEBE_ENDPOINT_MAIN = "api/mobile/register/hebe"
|
const val VULCAN_HEBE_ENDPOINT_MAIN = "api/mobile/register/hebe"
|
||||||
const val VULCAN_HEBE_ENDPOINT_TIMETABLE = "api/mobile/schedule"
|
const val VULCAN_HEBE_ENDPOINT_TIMETABLE = "api/mobile/schedule"
|
||||||
const val VULCAN_HEBE_ENDPOINT_TIMETABLE_CHANGES = "api/mobile/schedule/changes"
|
const val VULCAN_HEBE_ENDPOINT_TIMETABLE_CHANGES = "api/mobile/schedule/changes"
|
||||||
|
const val VULCAN_HEBE_ENDPOINT_ADDRESSBOOK = "api/mobile/addressbook"
|
||||||
const val VULCAN_HEBE_ENDPOINT_EXAMS = "api/mobile/exam"
|
const val VULCAN_HEBE_ENDPOINT_EXAMS = "api/mobile/exam"
|
||||||
const val VULCAN_HEBE_ENDPOINT_GRADES = "api/mobile/grade"
|
const val VULCAN_HEBE_ENDPOINT_GRADES = "api/mobile/grade"
|
||||||
const val VULCAN_HEBE_ENDPOINT_HOMEWORK = "api/mobile/homework"
|
const val VULCAN_HEBE_ENDPOINT_HOMEWORK = "api/mobile/homework"
|
||||||
|
const val VULCAN_HEBE_ENDPOINT_ATTENDANCE = "api/mobile/lesson"
|
||||||
|
const val VULCAN_HEBE_ENDPOINT_MESSAGES = "api/mobile/message"
|
||||||
|
const val VULCAN_HEBE_ENDPOINT_MESSAGES_STATUS = "api/mobile/message/status"
|
||||||
|
|
||||||
const val EDUDZIENNIK_USER_AGENT = "Szkolny.eu/${BuildConfig.VERSION_NAME}"
|
const val EDUDZIENNIK_USER_AGENT = "Szkolny.eu/${BuildConfig.VERSION_NAME}"
|
||||||
|
|
||||||
|
@ -171,6 +171,7 @@ const val ERROR_VULCAN_WEB_CERTIFICATE_POST_FAILED = 351
|
|||||||
const val ERROR_VULCAN_WEB_GRADUATE_ACCOUNT = 352
|
const val ERROR_VULCAN_WEB_GRADUATE_ACCOUNT = 352
|
||||||
const val ERROR_VULCAN_WEB_NO_SCHOOLS = 353
|
const val ERROR_VULCAN_WEB_NO_SCHOOLS = 353
|
||||||
const val ERROR_VULCAN_HEBE_OTHER = 354
|
const val ERROR_VULCAN_HEBE_OTHER = 354
|
||||||
|
const val ERROR_VULCAN_API_DEPRECATED = 390
|
||||||
|
|
||||||
const val ERROR_LOGIN_IDZIENNIK_WEB_INVALID_LOGIN = 401
|
const val ERROR_LOGIN_IDZIENNIK_WEB_INVALID_LOGIN = 401
|
||||||
const val ERROR_LOGIN_IDZIENNIK_WEB_INVALID_SCHOOL_NAME = 402
|
const val ERROR_LOGIN_IDZIENNIK_WEB_INVALID_SCHOOL_NAME = 402
|
||||||
|
@ -13,6 +13,7 @@ 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.VulcanApiAttachments
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api.VulcanApiMessagesChangeStatus
|
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.api.VulcanApiSendMessage
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.VulcanHebeMessagesChangeStatus
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.firstlogin.VulcanFirstLogin
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.firstlogin.VulcanFirstLogin
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLogin
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLogin
|
||||||
import pl.szczodrzynski.edziennik.data.api.events.AttachmentGetEvent
|
import pl.szczodrzynski.edziennik.data.api.events.AttachmentGetEvent
|
||||||
@ -91,6 +92,20 @@ 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) {
|
||||||
|
if (message.seen) {
|
||||||
|
EventBus.getDefault().postSticky(MessageGetEvent(message))
|
||||||
|
completed()
|
||||||
|
return@login
|
||||||
|
}
|
||||||
|
VulcanHebeMessagesChangeStatus(data, message) {
|
||||||
|
completed()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
login(LOGIN_METHOD_VULCAN_API) {
|
login(LOGIN_METHOD_VULCAN_API) {
|
||||||
if (message.attachmentIds != null) {
|
if (message.attachmentIds != null) {
|
||||||
VulcanApiMessagesChangeStatus(data, message) {
|
VulcanApiMessagesChangeStatus(data, message) {
|
||||||
|
@ -21,10 +21,14 @@ const val ENDPOINT_VULCAN_API_MESSAGES_INBOX = 1090
|
|||||||
const val ENDPOINT_VULCAN_API_MESSAGES_SENT = 1100
|
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
|
||||||
|
const val ENDPOINT_VULCAN_HEBE_ADDRESSBOOK = 3010
|
||||||
const val ENDPOINT_VULCAN_HEBE_TIMETABLE = 3020
|
const val ENDPOINT_VULCAN_HEBE_TIMETABLE = 3020
|
||||||
const val ENDPOINT_VULCAN_HEBE_EXAMS = 3030
|
const val ENDPOINT_VULCAN_HEBE_EXAMS = 3030
|
||||||
const val ENDPOINT_VULCAN_HEBE_GRADES = 3040
|
const val ENDPOINT_VULCAN_HEBE_GRADES = 3040
|
||||||
const val ENDPOINT_VULCAN_HEBE_HOMEWORK = 3060
|
const val ENDPOINT_VULCAN_HEBE_HOMEWORK = 3060
|
||||||
|
const val ENDPOINT_VULCAN_HEBE_ATTENDANCE = 3080
|
||||||
|
const val ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX = 3090
|
||||||
|
const val ENDPOINT_VULCAN_HEBE_MESSAGES_SENT = 3100
|
||||||
|
|
||||||
val VulcanFeatures = listOf(
|
val VulcanFeatures = listOf(
|
||||||
// timetable
|
// timetable
|
||||||
@ -64,6 +68,9 @@ val VulcanFeatures = listOf(
|
|||||||
Feature(LOGIN_TYPE_VULCAN, FEATURE_ATTENDANCE, listOf(
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_ATTENDANCE, listOf(
|
||||||
ENDPOINT_VULCAN_API_ATTENDANCE to LOGIN_METHOD_VULCAN_API
|
ENDPOINT_VULCAN_API_ATTENDANCE to LOGIN_METHOD_VULCAN_API
|
||||||
), listOf(LOGIN_METHOD_VULCAN_API)),
|
), listOf(LOGIN_METHOD_VULCAN_API)),
|
||||||
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_ATTENDANCE, listOf(
|
||||||
|
ENDPOINT_VULCAN_HEBE_ATTENDANCE to LOGIN_METHOD_VULCAN_HEBE
|
||||||
|
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
||||||
// messages
|
// messages
|
||||||
Feature(LOGIN_TYPE_VULCAN, FEATURE_MESSAGES_INBOX, listOf(
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_MESSAGES_INBOX, listOf(
|
||||||
ENDPOINT_VULCAN_API_MESSAGES_INBOX to LOGIN_METHOD_VULCAN_API
|
ENDPOINT_VULCAN_API_MESSAGES_INBOX to LOGIN_METHOD_VULCAN_API
|
||||||
@ -71,6 +78,12 @@ val VulcanFeatures = listOf(
|
|||||||
Feature(LOGIN_TYPE_VULCAN, FEATURE_MESSAGES_SENT, listOf(
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_MESSAGES_SENT, listOf(
|
||||||
ENDPOINT_VULCAN_API_MESSAGES_SENT to LOGIN_METHOD_VULCAN_API
|
ENDPOINT_VULCAN_API_MESSAGES_SENT to LOGIN_METHOD_VULCAN_API
|
||||||
), listOf(LOGIN_METHOD_VULCAN_API)),
|
), listOf(LOGIN_METHOD_VULCAN_API)),
|
||||||
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_MESSAGES_INBOX, listOf(
|
||||||
|
ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX to LOGIN_METHOD_VULCAN_HEBE
|
||||||
|
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
||||||
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_MESSAGES_SENT, listOf(
|
||||||
|
ENDPOINT_VULCAN_HEBE_MESSAGES_SENT to LOGIN_METHOD_VULCAN_HEBE
|
||||||
|
), listOf(LOGIN_METHOD_VULCAN_HEBE)),
|
||||||
|
|
||||||
// push config
|
// push config
|
||||||
Feature(LOGIN_TYPE_VULCAN, FEATURE_PUSH_CONFIG, listOf(
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_PUSH_CONFIG, listOf(
|
||||||
@ -89,7 +102,11 @@ val VulcanFeatures = listOf(
|
|||||||
Feature(LOGIN_TYPE_VULCAN, FEATURE_ALWAYS_NEEDED, listOf(
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_ALWAYS_NEEDED, listOf(
|
||||||
ENDPOINT_VULCAN_API_UPDATE_SEMESTER to LOGIN_METHOD_VULCAN_API,
|
ENDPOINT_VULCAN_API_UPDATE_SEMESTER to LOGIN_METHOD_VULCAN_API,
|
||||||
ENDPOINT_VULCAN_API_DICTIONARIES to LOGIN_METHOD_VULCAN_API
|
ENDPOINT_VULCAN_API_DICTIONARIES to LOGIN_METHOD_VULCAN_API
|
||||||
), listOf(LOGIN_METHOD_VULCAN_API))
|
), listOf(LOGIN_METHOD_VULCAN_API)),
|
||||||
|
Feature(LOGIN_TYPE_VULCAN, FEATURE_ALWAYS_NEEDED, listOf(
|
||||||
|
ENDPOINT_VULCAN_HEBE_MAIN to LOGIN_METHOD_VULCAN_HEBE,
|
||||||
|
ENDPOINT_VULCAN_HEBE_ADDRESSBOOK to LOGIN_METHOD_VULCAN_HEBE
|
||||||
|
), listOf(LOGIN_METHOD_VULCAN_HEBE))
|
||||||
/*Feature(LOGIN_TYPE_VULCAN, FEATURE_STUDENT_INFO, listOf(
|
/*Feature(LOGIN_TYPE_VULCAN, FEATURE_STUDENT_INFO, listOf(
|
||||||
ENDPOINT_VULCAN_API to LOGIN_METHOD_VULCAN_WEB
|
ENDPOINT_VULCAN_API to LOGIN_METHOD_VULCAN_WEB
|
||||||
), listOf(LOGIN_METHOD_VULCAN_WEB)),
|
), listOf(LOGIN_METHOD_VULCAN_WEB)),
|
||||||
|
@ -5,13 +5,13 @@
|
|||||||
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.api.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.VulcanHebeExams
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.VulcanHebeGrades
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.VulcanHebeHomework
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe.VulcanHebeTimetable
|
|
||||||
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.utils.Utils
|
import pl.szczodrzynski.edziennik.utils.Utils
|
||||||
|
|
||||||
class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) {
|
class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) {
|
||||||
@ -19,9 +19,35 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) {
|
|||||||
private const val TAG = "VulcanData"
|
private const val TAG = "VulcanData"
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
private var firstSemesterSync = false
|
||||||
nextEndpoint(onSuccess)
|
private val firstSemesterSyncExclude = listOf(
|
||||||
}
|
ENDPOINT_VULCAN_HEBE_MAIN,
|
||||||
|
ENDPOINT_VULCAN_HEBE_ADDRESSBOOK,
|
||||||
|
ENDPOINT_VULCAN_HEBE_TIMETABLE,
|
||||||
|
ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX,
|
||||||
|
ENDPOINT_VULCAN_HEBE_MESSAGES_SENT
|
||||||
|
)
|
||||||
|
|
||||||
|
init { run {
|
||||||
|
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) {
|
||||||
|
firstSemesterSync = true
|
||||||
|
// set to sync 1st semester first
|
||||||
|
data.studentSemesterId = data.semester1Id
|
||||||
|
data.studentSemesterNumber = 1
|
||||||
|
}
|
||||||
|
nextEndpoint {
|
||||||
|
if (firstSemesterSync) {
|
||||||
|
// at the end, set back 2nd semester
|
||||||
|
data.studentSemesterId = data.semester2Id
|
||||||
|
data.studentSemesterNumber = 2
|
||||||
|
}
|
||||||
|
onSuccess()
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
|
||||||
private fun nextEndpoint(onSuccess: () -> Unit) {
|
private fun nextEndpoint(onSuccess: () -> Unit) {
|
||||||
if (data.targetEndpointIds.isEmpty()) {
|
if (data.targetEndpointIds.isEmpty()) {
|
||||||
@ -34,7 +60,21 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) {
|
|||||||
}
|
}
|
||||||
val id = data.targetEndpointIds.firstKey()
|
val id = data.targetEndpointIds.firstKey()
|
||||||
val lastSync = data.targetEndpointIds.remove(id)
|
val lastSync = data.targetEndpointIds.remove(id)
|
||||||
useEndpoint(id, lastSync) { endpointId ->
|
useEndpoint(id, lastSync) {
|
||||||
|
if (firstSemesterSync && id !in firstSemesterSyncExclude) {
|
||||||
|
// sync 2nd semester after every endpoint
|
||||||
|
data.studentSemesterId = data.semester2Id
|
||||||
|
data.studentSemesterNumber = 2
|
||||||
|
useEndpoint(id, lastSync) {
|
||||||
|
// set 1st semester back for the next endpoint
|
||||||
|
data.studentSemesterId = data.semester1Id
|
||||||
|
data.studentSemesterNumber = 1
|
||||||
|
// progress further
|
||||||
|
data.progress(data.progressStep)
|
||||||
|
nextEndpoint(onSuccess)
|
||||||
|
}
|
||||||
|
return@useEndpoint
|
||||||
|
}
|
||||||
data.progress(data.progressStep)
|
data.progress(data.progressStep)
|
||||||
nextEndpoint(onSuccess)
|
nextEndpoint(onSuccess)
|
||||||
}
|
}
|
||||||
@ -95,6 +135,23 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) {
|
|||||||
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)
|
||||||
}
|
}
|
||||||
|
ENDPOINT_VULCAN_HEBE_MAIN -> {
|
||||||
|
if (data.profile == null) {
|
||||||
|
onSuccess(ENDPOINT_VULCAN_HEBE_MAIN)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
data.startProgress(R.string.edziennik_progress_endpoint_student_info)
|
||||||
|
VulcanHebeMain(data, lastSync).getStudents(
|
||||||
|
profile = data.profile,
|
||||||
|
profileList = null
|
||||||
|
) {
|
||||||
|
onSuccess(ENDPOINT_VULCAN_HEBE_MAIN)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ENDPOINT_VULCAN_HEBE_ADDRESSBOOK -> {
|
||||||
|
data.startProgress(R.string.edziennik_progress_endpoint_teachers)
|
||||||
|
VulcanHebeAddressbook(data, lastSync, onSuccess)
|
||||||
|
}
|
||||||
ENDPOINT_VULCAN_HEBE_TIMETABLE -> {
|
ENDPOINT_VULCAN_HEBE_TIMETABLE -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_timetable)
|
data.startProgress(R.string.edziennik_progress_endpoint_timetable)
|
||||||
VulcanHebeTimetable(data, lastSync, onSuccess)
|
VulcanHebeTimetable(data, lastSync, onSuccess)
|
||||||
@ -111,6 +168,18 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) {
|
|||||||
data.startProgress(R.string.edziennik_progress_endpoint_homework)
|
data.startProgress(R.string.edziennik_progress_endpoint_homework)
|
||||||
VulcanHebeHomework(data, lastSync, onSuccess)
|
VulcanHebeHomework(data, lastSync, onSuccess)
|
||||||
}
|
}
|
||||||
|
ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX -> {
|
||||||
|
data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox)
|
||||||
|
VulcanHebeMessages(data, lastSync, onSuccess).getMessages(Message.TYPE_RECEIVED)
|
||||||
|
}
|
||||||
|
ENDPOINT_VULCAN_HEBE_MESSAGES_SENT -> {
|
||||||
|
data.startProgress(R.string.edziennik_progress_endpoint_messages_outbox)
|
||||||
|
VulcanHebeMessages(data, lastSync, onSuccess).getMessages(Message.TYPE_SENT)
|
||||||
|
}
|
||||||
|
ENDPOINT_VULCAN_HEBE_ATTENDANCE -> {
|
||||||
|
data.startProgress(R.string.edziennik_progress_endpoint_attendance)
|
||||||
|
VulcanHebeAttendance(data, lastSync, onSuccess)
|
||||||
|
}
|
||||||
else -> onSuccess(endpointId)
|
else -> onSuccess(endpointId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,9 +42,9 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) {
|
|||||||
val profile
|
val profile
|
||||||
get() = data.profile
|
get() = data.profile
|
||||||
|
|
||||||
fun getDateTime(json: JsonObject?, key: String): Long {
|
fun getDateTime(json: JsonObject?, key: String, default: Long = System.currentTimeMillis()): Long {
|
||||||
val date = json.getJsonObject(key)
|
val date = json.getJsonObject(key)
|
||||||
return date.getLong("Timestamp") ?: return System.currentTimeMillis()
|
return date.getLong("Timestamp") ?: return default
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getDate(json: JsonObject?, key: String): Date? {
|
fun getDate(json: JsonObject?, key: String): Date? {
|
||||||
@ -207,8 +207,9 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val envelope = when (T::class.java) {
|
val envelope = when (T::class.java) {
|
||||||
JsonObject::class.java -> json.getJsonObject("Envelope")
|
JsonObject::class.java -> json.getJsonObject("Envelope") as T
|
||||||
JsonArray::class.java -> json.getJsonArray("Envelope")
|
JsonArray::class.java -> json.getJsonArray("Envelope") as T
|
||||||
|
java.lang.Boolean::class.java -> json.getBoolean("Envelope") as T
|
||||||
else -> {
|
else -> {
|
||||||
data.error(ApiError(tag, ERROR_RESPONSE_EMPTY)
|
data.error(ApiError(tag, ERROR_RESPONSE_EMPTY)
|
||||||
.withResponse(response)
|
.withResponse(response)
|
||||||
@ -219,7 +220,7 @@ open class VulcanHebe(open val data: DataVulcan, open val lastSync: Long?) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
onSuccess(envelope as T, response)
|
onSuccess(envelope, response)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
data.error(ApiError(tag, EXCEPTION_VULCAN_HEBE_REQUEST)
|
data.error(ApiError(tag, EXCEPTION_VULCAN_HEBE_REQUEST)
|
||||||
.withResponse(response)
|
.withResponse(response)
|
||||||
|
@ -0,0 +1,118 @@
|
|||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe
|
||||||
|
|
||||||
|
import androidx.core.util.set
|
||||||
|
import pl.szczodrzynski.edziennik.*
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.VULCAN_HEBE_ENDPOINT_ADDRESSBOOK
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_HEBE_ADDRESSBOOK
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanHebe
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Teacher.Companion.TYPE_EDUCATOR
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Teacher.Companion.TYPE_OTHER
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Teacher.Companion.TYPE_PARENT
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Teacher.Companion.TYPE_PARENTS_COUNCIL
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Teacher.Companion.TYPE_STUDENT
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Teacher.Companion.TYPE_TEACHER
|
||||||
|
import kotlin.text.replace
|
||||||
|
|
||||||
|
class VulcanHebeAddressbook(
|
||||||
|
override val data: DataVulcan,
|
||||||
|
override val lastSync: Long?,
|
||||||
|
val onSuccess: (endpointId: Int) -> Unit
|
||||||
|
) : VulcanHebe(data, lastSync) {
|
||||||
|
companion object {
|
||||||
|
const val TAG = "VulcanHebeAddressbook"
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun String.removeUnitName(unitName: String?): String {
|
||||||
|
return (unitName ?: data.schoolShort)?.let {
|
||||||
|
this.replace("($it)", "").trim()
|
||||||
|
} ?: this
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
apiGetList(
|
||||||
|
TAG,
|
||||||
|
VULCAN_HEBE_ENDPOINT_ADDRESSBOOK,
|
||||||
|
HebeFilterType.BY_PERSON,
|
||||||
|
lastSync = lastSync,
|
||||||
|
includeFilterType = false
|
||||||
|
) { list, _ ->
|
||||||
|
list.forEach { person ->
|
||||||
|
val id = person.getString("Id") ?: return@forEach
|
||||||
|
val loginId = person.getString("LoginId") ?: return@forEach
|
||||||
|
|
||||||
|
val idType = id.split("-")
|
||||||
|
.getOrNull(0)
|
||||||
|
val idLong = id.split("-")
|
||||||
|
.getOrNull(1)
|
||||||
|
?.toLongOrNull()
|
||||||
|
?: return@forEach
|
||||||
|
|
||||||
|
val typeBase = when (idType) {
|
||||||
|
"e" -> TYPE_TEACHER
|
||||||
|
"c" -> TYPE_PARENT
|
||||||
|
"p" -> TYPE_STUDENT
|
||||||
|
else -> TYPE_OTHER
|
||||||
|
}
|
||||||
|
|
||||||
|
val name = person.getString("Name") ?: ""
|
||||||
|
val surname = person.getString("Surname") ?: ""
|
||||||
|
val namePrefix = "$surname $name - "
|
||||||
|
|
||||||
|
val teacher = data.teacherList[idLong] ?: Teacher(
|
||||||
|
data.profileId,
|
||||||
|
idLong,
|
||||||
|
name,
|
||||||
|
surname,
|
||||||
|
loginId
|
||||||
|
).also {
|
||||||
|
data.teacherList[idLong] = it
|
||||||
|
}
|
||||||
|
|
||||||
|
person.getJsonArray("Roles")?.asJsonObjectList()?.onEach { role ->
|
||||||
|
var roleText: String? = null
|
||||||
|
val unitName = role.getString("ConstituentUnitSymbol")
|
||||||
|
|
||||||
|
val personType = when (role.getInt("RoleOrder")) {
|
||||||
|
0 -> { /* Wychowawca */
|
||||||
|
roleText = role.getString("ClassSymbol")
|
||||||
|
?.removeUnitName(unitName)
|
||||||
|
TYPE_EDUCATOR
|
||||||
|
}
|
||||||
|
1 -> TYPE_TEACHER /* Nauczyciel */
|
||||||
|
2 -> return@onEach /* Pracownik */
|
||||||
|
3 -> { /* Rada rodziców */
|
||||||
|
roleText = role.getString("Address")
|
||||||
|
?.removeUnitName(unitName)
|
||||||
|
?.removePrefix(namePrefix)
|
||||||
|
?.trim()
|
||||||
|
TYPE_PARENTS_COUNCIL
|
||||||
|
}
|
||||||
|
5 -> {
|
||||||
|
roleText = role.getString("RoleName")
|
||||||
|
?.plus(" - ")
|
||||||
|
?.plus(
|
||||||
|
role.getString("Address")
|
||||||
|
?.removeUnitName(unitName)
|
||||||
|
?.removePrefix(namePrefix)
|
||||||
|
?.trim()
|
||||||
|
)
|
||||||
|
TYPE_STUDENT
|
||||||
|
}
|
||||||
|
else -> TYPE_OTHER
|
||||||
|
}
|
||||||
|
|
||||||
|
teacher.setTeacherType(personType)
|
||||||
|
teacher.typeDescription = roleText
|
||||||
|
}
|
||||||
|
|
||||||
|
if (teacher.type == 0)
|
||||||
|
teacher.setTeacherType(typeBase)
|
||||||
|
}
|
||||||
|
|
||||||
|
data.setSyncNext(ENDPOINT_VULCAN_HEBE_ADDRESSBOOK, 2 * DAY)
|
||||||
|
onSuccess(ENDPOINT_VULCAN_HEBE_ADDRESSBOOK)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,143 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2021-2-21
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject
|
||||||
|
import pl.szczodrzynski.edziennik.*
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.VULCAN_HEBE_ENDPOINT_ATTENDANCE
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_HEBE_ATTENDANCE
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanHebe
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Attendance
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
|
|
||||||
|
class VulcanHebeAttendance(
|
||||||
|
override val data: DataVulcan,
|
||||||
|
override val lastSync: Long?,
|
||||||
|
val onSuccess: (endpointId: Int) -> Unit
|
||||||
|
) : VulcanHebe(data, lastSync) {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val TAG = "VulcanHebeAttendance"
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
val semesterNumber = data.studentSemesterNumber
|
||||||
|
val startDate = profile?.getSemesterStart(semesterNumber)
|
||||||
|
val endDate = profile?.getSemesterEnd(semesterNumber)
|
||||||
|
|
||||||
|
apiGetList(
|
||||||
|
TAG,
|
||||||
|
VULCAN_HEBE_ENDPOINT_ATTENDANCE,
|
||||||
|
HebeFilterType.BY_PUPIL,
|
||||||
|
dateFrom = startDate,
|
||||||
|
dateTo = endDate,
|
||||||
|
lastSync = lastSync
|
||||||
|
) { list, _ ->
|
||||||
|
list.forEach { attendance ->
|
||||||
|
val id = attendance.getLong("AuxPresenceId") ?: return@forEach
|
||||||
|
val type = attendance.getJsonObject("PresenceType") ?: return@forEach
|
||||||
|
val baseType = getBaseType(type)
|
||||||
|
val typeName = type.getString("Name") ?: return@forEach
|
||||||
|
val typeCategoryId = type.getLong("CategoryId") ?: return@forEach
|
||||||
|
val typeSymbol = type.getString("Symbol") ?: return@forEach
|
||||||
|
val typeShort = when (typeCategoryId.toInt()) {
|
||||||
|
6, 8 -> typeSymbol
|
||||||
|
else -> data.app.attendanceManager.getTypeShort(baseType)
|
||||||
|
}
|
||||||
|
val typeColor = when (typeCategoryId.toInt()) {
|
||||||
|
1 -> 0xffffffff // obecność
|
||||||
|
2 -> 0xffffa687 // nieobecność
|
||||||
|
3 -> 0xfffcc150 // nieobecność usprawiedliwiona
|
||||||
|
4 -> 0xffede049 // spóźnienie
|
||||||
|
5 -> 0xffbbdd5f // spóźnienie usprawiedliwione
|
||||||
|
6 -> 0xffa9c9fd // nieobecny z przyczyn szkolnych
|
||||||
|
7 -> 0xffddbbe5 // zwolniony
|
||||||
|
8 -> 0xffffffff // usunięty wpis
|
||||||
|
else -> null
|
||||||
|
}?.toInt()
|
||||||
|
val date = getDate(attendance, "Day") ?: return@forEach
|
||||||
|
val lessonRange = getLessonRange(attendance, "TimeSlot")
|
||||||
|
val startTime = lessonRange?.startTime
|
||||||
|
val semester = profile?.dateToSemester(date) ?: return@forEach
|
||||||
|
val teacherId = attendance.getJsonObject("TeacherPrimary")?.getLong("Id") ?: -1
|
||||||
|
val subjectId = attendance.getJsonObject("Subject")?.getLong("Id") ?: -1
|
||||||
|
val addedDate = getDateTime(attendance, "DateModify")
|
||||||
|
val lessonNumber = lessonRange?.lessonNumber
|
||||||
|
val isCounted = attendance.getBoolean("CalculatePresence")
|
||||||
|
?: (baseType != Attendance.TYPE_RELEASED)
|
||||||
|
|
||||||
|
val attendanceObject = Attendance(
|
||||||
|
profileId = profileId,
|
||||||
|
id = id,
|
||||||
|
baseType = baseType,
|
||||||
|
typeName = typeName,
|
||||||
|
typeShort = typeShort,
|
||||||
|
typeSymbol = typeSymbol,
|
||||||
|
typeColor = typeColor,
|
||||||
|
date = date,
|
||||||
|
startTime = startTime,
|
||||||
|
semester = semester,
|
||||||
|
teacherId = teacherId,
|
||||||
|
subjectId = subjectId,
|
||||||
|
addedDate = addedDate
|
||||||
|
).also {
|
||||||
|
it.lessonNumber = lessonNumber
|
||||||
|
it.isCounted = isCounted
|
||||||
|
}
|
||||||
|
|
||||||
|
data.attendanceList.add(attendanceObject)
|
||||||
|
if (baseType != Attendance.TYPE_PRESENT) {
|
||||||
|
data.metadataList.add(
|
||||||
|
Metadata(
|
||||||
|
profileId,
|
||||||
|
Metadata.TYPE_ATTENDANCE,
|
||||||
|
attendanceObject.id,
|
||||||
|
profile?.empty ?: true
|
||||||
|
|| baseType == Attendance.TYPE_PRESENT_CUSTOM
|
||||||
|
|| baseType == Attendance.TYPE_UNKNOWN,
|
||||||
|
profile?.empty ?: true
|
||||||
|
|| baseType == Attendance.TYPE_PRESENT_CUSTOM
|
||||||
|
|| baseType == Attendance.TYPE_UNKNOWN
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data.setSyncNext(ENDPOINT_VULCAN_HEBE_ATTENDANCE, SYNC_ALWAYS)
|
||||||
|
onSuccess(ENDPOINT_VULCAN_HEBE_ATTENDANCE)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getBaseType(attendanceType: JsonObject): Int {
|
||||||
|
val absent = attendanceType.getBoolean("Absence") ?: false
|
||||||
|
val excused = attendanceType.getBoolean("AbsenceJustified") ?: false
|
||||||
|
return if (absent) {
|
||||||
|
if (excused)
|
||||||
|
Attendance.TYPE_ABSENT_EXCUSED
|
||||||
|
else
|
||||||
|
Attendance.TYPE_ABSENT
|
||||||
|
} else {
|
||||||
|
val belated = attendanceType.getBoolean("Late") ?: false
|
||||||
|
val released = attendanceType.getBoolean("LegalAbsence") ?: false
|
||||||
|
val present = attendanceType.getBoolean("Presence") ?: true
|
||||||
|
if (belated)
|
||||||
|
if (excused)
|
||||||
|
Attendance.TYPE_BELATED_EXCUSED
|
||||||
|
else
|
||||||
|
Attendance.TYPE_BELATED
|
||||||
|
else if (released)
|
||||||
|
Attendance.TYPE_RELEASED
|
||||||
|
else if (present)
|
||||||
|
if (attendanceType.getInt("CategoryId") != 1)
|
||||||
|
Attendance.TYPE_PRESENT_CUSTOM
|
||||||
|
else
|
||||||
|
Attendance.TYPE_PRESENT
|
||||||
|
else
|
||||||
|
Attendance.TYPE_UNKNOWN
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -76,7 +76,7 @@ class VulcanHebeMain(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val schoolSymbol = unit.getString("Symbol") ?: return@forEach
|
val schoolSymbol = unit.getString("Symbol") ?: return@forEach
|
||||||
val schoolShort = unit.getString("Short") ?: return@forEach
|
val schoolShort = constituentUnit.getString("Short") ?: return@forEach
|
||||||
val schoolCode = "${data.symbol}_$schoolSymbol"
|
val schoolCode = "${data.symbol}_$schoolSymbol"
|
||||||
|
|
||||||
val studentUnitId = unit.getInt("Id") ?: return@forEach
|
val studentUnitId = unit.getInt("Id") ?: return@forEach
|
||||||
|
@ -0,0 +1,127 @@
|
|||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe
|
||||||
|
|
||||||
|
import androidx.core.util.set
|
||||||
|
import com.google.gson.JsonObject
|
||||||
|
import pl.szczodrzynski.edziennik.*
|
||||||
|
import pl.szczodrzynski.edziennik.MainActivity.Companion.DRAWER_ITEM_MESSAGES
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.VULCAN_HEBE_ENDPOINT_MESSAGES
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_HEBE_MESSAGES_SENT
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanHebe
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.*
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_DELETED
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_RECEIVED
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_SENT
|
||||||
|
import pl.szczodrzynski.navlib.crc16
|
||||||
|
import kotlin.text.replace
|
||||||
|
|
||||||
|
class VulcanHebeMessages(
|
||||||
|
override val data: DataVulcan,
|
||||||
|
override val lastSync: Long?,
|
||||||
|
val onSuccess: (endpointId: Int) -> Unit
|
||||||
|
) : VulcanHebe(data, lastSync) {
|
||||||
|
companion object {
|
||||||
|
const val TAG = "VulcanHebeMessagesInbox"
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getPersonId(json: JsonObject): Long {
|
||||||
|
val senderLoginId = json.getInt("LoginId") ?: return -1
|
||||||
|
/*if (senderLoginId == data.studentLoginId)
|
||||||
|
return -1*/
|
||||||
|
|
||||||
|
val senderName = json.getString("Address") ?: return -1
|
||||||
|
val senderNameSplit = senderName.splitName()
|
||||||
|
val senderLoginIdStr = senderLoginId.toString()
|
||||||
|
val teacher = data.teacherList.singleOrNull { it.loginId == senderLoginIdStr }
|
||||||
|
?: Teacher(
|
||||||
|
profileId,
|
||||||
|
-1 * crc16(senderName).toLong(),
|
||||||
|
senderNameSplit?.second ?: "",
|
||||||
|
senderNameSplit?.first ?: "",
|
||||||
|
senderLoginIdStr
|
||||||
|
).also {
|
||||||
|
it.setTeacherType(Teacher.TYPE_OTHER)
|
||||||
|
data.teacherList[it.id] = it
|
||||||
|
}
|
||||||
|
return teacher.id
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getMessages(messageType: Int) {
|
||||||
|
val folder = when (messageType) {
|
||||||
|
TYPE_RECEIVED -> 1
|
||||||
|
TYPE_SENT -> 2
|
||||||
|
TYPE_DELETED -> 3
|
||||||
|
else -> 1
|
||||||
|
}
|
||||||
|
val endpointId = when (messageType) {
|
||||||
|
TYPE_RECEIVED -> ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX
|
||||||
|
TYPE_SENT -> ENDPOINT_VULCAN_HEBE_MESSAGES_SENT
|
||||||
|
else -> ENDPOINT_VULCAN_HEBE_MESSAGES_INBOX
|
||||||
|
}
|
||||||
|
apiGetList(
|
||||||
|
TAG,
|
||||||
|
VULCAN_HEBE_ENDPOINT_MESSAGES,
|
||||||
|
HebeFilterType.BY_PERSON,
|
||||||
|
folder = folder,
|
||||||
|
lastSync = lastSync
|
||||||
|
) { list, _ ->
|
||||||
|
list.forEach { message ->
|
||||||
|
val id = message.getLong("Id") ?: return@forEach
|
||||||
|
val subject = message.getString("Subject") ?: return@forEach
|
||||||
|
val body = message.getString("Content") ?: return@forEach
|
||||||
|
|
||||||
|
val sender = message.getJsonObject("Sender") ?: return@forEach
|
||||||
|
|
||||||
|
val sentDate = getDateTime(message, "DateSent")
|
||||||
|
val readDate = getDateTime(message, "DateRead", default = 0)
|
||||||
|
|
||||||
|
val messageObject = Message(
|
||||||
|
profileId = profileId,
|
||||||
|
id = id,
|
||||||
|
type = messageType,
|
||||||
|
subject = subject,
|
||||||
|
body = body.replace("\n", "<br>"),
|
||||||
|
senderId = if (messageType == TYPE_RECEIVED) getPersonId(sender) else null,
|
||||||
|
addedDate = sentDate
|
||||||
|
)
|
||||||
|
|
||||||
|
val receivers = message.getJsonArray("Receiver")
|
||||||
|
?.asJsonObjectList()
|
||||||
|
?: return@forEach
|
||||||
|
val receiverReadDate =
|
||||||
|
if (receivers.size == 1) readDate
|
||||||
|
else -1
|
||||||
|
|
||||||
|
for (receiver in receivers) {
|
||||||
|
val messageRecipientObject = MessageRecipient(
|
||||||
|
profileId,
|
||||||
|
if (messageType == TYPE_SENT) getPersonId(receiver) else -1,
|
||||||
|
-1,
|
||||||
|
receiverReadDate,
|
||||||
|
id
|
||||||
|
)
|
||||||
|
data.messageRecipientList.add(messageRecipientObject)
|
||||||
|
}
|
||||||
|
|
||||||
|
data.messageList.add(messageObject)
|
||||||
|
data.setSeenMetadataList.add(
|
||||||
|
Metadata(
|
||||||
|
profileId,
|
||||||
|
Metadata.TYPE_MESSAGE,
|
||||||
|
id,
|
||||||
|
readDate > 0 || messageType == TYPE_SENT,
|
||||||
|
readDate > 0 || messageType == TYPE_SENT
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
data.setSyncNext(
|
||||||
|
endpointId,
|
||||||
|
if (messageType == TYPE_RECEIVED) SYNC_ALWAYS else 1 * DAY,
|
||||||
|
if (messageType == TYPE_RECEIVED) null else DRAWER_ITEM_MESSAGES
|
||||||
|
)
|
||||||
|
onSuccess(endpointId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.hebe
|
||||||
|
|
||||||
|
import org.greenrobot.eventbus.EventBus
|
||||||
|
import pl.szczodrzynski.edziennik.JsonObject
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.VULCAN_HEBE_ENDPOINT_MESSAGES_STATUS
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanHebe
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.events.MessageGetEvent
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.entity.Message
|
||||||
|
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 VulcanHebeMessagesChangeStatus(
|
||||||
|
override val data: DataVulcan,
|
||||||
|
private val messageObject: MessageFull,
|
||||||
|
val onSuccess: () -> Unit
|
||||||
|
) : VulcanHebe(data, null) {
|
||||||
|
companion object {
|
||||||
|
const val TAG = "VulcanHebeMessagesChangeStatus"
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
apiPost(
|
||||||
|
TAG,
|
||||||
|
VULCAN_HEBE_ENDPOINT_MESSAGES_STATUS,
|
||||||
|
payload = JsonObject(
|
||||||
|
"MessageId" to messageObject.id,
|
||||||
|
"LoginId" to data.studentLoginId,
|
||||||
|
"Status" to 1
|
||||||
|
)
|
||||||
|
) { _: Boolean, _ ->
|
||||||
|
|
||||||
|
if (!messageObject.seen) {
|
||||||
|
data.setSeenMetadataList.add(
|
||||||
|
Metadata(
|
||||||
|
profileId,
|
||||||
|
Metadata.TYPE_MESSAGE,
|
||||||
|
messageObject.id,
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
)
|
||||||
|
)
|
||||||
|
messageObject.seen = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (messageObject.type != Message.TYPE_SENT) {
|
||||||
|
val messageRecipientObject = MessageRecipient(
|
||||||
|
profileId,
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
System.currentTimeMillis(),
|
||||||
|
messageObject.id
|
||||||
|
)
|
||||||
|
data.messageRecipientList.add(messageRecipientObject)
|
||||||
|
}
|
||||||
|
|
||||||
|
EventBus.getDefault().postSticky(MessageGetEvent(messageObject))
|
||||||
|
onSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -119,7 +119,7 @@ class VulcanHebeTimetable(
|
|||||||
val startTime = lessonRange?.startTime
|
val startTime = lessonRange?.startTime
|
||||||
val endTime = lessonRange?.endTime
|
val endTime = lessonRange?.endTime
|
||||||
val teacherId = getTeacherId(json, "TeacherPrimary")
|
val teacherId = getTeacherId(json, "TeacherPrimary")
|
||||||
val classroom = json.getString("Room")
|
val classroom = json.getJsonObject("Room").getString("Code")
|
||||||
val subjectId = getSubjectId(json, "Subject")
|
val subjectId = getSubjectId(json, "Subject")
|
||||||
|
|
||||||
val teamId = getTeamId(json, "Distribution")
|
val teamId = getTeamId(json, "Distribution")
|
||||||
@ -168,7 +168,7 @@ class VulcanHebeTimetable(
|
|||||||
val changeStartTime = changeLessonRange?.startTime
|
val changeStartTime = changeLessonRange?.startTime
|
||||||
val changeEndTime = changeLessonRange?.endTime
|
val changeEndTime = changeLessonRange?.endTime
|
||||||
val changeTeacherId = getTeacherId(changeJson, "TeacherPrimary") ?: teacherId
|
val changeTeacherId = getTeacherId(changeJson, "TeacherPrimary") ?: teacherId
|
||||||
val changeClassroom = changeJson.getString("Room") ?: classroom
|
val changeClassroom = changeJson.getJsonObject("Room").getString("Code") ?: classroom
|
||||||
val changeSubjectId = getSubjectId(changeJson, "Subject") ?: subjectId
|
val changeSubjectId = getSubjectId(changeJson, "Subject") ?: subjectId
|
||||||
|
|
||||||
val changeTeamId = getTeamId(json, "Distribution")
|
val changeTeamId = getTeamId(json, "Distribution")
|
||||||
|
@ -46,6 +46,6 @@ object Signing {
|
|||||||
|
|
||||||
/*fun provideKey(param1: String, param2: Long): ByteArray {*/
|
/*fun provideKey(param1: String, param2: Long): ByteArray {*/
|
||||||
fun pleaseStopRightNow(param1: String, param2: Long): ByteArray {
|
fun pleaseStopRightNow(param1: String, param2: Long): ByteArray {
|
||||||
return "$param1.MTIzNDU2Nzg5MDQLA8n9Ff===.$param2".sha256()
|
return "$param1.MTIzNDU2Nzg5MD5LwH9bSc===.$param2".sha256()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -130,65 +130,13 @@ object LoginInfo {
|
|||||||
registerName = R.string.login_type_vulcan,
|
registerName = R.string.login_type_vulcan,
|
||||||
registerLogo = R.drawable.login_logo_vulcan,
|
registerLogo = R.drawable.login_logo_vulcan,
|
||||||
loginModes = listOf(
|
loginModes = listOf(
|
||||||
Mode(
|
|
||||||
loginMode = LOGIN_MODE_VULCAN_API,
|
|
||||||
name = R.string.login_mode_vulcan_api,
|
|
||||||
icon = R.drawable.login_mode_vulcan_api,
|
|
||||||
hintText = R.string.login_mode_vulcan_api_hint,
|
|
||||||
guideText = R.string.login_mode_vulcan_api_guide,
|
|
||||||
isRecommended = true,
|
|
||||||
credentials = listOf(
|
|
||||||
FormField(
|
|
||||||
keyName = "deviceToken",
|
|
||||||
name = R.string.login_hint_token,
|
|
||||||
icon = CommunityMaterial.Icon.cmd_code_braces,
|
|
||||||
emptyText = R.string.login_error_no_token,
|
|
||||||
invalidText = R.string.login_error_incorrect_token,
|
|
||||||
errorCodes = mapOf(
|
|
||||||
ERROR_LOGIN_VULCAN_INVALID_TOKEN to R.string.login_error_incorrect_token
|
|
||||||
),
|
|
||||||
isRequired = true,
|
|
||||||
validationRegex = "[A-Z0-9]{5,12}",
|
|
||||||
caseMode = FormField.CaseMode.UPPER_CASE
|
|
||||||
),
|
|
||||||
FormField(
|
|
||||||
keyName = "symbol",
|
|
||||||
name = R.string.login_hint_symbol,
|
|
||||||
icon = CommunityMaterial.Icon2.cmd_school,
|
|
||||||
emptyText = R.string.login_error_no_symbol,
|
|
||||||
invalidText = R.string.login_error_incorrect_symbol,
|
|
||||||
errorCodes = mapOf(
|
|
||||||
ERROR_LOGIN_VULCAN_INVALID_SYMBOL to R.string.login_error_incorrect_symbol
|
|
||||||
),
|
|
||||||
isRequired = true,
|
|
||||||
validationRegex = "[a-z0-9_-]+",
|
|
||||||
caseMode = FormField.CaseMode.LOWER_CASE
|
|
||||||
),
|
|
||||||
FormField(
|
|
||||||
keyName = "devicePin",
|
|
||||||
name = R.string.login_hint_pin,
|
|
||||||
icon = CommunityMaterial.Icon2.cmd_lock,
|
|
||||||
emptyText = R.string.login_error_no_pin,
|
|
||||||
invalidText = R.string.login_error_incorrect_pin,
|
|
||||||
errorCodes = mapOf(
|
|
||||||
ERROR_LOGIN_VULCAN_INVALID_PIN to R.string.login_error_incorrect_pin
|
|
||||||
),
|
|
||||||
isRequired = true,
|
|
||||||
validationRegex = "[0-9]+",
|
|
||||||
caseMode = FormField.CaseMode.LOWER_CASE
|
|
||||||
)
|
|
||||||
),
|
|
||||||
errorCodes = mapOf(
|
|
||||||
ERROR_LOGIN_VULCAN_EXPIRED_TOKEN to R.string.login_error_expired_token
|
|
||||||
)
|
|
||||||
),
|
|
||||||
Mode(
|
Mode(
|
||||||
loginMode = LOGIN_MODE_VULCAN_HEBE,
|
loginMode = LOGIN_MODE_VULCAN_HEBE,
|
||||||
name = R.string.login_mode_vulcan_api,
|
name = R.string.login_mode_vulcan_api,
|
||||||
icon = R.drawable.login_mode_vulcan_hebe,
|
icon = R.drawable.login_mode_vulcan_hebe,
|
||||||
hintText = R.string.login_mode_vulcan_api_hint,
|
hintText = R.string.login_mode_vulcan_api_hint,
|
||||||
guideText = R.string.login_mode_vulcan_api_guide,
|
guideText = R.string.login_mode_vulcan_api_guide,
|
||||||
isTesting = true,
|
isRecommended = true,
|
||||||
credentials = listOf(
|
credentials = listOf(
|
||||||
FormField(
|
FormField(
|
||||||
keyName = "deviceToken",
|
keyName = "deviceToken",
|
||||||
|
@ -130,6 +130,7 @@
|
|||||||
<string name="error_341" translatable="false">ERROR_VULCAN_API_BAD_REQUEST</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_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_401" translatable="false">ERROR_LOGIN_IDZIENNIK_WEB_INVALID_LOGIN</string>
|
<string name="error_401" translatable="false">ERROR_LOGIN_IDZIENNIK_WEB_INVALID_LOGIN</string>
|
||||||
<string name="error_402" translatable="false">ERROR_LOGIN_IDZIENNIK_WEB_INVALID_SCHOOL_NAME</string>
|
<string name="error_402" translatable="false">ERROR_LOGIN_IDZIENNIK_WEB_INVALID_SCHOOL_NAME</string>
|
||||||
@ -318,6 +319,7 @@
|
|||||||
<string name="error_341_reason">VULCAN®: błąd żądania, zgłoś błąd</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_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_401_reason">Nieprawidłowe dane logowania</string>
|
<string name="error_401_reason">Nieprawidłowe dane logowania</string>
|
||||||
<string name="error_402_reason">Nieprawidłowa nazwa szkoły</string>
|
<string name="error_402_reason">Nieprawidłowa nazwa szkoły</string>
|
||||||
|
@ -5,8 +5,8 @@ buildscript {
|
|||||||
kotlin_version = '1.4.30'
|
kotlin_version = '1.4.30'
|
||||||
|
|
||||||
release = [
|
release = [
|
||||||
versionName: "4.5-beta.1",
|
versionName: "4.5",
|
||||||
versionCode: 4050001
|
versionCode: 4050099
|
||||||
]
|
]
|
||||||
|
|
||||||
setup = [
|
setup = [
|
||||||
|
Reference in New Issue
Block a user