)(.*?)""".toRegex(DOT_MATCHES_ALL)
- }
- val MOBIDZIENNIK_ATTENDANCE_COLUMN_SPAN by lazy {
- """colspan="(\d+)"""".toRegex()
- }
val MOBIDZIENNIK_ATTENDANCE_RANGE by lazy {
"""([0-9:]+) - .+? (.+?)""".toRegex(DOT_MATCHES_ALL)
}
val MOBIDZIENNIK_ATTENDANCE_LESSON by lazy {
- """(.+?)\s*\s*\((.+?),\s*(.+?)\)""".toRegex(DOT_MATCHES_ALL)
- }
-
- val MOBIDZIENNIK_HOMEWORK_ROW by lazy {
- """class="rowRolling">(.+?\s*)""".toRegex(DOT_MATCHES_ALL)
- }
- val MOBIDZIENNIK_HOMEWORK_ITEM by lazy {
- """(.+?):\s*(.+?)\s*
""".toRegex(DOT_MATCHES_ALL)
- }
- val MOBIDZIENNIK_HOMEWORK_BODY by lazy {
- """Treść:(.+?)""".toRegex(DOT_MATCHES_ALL)
- }
- val MOBIDZIENNIK_HOMEWORK_ID by lazy {
- """zadanieFormularz\(([0-9]+),""".toRegex(DOT_MATCHES_ALL)
- }
- val MOBIDZIENNIK_HOMEWORK_ATTACHMENT by lazy {
- """zalacznik(_zadania)?=([0-9]+)'.+?word-break">(.+?)""".toRegex(DOT_MATCHES_ALL)
+ """(.+?) - (.*?).+?.+?\((.+?), .+?(.+?)\)""".toRegex(DOT_MATCHES_ALL)
}
@@ -138,33 +109,17 @@ object Regexes {
val IDZIENNIK_MESSAGES_RECIPIENT_PARENT by lazy {
"""(.+?)\s\((.+)\)""".toRegex()
}
- /*Szczęśliwy los na dzisiaj to 19. Los na jutro to 22*/
- val IDZIENNIK_WEB_LUCKY_NUMBER by lazy {
- """dzisiaj to ([0-9]+)""".toRegex()
- }
- val IDZIENNIK_WEB_SELECTED_REGISTER by lazy {
- """selected="selected" value="([0-9]+)" data-id-ucznia""".toRegex()
- }
val VULCAN_SHIFT_ANNOTATION by lazy {
"""\(przeniesiona (z|na) lekcj[ię] ([0-9]+), (.+)\)""".toRegex()
}
- val VULCAN_WEB_PERMISSIONS by lazy {
- """permissions: '([A-z0-9/=+\-_]+?)'""".toRegex()
- }
- val VULCAN_WEB_SYMBOL_VALIDATE by lazy {
- """[A-z0-9]+""".toRegex(IGNORE_CASE)
- }
val LIBRUS_ATTACHMENT_KEY by lazy {
- """singleUseKey=([0-9A-z_]+)""".toRegex()
- }
- val LIBRUS_MESSAGE_ID by lazy {
- """/wiadomosci/[0-9]+/[0-9]+/([0-9]+?)/""".toRegex()
+ """singleUseKey=([0-9A-f_]+)""".toRegex()
}
@@ -192,9 +147,6 @@ object Regexes {
val EDUDZIENNIK_ANNOUNCEMENT_DESCRIPTION by lazy {
""".*?
(.*?)
""".toRegex(DOT_MATCHES_ALL)
}
- val EDUDZIENNIK_HOMEWORK_DESCRIPTION by lazy {
- """
(.*?)
""".toRegex(DOT_MATCHES_ALL)
- }
val EDUDZIENNIK_SUBJECT_ID by lazy {
"""/Courses/([\w-_]+?)/""".toRegex()
@@ -240,20 +192,4 @@ object Regexes {
val EDUDZIENNIK_TEACHERS by lazy {
"""
.*?
(.+?) (.+?)
""".toRegex(DOT_MATCHES_ALL)
}
-
-
-
-
- val LINKIFY_DATE_YMD by lazy {
- """(1\d{3}|20\d{2})[\-./](1[0-2]|0?\d)[\-./]([1-2]\d|3[0-1]|0?\d)""".toRegex()
- }
- val LINKIFY_DATE_DMY by lazy {
- """(?>? = null, onlyEndpoints: List
? = null, arguments: JsonObject? = null) = EdziennikTask(profileId, SyncProfileRequest(viewIds, onlyEndpoints, arguments))
+ fun syncProfile(profileId: Int, viewIds: List>? = null, arguments: JsonObject? = null) = EdziennikTask(profileId, SyncProfileRequest(viewIds, arguments))
fun syncProfileList(profileList: List) = EdziennikTask(-1, SyncProfileListRequest(profileList))
fun messageGet(profileId: Int, message: MessageFull) = EdziennikTask(profileId, MessageGetRequest(message))
fun messageSend(profileId: Int, recipients: List, subject: String, text: String) = EdziennikTask(profileId, MessageSendRequest(recipients, subject, text))
fun announcementsRead(profileId: Int) = EdziennikTask(profileId, AnnouncementsReadRequest())
fun announcementGet(profileId: Int, announcement: AnnouncementFull) = EdziennikTask(profileId, AnnouncementGetRequest(announcement))
- fun attachmentGet(profileId: Int, owner: Any, attachmentId: Long, attachmentName: String) = EdziennikTask(profileId, AttachmentGetRequest(owner, attachmentId, attachmentName))
+ fun attachmentGet(profileId: Int, message: Message, attachmentId: Long, attachmentName: String) = EdziennikTask(profileId, AttachmentGetRequest(message, attachmentId, attachmentName))
fun recipientListGet(profileId: Int) = EdziennikTask(profileId, RecipientListGetRequest())
- fun eventGet(profileId: Int, event: EventFull) = EdziennikTask(profileId, EventGetRequest(event))
}
private lateinit var loginStore: LoginStore
@@ -67,65 +58,21 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
// save the profile ID and name as the current task's
taskName = app.getString(R.string.edziennik_notification_api_sync_title_format, profile.name)
}
- EdziennikTask.profile = this.profile
- EdziennikTask.loginStore = this.loginStore
}
private var edziennikInterface: EdziennikInterface? = null
internal fun run(app: App, taskCallback: EdziennikCallback) {
- profile?.let { profile ->
- if (profile.archived) {
- d(TAG, "The profile $profileId is archived")
- taskCallback.onError(ApiError(TAG, ERROR_PROFILE_ARCHIVED))
- return
- }
- else if (profile.shouldArchive()) {
- d(TAG, "The profile $profileId's year ended on ${profile.dateYearEnd}, archiving")
- ProfileArchiver(app, profile)
- }
- if (profile.isBeforeYear()) {
- d(TAG, "The profile $profileId's school year has not started yet; aborting sync")
- cancel()
- taskCallback.onCompleted()
- return
- }
-
- profile.registerName?.let { registerName ->
- var status = app.config.sync.registerAvailability[registerName]
- if (status == null || status.nextCheck < currentTimeUnix()) {
- val api = SzkolnyApi(app)
- api.runCatching({
- val availability = getRegisterAvailability()
- app.config.sync.registerAvailability = availability
- status = availability[registerName]
- }, onError = {
- taskCallback.onError(it.toApiError(TAG))
- return
- })
- }
-
- if (status?.available != true
- || status?.minVersionCode ?: BuildConfig.VERSION_CODE > BuildConfig.VERSION_CODE) {
- if (EventBus.getDefault().hasSubscriberForEvent(RegisterAvailabilityEvent::class.java)) {
- EventBus.getDefault().postSticky(
- RegisterAvailabilityEvent(app.config.sync.registerAvailability)
- )
- }
- cancel()
- taskCallback.onCompleted()
- return
- }
- }
+ if (profile?.archived == true) {
+ taskCallback.onError(ApiError(TAG, ERROR_PROFILE_ARCHIVED))
+ return
}
-
edziennikInterface = when (loginStore.type) {
LOGIN_TYPE_LIBRUS -> Librus(app, profile, loginStore, taskCallback)
LOGIN_TYPE_MOBIDZIENNIK -> Mobidziennik(app, profile, loginStore, taskCallback)
LOGIN_TYPE_VULCAN -> Vulcan(app, profile, loginStore, taskCallback)
LOGIN_TYPE_IDZIENNIK -> Idziennik(app, profile, loginStore, taskCallback)
LOGIN_TYPE_EDUDZIENNIK -> Edudziennik(app, profile, loginStore, taskCallback)
- LOGIN_TYPE_PODLASIE -> Podlasie(app, profile, loginStore, taskCallback)
LOGIN_TYPE_TEMPLATE -> Template(app, profile, loginStore, taskCallback)
else -> null
}
@@ -138,21 +85,18 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
featureIds = request.viewIds?.flatMap { Features.getIdsByView(it.first, it.second) }
?: Features.getAllIds(),
viewId = request.viewIds?.get(0)?.first,
- onlyEndpoints = request.onlyEndpoints,
arguments = request.arguments)
is MessageGetRequest -> edziennikInterface?.getMessage(request.message)
is MessageSendRequest -> edziennikInterface?.sendMessage(request.recipients, request.subject, request.text)
is FirstLoginRequest -> edziennikInterface?.firstLogin()
is AnnouncementsReadRequest -> edziennikInterface?.markAllAnnouncementsAsRead()
is AnnouncementGetRequest -> edziennikInterface?.getAnnouncement(request.announcement)
- is AttachmentGetRequest -> edziennikInterface?.getAttachment(request.owner, request.attachmentId, request.attachmentName)
+ is AttachmentGetRequest -> edziennikInterface?.getAttachment(request.message, request.attachmentId, request.attachmentName)
is RecipientListGetRequest -> edziennikInterface?.getRecipientList()
- is EventGetRequest -> edziennikInterface?.getEvent(request.event)
}
}
override fun cancel() {
- d(TAG, "Task ${toString()} cancelling...")
edziennikInterface?.cancel()
}
@@ -162,13 +106,12 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
data class FirstLoginRequest(val loginStore: LoginStore)
class SyncRequest
- data class SyncProfileRequest(val viewIds: List>? = null, val onlyEndpoints: List? = null, val arguments: JsonObject? = null)
+ data class SyncProfileRequest(val viewIds: List>? = null, val arguments: JsonObject? = null)
data class SyncProfileListRequest(val profileList: List)
data class MessageGetRequest(val message: MessageFull)
data class MessageSendRequest(val recipients: List, val subject: String, val text: String)
class AnnouncementsReadRequest
data class AnnouncementGetRequest(val announcement: AnnouncementFull)
- data class AttachmentGetRequest(val owner: Any, val attachmentId: Long, val attachmentName: String)
+ data class AttachmentGetRequest(val message: Message, val attachmentId: Long, val attachmentName: String)
class RecipientListGetRequest
- data class EventGetRequest(val event: EventFull)
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/ProfileArchiver.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/ProfileArchiver.kt
deleted file mode 100644
index 15da9765..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/ProfileArchiver.kt
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-8-25.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik
-
-import android.content.Intent
-import pl.szczodrzynski.edziennik.App
-import pl.szczodrzynski.edziennik.Intent
-import pl.szczodrzynski.edziennik.data.api.*
-import pl.szczodrzynski.edziennik.data.db.entity.Profile
-import pl.szczodrzynski.edziennik.utils.Utils.d
-import pl.szczodrzynski.edziennik.utils.models.Date
-
-class ProfileArchiver(val app: App, val profile: Profile) {
- companion object {
- private const val TAG = "ProfileArchiver"
- }
-
- init {
- if (profile.archiveId == null)
- profile.archiveId = profile.id
- d(TAG, "Processing ${profile.name}#${profile.id}, archiveId = ${profile.archiveId}")
-
- profile.archived = true
- app.db.profileDao().add(profile)
- //app.db.metadataDao().setAllSeen(profile.id, true)
- app.db.notificationDao().clear(profile.id)
- app.db.endpointTimerDao().clear(profile.id)
- d(TAG, "Archived profile ${profile.id} saved")
- profile.archived = false
-
- // guess the nearest school year
- val today = Date.getToday()
- profile.studentSchoolYearStart = when {
- today.month <= profile.dateYearEnd.month -> today.year - 1
- else -> today.year
- }
-
- // set default semester dates
- profile.dateSemester1Start = Date(profile.studentSchoolYearStart, 9, 1)
- profile.dateSemester2Start = Date(profile.studentSchoolYearStart + 1, 2, 1)
- profile.dateYearEnd = Date(profile.studentSchoolYearStart + 1, 6, 30)
-
- val oldId = profile.id
- val newId = (app.db.profileDao().lastId ?: profile.id) + 1
- profile.id = newId
- profile.subname = "Nowy rok szkolny - ${profile.studentSchoolYearStart}"
- profile.studentClassName = null
-
- d(TAG, "New profile ID for ${profile.name}: ${profile.id}")
-
- when (profile.loginStoreType) {
- LOGIN_TYPE_LIBRUS -> {
- profile.removeStudentData("isPremium")
- profile.removeStudentData("pushDeviceId")
- profile.removeStudentData("startPointsSemester1")
- profile.removeStudentData("startPointsSemester2")
- profile.removeStudentData("enablePointGrades")
- profile.removeStudentData("enableDescriptiveGrades")
- }
- LOGIN_TYPE_MOBIDZIENNIK -> {
-
- }
- LOGIN_TYPE_VULCAN -> {
- // DataVulcan.isApiLoginValid() returns false so it will update the semester
- profile.removeStudentData("currentSemesterEndDate")
- profile.removeStudentData("studentSemesterId")
- profile.removeStudentData("studentSemesterNumber")
- profile.removeStudentData("semester1Id")
- profile.removeStudentData("semester2Id")
- profile.removeStudentData("studentClassId")
- }
- LOGIN_TYPE_IDZIENNIK -> {
- profile.removeStudentData("schoolYearId")
- }
- LOGIN_TYPE_EDUDZIENNIK -> {
-
- }
- LOGIN_TYPE_PODLASIE -> {
-
- }
- }
-
- d(TAG, "Processed student data: ${profile.studentData}")
-
- app.db.profileDao().add(profile)
-
- if (app.profileId == oldId) {
- val intent = Intent(
- Intent.ACTION_MAIN,
- "profileId" to newId
- )
- app.sendBroadcast(intent)
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/Edudziennik.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/Edudziennik.kt
index 23d9d3b1..7ab9acb6 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/Edudziennik.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/Edudziennik.kt
@@ -9,7 +9,6 @@ import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikData
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web.EdudziennikWebGetAnnouncement
-import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web.EdudziennikWebGetHomework
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.firstlogin.EdudziennikFirstLogin
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login.EdudziennikLogin
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login.EdudziennikLoginWeb
@@ -17,10 +16,10 @@ import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
+import pl.szczodrzynski.edziennik.data.db.entity.Message
import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
import pl.szczodrzynski.edziennik.utils.Utils.d
@@ -53,9 +52,9 @@ class Edudziennik(val app: App, val profile: Profile?, val loginStore: LoginStor
|_| |_| |_|\___| /_/ \_\_|\__, |\___/|_| |_|\__|_| |_|_| |_| |_|
__/ |
|__*/
- override fun sync(featureIds: List, viewId: Int?, onlyEndpoints: List?, arguments: JsonObject?) {
+ override fun sync(featureIds: List, viewId: Int?, arguments: JsonObject?) {
data.arguments = arguments
- data.prepare(edudziennikLoginMethods, EdudziennikFeatures, featureIds, viewId, onlyEndpoints)
+ data.prepare(edudziennikLoginMethods, EdudziennikFeatures, featureIds, viewId)
login()
}
@@ -95,17 +94,9 @@ class Edudziennik(val app: App, val profile: Profile?, val loginStore: LoginStor
}
}
- override fun getAttachment(owner: Any, attachmentId: Long, attachmentName: String) {}
+ override fun getAttachment(message: Message, attachmentId: Long, attachmentName: String) {}
override fun getRecipientList() {}
- override fun getEvent(eventFull: EventFull) {
- EdudziennikLoginWeb(data) {
- EdudziennikWebGetHomework(data, eventFull) {
- completed()
- }
- }
- }
-
override fun firstLogin() { EdudziennikFirstLogin(data) { completed() } }
override fun cancel() {
d(TAG, "Cancelled")
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/EdudziennikData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/EdudziennikData.kt
index 7eb58d1c..03d9fad2 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/EdudziennikData.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/EdudziennikData.kt
@@ -27,15 +27,15 @@ class EdudziennikData(val data: DataEdudziennik, val onSuccess: () -> Unit) {
onSuccess()
return
}
- val id = data.targetEndpointIds.firstKey()
- val lastSync = data.targetEndpointIds.remove(id)
- useEndpoint(id, lastSync) { endpointId ->
+ useEndpoint(data.targetEndpointIds.firstKey()) { endpointId ->
+ data.targetEndpointIds.remove(endpointId)
data.progress(data.progressStep)
nextEndpoint(onSuccess)
}
}
- private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
+ private fun useEndpoint(endpointId: Int, onSuccess: (endpointId: Int) -> Unit) {
+ val lastSync = data.targetEndpointIds[endpointId]
Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
when (endpointId) {
ENDPOINT_EDUDZIENNIK_WEB_START -> {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/EdudziennikWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/EdudziennikWeb.kt
index f5adfc5d..e893dbfc 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/EdudziennikWeb.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/EdudziennikWeb.kt
@@ -7,6 +7,7 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data
import im.wangchao.mhttp.Request
import im.wangchao.mhttp.Response
import im.wangchao.mhttp.callback.TextCallbackHandler
+import okhttp3.Cookie
import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
import pl.szczodrzynski.edziennik.data.api.models.ApiError
@@ -42,8 +43,8 @@ open class EdudziennikWeb(open val data: DataEdudziennik, open val lastSync: Lon
if (semester == null && url.contains("start")) {
profile?.also { profile ->
- val cookies = data.app.cookieJar.getAll("dziennikel.appspot.com")
- val semesterCookie = cookies["semester"]?.toIntOrNull()
+ val cookies = data.app.cookieJar.getForDomain("dziennikel.appspot.com")
+ val semesterCookie = cookies.firstOrNull { it.name() == "semester" }?.value()?.toIntOrNull()
semesterCookie?.let { data.currentSemester = it }
@@ -74,7 +75,13 @@ open class EdudziennikWeb(open val data: DataEdudziennik, open val lastSync: Lon
}
}
- data.app.cookieJar.set("dziennikel.appspot.com", "sessionid", data.webSessionId)
+ data.app.cookieJar.saveFromResponse(null, listOf(
+ Cookie.Builder()
+ .name("sessionid")
+ .value(data.webSessionId!!)
+ .domain("dziennikel.appspot.com")
+ .secure().httpOnly().build()
+ ))
Request.builder()
.url(url)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAnnouncements.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAnnouncements.kt
index 32ca353c..11f048b5 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAnnouncements.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAnnouncements.kt
@@ -45,25 +45,24 @@ class EdudziennikWebAnnouncements(override val data: DataEdudziennik,
val addedDate = Date.fromIsoHm(dateString)
val announcementObject = Announcement(
- profileId = profileId,
- id = id,
- subject = subject,
- text = null,
- startDate = startDate,
- endDate = null,
- teacherId = teacher.id,
- addedDate = addedDate
- ).also {
- it.idString = longId
- }
+ profileId,
+ id,
+ subject,
+ null,
+ startDate,
+ null,
+ teacher.id,
+ longId
+ )
- data.announcementList.add(announcementObject)
+ data.announcementIgnoreList.add(announcementObject)
data.metadataList.add(Metadata(
profileId,
Metadata.TYPE_ANNOUNCEMENT,
id,
profile.empty,
- profile.empty
+ profile.empty,
+ addedDate
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAttendance.kt
index 7fe18171..48836e6e 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAttendance.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebAttendance.kt
@@ -27,24 +27,17 @@ class EdudziennikWebAttendance(override val data: DataEdudziennik,
private const val TAG = "EdudziennikWebAttendance"
}
- private var requestSemester: Int? = null
-
- init {
- if (profile?.empty == true && data.currentSemester == 2) requestSemester = 1
- getAttendances()
- }
-
- private fun getAttendances() { data.profile?.also { profile ->
- webGet(TAG, data.studentEndpoint + "Presence", semester = requestSemester) { text ->
+ init { data.profile?.also { profile ->
+ webGet(TAG, data.studentEndpoint + "Presence", semester = -1) { text ->
val attendanceTypes = EDUDZIENNIK_ATTENDANCE_TYPES.find(text)?.get(1)?.split(',')?.map {
val type = EDUDZIENNIK_ATTENDANCE_TYPE.find(it.trim())
- val symbol = type?.get(1)?.trim() ?: "?"
- val name = type?.get(2)?.trim() ?: "nieznany rodzaj"
+ val symbol = type?.get(1)?.trim()
+ val name = type?.get(2)?.trim()
return@map Triple(
symbol,
name,
- when (name.toLowerCase(Locale.ROOT)) {
+ when (name?.toLowerCase(Locale.ROOT)) {
"obecność" -> Attendance.TYPE_PRESENT
"nieobecność" -> Attendance.TYPE_ABSENT
"spóźnienie" -> Attendance.TYPE_BELATED
@@ -52,7 +45,7 @@ class EdudziennikWebAttendance(override val data: DataEdudziennik,
"dzień wolny" -> Attendance.TYPE_DAY_FREE
"brak zajęć" -> Attendance.TYPE_DAY_FREE
"oddelegowany" -> Attendance.TYPE_RELEASED
- else -> Attendance.TYPE_UNKNOWN
+ else -> Attendance.TYPE_CUSTOM
}
)
} ?: emptyList()
@@ -62,53 +55,44 @@ class EdudziennikWebAttendance(override val data: DataEdudziennik,
val lessonNumber = attendanceElement[2].toInt()
val attendanceSymbol = attendanceElement[3]
- val lessons = data.app.db.timetableDao().getAllForDateNow(profileId, date)
+ val lessons = data.app.db.timetableDao().getForDateNow(profileId, date)
val lesson = lessons.firstOrNull { it.lessonNumber == lessonNumber }
val id = "${date.stringY_m_d}:$lessonNumber:$attendanceSymbol".crc32()
- val (typeSymbol, typeName, baseType) = attendanceTypes.firstOrNull { (symbol, _, _) -> symbol == attendanceSymbol }
+ val (_, name, type) = attendanceTypes.firstOrNull { (symbol, _, _) -> symbol == attendanceSymbol }
?: return@forEach
val startTime = data.lessonRanges.singleOrNull { it.lessonNumber == lessonNumber }?.startTime
?: return@forEach
val attendanceObject = Attendance(
- profileId = profileId,
- id = id,
- baseType = baseType,
- typeName = typeName,
- typeShort = data.app.attendanceManager.getTypeShort(baseType),
- typeSymbol = typeSymbol,
- typeColor = null,
- date = date,
- startTime = lesson?.displayStartTime ?: startTime,
- semester = profile.currentSemester,
- teacherId = lesson?.displayTeacherId ?: -1,
- subjectId = lesson?.displaySubjectId ?: -1
- ).also {
- it.lessonNumber = lessonNumber
- }
+ profileId,
+ id,
+ lesson?.displayTeacherId ?: -1,
+ lesson?.displaySubjectId ?: -1,
+ profile.currentSemester,
+ name,
+ date,
+ lesson?.displayStartTime ?: startTime,
+ type
+ )
data.attendanceList.add(attendanceObject)
- if (baseType != Attendance.TYPE_PRESENT) {
+ if(type != Attendance.TYPE_PRESENT) {
data.metadataList.add(Metadata(
profileId,
Metadata.TYPE_ATTENDANCE,
id,
- profile.empty || baseType == Attendance.TYPE_PRESENT_CUSTOM || baseType == Attendance.TYPE_UNKNOWN,
- profile.empty || baseType == Attendance.TYPE_PRESENT_CUSTOM || baseType == Attendance.TYPE_UNKNOWN
+ profile.empty,
+ profile.empty,
+ System.currentTimeMillis()
))
}
}
- if (profile.empty && requestSemester == 1 && data.currentSemester == 2) {
- requestSemester = null
- getAttendances()
- } else {
- data.setSyncNext(ENDPOINT_EDUDZIENNIK_WEB_ATTENDANCE, SYNC_ALWAYS)
- onSuccess(ENDPOINT_EDUDZIENNIK_WEB_ATTENDANCE)
- }
+ data.setSyncNext(ENDPOINT_EDUDZIENNIK_WEB_ATTENDANCE, SYNC_ALWAYS)
+ onSuccess(ENDPOINT_EDUDZIENNIK_WEB_ATTENDANCE)
}
} ?: onSuccess(ENDPOINT_EDUDZIENNIK_WEB_ATTENDANCE) }
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebEvents.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebEvents.kt
index 35c68478..cf846fce 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebEvents.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebEvents.kt
@@ -39,16 +39,17 @@ class EdudziennikWebEvents(override val data: DataEdudziennik,
?: return@forEach
val eventObject = Event(
- profileId = profileId,
- id = id,
- date = date,
- time = null,
- topic = title,
- color = null,
- type = Event.TYPE_CLASS_EVENT,
- teacherId = -1,
- subjectId = -1,
- teamId = data.teamClass?.id ?: -1
+ profileId,
+ id,
+ date,
+ null,
+ title,
+ -1,
+ Event.TYPE_CLASS_EVENT,
+ false,
+ -1,
+ -1,
+ data.teamClass?.id ?: -1
)
data.eventList.add(eventObject)
@@ -57,7 +58,8 @@ class EdudziennikWebEvents(override val data: DataEdudziennik,
Metadata.TYPE_EVENT,
id,
profile.empty,
- profile.empty
+ profile.empty,
+ System.currentTimeMillis()
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebExams.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebExams.kt
index f6abf637..8eb7d04e 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebExams.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebExams.kt
@@ -46,7 +46,7 @@ class EdudziennikWebExams(override val data: DataEdudziennik,
if (dateString.isBlank()) return@forEach
val date = Date.fromY_m_d(dateString)
- val lessons = data.app.db.timetableDao().getAllForDateNow(profileId, date)
+ val lessons = data.app.db.timetableDao().getForDateNow(profileId, date)
val startTime = lessons.firstOrNull { it.displaySubjectId == subject.id }?.displayStartTime
val eventTypeElement = examElement.child(3).child(0)
@@ -56,16 +56,17 @@ class EdudziennikWebExams(override val data: DataEdudziennik,
val eventType = data.getEventType(eventTypeId, eventTypeName)
val eventObject = Event(
- profileId = profileId,
- id = id,
- date = date,
- time = startTime,
- topic = topic,
- color = null,
- type = eventType.id,
- teacherId = -1,
- subjectId = subject.id,
- teamId = data.teamClass?.id ?: -1
+ profileId,
+ id,
+ date,
+ startTime,
+ topic,
+ -1,
+ eventType.id,
+ false,
+ -1,
+ subject.id,
+ data.teamClass?.id ?: -1
)
data.eventList.add(eventObject)
@@ -74,7 +75,8 @@ class EdudziennikWebExams(override val data: DataEdudziennik,
Metadata.TYPE_EVENT,
id,
profile.empty,
- profile.empty
+ profile.empty,
+ System.currentTimeMillis()
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebGetHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebGetHomework.kt
deleted file mode 100644
index 84171699..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebGetHomework.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.web
-
-import android.text.Html
-import org.greenrobot.eventbus.EventBus
-import pl.szczodrzynski.edziennik.data.api.Regexes
-import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
-import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
-import pl.szczodrzynski.edziennik.data.api.events.EventGetEvent
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
-import pl.szczodrzynski.edziennik.get
-import pl.szczodrzynski.edziennik.isNotNullNorEmpty
-
-class EdudziennikWebGetHomework(
- override val data: DataEdudziennik,
- val event: EventFull,
- val onSuccess: () -> Unit
-) : EdudziennikWeb(data, null) {
- companion object {
- const val TAG = "EdudziennikWebGetHomework"
- }
-
- init {
- if (event.attachmentNames.isNotNullNorEmpty()) {
- val id = event.attachmentNames!![0]
-
- webGet(TAG, "Homework/$id") { text ->
- val description = Regexes.EDUDZIENNIK_HOMEWORK_DESCRIPTION.find(text)?.get(1)?.trim()
-
- if (description != null) event.topic = Html.fromHtml(description).toString()
-
- event.homeworkBody = ""
- event.attachmentNames = null
-
- data.eventList += event
- data.eventListReplace = true
-
- EventBus.getDefault().postSticky(EventGetEvent(event))
- onSuccess()
- }
- } else {
- EventBus.getDefault().postSticky(EventGetEvent(event))
- onSuccess()
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebGrades.kt
index 459f13aa..6e0caa2d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebGrades.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebGrades.kt
@@ -14,12 +14,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.ENDPOINT_EDUDZI
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
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.Grade.Companion.TYPE_POINT_SUM
-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.Grade.*
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
import pl.szczodrzynski.edziennik.get
@@ -95,7 +90,7 @@ class EdudziennikWebGrades(override val data: DataEdudziennik,
val columnName = info.child(4).text().trim()
val comment = info.ownText()
- val description = columnName + if (comment.isNotBlank()) " - $comment" else null
+ val description = columnName + if (comment.isNotBlank()) " - $comment" else ""
val teacherName = info.child(1).text()
val teacher = data.getTeacherByLastFirst(teacherName)
@@ -114,21 +109,20 @@ class EdudziennikWebGrades(override val data: DataEdudziennik,
} ?: -1
val gradeObject = Grade(
- profileId = profileId,
- id = id,
- name = name,
- type = gradeType,
- value = value,
- weight = if (gradeCountToAverage) weight else 0f,
- color = color,
- category = fullName,
- description = description,
- comment = null,
- semester = semester,
- teacherId = teacher.id,
- subjectId = subject.id,
- addedDate = addedDate
- )
+ profileId,
+ id,
+ fullName,
+ color,
+ description,
+ name,
+ value,
+ if (gradeCountToAverage) weight else 0f,
+ semester,
+ teacher.id,
+ subject.id
+ ).apply {
+ type = gradeType
+ }
data.gradeList.add(gradeObject)
data.metadataList.add(Metadata(
@@ -136,7 +130,8 @@ class EdudziennikWebGrades(override val data: DataEdudziennik,
Metadata.TYPE_GRADE,
id,
profile.empty,
- profile.empty
+ profile.empty,
+ addedDate
))
}
@@ -144,23 +139,23 @@ class EdudziennikWebGrades(override val data: DataEdudziennik,
if (proposed != null && proposed.isNotBlank()) {
val proposedGradeObject = Grade(
- profileId = profileId,
- id = (-1 * subject.id) - 1,
- name = proposed,
- type = when (semester) {
- 1 -> TYPE_SEMESTER1_PROPOSED
- else -> TYPE_SEMESTER2_PROPOSED
- },
- value = proposed.toFloatOrNull() ?: 0f,
- weight = 0f,
- color = -1,
- category = null,
- description = null,
- comment = null,
- semester = semester,
- teacherId = -1,
- subjectId = subject.id
- )
+ profileId,
+ (-1 * subject.id) - 1,
+ "",
+ -1,
+ "",
+ proposed,
+ proposed.toFloatOrNull() ?: 0f,
+ 0f,
+ semester,
+ -1,
+ subject.id
+ ).apply {
+ type = when (semester) {
+ 1 -> TYPE_SEMESTER1_PROPOSED
+ else -> TYPE_SEMESTER2_PROPOSED
+ }
+ }
data.gradeList.add(proposedGradeObject)
data.metadataList.add(Metadata(
@@ -168,7 +163,8 @@ class EdudziennikWebGrades(override val data: DataEdudziennik,
Metadata.TYPE_GRADE,
proposedGradeObject.id,
profile.empty,
- profile.empty
+ profile.empty,
+ System.currentTimeMillis()
))
}
@@ -176,23 +172,23 @@ class EdudziennikWebGrades(override val data: DataEdudziennik,
if (final != null && final.isNotBlank()) {
val finalGradeObject = Grade(
- profileId = profileId,
- id = (-1 * subject.id) - 2,
- name = final,
- type = when (semester) {
- 1 -> TYPE_SEMESTER1_FINAL
- else -> TYPE_SEMESTER2_FINAL
- },
- value = final.toFloatOrNull() ?: 0f,
- weight = 0f,
- color = -1,
- category = null,
- description = null,
- comment = null,
- semester = semester,
- teacherId = -1,
- subjectId = subject.id
- )
+ profileId,
+ (-1 * subject.id) - 2,
+ "",
+ -1,
+ "",
+ final,
+ final.toFloatOrNull() ?: 0f,
+ 0f,
+ semester,
+ -1,
+ subject.id
+ ).apply {
+ type = when (semester) {
+ 1 -> TYPE_SEMESTER1_FINAL
+ else -> TYPE_SEMESTER2_FINAL
+ }
+ }
data.gradeList.add(finalGradeObject)
data.metadataList.add(Metadata(
@@ -200,7 +196,8 @@ class EdudziennikWebGrades(override val data: DataEdudziennik,
Metadata.TYPE_GRADE,
finalGradeObject.id,
profile.empty,
- profile.empty
+ profile.empty,
+ System.currentTimeMillis()
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebHomework.kt
index 169a5127..9d9a336a 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebHomework.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebHomework.kt
@@ -33,8 +33,8 @@ class EdudziennikWebHomework(override val data: DataEdudziennik,
if (doc.getElementsByClass("message").text().trim() != "Brak prac domowych") {
doc.getElementsByTag("tr").forEach { homeworkElement ->
val dateElement = homeworkElement.getElementsByClass("date").first().child(0)
- val idStr = EDUDZIENNIK_HOMEWORK_ID.find(dateElement.attr("href"))?.get(1) ?: return@forEach
- val id = idStr.crc32()
+ val id = EDUDZIENNIK_HOMEWORK_ID.find(dateElement.attr("href"))?.get(1)?.crc32()
+ ?: return@forEach
val date = Date.fromY_m_d(dateElement.text())
val subjectElement = homeworkElement.child(1).child(0)
@@ -43,36 +43,36 @@ class EdudziennikWebHomework(override val data: DataEdudziennik,
val subjectName = subjectElement.text()
val subject = data.getSubject(subjectId, subjectName)
- val lessons = data.app.db.timetableDao().getAllForDateNow(profileId, date)
+ val lessons = data.app.db.timetableDao().getForDateNow(profileId, date)
val startTime = lessons.firstOrNull { it.subjectId == subject.id }?.displayStartTime
val teacherName = homeworkElement.child(2).text()
val teacher = data.getTeacherByFirstLast(teacherName)
- val topic = homeworkElement.child(4).text()?.trim()
+ val topic = homeworkElement.child(4).text()
val eventObject = Event(
- profileId = profileId,
- id = id,
- date = date,
- time = startTime,
- topic = topic ?: "",
- color = null,
- type = Event.TYPE_HOMEWORK,
- teacherId = teacher.id,
- subjectId = subject.id,
- teamId = data.teamClass?.id ?: -1
+ profileId,
+ id,
+ date,
+ startTime,
+ topic,
+ -1,
+ Event.TYPE_HOMEWORK,
+ false,
+ teacher.id,
+ subject.id,
+ data.teamClass?.id ?: -1
)
- eventObject.attachmentNames = mutableListOf(idStr)
-
data.eventList.add(eventObject)
data.metadataList.add(Metadata(
profileId,
Metadata.TYPE_HOMEWORK,
id,
profile.empty,
- profile.empty
+ profile.empty,
+ System.currentTimeMillis()
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebLuckyNumber.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebLuckyNumber.kt
index db8164c8..70c6849a 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebLuckyNumber.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebLuckyNumber.kt
@@ -24,9 +24,9 @@ class EdudziennikWebLuckyNumber(override val data: DataEdudziennik,
webGet(TAG, data.schoolEndpoint + "Lucky", xhr = true) { text ->
text.toIntOrNull()?.also { luckyNumber ->
val luckyNumberObject = LuckyNumber(
- profileId = profileId,
- date = Date.getToday(),
- number = luckyNumber
+ profileId,
+ Date.getToday(),
+ luckyNumber
)
data.luckyNumberList.add(luckyNumberObject)
@@ -35,7 +35,8 @@ class EdudziennikWebLuckyNumber(override val data: DataEdudziennik,
Metadata.TYPE_LUCKY_NUMBER,
luckyNumberObject.date.value.toLong(),
true,
- profile.empty
+ profile.empty,
+ System.currentTimeMillis()
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebNotes.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebNotes.kt
index 35a78168..a111ef79 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebNotes.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebNotes.kt
@@ -41,15 +41,12 @@ class EdudziennikWebNotes(override val data: DataEdudziennik,
val description = noteElement.child(3).text()
val noticeObject = Notice(
- profileId = profileId,
- id = id,
- type = Notice.TYPE_NEUTRAL,
- semester = profile.currentSemester,
- text = description,
- category = null,
- points = null,
- teacherId = teacher.id,
- addedDate = addedDate
+ profileId,
+ id,
+ description,
+ profile.currentSemester,
+ Notice.TYPE_NEUTRAL,
+ teacher.id
)
data.noticeList.add(noticeObject)
@@ -58,7 +55,8 @@ class EdudziennikWebNotes(override val data: DataEdudziennik,
Metadata.TYPE_NOTICE,
id,
profile.empty,
- profile.empty
+ profile.empty,
+ addedDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebTimetable.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebTimetable.kt
index 94db15ef..3a31e208 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebTimetable.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/data/web/EdudziennikWebTimetable.kt
@@ -124,7 +124,8 @@ class EdudziennikWebTimetable(override val data: DataEdudziennik,
Metadata.TYPE_LESSON_CHANGE,
lessonObject.id,
seen,
- seen
+ seen,
+ System.currentTimeMillis()
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/firstlogin/EdudziennikFirstLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/firstlogin/EdudziennikFirstLogin.kt
index a93632b1..e47c7842 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/firstlogin/EdudziennikFirstLogin.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/firstlogin/EdudziennikFirstLogin.kt
@@ -59,7 +59,7 @@ class EdudziennikFirstLogin(val data: DataEdudziennik, val onSuccess: () -> Unit
profileList.add(profile)
}
- EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore))
+ EventBus.getDefault().post(FirstLoginFinishedEvent(profileList, data.loginStore))
onSuccess()
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/login/EdudziennikLoginWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/login/EdudziennikLoginWeb.kt
index 6b1615a2..8387a775 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/login/EdudziennikLoginWeb.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/login/EdudziennikLoginWeb.kt
@@ -24,7 +24,7 @@ class EdudziennikLoginWeb(val data: DataEdudziennik, val onSuccess: () -> Unit)
onSuccess()
}
else {
- data.app.cookieJar.clear("dziennikel.appspot.com")
+ data.app.cookieJar.clearForDomain("dziennikel.appspot.com")
if (data.loginEmail.isNotNullNorEmpty() && data.loginPassword.isNotNullNorEmpty()) {
loginWithCredentials()
}
@@ -59,8 +59,8 @@ class EdudziennikLoginWeb(val data: DataEdudziennik, val onSuccess: () -> Unit)
}
}
- val cookies = data.app.cookieJar.getAll("dziennikel.appspot.com")
- val sessionId = cookies["sessionid"]
+ val cookies = data.app.cookieJar.getForDomain("dziennikel.appspot.com")
+ val sessionId = cookies.firstOrNull { it.name() == "sessionid" }?.value()
if (sessionId == null) {
data.error(ApiError(TAG, ERROR_LOGIN_EDUDZIENNIK_WEB_NO_SESSION_ID)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/helper/DownloadAttachment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/helper/DownloadAttachment.kt
deleted file mode 100644
index a968818a..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/helper/DownloadAttachment.kt
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-14
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.helper
-
-import im.wangchao.mhttp.Request
-import im.wangchao.mhttp.Response
-import im.wangchao.mhttp.callback.FileCallbackHandler
-import pl.szczodrzynski.edziennik.data.api.ERROR_FILE_DOWNLOAD
-import pl.szczodrzynski.edziennik.data.api.ERROR_REQUEST_FAILURE
-import pl.szczodrzynski.edziennik.data.api.SYSTEM_USER_AGENT
-import pl.szczodrzynski.edziennik.data.api.models.ApiError
-import pl.szczodrzynski.edziennik.utils.Utils
-import java.io.File
-
-class DownloadAttachment(
- fileUrl: String,
- val onSuccess: (file: File) -> Unit,
- val onProgress: (written: Long, total: Long) -> Unit,
- val onError: (apiError: ApiError) -> Unit
-) {
- companion object {
- private const val TAG = "DownloadAttachment"
- }
-
- init {
- val targetFile = Utils.getStorageDir()
-
- val callback = object : FileCallbackHandler(targetFile) {
- override fun onSuccess(file: File?, response: Response?) {
- if (file == null) {
- onError(ApiError(TAG, ERROR_FILE_DOWNLOAD)
- .withResponse(response))
- return
- }
-
- try {
- onSuccess(file)
- } catch (e: Exception) {
- onError(ApiError(TAG, ERROR_FILE_DOWNLOAD)
- .withResponse(response)
- .withThrowable(e))
- }
- }
-
- override fun onProgress(bytesWritten: Long, bytesTotal: Long) {
- try {
- this@DownloadAttachment.onProgress(bytesWritten, bytesTotal)
- } catch (e: Exception) {
- onError(ApiError(TAG, ERROR_FILE_DOWNLOAD)
- .withThrowable(e))
- }
- }
-
- override fun onFailure(response: Response?, throwable: Throwable?) {
- onError(ApiError(TAG, ERROR_REQUEST_FAILURE)
- .withResponse(response)
- .withThrowable(throwable))
- }
- }
-
- Request.builder()
- .url(fileUrl)
- .userAgent(SYSTEM_USER_AGENT)
- .callback(callback)
- .build()
- .enqueue()
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/helper/OneDriveDownloadAttachment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/helper/OneDriveDownloadAttachment.kt
deleted file mode 100644
index 25b78527..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/helper/OneDriveDownloadAttachment.kt
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-4-7.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.helper
-
-import im.wangchao.mhttp.Request
-import im.wangchao.mhttp.Response
-import im.wangchao.mhttp.callback.FileCallbackHandler
-import im.wangchao.mhttp.callback.TextCallbackHandler
-import pl.szczodrzynski.edziennik.App
-import pl.szczodrzynski.edziennik.data.api.ERROR_ONEDRIVE_DOWNLOAD
-import pl.szczodrzynski.edziennik.data.api.ERROR_REQUEST_FAILURE
-import pl.szczodrzynski.edziennik.data.api.SYSTEM_USER_AGENT
-import pl.szczodrzynski.edziennik.data.api.models.ApiError
-import pl.szczodrzynski.edziennik.utils.Utils
-import java.io.File
-
-class OneDriveDownloadAttachment(
- app: App,
- fileUrl: String,
- val onSuccess: (file: File) -> Unit,
- val onProgress: (written: Long, total: Long) -> Unit,
- val onError: (apiError: ApiError) -> Unit
-) {
- companion object {
- private const val TAG = "OneDriveDownloadAttachment"
- }
-
- init {
- Request.builder()
- .url(fileUrl)
- .userAgent(SYSTEM_USER_AGENT)
- .withClient(app.httpLazy)
- .callback(object : TextCallbackHandler() {
- override fun onSuccess(text: String, response: Response) {
- val location = response.headers().get("Location")
- // https://onedrive.live.com/redir?resid=D75496A2EB87531C!706&authkey=!ABjZeh3pHMqj11Q
- if (location?.contains("onedrive.live.com/redir?resid=") != true) {
- onError(ApiError(TAG, ERROR_ONEDRIVE_DOWNLOAD)
- .withApiResponse(text)
- .withResponse(response))
- return
- }
- val url = location
- .replace("onedrive.live.com/redir?resid=", "storage.live.com/items/")
- .replace("?", "&")
- .replaceFirst("&", "?")
- downloadFile(url)
- }
-
- override fun onFailure(response: Response, throwable: Throwable) {
- onError(ApiError(TAG, ERROR_REQUEST_FAILURE)
- .withResponse(response)
- .withThrowable(throwable))
- }
- })
- .build()
- .enqueue()
- }
-
- private fun downloadFile(url: String) {
- val targetFile = Utils.getStorageDir()
-
- val callback = object : FileCallbackHandler(targetFile) {
- override fun onSuccess(file: File?, response: Response?) {
- if (file == null) {
- onError(ApiError(TAG, ERROR_ONEDRIVE_DOWNLOAD)
- .withResponse(response))
- return
- }
-
- try {
- onSuccess(file)
- } catch (e: Exception) {
- onError(ApiError(TAG, ERROR_ONEDRIVE_DOWNLOAD)
- .withResponse(response)
- .withThrowable(e))
- }
- }
-
- override fun onProgress(bytesWritten: Long, bytesTotal: Long) {
- try {
- this@OneDriveDownloadAttachment.onProgress(bytesWritten, bytesTotal)
- } catch (e: Exception) {
- onError(ApiError(TAG, ERROR_ONEDRIVE_DOWNLOAD)
- .withThrowable(e))
- }
- }
-
- override fun onFailure(response: Response?, throwable: Throwable?) {
- onError(ApiError(TAG, ERROR_REQUEST_FAILURE)
- .withResponse(response)
- .withThrowable(throwable))
- }
- }
-
- Request.builder()
- .url(url)
- .userAgent(SYSTEM_USER_AGENT)
- .callback(callback)
- .build()
- .enqueue()
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/DataIdziennik.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/DataIdziennik.kt
index 3e974539..972db8a1 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/DataIdziennik.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/DataIdziennik.kt
@@ -5,6 +5,7 @@
package pl.szczodrzynski.edziennik.data.api.edziennik.idziennik
import androidx.core.util.set
+import okhttp3.Cookie
import pl.szczodrzynski.edziennik.*
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_IDZIENNIK_API
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_IDZIENNIK_WEB
@@ -23,8 +24,18 @@ class DataIdziennik(app: App, profile: Profile?, loginStore: LoginStore) : Data(
loginMethods.clear()
if (isWebLoginValid()) {
loginMethods += LOGIN_METHOD_IDZIENNIK_WEB
- app.cookieJar.set("iuczniowie.progman.pl", "ASP.NET_SessionId_iDziennik", webSessionId)
- app.cookieJar.set("iuczniowie.progman.pl", ".ASPXAUTH", webAuth)
+ app.cookieJar.saveFromResponse(null, listOf(
+ Cookie.Builder()
+ .name("ASP.NET_SessionId_iDziennik")
+ .value(webSessionId!!)
+ .domain("iuczniowie.progman.pl")
+ .secure().httpOnly().build(),
+ Cookie.Builder()
+ .name(".ASPXAUTH")
+ .value(webAuth!!)
+ .domain("iuczniowie.progman.pl")
+ .secure().httpOnly().build()
+ ))
}
if (isApiLoginValid())
loginMethods += LOGIN_METHOD_IDZIENNIK_API
@@ -70,11 +81,6 @@ class DataIdziennik(app: App, profile: Profile?, loginStore: LoginStore) : Data(
get() { mWebAuth = mWebAuth ?: loginStore.getLoginData("webAuth", null); return mWebAuth }
set(value) { loginStore.putLoginData("webAuth", value); mWebAuth = value }
- private var mWebSelectedRegister: Int? = null
- var webSelectedRegister: Int
- get() { mWebSelectedRegister = mWebSelectedRegister ?: loginStore.getLoginData("webSelectedRegister", 0); return mWebSelectedRegister ?: 0 }
- set(value) { loginStore.putLoginData("webSelectedRegister", value); mWebSelectedRegister = value }
-
/* _
/\ (_)
/ \ _ __ _
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/Idziennik.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/Idziennik.kt
index e1550632..2a5223e5 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/Idziennik.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/Idziennik.kt
@@ -8,15 +8,20 @@ import com.google.gson.JsonObject
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikData
-import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.web.*
+import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.web.IdziennikWebGetAttachment
+import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.web.IdziennikWebGetMessage
+import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.web.IdziennikWebGetRecipientList
+import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.web.IdziennikWebSendMessage
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.firstlogin.IdziennikFirstLogin
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.login.IdziennikLogin
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface
import pl.szczodrzynski.edziennik.data.api.models.ApiError
-import pl.szczodrzynski.edziennik.data.db.entity.*
+import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
+import pl.szczodrzynski.edziennik.data.db.entity.Message
+import pl.szczodrzynski.edziennik.data.db.entity.Profile
+import pl.szczodrzynski.edziennik.data.db.entity.Teacher
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
import pl.szczodrzynski.edziennik.utils.Utils.d
@@ -49,9 +54,9 @@ class Idziennik(val app: App, val profile: Profile?, val loginStore: LoginStore,
|_| |_| |_|\___| /_/ \_\_|\__, |\___/|_| |_|\__|_| |_|_| |_| |_|
__/ |
|__*/
- override fun sync(featureIds: List, viewId: Int?, onlyEndpoints: List?, arguments: JsonObject?) {
+ override fun sync(featureIds: List, viewId: Int?, arguments: JsonObject?) {
data.arguments = arguments
- data.prepare(idziennikLoginMethods, IdziennikFeatures, featureIds, viewId, onlyEndpoints)
+ data.prepare(idziennikLoginMethods, IdziennikFeatures, featureIds, viewId)
login()
}
@@ -98,17 +103,10 @@ class Idziennik(val app: App, val profile: Profile?, val loginStore: LoginStore,
override fun markAllAnnouncementsAsRead() {}
override fun getAnnouncement(announcement: AnnouncementFull) {}
- override fun getAttachment(owner: Any, attachmentId: Long, attachmentName: String) {
+ override fun getAttachment(message: Message, attachmentId: Long, attachmentName: String) {
login(LOGIN_METHOD_IDZIENNIK_WEB) {
- if (owner is Message) {
- IdziennikWebGetAttachment(data, owner, attachmentId, attachmentName) {
- completed()
- }
- }
- else if (owner is Event) {
- IdziennikWebGetHomeworkAttachment(data, owner, attachmentId, attachmentName) {
- completed()
- }
+ IdziennikWebGetAttachment(data, message, attachmentId, attachmentName) {
+ completed()
}
}
}
@@ -121,14 +119,6 @@ class Idziennik(val app: App, val profile: Profile?, val loginStore: LoginStore,
}
}
- override fun getEvent(eventFull: EventFull) {
- login(LOGIN_METHOD_IDZIENNIK_WEB) {
- IdziennikWebGetHomework(data, eventFull) {
- completed()
- }
- }
- }
-
override fun firstLogin() { IdziennikFirstLogin(data) { completed() } }
override fun cancel() {
d(TAG, "Cancelled")
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/IdziennikData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/IdziennikData.kt
index 8acb04cb..f407713f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/IdziennikData.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/IdziennikData.kt
@@ -30,15 +30,15 @@ class IdziennikData(val data: DataIdziennik, val onSuccess: () -> Unit) {
onSuccess()
return
}
- val id = data.targetEndpointIds.firstKey()
- val lastSync = data.targetEndpointIds.remove(id)
- useEndpoint(id, lastSync) { endpointId ->
+ useEndpoint(data.targetEndpointIds.firstKey()) { endpointId ->
+ data.targetEndpointIds.remove(endpointId)
data.progress(data.progressStep)
nextEndpoint(onSuccess)
}
}
- private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
+ private fun useEndpoint(endpointId: Int, onSuccess: (endpointId: Int) -> Unit) {
+ val lastSync = data.targetEndpointIds[endpointId]
Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
when (endpointId) {
ENDPOINT_IDZIENNIK_WEB_TIMETABLE -> {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/IdziennikWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/IdziennikWeb.kt
index b871cd37..caa0e06e 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/IdziennikWeb.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/IdziennikWeb.kt
@@ -13,7 +13,6 @@ import im.wangchao.mhttp.callback.JsonCallbackHandler
import im.wangchao.mhttp.callback.TextCallbackHandler
import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.DataIdziennik
-import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.web.IdziennikWebSwitchRegister
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.utils.Utils.d
import java.io.File
@@ -49,17 +48,6 @@ open class IdziennikWeb(open val data: DataIdziennik, open val lastSync: Long?)
return
}
- if (response?.code() == HTTP_INTERNAL_ERROR && endpoint == IDZIENNIK_WEB_GRADES) {
- // special override for accounts where displaying grades
- // for another student requires switching it manually
- if (data.registerId != data.webSelectedRegister) {
- IdziennikWebSwitchRegister(data, data.registerId) {
- webApiGet(tag, endpoint, parameters, onSuccess)
- }
- return
- }
- }
-
when {
response?.code() == HTTP_UNAUTHORIZED -> ERROR_IDZIENNIK_WEB_ACCESS_DENIED
response?.code() == HTTP_INTERNAL_ERROR -> ERROR_IDZIENNIK_WEB_SERVER_ERROR
@@ -127,7 +115,7 @@ open class IdziennikWeb(open val data: DataIdziennik, open val lastSync: Long?)
.enqueue()
}
- fun webGet(tag: String, endpoint: String, parameters: Map = emptyMap(), onSuccess: (text: String) -> Unit) {
+ fun webGet(tag: String, endpoint: String, onSuccess: (text: String) -> Unit) {
d(tag, "Request: Idziennik/Web - $IDZIENNIK_WEB_URL/$endpoint")
val callback = object : TextCallbackHandler() {
@@ -172,14 +160,7 @@ open class IdziennikWeb(open val data: DataIdziennik, open val lastSync: Long?)
Request.builder()
.url("$IDZIENNIK_WEB_URL/$endpoint")
.userAgent(IDZIENNIK_USER_AGENT)
- .apply {
- if (parameters.isEmpty()) get()
- else post()
-
- parameters.map { (name, value) ->
- addParameter(name, value)
- }
- }
+ .get()
.callback(callback)
.build()
.enqueue()
@@ -229,7 +210,6 @@ open class IdziennikWeb(open val data: DataIdziennik, open val lastSync: Long?)
.apply {
parameters.forEach { (k, v) -> addParameter(k, v) }
}
- .contentType("application/x-www-form-urlencoded")
.post()
.callback(callback)
.build()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiCurrentRegister.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiCurrentRegister.kt
index d5e59596..e23290de 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiCurrentRegister.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiCurrentRegister.kt
@@ -68,9 +68,9 @@ class IdziennikApiCurrentRegister(override val data: DataIdziennik,
val luckyNumberObject = LuckyNumber(
- profileId = data.profileId,
- date = luckyNumberDate,
- number = luckyNumber
+ data.profileId,
+ Date.getToday(),
+ luckyNumber
)
data.luckyNumberList.add(luckyNumberObject)
@@ -80,7 +80,8 @@ class IdziennikApiCurrentRegister(override val data: DataIdziennik,
Metadata.TYPE_LUCKY_NUMBER,
luckyNumberObject.date.value.toLong(),
true,
- data.profile?.empty ?: false
+ data.profile?.empty ?: false,
+ System.currentTimeMillis()
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesInbox.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesInbox.kt
index 622068e2..c8d756fe 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesInbox.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesInbox.kt
@@ -11,8 +11,8 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.DataIdziennik
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.ENDPOINT_IDZIENNIK_API_MESSAGES_INBOX
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikApi
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.TYPE_DELETED
+import pl.szczodrzynski.edziennik.data.db.entity.Message.TYPE_RECEIVED
import pl.szczodrzynski.edziennik.getBoolean
import pl.szczodrzynski.edziennik.getString
import pl.szczodrzynski.edziennik.utils.Utils.crc32
@@ -33,11 +33,11 @@ class IdziennikApiMessagesInbox(override val data: DataIdziennik,
return@apiGet
}
- json.asJsonObjectList().forEach { jMessage ->
- val subject = jMessage.getString("tytul") ?: ""
- if (subject.contains("(") && subject.startsWith("iDziennik - "))
+ json.asJsonObjectList()?.forEach { jMessage ->
+ val subject = jMessage.getString("tytul")
+ if (subject?.contains("(") == true && subject.startsWith("iDziennik - "))
return@forEach
- if (subject.startsWith("Uwaga dla ucznia (klasa:"))
+ if (subject?.startsWith("Uwaga dla ucznia (klasa:") == true)
return@forEach
val messageIdStr = jMessage.getString("id")
@@ -64,13 +64,13 @@ class IdziennikApiMessagesInbox(override val data: DataIdziennik,
rTeacher.setTeacherType(Teacher.TYPE_OTHER)
val message = Message(
- profileId = profileId,
- id = messageId,
- type = if (jMessage.getBoolean("rekordUsuniety") == true) TYPE_DELETED else TYPE_RECEIVED,
- subject = subject,
- body = body,
- senderId = rTeacher.id,
- addedDate = sentDate
+ profileId,
+ messageId,
+ subject,
+ body,
+ if (jMessage.getBoolean("rekordUsuniety") == true) TYPE_DELETED else TYPE_RECEIVED,
+ rTeacher.id,
+ -1
)
val messageRecipient = MessageRecipient(
@@ -81,14 +81,15 @@ class IdziennikApiMessagesInbox(override val data: DataIdziennik,
/*messageId*/ messageId
)
- data.messageList.add(message)
+ data.messageIgnoreList.add(message)
data.messageRecipientList.add(messageRecipient)
data.setSeenMetadataList.add(Metadata(
profileId,
Metadata.TYPE_MESSAGE,
message.id,
readDate > 0,
- readDate > 0 || profile?.empty ?: false
+ readDate > 0 || profile?.empty ?: false,
+ sentDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesSent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesSent.kt
index 87b3264d..b0b17689 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesSent.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/api/IdziennikApiMessagesSent.kt
@@ -13,7 +13,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.DataIdziennik
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.ENDPOINT_IDZIENNIK_API_MESSAGES_SENT
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikApi
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.Message.TYPE_SENT
import pl.szczodrzynski.edziennik.data.db.entity.MessageRecipient
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.utils.Utils.crc32
@@ -46,13 +46,13 @@ class IdziennikApiMessagesSent(override val data: DataIdziennik,
val sentDate = Date.fromIso(jMessage.get("dataWyslania").asString)
val message = Message(
- profileId = profileId,
- id = messageId,
- type = TYPE_SENT,
- subject = subject,
- body = body,
- senderId = null,
- addedDate = sentDate
+ profileId,
+ messageId,
+ subject,
+ body,
+ TYPE_SENT,
+ -1,
+ -1
)
for (recipientEl in jMessage.getAsJsonArray("odbiorcy")) {
@@ -76,8 +76,8 @@ class IdziennikApiMessagesSent(override val data: DataIdziennik,
data.messageRecipientIgnoreList.add(messageRecipient)
}
- data.messageList.add(message)
- data.metadataList.add(Metadata(profileId, Metadata.TYPE_MESSAGE, message.id, true, true))
+ data.messageIgnoreList.add(message)
+ data.metadataList.add(Metadata(profileId, Metadata.TYPE_MESSAGE, message.id, true, true, sentDate))
}
data.setSyncNext(ENDPOINT_IDZIENNIK_API_MESSAGES_SENT, DAY, DRAWER_ITEM_MESSAGES)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAnnouncements.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAnnouncements.kt
index 531cbeeb..2aa0fc1f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAnnouncements.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAnnouncements.kt
@@ -16,8 +16,6 @@ import pl.szczodrzynski.edziennik.data.db.entity.Announcement
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
import pl.szczodrzynski.edziennik.getJsonObject
-import pl.szczodrzynski.edziennik.getLong
-import pl.szczodrzynski.edziennik.getString
import pl.szczodrzynski.edziennik.utils.models.Date
class IdziennikWebAnnouncements(override val data: DataIdziennik,
@@ -45,21 +43,21 @@ class IdziennikWebAnnouncements(override val data: DataIdziennik,
for (jAnnouncementEl in json.getAsJsonArray("ListK")) {
val jAnnouncement = jAnnouncementEl.asJsonObject
// jAnnouncement
- val announcementId = jAnnouncement.getLong("Id") ?: -1
+ val announcementId = jAnnouncement.get("Id").asLong
- val rTeacher = data.getTeacherByFirstLast(jAnnouncement.getString("Autor") ?: "")
- val addedDate = jAnnouncement.getString("DataDodania")?.replace("[^\\d]".toRegex(), "")?.toLongOrNull() ?: System.currentTimeMillis()
- val startDate = jAnnouncement.getString("DataWydarzenia")?.replace("[^\\d]".toRegex(), "")?.toLongOrNull()?.let { Date.fromMillis(it) }
+ val rTeacher = data.getTeacherByFirstLast(jAnnouncement.get("Autor").asString)
+ val addedDate = java.lang.Long.parseLong(jAnnouncement.get("DataDodania").asString.replace("[^\\d]".toRegex(), ""))
+ val startDate = Date.fromMillis(java.lang.Long.parseLong(jAnnouncement.get("DataWydarzenia").asString.replace("[^\\d]".toRegex(), "")))
val announcementObject = Announcement(
- profileId = profileId,
- id = announcementId,
- subject = jAnnouncement.get("Temat").asString,
- text = jAnnouncement.get("Tresc").asString,
- startDate = startDate,
- endDate = null,
- teacherId = rTeacher.id,
- addedDate = addedDate
+ profileId,
+ announcementId,
+ jAnnouncement.get("Temat").asString,
+ jAnnouncement.get("Tresc").asString,
+ startDate,
+ null,
+ rTeacher.id,
+ null
)
data.announcementList.add(announcementObject)
data.metadataList.add(Metadata(
@@ -67,7 +65,8 @@ class IdziennikWebAnnouncements(override val data: DataIdziennik,
Metadata.TYPE_ANNOUNCEMENT,
announcementObject.id,
profile?.empty ?: false,
- profile?.empty ?: false
+ profile?.empty ?: false,
+ addedDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAttendance.kt
index e77c9eac..aa0a9998 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAttendance.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebAttendance.kt
@@ -12,18 +12,10 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.ENDPOINT_IDZIENNI
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.db.entity.Attendance
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_ABSENT
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_ABSENT_EXCUSED
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_BELATED
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_PRESENT
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_PRESENT_CUSTOM
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_RELEASED
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_UNKNOWN
+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
-import pl.szczodrzynski.edziennik.getInt
import pl.szczodrzynski.edziennik.getJsonObject
-import pl.szczodrzynski.edziennik.getString
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
@@ -59,97 +51,71 @@ class IdziennikWebAttendance(override val data: DataIdziennik,
for (jAttendanceEl in json.getAsJsonArray("Obecnosci")) {
val jAttendance = jAttendanceEl.asJsonObject
// jAttendance
- val type = jAttendance.get("TypObecnosci").asInt
-
- // skip "zajęcia nie odbyły się" and "Ferie"
- if (type == 5 || type == 7)
+ val attendanceTypeIdziennik = jAttendance.get("TypObecnosci").asInt
+ if (attendanceTypeIdziennik == 5 || attendanceTypeIdziennik == 7)
+ continue
+ val attendanceDate = Date.fromY_m_d(jAttendance.get("Data").asString)
+ val attendanceTime = Time.fromH_m(jAttendance.get("OdDoGodziny").asString)
+ if (attendanceDate.combineWith(attendanceTime) > System.currentTimeMillis())
continue
- val date = Date.fromY_m_d(jAttendance.get("Data").asString)
- val time = Time.fromH_m(jAttendance.get("OdDoGodziny").asString)
- if (date.combineWith(time) > System.currentTimeMillis())
- continue
-
- val id = jAttendance.get("IdLesson").asString.crc16().toLong()
+ val attendanceId = jAttendance.get("IdLesson").asString.crc16().toLong()
val rSubject = data.getSubject(jAttendance.get("Przedmiot").asString, jAttendance.get("IdPrzedmiot").asLong, "")
val rTeacher = data.getTeacherByFDotSpaceLast(jAttendance.get("PrzedmiotNauczyciel").asString)
- var baseType = TYPE_UNKNOWN
- var typeName = "nieznany rodzaj"
- var typeSymbol: String? = null
- var typeColor: Long? = null
+ var attendanceName = "obecność"
+ var attendanceType = Attendance.TYPE_CUSTOM
- /* https://iuczniowie.progman.pl/idziennik/mod_panelRodzica/obecnosci/obecnosciUcznia_lmt637231494660000000.js */
- /* https://iuczniowie.progman.pl/idziennik/mod_panelRodzica/obecnosci/obecnosci_lmt637231494660000000.css */
- when (type) {
- 1 -> {
- baseType = TYPE_ABSENT_EXCUSED
- typeName = "nieobecność usprawiedliwiona"
- typeColor = 0xffffe099
+ when (attendanceTypeIdziennik) {
+ 1 /* nieobecność usprawiedliwiona */ -> {
+ attendanceName = "nieobecność usprawiedliwiona"
+ attendanceType = TYPE_ABSENT_EXCUSED
}
- 2 -> {
- baseType = TYPE_BELATED
- typeName = "spóźnienie"
- typeColor = 0xffffffaa
+ 2 /* spóźnienie */ -> {
+ attendanceName = "spóźnienie"
+ attendanceType = TYPE_BELATED
}
- 3 -> {
- baseType = TYPE_ABSENT
- typeName = "nieobecność nieusprawiedliwiona"
- typeColor = 0xffffad99
+ 3 /* nieobecność nieusprawiedliwiona */ -> {
+ attendanceName = "nieobecność nieusprawiedliwiona"
+ attendanceType = TYPE_ABSENT
}
- 4, 9 -> {
- baseType = TYPE_RELEASED
- if (type == 4) {
- typeName = "zwolnienie"
- typeColor = 0xffa8beff
- }
- if (type == 9) {
- typeName = "zwolniony / obecny"
- typeSymbol = "zb"
- typeColor = 0xffff69b4
- }
+ 4 /* zwolnienie */, 9 /* zwolniony / obecny */ -> {
+ attendanceType = TYPE_RELEASED
+ if (attendanceTypeIdziennik == 4)
+ attendanceName = "zwolnienie"
+ if (attendanceTypeIdziennik == 9)
+ attendanceName = "zwolnienie / obecność"
}
- 8 -> {
- baseType = TYPE_PRESENT_CUSTOM
- typeName = "wycieczka"
- typeSymbol = "w"
- typeColor = null
- }
- 0 -> {
- baseType = TYPE_PRESENT
- typeName = "obecny"
- typeColor = 0xffccffcc
+ 0 /* obecny */, 8 /* Wycieczka */ -> {
+ attendanceType = TYPE_PRESENT
+ if (attendanceTypeIdziennik == 8)
+ attendanceName = "wycieczka"
}
}
- val semester = profile?.dateToSemester(date) ?: 1
+ val semester = profile?.dateToSemester(attendanceDate) ?: 1
val attendanceObject = Attendance(
- profileId = profileId,
- id = id,
- baseType = baseType,
- typeName = typeName,
- typeShort = typeSymbol ?: data.app.attendanceManager.getTypeShort(baseType),
- typeSymbol = typeSymbol ?: data.app.attendanceManager.getTypeShort(baseType),
- typeColor = typeColor?.toInt(),
- date = date,
- startTime = time,
- semester = semester,
- teacherId = rTeacher.id,
- subjectId = rSubject.id
- ).also {
- it.lessonTopic = jAttendance.getString("PrzedmiotTemat")
- it.lessonNumber = jAttendance.getInt("Godzina")
- }
+ profileId,
+ attendanceId,
+ rTeacher.id,
+ rSubject.id,
+ semester,
+ attendanceName,
+ attendanceDate,
+ attendanceTime,
+ attendanceType
+ )
data.attendanceList.add(attendanceObject)
- if (attendanceObject.baseType != TYPE_PRESENT) {
+ if (attendanceObject.type != TYPE_PRESENT) {
data.metadataList.add(Metadata(
profileId,
Metadata.TYPE_ATTENDANCE,
attendanceObject.id,
- profile?.empty ?: false || baseType == TYPE_PRESENT_CUSTOM || baseType == TYPE_UNKNOWN,
- profile?.empty ?: false || baseType == TYPE_PRESENT_CUSTOM || baseType == TYPE_UNKNOWN
+ profile?.empty ?: false,
+ profile?.empty ?: false,
+ System.currentTimeMillis()
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebExams.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebExams.kt
index 25c06945..0aaf77c5 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebExams.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebExams.kt
@@ -17,7 +17,6 @@ import pl.szczodrzynski.edziennik.data.db.entity.Event
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
import pl.szczodrzynski.edziennik.utils.models.Date
-import java.util.*
class IdziennikWebExams(override val data: DataIdziennik,
override val lastSync: Long?,
@@ -66,30 +65,28 @@ class IdziennikWebExams(override val data: DataIdziennik,
val subjectId = data.getSubject(subjectName, null, subjectName).id
val teacherName = exam.getString("wpisal") ?: return@forEach
val teacherId = data.getTeacherByLastFirst(teacherName).id
- val topic = exam.getString("zakres")?.trim() ?: ""
+ val topic = exam.getString("zakres") ?: ""
- val lessonList = data.db.timetableDao().getAllForDateNow(profileId, examDate)
+ val lessonList = data.db.timetableDao().getForDateNow(profileId, examDate)
val startTime = lessonList.firstOrNull { it.subjectId == subjectId }?.startTime
- val eventType = when (exam.getString("rodzaj")?.toLowerCase(Locale.getDefault())) {
- "sprawdzian/praca klasowa",
- "sprawdzian",
- "praca klasowa" -> Event.TYPE_EXAM
- "kartkówka" -> Event.TYPE_SHORT_QUIZ
- else -> Event.TYPE_EXAM
+ val eventType = when (exam.getString("rodzaj")) {
+ "sprawdzian/praca klasowa" -> Event.TYPE_EXAM
+ else -> Event.TYPE_SHORT_QUIZ
}
val eventObject = Event(
- profileId = profileId,
- id = id,
- date = examDate,
- time = startTime,
- topic = topic,
- color = null,
- type = eventType,
- teacherId = teacherId,
- subjectId = subjectId,
- teamId = data.teamClass?.id ?: -1
+ profileId,
+ id,
+ examDate,
+ startTime,
+ topic,
+ -1,
+ eventType,
+ false,
+ teacherId,
+ subjectId,
+ data.teamClass?.id ?: -1
)
data.eventList.add(eventObject)
@@ -98,7 +95,8 @@ class IdziennikWebExams(override val data: DataIdziennik,
Metadata.TYPE_EVENT,
eventObject.id,
profile?.empty ?: false,
- profile?.empty ?: false
+ profile?.empty ?: false,
+ System.currentTimeMillis()
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetAttachment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetAttachment.kt
index b7a462f6..562f527c 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetAttachment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetAttachment.kt
@@ -15,7 +15,7 @@ import pl.szczodrzynski.edziennik.utils.Utils
import java.io.File
class IdziennikWebGetAttachment(override val data: DataIdziennik,
- val owner: Any,
+ val message: Message,
val attachmentId: Long,
val attachmentName: String,
val onSuccess: () -> Unit
@@ -25,8 +25,6 @@ class IdziennikWebGetAttachment(override val data: DataIdziennik,
}
init {
- val message = owner as Message
-
val messageId = "\\[META:([A-z0-9]+);([0-9-]+)]".toRegex().find(message.body ?: "")?.get(2) ?: -1
val targetFile = File(Utils.getStorageDir(), attachmentName)
@@ -36,29 +34,29 @@ class IdziennikWebGetAttachment(override val data: DataIdziennik,
), { file ->
val event = AttachmentGetEvent(
profileId,
- owner,
+ message.id,
attachmentId,
AttachmentGetEvent.TYPE_FINISHED,
file.absolutePath
)
- val attachmentDataFile = File(Utils.getStorageDir(), ".${profileId}_${event.ownerId}_${event.attachmentId}")
+ val attachmentDataFile = File(Utils.getStorageDir(), ".${profileId}_${event.messageId}_${event.attachmentId}")
Utils.writeStringToFile(attachmentDataFile, event.fileName)
- EventBus.getDefault().postSticky(event)
+ EventBus.getDefault().post(event)
onSuccess()
}) { written, _ ->
val event = AttachmentGetEvent(
profileId,
- owner,
+ message.id,
attachmentId,
AttachmentGetEvent.TYPE_PROGRESS,
bytesWritten = written
)
- EventBus.getDefault().postSticky(event)
+ EventBus.getDefault().post(event)
}
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetHomework.kt
deleted file mode 100644
index 12d804db..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetHomework.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-4-1.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.web
-
-import org.greenrobot.eventbus.EventBus
-import pl.szczodrzynski.edziennik.data.api.ERROR_IDZIENNIK_WEB_REQUEST_NO_DATA
-import pl.szczodrzynski.edziennik.data.api.IDZIENNIK_WEB_GET_HOMEWORK
-import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.DataIdziennik
-import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb
-import pl.szczodrzynski.edziennik.data.api.events.EventGetEvent
-import pl.szczodrzynski.edziennik.data.api.models.ApiError
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
-import pl.szczodrzynski.edziennik.getBoolean
-import pl.szczodrzynski.edziennik.getJsonObject
-import pl.szczodrzynski.edziennik.getString
-
-class IdziennikWebGetHomework(override val data: DataIdziennik,
- val event: EventFull,
- val onSuccess: () -> Unit
-) : IdziennikWeb(data, null) {
- companion object {
- private const val TAG = "IdziennikWebGetHomework"
- }
-
- init {
- webApiGet(TAG, IDZIENNIK_WEB_GET_HOMEWORK, mapOf(
- "idP" to data.registerId,
- "idPD" to event.id
- )) { result ->
- val json = result.getJsonObject("d") ?: run {
- data.error(ApiError(TAG, ERROR_IDZIENNIK_WEB_REQUEST_NO_DATA)
- .withApiResponse(result))
- return@webApiGet
- }
-
- val homework = json.getJsonObject("praca") ?: return@webApiGet
-
- if (homework.getBoolean("zalacznik", false)) {
- event.attachmentIds = mutableListOf(event.id)
- event.attachmentNames = mutableListOf("Załącznik do zadania")
- }
- else {
- event.attachmentIds = mutableListOf()
- event.attachmentNames = mutableListOf()
- }
- event.homeworkBody = homework.getString("tresc")
-
- data.eventList.add(event)
- data.eventListReplace = true
-
- EventBus.getDefault().postSticky(EventGetEvent(event))
- onSuccess()
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetHomeworkAttachment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetHomeworkAttachment.kt
deleted file mode 100644
index f4a60f98..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetHomeworkAttachment.kt
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-4-1.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.web
-
-import com.google.gson.JsonObject
-import org.greenrobot.eventbus.EventBus
-import pl.szczodrzynski.edziennik.data.api.IDZIENNIK_WEB_GET_HOMEWORK_ATTACHMENT
-import pl.szczodrzynski.edziennik.data.api.Regexes
-import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.DataIdziennik
-import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb
-import pl.szczodrzynski.edziennik.data.api.events.AttachmentGetEvent
-import pl.szczodrzynski.edziennik.data.db.entity.Event
-import pl.szczodrzynski.edziennik.get
-import pl.szczodrzynski.edziennik.getString
-import pl.szczodrzynski.edziennik.set
-import pl.szczodrzynski.edziennik.utils.Utils
-import java.io.File
-
-class IdziennikWebGetHomeworkAttachment(override val data: DataIdziennik,
- val owner: Any,
- val attachmentId: Long,
- val attachmentName: String,
- val onSuccess: () -> Unit
-) : IdziennikWeb(data, null) {
- companion object {
- const val TAG = "IdziennikWebGetHomeworkAttachment"
- }
-
- init {
- val homework = owner as Event
-
- /*val request = Request.Builder()
- .url("")
- .build()
- data.app.http.newCall(request).enqueue(object : Callback {
- override fun onFailure(call: Call, e: IOException) {
- data.error(ApiError(TAG, ERROR_REQUEST_FAILURE)
- .withThrowable(e))
- }
-
- override fun onResponse(call: Call, response: Response) {
- val filename = response.header("content-disposition")?.substringAfter("\"")?.substringBeforeLast("\"")
-
- val file: File = File(Utils.getStorageDir(), filename)
- val sink = file.sink().buffer()
- response.body()?.source()?.let {
- sink.writeAll(it)
- }
- sink.close()
- }
- })*/
-
- webGet(TAG, IDZIENNIK_WEB_GET_HOMEWORK_ATTACHMENT) { text ->
- val hiddenFields = JsonObject()
- Regexes.IDZIENNIK_LOGIN_HIDDEN_FIELDS.findAll(text).forEach {
- hiddenFields[it[1]] = it[2]
- }
-
- webGetFile(TAG, IDZIENNIK_WEB_GET_HOMEWORK_ATTACHMENT, Utils.getStorageDir(), mapOf(
- "__VIEWSTATE" to hiddenFields.getString("__VIEWSTATE", ""),
- "__VIEWSTATEGENERATOR" to hiddenFields.getString("__VIEWSTATEGENERATOR", ""),
- "__EVENTVALIDATION" to hiddenFields.getString("__EVENTVALIDATION", ""),
- "__EVENTTARGET" to "ctl00\$cphContent\$bt_pobraniePliku",
- "ctl00\$dxComboUczniowie" to data.registerId,
- "ctl00\$cphContent\$idPracyDomowej" to attachmentId
- ), { file ->
- val event = AttachmentGetEvent(
- profileId,
- owner,
- attachmentId,
- AttachmentGetEvent.TYPE_FINISHED,
- file.absolutePath
- )
-
- val attachmentDataFile = File(Utils.getStorageDir(), ".${profileId}_${event.ownerId}_${event.attachmentId}")
- Utils.writeStringToFile(attachmentDataFile, event.fileName)
-
- homework.attachmentNames = mutableListOf(file.name)
- data.eventList.add(homework)
- data.eventListReplace = true
-
- EventBus.getDefault().postSticky(event)
- onSuccess()
-
- }) { written, _ ->
- val event = AttachmentGetEvent(
- profileId,
- owner,
- attachmentId,
- AttachmentGetEvent.TYPE_PROGRESS,
- bytesWritten = written
- )
-
- EventBus.getDefault().postSticky(event)
- }
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetMessage.kt
index bd1808df..dfe9fba3 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetMessage.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGetMessage.kt
@@ -10,8 +10,8 @@ import pl.szczodrzynski.edziennik.data.api.IDZIENNIK_WEB_GET_MESSAGE
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.DataIdziennik
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb
import pl.szczodrzynski.edziennik.data.api.events.MessageGetEvent
-import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_RECEIVED
-import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_SENT
+import pl.szczodrzynski.edziennik.data.db.entity.Message.TYPE_RECEIVED
+import pl.szczodrzynski.edziennik.data.db.entity.Message.TYPE_SENT
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
import pl.szczodrzynski.edziennik.data.db.full.MessageRecipientFull
@@ -50,11 +50,7 @@ class IdziennikWebGetMessage(override val data: DataIdziennik,
message.recipients?.clear()
when (message.type) {
TYPE_RECEIVED -> {
- val recipientObject = MessageRecipientFull(
- profileId = profileId,
- id = -1,
- messageId = message.id
- )
+ val recipientObject = MessageRecipientFull(profileId, -1, message.id)
val readDateString = it.getString("DataOdczytania")
recipientObject.readDate = if (readDateString.isNullOrBlank()) System.currentTimeMillis()
@@ -71,11 +67,7 @@ class IdziennikWebGetMessage(override val data: DataIdziennik,
val recipientName = recipient.getString("NazwaOdbiorcy") ?: return@forEach
val teacher = data.getTeacherByLastFirst(recipientName)
- val recipientObject = MessageRecipientFull(
- profileId = profileId,
- id = teacher.id,
- messageId = message.id
- )
+ val recipientObject = MessageRecipientFull(profileId, teacher.id, message.id)
recipientObject.readDate = recipient.getLong("Status") ?: return@forEach
recipientObject.fullName = teacher.fullName
@@ -94,14 +86,14 @@ class IdziennikWebGetMessage(override val data: DataIdziennik,
Metadata.TYPE_MESSAGE,
message.id,
message.seen,
- message.notified
+ message.notified,
+ message.addedDate
))
}
- data.messageList.add(message)
- data.messageListReplace = true
-
EventBus.getDefault().postSticky(MessageGetEvent(message))
+
+ data.messageList.add(message)
onSuccess()
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGrades.kt
index 90e17401..67838070 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGrades.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebGrades.kt
@@ -14,7 +14,6 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb
import pl.szczodrzynski.edziennik.data.api.models.ApiError
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.SYNC_ALWAYS
import pl.szczodrzynski.edziennik.utils.models.Date
@@ -63,24 +62,18 @@ class IdziennikWebGrades(override val data: DataIdziennik,
colorInt = Color.parseColor("#$gradeColor")
}
- val addedDate = grade.getString("Data_wystaw")?.let { Date.fromY_m_d(it).inMillis } ?: System.currentTimeMillis()
-
val gradeObject = Grade(
- profileId = profileId,
- id = id,
- name = name,
- type = TYPE_NORMAL,
- value = value,
- weight = weight,
- color = colorInt,
- category = category,
- description = null,
- comment = null,
- semester = semester,
- teacherId = teacher.id,
- subjectId = subject.id,
- addedDate = addedDate
- )
+ profileId,
+ id,
+ category,
+ colorInt,
+ "",
+ name,
+ value,
+ weight,
+ semester,
+ teacher.id,
+ subject.id)
when (grade.getInt("Typ")) {
0 -> {
@@ -104,33 +97,30 @@ class IdziennikWebGrades(override val data: DataIdziennik,
colorInt = Color.parseColor("#$historyColor")
}
- val addedDate = historyItem.getString("Data_wystaw")?.let { Date.fromY_m_d(it).inMillis } ?: System.currentTimeMillis()
-
val historyObject = Grade(
- profileId = profileId,
- id = gradeObject.id * -1,
- name = historyItem.getString("Ocena") ?: "",
- type = TYPE_NORMAL,
- value = value,
- weight = if (value > 0f && countToTheAverage) weight * -1f else 0f,
- color = colorInt,
- category = historyItem.getString("Kategoria"),
- description = historyItem.getString("Uzasadnienie"),
- comment = null,
- semester = historyItem.getInt("Semestr") ?: 1,
- teacherId = teacher.id,
- subjectId = subject.id,
- addedDate = addedDate
- )
+ profileId,
+ gradeObject.id * -1,
+ historyItem.get("Kategoria").asString,
+ colorInt,
+ historyItem.get("Uzasadnienie").asString,
+ historyItem.get("Ocena").asString,
+ value,
+ if (value > 0f && countToTheAverage) weight * -1f else 0f,
+ historyItem.get("Semestr").asInt,
+ teacher.id,
+ subject.id)
historyObject.parentId = gradeObject.id
+ val addedDate = historyItem.getString("Data_wystaw")?.let { Date.fromY_m_d(it).inMillis } ?: System.currentTimeMillis()
+
data.gradeList.add(historyObject)
data.metadataList.add(Metadata(
profileId,
Metadata.TYPE_GRADE,
historyObject.id,
true,
- true
+ true,
+ addedDate
))
}
// update the current grade's value with an average of all historical grades and itself
@@ -152,6 +142,8 @@ class IdziennikWebGrades(override val data: DataIdziennik,
}
}
+ val addedDate = grade.getString("Data_wystaw")?.let { Date.fromY_m_d(it).inMillis } ?: System.currentTimeMillis()
+
data.gradeList.add(gradeObject)
data.metadataList.add(
Metadata(
@@ -159,7 +151,8 @@ class IdziennikWebGrades(override val data: DataIdziennik,
Metadata.TYPE_GRADE,
id,
data.profile.empty,
- data.profile.empty
+ data.profile.empty,
+ addedDate
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebHomework.kt
index 10b4a0c3..345e7da4 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebHomework.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebHomework.kt
@@ -52,14 +52,13 @@ class IdziennikWebHomework(override val data: DataIdziennik,
json.getJsonArray("ListK")?.asJsonObjectList()?.forEach { homework ->
val id = homework.getLong("_recordId") ?: return@forEach
val eventDate = Date.fromY_m_d(homework.getString("dataO") ?: return@forEach)
- val addedDate = Date.fromY_m_d(homework.getString("dataZ") ?: return@forEach)
val subjectName = homework.getString("przed") ?: return@forEach
val subjectId = data.getSubject(subjectName, null, subjectName).id
val teacherName = homework.getString("usr") ?: return@forEach
val teacherId = data.getTeacherByLastFirst(teacherName).id
- val lessonList = data.db.timetableDao().getAllForDateNow(profileId, eventDate)
+ val lessonList = data.db.timetableDao().getForDateNow(profileId, eventDate)
val startTime = lessonList.firstOrNull { it.subjectId == subjectId }?.displayStartTime
- val topic = homework.getString("tytul")?.trim() ?: ""
+ val topic = homework.getString("tytul") ?: ""
val seen = when (profile?.empty) {
true -> true
@@ -68,17 +67,17 @@ class IdziennikWebHomework(override val data: DataIdziennik,
val eventObject = Event(
- profileId = profileId,
- id = id,
- date = eventDate,
- time = startTime,
- topic = topic,
- color = null,
- type = Event.TYPE_HOMEWORK,
- teacherId = teacherId,
- subjectId = subjectId,
- teamId = data.teamClass?.id ?: -1,
- addedDate = addedDate.inMillis
+ profileId,
+ id,
+ eventDate,
+ startTime,
+ topic,
+ -1,
+ Event.TYPE_HOMEWORK,
+ false,
+ teacherId,
+ subjectId,
+ data.teamClass?.id ?: -1
)
data.eventList.add(eventObject)
@@ -87,7 +86,8 @@ class IdziennikWebHomework(override val data: DataIdziennik,
Metadata.TYPE_HOMEWORK,
eventObject.id,
seen,
- seen
+ seen,
+ System.currentTimeMillis()
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebNotices.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebNotices.kt
index 64108bfd..dcc560d5 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebNotices.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebNotices.kt
@@ -13,12 +13,9 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.Notice
-import pl.szczodrzynski.edziennik.data.db.entity.Notice.Companion.TYPE_NEGATIVE
-import pl.szczodrzynski.edziennik.data.db.entity.Notice.Companion.TYPE_NEUTRAL
-import pl.szczodrzynski.edziennik.data.db.entity.Notice.Companion.TYPE_POSITIVE
+import pl.szczodrzynski.edziennik.data.db.entity.Notice.*
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
import pl.szczodrzynski.edziennik.getJsonObject
-import pl.szczodrzynski.edziennik.getString
import pl.szczodrzynski.edziennik.utils.models.Date
class IdziennikWebNotices(override val data: DataIdziennik,
@@ -56,24 +53,20 @@ class IdziennikWebNotices(override val data: DataIdziennik,
}
val noticeObject = Notice(
- profileId = profileId,
- id = noticeId,
- type = nType,
- semester = jNotice.get("Semestr").asInt,
- text = jNotice.getString("Tresc") ?: "",
- category = null,
- points = null,
- teacherId = rTeacher.id,
- addedDate = addedDate.inMillis
- )
-
+ profileId,
+ noticeId,
+ jNotice.get("Tresc").asString,
+ jNotice.get("Semestr").asInt,
+ nType,
+ rTeacher.id)
data.noticeList.add(noticeObject)
data.metadataList.add(Metadata(
profileId,
Metadata.TYPE_NOTICE,
noticeObject.id,
profile?.empty ?: false,
- profile?.empty ?: false
+ profile?.empty ?: false,
+ addedDate.inMillis
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebProposedGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebProposedGrades.kt
index b23e9f98..3c1c3db0 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebProposedGrades.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebProposedGrades.kt
@@ -13,14 +13,14 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb
import pl.szczodrzynski.edziennik.data.api.models.ApiError
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_DESCRIPTIVE
-import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_SEMESTER1_PROPOSED
-import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_YEAR_PROPOSED
+import pl.szczodrzynski.edziennik.data.db.entity.Grade.TYPE_SEMESTER1_PROPOSED
+import pl.szczodrzynski.edziennik.data.db.entity.Grade.TYPE_YEAR_PROPOSED
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
import pl.szczodrzynski.edziennik.getJsonArray
import pl.szczodrzynski.edziennik.getJsonObject
import pl.szczodrzynski.edziennik.getString
+import pl.szczodrzynski.edziennik.utils.Utils.getWordGradeValue
class IdziennikWebProposedGrades(override val data: DataIdziennik,
override val lastSync: Long?,
@@ -39,64 +39,35 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik,
.withApiResponse(result))
return@webApiGet
}
- val manager = data.app.gradesManager
json.getJsonArray("Przedmioty")?.asJsonObjectList()?.forEach { subject ->
val subjectName = subject.getString("Przedmiot") ?: return@forEach
val subjectObject = data.getSubject(subjectName, null, subjectName)
val semester1Proposed = subject.getString("OcenaSem1") ?: ""
- val semester1Value = manager.getGradeValue(semester1Proposed)
+ val semester1Value = getWordGradeValue(semester1Proposed)
val semester1Id = subjectObject.id * (-100) - 1
- val semester1Type =
- if (semester1Value == 0f) TYPE_DESCRIPTIVE
- else TYPE_SEMESTER1_PROPOSED
- val semester1Name = when {
- semester1Value == 0f -> " "
- semester1Value % 1.0f == 0f -> semester1Value.toInt().toString()
- else -> semester1Value.toString()
- }
- val semester1Color =
- if (semester1Value == 0f) 0xff536dfe.toInt()
- else -1
val semester2Proposed = subject.getString("OcenaSem2") ?: ""
- val semester2Value = manager.getGradeValue(semester2Proposed)
+ val semester2Value = getWordGradeValue(semester2Proposed)
val semester2Id = subjectObject.id * (-100) - 2
- val semester2Type =
- if (semester2Value == 0f) TYPE_DESCRIPTIVE
- else TYPE_YEAR_PROPOSED
- val semester2Name = when {
- semester2Value == 0f -> " "
- semester2Value % 1.0f == 0f -> semester2Value.toInt().toString()
- else -> semester2Value.toString()
- }
- val semester2Color =
- if (semester2Value == 0f) 0xffff4081.toInt()
- else -1
if (semester1Proposed != "") {
- val addedDate = if (data.profile.empty)
- data.profile.dateSemester1Start.inMillis
- else
- System.currentTimeMillis()
-
val gradeObject = Grade(
- profileId = profileId,
- id = semester1Id,
- name = semester1Name,
- type = semester1Type,
- value = semester1Value,
- weight = 0f,
- color = semester1Color,
- category = if (semester1Value == 0f) "Ocena opisowa semestralna" else null,
- description = if (semester1Value == 0f) semester1Proposed else null,
- comment = null,
- semester = 1,
- teacherId = -1,
- subjectId = subjectObject.id,
- addedDate = addedDate
- )
+ profileId,
+ semester1Id,
+ "",
+ -1,
+ "",
+ semester1Value.toString(),
+ semester1Value.toFloat(),
+ 0f,
+ 1,
+ -1,
+ subjectObject.id
+ ).apply {
+ type = TYPE_SEMESTER1_PROPOSED
+ }
data.gradeList.add(gradeObject)
data.metadataList.add(Metadata(
@@ -104,32 +75,27 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik,
Metadata.TYPE_GRADE,
gradeObject.id,
profile.empty,
- profile.empty
+ profile.empty,
+ System.currentTimeMillis()
))
}
if (semester2Proposed != "") {
- val addedDate = if (data.profile.empty)
- data.profile.dateSemester2Start.inMillis
- else
- System.currentTimeMillis()
-
val gradeObject = Grade(
- profileId = profileId,
- id = semester2Id,
- name = semester2Name,
- type = semester2Type,
- value = semester2Value,
- weight = 0f,
- color = semester2Color,
- category = if (semester2Value == 0f) "Ocena opisowa końcoworoczna" else null,
- description = if (semester2Value == 0f) semester2Proposed else null,
- comment = null,
- semester = 2,
- teacherId = -1,
- subjectId = subjectObject.id,
- addedDate = addedDate
- )
+ profileId,
+ semester2Id,
+ "",
+ -1,
+ "",
+ semester2Value.toString(),
+ semester2Value.toFloat(),
+ 0f,
+ 2,
+ -1,
+ subjectObject.id
+ ).apply {
+ type = TYPE_YEAR_PROPOSED
+ }
data.gradeList.add(gradeObject)
data.metadataList.add(Metadata(
@@ -137,7 +103,8 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik,
Metadata.TYPE_GRADE,
gradeObject.id,
profile.empty,
- profile.empty
+ profile.empty,
+ System.currentTimeMillis()
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebSendMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebSendMessage.kt
index 343ebcac..9a997a32 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebSendMessage.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebSendMessage.kt
@@ -57,9 +57,9 @@ class IdziennikWebSendMessage(override val data: DataIdziennik,
}
IdziennikApiMessagesSent(data, null) {
- val message = data.messageList.firstOrNull { it.type == Message.TYPE_SENT && it.subject == subject }
+ val message = data.messageIgnoreList.firstOrNull { it.type == Message.TYPE_SENT && it.subject == subject }
val metadata = data.metadataList.firstOrNull { it.thingType == Metadata.TYPE_MESSAGE && it.thingId == message?.id }
- val event = MessageSentEvent(data.profileId, message, message?.addedDate)
+ val event = MessageSentEvent(data.profileId, message, metadata?.addedDate)
EventBus.getDefault().postSticky(event)
onSuccess()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebSwitchRegister.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebSwitchRegister.kt
deleted file mode 100644
index f225f177..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebSwitchRegister.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-package pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.web
-
-import com.google.gson.JsonObject
-import pl.szczodrzynski.edziennik.data.api.IDZIENNIK_WEB_HOME
-import pl.szczodrzynski.edziennik.data.api.Regexes
-import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.DataIdziennik
-import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb
-import pl.szczodrzynski.edziennik.get
-import pl.szczodrzynski.edziennik.getString
-
-class IdziennikWebSwitchRegister(override val data: DataIdziennik,
- val registerId: Int,
- val onSuccess: () -> Unit
-) : IdziennikWeb(data, null) {
- companion object {
- private const val TAG = "IdziennikWebSwitchRegister"
- }
-
- init {
- val hiddenFields = data.loginStore.getLoginData("hiddenFields", JsonObject())
- // TODO error checking
-
- webGet(TAG, IDZIENNIK_WEB_HOME, mapOf(
- "__VIEWSTATE" to hiddenFields.getString("__VIEWSTATE", ""),
- "__VIEWSTATEGENERATOR" to hiddenFields.getString("__VIEWSTATEGENERATOR", ""),
- "__EVENTVALIDATION" to hiddenFields.getString("__EVENTVALIDATION", ""),
- "ctl00\$dxComboUczniowie" to registerId
- )) { text ->
- Regexes.IDZIENNIK_WEB_SELECTED_REGISTER.find(text)?.let {
- val registerId = it[1].toIntOrNull() ?: return@let
- data.webSelectedRegister = registerId
- }
- onSuccess()
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebTimetable.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebTimetable.kt
index e7d293c4..066346cd 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebTimetable.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/data/web/IdziennikWebTimetable.kt
@@ -165,7 +165,8 @@ class IdziennikWebTimetable(override val data: DataIdziennik,
Metadata.TYPE_LESSON_CHANGE,
lessonObject.id,
seen,
- seen
+ seen,
+ System.currentTimeMillis()
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/firstlogin/IdziennikFirstLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/firstlogin/IdziennikFirstLogin.kt
index 1a07c609..892c12c8 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/firstlogin/IdziennikFirstLogin.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/firstlogin/IdziennikFirstLogin.kt
@@ -89,7 +89,7 @@ class IdziennikFirstLogin(val data: DataIdziennik, val onSuccess: () -> Unit) {
profileList.add(profile)
}
- EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore))
+ EventBus.getDefault().post(FirstLoginFinishedEvent(profileList, data.loginStore))
onSuccess()
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt
index a2fd4d03..9f10268e 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt
@@ -7,14 +7,15 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.login
import im.wangchao.mhttp.Request
import im.wangchao.mhttp.Response
import im.wangchao.mhttp.callback.TextCallbackHandler
-import pl.szczodrzynski.edziennik.*
+import okhttp3.Cookie
+import pl.szczodrzynski.edziennik.HOUR
+import pl.szczodrzynski.edziennik.MINUTE
import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.DataIdziennik
import pl.szczodrzynski.edziennik.data.api.models.ApiError
-import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber
-import pl.szczodrzynski.edziennik.data.db.entity.Metadata
+import pl.szczodrzynski.edziennik.get
+import pl.szczodrzynski.edziennik.getUnixDate
import pl.szczodrzynski.edziennik.utils.Utils
-import pl.szczodrzynski.edziennik.utils.models.Date
class IdziennikLoginWeb(val data: DataIdziennik, val onSuccess: () -> Unit) {
companion object {
@@ -23,12 +24,22 @@ class IdziennikLoginWeb(val data: DataIdziennik, val onSuccess: () -> Unit) {
init { run {
if (data.isWebLoginValid()) {
- data.app.cookieJar.set("iuczniowie.progman.pl", "ASP.NET_SessionId_iDziennik", data.webSessionId)
- data.app.cookieJar.set("iuczniowie.progman.pl", ".ASPXAUTH", data.webAuth)
+ data.app.cookieJar.saveFromResponse(null, listOf(
+ Cookie.Builder()
+ .name("ASP.NET_SessionId_iDziennik")
+ .value(data.webSessionId!!)
+ .domain("iuczniowie.progman.pl")
+ .secure().httpOnly().build(),
+ Cookie.Builder()
+ .name(".ASPXAUTH")
+ .value(data.webAuth!!)
+ .domain("iuczniowie.progman.pl")
+ .secure().httpOnly().build()
+ ))
onSuccess()
}
else {
- data.app.cookieJar.clear("iuczniowie.progman.pl")
+ data.app.cookieJar.clearForDomain("iuczniowie.progman.pl")
if (data.webSchoolName != null && data.webUsername != null && data.webPassword != null) {
loginWithCredentials()
}
@@ -51,54 +62,13 @@ class IdziennikLoginWeb(val data: DataIdziennik, val onSuccess: () -> Unit) {
// login succeeded: there is a start page
if (text.contains("czyWyswietlicDostepMobilny")) {
- val cookies = data.app.cookieJar.getAll("iuczniowie.progman.pl")
+ val cookies = data.app.cookieJar.getForDomain("iuczniowie.progman.pl")
run {
- data.webSessionId = cookies["ASP.NET_SessionId_iDziennik"] ?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_SESSION
- data.webAuth = cookies[".ASPXAUTH"] ?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_AUTH
- data.apiBearer = cookies["Bearer"]?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_BEARER
+ data.webSessionId = cookies.singleOrNull { it.name() == "ASP.NET_SessionId_iDziennik" }?.value() ?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_SESSION
+ data.webAuth = cookies.singleOrNull { it.name() == ".ASPXAUTH" }?.value() ?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_AUTH
+ data.apiBearer = cookies.singleOrNull { it.name() == "Bearer" }?.value() ?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_BEARER
data.loginExpiryTime = response.getUnixDate() + 30 * MINUTE /* after about 40 minutes the login didn't work already */
data.apiExpiryTime = response.getUnixDate() + 12 * HOUR /* actually it expires after 24 hours but I'm not sure when does the token refresh. */
-
- val hiddenFields = JsonObject()
- Regexes.IDZIENNIK_LOGIN_HIDDEN_FIELDS.findAll(text).forEach {
- hiddenFields[it[1]] = it[2]
- }
- data.loginStore.putLoginData("hiddenFields", hiddenFields)
-
- Regexes.IDZIENNIK_WEB_SELECTED_REGISTER.find(text)?.let {
- val registerId = it[1].toIntOrNull() ?: return@let
- data.webSelectedRegister = registerId
- }
-
- // for profiles created after archiving
- data.schoolYearId = Regexes.IDZIENNIK_LOGIN_FIRST_SCHOOL_YEAR.find(text)?.let {
- it[1].toIntOrNull()
- } ?: data.schoolYearId
- data.profile?.studentClassName = Regexes.IDZIENNIK_LOGIN_FIRST_STUDENT.findAll(text)
- .firstOrNull { it[1].toIntOrNull() == data.registerId }
- ?.let { "${it[5]} ${it[6]}" } ?: data.profile?.studentClassName
-
- data.profile?.let { profile ->
- Regexes.IDZIENNIK_WEB_LUCKY_NUMBER.find(text)?.also {
- val number = it[1].toIntOrNull() ?: return@also
- val luckyNumberObject = LuckyNumber(
- profileId = data.profileId,
- date = Date.getToday(),
- number = number
- )
-
- data.luckyNumberList.add(luckyNumberObject)
- data.metadataList.add(
- Metadata(
- profile.id,
- Metadata.TYPE_LUCKY_NUMBER,
- luckyNumberObject.date.value.toLong(),
- true,
- profile.empty
- ))
- }
- }
-
return@run null
}?.let { errorCode ->
data.error(ApiError(TAG, errorCode)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/DataLibrus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/DataLibrus.kt
index e77dd50d..930377b4 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/DataLibrus.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/DataLibrus.kt
@@ -4,6 +4,7 @@
package pl.szczodrzynski.edziennik.data.api.edziennik.librus
+import okhttp3.Cookie
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.currentTimeUnix
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_LIBRUS_API
@@ -30,11 +31,23 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
loginMethods += LOGIN_METHOD_LIBRUS_API
if (isSynergiaLoginValid()) {
loginMethods += LOGIN_METHOD_LIBRUS_SYNERGIA
- app.cookieJar.set("synergia.librus.pl", "DZIENNIKSID", synergiaSessionId)
+ app.cookieJar.saveFromResponse(null, listOf(
+ Cookie.Builder()
+ .name("DZIENNIKSID")
+ .value(synergiaSessionId!!)
+ .domain("synergia.librus.pl")
+ .secure().httpOnly().build()
+ ))
}
if (isMessagesLoginValid()) {
loginMethods += LOGIN_METHOD_LIBRUS_MESSAGES
- app.cookieJar.set("wiadomosci.librus.pl", "DZIENNIKSID", messagesSessionId)
+ app.cookieJar.saveFromResponse(null, listOf(
+ Cookie.Builder()
+ .name("DZIENNIKSID")
+ .value(messagesSessionId!!)
+ .domain("wiadomosci.librus.pl")
+ .secure().httpOnly().build()
+ ))
}
}
@@ -120,7 +133,7 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
private var mApiLogin: String? = null
var apiLogin: String?
get() { mApiLogin = mApiLogin ?: profile?.getStudentData("accountLogin", null); return mApiLogin }
- set(value) { profile?.putStudentData("accountLogin", value); mApiLogin = value }
+ set(value) { profile?.putStudentData("accountLogin", value) ?: return; mApiLogin = value }
/**
* A Synergia password.
* Used: for login (API Login Method) in Synergia mode.
@@ -129,7 +142,7 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
private var mApiPassword: String? = null
var apiPassword: String?
get() { mApiPassword = mApiPassword ?: profile?.getStudentData("accountPassword", null); return mApiPassword }
- set(value) { profile?.putStudentData("accountPassword", value); mApiPassword = value }
+ set(value) { profile?.putStudentData("accountPassword", value) ?: return; mApiPassword = value }
/**
* A JST login Code.
@@ -138,7 +151,8 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
private var mApiCode: String? = null
var apiCode: String?
get() { mApiCode = mApiCode ?: loginStore.getLoginData("accountCode", null); return mApiCode }
- set(value) { profile?.putStudentData("accountCode", value); mApiCode = value }
+ set(value) {
+ loginStore.putLoginData("accountCode", value); mApiCode = value }
/**
* A JST login PIN.
* Used only during first login in JST mode.
@@ -146,7 +160,8 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
private var mApiPin: String? = null
var apiPin: String?
get() { mApiPin = mApiPin ?: loginStore.getLoginData("accountPin", null); return mApiPin }
- set(value) { profile?.putStudentData("accountPin", value); mApiPin = value }
+ set(value) {
+ loginStore.putLoginData("accountPin", value); mApiPin = value }
/**
* A Synergia API access token.
@@ -176,16 +191,6 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
get() { mApiTokenExpiryTime = mApiTokenExpiryTime ?: profile?.getStudentData("accountTokenTime", 0L); return mApiTokenExpiryTime ?: 0L }
set(value) { mApiTokenExpiryTime = value; profile?.putStudentData("accountTokenTime", value) ?: return; }
- /**
- * A push device ID, generated by Librus when registering
- * a FCM token. I don't really know if this has any use,
- * but it may be worthy to save that ID.
- */
- private var mPushDeviceId: Int? = null
- var pushDeviceId: Int
- get() { mPushDeviceId = mPushDeviceId ?: profile?.getStudentData("pushDeviceId", 0); return mPushDeviceId ?: 0 }
- set(value) { mPushDeviceId = value; profile?.putStudentData("pushDeviceId", value) ?: return; }
-
/* _____ _
/ ____| (_)
| (___ _ _ _ __ ___ _ __ __ _ _ __ _
@@ -275,10 +280,4 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
var timetableNotPublic: Boolean
get() { mTimetableNotPublic = mTimetableNotPublic ?: profile?.getStudentData("timetableNotPublic", false); return mTimetableNotPublic ?: false }
set(value) { profile?.putStudentData("timetableNotPublic", value) ?: return; mTimetableNotPublic = value }
-
- /**
- * Set to false when Recaptcha helper doesn't provide a working token.
- * When it's set to false uses Synergia for messages.
- */
- var messagesLoginSuccessful: Boolean = true
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt
index abf3ac5f..8ef7d211 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt
@@ -13,7 +13,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.messages.Librus
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.messages.LibrusMessagesGetMessage
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.messages.LibrusMessagesGetRecipientList
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.messages.LibrusMessagesSendMessage
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia.*
+import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia.LibrusSynergiaMarkAllAnnouncementsAsRead
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.firstlogin.LibrusFirstLogin
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLogin
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
@@ -24,7 +24,6 @@ import pl.szczodrzynski.edziennik.data.db.entity.Message
import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
import pl.szczodrzynski.edziennik.utils.Utils.d
@@ -57,9 +56,9 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
|_| |_| |_|\___| /_/ \_\_|\__, |\___/|_| |_|\__|_| |_|_| |_| |_|
__/ |
|__*/
- override fun sync(featureIds: List, viewId: Int?, onlyEndpoints: List?, arguments: JsonObject?) {
+ override fun sync(featureIds: List, viewId: Int?, arguments: JsonObject?) {
data.arguments = arguments
- data.prepare(librusLoginMethods, LibrusFeatures, featureIds, viewId, onlyEndpoints)
+ data.prepare(librusLoginMethods, LibrusFeatures, featureIds, viewId)
login()
}
@@ -89,8 +88,9 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
override fun getMessage(message: MessageFull) {
login(LOGIN_METHOD_LIBRUS_MESSAGES) {
- if (data.messagesLoginSuccessful) LibrusMessagesGetMessage(data, message) { completed() }
- else LibrusSynergiaGetMessage(data, message) { completed() }
+ LibrusMessagesGetMessage(data, message) {
+ completed()
+ }
}
}
@@ -118,22 +118,11 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
}
}
- override fun getAttachment(owner: Any, attachmentId: Long, attachmentName: String) {
- when (owner) {
- is Message -> {
- login(LOGIN_METHOD_LIBRUS_SYNERGIA) {
- if (data.messagesLoginSuccessful) LibrusMessagesGetAttachment(data, owner, attachmentId, attachmentName) { completed() }
- LibrusSynergiaGetAttachment(data, owner, attachmentId, attachmentName) { completed() }
- }
+ override fun getAttachment(message: Message, attachmentId: Long, attachmentName: String) {
+ login(LOGIN_METHOD_LIBRUS_MESSAGES) {
+ LibrusMessagesGetAttachment(data, message, attachmentId, attachmentName) {
+ completed()
}
- is EventFull -> {
- login(LOGIN_METHOD_LIBRUS_SYNERGIA) {
- LibrusSynergiaHomeworkGetAttachment(data, owner, attachmentId, attachmentName) {
- completed()
- }
- }
- }
- else -> completed()
}
}
@@ -145,14 +134,6 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
}
}
- override fun getEvent(eventFull: EventFull) {
- login(LOGIN_METHOD_LIBRUS_SYNERGIA) {
- LibrusSynergiaGetHomework(data, eventFull) {
- completed()
- }
- }
- }
-
override fun firstLogin() { LibrusFirstLogin(data) { completed() } }
override fun cancel() {
d(TAG, "Cancelled")
@@ -199,7 +180,6 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
}
ERROR_LOGIN_LIBRUS_PORTAL_NO_CODE,
ERROR_LOGIN_LIBRUS_PORTAL_CSRF_MISSING,
- ERROR_LOGIN_LIBRUS_PORTAL_CSRF_EXPIRED,
ERROR_LOGIN_LIBRUS_PORTAL_CODE_REVOKED,
ERROR_LOGIN_LIBRUS_PORTAL_CODE_EXPIRED -> {
login()
@@ -218,6 +198,7 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
ERROR_LOGIN_LIBRUS_MESSAGES_NO_SESSION_ID -> {
login()
}
+ // TODO PORTAL CAPTCHA
ERROR_LIBRUS_API_TIMETABLE_NOT_PUBLIC -> {
data.timetableNotPublic = true
data()
@@ -226,11 +207,6 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
ERROR_LIBRUS_API_NOTES_NOT_ACTIVE -> {
data()
}
- ERROR_LIBRUS_API_DEVICE_REGISTERED -> {
- data.app.config.sync.tokenLibrusList =
- data.app.config.sync.tokenLibrusList + data.profileId
- data()
- }
else -> callback.onError(apiError)
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/LibrusFeatures.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/LibrusFeatures.kt
index c14a00df..d0fd82c1 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/LibrusFeatures.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/LibrusFeatures.kt
@@ -50,11 +50,11 @@ const val ENDPOINT_LIBRUS_API_CLASS_FREE_DAYS = 1130
const val ENDPOINT_LIBRUS_SYNERGIA_INFO = 2010
const val ENDPOINT_LIBRUS_SYNERGIA_GRADES = 2020
const val ENDPOINT_LIBRUS_SYNERGIA_HOMEWORK = 2030
-const val ENDPOINT_LIBRUS_SYNERGIA_MESSAGES_RECEIVED = 2040
-const val ENDPOINT_LIBRUS_SYNERGIA_MESSAGES_SENT = 2050
const val ENDPOINT_LIBRUS_MESSAGES_RECEIVED = 3010
const val ENDPOINT_LIBRUS_MESSAGES_SENT = 3020
const val ENDPOINT_LIBRUS_MESSAGES_TRASH = 3030
+const val ENDPOINT_LIBRUS_MESSAGES_RECEIVERS = 3040
+const val ENDPOINT_LIBRUS_MESSAGES_GET = 3040
val LibrusFeatures = listOf(
@@ -66,7 +66,7 @@ val LibrusFeatures = listOf(
Feature(LOGIN_TYPE_LIBRUS, FEATURE_PUSH_CONFIG, listOf(
ENDPOINT_LIBRUS_API_PUSH_CONFIG to LOGIN_METHOD_LIBRUS_API
), listOf(LOGIN_METHOD_LIBRUS_API)).withShouldSync { data ->
- (data as DataLibrus).isPremium && !data.app.config.sync.tokenLibrusList.contains(data.profileId)
+ !data.app.config.sync.tokenLibrusList.contains(data.profileId)
},
@@ -118,11 +118,11 @@ val LibrusFeatures = listOf(
* Homework - using API.
* Sync only if account has premium access.
*/
- /*Feature(LOGIN_TYPE_LIBRUS, FEATURE_HOMEWORK, listOf(
+ Feature(LOGIN_TYPE_LIBRUS, FEATURE_HOMEWORK, listOf(
ENDPOINT_LIBRUS_API_HOMEWORK to LOGIN_METHOD_LIBRUS_API
), listOf(LOGIN_METHOD_LIBRUS_API)).withShouldSync { data ->
(data as DataLibrus).isPremium
- },*/
+ },
/**
* Behaviour - using API.
*/
@@ -229,9 +229,9 @@ val LibrusFeatures = listOf(
*/
Feature(LOGIN_TYPE_LIBRUS, FEATURE_HOMEWORK, listOf(
ENDPOINT_LIBRUS_SYNERGIA_HOMEWORK to LOGIN_METHOD_LIBRUS_SYNERGIA
- ), listOf(LOGIN_METHOD_LIBRUS_SYNERGIA))/*.withShouldSync { data ->
+ ), listOf(LOGIN_METHOD_LIBRUS_SYNERGIA)).withShouldSync { data ->
!(data as DataLibrus).isPremium
- }*/,
+ },
/**
* Messages inbox - using messages website.
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/LibrusRecaptchaHelper.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/LibrusRecaptchaHelper.kt
deleted file mode 100644
index 3652f18a..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/LibrusRecaptchaHelper.kt
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-5-8.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.librus
-
-import android.content.Context
-import android.webkit.WebView
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.Job
-import kotlinx.coroutines.launch
-import pl.szczodrzynski.edziennik.startCoroutineTimer
-import kotlin.coroutines.CoroutineContext
-
-class LibrusRecaptchaHelper(
- val context: Context,
- url: String,
- html: String,
- val onSuccess: (url: String) -> Unit,
- val onTimeout: () -> Unit
-) : CoroutineScope {
- companion object {
- private const val TAG = "LibrusRecaptchaHelper"
- }
-
- private val job: Job = Job()
- override val coroutineContext: CoroutineContext
- get() = job + Dispatchers.Default
-
- private val webView by lazy {
- WebView(context).also {
- it.settings.javaScriptEnabled = true
- it.webViewClient = WebViewClient()
- }
- }
-
- private var timeout: Job? = null
- private var timedOut = false
-
- inner class WebViewClient : android.webkit.WebViewClient() {
- override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
- timeout?.cancel()
- if (!timedOut) {
- onSuccess(url)
- }
- return true
- }
- }
-
- init {
- launch(Dispatchers.Main) {
- webView.loadDataWithBaseURL(url, html, "text/html", "UTF-8", null)
- }
- timeout = startCoroutineTimer(delayMillis = 10000L) {
- timedOut = true
- onTimeout()
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusApi.kt
index d06cc219..7a536c81 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusApi.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusApi.kt
@@ -44,12 +44,9 @@ open class LibrusApi(open val data: DataLibrus, open val lastSync: Long?) {
.withResponse(response))
return
}
- /*
-{"Status":"Error","Code":"DeviceRegistered","Message":"This device is alerdy registered.","Resources":{"..":{"Url":"https:\/\/api.librus.pl\/2.0\/Root"}},"Url":"https:\/\/api.librus.pl\/2.0\/ChangeRegister"}*/
val error = if (response?.code() == 200) null else
json.getString("Code") ?:
json.getString("Message") ?:
- json.getString("Status") ?:
response?.parserErrorBody
error?.let { code ->
when (code) {
@@ -67,8 +64,6 @@ open class LibrusApi(open val data: DataLibrus, open val lastSync: Long?) {
"InvalidRequest" -> ERROR_LIBRUS_API_INVALID_REQUEST_PARAMS
"Nieprawidłowy węzeł." -> ERROR_LIBRUS_API_INCORRECT_ENDPOINT
"NoticeboardProblem" -> ERROR_LIBRUS_API_NOTICEBOARD_PROBLEM
- "DeviceRegistered" -> ERROR_LIBRUS_API_DEVICE_REGISTERED
- "Maintenance" -> ERROR_LIBRUS_API_MAINTENANCE
else -> ERROR_LIBRUS_API_OTHER
}.let { errorCode ->
if (errorCode !in ignoreErrors) {
@@ -120,8 +115,6 @@ open class LibrusApi(open val data: DataLibrus, open val lastSync: Long?) {
.allowErrorCode(HTTP_FORBIDDEN)
.allowErrorCode(HTTP_UNAUTHORIZED)
.allowErrorCode(HTTP_UNAVAILABLE)
- .allowErrorCode(HTTP_NOT_FOUND)
- .allowErrorCode(503)
.callback(callback)
.build()
.enqueue()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusData.kt
index 877d803b..855f6162 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusData.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusData.kt
@@ -8,7 +8,6 @@ import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.*
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.messages.LibrusMessagesGetList
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia.LibrusSynergiaGetMessages
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia.LibrusSynergiaHomework
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia.LibrusSynergiaInfo
import pl.szczodrzynski.edziennik.data.db.entity.Message
@@ -32,15 +31,15 @@ class LibrusData(val data: DataLibrus, val onSuccess: () -> Unit) {
onSuccess()
return
}
- val id = data.targetEndpointIds.firstKey()
- val lastSync = data.targetEndpointIds.remove(id)
- useEndpoint(id, lastSync) { endpointId ->
+ useEndpoint(data.targetEndpointIds.firstKey()) { endpointId ->
+ data.targetEndpointIds.remove(endpointId)
data.progress(data.progressStep)
nextEndpoint(onSuccess)
}
}
- private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
+ private fun useEndpoint(endpointId: Int, onSuccess: (endpointId: Int) -> Unit) {
+ val lastSync = data.targetEndpointIds[endpointId]
Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
when (endpointId) {
/**
@@ -82,10 +81,7 @@ class LibrusData(val data: DataLibrus, val onSuccess: () -> Unit) {
data.startProgress(R.string.edziennik_progress_endpoint_lessons)
LibrusApiLessons(data, lastSync, onSuccess)
}
- ENDPOINT_LIBRUS_API_PUSH_CONFIG -> {
- data.startProgress(R.string.edziennik_progress_endpoint_push_config)
- LibrusApiPushConfig(data, lastSync, onSuccess)
- }
+ // TODO push config
ENDPOINT_LIBRUS_API_TIMETABLES -> {
data.startProgress(R.string.edziennik_progress_endpoint_timetable)
LibrusApiTimetables(data, lastSync, onSuccess)
@@ -202,27 +198,17 @@ class LibrusData(val data: DataLibrus, val onSuccess: () -> Unit) {
data.startProgress(R.string.edziennik_progress_endpoint_student_info)
LibrusSynergiaInfo(data, lastSync, onSuccess)
}
- ENDPOINT_LIBRUS_SYNERGIA_MESSAGES_RECEIVED -> {
- data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox)
- LibrusSynergiaGetMessages(data, type = Message.TYPE_RECEIVED, lastSync = lastSync, onSuccess = onSuccess)
- }
- ENDPOINT_LIBRUS_SYNERGIA_MESSAGES_SENT -> {
- data.startProgress(R.string.edziennik_progress_endpoint_messages_outbox)
- LibrusSynergiaGetMessages(data, type = Message.TYPE_SENT, lastSync = lastSync, onSuccess = onSuccess)
- }
/**
* MESSAGES
*/
ENDPOINT_LIBRUS_MESSAGES_RECEIVED -> {
data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox)
- if (data.messagesLoginSuccessful) LibrusMessagesGetList(data, type = Message.TYPE_RECEIVED, lastSync = lastSync, onSuccess = onSuccess)
- else LibrusSynergiaGetMessages(data, type = Message.TYPE_RECEIVED, lastSync = lastSync, onSuccess = onSuccess)
+ LibrusMessagesGetList(data, type = Message.TYPE_RECEIVED, lastSync = lastSync, onSuccess = onSuccess)
}
ENDPOINT_LIBRUS_MESSAGES_SENT -> {
data.startProgress(R.string.edziennik_progress_endpoint_messages_outbox)
- if (data.messagesLoginSuccessful) LibrusMessagesGetList(data, type = Message.TYPE_SENT, lastSync = lastSync, onSuccess = onSuccess)
- else LibrusSynergiaGetMessages(data, type = Message.TYPE_SENT, lastSync = lastSync, onSuccess = onSuccess)
+ LibrusMessagesGetList(data, type = Message.TYPE_SENT, lastSync = lastSync, onSuccess = onSuccess)
}
else -> onSuccess(endpointId)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusMessages.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusMessages.kt
index dc8d8c47..febdab75 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusMessages.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusMessages.kt
@@ -12,6 +12,7 @@ import im.wangchao.mhttp.body.MediaTypeUtils
import im.wangchao.mhttp.callback.FileCallbackHandler
import im.wangchao.mhttp.callback.JsonCallbackHandler
import im.wangchao.mhttp.callback.TextCallbackHandler
+import okhttp3.Cookie
import org.json.JSONObject
import org.json.XML
import org.jsoup.Jsoup
@@ -54,20 +55,13 @@ open class LibrusMessages(open val data: DataLibrus, open val lastSync: Long?) {
}
when {
- text.contains("Niepoprawny login i/lub hasło.") -> ERROR_LOGIN_LIBRUS_MESSAGES_INVALID_LOGIN
- text.contains("Nie odnaleziono wiadomości.") -> ERROR_LIBRUS_MESSAGES_NOT_FOUND
- text.contains("stop.png") -> ERROR_LIBRUS_SYNERGIA_ACCESS_DENIED
- text.contains("eAccessDeny") -> ERROR_LIBRUS_MESSAGES_ACCESS_DENIED
- text.contains("OffLine") -> ERROR_LIBRUS_MESSAGES_MAINTENANCE
- text.contains("error") -> ERROR_LIBRUS_MESSAGES_ERROR
- text.contains("eVarWhitThisNameNotExists") -> ERROR_LIBRUS_MESSAGES_ACCESS_DENIED
- text.contains("") -> ERROR_LIBRUS_MESSAGES_OTHER
- else -> null
- }?.let { errorCode ->
- data.error(ApiError(tag, errorCode)
- .withApiResponse(text)
- .withResponse(response))
- return
+ text.contains("Niepoprawny login i/lub hasło.") -> data.error(TAG, ERROR_LOGIN_LIBRUS_MESSAGES_INVALID_LOGIN, response, text)
+ text.contains("stop.png") -> data.error(TAG, ERROR_LIBRUS_SYNERGIA_ACCESS_DENIED, response, text)
+ text.contains("eAccessDeny") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ACCESS_DENIED, response, text)
+ text.contains("OffLine") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_MAINTENANCE, response, text)
+ text.contains("error") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ERROR, response, text)
+ text.contains("eVarWhitThisNameNotExists") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ACCESS_DENIED, response, text)
+ text.contains("") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_OTHER, response, text)
}
try {
@@ -88,7 +82,14 @@ open class LibrusMessages(open val data: DataLibrus, open val lastSync: Long?) {
}
}
- data.app.cookieJar.set("wiadomosci.librus.pl", "DZIENNIKSID", data.messagesSessionId)
+ data.app.cookieJar.saveFromResponse(null, listOf(
+ Cookie.Builder()
+ .name("DZIENNIKSID")
+ .value(data.messagesSessionId!!)
+ .domain("wiadomosci.librus.pl")
+ .secure().httpOnly().build()
+ ))
+
val docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
val doc = docBuilder.newDocument()
@@ -138,20 +139,13 @@ open class LibrusMessages(open val data: DataLibrus, open val lastSync: Long?) {
}
when {
- text.contains("Niepoprawny login i/lub hasło.") -> ERROR_LOGIN_LIBRUS_MESSAGES_INVALID_LOGIN
- text.contains("Nie odnaleziono wiadomości.") -> ERROR_LIBRUS_MESSAGES_NOT_FOUND
- text.contains("stop.png") -> ERROR_LIBRUS_SYNERGIA_ACCESS_DENIED
- text.contains("eAccessDeny") -> ERROR_LIBRUS_MESSAGES_ACCESS_DENIED
- text.contains("OffLine") -> ERROR_LIBRUS_MESSAGES_MAINTENANCE
- text.contains("error") -> ERROR_LIBRUS_MESSAGES_ERROR
- text.contains("eVarWhitThisNameNotExists") -> ERROR_LIBRUS_MESSAGES_ACCESS_DENIED
- text.contains("") -> ERROR_LIBRUS_MESSAGES_OTHER
- else -> null
- }?.let { errorCode ->
- data.error(ApiError(tag, errorCode)
- .withApiResponse(text)
- .withResponse(response))
- return
+ text.contains("Niepoprawny login i/lub hasło.") -> data.error(TAG, ERROR_LOGIN_LIBRUS_MESSAGES_INVALID_LOGIN, response, text)
+ text.contains("stop.png") -> data.error(TAG, ERROR_LIBRUS_SYNERGIA_ACCESS_DENIED, response, text)
+ text.contains("eAccessDeny") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ACCESS_DENIED, response, text)
+ text.contains("OffLine") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_MAINTENANCE, response, text)
+ text.contains("error") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ERROR, response, text)
+ text.contains("eVarWhitThisNameNotExists") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ACCESS_DENIED, response, text)
+ text.contains("") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_OTHER, response, text)
}
try {
@@ -172,7 +166,14 @@ open class LibrusMessages(open val data: DataLibrus, open val lastSync: Long?) {
}
}
- data.app.cookieJar.set("wiadomosci.librus.pl", "DZIENNIKSID", data.messagesSessionId)
+ data.app.cookieJar.saveFromResponse(null, listOf(
+ Cookie.Builder()
+ .name("DZIENNIKSID")
+ .value(data.messagesSessionId!!)
+ .domain("wiadomosci.librus.pl")
+ .secure().httpOnly().build()
+ ))
+
val docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
val doc = docBuilder.newDocument()
@@ -252,11 +253,10 @@ open class LibrusMessages(open val data: DataLibrus, open val lastSync: Long?) {
.enqueue()
}
- fun sandboxGetFile(tag: String, url: String, targetFile: File, onSuccess: (file: File) -> Unit,
- method: Int = GET,
+ fun sandboxGetFile(tag: String, action: String, targetFile: File, onSuccess: (file: File) -> Unit,
onProgress: (written: Long, total: Long) -> Unit) {
- d(tag, "Request: Librus/Messages - $url")
+ d(tag, "Request: Librus/Messages - $LIBRUS_SANDBOX_URL$action")
val callback = object : FileCallbackHandler(targetFile) {
override fun onSuccess(file: File?, response: Response?) {
@@ -292,14 +292,9 @@ open class LibrusMessages(open val data: DataLibrus, open val lastSync: Long?) {
}
Request.builder()
- .url(url)
+ .url("$LIBRUS_SANDBOX_URL$action")
.userAgent(SYNERGIA_USER_AGENT)
- .also {
- when (method) {
- POST -> it.post()
- else -> it.get()
- }
- }
+ .post()
.callback(callback)
.build()
.enqueue()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusPortal.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusPortal.kt
index 4a5e0af6..48017438 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusPortal.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusPortal.kt
@@ -44,7 +44,6 @@ open class LibrusPortal(open val data: DataLibrus) {
"Access token is invalid" -> ERROR_LIBRUS_PORTAL_ACCESS_DENIED
"ApiDisabled" -> ERROR_LIBRUS_PORTAL_API_DISABLED
"Account not found" -> ERROR_LIBRUS_PORTAL_SYNERGIA_NOT_FOUND
- "Unable to refresh the account" -> ERROR_LIBRUS_PORTAL_MAINTENANCE
else -> when (json.getString("hint")) {
"Error while decoding to JSON" -> ERROR_LIBRUS_PORTAL_ACCESS_DENIED
else -> ERROR_LIBRUS_PORTAL_OTHER
@@ -98,7 +97,6 @@ open class LibrusPortal(open val data: DataLibrus) {
.allowErrorCode(HttpURLConnection.HTTP_UNAUTHORIZED)
.allowErrorCode(HttpURLConnection.HTTP_BAD_REQUEST)
.allowErrorCode(HttpURLConnection.HTTP_GONE)
- .allowErrorCode(424)
.callback(callback)
.build()
.enqueue()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusSynergia.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusSynergia.kt
index 72faf801..e201ca8f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusSynergia.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/LibrusSynergia.kt
@@ -35,7 +35,7 @@ open class LibrusSynergia(open val data: DataLibrus, open val lastSync: Long?) {
return
}
- if (!text.contains("jesteś zalogowany") && !text.contains("Podgląd zadania")) {
+ if (!text.contains("jesteś zalogowany")) {
when {
text.contains("stop.png") -> ERROR_LIBRUS_SYNERGIA_ACCESS_DENIED
text.contains("Przerwa techniczna") -> ERROR_LIBRUS_SYNERGIA_MAINTENANCE
@@ -48,6 +48,7 @@ open class LibrusSynergia(open val data: DataLibrus, open val lastSync: Long?) {
}
}
+
try {
onSuccess(text)
} catch (e: Exception) {
@@ -89,44 +90,4 @@ open class LibrusSynergia(open val data: DataLibrus, open val lastSync: Long?) {
.build()
.enqueue()
}
-
- fun redirectUrlGet(tag: String, url: String, onSuccess: (url: String) -> Unit) {
- d(tag, "Request: Librus/Synergia - $url")
-
- val callback = object : TextCallbackHandler() {
- override fun onSuccess(text: String?, response: Response) {
- val redirectUrl = response.headers().get("Location")
-
- if (redirectUrl != null) {
- try {
- onSuccess(redirectUrl)
- } catch (e: Exception) {
- data.error(ApiError(tag, EXCEPTION_LIBRUS_SYNERGIA_REQUEST)
- .withResponse(response)
- .withThrowable(e)
- .withApiResponse(text))
- }
- } else {
- data.error(ApiError(tag, ERROR_LIBRUS_SYNERGIA_OTHER)
- .withResponse(response)
- .withApiResponse(text))
- }
- }
-
- override fun onFailure(response: Response?, throwable: Throwable?) {
- data.error(ApiError(tag, ERROR_REQUEST_FAILURE)
- .withResponse(response)
- .withThrowable(throwable))
- }
- }
-
- Request.builder()
- .url(url)
- .userAgent(LIBRUS_USER_AGENT)
- .withClient(data.app.httpLazy)
- .get()
- .callback(callback)
- .build()
- .enqueue()
- }
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncementMarkAsRead.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncementMarkAsRead.kt
index 23cfceb4..d40c1a9a 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncementMarkAsRead.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncementMarkAsRead.kt
@@ -37,7 +37,8 @@ class LibrusApiAnnouncementMarkAsRead(override val data: DataLibrus,
Metadata.TYPE_ANNOUNCEMENT,
announcement.id,
announcement.seen,
- announcement.notified
+ announcement.notified,
+ announcement.addedDate
))
onSuccess()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncements.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncements.kt
index d19be231..8256b859 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncements.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAnnouncements.kt
@@ -38,17 +38,15 @@ class LibrusApiAnnouncements(override val data: DataLibrus,
val read = announcement.getBoolean("WasRead") ?: false
val announcementObject = Announcement(
- profileId = profileId,
- id = id,
- subject = subject,
- text = text,
- startDate = startDate,
- endDate = endDate,
- teacherId = teacherId,
- addedDate = addedDate
- ).also {
- it.idString = longId
- }
+ profileId,
+ id,
+ subject,
+ text,
+ startDate,
+ endDate,
+ teacherId,
+ longId
+ )
data.announcementList.add(announcementObject)
data.setSeenMetadataList.add(Metadata(
@@ -56,7 +54,8 @@ class LibrusApiAnnouncements(override val data: DataLibrus,
Metadata.TYPE_ANNOUNCEMENT,
id,
read,
- profile.empty || read
+ profile.empty || read,
+ addedDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendanceTypes.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendanceTypes.kt
index c620d13d..d7cbc00c 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendanceTypes.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendanceTypes.kt
@@ -26,39 +26,25 @@ class LibrusApiAttendanceTypes(override val data: DataLibrus,
attendanceTypes?.forEach { attendanceType ->
val id = attendanceType.getLong("Id") ?: return@forEach
+ val name = attendanceType.getString("Name") ?: ""
+ val color = attendanceType.getString("ColorRGB")?.let { Color.parseColor("#$it") } ?: -1
- val typeName = attendanceType.getString("Name") ?: ""
- val typeSymbol = attendanceType.getString("Short") ?: ""
- val typeColor = attendanceType.getString("ColorRGB")?.let { Color.parseColor("#$it") }
-
- val isStandard = attendanceType.getBoolean("Standard") ?: false
- val baseType = when (attendanceType.getJsonObject("StandardType")?.getLong("Id") ?: id) {
+ val standardId = when (attendanceType.getBoolean("Standard") ?: false) {
+ true -> id
+ false -> attendanceType.getJsonObject("StandardType")?.getLong("Id") ?: id
+ }
+ val type = when (standardId) {
1L -> Attendance.TYPE_ABSENT
2L -> Attendance.TYPE_BELATED
3L -> Attendance.TYPE_ABSENT_EXCUSED
4L -> Attendance.TYPE_RELEASED
- /*100*/else -> when (isStandard) {
- true -> Attendance.TYPE_PRESENT
- false -> Attendance.TYPE_PRESENT_CUSTOM
- }
- }
- val typeShort = when (isStandard) {
- true -> data.app.attendanceManager.getTypeShort(baseType)
- false -> typeSymbol
+ /*100*/else -> Attendance.TYPE_PRESENT
}
- data.attendanceTypes.put(id, AttendanceType(
- profileId,
- id,
- baseType,
- typeName,
- typeShort,
- typeSymbol,
- typeColor
- ))
+ data.attendanceTypes.put(id, AttendanceType(profileId, id, name, type, color))
}
- data.setSyncNext(ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES, 2*DAY)
+ data.setSyncNext(ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES, 4*DAY)
onSuccess(ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES)
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendances.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendances.kt
index 7857dc2a..5e69a5a7 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendances.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendances.kt
@@ -41,44 +41,39 @@ class LibrusApiAttendances(override val data: DataLibrus,
val lessonDate = Date.fromY_m_d(attendance.getString("Date"))
val teacherId = attendance.getJsonObject("AddedBy")?.getLong("Id")
val semester = attendance.getInt("Semester") ?: return@forEach
+ val type = attendance.getJsonObject("Type")?.getLong("Id") ?: return@forEach
+ val typeObject = data.attendanceTypes.get(type)
+ val topic = typeObject?.name ?: ""
- val typeId = attendance.getJsonObject("Type")?.getLong("Id") ?: return@forEach
- val type = data.attendanceTypes[typeId] ?: null
-
- val startTime = data.lessonRanges.get(lessonNo)?.startTime
+ val startTime = data.lessonRanges.get(lessonNo).startTime
val lesson = if (lessonId != -1L)
data.librusLessons.singleOrNull { it.lessonId == lessonId }
else null
+ val attendanceObject = Attendance(
+ profileId,
+ id,
+ teacherId ?: lesson?.teacherId ?: -1,
+ lesson?.subjectId ?: -1,
+ semester,
+ topic,
+ lessonDate,
+ startTime,
+ typeObject.type
+ )
+
val addedDate = Date.fromIso(attendance.getString("AddDate") ?: return@forEach)
- val attendanceObject = Attendance(
- profileId = profileId,
- id = id,
- baseType = type?.baseType ?: Attendance.TYPE_UNKNOWN,
- typeName = type?.typeName ?: "nieznany rodzaj",
- typeShort = type?.typeShort ?: "?",
- typeSymbol = type?.typeSymbol ?: "?",
- typeColor = type?.typeColor,
- date = lessonDate,
- startTime = startTime,
- semester = semester,
- teacherId = teacherId ?: lesson?.teacherId ?: -1,
- subjectId = lesson?.subjectId ?: -1,
- addedDate = addedDate
- ).also {
- it.lessonNumber = lessonNo
- }
-
data.attendanceList.add(attendanceObject)
- if(type?.baseType != Attendance.TYPE_PRESENT) {
+ if(typeObject.type != Attendance.TYPE_PRESENT) {
data.metadataList.add(Metadata(
profileId,
Metadata.TYPE_ATTENDANCE,
id,
- profile?.empty ?: false || type?.baseType == Attendance.TYPE_PRESENT_CUSTOM || type?.baseType == Attendance.TYPE_UNKNOWN,
- profile?.empty ?: false || type?.baseType == Attendance.TYPE_PRESENT_CUSTOM || type?.baseType == Attendance.TYPE_UNKNOWN
+ profile?.empty ?: false,
+ profile?.empty ?: false,
+ addedDate
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiBehaviourGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiBehaviourGrades.kt
index fae79a50..16c2b544 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiBehaviourGrades.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiBehaviourGrades.kt
@@ -10,7 +10,6 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
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_POINT_SUM
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
@@ -27,37 +26,23 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus,
private val nameFormat by lazy { DecimalFormat("#.##") }
- private val types by lazy {
- mapOf(
- 1 to ("wz" to "wzorowe"),
- 2 to ("bdb" to "bardzo dobre"),
- 3 to ("db" to "dobre"),
- 4 to ("popr" to "poprawne"),
- 5 to ("ndp" to "nieodpowiednie"),
- 6 to ("ng" to "naganne")
- )
- }
-
init { data.profile?.also { profile ->
apiGet(TAG, "BehaviourGrades/Points") { json ->
if (data.startPointsSemester1 > 0) {
val semester1StartGradeObject = Grade(
- profileId = profileId,
- id = -101,
- name = nameFormat.format(data.startPointsSemester1),
- type = TYPE_POINT_SUM,
- value = data.startPointsSemester1.toFloat(),
- weight = 0f,
- color = 0xffbdbdbd.toInt(),
- category = data.app.getString(R.string.grade_start_points),
- description = data.app.getString(R.string.grade_start_points_format, 1),
- comment = null,
- semester = 1,
- teacherId = -1,
- subjectId = 1,
- addedDate = profile.getSemesterStart(1).inMillis
- )
+ profileId,
+ -101,
+ data.app.getString(R.string.grade_start_points),
+ 0xffbdbdbd.toInt(),
+ data.app.getString(R.string.grade_start_points_format, 1),
+ nameFormat.format(data.startPointsSemester1),
+ data.startPointsSemester1.toFloat(),
+ -1f,
+ 1,
+ -1,
+ 1
+ ).apply { type = Grade.TYPE_POINT_SUM }
data.gradeList.add(semester1StartGradeObject)
data.metadataList.add(Metadata(
@@ -65,27 +50,25 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus,
Metadata.TYPE_GRADE,
semester1StartGradeObject.id,
true,
- true
+ true,
+ profile.getSemesterStart(1).inMillis
))
}
if (data.startPointsSemester2 > 0) {
val semester2StartGradeObject = Grade(
- profileId = profileId,
- id = -102,
- name = nameFormat.format(data.startPointsSemester2),
- type = TYPE_POINT_SUM,
- value = data.startPointsSemester2.toFloat(),
- weight = -1f,
- color = 0xffbdbdbd.toInt(),
- category = data.app.getString(R.string.grade_start_points),
- description = data.app.getString(R.string.grade_start_points_format, 2),
- comment = null,
- semester = 2,
- teacherId = -1,
- subjectId = 1,
- addedDate = profile.getSemesterStart(2).inMillis
- )
+ profileId,
+ -102,
+ data.app.getString(R.string.grade_start_points),
+ 0xffbdbdbd.toInt(),
+ data.app.getString(R.string.grade_start_points_format, 2),
+ nameFormat.format(data.startPointsSemester2),
+ data.startPointsSemester2.toFloat(),
+ -1f,
+ 2,
+ -1,
+ 1
+ ).apply { type = Grade.TYPE_POINT_SUM }
data.gradeList.add(semester2StartGradeObject)
data.metadataList.add(Metadata(
@@ -93,7 +76,8 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus,
Metadata.TYPE_GRADE,
semester2StartGradeObject.id,
true,
- true
+ true,
+ profile.getSemesterStart(2).inMillis
))
}
@@ -106,12 +90,8 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus,
val addedDate = grade.getString("AddDate")?.let { Date.fromIso(it) }
?: System.currentTimeMillis()
- val text = grade.getString("Text")
- val type = grade.getJsonObject("BehaviourGrade")?.getInt("Id")?.let { types[it] }
-
val name = when {
- type != null -> type.first
- value != null -> (if (value > 0) "+" else "") + nameFormat.format(value)
+ value != null -> (if (value >= 0) "+" else "") + nameFormat.format(value)
shortName != null -> shortName
else -> return@forEach
}
@@ -130,34 +110,32 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus,
val categoryName = category?.text ?: ""
- val comments = grade.getJsonArray("Comments")
- ?.asJsonObjectList()
- ?.mapNotNull { comment ->
- val cId = comment.getLong("Id") ?: return@mapNotNull null
- data.gradeCategories[cId]?.text
- } ?: listOf()
-
- val description = listOfNotNull(type?.second) + comments
+ val description = grade.getJsonArray("Comments")?.asJsonObjectList()?.let { comments ->
+ if (comments.isNotEmpty()) {
+ data.gradeCategories.singleOrNull {
+ it.type == GradeCategory.TYPE_BEHAVIOUR_COMMENT
+ && it.categoryId == comments[0].asJsonObject.getLong("Id")
+ }?.text
+ } else null
+ } ?: ""
val valueFrom = value ?: category?.valueFrom ?: 0f
val valueTo = category?.valueTo ?: 0f
val gradeObject = Grade(
- profileId = profileId,
- id = id,
- name = name,
- type = TYPE_POINT_SUM,
- value = valueFrom,
- weight = -1f,
- color = color,
- category = categoryName,
- description = text ?: description.join(" - "),
- comment = if (text != null) description.join(" - ") else null,
- semester = semester,
- teacherId = teacherId,
- subjectId = 1,
- addedDate = addedDate
+ profileId,
+ id,
+ categoryName,
+ color,
+ description,
+ name,
+ valueFrom,
+ -1f,
+ semester,
+ teacherId,
+ 1
).apply {
+ type = Grade.TYPE_POINT_SUM
valueMax = valueTo
}
@@ -167,7 +145,8 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus,
Metadata.TYPE_GRADE,
id,
profile.empty,
- profile.empty
+ profile.empty,
+ addedDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiDescriptiveGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiDescriptiveGrades.kt
index 8cc4f1c1..413a9235 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiDescriptiveGrades.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiDescriptiveGrades.kt
@@ -10,8 +10,8 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
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_DESCRIPTIVE_TEXT
-import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_TEXT
+import pl.szczodrzynski.edziennik.data.db.entity.Grade.TYPE_DESCRIPTIVE_TEXT
+import pl.szczodrzynski.edziennik.data.db.entity.Grade.TYPE_TEXT
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
@@ -53,21 +53,20 @@ class LibrusApiDescriptiveGrades(override val data: DataLibrus,
val addedDate = Date.fromIso(grade.getString("AddDate") ?: return@forEach)
val gradeObject = Grade(
- profileId = profileId,
- id = id,
- name = " ",
- type = type,
- value = 0f,
- weight = 0f,
- color = category?.color ?: -1,
- category = category?.text,
- description = description,
- comment = null,
- semester = semester,
- teacherId = teacherId,
- subjectId = subjectId,
- addedDate = addedDate
- )
+ profileId,
+ id,
+ category?.text ?: "",
+ category?.color ?: -1,
+ description,
+ " ",
+ 0f,
+ 0f,
+ semester,
+ teacherId,
+ subjectId
+ ).apply {
+ this.type = type
+ }
data.gradeList.add(gradeObject)
data.metadataList.add(Metadata(
@@ -75,7 +74,8 @@ class LibrusApiDescriptiveGrades(override val data: DataLibrus,
Metadata.TYPE_GRADE,
id,
profile.empty,
- profile.empty
+ profile.empty,
+ addedDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiEvents.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiEvents.kt
index 7a76f88e..a04c2863 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiEvents.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiEvents.kt
@@ -35,7 +35,7 @@ class LibrusApiEvents(override val data: DataLibrus,
events?.forEach { event ->
val id = event.getLong("Id") ?: return@forEach
val eventDate = Date.fromY_m_d(event.getString("Date"))
- var topic = event.getString("Content")?.trim() ?: ""
+ val topic = event.getString("Content") ?: ""
val type = event.getJsonObject("Category")?.getLong("Id") ?: -1
val teacherId = event.getJsonObject("CreatedBy")?.getLong("Id") ?: -1
val subjectId = event.getJsonObject("Subject")?.getLong("Id") ?: -1
@@ -46,24 +46,18 @@ class LibrusApiEvents(override val data: DataLibrus,
val startTime = lessonRange?.startTime ?: Time.fromH_m(event.getString("TimeFrom"))
val addedDate = Date.fromIso(event.getString("AddDate"))
- event.getJsonObject("onlineLessonUrl")?.let { onlineLesson ->
- val text = onlineLesson.getString("text")?.let { "$it - " } ?: ""
- val url = onlineLesson.getString("url")
- topic += "\n\n$text$url"
- }
-
val eventObject = Event(
- profileId = profileId,
- id = id,
- date = eventDate,
- time = startTime,
- topic = topic,
- color = null,
- type = type,
- teacherId = teacherId,
- subjectId = subjectId,
- teamId = teamId,
- addedDate = addedDate
+ profileId,
+ id,
+ eventDate,
+ startTime,
+ topic,
+ -1,
+ type,
+ false,
+ teacherId,
+ subjectId,
+ teamId
)
data.eventList.add(eventObject)
@@ -73,7 +67,8 @@ class LibrusApiEvents(override val data: DataLibrus,
Metadata.TYPE_EVENT,
id,
profile?.empty ?: false,
- profile?.empty ?: false
+ profile?.empty ?: false,
+ addedDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiGrades.kt
index c2e2d0ce..95140988 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiGrades.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiGrades.kt
@@ -6,13 +6,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
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.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.Grade.Companion.TYPE_YEAR_FINAL
-import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_YEAR_PROPOSED
+import pl.szczodrzynski.edziennik.data.db.entity.Grade.*
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
@@ -60,29 +54,32 @@ class LibrusApiGrades(override val data: DataLibrus,
} ?: ""
val gradeObject = Grade(
- profileId = profileId,
- id = id,
- name = name,
- type = when {
- grade.getBoolean("IsConstituent") ?: false -> TYPE_NORMAL
- grade.getBoolean("IsSemester") ?: false -> if (semester == 1) TYPE_SEMESTER1_FINAL else TYPE_SEMESTER2_FINAL
- grade.getBoolean("IsSemesterProposition") ?: false -> if (semester == 1) TYPE_SEMESTER1_PROPOSED else TYPE_SEMESTER2_PROPOSED
- grade.getBoolean("IsFinal") ?: false -> TYPE_YEAR_FINAL
- grade.getBoolean("IsFinalProposition") ?: false -> TYPE_YEAR_PROPOSED
- else -> TYPE_NORMAL
- },
- value = value,
- weight = weight,
- color = category?.color ?: -1,
- category = category?.text ?: "",
- description = description,
- comment = null,
- semester = semester,
- teacherId = teacherId,
- subjectId = subjectId,
- addedDate = addedDate
+ profileId,
+ id,
+ category?.text ?: "",
+ category?.color ?: -1,
+ description,
+ name,
+ value,
+ weight,
+ semester,
+ teacherId,
+ subjectId
)
+ when {
+ grade.getBoolean("IsConstituent") ?: false ->
+ gradeObject.type = TYPE_NORMAL
+ grade.getBoolean("IsSemester") ?: false -> // semester final
+ gradeObject.type = if (gradeObject.semester == 1) TYPE_SEMESTER1_FINAL else TYPE_SEMESTER2_FINAL
+ grade.getBoolean("IsSemesterProposition") ?: false -> // semester proposed
+ gradeObject.type = if (gradeObject.semester == 1) TYPE_SEMESTER1_PROPOSED else TYPE_SEMESTER2_PROPOSED
+ grade.getBoolean("IsFinal") ?: false -> // year final
+ gradeObject.type = TYPE_YEAR_FINAL
+ grade.getBoolean("IsFinalProposition") ?: false -> // year final
+ gradeObject.type = TYPE_YEAR_PROPOSED
+ }
+
grade.getJsonObject("Improvement")?.also {
val historicalId = it.getLong("Id")
data.gradeList.firstOrNull { grade -> grade.id == historicalId }?.also { grade ->
@@ -99,7 +96,8 @@ class LibrusApiGrades(override val data: DataLibrus,
Metadata.TYPE_GRADE,
id,
profile.empty,
- profile.empty
+ profile.empty,
+ addedDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiHomework.kt
index c1183c19..16d66c6f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiHomework.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiHomework.kt
@@ -34,17 +34,17 @@ class LibrusApiHomework(override val data: DataLibrus,
val addedDate = Date.fromY_m_d(homework.getString("Date"))
val eventObject = Event(
- profileId = profileId,
- id = id,
- date = eventDate,
- time = null,
- topic = topic,
- color = null,
- type = -1,
- teacherId = teacherId,
- subjectId = -1,
- teamId = -1,
- addedDate = addedDate.inMillis
+ profileId,
+ id,
+ eventDate,
+ null,
+ topic,
+ -1,
+ -1,
+ false,
+ teacherId,
+ -1,
+ -1
)
data.eventList.add(eventObject)
@@ -53,7 +53,8 @@ class LibrusApiHomework(override val data: DataLibrus,
Metadata.TYPE_HOMEWORK,
id,
profile?.empty ?: false,
- profile?.empty ?: false
+ profile?.empty ?: false,
+ addedDate.inMillis
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiLuckyNumber.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiLuckyNumber.kt
index 80e6e299..5486d168 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiLuckyNumber.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiLuckyNumber.kt
@@ -4,12 +4,15 @@
package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api
-import pl.szczodrzynski.edziennik.*
+import pl.szczodrzynski.edziennik.DAY
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_LUCKY_NUMBER
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
+import pl.szczodrzynski.edziennik.getInt
+import pl.szczodrzynski.edziennik.getJsonObject
+import pl.szczodrzynski.edziennik.getString
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
@@ -33,15 +36,14 @@ class LibrusApiLuckyNumber(override val data: DataLibrus,
val luckyNumberDate = Date.fromY_m_d(luckyNumberEl.getString("LuckyNumberDay")) ?: Date.getToday()
val luckyNumber = luckyNumberEl.getInt("LuckyNumber") ?: -1
val luckyNumberObject = LuckyNumber(
- profileId = profileId,
- date = luckyNumberDate,
- number = luckyNumber
+ profileId,
+ luckyNumberDate,
+ luckyNumber
)
- if (luckyNumberDate >= Date.getToday())
+ //if (luckyNumberDate > Date.getToday()) {
nextSync = luckyNumberDate.combineWith(Time(15, 0, 0))
- else
- nextSync = System.currentTimeMillis() + 6*HOUR*1000
+ //}
data.luckyNumberList.add(luckyNumberObject)
data.metadataList.add(
@@ -50,7 +52,8 @@ class LibrusApiLuckyNumber(override val data: DataLibrus,
Metadata.TYPE_LUCKY_NUMBER,
luckyNumberObject.date.value.toLong(),
true,
- profile?.empty ?: false
+ profile?.empty ?: false,
+ System.currentTimeMillis()
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiNotices.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiNotices.kt
index ba531afe..e05cbfd7 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiNotices.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiNotices.kt
@@ -46,15 +46,12 @@ class LibrusApiNotices(override val data: DataLibrus,
val semester = profile?.dateToSemester(addedDate) ?: 1
val noticeObject = Notice(
- profileId = profileId,
- id = id,
- type = type,
- semester = semester,
- text = text,
- category = categoryText,
- points = null,
- teacherId = teacherId,
- addedDate = addedDate.inMillis
+ profileId,
+ id,
+ categoryText + "\n" + text,
+ semester,
+ type,
+ teacherId
)
data.noticeList.add(noticeObject)
@@ -64,7 +61,8 @@ class LibrusApiNotices(override val data: DataLibrus,
Metadata.TYPE_NOTICE,
id,
profile?.empty ?: false,
- profile?.empty ?: false
+ profile?.empty ?: false,
+ addedDate.inMillis
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPointGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPointGrades.kt
index 9da2c435..613e69ce 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPointGrades.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPointGrades.kt
@@ -10,7 +10,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
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_POINT_AVG
+import pl.szczodrzynski.edziennik.data.db.entity.Grade.TYPE_POINT_AVG
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
@@ -44,21 +44,19 @@ class LibrusApiPointGrades(override val data: DataLibrus,
val addedDate = Date.fromIso(grade.getString("AddDate") ?: return@forEach)
val gradeObject = Grade(
- profileId = profileId,
- id = id,
- name = name,
- type = TYPE_POINT_AVG,
- value = value,
- weight = category?.weight ?: 0f,
- color = category?.color ?: -1,
- category = category?.text ?: "",
- description = null,
- comment = null,
- semester = semester,
- teacherId = teacherId,
- subjectId = subjectId,
- addedDate = addedDate
+ profileId,
+ id,
+ category?.text ?: "",
+ category?.color ?: -1,
+ "",
+ name,
+ value,
+ category?.weight ?: 0f,
+ semester,
+ teacherId,
+ subjectId
).apply {
+ type = TYPE_POINT_AVG
valueMax = category?.valueTo ?: 0f
}
@@ -68,7 +66,8 @@ class LibrusApiPointGrades(override val data: DataLibrus,
Metadata.TYPE_GRADE,
id,
profile.empty,
- profile.empty
+ profile.empty,
+ addedDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPtMeetings.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPtMeetings.kt
index 6c0a9dd7..3a58d8e1 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPtMeetings.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPtMeetings.kt
@@ -39,16 +39,17 @@ class LibrusApiPtMeetings(override val data: DataLibrus,
}
val eventObject = Event(
- profileId = profileId,
- id = id,
- date = eventDate,
- time = startTime,
- topic = topic,
- color = null,
- type = Event.TYPE_PT_MEETING,
- teacherId = teacherId,
- subjectId = -1,
- teamId = data.teamClass?.id ?: -1
+ profileId,
+ id,
+ eventDate,
+ startTime,
+ topic,
+ -1,
+ Event.TYPE_PT_MEETING,
+ false,
+ teacherId,
+ -1,
+ data.teamClass?.id ?: -1
)
data.eventList.add(eventObject)
@@ -58,7 +59,8 @@ class LibrusApiPtMeetings(override val data: DataLibrus,
Metadata.TYPE_EVENT,
id,
profile?.empty ?: false,
- profile?.empty ?: false
+ profile?.empty ?: false,
+ System.currentTimeMillis()
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPushConfig.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPushConfig.kt
deleted file mode 100644
index 9073d03f..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiPushConfig.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-2-21.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api
-
-import pl.szczodrzynski.edziennik.JsonObject
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_PUSH_CONFIG
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
-import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
-import pl.szczodrzynski.edziennik.getInt
-import pl.szczodrzynski.edziennik.getJsonObject
-
-class LibrusApiPushConfig(override val data: DataLibrus,
- override val lastSync: Long?,
- val onSuccess: (endpointId: Int) -> Unit
-) : LibrusApi(data, lastSync) {
- companion object {
- const val TAG = "LibrusApiPushConfig"
- }
-
- init { data.app.config.sync.tokenLibrus?.also { tokenLibrus ->
- if(tokenLibrus.isEmpty()) {
- data.setSyncNext(ENDPOINT_LIBRUS_API_PUSH_CONFIG, SYNC_ALWAYS)
- data.app.config.sync.tokenLibrusList =
- data.app.config.sync.tokenLibrusList + profileId
- onSuccess(ENDPOINT_LIBRUS_API_PUSH_CONFIG)
- return@also
- }
-
- apiGet(TAG, "ChangeRegister", payload = JsonObject(
- "provider" to "FCM",
- "device" to tokenLibrus,
- "sendPush" to "1",
- "appVersion" to 4
- )) { json ->
- json.getJsonObject("ChangeRegister")?.getInt("Id")?.let { data.pushDeviceId = it }
-
- // sync always: this endpoint has .shouldSync set
- data.setSyncNext(ENDPOINT_LIBRUS_API_PUSH_CONFIG, SYNC_ALWAYS)
- data.app.config.sync.tokenLibrusList =
- data.app.config.sync.tokenLibrusList + profileId
- onSuccess(ENDPOINT_LIBRUS_API_PUSH_CONFIG)
- }
- } ?: onSuccess(ENDPOINT_LIBRUS_API_PUSH_CONFIG) }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTeacherFreeDays.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTeacherFreeDays.kt
index 973ada46..04c44efb 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTeacherFreeDays.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTeacherFreeDays.kt
@@ -43,15 +43,15 @@ class LibrusApiTeacherFreeDays(override val data: DataLibrus,
val timeTo = teacherAbsence.getString("TimeTo")?.let { Time.fromH_m_s(it) }
val teacherAbsenceObject = TeacherAbsence(
- profileId = profileId,
- id = id,
- type = type,
- name = name,
- dateFrom = dateFrom,
- dateTo = dateTo,
- timeFrom = timeFrom,
- timeTo = timeTo,
- teacherId = teacherId
+ profileId,
+ id,
+ teacherId,
+ type,
+ name,
+ dateFrom,
+ dateTo,
+ timeFrom,
+ timeTo
)
data.teacherAbsenceList.add(teacherAbsenceObject)
@@ -59,8 +59,9 @@ class LibrusApiTeacherFreeDays(override val data: DataLibrus,
profileId,
Metadata.TYPE_TEACHER_ABSENCE,
id,
- true,
- profile?.empty ?: false
+ profile?.empty ?: false,
+ profile?.empty ?: false,
+ System.currentTimeMillis()
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTemplate.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTemplate.kt
index 9fd6afee..b47215b9 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTemplate.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTemplate.kt
@@ -8,9 +8,8 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
class LibrusApiTemplate(override val data: DataLibrus,
- override val lastSync: Long?,
- val onSuccess: (endpointId: Int) -> Unit
-) : LibrusApi(data, lastSync) {
+ val onSuccess: () -> Unit
+) : LibrusApi(data, null) {
companion object {
const val TAG = "LibrusApi"
}
@@ -19,7 +18,7 @@ class LibrusApiTemplate(override val data: DataLibrus,
/*apiGet(TAG, "") { json ->
data.setSyncNext(ENDPOINT_LIBRUS_API_, SYNC_ALWAYS)
- onSuccess(ENDPOINT_LIBRUS_API_)
+ onSuccess()
}*/
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTextGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTextGrades.kt
index 7b7c8c6f..ec7e17bd 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTextGrades.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTextGrades.kt
@@ -10,7 +10,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
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_DESCRIPTIVE
+import pl.szczodrzynski.edziennik.data.db.entity.Grade.TYPE_DESCRIPTIVE
import pl.szczodrzynski.edziennik.data.db.entity.GradeCategory
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
@@ -48,21 +48,20 @@ class LibrusApiTextGrades(override val data: DataLibrus,
val addedDate = Date.fromIso(grade.getString("AddDate") ?: return@forEach)
val gradeObject = Grade(
- profileId = profileId,
- id = id,
- name = name,
- type = TYPE_DESCRIPTIVE,
- value = 0f,
- weight = 0f,
- color = category?.color ?: -1,
- category = category?.text ?: "",
- description = description,
- comment = grade.getString("Phrase") /* whatever it is */,
- semester = semester,
- teacherId = teacherId,
- subjectId = subjectId,
- addedDate = addedDate
- )
+ profileId,
+ id,
+ category?.text ?: "",
+ category?.color ?: -1,
+ description,
+ name,
+ 0f,
+ 0f,
+ semester,
+ teacherId,
+ subjectId
+ ).apply {
+ type = TYPE_DESCRIPTIVE
+ }
data.gradeList.add(gradeObject)
data.metadataList.add(Metadata(
@@ -70,7 +69,8 @@ class LibrusApiTextGrades(override val data: DataLibrus,
Metadata.TYPE_GRADE,
id,
profile.empty,
- profile.empty
+ profile.empty,
+ addedDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTimetables.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTimetables.kt
index 9a463a6b..7c1eec61 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTimetables.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiTimetables.kt
@@ -198,7 +198,8 @@ class LibrusApiTimetables(override val data: DataLibrus,
Metadata.TYPE_LESSON_CHANGE,
lessonObject.id,
seen,
- seen
+ seen,
+ System.currentTimeMillis()
))
}
data.lessonList.add(lessonObject)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetAttachment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetAttachment.kt
index b54e704b..f7234891 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetAttachment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetAttachment.kt
@@ -4,12 +4,22 @@
package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.messages
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.Job
+import kotlinx.coroutines.*
+import org.greenrobot.eventbus.EventBus
+import pl.szczodrzynski.edziennik.data.api.ERROR_FILE_DOWNLOAD
+import pl.szczodrzynski.edziennik.data.api.EXCEPTION_LIBRUS_MESSAGES_REQUEST
+import pl.szczodrzynski.edziennik.data.api.Regexes
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusMessages
+import pl.szczodrzynski.edziennik.data.api.events.AttachmentGetEvent
+import pl.szczodrzynski.edziennik.data.api.events.AttachmentGetEvent.Companion.TYPE_FINISHED
+import pl.szczodrzynski.edziennik.data.api.events.AttachmentGetEvent.Companion.TYPE_PROGRESS
+import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.db.entity.Message
+import pl.szczodrzynski.edziennik.get
+import pl.szczodrzynski.edziennik.getString
+import pl.szczodrzynski.edziennik.utils.Utils
+import java.io.File
import kotlin.coroutines.CoroutineContext
class LibrusMessagesGetAttachment(override val data: DataLibrus,
@@ -27,6 +37,8 @@ class LibrusMessagesGetAttachment(override val data: DataLibrus,
override val coroutineContext: CoroutineContext
get() = job + Dispatchers.Default
+ private var getAttachmentCheckKeyTries = 0
+
init {
messagesGet(TAG, "GetFileDownloadLink", parameters = mapOf(
"fileId" to attachmentId,
@@ -34,8 +46,81 @@ class LibrusMessagesGetAttachment(override val data: DataLibrus,
"archive" to 0
)) { doc ->
val downloadLink = doc.select("response GetFileDownloadLink downloadLink").text()
+ val keyMatcher = Regexes.LIBRUS_ATTACHMENT_KEY.find(downloadLink)
- LibrusSandboxDownloadAttachment(data, downloadLink, message, attachmentId, attachmentName, onSuccess)
+ if (keyMatcher != null) {
+ getAttachmentCheckKeyTries = 0
+
+ val attachmentKey = keyMatcher[1]
+ getAttachmentCheckKey(attachmentKey) {
+ downloadAttachment(attachmentKey)
+ }
+ } else {
+ data.error(ApiError(TAG, ERROR_FILE_DOWNLOAD)
+ .withApiResponse(doc.toString()))
+ }
+ }
+ }
+
+ private fun getAttachmentCheckKey(attachmentKey: String, callback: () -> Unit) {
+ sandboxGet(TAG, "CSCheckKey",
+ parameters = mapOf("singleUseKey" to attachmentKey)) { json ->
+
+ when (json.getString("status")) {
+ "not_downloaded_yet" -> {
+ if (getAttachmentCheckKeyTries++ > 5) {
+ data.error(ApiError(TAG, ERROR_FILE_DOWNLOAD)
+ .withApiResponse(json))
+ return@sandboxGet
+ }
+ launch {
+ delay(2000)
+ getAttachmentCheckKey(attachmentKey, callback)
+ }
+ }
+
+ "ready" -> {
+ launch { callback() }
+ }
+
+ else -> {
+ data.error(ApiError(TAG, EXCEPTION_LIBRUS_MESSAGES_REQUEST)
+ .withApiResponse(json))
+ }
+ }
+ }
+ }
+
+ private fun downloadAttachment(attachmentKey: String) {
+ val targetFile = File(Utils.getStorageDir(), attachmentName)
+
+ sandboxGetFile(TAG, "CSDownload&singleUseKey=$attachmentKey", targetFile, { file ->
+
+ val event = AttachmentGetEvent(
+ profileId,
+ message.id,
+ attachmentId,
+ TYPE_FINISHED,
+ file.absolutePath
+ )
+
+ val attachmentDataFile = File(Utils.getStorageDir(), ".${profileId}_${event.messageId}_${event.attachmentId}")
+ Utils.writeStringToFile(attachmentDataFile, event.fileName)
+
+ EventBus.getDefault().post(event)
+
+ onSuccess()
+
+ }) { written, _ ->
+ val event = AttachmentGetEvent(
+ profileId,
+ message.id,
+ attachmentId,
+ TYPE_PROGRESS,
+ bytesWritten = written
+ )
+
+ EventBus.getDefault().post(event)
}
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetList.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetList.kt
index 9f962bf9..8097ed86 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetList.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetList.kt
@@ -12,7 +12,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_MESS
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_MESSAGES_SENT
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusMessages
import pl.szczodrzynski.edziennik.data.db.entity.*
-import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_RECEIVED
+import pl.szczodrzynski.edziennik.data.db.entity.Message.TYPE_RECEIVED
import pl.szczodrzynski.edziennik.fixName
import pl.szczodrzynski.edziennik.singleOrNull
import pl.szczodrzynski.edziennik.utils.Utils
@@ -78,7 +78,7 @@ class LibrusMessagesGetList(override val data: DataLibrus,
val senderId = when (type) {
TYPE_RECEIVED -> recipientId
- else -> null
+ else -> -1
}
val receiverId = when (type) {
@@ -92,13 +92,13 @@ class LibrusMessagesGetList(override val data: DataLibrus,
}
val messageObject = Message(
- profileId = profileId,
- id = id,
- type = type,
- subject = subject,
- body = null,
- senderId = senderId,
- addedDate = sentDate
+ profileId,
+ id,
+ subject,
+ null,
+ type,
+ senderId,
+ -1
)
val messageRecipientObject = MessageRecipient(
@@ -109,19 +109,15 @@ class LibrusMessagesGetList(override val data: DataLibrus,
id
)
- element.select("isAnyFileAttached")?.text()?.let {
- if (it == "1")
- messageObject.hasAttachments = true
- }
-
- data.messageList.add(messageObject)
+ data.messageIgnoreList.add(messageObject)
data.messageRecipientList.add(messageRecipientObject)
- data.setSeenMetadataList.add(Metadata(
+ data.metadataList.add(Metadata(
profileId,
Metadata.TYPE_MESSAGE,
id,
notified,
- notified
+ notified,
+ sentDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetMessage.kt
index 49ee0d52..824fdc5e 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetMessage.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesGetMessage.kt
@@ -9,8 +9,8 @@ import org.greenrobot.eventbus.EventBus
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusMessages
import pl.szczodrzynski.edziennik.data.api.events.MessageGetEvent
-import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_RECEIVED
-import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_SENT
+import pl.szczodrzynski.edziennik.data.db.entity.Message.TYPE_RECEIVED
+import pl.szczodrzynski.edziennik.data.db.entity.Message.TYPE_SENT
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
@@ -102,10 +102,11 @@ class LibrusMessagesGetMessage(override val data: DataLibrus,
}
val messageRecipientObject = MessageRecipientFull(
- profileId = profileId,
- id = -1,
- messageId = messageObject.id,
- readDate = readDate
+ profileId,
+ -1,
+ -1,
+ readDate,
+ messageObject.id
)
messageRecipientObject.fullName = profile.accountName ?: profile.studentNameLong ?: ""
@@ -131,10 +132,11 @@ class LibrusMessagesGetMessage(override val data: DataLibrus,
}
val messageRecipientObject = MessageRecipientFull(
- profileId = profileId,
- id = receiverId,
- messageId = messageObject.id,
- readDate = readDate
+ profileId,
+ receiverId,
+ -1,
+ readDate,
+ messageObject.id
)
messageRecipientObject.fullName = "$receiverFirstName $receiverLastName"
@@ -150,15 +152,14 @@ class LibrusMessagesGetMessage(override val data: DataLibrus,
Metadata.TYPE_MESSAGE,
messageObject.id,
true,
- true
+ true,
+ messageObject.addedDate
))
}
messageObject.recipients = messageRecipientList
data.messageRecipientList.addAll(messageRecipientList)
-
data.messageList.add(messageObject)
- data.messageListReplace = true
EventBus.getDefault().postSticky(MessageGetEvent(messageObject))
onSuccess()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesSendMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesSendMessage.kt
index d568135e..02215dea 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesSendMessage.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusMessagesSendMessage.kt
@@ -48,9 +48,9 @@ class LibrusMessagesSendMessage(override val data: DataLibrus,
}
LibrusMessagesGetList(data, type = Message.TYPE_SENT, lastSync = null) {
- val message = data.messageList.firstOrNull { it.type == Message.TYPE_SENT && it.id == id }
+ val message = data.messageIgnoreList.firstOrNull { it.type == Message.TYPE_SENT && it.id == id }
val metadata = data.metadataList.firstOrNull { it.thingType == Metadata.TYPE_MESSAGE && it.thingId == message?.id }
- val event = MessageSentEvent(data.profileId, message, message?.addedDate)
+ val event = MessageSentEvent(data.profileId, message, metadata?.addedDate)
EventBus.getDefault().postSticky(event)
onSuccess()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusSandboxDownloadAttachment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusSandboxDownloadAttachment.kt
deleted file mode 100644
index 567071aa..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/messages/LibrusSandboxDownloadAttachment.kt
+++ /dev/null
@@ -1,117 +0,0 @@
-package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.messages
-
-import kotlinx.coroutines.*
-import org.greenrobot.eventbus.EventBus
-import pl.szczodrzynski.edziennik.data.api.*
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusMessages
-import pl.szczodrzynski.edziennik.data.api.events.AttachmentGetEvent
-import pl.szczodrzynski.edziennik.data.api.models.ApiError
-import pl.szczodrzynski.edziennik.get
-import pl.szczodrzynski.edziennik.getString
-import pl.szczodrzynski.edziennik.utils.Utils
-import java.io.File
-import kotlin.coroutines.CoroutineContext
-
-class LibrusSandboxDownloadAttachment(override val data: DataLibrus,
- downloadLink: String,
- val owner: Any,
- val attachmentId: Long,
- val attachmentName: String,
- val onSuccess: () -> Unit
-) : LibrusMessages(data, null), CoroutineScope {
- companion object {
- const val TAG = "LibrusSandboxDownloadAttachment"
- }
-
- private var job = Job()
-
- override val coroutineContext: CoroutineContext
- get() = job + Dispatchers.Default
-
- private var getAttachmentCheckKeyTries = 0
-
- init {
- val keyMatcher = Regexes.LIBRUS_ATTACHMENT_KEY.find(downloadLink)
-
- when {
- downloadLink.contains("CSDownloadFailed") -> {
- data.error(ApiError(TAG, ERROR_LIBRUS_MESSAGES_ATTACHMENT_NOT_FOUND))
- onSuccess()
- }
- keyMatcher != null -> {
- getAttachmentCheckKeyTries = 0
-
- val attachmentKey = keyMatcher[1]
- getAttachmentCheckKey(attachmentKey) {
- downloadAttachment("${LIBRUS_SANDBOX_URL}CSDownload&singleUseKey=$attachmentKey", method = POST)
- }
- }
- else -> {
- downloadAttachment("$downloadLink/get", method = GET)
- }
- }
- }
-
- private fun getAttachmentCheckKey(attachmentKey: String, callback: () -> Unit) {
- sandboxGet(TAG, "CSCheckKey",
- parameters = mapOf("singleUseKey" to attachmentKey)) { json ->
-
- when (json.getString("status")) {
- "not_downloaded_yet" -> {
- if (getAttachmentCheckKeyTries++ > 5) {
- data.error(ApiError(TAG, ERROR_FILE_DOWNLOAD)
- .withApiResponse(json))
- return@sandboxGet
- }
- launch {
- delay(2000)
- getAttachmentCheckKey(attachmentKey, callback)
- }
- }
-
- "ready" -> {
- launch { callback() }
- }
-
- else -> {
- data.error(ApiError(TAG, EXCEPTION_LIBRUS_MESSAGES_REQUEST)
- .withApiResponse(json))
- }
- }
- }
- }
-
- private fun downloadAttachment(url: String, method: Int = GET) {
- val targetFile = File(Utils.getStorageDir(), attachmentName)
-
- sandboxGetFile(TAG, url, targetFile, { file ->
-
- val event = AttachmentGetEvent(
- profileId,
- owner,
- attachmentId,
- AttachmentGetEvent.TYPE_FINISHED,
- file.absolutePath
- )
-
- val attachmentDataFile = File(Utils.getStorageDir(), ".${profileId}_${event.ownerId}_${event.attachmentId}")
- Utils.writeStringToFile(attachmentDataFile, event.fileName)
-
- EventBus.getDefault().postSticky(event)
-
- onSuccess()
-
- }) { written, _ ->
- val event = AttachmentGetEvent(
- profileId,
- owner,
- attachmentId,
- AttachmentGetEvent.TYPE_PROGRESS,
- bytesWritten = written
- )
-
- EventBus.getDefault().postSticky(event)
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaGetAttachment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaGetAttachment.kt
deleted file mode 100644
index 6b1f2eba..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaGetAttachment.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia
-
-import pl.szczodrzynski.edziennik.data.api.LIBRUS_SYNERGIA_MESSAGES_ATTACHMENT_URL
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusSynergia
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.messages.LibrusSandboxDownloadAttachment
-import pl.szczodrzynski.edziennik.data.db.entity.Message
-
-class LibrusSynergiaGetAttachment(override val data: DataLibrus,
- val message: Message,
- val attachmentId: Long,
- val attachmentName: String,
- val onSuccess: () -> Unit
-) : LibrusSynergia(data, null) {
- companion object {
- const val TAG = "LibrusSynergiaGetAttachment"
- }
-
- init {
- redirectUrlGet(TAG, "$LIBRUS_SYNERGIA_MESSAGES_ATTACHMENT_URL/${message.id}/$attachmentId") { url ->
- LibrusSandboxDownloadAttachment(data, url, message, attachmentId, attachmentName, onSuccess)
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaGetHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaGetHomework.kt
deleted file mode 100644
index 379bd42d..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaGetHomework.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia
-
-import android.text.Html
-import org.greenrobot.eventbus.EventBus
-import org.jsoup.Jsoup
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusSynergia
-import pl.szczodrzynski.edziennik.data.api.events.EventGetEvent
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
-
-class LibrusSynergiaGetHomework(override val data: DataLibrus,
- val event: EventFull,
- val onSuccess: () -> Unit
-) : LibrusSynergia(data, null) {
- companion object {
- const val TAG = "LibrusSynergiaGetHomework"
- }
-
- init {
- synergiaGet(TAG, "moje_zadania/podglad/${event.id}") { text ->
- val doc = Jsoup.parse(text)
-
- val table = doc.select("table.decorated tbody > tr")
-
- event.topic = table[1].select("td")[1].text()
- event.homeworkBody = Html.fromHtml(table[5].select("td")[1].html()).toString()
-
- event.attachmentIds = mutableListOf()
- event.attachmentNames = mutableListOf()
-
- if (table.size > 6) {
- table[6].select("a").forEach { a ->
- val attachmentId = a.attr("href").split('/')
- .last().toLongOrNull() ?: return@forEach
- val filename = a.text()
- event.attachmentIds?.add(attachmentId)
- event.attachmentNames?.add(filename)
- }
- }
-
- data.eventList.add(event)
- data.eventListReplace = true
-
- EventBus.getDefault().postSticky(EventGetEvent(event))
- onSuccess()
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaGetMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaGetMessage.kt
deleted file mode 100644
index 4cb1e246..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaGetMessage.kt
+++ /dev/null
@@ -1,160 +0,0 @@
-package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia
-
-import org.greenrobot.eventbus.EventBus
-import org.jsoup.Jsoup
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusSynergia
-import pl.szczodrzynski.edziennik.data.api.events.MessageGetEvent
-import pl.szczodrzynski.edziennik.data.db.entity.Message
-import pl.szczodrzynski.edziennik.data.db.entity.Metadata
-import pl.szczodrzynski.edziennik.data.db.entity.Teacher
-import pl.szczodrzynski.edziennik.data.db.full.MessageFull
-import pl.szczodrzynski.edziennik.data.db.full.MessageRecipientFull
-import pl.szczodrzynski.edziennik.get
-import pl.szczodrzynski.edziennik.isNotNullNorEmpty
-import pl.szczodrzynski.edziennik.singleOrNull
-import pl.szczodrzynski.edziennik.swapFirstLastName
-import pl.szczodrzynski.edziennik.utils.models.Date
-
-class LibrusSynergiaGetMessage(override val data: DataLibrus,
- private val messageObject: MessageFull,
- val onSuccess: () -> Unit) : LibrusSynergia(data, null) {
- companion object {
- const val TAG = "LibrusSynergiaGetMessage"
- }
-
- init {
- val endpoint = when (messageObject.type) {
- Message.TYPE_SENT -> "wiadomosci/1/6/${messageObject.id}/f0"
- else -> "wiadomosci/1/5/${messageObject.id}/f0"
- }
-
- data.profile?.also { profile ->
- synergiaGet(TAG, endpoint) { text ->
- val doc = Jsoup.parse(text)
-
- val messageElement = doc.select(".container-message tr")[0].child(1)
- val detailsElement = messageElement.child(1)
- val readElement = messageElement.children().last()
-
- val body = messageElement.select(".container-message-content").html()
-
- messageObject.apply {
- this.body = body
-
- clearAttachments()
- if (messageElement.children().size >= 5) {
- messageElement.child(3).select("tr").forEachIndexed { i, attachment ->
- if (i == 0) return@forEachIndexed // Skip the header
- val filename = attachment.child(0).text().trim()
- val attachmentId = "wiadomosci\\\\/pobierz_zalacznik\\\\/[0-9]+?\\\\/([0-9]+)\"".toRegex()
- .find(attachment.select("img").attr("onclick"))?.get(1)
- ?: return@forEachIndexed
- addAttachment(attachmentId.toLong(), filename, -1)
- }
- }
- }
-
- val messageRecipientList = mutableListOf()
-
- when (messageObject.type) {
- Message.TYPE_RECEIVED -> {
- val senderFullName = detailsElement.child(0).select(".left").text()
- val senderGroupName = "\\[(.+?)]".toRegex().find(senderFullName)?.get(1)?.trim()
-
- data.teacherList.singleOrNull { it.id == messageObject.senderId }?.apply {
- setTeacherType(when (senderGroupName) {
- /* https://api.librus.pl/2.0/Messages/Role */
- "Pomoc techniczna Librus", "SuperAdministrator" -> Teacher.TYPE_SUPER_ADMIN
- "Administrator szkoły" -> Teacher.TYPE_SCHOOL_ADMIN
- "Dyrektor Szkoły" -> Teacher.TYPE_PRINCIPAL
- "Nauczyciel" -> Teacher.TYPE_TEACHER
- "Rodzic", "Opiekun" -> Teacher.TYPE_PARENT
- "Sekretariat" -> Teacher.TYPE_SECRETARIAT
- "Uczeń" -> Teacher.TYPE_STUDENT
- "Pedagog/Psycholog szkolny" -> Teacher.TYPE_PEDAGOGUE
- "Pracownik biblioteki" -> Teacher.TYPE_LIBRARIAN
- "Inny specjalista" -> Teacher.TYPE_SPECIALIST
- "Jednostka Nadrzędna" -> {
- typeDescription = "Jednostka Nadrzędna"
- Teacher.TYPE_OTHER
- }
- "Jednostka Samorządu Terytorialnego" -> {
- typeDescription = "Jednostka Samorządu Terytorialnego"
- Teacher.TYPE_OTHER
- }
- else -> Teacher.TYPE_OTHER
- })
- }
-
- val readDateText = readElement.select(".left").text()
- val readDate = when (readDateText.isNotNullNorEmpty()) {
- true -> Date.fromIso(readDateText)
- else -> 0
- }
-
- val messageRecipientObject = MessageRecipientFull(
- profileId = profileId,
- id = -1,
- messageId = messageObject.id,
- readDate = readDate
- )
-
- messageRecipientObject.fullName = profile.accountName
- ?: profile.studentNameLong
-
- messageRecipientList.add(messageRecipientObject)
- }
-
- Message.TYPE_SENT -> {
-
- readElement.select("tr").forEachIndexed { i, receiver ->
- if (i == 0) return@forEachIndexed // Skip the header
-
- val receiverFullName = receiver.child(0).text()
- val receiverName = receiverFullName.split('(')[0].swapFirstLastName()
-
- val teacher = data.teacherList.singleOrNull { it.fullName == receiverName }
- val receiverId = teacher?.id ?: -1
-
- val readDate = when (val readDateText = receiver.child(1).text().trim()) {
- "NIE" -> 0
- else -> Date.fromIso(readDateText)
- }
-
- val messageRecipientObject = MessageRecipientFull(
- profileId = profileId,
- id = receiverId,
- messageId = messageObject.id,
- readDate = readDate
- )
-
- messageRecipientObject.fullName = receiverName
-
- messageRecipientList.add(messageRecipientObject)
- }
- }
- }
-
- if (!messageObject.seen) {
- data.setSeenMetadataList.add(Metadata(
- messageObject.profileId,
- Metadata.TYPE_MESSAGE,
- messageObject.id,
- true,
- true
- ))
- }
-
- messageObject.recipients = messageRecipientList
- data.messageRecipientList.addAll(messageRecipientList)
-
- data.messageList.add(messageObject)
- data.messageListReplace = true
-
- EventBus.getDefault().postSticky(MessageGetEvent(messageObject))
- onSuccess()
- }
- } ?: onSuccess()
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaGetMessages.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaGetMessages.kt
deleted file mode 100644
index ffc8133a..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaGetMessages.kt
+++ /dev/null
@@ -1,116 +0,0 @@
-package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia
-
-import org.jsoup.Jsoup
-import pl.szczodrzynski.edziennik.*
-import pl.szczodrzynski.edziennik.data.api.ERROR_NOT_IMPLEMENTED
-import pl.szczodrzynski.edziennik.data.api.Regexes
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.*
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusSynergia
-import pl.szczodrzynski.edziennik.data.db.entity.*
-import pl.szczodrzynski.edziennik.utils.Utils
-import pl.szczodrzynski.edziennik.utils.models.Date
-
-class LibrusSynergiaGetMessages(override val data: DataLibrus,
- override val lastSync: Long?,
- private val type: Int = Message.TYPE_RECEIVED,
- archived: Boolean = false,
- val onSuccess: (Int) -> Unit) : LibrusSynergia(data, lastSync) {
- companion object {
- const val TAG = "LibrusSynergiaGetMessages"
- }
-
- init {
- val endpoint = when (type) {
- Message.TYPE_RECEIVED -> "wiadomosci/5"
- Message.TYPE_SENT -> "wiadomosci/6"
- else -> null
- }
- val endpointId = when (type) {
- Message.TYPE_RECEIVED -> ENDPOINT_LIBRUS_SYNERGIA_MESSAGES_RECEIVED
- else -> ENDPOINT_LIBRUS_SYNERGIA_MESSAGES_SENT
- }
-
- if (endpoint != null) {
- synergiaGet(TAG, endpoint) { text ->
- val doc = Jsoup.parse(text)
-
- fun getRecipientId(name: String): Long = data.teacherList.singleOrNull {
- it.fullNameLastFirst == name
- }?.id ?: {
- val teacherObject = Teacher(
- profileId,
- -1 * Utils.crc16(name.swapFirstLastName().toByteArray()).toLong(),
- name.splitName()?.second!!,
- name.splitName()?.first!!
- )
- data.teacherList.put(teacherObject.id, teacherObject)
- teacherObject.id
- }.invoke()
-
- doc.select(".decorated.stretch tbody > tr").forEach { messageElement ->
- val url = messageElement.select("a").first().attr("href")
- val id = Regexes.LIBRUS_MESSAGE_ID.find(url)?.get(1)?.toLong() ?: return@forEach
- val subject = messageElement.child(3).text()
- val sentDate = Date.fromIso(messageElement.child(4).text())
- val recipientName = messageElement.child(2).text().split('(')[0].fixName()
- val recipientId = getRecipientId(recipientName)
- val read = messageElement.child(2).attr("style").isNullOrBlank()
-
- val senderId = when (type) {
- Message.TYPE_RECEIVED -> recipientId
- else -> null
- }
-
- val receiverId = when (type) {
- Message.TYPE_RECEIVED -> -1
- else -> recipientId
- }
-
- val notified = when (type) {
- Message.TYPE_SENT -> true
- else -> read || profile?.empty ?: false
- }
-
- val messageObject = Message(
- profileId = profileId,
- id = id,
- type = type,
- subject = subject,
- body = null,
- senderId = senderId,
- addedDate = sentDate
- )
-
- val messageRecipientObject = MessageRecipient(
- profileId,
- receiverId,
- -1,
- if (read) 1 else 0,
- id
- )
-
- messageObject.hasAttachments = !messageElement.child(1).select("img").isEmpty()
-
- data.messageList.add(messageObject)
- data.messageRecipientList.add(messageRecipientObject)
- data.setSeenMetadataList.add(Metadata(
- profileId,
- Metadata.TYPE_MESSAGE,
- id,
- notified,
- notified
- ))
- }
-
- when (type) {
- Message.TYPE_RECEIVED -> data.setSyncNext(ENDPOINT_LIBRUS_MESSAGES_RECEIVED, SYNC_ALWAYS)
- Message.TYPE_SENT -> data.setSyncNext(ENDPOINT_LIBRUS_MESSAGES_SENT, DAY, MainActivity.DRAWER_ITEM_MESSAGES)
- }
- onSuccess(endpointId)
- }
- } else {
- data.error(TAG, ERROR_NOT_IMPLEMENTED)
- onSuccess(endpointId)
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaHomework.kt
index d33f6911..4a9aa470 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaHomework.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaHomework.kt
@@ -29,7 +29,7 @@ class LibrusSynergiaHomework(override val data: DataLibrus,
init { data.profile?.also { profile ->
synergiaGet(TAG, "moje_zadania", method = POST, parameters = mapOf(
"dataOd" to
- if (profile.empty)
+ if (!data.profile.empty)
profile.getSemesterStart(1).stringY_m_d
else
Date.getToday().stringY_m_d,
@@ -42,6 +42,8 @@ class LibrusSynergiaHomework(override val data: DataLibrus,
doc.select("table.myHomeworkTable > tbody").firstOrNull()?.also { homeworkTable ->
val homeworkElements = homeworkTable.children()
+ val graphElements = doc.select("table[border].center td[align=left] tbody").first().children()
+
homeworkElements.forEachIndexed { i, el ->
val elements = el.children()
@@ -52,32 +54,37 @@ class LibrusSynergiaHomework(override val data: DataLibrus,
val teacherId = data.teacherList.singleOrNull { teacherName == it.fullName }?.id
?: -1
val topic = elements[2].text().trim()
- val addedDate = Date.fromY_m_d(elements[4].text().trim())
+ val addedDate = Date.fromY_m_d(elements[4].text().trim()).inMillis
val eventDate = Date.fromY_m_d(elements[6].text().trim())
val id = "/podglad/([0-9]+)'".toRegex().find(
elements[9].select("input").attr("onclick")
)?.get(1)?.toLong() ?: return@forEachIndexed
- val lessons = data.db.timetableDao().getAllForDateNow(profileId, eventDate)
+ val lessons = data.db.timetableDao().getForDateNow(profileId, eventDate)
val startTime = lessons.firstOrNull { it.subjectId == subjectId }?.startTime
+ val moreInfo = graphElements[2 * i + 1].select("td[title]")
+ .attr("title").trim()
+ val description = "Treść: (.*)".toRegex(RegexOption.DOT_MATCHES_ALL).find(moreInfo)
+ ?.get(1)?.replace("".toRegex(), "\n")?.trim()
+
val seen = when (profile.empty) {
true -> true
else -> eventDate < Date.getToday()
}
val eventObject = Event(
- profileId = profileId,
- id = id,
- date = eventDate,
- time = startTime,
- topic = topic,
- color = null,
- type = Event.TYPE_HOMEWORK,
- teacherId = teacherId,
- subjectId = subjectId,
- teamId = data.teamClass?.id ?: -1,
- addedDate = addedDate.inMillis
+ profileId,
+ id,
+ eventDate,
+ startTime,
+ "$topic\n$description",
+ -1,
+ Event.TYPE_HOMEWORK,
+ false,
+ teacherId,
+ subjectId,
+ data.teamClass?.id ?: -1
)
data.eventList.add(eventObject)
@@ -86,7 +93,8 @@ class LibrusSynergiaHomework(override val data: DataLibrus,
Metadata.TYPE_HOMEWORK,
id,
seen,
- seen
+ seen,
+ addedDate
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaHomeworkGetAttachment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaHomeworkGetAttachment.kt
deleted file mode 100644
index a6d4b94b..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/synergia/LibrusSynergiaHomeworkGetAttachment.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia
-
-import pl.szczodrzynski.edziennik.data.api.LIBRUS_SYNERGIA_HOMEWORK_ATTACHMENT_URL
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusSynergia
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.messages.LibrusSandboxDownloadAttachment
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
-
-class LibrusSynergiaHomeworkGetAttachment(
- override val data: DataLibrus,
- val event: EventFull,
- val attachmentId: Long,
- val attachmentName: String,
- val onSuccess: () -> Unit
-) : LibrusSynergia(data, null) {
- companion object {
- const val TAG = "LibrusSynergiaHomeworkGetAttachment"
- }
-
- init {
- redirectUrlGet(TAG, "$LIBRUS_SYNERGIA_HOMEWORK_ATTACHMENT_URL/$attachmentId") { url ->
- LibrusSandboxDownloadAttachment(data, url, event, attachmentId, attachmentName, onSuccess)
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/firstlogin/LibrusFirstLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/firstlogin/LibrusFirstLogin.kt
index 68f44269..f834f54f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/firstlogin/LibrusFirstLogin.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/firstlogin/LibrusFirstLogin.kt
@@ -33,7 +33,7 @@ class LibrusFirstLogin(val data: DataLibrus, val onSuccess: () -> Unit) {
val accounts = json.getJsonArray("accounts")
if (accounts == null || accounts.size() < 1) {
- EventBus.getDefault().postSticky(FirstLoginFinishedEvent(listOf(), data.loginStore))
+ EventBus.getDefault().post(FirstLoginFinishedEvent(listOf(), data.loginStore))
onSuccess()
return@portalGet
}
@@ -54,8 +54,6 @@ class LibrusFirstLogin(val data: DataLibrus, val onSuccess: () -> Unit) {
return@portalGet
}
- val isParent = account.getString("group") == "parent"
-
val id = account.getInt("id") ?: continue
val login = account.getString("login") ?: continue
val token = account.getString("accessToken") ?: continue
@@ -71,7 +69,7 @@ class LibrusFirstLogin(val data: DataLibrus, val onSuccess: () -> Unit) {
data.portalEmail,
studentNameLong,
studentNameShort,
- if (isParent) studentNameLong else null /* temporarily - there is no parent name provided, only the type */
+ null
).apply {
studentData["accountId"] = id
studentData["accountLogin"] = login
@@ -81,7 +79,7 @@ class LibrusFirstLogin(val data: DataLibrus, val onSuccess: () -> Unit) {
profileList.add(profile)
}
- EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore))
+ EventBus.getDefault().post(FirstLoginFinishedEvent(profileList, data.loginStore))
onSuccess()
}
}
@@ -116,15 +114,14 @@ class LibrusFirstLogin(val data: DataLibrus, val onSuccess: () -> Unit) {
).apply {
studentData["isPremium"] = account?.getBoolean("IsPremium") == true || account?.getBoolean("IsPremiumDemo") == true
studentData["accountId"] = account.getInt("Id") ?: 0
- studentData["accountLogin"] = data.apiLogin ?: login
- studentData["accountPassword"] = data.apiPassword
+ studentData["accountLogin"] = login
studentData["accountToken"] = data.apiAccessToken
studentData["accountTokenTime"] = data.apiTokenExpiryTime
studentData["accountRefreshToken"] = data.apiRefreshToken
}
profileList.add(profile)
- EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore))
+ EventBus.getDefault().post(FirstLoginFinishedEvent(profileList, data.loginStore))
onSuccess()
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginApi.kt
index 7151cf29..0f843a88 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginApi.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginApi.kt
@@ -18,7 +18,6 @@ import pl.szczodrzynski.edziennik.getUnixDate
import pl.szczodrzynski.edziennik.utils.Utils.d
import java.net.HttpURLConnection.*
-@Suppress("ConvertSecondaryConstructorToPrimary")
class LibrusLoginApi {
companion object {
private const val TAG = "LoginLibrusApi"
@@ -138,7 +137,6 @@ class LibrusLoginApi {
"librus_change_password_error" -> ERROR_LOGIN_LIBRUS_API_CHANGE_PASSWORD_ERROR
"librus_password_change_required" -> ERROR_LOGIN_LIBRUS_API_PASSWORD_CHANGE_REQUIRED
"invalid_grant" -> ERROR_LOGIN_LIBRUS_API_INVALID_LOGIN
- "invalid_request" -> ERROR_LOGIN_LIBRUS_API_INVALID_REQUEST
else -> ERROR_LOGIN_LIBRUS_API_OTHER
}.let { errorCode ->
data.error(ApiError(TAG, errorCode)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginMessages.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginMessages.kt
index 9bfad99f..9767683b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginMessages.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginMessages.kt
@@ -8,9 +8,9 @@ import im.wangchao.mhttp.Request
import im.wangchao.mhttp.Response
import im.wangchao.mhttp.body.MediaTypeUtils
import im.wangchao.mhttp.callback.TextCallbackHandler
+import okhttp3.Cookie
import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
-import pl.szczodrzynski.edziennik.data.api.edziennik.librus.LibrusRecaptchaHelper
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.getUnixDate
import pl.szczodrzynski.edziennik.utils.Utils.d
@@ -36,39 +36,17 @@ class LibrusLoginMessages(val data: DataLibrus, val onSuccess: () -> Unit) {
onSuccess()
}
- text?.contains("grecaptcha.ready") == true -> {
- val url = response?.request()?.url()?.toString() ?: run {
- //data.error(TAG, ERROR_LIBRUS_MESSAGES_OTHER, response, text)
- data.messagesLoginSuccessful = false
- onSuccess()
- return
- }
-
- LibrusRecaptchaHelper(data.app, url, text, onSuccess = { newUrl ->
- loginWithSynergia(newUrl)
- }, onTimeout = {
- //data.error(TAG, ERROR_LOGIN_LIBRUS_MESSAGES_TIMEOUT, response, text)
- data.messagesLoginSuccessful = false
- onSuccess()
- })
- }
-
text?.contains("ok") == true -> {
saveSessionId(response, text)
onSuccess()
}
text?.contains("Niepoprawny login i/lub hasło.") == true -> data.error(TAG, ERROR_LOGIN_LIBRUS_MESSAGES_INVALID_LOGIN, response, text)
text?.contains("stop.png") == true -> data.error(TAG, ERROR_LIBRUS_SYNERGIA_ACCESS_DENIED, response, text)
- text?.contains("eAccessDeny") == true -> {
- // data.error(TAG, ERROR_LIBRUS_MESSAGES_ACCESS_DENIED, response, text)
- data.messagesLoginSuccessful = false
- onSuccess()
- }
+ text?.contains("eAccessDeny") == true -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ACCESS_DENIED, response, text)
text?.contains("OffLine") == true -> data.error(TAG, ERROR_LIBRUS_MESSAGES_MAINTENANCE, response, text)
text?.contains("error") == true -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ERROR, response, text)
text?.contains("eVarWhitThisNameNotExists") == true -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ACCESS_DENIED, response, text)
text?.contains("") == true -> data.error(TAG, ERROR_LIBRUS_MESSAGES_OTHER, response, text)
- else -> data.error(TAG, ERROR_LIBRUS_MESSAGES_OTHER, response, text)
}
}
@@ -86,15 +64,21 @@ class LibrusLoginMessages(val data: DataLibrus, val onSuccess: () -> Unit) {
}
if (data.isMessagesLoginValid()) {
- data.app.cookieJar.set("wiadomosci.librus.pl", "DZIENNIKSID", data.messagesSessionId)
+ data.app.cookieJar.saveFromResponse(null, listOf(
+ Cookie.Builder()
+ .name("DZIENNIKSID")
+ .value(data.messagesSessionId!!)
+ .domain("wiadomosci.librus.pl")
+ .secure().httpOnly().build()
+ ))
onSuccess()
}
else {
- data.app.cookieJar.clear("wiadomosci.librus.pl")
+ data.app.cookieJar.clearForDomain("wiadomosci.librus.pl")
if (data.loginMethods.contains(LOGIN_METHOD_LIBRUS_SYNERGIA)) {
loginWithSynergia()
}
- else if (data.apiLogin != null && data.apiPassword != null && false) {
+ else if (data.apiLogin != null && data.apiPassword != null) {
loginWithCredentials()
}
else {
@@ -164,7 +148,7 @@ class LibrusLoginMessages(val data: DataLibrus, val onSuccess: () -> Unit) {
}
private fun saveSessionId(response: Response?, text: String?) {
- var sessionId = data.app.cookieJar.get("wiadomosci.librus.pl", "DZIENNIKSID")
+ var sessionId = data.app.cookieJar.getCookie("wiadomosci.librus.pl", "DZIENNIKSID")
sessionId = sessionId?.replace("-MAINT", "") // dunno what's this
sessionId = sessionId?.replace("MAINT", "") // dunno what's this
if (sessionId == null) {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginPortal.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginPortal.kt
index f164e3ed..68be8b72 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginPortal.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginPortal.kt
@@ -12,7 +12,7 @@ import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.utils.Utils.d
-import java.net.HttpURLConnection.*
+import java.net.HttpURLConnection.HTTP_UNAUTHORIZED
import java.util.*
import java.util.regex.Pattern
@@ -37,19 +37,19 @@ class LibrusLoginPortal(val data: DataLibrus, val onSuccess: () -> Unit) {
}
else if (data.portalRefreshToken != null) {
if (data.fakeLogin) {
- data.app.cookieJar.clear("librus.szkolny.eu")
+ data.app.cookieJar.clearForDomain("librus.szkolny.eu")
}
else {
- data.app.cookieJar.clear("portal.librus.pl")
+ data.app.cookieJar.clearForDomain("portal.librus.pl")
}
accessToken(null, data.portalRefreshToken)
}
else {
if (data.fakeLogin) {
- data.app.cookieJar.clear("librus.szkolny.eu")
+ data.app.cookieJar.clearForDomain("librus.szkolny.eu")
}
else {
- data.app.cookieJar.clear("portal.librus.pl")
+ data.app.cookieJar.clearForDomain("portal.librus.pl")
}
authorize(if (data.fakeLogin) FAKE_LIBRUS_AUTHORIZE else LIBRUS_AUTHORIZE_URL)
}
@@ -63,31 +63,23 @@ class LibrusLoginPortal(val data: DataLibrus, val onSuccess: () -> Unit) {
.userAgent(LIBRUS_USER_AGENT)
.withClient(data.app.httpLazy)
.callback(object : TextCallbackHandler() {
- override fun onSuccess(text: String, response: Response) {
+ override fun onSuccess(json: String, response: Response) {
val location = response.headers().get("Location")
if (location != null) {
- val authMatcher = Pattern.compile("$LIBRUS_REDIRECT_URL\\?code=([A-z0-9]+?)$", Pattern.DOTALL or Pattern.MULTILINE).matcher(location)
- when {
- authMatcher.find() -> {
- accessToken(authMatcher.group(1), null)
- }
- location.contains("rejected_client") -> {
- data.error(ApiError(TAG, ERROR_LOGIN_LIBRUS_PORTAL_INVALID_CLIENT_ID)
- .withResponse(response)
- .withApiResponse("Location: $location\n$text"))
- }
- else -> {
- authorize(location)
- }
+ val authMatcher = Pattern.compile("http://localhost/bar\\?code=([A-z0-9]+?)$", Pattern.DOTALL or Pattern.MULTILINE).matcher(location)
+ if (authMatcher.find()) {
+ accessToken(authMatcher.group(1), null)
+ } else {
+ authorize(location)
}
} else {
- val csrfMatcher = Pattern.compile("name=\"csrf-token\" content=\"([A-z0-9=+/\\-_]+?)\"", Pattern.DOTALL).matcher(text)
+ val csrfMatcher = Pattern.compile("name=\"csrf-token\" content=\"([A-z0-9=+/\\-_]+?)\"", Pattern.DOTALL).matcher(json)
if (csrfMatcher.find()) {
login(csrfMatcher.group(1))
} else {
data.error(ApiError(TAG, ERROR_LOGIN_LIBRUS_PORTAL_CSRF_MISSING)
.withResponse(response)
- .withApiResponse(text))
+ .withApiResponse(json))
}
}
}
@@ -120,14 +112,12 @@ class LibrusLoginPortal(val data: DataLibrus, val onSuccess: () -> Unit) {
it.addParameter("g-recaptcha-response", recaptchaCode)
}
.addHeader("X-CSRF-TOKEN", csrfToken)
- .allowErrorCode(HTTP_BAD_REQUEST)
- .allowErrorCode(HTTP_FORBIDDEN)
.contentType(MediaTypeUtils.APPLICATION_JSON)
.post()
.callback(object : JsonCallbackHandler() {
override fun onSuccess(json: JsonObject?, response: Response) {
val location = response.headers()?.get("Location")
- if (location == "$LIBRUS_REDIRECT_URL?command=close") {
+ if (location == "http://localhost/bar?command=close") {
data.error(ApiError(TAG, ERROR_LIBRUS_PORTAL_MAINTENANCE)
.withApiResponse(json)
.withResponse(response))
@@ -144,34 +134,28 @@ class LibrusLoginPortal(val data: DataLibrus, val onSuccess: () -> Unit) {
.withResponse(response))
return
}
- val error = if (response.code() == 200) null else
- json.getJsonArray("errors")?.getString(0)
- ?: json.getJsonObject("errors")?.entrySet()?.firstOrNull()?.value?.asString
- error?.let { code ->
- when {
- code.contains("Sesja logowania wygasła") -> ERROR_LOGIN_LIBRUS_PORTAL_CSRF_EXPIRED
- code.contains("Upewnij się, że nie") -> ERROR_LOGIN_LIBRUS_PORTAL_INVALID_LOGIN
- // this doesn't work anyway: `errors` is an object with `g-recaptcha-response` set
- code.contains("robotem") -> ERROR_CAPTCHA_LIBRUS_PORTAL
- code.contains("Podany adres e-mail jest nieprawidłowy.") -> ERROR_LOGIN_LIBRUS_PORTAL_INVALID_LOGIN
- else -> ERROR_LOGIN_LIBRUS_PORTAL_ACTION_ERROR
- }.let { errorCode ->
- data.error(ApiError(TAG, errorCode)
- .withApiResponse(json)
- .withResponse(response))
- return
- }
- }
if (json.getBoolean("captchaRequired") == true) {
data.error(ApiError(TAG, ERROR_CAPTCHA_LIBRUS_PORTAL)
.withResponse(response)
.withApiResponse(json))
return
}
+ if (json.get("errors") != null) {
+ data.error(ApiError(TAG, ERROR_LOGIN_LIBRUS_PORTAL_ACTION_ERROR)
+ .withResponse(response)
+ .withApiResponse(json))
+ return
+ }
authorize(json.getString("redirect", LIBRUS_AUTHORIZE_URL))
}
override fun onFailure(response: Response, throwable: Throwable) {
+ if (response.code() == 403 || response.code() == 401) {
+ data.error(ApiError(TAG, ERROR_LOGIN_LIBRUS_PORTAL_INVALID_LOGIN)
+ .withResponse(response)
+ .withThrowable(throwable))
+ return
+ }
data.error(ApiError(TAG, ERROR_REQUEST_FAILURE)
.withResponse(response)
.withThrowable(throwable))
@@ -181,6 +165,7 @@ class LibrusLoginPortal(val data: DataLibrus, val onSuccess: () -> Unit) {
.enqueue()
}
+ private var refreshTokenFailed = false
private fun accessToken(code: String?, refreshToken: String?) {
d(TAG, "Request: Librus/Login/Portal - ${if (data.fakeLogin) FAKE_LIBRUS_TOKEN else LIBRUS_TOKEN_URL}")
@@ -198,7 +183,7 @@ class LibrusLoginPortal(val data: DataLibrus, val onSuccess: () -> Unit) {
return
}
val error = if (response?.code() == 200) null else
- json.getString("hint") ?: json.getString("error")
+ json.getString("hint")
error?.let { code ->
when (code) {
"Authorization code has expired" -> ERROR_LOGIN_LIBRUS_PORTAL_CODE_EXPIRED
@@ -209,9 +194,11 @@ class LibrusLoginPortal(val data: DataLibrus, val onSuccess: () -> Unit) {
"Check the `code` parameter" -> ERROR_LOGIN_LIBRUS_PORTAL_NO_CODE
"Check the `refresh_token` parameter" -> ERROR_LOGIN_LIBRUS_PORTAL_NO_REFRESH
"Check the `redirect_uri` parameter" -> ERROR_LOGIN_LIBRUS_PORTAL_NO_REDIRECT
- "unsupported_grant_type" -> ERROR_LOGIN_LIBRUS_PORTAL_UNSUPPORTED_GRANT
- "invalid_client" -> ERROR_LOGIN_LIBRUS_PORTAL_INVALID_CLIENT_ID
- else -> ERROR_LOGIN_LIBRUS_PORTAL_OTHER
+ else -> when (json.getString("error")) {
+ "unsupported_grant_type" -> ERROR_LOGIN_LIBRUS_PORTAL_UNSUPPORTED_GRANT
+ "invalid_client" -> ERROR_LOGIN_LIBRUS_PORTAL_INVALID_CLIENT_ID
+ else -> ERROR_LOGIN_LIBRUS_PORTAL_OTHER
+ }
}.let { errorCode ->
data.error(ApiError(TAG, errorCode)
.withApiResponse(json)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginSynergia.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginSynergia.kt
index 4a292cfe..00883ddb 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginSynergia.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginSynergia.kt
@@ -8,6 +8,7 @@ import com.google.gson.JsonObject
import im.wangchao.mhttp.Request
import im.wangchao.mhttp.Response
import im.wangchao.mhttp.callback.TextCallbackHandler
+import okhttp3.Cookie
import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
@@ -29,11 +30,17 @@ class LibrusLoginSynergia(override val data: DataLibrus, val onSuccess: () -> Un
}
if (data.isSynergiaLoginValid()) {
- data.app.cookieJar.set("synergia.librus.pl", "DZIENNIKSID", data.synergiaSessionId)
+ data.app.cookieJar.saveFromResponse(null, listOf(
+ Cookie.Builder()
+ .name("DZIENNIKSID")
+ .value(data.synergiaSessionId!!)
+ .domain("synergia.librus.pl")
+ .secure().httpOnly().build()
+ ))
onSuccess()
}
else {
- data.app.cookieJar.clear("synergia.librus.pl")
+ data.app.cookieJar.clearForDomain("synergia.librus.pl")
if (data.loginMethods.contains(LOGIN_METHOD_LIBRUS_API)) {
loginWithApi()
}
@@ -85,7 +92,7 @@ class LibrusLoginSynergia(override val data: DataLibrus, val onSuccess: () -> Un
}
if (location?.endsWith("centrum_powiadomien") == true) {
- val sessionId = data.app.cookieJar.get("synergia.librus.pl", "DZIENNIKSID")
+ val sessionId = data.app.cookieJar.getCookie("synergia.librus.pl", "DZIENNIKSID")
if (sessionId == null) {
data.error(ApiError(TAG, ERROR_LOGIN_LIBRUS_SYNERGIA_NO_SESSION_ID)
.withResponse(response)
@@ -110,7 +117,7 @@ class LibrusLoginSynergia(override val data: DataLibrus, val onSuccess: () -> Un
}
}
- data.app.cookieJar.clear("synergia.librus.pl")
+ data.app.cookieJar.clearForDomain("synergia.librus.pl")
Request.builder()
.url(LIBRUS_SYNERGIA_TOKEN_LOGIN_URL.replace("TOKEN", token) + "/uczen/widok/centrum_powiadomien")
.userAgent(LIBRUS_USER_AGENT)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt
index 0e002576..b805ea6a 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt
@@ -8,17 +8,20 @@ import com.google.gson.JsonObject
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikData
-import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web.*
+import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web.MobidziennikWebGetAttachment
+import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web.MobidziennikWebGetMessage
+import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web.MobidziennikWebGetRecipientList
+import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web.MobidziennikWebSendMessage
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.firstlogin.MobidziennikFirstLogin
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.login.MobidziennikLogin
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
+import pl.szczodrzynski.edziennik.data.db.entity.Message
import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
import pl.szczodrzynski.edziennik.utils.Utils.d
@@ -53,9 +56,9 @@ class Mobidziennik(val app: App, val profile: Profile?, val loginStore: LoginSto
|_| |_| |_|\___| /_/ \_\_|\__, |\___/|_| |_|\__|_| |_|_| |_| |_|
__/ |
|__*/
- override fun sync(featureIds: List, viewId: Int?, onlyEndpoints: List?, arguments: JsonObject?) {
+ override fun sync(featureIds: List, viewId: Int?, arguments: JsonObject?) {
data.arguments = arguments
- data.prepare(mobidziennikLoginMethods, MobidziennikFeatures, featureIds, viewId, onlyEndpoints)
+ data.prepare(mobidziennikLoginMethods, MobidziennikFeatures, featureIds, viewId)
login()
}
@@ -102,9 +105,9 @@ class Mobidziennik(val app: App, val profile: Profile?, val loginStore: LoginSto
override fun markAllAnnouncementsAsRead() {}
override fun getAnnouncement(announcement: AnnouncementFull) {}
- override fun getAttachment(owner: Any, attachmentId: Long, attachmentName: String) {
+ override fun getAttachment(message: Message, attachmentId: Long, attachmentName: String) {
login(LOGIN_METHOD_MOBIDZIENNIK_WEB) {
- MobidziennikWebGetAttachment(data, owner, attachmentId, attachmentName) {
+ MobidziennikWebGetAttachment(data, message, attachmentId, attachmentName) {
completed()
}
}
@@ -118,14 +121,6 @@ class Mobidziennik(val app: App, val profile: Profile?, val loginStore: LoginSto
}
}
- override fun getEvent(eventFull: EventFull) {
- login(LOGIN_METHOD_MOBIDZIENNIK_WEB) {
- MobidziennikWebGetHomework(data, eventFull) {
- completed()
- }
- }
- }
-
override fun firstLogin() { MobidziennikFirstLogin(data) { completed() } }
override fun cancel() {
d(TAG, "Cancelled")
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/MobidziennikFeatures.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/MobidziennikFeatures.kt
index 7396ac52..d056fc4b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/MobidziennikFeatures.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/MobidziennikFeatures.kt
@@ -17,7 +17,6 @@ const val ENDPOINT_MOBIDZIENNIK_WEB_NOTICES = 2040
const val ENDPOINT_MOBIDZIENNIK_WEB_ATTENDANCE = 2050
const val ENDPOINT_MOBIDZIENNIK_WEB_MANUALS = 2100
const val ENDPOINT_MOBIDZIENNIK_WEB_ACCOUNT_EMAIL = 2200
-const val ENDPOINT_MOBIDZIENNIK_WEB_HOMEWORK = 2300 // not used as an endpoint
const val ENDPOINT_MOBIDZIENNIK_API2_MAIN = 3000
val MobidziennikFeatures = listOf(
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikData.kt
index 09e1e9fb..c12f75c5 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikData.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikData.kt
@@ -29,15 +29,15 @@ class MobidziennikData(val data: DataMobidziennik, val onSuccess: () -> Unit) {
onSuccess()
return
}
- val id = data.targetEndpointIds.firstKey()
- val lastSync = data.targetEndpointIds.remove(id)
- useEndpoint(id, lastSync) { endpointId ->
+ useEndpoint(data.targetEndpointIds.firstKey()) { endpointId ->
+ data.targetEndpointIds.remove(endpointId)
data.progress(data.progressStep)
nextEndpoint(onSuccess)
}
}
- private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
+ private fun useEndpoint(endpointId: Int, onSuccess: (endpointId: Int) -> Unit) {
+ val lastSync = data.targetEndpointIds[endpointId]
Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
when (endpointId) {
ENDPOINT_MOBIDZIENNIK_API_MAIN -> {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikWeb.kt
index cfb4ab49..c549cee3 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikWeb.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/MobidziennikWeb.kt
@@ -8,6 +8,7 @@ import im.wangchao.mhttp.Request
import im.wangchao.mhttp.Response
import im.wangchao.mhttp.callback.FileCallbackHandler
import im.wangchao.mhttp.callback.TextCallbackHandler
+import okhttp3.Cookie
import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
import pl.szczodrzynski.edziennik.data.api.models.ApiError
@@ -25,23 +26,6 @@ open class MobidziennikWeb(open val data: DataMobidziennik, open val lastSync: L
val profile
get() = data.profile
- /* TODO
- add error handling:
-
-
-
-
-
Ważna informacja!
-
-
-
- */
-
fun webGet(
tag: String,
endpoint: String,
@@ -81,12 +65,6 @@ open class MobidziennikWeb(open val data: DataMobidziennik, open val lastSync: L
return
}
- if (text.contains("Problemy z wydajnością
")) {
- data.error(ApiError(TAG, ERROR_MOBIDZIENNIK_WEB_SERVER_PROBLEM)
- .withResponse(response))
- return
- }
-
try {
onSuccess(text)
} catch (e: Exception) {
@@ -104,8 +82,18 @@ open class MobidziennikWeb(open val data: DataMobidziennik, open val lastSync: L
}
}
- data.app.cookieJar.set("${data.loginServerName}.mobidziennik.pl", data.webSessionKey, data.webSessionValue)
- data.app.cookieJar.set("${data.loginServerName}.mobidziennik.pl", "SERVERID", data.webServerId)
+ data.app.cookieJar.saveFromResponse(null, listOf(
+ Cookie.Builder()
+ .name(data.webSessionKey!!)
+ .value(data.webSessionValue!!)
+ .domain("${data.loginServerName}.mobidziennik.pl")
+ .secure().httpOnly().build(),
+ Cookie.Builder()
+ .name("SERVERID")
+ .value(data.webServerId!!)
+ .domain("${data.loginServerName}.mobidziennik.pl")
+ .secure().httpOnly().build()
+ ))
Request.builder()
.url(url)
@@ -176,8 +164,18 @@ open class MobidziennikWeb(open val data: DataMobidziennik, open val lastSync: L
}
}
- data.app.cookieJar.set("${data.loginServerName}.mobidziennik.pl", data.webSessionKey, data.webSessionValue)
- data.app.cookieJar.set("${data.loginServerName}.mobidziennik.pl", "SERVERID", data.webServerId)
+ data.app.cookieJar.saveFromResponse(null, listOf(
+ Cookie.Builder()
+ .name(data.webSessionKey!!)
+ .value(data.webSessionValue!!)
+ .domain("${data.loginServerName}.mobidziennik.pl")
+ .secure().httpOnly().build(),
+ Cookie.Builder()
+ .name("SERVERID")
+ .value(data.webServerId!!)
+ .domain("${data.loginServerName}.mobidziennik.pl")
+ .secure().httpOnly().build()
+ ))
Request.builder()
.url(url)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiAttendance.kt
index 473b3691..be68de4d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiAttendance.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiAttendance.kt
@@ -6,10 +6,7 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.api
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
import pl.szczodrzynski.edziennik.data.db.entity.Attendance
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_ABSENT
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_ABSENT_EXCUSED
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_PRESENT
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_RELEASED
+import pl.szczodrzynski.edziennik.data.db.entity.Attendance.*
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
class MobidziennikApiAttendance(val data: DataMobidziennik, rows: List) {
@@ -26,7 +23,7 @@ class MobidziennikApiAttendance(val data: DataMobidziennik, rows: List)
val id = cols[0].toLong()
val lessonId = cols[1].toLong()
data.mobiLessons.singleOrNull { it.id == lessonId }?.let { lesson ->
- val baseType = when (cols[4]) {
+ val type = when (cols[4]) {
"2" -> TYPE_ABSENT
"5" -> TYPE_ABSENT_EXCUSED
"4" -> TYPE_RELEASED
@@ -34,37 +31,16 @@ class MobidziennikApiAttendance(val data: DataMobidziennik, rows: List)
}
val semester = data.profile?.dateToSemester(lesson.date) ?: 1
- val typeName = when (baseType) {
- TYPE_ABSENT -> "nieobecność"
- TYPE_ABSENT_EXCUSED -> "nieobecność usprawiedliwiona"
- TYPE_RELEASED -> "zwolnienie"
- TYPE_PRESENT -> "obecność"
- else -> "nieznany rodzaj"
- }
- val typeSymbol = when (baseType) {
- TYPE_ABSENT -> "|"
- TYPE_ABSENT_EXCUSED -> "+"
- TYPE_RELEASED -> "z"
- TYPE_PRESENT -> "."
- else -> "?"
- }
-
val attendanceObject = Attendance(
- profileId = data.profileId,
- id = id,
- baseType = baseType,
- typeName = typeName,
- typeShort = data.app.attendanceManager.getTypeShort(baseType),
- typeSymbol = typeSymbol,
- typeColor = null,
- date = lesson.date,
- startTime = lesson.startTime,
- semester = semester,
- teacherId = lesson.teacherId,
- subjectId = lesson.subjectId
- ).also {
- it.lessonTopic = lesson.topic
- }
+ data.profileId,
+ id,
+ lesson.teacherId,
+ lesson.subjectId,
+ semester,
+ lesson.topic,
+ lesson.date,
+ lesson.startTime,
+ type)
data.attendanceList.add(attendanceObject)
data.metadataList.add(
@@ -72,8 +48,9 @@ class MobidziennikApiAttendance(val data: DataMobidziennik, rows: List)
data.profileId,
Metadata.TYPE_ATTENDANCE,
id,
- data.profile?.empty ?: false || baseType == Attendance.TYPE_PRESENT_CUSTOM || baseType == Attendance.TYPE_UNKNOWN,
- data.profile?.empty ?: false || baseType == Attendance.TYPE_PRESENT_CUSTOM || baseType == Attendance.TYPE_UNKNOWN
+ data.profile?.empty ?: false,
+ data.profile?.empty ?: false,
+ System.currentTimeMillis()
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiEvents.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiEvents.kt
index 7a72d3de..f5cb912b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiEvents.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiEvents.kt
@@ -30,7 +30,7 @@ class MobidziennikApiEvents(val data: DataMobidziennik, rows: List) {
val teacherId = cols[1].toLong()
val subjectId = cols[3].toLong()
var type = Event.TYPE_DEFAULT
- var topic = cols[5].trim()
+ var topic = cols[5]
Regexes.MOBIDZIENNIK_EVENT_TYPE.find(topic)?.let {
val typeText = it.groupValues[1]
when (typeText) {
@@ -51,18 +51,17 @@ class MobidziennikApiEvents(val data: DataMobidziennik, rows: List) {
val eventObject = Event(
- profileId = data.profileId,
- id = id,
- date = eventDate,
- time = startTime,
- topic = topic,
- color = null,
- type = type,
- teacherId = teacherId,
- subjectId = subjectId,
- teamId = teamId,
- addedDate = addedDate
- )
+ data.profileId,
+ id,
+ eventDate,
+ startTime,
+ topic,
+ -1,
+ type,
+ false,
+ teacherId,
+ subjectId,
+ teamId)
data.eventList.add(eventObject)
data.metadataList.add(
@@ -71,13 +70,12 @@ class MobidziennikApiEvents(val data: DataMobidziennik, rows: List) {
Metadata.TYPE_EVENT,
id,
data.profile?.empty ?: false,
- data.profile?.empty ?: false
+ data.profile?.empty ?: false,
+ addedDate
))
}
}
- data.toRemove.add(DataRemoveModel.Events.futureWithType(Event.TYPE_DEFAULT))
- data.toRemove.add(DataRemoveModel.Events.futureWithType(Event.TYPE_EXAM))
- data.toRemove.add(DataRemoveModel.Events.futureWithType(Event.TYPE_SHORT_QUIZ))
+ data.toRemove.add(DataRemoveModel.Events.futureExceptType(Event.TYPE_HOMEWORK))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiGrades.kt
index c3c1b449..01d517ac 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiGrades.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiGrades.kt
@@ -7,13 +7,7 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.api
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
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.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.Grade.Companion.TYPE_YEAR_FINAL
-import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_YEAR_PROPOSED
+import pl.szczodrzynski.edziennik.data.db.entity.Grade.*
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
class MobidziennikApiGrades(val data: DataMobidziennik, rows: List) {
@@ -67,25 +61,18 @@ class MobidziennikApiGrades(val data: DataMobidziennik, rows: List) {
}
val gradeObject = Grade(
- profileId = data.profileId,
- id = id,
- name = name,
- type = type,
- value = value,
- weight = weight,
- color = color,
- category = category,
- description = description,
- comment = null,
- semester = semester,
- teacherId = teacherId,
- subjectId = subjectId,
- addedDate = addedDate
- )
-
- if (data.profile?.empty == true) {
- addedDate = data.profile.dateSemester1Start.inMillis
- }
+ data.profileId,
+ id,
+ category,
+ color,
+ description,
+ name,
+ value,
+ weight,
+ semester,
+ teacherId,
+ subjectId)
+ gradeObject.type = type
data.gradeList.add(gradeObject)
data.metadataList.add(
@@ -94,7 +81,8 @@ class MobidziennikApiGrades(val data: DataMobidziennik, rows: List) {
Metadata.TYPE_GRADE,
id,
data.profile?.empty ?: false,
- data.profile?.empty ?: false
+ data.profile?.empty ?: false,
+ addedDate
))
addedDate++
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiHomework.kt
index 683a8820..4c5b4e03 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiHomework.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiHomework.kt
@@ -4,7 +4,6 @@
package pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.api
-import android.text.Html
import androidx.core.util.contains
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
@@ -26,22 +25,22 @@ class MobidziennikApiHomework(val data: DataMobidziennik, rows: List) {
val id = cols[0].toLong()
val teacherId = cols[7].toLong()
val subjectId = cols[6].toLong()
- val topic = Html.fromHtml(cols[1])?.toString()?.trim() ?: ""
+ val topic = cols[1]
val eventDate = Date.fromYmd(cols[2])
val startTime = Time.fromYmdHm(cols[3])
val eventObject = Event(
- profileId = data.profileId,
- id = id,
- date = eventDate,
- time = startTime,
- topic = topic,
- color = null,
- type = Event.TYPE_HOMEWORK,
- teacherId = teacherId,
- subjectId = subjectId,
- teamId = teamId
- )
+ data.profileId,
+ id,
+ eventDate,
+ startTime,
+ topic,
+ -1,
+ Event.TYPE_HOMEWORK,
+ false,
+ teacherId,
+ subjectId,
+ teamId)
data.eventList.add(eventObject)
data.metadataList.add(
@@ -50,7 +49,8 @@ class MobidziennikApiHomework(val data: DataMobidziennik, rows: List) {
Metadata.TYPE_HOMEWORK,
id,
data.profile?.empty ?: false,
- data.profile?.empty ?: false
+ data.profile?.empty ?: false,
+ System.currentTimeMillis()
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiNotices.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiNotices.kt
index 66bfe1fd..f1d9aed2 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiNotices.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiNotices.kt
@@ -33,16 +33,12 @@ class MobidziennikApiNotices(val data: DataMobidziennik, rows: List) {
val addedDate = Date.fromYmd(cols[7]).inMillis
val noticeObject = Notice(
- profileId = data.profileId,
- id = id,
- type = type,
- semester = semester,
- text = text,
- category = null,
- points = null,
- teacherId = teacherId,
- addedDate = addedDate
- )
+ data.profileId,
+ id,
+ text,
+ semester,
+ type,
+ teacherId)
data.noticeList.add(noticeObject)
data.metadataList.add(
@@ -51,7 +47,8 @@ class MobidziennikApiNotices(val data: DataMobidziennik, rows: List) {
Metadata.TYPE_NOTICE,
id,
data.profile?.empty ?: false,
- data.profile?.empty ?: false
+ data.profile?.empty ?: false,
+ addedDate
))
}
}}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiTeams.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiTeams.kt
index 6440b04e..8fd5677b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiTeams.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiTeams.kt
@@ -44,7 +44,7 @@ class MobidziennikApiTeams(val data: DataMobidziennik, tableTeams: List?
val studentId = cols[1].toInt()
val teamId = cols[2].toLong()
- val studentNumber = cols[4].toIntOrNull() ?: -1
+ val studentNumber = cols[4].toInt()
if (studentId != data.studentId)
continue
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiTimetable.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiTimetable.kt
index aa07b1c3..6a7ce02d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiTimetable.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/api/MobidziennikApiTimetable.kt
@@ -8,9 +8,9 @@ import android.util.SparseArray
import androidx.core.util.set
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
-import pl.szczodrzynski.edziennik.data.db.entity.Lesson
import pl.szczodrzynski.edziennik.data.db.entity.LessonRange
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
+import pl.szczodrzynski.edziennik.data.db.entity.Lesson
import pl.szczodrzynski.edziennik.fixName
import pl.szczodrzynski.edziennik.keys
import pl.szczodrzynski.edziennik.singleOrNull
@@ -44,7 +44,7 @@ class MobidziennikApiTimetable(val data: DataMobidziennik, rows: List) {
dataDays.remove(date.value)
- val subjectId = data.subjectList.singleOrNull { it.longName == lesson[5].trim() }?.id ?: -1
+ val subjectId = data.subjectList.singleOrNull { it.longName == lesson[5] }?.id ?: -1
val teacherId = data.teacherList.singleOrNull { it.fullNameLastFirst == (lesson[7]+" "+lesson[6]).fixName() }?.id ?: -1
val teamId = data.teamList.singleOrNull { it.name == lesson[8]+lesson[9] }?.id ?: -1
val classroom = lesson[11]
@@ -97,7 +97,8 @@ class MobidziennikApiTimetable(val data: DataMobidziennik, rows: List) {
Metadata.TYPE_LESSON_CHANGE,
it.id,
seen,
- seen
+ seen,
+ System.currentTimeMillis()
))
}
data.lessonList += it
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikLuckyNumberExtractor.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikLuckyNumberExtractor.kt
index ece23d7f..5e1445ec 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikLuckyNumberExtractor.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikLuckyNumberExtractor.kt
@@ -17,9 +17,9 @@ class MobidziennikLuckyNumberExtractor(val data: DataMobidziennik, text: String)
val luckyNumber = it.groupValues[1].toInt()
val luckyNumberObject = LuckyNumber(
- profileId = data.profileId,
- date = Date.getToday(),
- number = luckyNumber
+ data.profileId,
+ Date.getToday(),
+ luckyNumber
)
data.luckyNumberList.add(luckyNumberObject)
@@ -29,7 +29,8 @@ class MobidziennikLuckyNumberExtractor(val data: DataMobidziennik, text: String)
Metadata.TYPE_LUCKY_NUMBER,
luckyNumberObject.date.value.toLong(),
true,
- data.profile?.empty ?: false
+ data.profile?.empty ?: false,
+ System.currentTimeMillis()
))
} catch (_: Exception){}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebAttendance.kt
index 349c2ea7..c56c56d9 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebAttendance.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebAttendance.kt
@@ -11,13 +11,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.ENDPOINT_MOBID
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikWeb
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
import pl.szczodrzynski.edziennik.data.db.entity.Attendance
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_ABSENT
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_ABSENT_EXCUSED
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_BELATED
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_PRESENT
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_PRESENT_CUSTOM
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_RELEASED
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance.Companion.TYPE_UNKNOWN
+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
import pl.szczodrzynski.edziennik.fixName
@@ -77,25 +71,10 @@ class MobidziennikWebAttendance(override val data: DataMobidziennik,
val start = System.currentTimeMillis()
- val types = Regexes.MOBIDZIENNIK_ATTENDANCE_TYPES
- .find(text)
- ?.get(1)
- ?.split("
")
- ?.map {
- it.trimEnd(',')
- .split(" ", limit = 2)
- .let { it.getOrNull(0) to it.getOrNull(1) }
- }
- ?.toMap()
- val typeSymbols = types?.keys?.filterNotNull() ?: listOf()
-
Regexes.MOBIDZIENNIK_ATTENDANCE_TABLE.findAll(text).forEach { tableResult ->
val table = tableResult[1]
-
val lessonDates = mutableListOf()
val entries = mutableListOf()
- val ranges = mutableListOf()
-
Regexes.MOBIDZIENNIK_ATTENDANCE_LESSON_COUNT.findAll(table).forEach {
val date = Date.fromY_m_d(it[1])
for (i in 0 until (it[2].toIntOrNull() ?: 0)) {
@@ -104,52 +83,67 @@ class MobidziennikWebAttendance(override val data: DataMobidziennik,
}
Regexes.MOBIDZIENNIK_ATTENDANCE_ENTRIES.findAll(table).mapTo(entries) { it[1] }
- Regexes.MOBIDZIENNIK_ATTENDANCE_COLUMNS.findAll(table).forEach { columns ->
- var index = 0
- Regexes.MOBIDZIENNIK_ATTENDANCE_COLUMN.findAll(columns[1]).forEach { column ->
- if (column[1].contains("colspan")) {
- val colspan =
- Regexes.MOBIDZIENNIK_ATTENDANCE_COLUMN_SPAN.find(column[1])
- ?.get(1)
- ?.toIntOrNull() ?: 0
- entries.addAll(index, List(colspan) { "" })
- ranges.addAll(List(colspan) { null })
- index += colspan
- }
- else {
- val range = Regexes.MOBIDZIENNIK_ATTENDANCE_RANGE.find(column[2])
- ranges.add(range)
- index++
- }
- }
- }
-
val dateIterator = lessonDates.iterator()
val entriesIterator = entries.iterator()
-
- val count = ranges.count()
- // verify the lesson count is the same as dates & entries
- if (count != lessonDates.count() || count != entries.count())
- return@forEach
- ranges.forEach { range ->
- val lessonDate = dateIterator.next()
- val entry = entriesIterator.next()
- if (range == null || entry.isBlank())
+ Regexes.MOBIDZIENNIK_ATTENDANCE_RANGE.findAll(table).let { ranges ->
+ val count = ranges.count()
+ // verify the lesson count is the same as dates & entries
+ if (count != lessonDates.count() || count != entries.count())
return@forEach
- val startTime = Time.fromH_m(range[1])
+ ranges.forEach { range ->
+ val lessonDate = dateIterator.next()
+ val entry = entriesIterator.next()
+ if (entry.isBlank())
+ return@forEach
+ val startTime = Time.fromH_m(range[1])
+ val entryIterator = entry.iterator()
+ range[2].split(" / ").mapNotNull { Regexes.MOBIDZIENNIK_ATTENDANCE_LESSON.find(it) }.forEachIndexed { index, lesson ->
+ val topic = lesson[2]
+ if (topic.startsWith("Lekcja odwołana: ") || !entryIterator.hasNext())
+ return@forEachIndexed
+ val subjectName = lesson[1]
+ //val team = lesson[3]
+ val teacherName = lesson[4].fixName()
- range[2].split(" / ").mapNotNull {
- Regexes.MOBIDZIENNIK_ATTENDANCE_LESSON.find(it)
- }.forEachIndexed { index, lesson ->
- processEntry(
- index,
- lesson,
- lessonDate,
- startTime,
- entry,
- types,
- typeSymbols
- )
+ val teacherId = data.teacherList.singleOrNull { it.fullNameLastFirst == teacherName }?.id ?: -1
+ val subjectId = data.subjectList.singleOrNull { it.longName == subjectName }?.id ?: -1
+
+ val type = when (entryIterator.nextChar()) {
+ '.' -> TYPE_PRESENT
+ '|' -> TYPE_ABSENT
+ '+' -> TYPE_ABSENT_EXCUSED
+ 's' -> TYPE_BELATED
+ 'z' -> TYPE_RELEASED
+ else -> TYPE_PRESENT
+ }
+ val semester = data.profile?.dateToSemester(lessonDate) ?: 1
+
+ val id = lessonDate.combineWith(startTime) / 6L * 10L + (lesson[0].hashCode() and 0xFFFF) + index
+
+ val attendanceObject = Attendance(
+ data.profileId,
+ id,
+ teacherId,
+ subjectId,
+ semester,
+ topic,
+ lessonDate,
+ startTime,
+ type)
+
+ data.attendanceList.add(attendanceObject)
+ if (type != TYPE_PRESENT) {
+ data.metadataList.add(
+ Metadata(
+ data.profileId,
+ Metadata.TYPE_ATTENDANCE,
+ id,
+ data.profile?.empty ?: false,
+ data.profile?.empty ?: false,
+ System.currentTimeMillis()
+ ))
+ }
+ }
}
}
}
@@ -159,97 +153,4 @@ class MobidziennikWebAttendance(override val data: DataMobidziennik,
onSuccess()
}
}
-
- private fun processEntry(
- index: Int,
- lesson: MatchResult,
- lessonDate: Date,
- startTime: Time,
- entry: String,
- types: Map?,
- typeSymbols: List
- ) {
- var entry = entry
-
- val topic = lesson[1].substringAfter(" - ", missingDelimiterValue = "").takeIf { it.isNotBlank() }
- if (topic?.startsWith("Lekcja odwołana: ") == true || entry.isEmpty())
- return
- val subjectName = lesson[1].substringBefore(" - ")
- //val team = lesson[3]
- val teacherName = lesson[3].fixName()
-
- val teacherId = data.teacherList.singleOrNull { it.fullNameLastFirst == teacherName }?.id ?: -1
- val subjectId = data.subjectList.singleOrNull { it.longName == subjectName }?.id ?: -1
-
- var typeSymbol = ""
- for (symbol in typeSymbols) {
- if (entry.startsWith(symbol) && symbol.length > typeSymbol.length)
- typeSymbol = symbol
- }
- entry = entry.removePrefix(typeSymbol)
-
- var isCounted = true
- val baseType = when (typeSymbol) {
- "." -> TYPE_PRESENT
- "|" -> TYPE_ABSENT
- "+" -> TYPE_ABSENT_EXCUSED
- "s" -> TYPE_BELATED
- "z" -> TYPE_RELEASED
- else -> {
- isCounted = false
- when (typeSymbol) {
- "e" -> TYPE_PRESENT_CUSTOM
- "en" -> TYPE_ABSENT
- "ep" -> TYPE_PRESENT_CUSTOM
- else -> TYPE_UNKNOWN
- }
- }
- }
- val typeName = types?.get(typeSymbol) ?: ""
- val typeColor = when (typeSymbol) {
- "e" -> 0xff673ab7
- "en" -> 0xffec407a
- "ep" -> 0xff4caf50
- else -> null
- }?.toInt()
-
- val typeShort = if (isCounted)
- data.app.attendanceManager.getTypeShort(baseType)
- else
- typeSymbol
-
- val semester = data.profile?.dateToSemester(lessonDate) ?: 1
-
- val id = lessonDate.combineWith(startTime) / 6L * 10L + (lesson[0].hashCode() and 0xFFFF) + index
-
- val attendanceObject = Attendance(
- profileId = profileId,
- id = id,
- baseType = baseType,
- typeName = typeName,
- typeShort = typeShort,
- typeSymbol = typeSymbol,
- typeColor = typeColor,
- date = lessonDate,
- startTime = startTime,
- semester = semester,
- teacherId = teacherId,
- subjectId = subjectId
- ).also {
- it.lessonTopic = topic
- it.isCounted = isCounted
- }
-
- data.attendanceList.add(attendanceObject)
- if (baseType != TYPE_PRESENT) {
- data.metadataList.add(
- Metadata(
- data.profileId,
- Metadata.TYPE_ATTENDANCE,
- id,
- data.profile?.empty ?: false || baseType == Attendance.TYPE_PRESENT_CUSTOM || baseType == TYPE_UNKNOWN,
- data.profile?.empty ?: false || baseType == Attendance.TYPE_PRESENT_CUSTOM || baseType == TYPE_UNKNOWN
- ))
- }
- }
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebCalendar.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebCalendar.kt
index 95c1f6df..9664a68b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebCalendar.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebCalendar.kt
@@ -61,25 +61,26 @@ class MobidziennikWebCalendar(override val data: DataMobidziennik,
val title = event.getString("title")
val comment = event.getString("comment")
- var topic = title ?: ""
+ var topic = title
if (title != comment) {
topic += "\n" + comment
}
if (id == -1L) {
- id = crc16(topic.toByteArray()).toLong()
+ id = crc16(topic?.toByteArray()).toLong()
}
val eventObject = Event(
- profileId = profileId,
- id = id,
- date = eventDate, time = null,
- topic = topic,
- color = null,
- type = eventType,
- teacherId = -1,
- subjectId = -1,
- teamId = data.teamClass?.id ?: -1
+ profileId,
+ id,
+ eventDate, null,
+ topic,
+ -1,
+ eventType,
+ false,
+ -1,
+ -1,
+ data.teamClass?.id ?: -1
)
data.eventList.add(eventObject)
@@ -89,8 +90,8 @@ class MobidziennikWebCalendar(override val data: DataMobidziennik,
Metadata.TYPE_EVENT,
eventObject.id,
profile?.empty ?: false,
- profile?.empty ?: false
- /* no addedDate here though */
+ profile?.empty ?: false,
+ System.currentTimeMillis() /* no addedDate here though */
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetAttachment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetAttachment.kt
index 52561a81..80803441 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetAttachment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetAttachment.kt
@@ -8,14 +8,12 @@ import org.greenrobot.eventbus.EventBus
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikWeb
import pl.szczodrzynski.edziennik.data.api.events.AttachmentGetEvent
-import pl.szczodrzynski.edziennik.data.db.entity.Event
import pl.szczodrzynski.edziennik.data.db.entity.Message
import pl.szczodrzynski.edziennik.utils.Utils
-import pl.szczodrzynski.edziennik.utils.models.Date
import java.io.File
class MobidziennikWebGetAttachment(override val data: DataMobidziennik,
- val owner: Any,
+ val message: Message,
val attachmentId: Long,
val attachmentName: String,
val onSuccess: () -> Unit
@@ -27,40 +25,25 @@ class MobidziennikWebGetAttachment(override val data: DataMobidziennik,
init {
val targetFile = File(Utils.getStorageDir(), attachmentName)
- val typeUrl = when (owner) {
- is Message -> if (owner.type == Message.TYPE_SENT)
- "dziennik/wiadwyslana/?id="
- else
- "dziennik/wiadodebrana/?id="
+ val typeUrl = if (message.type == Message.TYPE_SENT)
+ "wiadwyslana"
+ else
+ "wiadodebrana"
- is Event -> if (owner.date >= Date.getToday())
- "dziennik/wyslijzadanie/?id_zadania="
- else
- "dziennik/wyslijzadanie/?id_zadania="
-
- else -> ""
- }
-
- val ownerId = when (owner) {
- is Message -> owner.id
- is Event -> owner.id
- else -> -1
- }
-
- webGetFile(TAG, "/$typeUrl${ownerId}&uczen=${data.studentId}&zalacznik=$attachmentId", targetFile, { file ->
+ webGetFile(TAG, "/dziennik/$typeUrl/?id=${message.id}&zalacznik=$attachmentId", targetFile, { file ->
val event = AttachmentGetEvent(
profileId,
- owner,
+ message.id,
attachmentId,
AttachmentGetEvent.TYPE_FINISHED,
file.absolutePath
)
- val attachmentDataFile = File(Utils.getStorageDir(), ".${profileId}_${event.ownerId}_${event.attachmentId}")
+ val attachmentDataFile = File(Utils.getStorageDir(), ".${profileId}_${event.messageId}_${event.attachmentId}")
Utils.writeStringToFile(attachmentDataFile, event.fileName)
- EventBus.getDefault().postSticky(event)
+ EventBus.getDefault().post(event)
onSuccess()
@@ -68,13 +51,13 @@ class MobidziennikWebGetAttachment(override val data: DataMobidziennik,
// TODO make use of bytesTotal
val event = AttachmentGetEvent(
profileId,
- owner,
+ message.id,
attachmentId,
AttachmentGetEvent.TYPE_PROGRESS,
bytesWritten = written
)
- EventBus.getDefault().postSticky(event)
+ EventBus.getDefault().post(event)
}
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetHomework.kt
deleted file mode 100644
index b0699b4b..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetHomework.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-3-31.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web
-
-import org.greenrobot.eventbus.EventBus
-import pl.szczodrzynski.edziennik.data.api.Regexes
-import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
-import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikWeb
-import pl.szczodrzynski.edziennik.data.api.events.EventGetEvent
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
-import pl.szczodrzynski.edziennik.get
-import pl.szczodrzynski.edziennik.utils.models.Date
-
-class MobidziennikWebGetHomework(override val data: DataMobidziennik,
- val event: EventFull,
- val onSuccess: () -> Unit
-) : MobidziennikWeb(data, null) {
- companion object {
- private const val TAG = "MobidziennikWebHomework"
- }
-
- init {
- val endpoint = if (event.date >= Date.getToday())
- "zadaniadomowe"
- else
- "zadaniadomowearchiwalne"
-
- webGet(TAG, "/mobile/$endpoint") { text ->
- MobidziennikLuckyNumberExtractor(data, text)
-
- Regexes.MOBIDZIENNIK_HOMEWORK_ROW.findAll(text).forEach { homeworkMatch ->
- val tableRow = homeworkMatch[1].ifBlank { return@forEach }
-
- val id = Regexes.MOBIDZIENNIK_HOMEWORK_ID.find(tableRow)?.get(1)?.toLongOrNull() ?: return@forEach
- if (event.id != id)
- return@forEach
-
- event.attachmentIds = mutableListOf()
- event.attachmentNames = mutableListOf()
- Regexes.MOBIDZIENNIK_HOMEWORK_ATTACHMENT.findAll(tableRow).forEach {
- event.attachmentIds?.add(it[2].toLongOrNull() ?: return@forEach)
- event.attachmentNames?.add(it[3])
- }
-
- event.homeworkBody = ""
- }
-
- data.eventList.add(event)
- data.eventListReplace = true
-
- EventBus.getDefault().postSticky(EventGetEvent(event))
- onSuccess()
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetMessage.kt
index 105c0943..e4ddcc52 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetMessage.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGetMessage.kt
@@ -11,7 +11,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidzienn
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikWeb
import pl.szczodrzynski.edziennik.data.api.events.MessageGetEvent
import pl.szczodrzynski.edziennik.data.db.entity.Message
-import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_RECEIVED
+import pl.szczodrzynski.edziennik.data.db.entity.Message.TYPE_RECEIVED
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
import pl.szczodrzynski.edziennik.data.db.full.MessageRecipientFull
@@ -61,17 +61,19 @@ class MobidziennikWebGetMessage(override val data: DataMobidziennik,
}
val recipient = MessageRecipientFull(
- profileId = profileId,
- id = -1,
- messageId = message.id,
- readDate = readDate
+ profileId,
+ -1,
+ -1,
+ readDate,
+ message.id
)
recipient.fullName = profile?.accountName ?: profile?.studentNameLong ?: ""
messageRecipientList.add(recipient)
} else {
- message.senderId = null
+ message.senderId = -1
+ message.senderReplyId = -1
content.select("table.spis tr:has(td)")?.forEach { recipientEl ->
val senderEl = recipientEl.select("td:eq(0)").first()
@@ -98,10 +100,11 @@ class MobidziennikWebGetMessage(override val data: DataMobidziennik,
}
val recipient = MessageRecipientFull(
- profileId = profileId,
- id = receiverId,
- messageId = message.id,
- readDate = readDate
+ profileId,
+ receiverId,
+ -1,
+ readDate,
+ message.id
)
recipient.fullName = teacher?.fullName ?: "?"
@@ -115,7 +118,7 @@ class MobidziennikWebGetMessage(override val data: DataMobidziennik,
// this needs to be at the end
message.apply {
- this.body = body.html()
+ this.body = body.html().replace("\n", "
")
clearAttachments()
content.select("ul li").map { it.select("a").first() }.forEach {
@@ -139,15 +142,14 @@ class MobidziennikWebGetMessage(override val data: DataMobidziennik,
Metadata.TYPE_MESSAGE,
message.id,
true,
- true
+ true,
+ message.addedDate
))
}
message.recipients = messageRecipientList
data.messageRecipientList.addAll(messageRecipientList)
-
data.messageList.add(message)
- data.messageListReplace = true
EventBus.getDefault().postSticky(MessageGetEvent(message))
onSuccess()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGrades.kt
index 9f5fab95..2922815b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGrades.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebGrades.kt
@@ -11,7 +11,6 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidzienn
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.ENDPOINT_MOBIDZIENNIK_WEB_GRADES
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikWeb
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.SYNC_ALWAYS
import pl.szczodrzynski.edziennik.fixWhiteSpaces
@@ -113,20 +112,17 @@ class MobidziennikWebGrades(override val data: DataMobidziennik,
}
val gradeObject = Grade(
- profileId = profileId,
- id = gradeId,
- name = gradeName,
- type = TYPE_NORMAL,
- value = gradeValue,
- weight = 0f,
- color = gradeColor,
- category = gradeCategory,
- description = "NLDŚR, $gradeDescription",
- comment = null,
- semester = gradeSemester,
- teacherId = teacherId,
- subjectId = subjectId,
- addedDate = gradeAddedDateMillis
+ profileId,
+ gradeId,
+ gradeCategory,
+ gradeColor,
+ "NLDŚR, $gradeDescription",
+ gradeName,
+ gradeValue,
+ 0f,
+ gradeSemester,
+ teacherId,
+ subjectId
)
gradeObject.classAverage = gradeClassAverage
@@ -138,7 +134,8 @@ class MobidziennikWebGrades(override val data: DataMobidziennik,
Metadata.TYPE_GRADE,
gradeObject.id,
profile.empty,
- profile.empty
+ profile.empty,
+ gradeAddedDateMillis
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebHomework.kt
deleted file mode 100644
index 944b21ea..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebHomework.kt
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-3-31.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web
-
-import org.greenrobot.eventbus.EventBus
-import pl.szczodrzynski.edziennik.data.api.Regexes
-import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
-import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.ENDPOINT_MOBIDZIENNIK_WEB_HOMEWORK
-import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikWeb
-import pl.szczodrzynski.edziennik.data.api.events.EventGetEvent
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
-import pl.szczodrzynski.edziennik.get
-
-class MobidziennikWebHomework(override val data: DataMobidziennik,
- override val lastSync: Long?,
- val type: Int = TYPE_CURRENT,
- val event: EventFull,
- val onSuccess: (endpointId: Int) -> Unit
-) : MobidziennikWeb(data, lastSync) {
- companion object {
- private const val TAG = "MobidziennikWebHomework"
- const val TYPE_CURRENT = 0
- const val TYPE_PAST = 1
- }
-
- init {
- val endpoint = when (type) {
- TYPE_PAST -> "zadaniadomowearchiwalne"
- else -> "zadaniadomowe"
- }
- webGet(TAG, "/mobile/$endpoint") { text ->
- MobidziennikLuckyNumberExtractor(data, text)
-
- Regexes.MOBIDZIENNIK_HOMEWORK_ROW.findAll(text).forEach { homeworkMatch ->
- val tableRow = homeworkMatch[1].ifBlank { return@forEach }
-
- /*val items = Regexes.MOBIDZIENNIK_HOMEWORK_ITEM.findAll(tableRow).map { match ->
- match[1] to match[2].fixWhiteSpaces()
- }.toList()*/
-
- val id = Regexes.MOBIDZIENNIK_HOMEWORK_ID.find(tableRow)?.get(1)?.toLongOrNull() ?: return@forEach
- if (event.id != id)
- return@forEach
-
- //val homeworkBody = Regexes.MOBIDZIENNIK_HOMEWORK_BODY.find(tableRow)?.get(1) ?: ""
-
- event.attachmentIds = mutableListOf()
- event.attachmentNames = mutableListOf()
- Regexes.MOBIDZIENNIK_HOMEWORK_ATTACHMENT.findAll(tableRow).forEach {
- event.attachmentIds?.add(it[1].toLongOrNull() ?: return@forEach)
- event.attachmentNames?.add(it[2])
- }
-
- event.homeworkBody = ""
- }
-
- //data.eventList.add(eventObject)
- //data.metadataList.add(
- // Metadata(
- // profileId,
- // Metadata.TYPE_EVENT,
- // eventObject.id,
- // profile?.empty ?: false,
- // profile?.empty ?: false,
- // System.currentTimeMillis() /* no addedDate here though */
- // ))
-
- // not used as an endpoint
- //data.setSyncNext(ENDPOINT_MOBIDZIENNIK_WEB_HOMEWORK, SYNC_ALWAYS)
- data.eventList.add(event)
- data.eventListReplace = true
-
- EventBus.getDefault().postSticky(EventGetEvent(event))
- onSuccess(ENDPOINT_MOBIDZIENNIK_WEB_HOMEWORK)
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesAll.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesAll.kt
index 4e8f900a..af9dc5f2 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesAll.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesAll.kt
@@ -10,8 +10,8 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidzienn
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.ENDPOINT_MOBIDZIENNIK_WEB_MESSAGES_ALL
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikWeb
import pl.szczodrzynski.edziennik.data.db.entity.Message
-import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_RECEIVED
-import pl.szczodrzynski.edziennik.data.db.entity.Message.Companion.TYPE_SENT
+import pl.szczodrzynski.edziennik.data.db.entity.Message.TYPE_RECEIVED
+import pl.szczodrzynski.edziennik.data.db.entity.Message.TYPE_SENT
import pl.szczodrzynski.edziennik.data.db.entity.MessageRecipient
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.fixName
@@ -32,15 +32,15 @@ class MobidziennikWebMessagesAll(override val data: DataMobidziennik,
val doc = Jsoup.parse(text)
- val listElement = doc.getElementsByClass("spis")?.first()
+ val listElement = doc.getElementsByClass("spis").first()
if (listElement == null) {
data.setSyncNext(ENDPOINT_MOBIDZIENNIK_WEB_MESSAGES_ALL, 7*DAY)
onSuccess(ENDPOINT_MOBIDZIENNIK_WEB_MESSAGES_ALL)
return@webGet
}
val list = listElement.getElementsByClass("podswietl")
- list?.forEach { item ->
- val id = item.attr("rel").replace("[^\\d]".toRegex(), "").toLongOrNull() ?: return@forEach
+ for (item in list) {
+ val id = item.attr("rel").replace("[^\\d]".toRegex(), "").toLongOrNull() ?: continue
val subjectEl = item.select("td:eq(0) div").first()
val subject = subjectEl.text()
@@ -54,12 +54,12 @@ class MobidziennikWebMessagesAll(override val data: DataMobidziennik,
type = TYPE_SENT
val senderEl = item.select("td:eq(3) div").first()
- var senderId: Long? = null
+ var senderId: Long = -1
if (type == TYPE_RECEIVED) {
// search sender teacher
val senderName = senderEl.text().fixName()
- senderId = data.teacherList.singleOrNull { it.fullNameLastFirst == senderName }?.id
+ senderId = data.teacherList.singleOrNull { it.fullNameLastFirst == senderName }?.id ?: -1
data.messageRecipientList.add(MessageRecipient(profileId, -1, id))
} else {
// TYPE_SENT, so multiple recipients possible
@@ -72,17 +72,17 @@ class MobidziennikWebMessagesAll(override val data: DataMobidziennik,
}
val message = Message(
- profileId = profileId,
- id = id,
- type = type,
- subject = subject,
- body = null,
- senderId = senderId,
- addedDate = addedDate
+ profileId,
+ id,
+ subject,
+ null,
+ type,
+ senderId,
+ -1
)
- data.messageList.add(message)
- data.metadataList.add(Metadata(profileId, Metadata.TYPE_MESSAGE, message.id, true, true))
+ data.messageIgnoreList.add(message)
+ data.metadataList.add(Metadata(profileId, Metadata.TYPE_MESSAGE, message.id, true, true, addedDate))
}
// sync every 7 days as we probably don't expect more than
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesInbox.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesInbox.kt
index be762228..f87fdfbb 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesInbox.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesInbox.kt
@@ -36,9 +36,9 @@ class MobidziennikWebMessagesInbox(override val data: DataMobidziennik,
val doc = Jsoup.parse(text)
- val list = doc.getElementsByClass("spis")?.first()?.getElementsByClass("podswietl")
- list?.forEach { item ->
- val id = item.attr("rel").toLongOrNull() ?: return@forEach
+ val list = doc.getElementsByClass("spis").first().getElementsByClass("podswietl")
+ for (item in list) {
+ val id = item.attr("rel").toLongOrNull() ?: continue
val subjectEl = item.select("td:eq(0)").first()
var hasAttachments = false
@@ -52,32 +52,33 @@ class MobidziennikWebMessagesInbox(override val data: DataMobidziennik,
val senderEl = item.select("td:eq(2)").first()
val senderName = senderEl.ownText().fixName()
- val senderId = data.teacherList.singleOrNull { it.fullNameLastFirst == senderName }?.id
+ val senderId = data.teacherList.singleOrNull { it.fullNameLastFirst == senderName }?.id ?: -1
data.messageRecipientIgnoreList.add(MessageRecipient(profileId, -1, id))
val isRead = item.select("td:eq(3) span").first().hasClass("wiadomosc_przeczytana")
val message = Message(
- profileId = profileId,
- id = id,
- type = Message.TYPE_RECEIVED,
- subject = subject,
- body = null,
- senderId = senderId,
- addedDate = addedDate
+ profileId,
+ id,
+ subject,
+ null,
+ Message.TYPE_RECEIVED,
+ senderId,
+ -1
)
if (hasAttachments)
- message.hasAttachments = true
+ message.setHasAttachments()
- data.messageList.add(message)
+ data.messageIgnoreList.add(message)
data.setSeenMetadataList.add(
Metadata(
profileId,
Metadata.TYPE_MESSAGE,
message.id,
isRead,
- isRead || profile?.empty ?: false
+ isRead || profile?.empty ?: false,
+ addedDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesSent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesSent.kt
index 543df329..1875fad2 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesSent.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebMessagesSent.kt
@@ -40,9 +40,9 @@ class MobidziennikWebMessagesSent(override val data: DataMobidziennik,
val doc = Jsoup.parse(text)
- val list = doc.getElementsByClass("spis")?.first()?.getElementsByClass("podswietl")
- list?.forEach { item ->
- val id = item.attr("rel").toLongOrNull() ?: return@forEach
+ val list = doc.getElementsByClass("spis").first().getElementsByClass("podswietl")
+ for (item in list) {
+ val id = item.attr("rel").toLongOrNull() ?: continue
val subjectEl = item.select("td:eq(0)").first()
var hasAttachments = false
@@ -73,26 +73,27 @@ class MobidziennikWebMessagesSent(override val data: DataMobidziennik,
val addedDate = Date.fromIsoHm(addedDateEl.text())
val message = Message(
- profileId = profileId,
- id = id,
- type = Message.TYPE_SENT,
- subject = subject,
- body = null,
- senderId = null,
- addedDate = addedDate
+ profileId,
+ id,
+ subject,
+ null,
+ Message.TYPE_SENT,
+ -1,
+ -1
)
if (hasAttachments)
- message.hasAttachments = true
+ message.setHasAttachments()
- data.messageList.add(message)
+ data.messageIgnoreList.add(message)
data.setSeenMetadataList.add(
Metadata(
profileId,
Metadata.TYPE_MESSAGE,
message.id,
true,
- true
+ true,
+ addedDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebSendMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebSendMessage.kt
index 89178b8b..074fb83e 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebSendMessage.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/data/web/MobidziennikWebSendMessage.kt
@@ -43,9 +43,9 @@ class MobidziennikWebSendMessage(override val data: DataMobidziennik,
// TODO create MobidziennikWebMessagesSent and replace this
MobidziennikWebMessagesAll(data, null) {
- val message = data.messageList.firstOrNull { it.type == Message.TYPE_SENT && it.subject == subject }
+ val message = data.messageIgnoreList.firstOrNull { it.type == Message.TYPE_SENT && it.subject == subject }
val metadata = data.metadataList.firstOrNull { it.thingType == Metadata.TYPE_MESSAGE && it.thingId == message?.id }
- val event = MessageSentEvent(data.profileId, message, message?.addedDate)
+ val event = MessageSentEvent(data.profileId, message, metadata?.addedDate)
EventBus.getDefault().postSticky(event)
onSuccess()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/firstlogin/MobidziennikFirstLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/firstlogin/MobidziennikFirstLogin.kt
index 11b668f9..4857bd09 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/firstlogin/MobidziennikFirstLogin.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/firstlogin/MobidziennikFirstLogin.kt
@@ -85,7 +85,7 @@ class MobidziennikFirstLogin(val data: DataMobidziennik, val onSuccess: () -> Un
profileList.add(profile)
}
- EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore))
+ EventBus.getDefault().post(FirstLoginFinishedEvent(profileList, data.loginStore))
onSuccess()
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginWeb.kt
index 78526b0c..dbd3f86f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginWeb.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/login/MobidziennikLoginWeb.kt
@@ -26,7 +26,7 @@ class MobidziennikLoginWeb(val data: DataMobidziennik, val onSuccess: () -> Unit
}
else {
if (data.loginServerName.isNotNullNorEmpty() && data.loginUsername.isNotNullNorEmpty() && data.loginPassword.isNotNullNorEmpty()) {
- data.app.cookieJar.clear("${data.loginServerName}.mobidziennik.pl")
+ data.app.cookieJar.clearForDomain(data.loginServerName + ".mobidziennik.pl")
loginWithCredentials()
}
else {
@@ -58,10 +58,10 @@ class MobidziennikLoginWeb(val data: DataMobidziennik, val onSuccess: () -> Unit
}
}
- val cookies = data.app.cookieJar.getAll("${data.loginServerName}.mobidziennik.pl")
- val cookie = cookies.entries.firstOrNull { it.key.length > 32 }
- val sessionKey = cookie?.key
- val sessionId = cookie?.value
+ val cookies = data.app.cookieJar.getForDomain("${data.loginServerName}.mobidziennik.pl")
+ val cookie = cookies.singleOrNull { it.name().length > 32 }
+ val sessionKey = cookie?.name()
+ val sessionId = cookie?.value()
if (sessionId == null) {
data.error(ApiError(TAG, ERROR_LOGIN_MOBIDZIENNIK_WEB_NO_SESSION_ID)
.withResponse(response)
@@ -71,7 +71,7 @@ class MobidziennikLoginWeb(val data: DataMobidziennik, val onSuccess: () -> Unit
data.webSessionKey = sessionKey
data.webSessionValue = sessionId
- data.webServerId = data.app.cookieJar.get("${data.loginServerName}.mobidziennik.pl", "SERVERID")
+ data.webServerId = data.app.cookieJar.getCookie("${data.loginServerName}.mobidziennik.pl", "SERVERID")
data.webSessionIdExpiryTime = response.getUnixDate() + 45 * 60 /* 45min */
onSuccess()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/DataPodlasie.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/DataPodlasie.kt
deleted file mode 100644
index d117c139..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/DataPodlasie.kt
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-12
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie
-
-import pl.szczodrzynski.edziennik.*
-import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_PODLASIE_API
-import pl.szczodrzynski.edziennik.data.api.models.Data
-import pl.szczodrzynski.edziennik.data.db.entity.*
-import kotlin.text.replace
-
-class DataPodlasie(app: App, profile: Profile?, loginStore: LoginStore) : Data(app, profile, loginStore) {
-
- fun isApiLoginValid() = apiToken.isNotNullNorEmpty()
-
- override fun satisfyLoginMethods() {
- loginMethods.clear()
- if (isApiLoginValid())
- loginMethods += LOGIN_METHOD_PODLASIE_API
- }
-
- override fun generateUserCode(): String = "$schoolShortName:$loginShort:${studentId?.crc32()}"
-
- /* _
- /\ (_)
- / \ _ __ _
- / /\ \ | '_ \| |
- / ____ \| |_) | |
- /_/ \_\ .__/|_|
- | |
- |*/
- private var mApiToken: String? = null
- var apiToken: String?
- get() { mApiToken = mApiToken ?: loginStore.getLoginData("apiToken", null); return mApiToken }
- set(value) { loginStore.putLoginData("apiToken", value); mApiToken = value }
-
- private var mApiUrl: String? = null
- var apiUrl: String?
- get() { mApiUrl = mApiUrl ?: profile?.getStudentData("apiUrl", null); return mApiUrl }
- set(value) { profile?.putStudentData("apiUrl", value) ?: return; mApiUrl = value }
-
- /* ____ _ _
- / __ \| | | |
- | | | | |_| |__ ___ _ __
- | | | | __| '_ \ / _ \ '__|
- | |__| | |_| | | | __/ |
- \____/ \__|_| |_|\___|*/
- private var mStudentId: String? = null
- var studentId: String?
- get() { mStudentId = mStudentId ?: profile?.getStudentData("studentId", null); return mStudentId }
- set(value) { profile?.putStudentData("studentId", value) ?: return; mStudentId = value }
-
- private var mStudentLogin: String? = null
- var studentLogin: String?
- get() { mStudentLogin = mStudentLogin ?: profile?.getStudentData("studentLogin", null); return mStudentLogin }
- set(value) { profile?.putStudentData("studentLogin", value) ?: return; mStudentLogin = value }
-
- private var mSchoolName: String? = null
- var schoolName: String?
- get() { mSchoolName = mSchoolName ?: profile?.getStudentData("schoolName", null); return mSchoolName }
- set(value) { profile?.putStudentData("schoolName", value) ?: return; mSchoolName = value }
-
- private var mClassName: String? = null
- var className: String?
- get() { mClassName = mClassName ?: profile?.getStudentData("className", null); return mClassName }
- set(value) { profile?.putStudentData("className", value) ?: return; mClassName = value }
-
- private var mSchoolYear: String? = null
- var schoolYear: String?
- get() { mSchoolYear = mSchoolYear ?: profile?.getStudentData("schoolYear", null); return mSchoolYear }
- set(value) { profile?.putStudentData("schoolYear", value) ?: return; mSchoolYear = value }
-
- private var mCurrentSemester: Int? = null
- var currentSemester: Int
- get() { mCurrentSemester = mCurrentSemester ?: profile?.getStudentData("currentSemester", 0); return mCurrentSemester ?: 0 }
- set(value) { profile?.putStudentData("currentSemester", value) ?: return; mCurrentSemester = value }
-
- val schoolShortName: String?
- get() = studentLogin?.split('@')?.get(1)?.replace(".podlaskie.pl", "")
-
- val loginShort: String?
- get() = studentLogin?.split('@')?.get(0)
-
- fun getSubject(name: String): Subject {
- val id = name.crc32()
- return subjectList.singleOrNull { it.id == id } ?: run {
- val subject = Subject(profileId, id, name, name)
- subjectList.put(id, subject)
- subject
- }
- }
-
- fun getTeacher(firstName: String, lastName: String): Teacher {
- val name = "$firstName $lastName".fixName()
- return teacherList.singleOrNull { it.fullName == name } ?: run {
- val id = name.crc32()
- val teacher = Teacher(profileId, id, firstName, lastName)
- teacherList.put(id, teacher)
- teacher
- }
- }
-
- fun getTeam(name: String? = null): Team {
- if (name == "cała klasa" || name == null) return teamClass ?: run {
- val id = className!!.crc32()
- val teamCode = "$schoolShortName:$className"
- val team = Team(profileId, id, className, Team.TYPE_CLASS, teamCode, -1)
- teamList.put(id, team)
- return team
- } else {
- val id = name.crc32()
- val teamCode = "$schoolShortName:$name"
- val team = Team(profileId, id, name, Team.TYPE_VIRTUAL, teamCode, -1)
- teamList.put(id, team)
- return team
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/Podlasie.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/Podlasie.kt
deleted file mode 100644
index d7ec441f..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/Podlasie.kt
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-12
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie
-
-import com.google.gson.JsonObject
-import org.greenrobot.eventbus.EventBus
-import pl.szczodrzynski.edziennik.App
-import pl.szczodrzynski.edziennik.data.api.edziennik.helper.DownloadAttachment
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.PodlasieData
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.firstlogin.PodlasieFirstLogin
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.login.PodlasieLogin
-import pl.szczodrzynski.edziennik.data.api.events.AttachmentGetEvent
-import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
-import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface
-import pl.szczodrzynski.edziennik.data.api.models.ApiError
-import pl.szczodrzynski.edziennik.data.api.podlasieLoginMethods
-import pl.szczodrzynski.edziennik.data.api.prepare
-import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
-import pl.szczodrzynski.edziennik.data.db.entity.Profile
-import pl.szczodrzynski.edziennik.data.db.entity.Teacher
-import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
-import pl.szczodrzynski.edziennik.data.db.full.MessageFull
-import pl.szczodrzynski.edziennik.utils.Utils
-import java.io.File
-
-class Podlasie(val app: App, val profile: Profile?, val loginStore: LoginStore, val callback: EdziennikCallback) : EdziennikInterface {
- companion object {
- const val TAG = "Podlasie"
- }
-
- val internalErrorList = mutableListOf()
- val data: DataPodlasie
-
- init {
- data = DataPodlasie(app, profile, loginStore).apply {
- callback = wrapCallback(this@Podlasie.callback)
- satisfyLoginMethods()
- }
- }
-
- private fun completed() {
- data.saveData()
- callback.onCompleted()
- }
-
- /* _______ _ _ _ _ _
- |__ __| | /\ | | (_) | | |
- | | | |__ ___ / \ | | __ _ ___ _ __ _| |_| |__ _ __ ___
- | | | '_ \ / _ \ / /\ \ | |/ _` |/ _ \| '__| | __| '_ \| '_ ` _ \
- | | | | | | __/ / ____ \| | (_| | (_) | | | | |_| | | | | | | | |
- |_| |_| |_|\___| /_/ \_\_|\__, |\___/|_| |_|\__|_| |_|_| |_| |_|
- __/ |
- |__*/
- override fun sync(featureIds: List, viewId: Int?, onlyEndpoints: List?, arguments: JsonObject?) {
- data.arguments = arguments
- data.prepare(podlasieLoginMethods, PodlasieFeatures, featureIds, viewId, onlyEndpoints)
- Utils.d(TAG, "LoginMethod IDs: ${data.targetLoginMethodIds}")
- Utils.d(TAG, "Endpoint IDs: ${data.targetEndpointIds}")
- PodlasieLogin(data) {
- PodlasieData(data) {
- completed()
- }
- }
- }
-
- override fun getMessage(message: MessageFull) {
-
- }
-
- override fun sendMessage(recipients: List, subject: String, text: String) {
-
- }
-
- override fun markAllAnnouncementsAsRead() {
-
- }
-
- override fun getAnnouncement(announcement: AnnouncementFull) {
-
- }
-
- override fun getAttachment(owner: Any, attachmentId: Long, attachmentName: String) {
- val fileUrl = attachmentName.substringAfter(":")
- DownloadAttachment(fileUrl,
- onSuccess = { file ->
- val event = AttachmentGetEvent(
- data.profileId,
- owner,
- attachmentId,
- AttachmentGetEvent.TYPE_FINISHED,
- file.absolutePath
- )
-
- val attachmentDataFile = File(Utils.getStorageDir(), ".${data.profileId}_${event.ownerId}_${event.attachmentId}")
- Utils.writeStringToFile(attachmentDataFile, event.fileName)
-
- EventBus.getDefault().postSticky(event)
-
- completed()
- },
- onProgress = { written, _ ->
- val event = AttachmentGetEvent(
- data.profileId,
- owner,
- attachmentId,
- AttachmentGetEvent.TYPE_PROGRESS,
- bytesWritten = written
- )
-
- EventBus.getDefault().postSticky(event)
- },
- onError = { apiError ->
- data.error(apiError)
- })
- }
-
- override fun getRecipientList() {
-
- }
-
- override fun getEvent(eventFull: EventFull) {
-
- }
-
- override fun firstLogin() {
- PodlasieFirstLogin(data) {
- completed()
- }
- }
-
- override fun cancel() {
- Utils.d(TAG, "Cancelled")
- data.cancel()
- }
-
- private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {
- return object : EdziennikCallback {
- override fun onCompleted() {
- callback.onCompleted()
- }
-
- override fun onProgress(step: Float) {
- callback.onProgress(step)
- }
-
- override fun onStartProgress(stringRes: Int) {
- callback.onStartProgress(stringRes)
- }
-
- override fun onError(apiError: ApiError) {
- // TODO Error handling
- when (apiError.errorCode) {
- in internalErrorList -> {
- // finish immediately if the same error occurs twice during the same sync
- callback.onError(apiError)
- }
- else -> callback.onError(apiError)
- }
- }
-
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/PodlasieFeatures.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/PodlasieFeatures.kt
deleted file mode 100644
index 82c6f659..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/PodlasieFeatures.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-12
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie
-
-import pl.szczodrzynski.edziennik.data.api.FEATURE_ALWAYS_NEEDED
-import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_PODLASIE_API
-import pl.szczodrzynski.edziennik.data.api.LOGIN_TYPE_PODLASIE
-import pl.szczodrzynski.edziennik.data.api.models.Feature
-
-const val ENDPOINT_PODLASIE_API_MAIN = 1001
-
-val PodlasieFeatures = listOf(
- Feature(LOGIN_TYPE_PODLASIE, FEATURE_ALWAYS_NEEDED, listOf(
- ENDPOINT_PODLASIE_API_MAIN to LOGIN_METHOD_PODLASIE_API
- ), listOf(LOGIN_METHOD_PODLASIE_API))
-)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieApi.kt
deleted file mode 100644
index 985b9899..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieApi.kt
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-12
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data
-
-import com.google.gson.JsonObject
-import im.wangchao.mhttp.Request
-import im.wangchao.mhttp.RequestParams
-import im.wangchao.mhttp.Response
-import im.wangchao.mhttp.callback.JsonCallbackHandler
-import pl.szczodrzynski.edziennik.data.api.*
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
-import pl.szczodrzynski.edziennik.data.api.models.ApiError
-import pl.szczodrzynski.edziennik.getInt
-import pl.szczodrzynski.edziennik.getJsonObject
-import pl.szczodrzynski.edziennik.toHexString
-import pl.szczodrzynski.edziennik.utils.Utils
-import java.security.MessageDigest
-import java.text.SimpleDateFormat
-import java.util.*
-
-open class PodlasieApi(open val data: DataPodlasie, open val lastSync: Long?) {
- companion object {
- const val TAG = "PodlasieApi"
- }
-
- val profileId
- get() = data.profile?.id ?: -1
-
- val profile
- get() = data.profile
-
- fun apiGet(tag: String, endpoint: String, onSuccess: (json: JsonObject) -> Unit) {
- val url = PODLASIE_API_URL + endpoint
-
- Utils.d(tag, "Request: Podlasie/Api - $url")
-
- if (data.apiToken == null) {
- data.error(tag, ERROR_PODLASIE_API_NO_TOKEN)
- return
- }
-
- val callback = object : JsonCallbackHandler() {
- override fun onSuccess(json: JsonObject?, response: Response?) {
- if (json == null || response == null) {
- data.error(ApiError(TAG, ERROR_RESPONSE_EMPTY)
- .withResponse(response))
- return
- }
-
- val error = json.getJsonObject("system_message")?.getInt("code")
-
- error?.let { code ->
- when (code) {
- 0 -> ERROR_PODLASIE_API_DATA_MISSING
- 4 -> ERROR_LOGIN_PODLASIE_API_DEVICE_LIMIT
- 5 -> ERROR_LOGIN_PODLASIE_API_INVALID_TOKEN
- 200 -> null // Not an error
- else -> ERROR_PODLASIE_API_OTHER
- }?.let { errorCode ->
- data.error(ApiError(tag, errorCode)
- .withApiResponse(json)
- .withResponse(response))
- return@onSuccess
- }
- }
-
- try {
- onSuccess(json)
- } catch (e: Exception) {
- data.error(ApiError(tag, EXCEPTION_PODLASIE_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(SYSTEM_USER_AGENT)
- .requestParams(RequestParams(mapOf(
- "token" to data.apiToken,
- "securityToken" to getSecurityToken(),
- "mobileId" to data.app.deviceId,
- "ver" to PODLASIE_API_VERSION
- )))
- .callback(callback)
- .build()
- .enqueue()
- }
-
- private fun getSecurityToken(): String {
- val format = SimpleDateFormat("yyyy-MM-dd HH", Locale.ENGLISH)
- .also { it.timeZone = TimeZone.getTimeZone("Europe/Warsaw") }.format(System.currentTimeMillis())
- val instance = MessageDigest.getInstance("SHA-256")
- val digest = instance.digest("-EYlwYu8u16miVd8tT?oO7cvoUVQrQN0vr!$format".toByteArray()).toHexString()
- val digest2 = instance.digest((data.apiToken ?: "").toByteArray()).toHexString()
- return instance.digest("$digest$digest2".toByteArray()).toHexString()
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieData.kt
deleted file mode 100644
index ce1197b8..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/PodlasieData.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-12
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data
-
-import pl.szczodrzynski.edziennik.R
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.ENDPOINT_PODLASIE_API_MAIN
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.api.PodlasieApiMain
-import pl.szczodrzynski.edziennik.utils.Utils
-
-class PodlasieData(val data: DataPodlasie, val onSuccess: () -> Unit) {
- companion object {
- const val TAG = "PodlasieData"
- }
-
- init {
- nextEndpoint(onSuccess)
- }
-
- private fun nextEndpoint(onSuccess: () -> Unit) {
- if (data.targetEndpointIds.isEmpty()) {
- onSuccess()
- return
- }
- if (data.cancelled) {
- onSuccess()
- return
- }
- val id = data.targetEndpointIds.firstKey()
- val lastSync = data.targetEndpointIds.remove(id)
- useEndpoint(id, lastSync) {
- data.progress(data.progressStep)
- nextEndpoint(onSuccess)
- }
- }
-
- private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
- Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
- when (endpointId) {
- ENDPOINT_PODLASIE_API_MAIN -> {
- data.startProgress(R.string.edziennik_progress_endpoint_data)
- PodlasieApiMain(data, lastSync, onSuccess)
- }
- else -> onSuccess(endpointId)
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiEvents.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiEvents.kt
deleted file mode 100644
index 8a169ee7..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiEvents.kt
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-13
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.api
-
-import com.google.gson.JsonObject
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
-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.getLong
-import pl.szczodrzynski.edziennik.getString
-import pl.szczodrzynski.edziennik.utils.models.Date
-import pl.szczodrzynski.edziennik.utils.models.Time
-import java.util.*
-
-class PodlasieApiEvents(val data: DataPodlasie, val rows: List) {
- init {
- rows.forEach { event ->
- val id = event.getLong("ExternalId") ?: return@forEach
- val date = event.getString("DateFrom")?.let { Date.fromY_m_d(it) } ?: return@forEach
- val time = event.getString("DateFrom")?.let { Time.fromY_m_d_H_m_s(it) }
- ?: return@forEach
-
- val name = event.getString("Name")?.replace(""", "\"") ?: ""
- val description = event.getString("Description")?.replace(""", "\"") ?: ""
-
- val type = when (event.getString("Category")?.toLowerCase(Locale.getDefault())) {
- "klasówka" -> Event.TYPE_EXAM
- "praca domowa" -> Event.TYPE_HOMEWORK
- "wycieczka" -> Event.TYPE_EXCURSION
- else -> Event.TYPE_DEFAULT
- }
-
- val teacherFirstName = event.getString("PersonEnteringDataFirstName") ?: return@forEach
- val teacherLastName = event.getString("PersonEnteringDataLastName") ?: return@forEach
- val teacher = data.getTeacher(teacherFirstName, teacherLastName)
-
- val lessonList = data.db.timetableDao().getAllForDateNow(data.profileId, date)
- val lesson = lessonList.firstOrNull { it.startTime == time }
-
- val addedDate = event.getString("CreateDate")?.let { Date.fromIso(it) }
- ?: System.currentTimeMillis()
-
- val eventObject = Event(
- profileId = data.profileId,
- id = id,
- date = date,
- time = time,
- topic = name,
- color = null,
- type = type,
- teacherId = teacher.id,
- subjectId = lesson?.subjectId ?: -1,
- teamId = data.teamClass?.id ?: -1,
- addedDate = addedDate
- ).apply {
- homeworkBody = description
- }
-
- data.eventList.add(eventObject)
- data.metadataList.add(
- Metadata(
- data.profileId,
- if (type == Event.TYPE_HOMEWORK) Metadata.TYPE_HOMEWORK else Metadata.TYPE_EVENT,
- id,
- data.profile?.empty ?: false,
- data.profile?.empty ?: false
- ))
- }
-
- data.toRemove.add(DataRemoveModel.Events.future())
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiFinalGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiFinalGrades.kt
deleted file mode 100644
index 7c4575aa..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiFinalGrades.kt
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-13
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.api
-
-import com.google.gson.JsonObject
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
-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_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.Grade.Companion.TYPE_YEAR_FINAL
-import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_YEAR_PROPOSED
-import pl.szczodrzynski.edziennik.data.db.entity.Metadata
-import pl.szczodrzynski.edziennik.getLong
-import pl.szczodrzynski.edziennik.getString
-
-class PodlasieApiFinalGrades(val data: DataPodlasie, val rows: List) {
- init { data.profile?.also { profile ->
- rows.forEach { grade ->
- val id = grade.getLong("ExternalId") ?: return@forEach
- val mark = grade.getString("Mark") ?: return@forEach
- val proposedMark = grade.getString("ProposedMark") ?: "0"
- val name = data.app.gradesManager.getGradeNumberName(mark)
- val value = data.app.gradesManager.getGradeValue(name)
- val semester = grade.getString("TermShortcut")?.length ?: return@forEach
-
- val typeName = grade.getString("Type") ?: return@forEach
- val type = when (typeName) {
- "S" -> if (semester == 1) TYPE_SEMESTER1_FINAL else TYPE_SEMESTER2_FINAL
- "Y", "R" -> TYPE_YEAR_FINAL
- else -> return@forEach
- }
-
- val subjectName = grade.getString("SchoolSubject") ?: return@forEach
- val subject = data.getSubject(subjectName)
-
- val addedDate = if (profile.empty) profile.getSemesterStart(semester).inMillis
- else System.currentTimeMillis()
-
- val gradeObject = Grade(
- profileId = data.profileId,
- id = id,
- name = name,
- type = type,
- value = value,
- weight = 0f,
- color = -1,
- category = null,
- description = null,
- comment = null,
- semester = semester,
- teacherId = -1,
- subjectId = subject.id,
- addedDate = addedDate
- )
-
- data.gradeList.add(gradeObject)
- data.metadataList.add(
- Metadata(
- data.profileId,
- Metadata.TYPE_GRADE,
- id,
- profile.empty,
- profile.empty
- ))
-
- if (proposedMark != "0") {
- val proposedName = data.app.gradesManager.getGradeNumberName(proposedMark)
- val proposedValue = data.app.gradesManager.getGradeValue(proposedName)
-
- val proposedType = when (typeName) {
- "S" -> if (semester == 1) TYPE_SEMESTER1_PROPOSED else TYPE_SEMESTER2_PROPOSED
- "Y", "R" -> TYPE_YEAR_PROPOSED
- else -> return@forEach
- }
-
- val proposedGradeObject = Grade(
- profileId = data.profileId,
- id = id * (-1),
- name = proposedName,
- type = proposedType,
- value = proposedValue,
- weight = 0f,
- color = -1,
- category = null,
- description = null,
- comment = null,
- semester = semester,
- teacherId = -1,
- subjectId = subject.id,
- addedDate = addedDate
- )
-
- data.gradeList.add(proposedGradeObject)
- data.metadataList.add(
- Metadata(
- data.profileId,
- Metadata.TYPE_GRADE,
- proposedGradeObject.id,
- profile.empty,
- profile.empty
- ))
- }
- }
-
- data.toRemove.addAll(listOf(
- TYPE_SEMESTER1_FINAL,
- TYPE_SEMESTER1_PROPOSED,
- TYPE_SEMESTER2_FINAL,
- TYPE_SEMESTER2_PROPOSED,
- TYPE_YEAR_FINAL,
- TYPE_YEAR_PROPOSED
- ).map {
- DataRemoveModel.Grades.allWithType(it)
- })
- }}
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiGrades.kt
deleted file mode 100644
index d5696567..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiGrades.kt
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-13
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.api
-
-import android.graphics.Color
-import com.google.gson.JsonObject
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
-import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
-import pl.szczodrzynski.edziennik.data.db.entity.Grade
-import pl.szczodrzynski.edziennik.data.db.entity.Metadata
-import pl.szczodrzynski.edziennik.getFloat
-import pl.szczodrzynski.edziennik.getInt
-import pl.szczodrzynski.edziennik.getLong
-import pl.szczodrzynski.edziennik.getString
-import pl.szczodrzynski.edziennik.utils.models.Date
-
-class PodlasieApiGrades(val data: DataPodlasie, val rows: List) {
- init {
- rows.forEach { grade ->
- val id = grade.getLong("ExternalId") ?: return@forEach
- val name = grade.getString("Mark") ?: return@forEach
- val value = data.app.gradesManager.getGradeValue(name)
- val weight = grade.getFloat("Weight") ?: 0f
- val includeToAverage = grade.getInt("IncludeToAverage") != 0
- val color = grade.getString("Color")?.let { Color.parseColor(it) } ?: -1
- val category = grade.getString("Category") ?: ""
- val comment = grade.getString("Comment") ?: ""
- val semester = grade.getString("TermShortcut")?.length ?: data.currentSemester
-
- val teacherFirstName = grade.getString("TeacherFirstName") ?: return@forEach
- val teacherLastName = grade.getString("TeacherLastName") ?: return@forEach
- val teacher = data.getTeacher(teacherFirstName, teacherLastName)
-
- val subjectName = grade.getString("SchoolSubject") ?: return@forEach
- val subject = data.getSubject(subjectName)
-
- val addedDate = grade.getString("ReceivedDate")?.let { Date.fromY_m_d(it).inMillis }
- ?: System.currentTimeMillis()
-
- val gradeObject = Grade(
- profileId = data.profileId,
- id = id,
- name = name,
- type = Grade.TYPE_NORMAL,
- value = value,
- weight = if (includeToAverage) weight else 0f,
- color = color,
- category = category,
- description = null,
- comment = comment,
- semester = semester,
- teacherId = teacher.id,
- subjectId = subject.id,
- addedDate = addedDate
- )
-
- data.gradeList.add(gradeObject)
- data.metadataList.add(
- Metadata(
- data.profileId,
- Metadata.TYPE_GRADE,
- id,
- data.profile?.empty ?: false,
- data.profile?.empty ?: false
- ))
- }
-
- data.toRemove.add(DataRemoveModel.Grades.allWithType(Grade.TYPE_NORMAL))
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiHomework.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiHomework.kt
deleted file mode 100644
index 6ab53328..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiHomework.kt
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-14
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.api
-
-import com.google.gson.JsonObject
-import pl.szczodrzynski.edziennik.crc32
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
-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.get
-import pl.szczodrzynski.edziennik.getString
-import pl.szczodrzynski.edziennik.utils.models.Date
-
-class PodlasieApiHomework(val data: DataPodlasie, val rows: List) {
- init {
- rows.reversed().forEach { homework ->
- val id = homework.getString("ExternalId")?.crc32() ?: return@forEach
- val topic = homework.getString("Title")?.replace(""", "\"") ?: ""
- val description = homework.getString("Message")?.replace(""", "\"") ?: ""
- val date = Date.getToday()
- val addedDate = System.currentTimeMillis()
-
- val eventObject = Event(
- profileId = data.profileId,
- id = id,
- date = date,
- time = null,
- topic = topic,
- color = null,
- type = Event.TYPE_HOMEWORK,
- teacherId = -1,
- subjectId = -1,
- teamId = data.teamClass?.id ?: -1,
- addedDate = addedDate
- ).apply {
- homeworkBody = description
- }
-
- eventObject.attachmentIds = mutableListOf()
- eventObject.attachmentNames = mutableListOf()
- homework.getString("Attachments")?.split(',')?.onEach { url ->
- val filename = "&filename=(.*?)&".toRegex().find(url)?.get(1) ?: return@onEach
- val ext = "&ext=(.*?)&".toRegex().find(url)?.get(1) ?: return@onEach
- eventObject.attachmentIds?.add(url.crc32())
- eventObject.attachmentNames?.add("$filename.$ext:$url")
- }
-
- data.eventList.add(eventObject)
- data.metadataList.add(
- Metadata(
- data.profileId,
- Metadata.TYPE_HOMEWORK,
- id,
- data.profile?.empty ?: false,
- data.profile?.empty ?: false
- ))
- }
-
- data.toRemove.add(DataRemoveModel.Events.futureWithType(Event.TYPE_HOMEWORK))
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiLuckyNumber.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiLuckyNumber.kt
deleted file mode 100644
index 725ec727..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiLuckyNumber.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-13
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.api
-
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
-import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber
-import pl.szczodrzynski.edziennik.data.db.entity.Metadata
-import pl.szczodrzynski.edziennik.utils.models.Date
-
-class PodlasieApiLuckyNumber(val data: DataPodlasie, val luckyNumber: Int) {
- init {
- val luckyNumberObject = LuckyNumber(
- profileId = data.profileId,
- date = Date.getToday(),
- number = luckyNumber
- )
-
- data.luckyNumberList.add(luckyNumberObject)
- data.metadataList.add(
- Metadata(
- data.profileId,
- Metadata.TYPE_LUCKY_NUMBER,
- luckyNumberObject.date.value.toLong(),
- true,
- data.profile?.empty ?: false
- ))
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiMain.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiMain.kt
deleted file mode 100644
index 6fe77b5c..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiMain.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-12
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.api
-
-import pl.szczodrzynski.edziennik.asJsonObjectList
-import pl.szczodrzynski.edziennik.data.api.PODLASIE_API_USER_ENDPOINT
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.ENDPOINT_PODLASIE_API_MAIN
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.PodlasieApi
-import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
-import pl.szczodrzynski.edziennik.getInt
-import pl.szczodrzynski.edziennik.getJsonArray
-
-class PodlasieApiMain(override val data: DataPodlasie,
- override val lastSync: Long?,
- val onSuccess: (endpointId: Int) -> Unit) : PodlasieApi(data, lastSync) {
- companion object {
- const val TAG = "PodlasieApiTimetable"
- }
-
- init {
- apiGet(TAG, PODLASIE_API_USER_ENDPOINT) { json ->
- data.getTeam() // Save the class team when it doesn't exist.
-
- json.getInt("LuckyNumber")?.let { PodlasieApiLuckyNumber(data, it) }
- json.getJsonArray("Teacher")?.asJsonObjectList()?.let { PodlasieApiTeachers(data, it) }
- json.getJsonArray("Timetable")?.asJsonObjectList()?.let { PodlasieApiTimetable(data, it) }
- json.getJsonArray("Marks")?.asJsonObjectList()?.let { PodlasieApiGrades(data, it) }
- json.getJsonArray("MarkFinal")?.asJsonObjectList()?.let { PodlasieApiFinalGrades(data, it) }
- json.getJsonArray("News")?.asJsonObjectList()?.let { PodlasieApiEvents(data, it) }
- json.getJsonArray("Tasks")?.asJsonObjectList()?.let { PodlasieApiHomework(data, it) }
-
- data.setSyncNext(ENDPOINT_PODLASIE_API_MAIN, SYNC_ALWAYS)
- onSuccess(ENDPOINT_PODLASIE_API_MAIN)
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiTeachers.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiTeachers.kt
deleted file mode 100644
index ca1fa7b4..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiTeachers.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-13
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.api
-
-import com.google.gson.JsonObject
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
-import pl.szczodrzynski.edziennik.data.db.entity.Teacher
-import pl.szczodrzynski.edziennik.getInt
-import pl.szczodrzynski.edziennik.getLong
-import pl.szczodrzynski.edziennik.getString
-
-class PodlasieApiTeachers(val data: DataPodlasie, val rows: List) {
- init {
- rows.forEach { teacher ->
- val id = teacher.getLong("ExternalId") ?: return@forEach
- val firstName = teacher.getString("FirstName") ?: return@forEach
- val lastName = teacher.getString("LastName") ?: return@forEach
- val isEducator = teacher.getInt("Educator") == 1
-
- val teacherObject = Teacher(
- profileId = data.profileId,
- id = id,
- name = firstName,
- surname = lastName,
- loginId = null
- )
-
- data.teacherList.put(id, teacherObject)
-
- val teamClass = data.teamClass
- if (isEducator && teamClass != null) {
- data.teamList.put(teamClass.id, teamClass.apply {
- teacherId = id
- })
- }
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiTimetable.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiTimetable.kt
deleted file mode 100644
index a9a12d5d..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/data/api/PodlasieApiTimetable.kt
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-12
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.api
-
-import com.google.gson.JsonObject
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
-import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
-import pl.szczodrzynski.edziennik.data.db.entity.Lesson
-import pl.szczodrzynski.edziennik.getInt
-import pl.szczodrzynski.edziennik.getString
-import pl.szczodrzynski.edziennik.utils.models.Date
-import pl.szczodrzynski.edziennik.utils.models.Time
-import pl.szczodrzynski.edziennik.utils.models.Week
-
-class PodlasieApiTimetable(val data: DataPodlasie, rows: List) {
- init {
- 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)
-
- val days = mutableListOf()
- var startDate: Date? = null
- var endDate: Date? = null
-
- rows.forEach { lesson ->
- val date = lesson.getString("Date")?.let { Date.fromY_m_d(it) } ?: return@forEach
-
- if ((date > weekEnd || date < weekStart) && data.profile?.empty != true) return@forEach
- if (startDate == null) startDate = date.clone()
- endDate = date.clone()
- if (date.value !in days) days += date.value
-
- val lessonNumber = lesson.getInt("LessonNumber") ?: return@forEach
- val startTime = lesson.getString("TimeFrom")?.let { Time.fromH_m_s(it) }
- ?: return@forEach
- val endTime = lesson.getString("TimeTo")?.let { Time.fromH_m_s(it) } ?: return@forEach
- val subject = lesson.getString("SchoolSubject")?.let { data.getSubject(it) }
- ?: return@forEach
-
- val teacherFirstName = lesson.getString("TeacherFirstName") ?: return@forEach
- val teacherLastName = lesson.getString("TeacherLastName") ?: return@forEach
- val teacher = data.getTeacher(teacherFirstName, teacherLastName)
-
- val team = lesson.getString("Group")?.let { data.getTeam(it) } ?: return@forEach
- val classroom = lesson.getString("Room")
-
- Lesson(data.profileId, -1).also {
- it.type = Lesson.TYPE_NORMAL
- it.date = date
- it.lessonNumber = lessonNumber
- it.startTime = startTime
- it.endTime = endTime
- it.subjectId = subject.id
- it.teacherId = teacher.id
- it.teamId = team.id
- it.classroom = classroom
-
- it.id = it.buildId()
- data.lessonList += it
- }
- }
-
- if (startDate != null && endDate != null) {
- if (weekEnd > endDate!!) endDate = weekEnd
-
- while (startDate!! <= endDate!!) {
- if (startDate!!.value !in days) {
- val lessonDate = startDate!!.clone()
- data.lessonList += Lesson(data.profileId, lessonDate.value.toLong()).apply {
- type = Lesson.TYPE_NO_LESSONS
- date = lessonDate
- }
- }
- startDate!!.stepForward(0, 0, 1)
- }
- }
-
- data.toRemove.add(DataRemoveModel.Timetable.between(weekStart, weekEnd))
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/firstlogin/PodlasieFirstLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/firstlogin/PodlasieFirstLogin.kt
deleted file mode 100644
index 9b92d541..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/firstlogin/PodlasieFirstLogin.kt
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-12
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.firstlogin
-
-import org.greenrobot.eventbus.EventBus
-import pl.szczodrzynski.edziennik.*
-import pl.szczodrzynski.edziennik.data.api.LOGIN_TYPE_PODLASIE
-import pl.szczodrzynski.edziennik.data.api.PODLASIE_API_USER_ENDPOINT
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.data.PodlasieApi
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.login.PodlasieLoginApi
-import pl.szczodrzynski.edziennik.data.api.events.FirstLoginFinishedEvent
-import pl.szczodrzynski.edziennik.data.db.entity.Profile
-
-class PodlasieFirstLogin(val data: DataPodlasie, val onSuccess: () -> Unit) {
- companion object {
- const val TAG = "PodlasieFirstLogin"
- }
-
- private val api = PodlasieApi(data, null)
-
- init {
- val loginStoreId = data.loginStore.id
- val loginStoreType = LOGIN_TYPE_PODLASIE
-
- PodlasieLoginApi(data) {
- api.apiGet(TAG, PODLASIE_API_USER_ENDPOINT) { json ->
- val uuid = json.getString("Uuid")
- val login = json.getString("Login")
- val firstName = json.getString("FirstName")
- val lastName = json.getString("LastName")
- val studentNameLong = "$firstName $lastName".fixName()
- val studentNameShort = studentNameLong.getShortName()
- val schoolName = json.getString("SchoolName")
- val className = json.getString("SchoolClass")
- val schoolYear = json.getString("ActualSchoolYear")?.replace(' ', '/')
- val semester = json.getString("ActualTermShortcut")?.length
- val apiUrl = json.getString("URL")
-
- val profile = Profile(
- loginStoreId,
- loginStoreId,
- loginStoreType,
- studentNameLong,
- login,
- studentNameLong,
- studentNameShort,
- null
- ).apply {
- studentData["studentId"] = uuid
- studentData["studentLogin"] = login
- studentData["schoolName"] = schoolName
- studentData["className"] = className
- studentData["schoolYear"] = schoolYear
- studentData["currentSemester"] = semester ?: 1
- studentData["apiUrl"] = apiUrl
-
- schoolYear?.split('/')?.get(0)?.toInt()?.let {
- studentSchoolYearStart = it
- }
- studentClassName = className
- }
-
- EventBus.getDefault().postSticky(FirstLoginFinishedEvent(listOf(profile), data.loginStore))
- onSuccess()
- }
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/login/PodlasieLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/login/PodlasieLogin.kt
deleted file mode 100644
index 406bb997..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/login/PodlasieLogin.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-12
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.login
-
-import pl.szczodrzynski.edziennik.R
-import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_PODLASIE_API
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
-import pl.szczodrzynski.edziennik.utils.Utils
-
-class PodlasieLogin(val data: DataPodlasie, val onSuccess: () -> Unit) {
- companion object {
- const val TAG = "PodlasieLogin"
- }
-
- private var cancelled = false
-
- init {
- nextLoginMethod(onSuccess)
- }
-
- private fun nextLoginMethod(onSuccess: () -> Unit) {
- if (data.targetLoginMethodIds.isEmpty()) {
- onSuccess()
- return
- }
- if (cancelled) {
- onSuccess()
- return
- }
- useLoginMethod(data.targetLoginMethodIds.removeAt(0)) { usedMethodId ->
- data.progress(data.progressStep)
- if (usedMethodId != -1)
- data.loginMethods.add(usedMethodId)
- nextLoginMethod(onSuccess)
- }
- }
-
- private fun useLoginMethod(loginMethodId: Int, onSuccess: (usedMethodId: Int) -> Unit) {
- // this should never be true
- if (data.loginMethods.contains(loginMethodId)) {
- onSuccess(-1)
- return
- }
- Utils.d(TAG, "Using login method $loginMethodId")
- when (loginMethodId) {
- LOGIN_METHOD_PODLASIE_API -> {
- data.startProgress(R.string.edziennik_progress_login_podlasie_api)
- PodlasieLoginApi(data) { onSuccess(loginMethodId) }
- }
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/login/PodlasieLoginApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/login/PodlasieLoginApi.kt
deleted file mode 100644
index 6eb70d06..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/login/PodlasieLoginApi.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-5-12
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.login
-
-import pl.szczodrzynski.edziennik.data.api.ERROR_LOGIN_DATA_MISSING
-import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.DataPodlasie
-import pl.szczodrzynski.edziennik.data.api.models.ApiError
-
-class PodlasieLoginApi(val data: DataPodlasie, val onSuccess: () -> Unit) {
- companion object {
- const val TAG = "PodlasieLoginApi"
- }
-
- init { run {
- if (data.isApiLoginValid()) {
- onSuccess()
- } else {
- data.error(ApiError(TAG, ERROR_LOGIN_DATA_MISSING))
- }
- }}
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/DataTemplate.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/DataTemplate.kt
index dcf569cf..e0a85722 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/DataTemplate.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/DataTemplate.kt
@@ -4,6 +4,7 @@
package pl.szczodrzynski.edziennik.data.api.edziennik.template
+import okhttp3.Cookie
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.currentTimeUnix
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_TEMPLATE_API
@@ -27,7 +28,13 @@ class DataTemplate(app: App, profile: Profile?, loginStore: LoginStore) : Data(a
loginMethods.clear()
if (isWebLoginValid()) {
loginMethods += LOGIN_METHOD_TEMPLATE_WEB
- app.cookieJar.set("eregister.example.com", "AuthCookie", webCookie)
+ app.cookieJar.saveFromResponse(null, listOf(
+ Cookie.Builder()
+ .name("AuthCookie")
+ .value(webCookie!!)
+ .domain("eregister.example.com")
+ .secure().httpOnly().build()
+ ))
}
if (isApiLoginValid())
loginMethods += LOGIN_METHOD_TEMPLATE_API
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt
index 843d36e9..209f5083 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt
@@ -16,10 +16,10 @@ import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.api.prepare
import pl.szczodrzynski.edziennik.data.api.templateLoginMethods
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
+import pl.szczodrzynski.edziennik.data.db.entity.Message
import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
import pl.szczodrzynski.edziennik.utils.Utils.d
@@ -51,9 +51,9 @@ class Template(val app: App, val profile: Profile?, val loginStore: LoginStore,
|_| |_| |_|\___| /_/ \_\_|\__, |\___/|_| |_|\__|_| |_|_| |_| |_|
__/ |
|__*/
- override fun sync(featureIds: List, viewId: Int?, onlyEndpoints: List?, arguments: JsonObject?) {
+ override fun sync(featureIds: List, viewId: Int?, arguments: JsonObject?) {
data.arguments = arguments
- data.prepare(templateLoginMethods, TemplateFeatures, featureIds, viewId, onlyEndpoints)
+ data.prepare(templateLoginMethods, TemplateFeatures, featureIds, viewId)
d(TAG, "LoginMethod IDs: ${data.targetLoginMethodIds}")
d(TAG, "Endpoint IDs: ${data.targetEndpointIds}")
TemplateLogin(data) {
@@ -79,7 +79,7 @@ class Template(val app: App, val profile: Profile?, val loginStore: LoginStore,
}
- override fun getAttachment(owner: Any, attachmentId: Long, attachmentName: String) {
+ override fun getAttachment(message: Message, attachmentId: Long, attachmentName: String) {
}
@@ -87,10 +87,6 @@ class Template(val app: App, val profile: Profile?, val loginStore: LoginStore,
}
- override fun getEvent(eventFull: EventFull) {
-
- }
-
override fun firstLogin() {
TemplateFirstLogin(data) {
completed()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/data/TemplateData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/data/TemplateData.kt
index 3489555f..af81bc43 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/data/TemplateData.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/data/TemplateData.kt
@@ -32,15 +32,15 @@ class TemplateData(val data: DataTemplate, val onSuccess: () -> Unit) {
onSuccess()
return
}
- val id = data.targetEndpointIds.firstKey()
- val lastSync = data.targetEndpointIds.remove(id)
- useEndpoint(id, lastSync) { endpointId ->
+ useEndpoint(data.targetEndpointIds.firstKey()) { endpointId ->
+ data.targetEndpointIds.remove(endpointId)
data.progress(data.progressStep)
nextEndpoint(onSuccess)
}
}
- private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
+ private fun useEndpoint(endpointId: Int, onSuccess: (endpointId: Int) -> Unit) {
+ val lastSync = data.targetEndpointIds[endpointId]
Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
when (endpointId) {
ENDPOINT_TEMPLATE_WEB_SAMPLE -> {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/login/TemplateLoginWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/login/TemplateLoginWeb.kt
index d7a24ef0..fac39d50 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/login/TemplateLoginWeb.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/login/TemplateLoginWeb.kt
@@ -4,11 +4,12 @@
package pl.szczodrzynski.edziennik.data.api.edziennik.template.login
-import pl.szczodrzynski.edziennik.currentTimeUnix
+import okhttp3.Cookie
import pl.szczodrzynski.edziennik.data.api.ERROR_LOGIN_DATA_MISSING
import pl.szczodrzynski.edziennik.data.api.ERROR_PROFILE_MISSING
import pl.szczodrzynski.edziennik.data.api.edziennik.template.DataTemplate
import pl.szczodrzynski.edziennik.data.api.models.ApiError
+import pl.szczodrzynski.edziennik.currentTimeUnix
class TemplateLoginWeb(val data: DataTemplate, val onSuccess: () -> Unit) {
companion object {
@@ -22,11 +23,17 @@ class TemplateLoginWeb(val data: DataTemplate, val onSuccess: () -> Unit) {
}
if (data.isWebLoginValid()) {
- data.app.cookieJar.set("eregister.example.com", "AuthCookie", data.webCookie)
+ data.app.cookieJar.saveFromResponse(null, listOf(
+ Cookie.Builder()
+ .name("AuthCookie")
+ .value(data.webCookie!!)
+ .domain("eregister.example.com")
+ .secure().httpOnly().build()
+ ))
onSuccess()
}
else {
- data.app.cookieJar.clear("eregister.example.com")
+ data.app.cookieJar.clearForDomain("eregister.example.com")
if (/*data.webLogin != null && data.webPassword != null && */true) {
loginWithCredentials()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/DataVulcan.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/DataVulcan.kt
index 4b397f5d..50c2e886 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/DataVulcan.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/DataVulcan.kt
@@ -10,21 +10,13 @@ import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_VULCAN_API
import pl.szczodrzynski.edziennik.data.api.models.Data
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
import pl.szczodrzynski.edziennik.data.db.entity.Profile
-import pl.szczodrzynski.edziennik.data.db.entity.Team
import pl.szczodrzynski.edziennik.isNotNullNorEmpty
-import pl.szczodrzynski.edziennik.utils.Utils
-import pl.szczodrzynski.edziennik.values
class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app, profile, loginStore) {
- fun isWebMainLoginValid() = webExpiryTime-30 > currentTimeUnix()
- && webAuthCookie.isNotNullNorEmpty()
- && webHost.isNotNullNorEmpty()
- && webType.isNotNullNorEmpty()
- && symbol.isNotNullNorEmpty()
fun isApiLoginValid() = currentSemesterEndDate-30 > currentTimeUnix()
- && apiFingerprint[symbol].isNotNullNorEmpty()
- && apiPrivateKey[symbol].isNotNullNorEmpty()
+ && apiCertificateKey.isNotNullNorEmpty()
+ && apiCertificatePrivate.isNotNullNorEmpty()
&& symbol.isNotNullNorEmpty()
override fun satisfyLoginMethods() {
@@ -34,26 +26,7 @@ class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
}
}
- init {
- // during the first sync `profile.studentClassName` is already set
- if (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() = "$schoolName:$studentId"
/**
* A UONET+ client symbol.
@@ -64,8 +37,8 @@ class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
*/
private var mSymbol: String? = null
var symbol: String?
- get() { mSymbol = mSymbol ?: profile?.getStudentData("symbol", null); return mSymbol }
- set(value) { profile?.putStudentData("symbol", value); mSymbol = value }
+ get() { mSymbol = mSymbol ?: loginStore.getLoginData("deviceSymbol", null); return mSymbol }
+ set(value) { loginStore.putLoginData("deviceSymbol", value); mSymbol = value }
/**
* Group symbol/number of the student's school.
@@ -80,26 +53,16 @@ class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
set(value) { profile?.putStudentData("schoolSymbol", value) ?: return; mSchoolSymbol = value }
/**
- * Short name of the school, used in some places.
- *
- * ListaUczniow/JednostkaSprawozdawczaSkrot, e.g. "SP Wilkow"
- */
- private var mSchoolShort: String? = null
- var schoolShort: String?
- get() { mSchoolShort = mSchoolShort ?: profile?.getStudentData("schoolShort", null); return mSchoolShort }
- set(value) { profile?.putStudentData("schoolShort", value) ?: return; mSchoolShort = value }
-
- /**
- * A school code consisting of the [symbol] and [schoolSymbol].
+ * A school ID consisting of the [symbol] and [schoolSymbol].
*
* [symbol]_[schoolSymbol]
*
* e.g. "poznan_000088"
*/
- private var mSchoolCode: String? = null
- var schoolCode: String?
- get() { mSchoolCode = mSchoolCode ?: profile?.getStudentData("schoolName", null); return mSchoolCode }
- set(value) { profile?.putStudentData("schoolName", value) ?: return; mSchoolCode = value }
+ private var mSchoolName: String? = null
+ var schoolName: String?
+ get() { mSchoolName = mSchoolName ?: profile?.getStudentData("schoolName", null); return mSchoolName }
+ set(value) { profile?.putStudentData("schoolName", value) ?: return; mSchoolName = value }
/**
* ID of the student.
@@ -139,15 +102,6 @@ class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
get() { mStudentSemesterId = mStudentSemesterId ?: profile?.getStudentData("studentSemesterId", 0); return mStudentSemesterId ?: 0 }
set(value) { profile?.putStudentData("studentSemesterId", value) ?: return; mStudentSemesterId = value }
- private var mSemester1Id: Int? = null
- var semester1Id: Int
- get() { mSemester1Id = mSemester1Id ?: profile?.getStudentData("semester1Id", 0); return mSemester1Id ?: 0 }
- set(value) { profile?.putStudentData("semester1Id", value) ?: return; mSemester1Id = value }
- private var mSemester2Id: Int? = null
- var semester2Id: Int
- get() { mSemester2Id = mSemester2Id ?: profile?.getStudentData("semester2Id", 0); return mSemester2Id ?: 0 }
- set(value) { profile?.putStudentData("semester2Id", value) ?: return; mSemester2Id = value }
-
/**
* ListaUczniow/OkresNumer, e.g. 1 or 2
*/
@@ -178,34 +132,45 @@ class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
* After first login only 3 first characters are stored here.
* This is later used to determine the API URL address.
*/
- private var mApiToken: Map? = null
- var apiToken: Map = mapOf()
- get() { mApiToken = mApiToken ?: loginStore.getLoginData("apiToken", null)?.let { app.gson.fromJson(it, field.toMutableMap()::class.java) }; return mApiToken ?: mapOf() }
- set(value) { loginStore.putLoginData("apiToken", app.gson.toJson(value)); mApiToken = value }
+ private var mApiToken: String? = null
+ var apiToken: String?
+ get() { mApiToken = mApiToken ?: loginStore.getLoginData("deviceToken", null); return mApiToken }
+ set(value) { loginStore.putLoginData("deviceToken", value); mApiToken = value }
/**
* A mobile API registration PIN.
*
* After first login, this is removed and/or set to null.
*/
- private var mApiPin: Map? = null
- var apiPin: Map = 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 }
+ private var mApiPin: String? = null
+ var apiPin: String?
+ get() { mApiPin = mApiPin ?: loginStore.getLoginData("devicePin", null); return mApiPin }
+ set(value) { loginStore.putLoginData("devicePin", value); mApiPin = value }
- private var mApiFingerprint: Map? = null
- var apiFingerprint: Map = mapOf()
- get() { mApiFingerprint = mApiFingerprint ?: loginStore.getLoginData("apiFingerprint", null)?.let { app.gson.fromJson(it, field.toMutableMap()::class.java) }; return mApiFingerprint ?: mapOf() }
- set(value) { loginStore.putLoginData("apiFingerprint", app.gson.toJson(value)); mApiFingerprint = value }
+ private var mApiCertificateKey: String? = null
+ var apiCertificateKey: String?
+ get() { mApiCertificateKey = mApiCertificateKey ?: loginStore.getLoginData("certificateKey", null); return mApiCertificateKey }
+ set(value) { loginStore.putLoginData("certificateKey", value); mApiCertificateKey = value }
- private var mApiPrivateKey: Map? = null
- var apiPrivateKey: Map = mapOf()
- get() { mApiPrivateKey = mApiPrivateKey ?: loginStore.getLoginData("apiPrivateKey", null)?.let { app.gson.fromJson(it, field.toMutableMap()::class.java) }; return mApiPrivateKey ?: mapOf() }
- set(value) { loginStore.putLoginData("apiPrivateKey", app.gson.toJson(value)); mApiPrivateKey = value }
+ /**
+ * This is not meant for normal usage.
+ *
+ * It provides a backward compatibility (<4.0) in order
+ * to migrate and use private keys instead of PFX.
+ */
+ private var mApiCertificatePfx: String? = null
+ var apiCertificatePfx: String?
+ get() { mApiCertificatePfx = mApiCertificatePfx ?: loginStore.getLoginData("certificatePfx", null); return mApiCertificatePfx }
+ set(value) { loginStore.putLoginData("certificatePfx", value); mApiCertificatePfx = value }
+
+ private var mApiCertificatePrivate: String? = null
+ var apiCertificatePrivate: String?
+ get() { mApiCertificatePrivate = mApiCertificatePrivate ?: loginStore.getLoginData("certificatePrivate", null); return mApiCertificatePrivate }
+ set(value) { loginStore.putLoginData("certificatePrivate", value); mApiCertificatePrivate = value }
val apiUrl: String?
get() {
- val url = when (apiToken[symbol]?.substring(0, 3)) {
+ val url = when (apiToken?.substring(0, 3)) {
"3S1" -> "https://lekcjaplus.vulcan.net.pl"
"TA1" -> "https://uonetplus-komunikacja.umt.tarnow.pl"
"OP1" -> "https://uonetplus-komunikacja.eszkola.opolskie.pl"
@@ -223,102 +188,11 @@ class DataVulcan(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
"SZ9" -> "http://hack.szkolny.eu"
else -> null
}
- return if (url != null) "$url/$symbol/" else loginStore.getLoginData("apiUrl", null)
+ return if (url != null) "$url/$symbol" else loginStore.getLoginData("apiUrl", null)
}
val fullApiUrl: String?
get() {
- return "$apiUrl$schoolSymbol/"
+ return "$apiUrl/$schoolSymbol"
}
-
- /* __ __ _ ______ _____ _ _
- \ \ / / | | | ____/ ____| | | (_)
- \ \ /\ / /__| |__ | |__ | (___ | | ___ __ _ _ _ __
- \ \/ \/ / _ \ '_ \ | __| \___ \ | | / _ \ / _` | | '_ \
- \ /\ / __/ |_) | | | ____) | | |___| (_) | (_| | | | | |
- \/ \/ \___|_.__/ |_| |_____/ |______\___/ \__, |_|_| |_|
- __/ |
- |__*/
- /**
- * Federation Services login type.
- * This might be one of: cufs, adfs, adfslight.
- */
- var webType: String?
- get() { mWebType = mWebType ?: loginStore.getLoginData("webType", null); return mWebType }
- set(value) { loginStore.putLoginData("webType", value); mWebType = value }
- private var mWebType: String? = null
-
- /**
- * Web server providing the federation services login.
- * If this is present, WEB_MAIN login is considered as available.
- */
- var webHost: String?
- get() { mWebHost = mWebHost ?: loginStore.getLoginData("webHost", null); return mWebHost }
- set(value) { loginStore.putLoginData("webHost", value); mWebHost = value }
- private var mWebHost: String? = null
-
- /**
- * An ID used in ADFS & ADFSLight login types.
- */
- var webAdfsId: String?
- get() { mWebAdfsId = mWebAdfsId ?: loginStore.getLoginData("webAdfsId", null); return mWebAdfsId }
- set(value) { loginStore.putLoginData("webAdfsId", value); mWebAdfsId = value }
- private var mWebAdfsId: String? = null
-
- /**
- * A domain override for ADFS Light.
- */
- var webAdfsDomain: String?
- get() { mWebAdfsDomain = mWebAdfsDomain ?: loginStore.getLoginData("webAdfsDomain", null); return mWebAdfsDomain }
- set(value) { loginStore.putLoginData("webAdfsDomain", value); mWebAdfsDomain = value }
- private var mWebAdfsDomain: String? = null
-
- var webIsHttpCufs: Boolean
- get() { mWebIsHttpCufs = mWebIsHttpCufs ?: loginStore.getLoginData("webIsHttpCufs", false); return mWebIsHttpCufs ?: false }
- set(value) { loginStore.putLoginData("webIsHttpCufs", value); mWebIsHttpCufs = value }
- private var mWebIsHttpCufs: Boolean? = null
-
- var webIsScopedAdfs: Boolean
- get() { mWebIsScopedAdfs = mWebIsScopedAdfs ?: loginStore.getLoginData("webIsScopedAdfs", false); return mWebIsScopedAdfs ?: false }
- set(value) { loginStore.putLoginData("webIsScopedAdfs", value); mWebIsScopedAdfs = value }
- private var mWebIsScopedAdfs: Boolean? = null
-
- var webEmail: String?
- get() { mWebEmail = mWebEmail ?: loginStore.getLoginData("webEmail", null); return mWebEmail }
- set(value) { loginStore.putLoginData("webEmail", value); mWebEmail = value }
- private var mWebEmail: String? = null
- var webUsername: String?
- get() { mWebUsername = mWebUsername ?: loginStore.getLoginData("webUsername", null); return mWebUsername }
- set(value) { loginStore.putLoginData("webUsername", value); mWebUsername = value }
- private var mWebUsername: String? = null
- var webPassword: String?
- get() { mWebPassword = mWebPassword ?: loginStore.getLoginData("webPassword", null); return mWebPassword }
- set(value) { loginStore.putLoginData("webPassword", value); mWebPassword = value }
- private var mWebPassword: String? = null
-
- /**
- * Expiry time of a certificate POSTed to a LoginEndpoint of the specific symbol.
- * If the time passes, the certificate needs to be POSTed again (if valid)
- * or re-generated.
- */
- var webExpiryTime: Long
- get() { mWebExpiryTime = mWebExpiryTime ?: profile?.getStudentData("webExpiryTime", 0L); return mWebExpiryTime ?: 0L }
- set(value) { profile?.putStudentData("webExpiryTime", value); mWebExpiryTime = value }
- private var mWebExpiryTime: Long? = null
-
- /**
- * EfebSsoAuthCookie retrieved after posting a certificate
- */
- var webAuthCookie: String?
- get() { mWebAuthCookie = mWebAuthCookie ?: profile?.getStudentData("webAuthCookie", null); return mWebAuthCookie }
- set(value) { profile?.putStudentData("webAuthCookie", value); mWebAuthCookie = value }
- private var mWebAuthCookie: String? = null
-
- /**
- * Permissions needed to get JSONs from home page
- */
- var webPermissions: String?
- get() { mWebPermissions = mWebPermissions ?: profile?.getStudentData("webPermissions", null); return mWebPermissions }
- set(value) { profile?.putStudentData("webPermissions", value); mWebPermissions = value }
- private var mWebPermissions: String? = null
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt
index 9761343c..512fae0d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt
@@ -5,31 +5,26 @@
package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan
import com.google.gson.JsonObject
-import org.greenrobot.eventbus.EventBus
import pl.szczodrzynski.edziennik.App
-import pl.szczodrzynski.edziennik.data.api.*
-import pl.szczodrzynski.edziennik.data.api.edziennik.helper.OneDriveDownloadAttachment
+import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_VULCAN_API
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.firstlogin.VulcanFirstLogin
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.EventGetEvent
-import pl.szczodrzynski.edziennik.data.api.events.MessageGetEvent
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface
import pl.szczodrzynski.edziennik.data.api.models.ApiError
+import pl.szczodrzynski.edziennik.data.api.prepare
+import pl.szczodrzynski.edziennik.data.api.prepareFor
+import pl.szczodrzynski.edziennik.data.api.vulcanLoginMethods
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
+import pl.szczodrzynski.edziennik.data.db.entity.Message
import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
-import pl.szczodrzynski.edziennik.utils.Utils
import pl.szczodrzynski.edziennik.utils.Utils.d
-import java.io.File
class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, val callback: EdziennikCallback) : EdziennikInterface {
companion object {
@@ -60,9 +55,9 @@ class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, va
|_| |_| |_|\___| /_/ \_\_|\__, |\___/|_| |_|\__|_| |_|_| |_| |_|
__/ |
|__*/
- override fun sync(featureIds: List, viewId: Int?, onlyEndpoints: List?, arguments: JsonObject?) {
+ override fun sync(featureIds: List, viewId: Int?, arguments: JsonObject?) {
data.arguments = arguments
- data.prepare(vulcanLoginMethods, VulcanFeatures, featureIds, viewId, onlyEndpoints)
+ data.prepare(vulcanLoginMethods, VulcanFeatures, featureIds, viewId)
login()
}
@@ -92,29 +87,8 @@ class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, va
override fun getMessage(message: MessageFull) {
login(LOGIN_METHOD_VULCAN_API) {
- if (message.attachmentIds != null) {
- VulcanApiMessagesChangeStatus(data, message) {
- completed()
- }
- return@login
- }
- val list = data.app.db.messageDao().getAllNow(data.profileId)
- VulcanApiAttachments(data, list, message, MessageFull::class) { _ ->
- list.forEach {
- if (it.attachmentIds == null)
- it.attachmentIds = mutableListOf()
- data.messageList.add(it)
- }
- data.messageListReplace = true
-
- if (message.seen) {
- EventBus.getDefault().postSticky(MessageGetEvent(message))
- completed()
- return@VulcanApiAttachments
- }
- VulcanApiMessagesChangeStatus(data, message) {
- completed()
- }
+ VulcanApiMessagesChangeStatus(data, message) {
+ completed()
}
}
}
@@ -127,67 +101,20 @@ class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, va
}
}
- override fun markAllAnnouncementsAsRead() {}
- override fun getAnnouncement(announcement: AnnouncementFull) {}
- override fun getRecipientList() {}
+ override fun markAllAnnouncementsAsRead() {
- override fun getAttachment(owner: Any, attachmentId: Long, attachmentName: String) {
- val fileUrl = attachmentName.substringAfter(":")
- if (attachmentName == fileUrl) {
- data.error(ApiError(TAG, ERROR_ONEDRIVE_DOWNLOAD))
- return
- }
-
- OneDriveDownloadAttachment(
- app,
- fileUrl,
- onSuccess = { file ->
- val event = AttachmentGetEvent(
- data.profileId,
- owner,
- attachmentId,
- AttachmentGetEvent.TYPE_FINISHED,
- file.absolutePath
- )
-
- val attachmentDataFile = File(Utils.getStorageDir(), ".${data.profileId}_${event.ownerId}_${event.attachmentId}")
- Utils.writeStringToFile(attachmentDataFile, event.fileName)
-
- EventBus.getDefault().postSticky(event)
-
- completed()
- },
- onProgress = { written, _ ->
- val event = AttachmentGetEvent(
- data.profileId,
- owner,
- attachmentId,
- AttachmentGetEvent.TYPE_PROGRESS,
- bytesWritten = written
- )
-
- EventBus.getDefault().postSticky(event)
- },
- onError = { apiError ->
- data.error(apiError)
- }
- )
}
- override fun getEvent(eventFull: EventFull) {
- 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
+ override fun getAnnouncement(announcement: AnnouncementFull) {
+
+ }
+
+ override fun getAttachment(message: Message, attachmentId: Long, attachmentName: String) {
+
+ }
+
+ override fun getRecipientList() {
- EventBus.getDefault().postSticky(EventGetEvent(eventFull))
- completed()
- }
- }
}
override fun firstLogin() { VulcanFirstLogin(data) { completed() } }
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/VulcanFeatures.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/VulcanFeatures.kt
index ab032e0c..859d7f20 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/VulcanFeatures.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/VulcanFeatures.kt
@@ -8,7 +8,6 @@ import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.api.models.Feature
const val ENDPOINT_VULCAN_API_UPDATE_SEMESTER = 1000
-const val ENDPOINT_VULCAN_API_PUSH_CONFIG = 1005
const val ENDPOINT_VULCAN_API_DICTIONARIES = 1010
const val ENDPOINT_VULCAN_API_TIMETABLE = 1020
const val ENDPOINT_VULCAN_API_EVENTS = 1030
@@ -19,7 +18,6 @@ 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
val VulcanFeatures = listOf(
// timetable
@@ -55,20 +53,6 @@ val VulcanFeatures = listOf(
ENDPOINT_VULCAN_API_MESSAGES_SENT to LOGIN_METHOD_VULCAN_API
), listOf(LOGIN_METHOD_VULCAN_API)),
- // 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)
- },
-
- /**
- * Lucky number - using WEB Main.
- */
- Feature(LOGIN_TYPE_VULCAN, FEATURE_LUCKY_NUMBER, listOf(
- ENDPOINT_VULCAN_WEB_LUCKY_NUMBERS to LOGIN_METHOD_VULCAN_WEB_MAIN
- ), listOf(LOGIN_METHOD_VULCAN_WEB_MAIN)).withShouldSync { data -> data.shouldSyncLuckyNumber() },
-
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
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanApi.kt
index c500e3e7..95110f82 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanApi.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanApi.kt
@@ -13,6 +13,8 @@ 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.data.db.entity.Team
+import pl.szczodrzynski.edziennik.utils.Utils
import pl.szczodrzynski.edziennik.utils.Utils.d
import java.net.HttpURLConnection
import java.util.*
@@ -36,10 +38,26 @@ open class VulcanApi(open val data: DataVulcan, open val lastSync: Long?) {
baseUrl: Boolean = false,
onSuccess: (json: JsonObject, response: Response?) -> Unit
) {
- val url = "${if (baseUrl) data.apiUrl else data.fullApiUrl}$endpoint"
+ val url = "${if (baseUrl) data.apiUrl else data.fullApiUrl}/$endpoint"
d(tag, "Request: Vulcan/Api - $url")
+ if (data.teamList.size() == 0) {
+ data.profile?.studentClassName?.also { name ->
+ val id = Utils.crc16(name.toByteArray()).toLong()
+
+ val teamObject = Team(
+ profileId,
+ id,
+ name,
+ Team.TYPE_CLASS,
+ "${data.schoolName}:$name",
+ -1
+ )
+ data.teamList.put(id, teamObject)
+ }
+ }
+
val finalPayload = JsonObject()
parameters.map { (name, value) ->
when (value) {
@@ -50,7 +68,6 @@ open class VulcanApi(open val data: DataVulcan, open val lastSync: Long?) {
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)
@@ -106,11 +123,11 @@ open class VulcanApi(open val data: DataVulcan, open val lastSync: Long?) {
Request.builder()
.url(url)
.userAgent(VULCAN_API_USER_AGENT)
- .addHeader("RequestCertificateKey", data.apiFingerprint[data.symbol])
+ .addHeader("RequestCertificateKey", data.apiCertificateKey)
.addHeader("RequestSignatureValue",
try {
signContent(
- data.apiPrivateKey[data.symbol] ?: "",
+ data.apiCertificatePrivate ?: "",
finalPayload.toString()
)
} catch (e: Exception) {e.printStackTrace();""})
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanData.kt
index 491e8ea6..5035fcc9 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanData.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanData.kt
@@ -7,7 +7,6 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data
import pl.szczodrzynski.edziennik.R
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.web.VulcanWebLuckyNumber
import pl.szczodrzynski.edziennik.utils.Utils
class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) {
@@ -28,25 +27,21 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) {
onSuccess()
return
}
- val id = data.targetEndpointIds.firstKey()
- val lastSync = data.targetEndpointIds.remove(id)
- useEndpoint(id, lastSync) { endpointId ->
+ useEndpoint(data.targetEndpointIds.firstKey()) { endpointId ->
+ data.targetEndpointIds.remove(endpointId)
data.progress(data.progressStep)
nextEndpoint(onSuccess)
}
}
- private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) {
+ private fun useEndpoint(endpointId: Int, onSuccess: (endpointId: Int) -> Unit) {
+ val lastSync = data.targetEndpointIds[endpointId]
Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync")
when (endpointId) {
ENDPOINT_VULCAN_API_UPDATE_SEMESTER -> {
data.startProgress(R.string.edziennik_progress_endpoint_student_info)
VulcanApiUpdateSemester(data, lastSync, onSuccess)
}
- ENDPOINT_VULCAN_API_PUSH_CONFIG -> {
- data.startProgress(R.string.edziennik_progress_endpoint_push_config)
- VulcanApiPushConfig(data, lastSync, onSuccess)
- }
ENDPOINT_VULCAN_API_DICTIONARIES -> {
data.startProgress(R.string.edziennik_progress_endpoint_dictionaries)
VulcanApiDictionaries(data, lastSync, onSuccess)
@@ -87,10 +82,6 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) {
data.startProgress(R.string.edziennik_progress_endpoint_messages_outbox)
VulcanApiMessagesSent(data, lastSync, onSuccess)
}
- ENDPOINT_VULCAN_WEB_LUCKY_NUMBERS -> {
- data.startProgress(R.string.edziennik_progress_endpoint_lucky_number)
- VulcanWebLuckyNumber(data, lastSync, onSuccess)
- }
else -> onSuccess(endpointId)
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt
deleted file mode 100644
index 39433657..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/VulcanWebMain.kt
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-4-17.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data
-
-import com.google.gson.JsonArray
-import com.google.gson.JsonObject
-import com.google.gson.JsonParser
-import im.wangchao.mhttp.Request
-import im.wangchao.mhttp.Response
-import im.wangchao.mhttp.callback.TextCallbackHandler
-import pl.droidsonroids.jspoon.Jspoon
-import pl.szczodrzynski.edziennik.data.api.*
-import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
-import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.CufsCertificate
-import pl.szczodrzynski.edziennik.data.api.models.ApiError
-import pl.szczodrzynski.edziennik.get
-import pl.szczodrzynski.edziennik.isNotNullNorBlank
-import pl.szczodrzynski.edziennik.utils.Utils
-import pl.szczodrzynski.edziennik.utils.models.Date
-import java.io.File
-import java.net.HttpURLConnection
-
-open class VulcanWebMain(open val data: DataVulcan, open val lastSync: Long?) {
- companion object {
- const val TAG = "VulcanWebMain"
- const val WEB_MAIN = 0
- const val WEB_OLD = 1
- const val WEB_NEW = 2
- const val WEB_MESSAGES = 3
- const val STATE_SUCCESS = 0
- const val STATE_NO_REGISTER = 1
- const val STATE_LOGGED_OUT = 2
- }
-
- val profileId
- get() = data.profile?.id ?: -1
-
- val profile
- get() = data.profile
-
- private val certificateAdapter by lazy {
- Jspoon.create().adapter(CufsCertificate::class.java)
- }
-
- fun saveCertificate(xml: String) {
- val file = File(data.app.filesDir, "cert_"+(data.webUsername ?: data.webEmail)+".xml")
- file.writeText(xml)
- }
-
- fun readCertificate(): String? {
- val file = File(data.app.filesDir, "cert_"+(data.webUsername ?: data.webEmail)+".xml")
- if (file.canRead())
- return file.readText()
- return null
- }
-
- fun parseCertificate(xml: String): CufsCertificate {
- val xmlParsed = xml
- .replace("<[a-z]+?:".toRegex(), "<")
- .replace("[a-z]+?:".toRegex(), "")
- .replace("\\sxmlns.*?=\".+?\"".toRegex(), "")
-
- return certificateAdapter.fromHtml(xmlParsed).also {
- it.xml = xml
- }
- }
-
- fun postCertificate(certificate: CufsCertificate, symbol: String, onResult: (symbol: String, state: Int) -> Unit): Boolean {
- // check if the certificate is valid
- if (Date.fromIso(certificate.expiryDate) < System.currentTimeMillis())
- return false
-
- val callback = object : TextCallbackHandler() {
- override fun onSuccess(text: String?, response: Response?) {
- if (response?.headers()?.get("Location")?.contains("LoginEndpoint.aspx") == true
- || response?.headers()?.get("Location")?.contains("?logout=true") == true) {
- onResult(symbol, STATE_LOGGED_OUT)
- return
- }
- if (text?.contains("LoginEndpoint.aspx?logout=true") == true) {
- onResult(symbol, STATE_NO_REGISTER)
- return
- }
- if (!validateCallback(text, response, jsonResponse = false)) {
- return
- }
- data.webExpiryTime = Date.fromIso(certificate.expiryDate) / 1000L
- onResult(symbol, STATE_SUCCESS)
- }
-
- override fun onFailure(response: Response?, throwable: Throwable?) {
- data.error(ApiError(TAG, ERROR_REQUEST_FAILURE)
- .withResponse(response)
- .withThrowable(throwable))
- }
- }
-
- Request.builder()
- .url("https://uonetplus.${data.webHost}/$symbol/LoginEndpoint.aspx")
- .withClient(data.app.httpLazy)
- .userAgent(SYSTEM_USER_AGENT)
- .post()
- .addParameter("wa", "wsignin1.0")
- .addParameter("wctx", certificate.targetUrl)
- .addParameter("wresult", certificate.xml)
- .allowErrorCode(HttpURLConnection.HTTP_BAD_REQUEST)
- .allowErrorCode(HttpURLConnection.HTTP_FORBIDDEN)
- .allowErrorCode(HttpURLConnection.HTTP_UNAUTHORIZED)
- .allowErrorCode(HttpURLConnection.HTTP_UNAVAILABLE)
- .allowErrorCode(429)
- .callback(callback)
- .build()
- .enqueue()
-
- return true
- }
-
- fun getStartPage(symbol: String = data.symbol ?: "default", postErrors: Boolean = true, onSuccess: (html: String, schoolSymbols: List) -> Unit) {
- val callback = object : TextCallbackHandler() {
- override fun onSuccess(text: String?, response: Response?) {
- if (!validateCallback(text, response, jsonResponse = false) || text == null) {
- return
- }
-
- if (postErrors) {
- when {
- text.contains("status absolwenta") -> ERROR_VULCAN_WEB_GRADUATE_ACCOUNT
- else -> null
- }?.let { errorCode ->
- data.error(ApiError(TAG, errorCode)
- .withResponse(response)
- .withApiResponse(text))
- return
- }
- }
-
- data.webPermissions = Regexes.VULCAN_WEB_PERMISSIONS.find(text)?.let { it[1] }
-
- val schoolSymbols = mutableListOf()
- val clientUrl = "://uonetplus-uczen.${data.webHost}/$symbol/"
- var clientIndex = text.indexOf(clientUrl)
- var count = 0
- while (clientIndex != -1 && count < 100) {
- val startIndex = clientIndex + clientUrl.length
- val endIndex = text.indexOf('/', startIndex = startIndex)
- val schoolSymbol = text.substring(startIndex, endIndex)
- schoolSymbols += schoolSymbol
- clientIndex = text.indexOf(clientUrl, startIndex = endIndex)
- count++
- }
- schoolSymbols.removeAll {
- it.toLowerCase() == "default"
- || !it.matches(Regexes.VULCAN_WEB_SYMBOL_VALIDATE)
- }
-
- if (postErrors && schoolSymbols.isEmpty()) {
- data.error(ApiError(TAG, ERROR_VULCAN_WEB_NO_SCHOOLS)
- .withResponse(response)
- .withApiResponse(text))
- return
- }
-
- onSuccess(text, schoolSymbols)
- }
-
- override fun onFailure(response: Response?, throwable: Throwable?) {
- data.error(ApiError(TAG, ERROR_REQUEST_FAILURE)
- .withResponse(response)
- .withThrowable(throwable))
- }
- }
-
- Request.builder()
- .url("https://uonetplus.${data.webHost}/$symbol/Start.mvc/Index")
- .userAgent(SYSTEM_USER_AGENT)
- .get()
- .allowErrorCode(HttpURLConnection.HTTP_BAD_REQUEST)
- .allowErrorCode(HttpURLConnection.HTTP_FORBIDDEN)
- .allowErrorCode(HttpURLConnection.HTTP_UNAUTHORIZED)
- .allowErrorCode(HttpURLConnection.HTTP_UNAVAILABLE)
- .allowErrorCode(429)
- .callback(callback)
- .build()
- .enqueue()
- }
-
- private fun validateCallback(text: String?, response: Response?, jsonResponse: Boolean = true): Boolean {
- if (text == null) {
- data.error(ApiError(TAG, ERROR_RESPONSE_EMPTY)
- .withResponse(response))
- return false
- }
-
- if (response?.code() !in 200..302 || (jsonResponse && !text.startsWith("{"))) {
- when {
- text.contains("The custom error module") -> ERROR_VULCAN_WEB_429
- else -> ERROR_VULCAN_WEB_OTHER
- }.let { errorCode ->
- data.error(ApiError(TAG, errorCode)
- .withApiResponse(text)
- .withResponse(response))
- return false
- }
- }
-
- val cookies = data.app.cookieJar.getAll(data.webHost ?: "vulcan.net.pl")
- val authCookie = cookies["EfebSsoAuthCookie"]
- if ((authCookie == null || authCookie == "null") && data.webAuthCookie != null) {
- data.app.cookieJar.set(data.webHost ?: "vulcan.net.pl", "EfebSsoAuthCookie", data.webAuthCookie)
- }
- else if (authCookie.isNotNullNorBlank() && authCookie != "null" && authCookie != data.webAuthCookie) {
- data.webAuthCookie = authCookie
- }
- return true
- }
-
- fun webGetJson(
- tag: String,
- webType: Int,
- endpoint: String,
- method: Int = POST,
- parameters: Map = emptyMap(),
- onSuccess: (json: JsonObject, response: Response?) -> Unit
- ) {
- val url = "https://" + when (webType) {
- WEB_MAIN -> "uonetplus"
- WEB_OLD -> "uonetplus-opiekun"
- WEB_NEW -> "uonetplus-uczen"
- WEB_MESSAGES -> "uonetplus-uzytkownik"
- else -> "uonetplus"
- } + ".${data.webHost}/${data.symbol}/$endpoint"
-
- Utils.d(tag, "Request: Vulcan/WebMain - $url")
-
- val payload = JsonObject()
- parameters.map { (name, value) ->
- when (value) {
- is JsonObject -> payload.add(name, value)
- is JsonArray -> payload.add(name, value)
- is String -> payload.addProperty(name, value)
- is Int -> payload.addProperty(name, value)
- is Long -> payload.addProperty(name, value)
- is Float -> payload.addProperty(name, value)
- is Char -> payload.addProperty(name, value)
- is Boolean -> payload.addProperty(name, value)
- }
- }
-
- val callback = object : TextCallbackHandler() {
- override fun onSuccess(text: String?, response: Response?) {
- if (!validateCallback(text, response))
- return
-
- try {
- val json = JsonParser().parse(text).asJsonObject
- onSuccess(json, response)
- } catch (e: Exception) {
- data.error(ApiError(tag, EXCEPTION_VULCAN_WEB_REQUEST)
- .withResponse(response)
- .withThrowable(e)
- .withApiResponse(text))
- }
- }
-
- override fun onFailure(response: Response?, throwable: Throwable?) {
- data.error(ApiError(tag, ERROR_REQUEST_FAILURE)
- .withResponse(response)
- .withThrowable(throwable))
- }
- }
-
- Request.builder()
- .url(url)
- .userAgent(SYSTEM_USER_AGENT)
- .apply {
- when (method) {
- GET -> get()
- POST -> post()
- }
- }
- .setJsonBody(payload)
- .allowErrorCode(429)
- .callback(callback)
- .build()
- .enqueue()
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttachments.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttachments.kt
deleted file mode 100644
index a7b2b23b..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttachments.kt
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-4-6.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api
-
-import pl.szczodrzynski.edziennik.asJsonObjectList
-import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_HOMEWORK_ATTACHMENTS
-import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_MESSAGES_ATTACHMENTS
-import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
-import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
-import pl.szczodrzynski.edziennik.data.db.full.MessageFull
-import pl.szczodrzynski.edziennik.getJsonArray
-import pl.szczodrzynski.edziennik.getLong
-import pl.szczodrzynski.edziennik.getString
-import pl.szczodrzynski.edziennik.utils.models.Date
-import kotlin.reflect.KClass
-
-class VulcanApiAttachments(override val data: DataVulcan,
- val list: List<*>,
- val owner: Any?,
- val ownerClass: KClass<*>,
- val onSuccess: (list: List<*>) -> Unit
-) : VulcanApi(data, null) {
- companion object {
- const val TAG = "VulcanApiAttachments"
- }
-
- init { run {
- val endpoint = when (ownerClass) {
- MessageFull::class -> VULCAN_API_ENDPOINT_MESSAGES_ATTACHMENTS
- EventFull::class -> VULCAN_API_ENDPOINT_HOMEWORK_ATTACHMENTS
- else -> null
- } ?: return@run
-
- val idName = when (ownerClass) {
- MessageFull::class -> "IdWiadomosc"
- EventFull::class -> "IdZadanieDomowe"
- else -> null
- } ?: return@run
-
- val startDate = profile?.getSemesterStart(profile?.currentSemester ?: 1)?.inUnix ?: 0
- val endDate = Date.getToday().stepForward(0, 1, 0).inUnix
-
- apiGet(TAG, endpoint, parameters = mapOf(
- "DataPoczatkowa" to startDate,
- "DataKoncowa" to endDate,
- "LoginId" to data.studentLoginId,
- "IdUczen" to data.studentId
- )) { json, _ ->
-
- json.getJsonArray("Data")?.asJsonObjectList()?.forEach { attachment ->
- val id = attachment.getLong("Id") ?: return@forEach
- val itemId = attachment.getLong(idName) ?: return@forEach
- val url = attachment.getString("Url") ?: return@forEach
- val fileName = "${attachment.getString("NazwaPliku")}:$url"
-
- list.forEach {
- if (it is MessageFull
- && it.profileId == profileId
- && it.id == itemId
- && it.attachmentIds?.contains(id) != true) {
- if (it.attachmentIds == null)
- it.attachmentIds = mutableListOf()
- if (it.attachmentNames == null)
- it.attachmentNames = mutableListOf()
- it.attachmentIds?.add(id)
- it.attachmentNames?.add(fileName)
- }
-
- if (it is EventFull
- && it.profileId == profileId
- && it.id == itemId
- && it.attachmentIds?.contains(id) != true) {
- if (it.attachmentIds == null)
- it.attachmentIds = mutableListOf()
- if (it.attachmentNames == null)
- it.attachmentNames = mutableListOf()
- it.attachmentIds?.add(id)
- it.attachmentNames?.add(fileName)
- }
-
- if (owner is MessageFull
- && it is MessageFull
- && owner.profileId == it.profileId
- && owner.id == it.id) {
- owner.attachmentIds = it.attachmentIds
- owner.attachmentNames = it.attachmentNames
- }
-
- if (owner is EventFull
- && it is EventFull
- && owner.profileId == it.profileId
- && owner.id == it.id) {
- owner.attachmentIds = it.attachmentIds
- owner.attachmentNames = it.attachmentNames
- }
- }
- }
-
- /*if (owner is MessageFull) {
- list.forEach {
- (it as? MessageFull)?.let { message ->
- data.messageList.add(message)
- }
- }
- data.messageListReplace = true
- }
-
- if (owner is EventFull) {
- list.forEach {
- (it as? EventFull)?.let { it1 ->
- it1.homeworkBody = ""
- data.eventList.add(it1)
- }
- }
- data.eventListReplace = true
- }*/
-
- onSuccess(list)
- }
- }}
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttendance.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttendance.kt
index 2814a1cf..2ec240a4 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttendance.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiAttendance.kt
@@ -7,9 +7,8 @@ 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.Attendance.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
@@ -26,85 +25,57 @@ class VulcanApiAttendance(override val data: DataVulcan,
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
+ val startDate: String = profile.getSemesterStart(profile.currentSemester).stringY_m_d
+ val endDate: String = profile.getSemesterEnd(profile.currentSemester).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
+ "IdOkresKlasyfikacyjny" to data.studentSemesterId
)) { json, _ ->
json.getJsonObject("Data")?.getJsonArray("Frekwencje")?.forEach { attendanceEl ->
val attendance = attendanceEl.asJsonObject
- val type = data.attendanceTypes.get(attendance.getLong("IdKategoria") ?: return@forEach)
+ val attendanceCategory = data.attendanceTypes.get(attendance.getLong("IdKategoria") ?: return@forEach)
?: return@forEach
+ val type = attendanceCategory.type
+
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 lessonSemester = profile.dateToSemester(lessonDate)
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
- }
+ profileId,
+ id.toLong(),
+ -1,
+ attendance.getLong("IdPrzedmiot") ?: -1,
+ lessonSemester,
+ attendance.getString("PrzedmiotNazwa") + attendanceCategory.name.let { " - $it" },
+ lessonDate,
+ data.lessonRanges.get(attendance.getInt("Numer") ?: 0)?.startTime,
+ type)
data.attendanceList.add(attendanceObject)
- if (type.baseType != TYPE_PRESENT) {
+ if (attendanceObject.type != 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
+ profile.empty,
+ profile.empty,
+ attendanceObject.lessonDate.combineWith(attendanceObject.startTime)
))
}
}
- onSuccess()
+ data.setSyncNext(ENDPOINT_VULCAN_API_ATTENDANCE, SYNC_ALWAYS)
+ onSuccess(ENDPOINT_VULCAN_API_ATTENDANCE)
}
- }
+ } ?: onSuccess(ENDPOINT_VULCAN_API_ATTENDANCE) }
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiDictionaries.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiDictionaries.kt
index 2dc9f6bc..76f53cf5 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiDictionaries.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiDictionaries.kt
@@ -114,11 +114,11 @@ class VulcanApiDictionaries(override val data: DataVulcan,
private fun saveAttendanceType(attendanceType: JsonObject) {
val id = attendanceType.getLong("Id") ?: return
- val typeName = attendanceType.getString("Nazwa") ?: ""
+ val name = attendanceType.getString("Nazwa") ?: ""
val absent = attendanceType.getBoolean("Nieobecnosc") ?: false
val excused = attendanceType.getBoolean("Usprawiedliwione") ?: false
- val baseType = if (absent) {
+ val type = if (absent) {
if (excused)
Attendance.TYPE_ABSENT_EXCUSED
else
@@ -137,35 +137,15 @@ class VulcanApiDictionaries(override val data: DataVulcan,
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)
+ Attendance.TYPE_CUSTOM
}
val attendanceTypeObject = AttendanceType(
profileId,
id,
- baseType,
- typeName,
- typeShort,
- typeSymbol,
- typeColor?.toInt()
+ name,
+ type,
+ -1
)
data.attendanceTypes.put(id, attendanceTypeObject)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiEvents.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiEvents.kt
index 6f045828..c55dac5d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiEvents.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiEvents.kt
@@ -13,7 +13,6 @@ 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
@@ -32,43 +31,11 @@ class VulcanApiEvents(override val data: DataVulcan,
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
+ val startDate: String = when (profile.empty) {
+ true -> profile.getSemesterStart(profile.currentSemester).stringY_m_d
else -> Date.getToday().stepForward(0, -1, 0).stringY_m_d
}
- val endDate = profile.getSemesterEnd(semesterNumber).stringY_m_d
+ val endDate: String = profile.getSemesterEnd(profile.currentSemester).stringY_m_d
val endpoint = when (isHomework) {
true -> VULCAN_API_ENDPOINT_HOMEWORK
@@ -79,7 +46,7 @@ class VulcanApiEvents(override val data: DataVulcan,
"DataKoncowa" to endDate,
"IdOddzial" to data.studentClassId,
"IdUczen" to data.studentId,
- "IdOkresKlasyfikacyjny" to semesterId
+ "IdOkresKlasyfikacyjny" to data.studentSemesterId
)) { json, _ ->
val events = json.getJsonArray("Data")
@@ -90,9 +57,9 @@ class VulcanApiEvents(override val data: DataVulcan,
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 topic = event.getString("Opis") ?: ""
- val lessonList = data.db.timetableDao().getAllForDateNow(profileId, eventDate)
+ val lessonList = data.db.timetableDao().getForDateNow(profileId, eventDate)
val startTime = lessonList.firstOrNull { it.subjectId == subjectId }?.startTime
val type = when (isHomework) {
@@ -105,16 +72,17 @@ class VulcanApiEvents(override val data: DataVulcan,
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
+ profileId,
+ id,
+ eventDate,
+ startTime,
+ topic,
+ -1,
+ type,
+ false,
+ teacherId,
+ subjectId,
+ teamId
)
data.eventList.add(eventObject)
@@ -123,11 +91,22 @@ class VulcanApiEvents(override val data: DataVulcan,
if (isHomework) Metadata.TYPE_HOMEWORK else Metadata.TYPE_EVENT,
id,
profile.empty,
- profile.empty
+ profile.empty,
+ System.currentTimeMillis()
))
}
- onSuccess()
+ 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)
}
- }
+ } ?: onSuccess(if (isHomework) ENDPOINT_VULCAN_API_HOMEWORK else ENDPOINT_VULCAN_API_EVENTS) }
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiGrades.kt
index 9a354ea5..e6b939d0 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiGrades.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiGrades.kt
@@ -11,9 +11,7 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_
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
@@ -28,33 +26,9 @@ class VulcanApiGrades(override val data: DataVulcan,
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
+ "IdOkresKlasyfikacyjny" to data.studentSemesterId
)) { json, _ ->
val grades = json.getJsonArray("Data")
@@ -114,20 +88,17 @@ class VulcanApiGrades(override val data: DataVulcan,
}.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
+ profileId,
+ id,
+ category,
+ color,
+ finalDescription,
+ name,
+ value ?: 0.0f,
+ weight,
+ data.studentSemesterNumber,
+ teacherId,
+ subjectId
)
data.gradeList.add(gradeObject)
@@ -136,11 +107,15 @@ class VulcanApiGrades(override val data: DataVulcan,
Metadata.TYPE_GRADE,
id,
profile.empty,
- profile.empty
+ profile.empty,
+ addedDate
+
))
}
- onSuccess()
+ data.toRemove.add(DataRemoveModel.Grades.semesterWithType(data.studentSemesterNumber, Grade.TYPE_NORMAL))
+ data.setSyncNext(ENDPOINT_VULCAN_API_GRADES, SYNC_ALWAYS)
+ onSuccess(ENDPOINT_VULCAN_API_GRADES)
}
- }
+ } ?: onSuccess(ENDPOINT_VULCAN_API_GRADES) }
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesChangeStatus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesChangeStatus.kt
index b0b7795d..3a72c963 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesChangeStatus.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesChangeStatus.kt
@@ -9,7 +9,7 @@ import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_MESSAGES_CHANGE_S
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.Message.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
@@ -37,7 +37,8 @@ class VulcanApiMessagesChangeStatus(override val data: DataVulcan,
Metadata.TYPE_MESSAGE,
messageObject.id,
true,
- true
+ true,
+ messageObject.addedDate
))
messageObject.seen = true
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesInbox.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesInbox.kt
index dea913c5..e78b157e 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesInbox.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesInbox.kt
@@ -10,7 +10,7 @@ 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.data.db.entity.Message.TYPE_RECEIVED
import pl.szczodrzynski.edziennik.utils.Utils
import pl.szczodrzynski.edziennik.utils.models.Date
import kotlin.text.replace
@@ -44,7 +44,8 @@ class VulcanApiMessagesInbox(override val data: DataVulcan,
val body = message.getString("Tresc") ?: ""
val senderLoginId = message.getString("NadawcaId") ?: return@forEach
- val senderId = data.teacherList.singleOrNull { it.loginId == senderLoginId }?.id ?: {
+ val senderId = data.teacherList
+ .singleOrNull { it.loginId == senderLoginId }?.id ?: {
val senderName = message.getString("Nadawca") ?: ""
@@ -59,7 +60,7 @@ class VulcanApiMessagesInbox(override val data: DataVulcan,
data.teacherList.put(teacherObject.id, teacherObject)
teacherObject.id
}
- }.invoke()
+ }.invoke() ?: -1
val sentDate = message.getLong("DataWyslaniaUnixEpoch")?.let { it * 1000 }
?: -1
@@ -67,13 +68,13 @@ class VulcanApiMessagesInbox(override val data: DataVulcan,
?: -1
val messageObject = Message(
- profileId = profileId,
- id = id,
- type = TYPE_RECEIVED,
- subject = subject,
- body = body.replace("\n", "
"),
- senderId = senderId,
- addedDate = sentDate
+ profileId,
+ id,
+ subject,
+ body.replace("\n", "
"),
+ TYPE_RECEIVED,
+ senderId,
+ -1
)
val messageRecipientObject = MessageRecipient(
@@ -84,14 +85,15 @@ class VulcanApiMessagesInbox(override val data: DataVulcan,
id
)
- data.messageList.add(messageObject)
+ data.messageIgnoreList.add(messageObject)
data.messageRecipientList.add(messageRecipientObject)
data.setSeenMetadataList.add(Metadata(
profileId,
Metadata.TYPE_MESSAGE,
id,
readDate > 0,
- readDate > 0
+ readDate > 0,
+ sentDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesSent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesSent.kt
index 94cfdcba..7437aab4 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesSent.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiMessagesSent.kt
@@ -11,7 +11,7 @@ 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.Message.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
@@ -92,22 +92,23 @@ class VulcanApiMessagesSent(override val data: DataVulcan,
}
val messageObject = Message(
- profileId = profileId,
- id = id,
- type = TYPE_SENT,
- subject = subject,
- body = body.replace("\n", "
"),
- senderId = null,
- addedDate = sentDate
+ profileId,
+ id,
+ subject,
+ body.replace("\n", "
"),
+ TYPE_SENT,
+ -1,
+ -1
)
- data.messageList.add(messageObject)
+ data.messageIgnoreList.add(messageObject)
data.setSeenMetadataList.add(Metadata(
profileId,
Metadata.TYPE_MESSAGE,
id,
true,
- true
+ true,
+ sentDate
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiNotices.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiNotices.kt
index 45155a5b..b2202981 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiNotices.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiNotices.kt
@@ -11,12 +11,12 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_
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
+import pl.szczodrzynski.edziennik.utils.models.Date
class VulcanApiNotices(override val data: DataVulcan,
override val lastSync: Long?,
@@ -31,29 +31,6 @@ class VulcanApiNotices(override val data: DataVulcan,
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
@@ -64,21 +41,15 @@ class VulcanApiNotices(override val data: DataVulcan,
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 addedDate = Date.fromY_m_d(notice.getString("DataWpisuTekst")).inMillis
val noticeObject = Notice(
- profileId = profileId,
- id = id,
- type = Notice.TYPE_NEUTRAL,
- semester = profile.currentSemester,
- text = text,
- category = categoryText,
- points = null,
- teacherId = teacherId,
- addedDate = addedDate
+ profileId,
+ id,
+ text,
+ profile.currentSemester,
+ Notice.TYPE_NEUTRAL,
+ teacherId
)
data.noticeList.add(noticeObject)
@@ -87,11 +58,13 @@ class VulcanApiNotices(override val data: DataVulcan,
Metadata.TYPE_NOTICE,
id,
profile.empty,
- profile.empty
+ profile.empty,
+ addedDate
))
}
- onSuccess()
+ data.setSyncNext(ENDPOINT_VULCAN_API_NOTICES, SYNC_ALWAYS)
+ onSuccess(ENDPOINT_VULCAN_API_NOTICES)
}
- }
+ } ?: onSuccess(ENDPOINT_VULCAN_API_NOTICES) }
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiProposedGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiProposedGrades.kt
index e897df92..e5c73cae 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiProposedGrades.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiProposedGrades.kt
@@ -8,12 +8,7 @@ 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
@@ -28,84 +23,61 @@ class VulcanApiProposedGrades(override val data: DataVulcan,
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
+ "IdOkresKlasyfikacyjny" to data.studentSemesterId
)) { json, _ ->
val grades = json.getJsonObject("Data")
grades.getJsonArray("OcenyPrzewidywane")?.let {
- processGradeList(it, semesterNumber, isFinal = false)
+ processGradeList(it, isFinal = false)
}
grades.getJsonArray("OcenyKlasyfikacyjne")?.let {
- processGradeList(it, semesterNumber, isFinal = true)
+ processGradeList(it, isFinal = true)
}
- onSuccess()
+ data.setSyncNext(ENDPOINT_VULCAN_API_GRADES_SUMMARY, 6*HOUR)
+ onSuccess(ENDPOINT_VULCAN_API_GRADES_SUMMARY)
}
- }
+ } ?: onSuccess(ENDPOINT_VULCAN_API_GRADES_SUMMARY) }
- private fun processGradeList(grades: JsonArray, semesterNumber: Int, isFinal: Boolean) {
- grades.asJsonObjectList().forEach { grade ->
+ private fun processGradeList(grades: JsonArray, 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 id = subjectId * -100 - data.studentSemesterNumber
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
+ profileId,
+ id,
+ "",
+ color,
+ "",
+ name,
+ value,
+ 0f,
+ data.studentSemesterNumber,
+ -1,
+ subjectId
)
-
+ if (data.studentSemesterNumber == 1) {
+ gradeObject.type = if (isFinal) Grade.TYPE_SEMESTER1_FINAL else Grade.TYPE_SEMESTER1_PROPOSED
+ } else {
+ gradeObject.type = if (isFinal) Grade.TYPE_SEMESTER2_FINAL else Grade.TYPE_SEMESTER2_PROPOSED
+ }
data.gradeList.add(gradeObject)
data.metadataList.add(Metadata(
profileId,
Metadata.TYPE_GRADE,
gradeObject.id,
data.profile?.empty ?: false,
- data.profile?.empty ?: false
+ data.profile?.empty ?: false,
+ System.currentTimeMillis()
))
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiPushConfig.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiPushConfig.kt
deleted file mode 100644
index b7e291e2..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiPushConfig.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-2-20.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.api
-
-import pl.szczodrzynski.edziennik.data.api.VULCAN_API_ENDPOINT_PUSH
-import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
-import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_API_PUSH_CONFIG
-import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanApi
-import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
-
-class VulcanApiPushConfig(override val data: DataVulcan,
- override val lastSync: Long?,
- val onSuccess: (endpointId: Int) -> Unit
-) : VulcanApi(data, lastSync) {
- companion object {
- const val TAG = "VulcanApiPushConfig"
- }
-
- init { data.app.config.sync.tokenVulcan?.also { tokenVulcan ->
- apiGet(TAG, VULCAN_API_ENDPOINT_PUSH, parameters = mapOf(
- "Token" to tokenVulcan,
- "IdUczen" to data.studentId,
- "PushOcena" to true,
- "PushFrekwencja" to true,
- "PushUwaga" to true,
- "PushWiadomosc" to true
- )) { _, _ ->
- // sync always: this endpoint has .shouldSync set
- data.setSyncNext(ENDPOINT_VULCAN_API_PUSH_CONFIG, SYNC_ALWAYS)
- data.app.config.sync.tokenVulcanList =
- data.app.config.sync.tokenVulcanList + profileId
- onSuccess(ENDPOINT_VULCAN_API_PUSH_CONFIG)
- }
- } ?: onSuccess(ENDPOINT_VULCAN_API_PUSH_CONFIG) }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiSendMessage.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiSendMessage.kt
index 8c89b620..c7f7b29e 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiSendMessage.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiSendMessage.kt
@@ -52,9 +52,9 @@ class VulcanApiSendMessage(override val data: DataVulcan,
}
VulcanApiMessagesSent(data, null) {
- val message = data.messageList.firstOrNull { it.type == Message.TYPE_SENT && it.subject == subject }
+ val message = data.messageIgnoreList.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)
+ val event = MessageSentEvent(data.profileId, message, metadata?.addedDate)
EventBus.getDefault().postSticky(event)
onSuccess()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiTimetable.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiTimetable.kt
index 46b52de5..ac621ec7 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiTimetable.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiTimetable.kt
@@ -80,42 +80,37 @@ class VulcanApiTimetable(override val data: DataVulcan,
id,
name,
Team.TYPE_VIRTUAL,
- "${data.schoolCode}:$name",
+ "${data.schoolName}:$name",
teacherId ?: oldTeacherId ?: -1
)
data.teamList[id] = team
}
team.id
- } ?: data.teamClass?.id ?: -1
+ } ?: data.studentClassId.toLong()
- val subjectId = lesson.getLong("IdPrzedmiot").let { id ->
- // get the specified subject name
- val subjectName = lesson.getString("PrzedmiotNazwa") ?: ""
+ val subjectId = lesson.getLong("IdPrzedmiot")?.let {
+ when (it) {
+ 0L -> {
+ 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 { subject -> subject.longName == subjectName }?.id
+ ?: {
+ /**
+ * CREATE A NEW SUBJECT IF IT DOESN'T EXIST
+ */
+
+ val subjectObject = Subject(
+ profileId,
+ -1 * crc16(subjectName.toByteArray()).toLong(),
+ subjectName,
+ subjectName
+ )
+ data.subjectList.put(subjectObject.id, subjectObject)
+ subjectObject.id
+ }.invoke()
+ }
+ else -> it
}
-
- 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 {
@@ -184,7 +179,8 @@ class VulcanApiTimetable(override val data: DataVulcan,
Metadata.TYPE_LESSON_CHANGE,
lessonObject.id,
seen,
- seen
+ seen,
+ System.currentTimeMillis()
))
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiUpdateSemester.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiUpdateSemester.kt
index 50fb178a..1f03484c 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiUpdateSemester.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/api/VulcanApiUpdateSemester.kt
@@ -60,7 +60,6 @@ class VulcanApiUpdateSemester(override val data: DataVulcan,
data.studentClassId = studentClassId
data.studentSemesterId = studentSemesterId
data.studentSemesterNumber = studentSemesterNumber
- data.profile.studentData["semester${studentSemesterNumber}Id"] = studentSemesterId
data.currentSemesterEndDate = currentSemesterEndDate
profile.studentClassName = studentClassName
dateSemester1Start?.let {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/web/HomepageTile.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/web/HomepageTile.kt
deleted file mode 100644
index 4d657ac7..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/web/HomepageTile.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-4-20.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.web
-
-import com.google.gson.annotations.SerializedName
-
-data class HomepageTile(
- @SerializedName("Nazwa")
- val name: String?,
- @SerializedName("Url")
- val url: String?,
- @SerializedName("Zawartosc")
- val children: List
-)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/web/VulcanWebLuckyNumber.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/web/VulcanWebLuckyNumber.kt
deleted file mode 100644
index cbf24c2a..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/data/web/VulcanWebLuckyNumber.kt
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-4-20.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.web
-
-import pl.szczodrzynski.edziennik.DAY
-import pl.szczodrzynski.edziennik.data.api.VULCAN_WEB_ENDPOINT_LUCKY_NUMBER
-import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
-import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.ENDPOINT_VULCAN_WEB_LUCKY_NUMBERS
-import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanWebMain
-import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber
-import pl.szczodrzynski.edziennik.data.db.entity.Metadata
-import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
-import pl.szczodrzynski.edziennik.getJsonArray
-import pl.szczodrzynski.edziennik.utils.models.Date
-import pl.szczodrzynski.edziennik.utils.models.Time
-import pl.szczodrzynski.edziennik.utils.models.Week
-
-class VulcanWebLuckyNumber(override val data: DataVulcan,
- override val lastSync: Long?,
- val onSuccess: (endpointId: Int) -> Unit
-) : VulcanWebMain(data, lastSync) {
- companion object {
- const val TAG = "VulcanWebLuckyNumber"
- }
-
- init {
- webGetJson(TAG, WEB_MAIN, VULCAN_WEB_ENDPOINT_LUCKY_NUMBER, parameters = mapOf(
- "permissions" to data.webPermissions
- )) { json, _ ->
- val tiles = json
- .getJsonArray("data")
- ?.mapNotNull { data.app.gson.fromJson(it.toString(), HomepageTile::class.java) }
- ?.flatMap { it.children }
-
- if (tiles == null) {
- data.setSyncNext(ENDPOINT_VULCAN_WEB_LUCKY_NUMBERS, SYNC_ALWAYS)
- onSuccess(ENDPOINT_VULCAN_WEB_LUCKY_NUMBERS)
- return@webGetJson
- }
-
- var nextSync = System.currentTimeMillis() + 1* DAY *1000
-
- tiles.firstOrNull { it.name == data.schoolShort }?.children?.firstOrNull()?.let { tile ->
- // "Szczęśliwy numer w dzienniku: 16"
- return@let tile.name?.substringAfterLast(' ')?.toIntOrNull()?.let { number ->
- // lucky number present
- val luckyNumberObject = LuckyNumber(
- profileId,
- Date.getToday(),
- number
- )
-
- data.luckyNumberList.add(luckyNumberObject)
- data.metadataList.add(
- Metadata(
- profileId,
- Metadata.TYPE_LUCKY_NUMBER,
- luckyNumberObject.date.value.toLong(),
- true,
- profile?.empty ?: false
- ))
- }
- } ?: {
- // no lucky number
- if (Date.getToday().weekDay <= Week.FRIDAY && Time.getNow().hour >= 22) {
- // working days, after 10PM
- // consider the lucky number is disabled; sync in 4 days
- nextSync = System.currentTimeMillis() + 4*DAY*1000
- }
- else if (Date.getToday().weekDay <= Week.FRIDAY && Time.getNow().hour < 22) {
- // working days, before 10PM
-
- }
- else {
- // weekends
- nextSync = Week.getNearestWeekDayDate(Week.MONDAY).combineWith(Time(5, 0, 0))
- }
- }()
-
- data.setSyncNext(ENDPOINT_VULCAN_WEB_LUCKY_NUMBERS, SYNC_ALWAYS)
- onSuccess(ENDPOINT_VULCAN_WEB_LUCKY_NUMBERS)
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/firstlogin/VulcanFirstLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/firstlogin/VulcanFirstLogin.kt
index ed541c69..291cb37b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/firstlogin/VulcanFirstLogin.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/firstlogin/VulcanFirstLogin.kt
@@ -6,15 +6,12 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.firstlogin
import org.greenrobot.eventbus.EventBus
import pl.szczodrzynski.edziennik.*
-import pl.szczodrzynski.edziennik.data.api.*
+import pl.szczodrzynski.edziennik.data.api.LOGIN_TYPE_VULCAN
+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.data.VulcanApi
-import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanWebMain
-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.VulcanLoginWebMain
import pl.szczodrzynski.edziennik.data.api.events.FirstLoginFinishedEvent
-import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.utils.models.Date
@@ -24,97 +21,19 @@ class VulcanFirstLogin(val data: DataVulcan, val onSuccess: () -> Unit) {
}
private val api = VulcanApi(data, null)
- private val web = VulcanWebMain(data, null)
private val profileList = mutableListOf()
- private val loginStoreId = data.loginStore.id
- private var firstProfileId = loginStoreId
- private val tryingSymbols = mutableListOf()
init {
- if (data.loginStore.mode == LOGIN_MODE_VULCAN_WEB) {
- VulcanLoginWebMain(data) {
- val xml = web.readCertificate() ?: run {
- data.error(ApiError(TAG, ERROR_VULCAN_WEB_NO_CERTIFICATE))
- return@VulcanLoginWebMain
- }
- val certificate = web.parseCertificate(xml)
+ val loginStoreId = data.loginStore.id
+ val loginStoreType = LOGIN_TYPE_VULCAN
+ var firstProfileId = loginStoreId
- if (data.symbol != null && data.symbol != "default") {
- tryingSymbols += data.symbol ?: "default"
- }
- else {
-
- tryingSymbols += certificate.userInstances
- }
-
- checkSymbol(certificate)
- }
- }
- else {
- registerDevice {
- EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore))
- onSuccess()
- }
- }
- }
-
- private fun checkSymbol(certificate: CufsCertificate) {
- if (tryingSymbols.isEmpty()) {
- EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore))
- onSuccess()
- return
- }
-
- val result = web.postCertificate(certificate, tryingSymbols.removeAt(0)) { symbol, state ->
- when (state) {
- VulcanWebMain.STATE_NO_REGISTER -> {
- checkSymbol(certificate)
- }
- VulcanWebMain.STATE_LOGGED_OUT -> data.error(ApiError(TAG, ERROR_VULCAN_WEB_LOGGED_OUT))
- VulcanWebMain.STATE_SUCCESS -> {
- webRegisterDevice(symbol) {
- checkSymbol(certificate)
- }
- }
- }
- }
-
- // postCertificate returns false if the cert is not valid anymore
- if (!result) {
- data.error(ApiError(TAG, ERROR_VULCAN_WEB_CERTIFICATE_EXPIRED)
- .withApiResponse(certificate.xml))
- }
- }
-
- private fun webRegisterDevice(symbol: String, onSuccess: () -> Unit) {
- web.getStartPage(symbol, postErrors = false) { _, schoolSymbols ->
- if (schoolSymbols.isEmpty()) {
- onSuccess()
- return@getStartPage
- }
- data.symbol = symbol
- val schoolSymbol = data.schoolSymbol ?: schoolSymbols.firstOrNull()
- web.webGetJson(TAG, VulcanWebMain.WEB_NEW, "$schoolSymbol/$VULCAN_WEB_ENDPOINT_REGISTER_DEVICE") { result, _ ->
- val json = result.getJsonObject("data")
- data.symbol = symbol
- data.apiToken = data.apiToken.toMutableMap().also {
- it[symbol] = json.getString("TokenKey")
- }
- data.apiPin = data.apiPin.toMutableMap().also {
- it[symbol] = json.getString("PIN")
- }
- registerDevice(onSuccess)
- }
- }
- }
-
- private fun registerDevice(onSuccess: () -> Unit) {
VulcanLoginApi(data) {
- api.apiGet(TAG, VULCAN_API_ENDPOINT_STUDENT_LIST, baseUrl = true) { json, _ ->
+ api.apiGet(TAG, VULCAN_API_ENDPOINT_STUDENT_LIST, baseUrl = true) { json, response ->
val students = json.getJsonArray("Data")
if (students == null || students.isEmpty()) {
- EventBus.getDefault().postSticky(FirstLoginFinishedEvent(listOf(), data.loginStore))
+ EventBus.getDefault().post(FirstLoginFinishedEvent(listOf(), data.loginStore))
onSuccess()
return@apiGet
}
@@ -123,8 +42,7 @@ class VulcanFirstLogin(val data: DataVulcan, val onSuccess: () -> Unit) {
val student = studentEl.asJsonObject
val schoolSymbol = student.getString("JednostkaSprawozdawczaSymbol") ?: return@forEach
- val schoolShort = student.getString("JednostkaSprawozdawczaSkrot") ?: return@forEach
- val schoolCode = "${data.symbol}_$schoolSymbol"
+ val schoolName = "${data.symbol}_$schoolSymbol"
val studentId = student.getInt("Id") ?: return@forEach
val studentLoginId = student.getInt("UzytkownikLoginId") ?: return@forEach
val studentClassId = student.getInt("IdOddzial") ?: return@forEach
@@ -162,7 +80,7 @@ class VulcanFirstLogin(val data: DataVulcan, val onSuccess: () -> Unit) {
val profile = Profile(
firstProfileId++,
loginStoreId,
- LOGIN_TYPE_VULCAN,
+ loginStoreType,
studentNameLong,
userLogin,
studentNameLong,
@@ -170,17 +88,13 @@ class VulcanFirstLogin(val data: DataVulcan, val onSuccess: () -> Unit) {
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["schoolName"] = schoolName
studentData["currentSemesterEndDate"] = currentSemesterEndDate
}
dateSemester1Start?.let {
@@ -193,6 +107,7 @@ class VulcanFirstLogin(val data: DataVulcan, val onSuccess: () -> Unit) {
profileList.add(profile)
}
+ EventBus.getDefault().post(FirstLoginFinishedEvent(profileList, data.loginStore))
onSuccess()
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/CufsCertificate.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/CufsCertificate.kt
deleted file mode 100644
index 45fc96d2..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/CufsCertificate.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-4-17.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login
-
-import pl.droidsonroids.jspoon.annotation.Selector
-
-class CufsCertificate {
- @Selector(value = "EndpointReference Address")
- var targetUrl: String = ""
-
- @Selector(value = "Lifetime Created")
- var createdDate: String = ""
-
- @Selector(value = "Lifetime Expires")
- var expiryDate: String = ""
-
- @Selector(value = "Attribute[AttributeName=UserInstance] AttributeValue")
- var userInstances: List = listOf()
-
- var xml = ""
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLogin.kt
index 45c0153d..4c11caf3 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLogin.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLogin.kt
@@ -6,7 +6,6 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login
import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_VULCAN_API
-import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_VULCAN_WEB_MAIN
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
import pl.szczodrzynski.edziennik.utils.Utils
@@ -46,10 +45,6 @@ class VulcanLogin(val data: DataVulcan, val onSuccess: () -> Unit) {
}
Utils.d(TAG, "Using login method $loginMethodId")
when (loginMethodId) {
- LOGIN_METHOD_VULCAN_WEB_MAIN -> {
- data.startProgress(R.string.edziennik_progress_login_vulcan_web_main)
- VulcanLoginWebMain(data) { onSuccess(loginMethodId) }
- }
LOGIN_METHOD_VULCAN_API -> {
data.startProgress(R.string.edziennik_progress_login_vulcan_api)
VulcanLoginApi(data) { onSuccess(loginMethodId) }
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginApi.kt
index ec84cd05..231afaed 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginApi.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginApi.kt
@@ -10,12 +10,14 @@ 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.currentTimeUnix
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.getJsonObject
+import pl.szczodrzynski.edziennik.getString
+import pl.szczodrzynski.edziennik.isNotNullNorEmpty
import pl.szczodrzynski.edziennik.utils.Utils.d
import java.net.HttpURLConnection.HTTP_BAD_REQUEST
import java.util.*
@@ -27,19 +29,28 @@ class VulcanLoginApi(val data: DataVulcan, val onSuccess: () -> Unit) {
}
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()
+ // < v4.0 - PFX to Private Key migration
+ if (data.apiCertificatePfx.isNotNullNorEmpty()) {
+ try {
+ data.apiCertificatePrivate = getPrivateKeyFromCert(
+ if (data.apiToken?.get(0) == 'F') VULCAN_API_PASSWORD_FAKELOG else VULCAN_API_PASSWORD,
+ data.apiCertificatePfx ?: ""
+ )
+ data.loginStore.removeLoginData("certificatePfx")
+ } catch (e: Throwable) {
+ e.printStackTrace()
+ } finally {
+ onSuccess()
+ return@run
+ }
+ }
+
+ if (data.apiCertificateKey.isNotNullNorEmpty()
+ && data.apiCertificatePrivate.isNotNullNorEmpty()
&& data.symbol.isNotNullNorEmpty()) {
// (see data.isApiLoginValid())
// the semester end date is over
@@ -47,7 +58,7 @@ class VulcanLoginApi(val data: DataVulcan, val onSuccess: () -> Unit) {
return@run
}
- if (data.symbol.isNotNullNorEmpty() && data.apiToken[data.symbol].isNotNullNorEmpty() && data.apiPin[data.symbol].isNotNullNorEmpty()) {
+ if (data.symbol.isNotNullNorEmpty() && data.apiToken.isNotNullNorEmpty() && data.apiPin.isNotNullNorEmpty()) {
loginWithToken()
}
else {
@@ -56,64 +67,6 @@ class VulcanLoginApi(val data: DataVulcan, val onSuccess: () -> Unit) {
}
}}
- 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")
@@ -165,22 +118,14 @@ class VulcanLoginApi(val data: DataVulcan, val onSuccess: () -> Unit) {
return
}
- val privateKey = getPrivateKeyFromCert(
- if (data.apiToken[data.symbol]?.get(0) == 'F') VULCAN_API_PASSWORD_FAKELOG else VULCAN_API_PASSWORD,
+ data.apiCertificateKey = cert.getString("CertyfikatKlucz")
+ data.apiToken = data.apiToken?.substring(0, 3)
+ data.apiCertificatePrivate = getPrivateKeyFromCert(
+ if (data.apiToken?.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")
+ data.loginStore.removeLoginData("devicePin")
onSuccess()
}
@@ -191,33 +136,14 @@ class VulcanLoginApi(val data: DataVulcan, val onSuccess: () -> Unit) {
}
}
- val deviceId = data.app.deviceId.padStart(16, '0')
- val loginStoreId = data.loginStore.id.toString(16).padStart(4, '0')
- val symbol = data.symbol?.crc16()?.toString(16)?.take(2) ?: "00"
- val uuid =
- deviceId.substring(0..7) +
- "-" + deviceId.substring(8..11) +
- "-" + deviceId.substring(12..15) +
- "-" + loginStoreId +
- "-" + symbol + "6f72616e7a"
-
- val deviceNameSuffix = " - nie usuwać"
-
- 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")
+ .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", uuid)
- .addParameter("DeviceName", VULCAN_API_DEVICE_NAME.take(50 - deviceNameSuffix.length) + deviceNameSuffix)
+ .addParameter("PIN", data.apiPin)
+ .addParameter("TokenKey", data.apiToken)
+ .addParameter("DeviceId", UUID.randomUUID().toString())
+ .addParameter("DeviceName", VULCAN_API_DEVICE_NAME)
.addParameter("DeviceNameUser", "")
.addParameter("DeviceDescription", "")
.addParameter("DeviceSystemType", "Android")
@@ -228,7 +154,6 @@ class VulcanLoginApi(val data: DataVulcan, val onSuccess: () -> Unit) {
.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)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginWebMain.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginWebMain.kt
deleted file mode 100644
index 467beea3..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/login/VulcanLoginWebMain.kt
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-4-16.
- */
-
-package pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login
-
-import pl.szczodrzynski.edziennik.App
-import pl.szczodrzynski.edziennik.data.api.*
-import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.DataVulcan
-import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.data.VulcanWebMain
-import pl.szczodrzynski.edziennik.data.api.models.ApiError
-import pl.szczodrzynski.edziennik.getString
-import pl.szczodrzynski.edziennik.isNotNullNorEmpty
-import pl.szczodrzynski.edziennik.utils.models.Date
-import pl.szczodrzynski.fslogin.FSLogin
-import pl.szczodrzynski.fslogin.realm.CufsRealm
-
-class VulcanLoginWebMain(val data: DataVulcan, val onSuccess: () -> Unit) {
- companion object {
- private const val TAG = "VulcanLoginWebMain"
- }
-
- private val web by lazy { VulcanWebMain(data, null) }
-
- init { run {
- copyFromLoginStore()
-
- if (data.profile != null && data.isWebMainLoginValid()) {
- onSuccess()
- }
- else {
- if (data.symbol.isNotNullNorEmpty()
- && data.webType.isNotNullNorEmpty()
- && data.webHost.isNotNullNorEmpty()
- && (data.webEmail.isNotNullNorEmpty() || data.webUsername.isNotNullNorEmpty())
- && data.webPassword.isNotNullNorEmpty()) {
- try {
- val success = loginWithCredentials()
- if (!success)
- data.error(ApiError(TAG, ERROR_VULCAN_WEB_DATA_MISSING))
- } catch (e: Exception) {
- data.error(ApiError(TAG, EXCEPTION_VULCAN_WEB_LOGIN)
- .withThrowable(e))
- }
- }
- else {
- data.error(ApiError(TAG, ERROR_LOGIN_DATA_MISSING))
- }
- }
- }}
-
- private fun copyFromLoginStore() {
- data.loginStore.data.apply {
- // 4.0 - new login form - copy user input to profile
- if (has("symbol")) {
- data.symbol = getString("symbol")
- remove("symbol")
- }
- }
- }
-
- private fun loginWithCredentials(): Boolean {
- val realm = when (data.webType) {
- "cufs" -> CufsRealm(
- host = data.webHost ?: return false,
- symbol = data.symbol ?: "default",
- httpCufs = data.webIsHttpCufs
- )
- "adfs" -> CufsRealm(
- host = data.webHost ?: return false,
- symbol = data.symbol ?: "default",
- httpCufs = data.webIsHttpCufs
- ).toAdfsRealm(id = data.webAdfsId ?: return false)
- "adfslight" -> CufsRealm(
- host = data.webHost ?: return false,
- symbol = data.symbol ?: "default",
- httpCufs = data.webIsHttpCufs
- ).toAdfsLightRealm(
- id = data.webAdfsId ?: return false,
- domain = data.webAdfsDomain ?: "adfslight",
- isScoped = data.webIsScopedAdfs
- )
- else -> return false
- }
-
- val certificate = web.readCertificate()?.let { web.parseCertificate(it) }
- if (certificate != null && Date.fromIso(certificate.expiryDate) > System.currentTimeMillis()) {
- useCertificate(certificate)
- return true
- }
-
- val fsLogin = FSLogin(data.app.http, debug = App.debugMode)
- fsLogin.performLogin(
- realm = realm,
- username = data.webUsername ?: data.webEmail ?: return false,
- password = data.webPassword ?: return false,
- onSuccess = { fsCertificate ->
- web.saveCertificate(fsCertificate.wresult)
- useCertificate(web.parseCertificate(fsCertificate.wresult))
- },
- onFailure = { errorText ->
- // TODO
- data.error(ApiError(TAG, 0).withThrowable(RuntimeException(errorText)))
- }
- )
-
- return true
- }
-
- private fun useCertificate(certificate: CufsCertificate) {
- // auto-post certificate when not first login
- if (data.profile != null && data.symbol != null && data.symbol != "default") {
- val result = web.postCertificate(certificate, data.symbol ?: "default") { _, state ->
- when (state) {
- VulcanWebMain.STATE_SUCCESS -> {
- web.getStartPage { _, _ -> onSuccess() }
- }
- VulcanWebMain.STATE_NO_REGISTER -> data.error(ApiError(TAG, ERROR_VULCAN_WEB_NO_REGISTER))
- VulcanWebMain.STATE_LOGGED_OUT -> data.error(ApiError(TAG, ERROR_VULCAN_WEB_LOGGED_OUT))
- }
- }
- // postCertificate returns false if the cert is not valid anymore
- if (!result) {
- data.error(ApiError(TAG, ERROR_VULCAN_WEB_CERTIFICATE_EXPIRED)
- .withApiResponse(certificate.xml))
- }
- }
- else {
- // first login - succeed immediately
- onSuccess()
- }
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/AttachmentGetEvent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/AttachmentGetEvent.kt
index 52415c56..cbc85b7d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/AttachmentGetEvent.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/AttachmentGetEvent.kt
@@ -4,21 +4,11 @@
package pl.szczodrzynski.edziennik.data.api.events
-import pl.szczodrzynski.edziennik.data.db.entity.Event
-import pl.szczodrzynski.edziennik.data.db.entity.Message
-
-data class AttachmentGetEvent(val profileId: Int, val owner: Any, val attachmentId: Long,
+data class AttachmentGetEvent(val profileId: Int, val messageId: Long, val attachmentId: Long,
var eventType: Int = TYPE_PROGRESS, val fileName: String? = null,
val bytesWritten: Long = 0) {
companion object {
const val TYPE_PROGRESS = 0
const val TYPE_FINISHED = 1
}
-
- val ownerId
- get() = when (owner) {
- is Message -> owner.id
- is Event -> owner.id
- else -> -1
- }
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/EventGetEvent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/EventGetEvent.kt
deleted file mode 100644
index 00cf1727..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/EventGetEvent.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-3-31.
- */
-
-package pl.szczodrzynski.edziennik.data.api.events
-
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
-
-data class EventGetEvent(val event: EventFull)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/RegisterAvailabilityEvent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/RegisterAvailabilityEvent.kt
deleted file mode 100644
index fe66c4b3..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/RegisterAvailabilityEvent.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-9-3.
- */
-
-package pl.szczodrzynski.edziennik.data.api.events
-
-import pl.szczodrzynski.edziennik.data.api.szkolny.response.RegisterAvailabilityStatus
-
-data class RegisterAvailabilityEvent(
- val data: Map< String, RegisterAvailabilityStatus>
-)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/interfaces/EdziennikInterface.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/interfaces/EdziennikInterface.kt
index 153bbe18..a9015473 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/interfaces/EdziennikInterface.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/interfaces/EdziennikInterface.kt
@@ -5,20 +5,19 @@
package pl.szczodrzynski.edziennik.data.api.interfaces
import com.google.gson.JsonObject
-import pl.szczodrzynski.edziennik.data.db.entity.Teacher
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
+import pl.szczodrzynski.edziennik.data.db.entity.Message
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
+import pl.szczodrzynski.edziennik.data.db.entity.Teacher
interface EdziennikInterface {
- fun sync(featureIds: List, viewId: Int? = null, onlyEndpoints: List? = null, arguments: JsonObject? = null)
+ fun sync(featureIds: List, viewId: Int? = null, arguments: JsonObject? = null)
fun getMessage(message: MessageFull)
fun sendMessage(recipients: List, subject: String, text: String)
fun markAllAnnouncementsAsRead()
fun getAnnouncement(announcement: AnnouncementFull)
- fun getAttachment(owner: Any, attachmentId: Long, attachmentName: String)
+ fun getAttachment(message: Message, attachmentId: Long, attachmentName: String)
fun getRecipientList()
- fun getEvent(eventFull: EventFull)
fun firstLogin()
fun cancel()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt
index 6bd9aa83..b5086539 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt
@@ -86,9 +86,6 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
val gradeCategories = LongSparseArray()
var teacherOnConflictStrategy = OnConflictStrategy.IGNORE
- var eventListReplace = false
- var messageListReplace = false
- var announcementListReplace = false
val classrooms = LongSparseArray()
val attendanceTypes = LongSparseArray()
@@ -121,12 +118,14 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
val attendanceList = mutableListOf()
val announcementList = mutableListOf()
+ val announcementIgnoreList = mutableListOf()
val luckyNumberList = mutableListOf()
val teacherAbsenceList = mutableListOf()
val messageList = mutableListOf()
+ val messageIgnoreList = mutableListOf()
val messageRecipientList = mutableListOf()
val messageRecipientIgnoreList = mutableListOf()
@@ -178,9 +177,11 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
noticeList.clear()
attendanceList.clear()
announcementList.clear()
+ announcementIgnoreList.clear()
luckyNumberList.clear()
teacherAbsenceList.clear()
messageList.clear()
+ messageIgnoreList.clear()
messageRecipientList.clear()
messageRecipientIgnoreList.clear()
metadataList.clear()
@@ -196,13 +197,6 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
profile.userCode = generateUserCode()
- // update profile subname with class name, school year and account type
- profile.subname = joinNotNullStrings(
- " - ",
- profile.studentClassName,
- "${profile.studentSchoolYearStart}/${profile.studentSchoolYearStart + 1}"
- ) + " " + app.getString(if (profile.isParent) R.string.account_type_parent else R.string.account_type_child)
-
db.profileDao().add(profile)
db.loginStoreDao().add(loginStore)
@@ -283,19 +277,34 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
d("Metadata saved in ${System.currentTimeMillis()-startTime} ms")
startTime = System.currentTimeMillis()
- db.timetableDao().putAll(lessonList, removeNotKept = true)
- db.gradeDao().putAll(gradeList, removeNotKept = true)
- db.eventDao().putAll(eventList, forceReplace = eventListReplace, removeNotKept = true)
+ if (lessonList.isNotEmpty()) {
+ db.timetableDao() += lessonList
+ }
+ if (gradeList.isNotEmpty()) {
+ db.gradeDao().addAll(gradeList)
+ }
+ if (eventList.isNotEmpty()) {
+ db.eventDao().addAll(eventList)
+ }
if (noticeList.isNotEmpty()) {
db.noticeDao().clear(profile.id)
- db.noticeDao().putAll(noticeList)
+ db.noticeDao().addAll(noticeList)
}
- db.attendanceDao().putAll(attendanceList, removeNotKept = true)
- db.announcementDao().putAll(announcementList, forceReplace = announcementListReplace, removeNotKept = false)
- db.luckyNumberDao().putAll(luckyNumberList)
- db.teacherAbsenceDao().putAll(teacherAbsenceList)
+ if (attendanceList.isNotEmpty())
+ db.attendanceDao().addAll(attendanceList)
+ if (announcementList.isNotEmpty())
+ db.announcementDao().addAll(announcementList)
+ if (announcementIgnoreList.isNotEmpty())
+ db.announcementDao().addAllIgnore(announcementIgnoreList)
+ if (luckyNumberList.isNotEmpty())
+ db.luckyNumberDao().addAll(luckyNumberList)
+ if (teacherAbsenceList.isNotEmpty())
+ db.teacherAbsenceDao().addAll(teacherAbsenceList)
- db.messageDao().putAll(messageList, forceReplace = messageListReplace, removeNotKept = false)
+ if (messageList.isNotEmpty())
+ db.messageDao().addAll(messageList)
+ if (messageIgnoreList.isNotEmpty())
+ db.messageDao().addAllIgnore(messageIgnoreList)
if (messageRecipientList.isNotEmpty())
db.messageRecipientDao().addAll(messageRecipientList)
if (messageRecipientIgnoreList.isNotEmpty())
@@ -336,7 +345,7 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt
}
fun shouldSyncLuckyNumber(): Boolean {
- return db.luckyNumberDao().getNearestFutureNow(profileId, Date.getToday()) == null
+ return (db.luckyNumberDao().getNearestFutureNow(profileId, Date.getToday().value) ?: -1) == -1
}
/*fun error(tag: String, errorCode: Int, response: Response? = null, throwable: Throwable? = null, apiResponse: JsonObject? = null) {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/DataRemoveModel.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/DataRemoveModel.kt
index 49b57999..ccccc00e 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/DataRemoveModel.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/DataRemoveModel.kt
@@ -20,10 +20,10 @@ open class DataRemoveModel {
fun commit(profileId: Int, dao: TimetableDao) {
if (dateFrom != null && dateTo != null) {
- dao.dontKeepBetweenDates(profileId, dateFrom, dateTo)
+ dao.clearBetweenDates(profileId, dateFrom, dateTo)
} else {
- dateFrom?.let { dateFrom -> dao.dontKeepFromDate(profileId, dateFrom) }
- dateTo?.let { dateTo -> dao.dontKeepToDate(profileId, dateTo) }
+ dateFrom?.let { dateFrom -> dao.clearFromDate(profileId, dateFrom) }
+ dateTo?.let { dateTo -> dao.clearToDate(profileId, dateTo) }
}
}
}
@@ -38,12 +38,12 @@ open class DataRemoveModel {
fun commit(profileId: Int, dao: GradeDao) {
if (all) {
- if (type != null) dao.dontKeepWithType(profileId, type)
+ if (type != null) dao.clearWithType(profileId, type)
else dao.clear(profileId)
}
semester?.let {
- if (type != null) dao.dontKeepForSemesterWithType(profileId, it, type)
- else dao.dontKeepForSemester(profileId, it)
+ if (type != null) dao.clearForSemesterWithType(profileId, it, type)
+ else dao.clearForSemester(profileId, it)
}
}
}
@@ -53,15 +53,12 @@ open class DataRemoveModel {
fun futureExceptType(exceptType: Long) = Events(null, exceptType, null)
fun futureExceptTypes(exceptTypes: List) = Events(null, null, exceptTypes)
fun futureWithType(type: Long) = Events(type, null, null)
- fun future() = Events(null, null, null)
}
fun commit(profileId: Int, dao: EventDao) {
- type?.let { dao.dontKeepFutureWithType(profileId, Date.getToday(), it) }
- exceptType?.let { dao.dontKeepFutureExceptType(profileId, Date.getToday(), it) }
- exceptTypes?.let { dao.dontKeepFutureExceptTypes(profileId, Date.getToday(), it) }
- if (type == null && exceptType == null && exceptTypes == null)
- dao.dontKeepFuture(profileId, Date.getToday())
+ type?.let { dao.removeFutureWithType(profileId, Date.getToday(), it) }
+ exceptType?.let { dao.removeFutureExceptType(profileId, Date.getToday(), it) }
+ exceptTypes?.let { dao.removeFutureExceptTypes(profileId, Date.getToday(), it) }
}
}
@@ -72,7 +69,7 @@ open class DataRemoveModel {
fun commit(profileId: Int, dao: AttendanceDao) {
if (dateFrom != null) {
- dao.dontKeepAfterDate(profileId, dateFrom)
+ dao.clearAfterDate(profileId, dateFrom)
}
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyApi.kt
index 042e63fe..13aaf807 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyApi.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyApi.kt
@@ -12,14 +12,15 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient
-import org.greenrobot.eventbus.EventBus
-import pl.szczodrzynski.edziennik.*
+import pl.szczodrzynski.edziennik.App
+import pl.szczodrzynski.edziennik.BuildConfig
+import pl.szczodrzynski.edziennik.R
+import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.api.szkolny.adapter.DateAdapter
import pl.szczodrzynski.edziennik.data.api.szkolny.adapter.TimeAdapter
import pl.szczodrzynski.edziennik.data.api.szkolny.interceptor.SignatureInterceptor
import pl.szczodrzynski.edziennik.data.api.szkolny.request.*
import pl.szczodrzynski.edziennik.data.api.szkolny.response.ApiResponse
-import pl.szczodrzynski.edziennik.data.api.szkolny.response.RegisterAvailabilityStatus
import pl.szczodrzynski.edziennik.data.api.szkolny.response.Update
import pl.szczodrzynski.edziennik.data.api.szkolny.response.WebPushResponse
import pl.szczodrzynski.edziennik.data.db.entity.Event
@@ -27,9 +28,9 @@ import pl.szczodrzynski.edziennik.data.db.entity.FeedbackMessage
import pl.szczodrzynski.edziennik.data.db.entity.Notification
import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.data.db.full.EventFull
+import pl.szczodrzynski.edziennik.md5
import pl.szczodrzynski.edziennik.ui.modules.error.ErrorDetailsDialog
import pl.szczodrzynski.edziennik.ui.modules.error.ErrorSnackbar
-import pl.szczodrzynski.edziennik.ui.modules.login.LoginInfo
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.Time
import retrofit2.Response
@@ -76,21 +77,21 @@ class SzkolnyApi(val app: App) : CoroutineScope {
suspend inline fun runCatching(errorSnackbar: ErrorSnackbar, crossinline block: SzkolnyApi.() -> T?): T? {
return try {
- withContext(Dispatchers.Default) { block.invoke(this@SzkolnyApi) }
+ withContext(Dispatchers.Default) { block() }
}
catch (e: Exception) {
- errorSnackbar.addError(e.toApiError(TAG)).show()
+ errorSnackbar.addError(ApiError.fromThrowable(TAG, e)).show()
null
}
}
suspend inline fun runCatching(activity: AppCompatActivity, crossinline block: SzkolnyApi.() -> T?): T? {
return try {
- withContext(Dispatchers.Default) { block.invoke(this@SzkolnyApi) }
+ withContext(Dispatchers.Default) { block() }
}
catch (e: Exception) {
ErrorDetailsDialog(
activity,
- listOf(e.toApiError(TAG)),
+ listOf(ApiError.fromThrowable(TAG, e)),
R.string.error_occured
)
null
@@ -98,7 +99,7 @@ class SzkolnyApi(val app: App) : CoroutineScope {
}
inline fun runCatching(block: SzkolnyApi.() -> T, onError: (e: Throwable) -> Unit): T? {
return try {
- block.invoke(this@SzkolnyApi)
+ block()
}
catch (e: Exception) {
onError(e)
@@ -114,22 +115,6 @@ class SzkolnyApi(val app: App) : CoroutineScope {
*/
@Throws(Exception::class)
private inline fun parseResponse(response: Response>): T {
- app.config.update = response.body()?.update?.let { update ->
- if (update.versionCode > BuildConfig.VERSION_CODE) {
- if (update.updateMandatory
- && EventBus.getDefault().hasSubscriberForEvent(update::class.java)) {
- EventBus.getDefault().postSticky(update)
- }
- update
- }
- else
- null
- }
-
- response.body()?.registerAvailability?.let { registerAvailability ->
- app.config.sync.registerAvailability = registerAvailability
- }
-
if (response.isSuccessful && response.body()?.success == true) {
if (Unit is T) {
return Unit
@@ -175,7 +160,7 @@ class SzkolnyApi(val app: App) : CoroutineScope {
}
@Throws(Exception::class)
- fun getEvents(profiles: List, notifications: List, blacklistedIds: List, lastSyncTime: Long): List {
+ fun getEvents(profiles: List, notifications: List, blacklistedIds: List): List {
val teams = app.db.teamDao().allNow
val response = api.serverSync(ServerSyncRequest(
@@ -200,31 +185,19 @@ class SzkolnyApi(val app: App) : CoroutineScope {
}
}
},
- lastSync = lastSyncTime,
notifications = notifications.map { ServerSyncRequest.Notification(it.profileName ?: "", it.type, it.text) }
)).execute()
- val (events, hasBrowsers) = parseResponse(response)
+ parseResponse(response)
- hasBrowsers?.let {
- app.config.sync.webPushEnabled = it
- }
+ val events = mutableListOf()
- val eventList = mutableListOf()
-
- events.forEach { event ->
- // skip blacklisted events
+ response.body()?.data?.events?.forEach { event ->
if (event.id in blacklistedIds)
return@forEach
-
- // force nullable non-negative colors
- if (event.color == -1)
- event.color = null
-
- // create the event for every matching team and profile
teams.filter { it.code == event.teamCode }.onEach { team ->
val profile = profiles.firstOrNull { it.id == team.profileId } ?: return@onEach
- eventList += EventFull(event).apply {
+ events.add(EventFull(event).apply {
profileId = team.profileId
teamId = team.id
addedManually = true
@@ -232,11 +205,11 @@ class SzkolnyApi(val app: App) : CoroutineScope {
notified = profile.empty
if (profile.userCode == event.sharedBy) sharedBy = "self"
- }
+ })
}
}
- return eventList
+ return events
}
@Throws(Exception::class)
@@ -280,8 +253,9 @@ class SzkolnyApi(val app: App) : CoroutineScope {
browserId = browserId,
pairToken = pairToken
)).execute()
+ parseResponse(response)
- return parseResponse(response).browsers
+ return response.body()?.data?.browsers ?: emptyList()
}
@Throws(Exception::class)
@@ -291,8 +265,9 @@ class SzkolnyApi(val app: App) : CoroutineScope {
device = getDevice(),
action = "listBrowsers"
)).execute()
+ parseResponse(response)
- return parseResponse(response).browsers
+ return response.body()?.data?.browsers ?: emptyList()
}
@Throws(Exception::class)
@@ -303,8 +278,9 @@ class SzkolnyApi(val app: App) : CoroutineScope {
action = "unpairBrowser",
browserId = browserId
)).execute()
+ parseResponse(response)
- return parseResponse(response).browsers
+ return response.body()?.data?.browsers ?: emptyList()
}
@Throws(Exception::class)
@@ -331,7 +307,9 @@ class SzkolnyApi(val app: App) : CoroutineScope {
@Throws(Exception::class)
fun getUpdate(channel: String): List {
val response = api.updates(channel).execute()
- return parseResponse(response)
+ parseResponse(response)
+
+ return response.body()?.data ?: emptyList()
}
@Throws(Exception::class)
@@ -343,26 +321,8 @@ class SzkolnyApi(val app: App) : CoroutineScope {
targetDeviceId = targetDeviceId,
text = text
)).execute()
+ val data = parseResponse(response)
- return parseResponse(response).message
- }
-
- @Throws(Exception::class)
- fun getPlatforms(registerName: String): List {
- val response = api.appLoginPlatforms(registerName).execute()
-
- return parseResponse(response)
- }
-
- @Throws(Exception::class)
- fun getFirebaseToken(registerName: String): String {
- val response = api.firebaseToken(registerName).execute()
- return parseResponse(response)
- }
-
- @Throws(Exception::class)
- fun getRegisterAvailability(): Map {
- val response = api.registerAvailability().execute()
- return parseResponse(response)
+ return data.message
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyService.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyService.kt
index 6046e4da..0e3dd574 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyService.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/SzkolnyService.kt
@@ -6,9 +6,11 @@ package pl.szczodrzynski.edziennik.data.api.szkolny
import pl.szczodrzynski.edziennik.data.api.szkolny.request.*
import pl.szczodrzynski.edziennik.data.api.szkolny.response.*
-import pl.szczodrzynski.edziennik.ui.modules.login.LoginInfo
import retrofit2.Call
-import retrofit2.http.*
+import retrofit2.http.Body
+import retrofit2.http.GET
+import retrofit2.http.POST
+import retrofit2.http.Query
interface SzkolnyService {
@@ -32,13 +34,4 @@ interface SzkolnyService {
@POST("feedbackMessage")
fun feedbackMessage(@Body request: FeedbackMessageRequest): Call>
-
- @GET("appLogin/platforms/{registerName}")
- fun appLoginPlatforms(@Path("registerName") registerName: String): Call>>
-
- @GET("firebase/token/{registerName}")
- fun firebaseToken(@Path("registerName") registerName: String): Call>
-
- @GET("registerAvailability")
- fun registerAvailability(): Call>>
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt
index 76fc1193..c3ad6326 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt
@@ -39,13 +39,13 @@ object Signing {
val appPassword by lazy {
iLoveApple(
"ThisIsOurHardWorkPleaseDoNotCopyOrSteal(c)2019.KubaSz".sha256(),
- BuildConfig.VERSION_NAME.substringBeforeLast('+'),
+ BuildConfig.VERSION_NAME,
BuildConfig.VERSION_CODE.toLong()
)
}
/*fun provideKey(param1: String, param2: Long): ByteArray {*/
fun pleaseStopRightNow(param1: String, param2: Long): ByteArray {
- return "$param1.MTIzNDU2Nzg5MDv1BTei5k===.$param2".sha256()
+ return "$param1.MTIzNDU2Nzg5MDfKS5agyJ===.$param2".sha256()
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/request/EventShareRequest.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/request/EventShareRequest.kt
index 1977d1b2..624b8b0f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/request/EventShareRequest.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/request/EventShareRequest.kt
@@ -12,8 +12,7 @@ data class EventShareRequest (
val action: String = "event",
- /* If null, the server shows an error */
- val sharedByName: String?,
+ val sharedByName: String,
val shareTeamCode: String? = null,
val unshareTeamCode: String? = null,
val requesterName: String? = null,
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/request/ServerSyncRequest.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/request/ServerSyncRequest.kt
index e287df06..a60742e0 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/request/ServerSyncRequest.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/request/ServerSyncRequest.kt
@@ -11,8 +11,6 @@ data class ServerSyncRequest(
val userCodes: List,
val users: List? = null,
- val lastSync: Long,
-
val notifications: List? = null
) {
data class User(
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/ApiResponse.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/ApiResponse.kt
index 0987dcef..ac56f53f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/ApiResponse.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/ApiResponse.kt
@@ -10,10 +10,7 @@ data class ApiResponse (
val errors: List? = null,
- val data: T? = null,
-
- val update: Update? = null,
- val registerAvailability: Map? = null
+ val data: T? = null
) {
data class Error (val code: String, val reason: String)
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/RegisterAvailabilityStatus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/RegisterAvailabilityStatus.kt
deleted file mode 100644
index 0596a8ac..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/RegisterAvailabilityStatus.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-9-2.
- */
-
-package pl.szczodrzynski.edziennik.data.api.szkolny.response
-
-import pl.szczodrzynski.edziennik.BuildConfig
-import pl.szczodrzynski.edziennik.DAY
-import pl.szczodrzynski.edziennik.currentTimeUnix
-
-data class RegisterAvailabilityStatus(
- val available: Boolean,
- val name: String?,
- val message: Message?,
- val nextCheck: Long = currentTimeUnix() + 7 * DAY,
- val minVersionCode: Int = BuildConfig.VERSION_CODE
-) {
- data class Message(
- val title: String,
- val contentShort: String,
- val contentLong: String,
- val icon: String?,
- val image: String?,
- val url: String?
- )
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/ServerSyncResponse.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/ServerSyncResponse.kt
index 0ed11f9c..5bb98af8 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/ServerSyncResponse.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/ServerSyncResponse.kt
@@ -6,7 +6,4 @@ package pl.szczodrzynski.edziennik.data.api.szkolny.response
import pl.szczodrzynski.edziennik.data.db.full.EventFull
-data class ServerSyncResponse(
- val events: List,
- val hasBrowsers: Boolean? = null
-)
+data class ServerSyncResponse(val events: List)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/UpdateResponse.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/UpdateResponse.kt
index 63a8ce9d..a2028926 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/UpdateResponse.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/response/UpdateResponse.kt
@@ -11,6 +11,5 @@ data class Update(
val releaseNotes: String?,
val releaseType: String,
val isOnGooglePlay: Boolean,
- val downloadUrl: String?,
- val updateMandatory: Boolean
-)
+ val downloadUrl: String?
+)
\ No newline at end of file
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/AppSync.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/AppSync.kt
index c10bab3e..de877d1c 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/AppSync.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/AppSync.kt
@@ -9,7 +9,6 @@ import pl.szczodrzynski.edziennik.data.api.szkolny.SzkolnyApi
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.entity.Notification
import pl.szczodrzynski.edziennik.data.db.entity.Profile
-import pl.szczodrzynski.edziennik.utils.models.Date
class AppSync(val app: App, val notifications: MutableList, val profiles: List, val api: SzkolnyApi) {
companion object {
@@ -25,26 +24,26 @@ class AppSync(val app: App, val notifications: MutableList, val pr
*
* @return a number of events inserted to DB, possibly needing a notification
*/
- fun run(lastSyncTime: Long, markAsSeen: Boolean = false): Int {
- val blacklistedIds = app.db.eventDao().blacklistedIds
- val events = api.getEvents(profiles, notifications, blacklistedIds, lastSyncTime)
+ fun run(): Int {
+ val profiles = profiles.filter { it.registration == Profile.REGISTRATION_ENABLED && !it.archived }
+ if (profiles.isNotEmpty()) {
+ val blacklistedIds = app.db.eventDao().blacklistedIds;
+ val events = api.getEvents(profiles, notifications, blacklistedIds)
- app.config.sync.lastAppSync = System.currentTimeMillis()
-
- if (events.isNotEmpty()) {
- val today = Date.getToday()
- app.db.metadataDao().addAllIgnore(events.map { event ->
- val isPast = event.date < today
- Metadata(
- event.profileId,
- Metadata.TYPE_EVENT,
- event.id,
- isPast || markAsSeen || event.seen,
- isPast || markAsSeen || event.notified
- )
- })
- return app.db.eventDao().upsertAll(events).size
+ if (events.isNotEmpty()) {
+ app.db.metadataDao().addAllIgnore(events.map { event ->
+ Metadata(
+ event.profileId,
+ Metadata.TYPE_EVENT,
+ event.id,
+ event.seen,
+ event.notified,
+ event.addedDate
+ )
+ })
+ return app.db.eventDao().addAll(events).size
+ }
}
return 0;
}
-}
+}
\ No newline at end of file
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/IApiTask.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/IApiTask.kt
index 2bff4267..2d0efe0d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/IApiTask.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/IApiTask.kt
@@ -42,8 +42,6 @@ abstract class IApiTask(open val profileId: Int) {
companion object {
fun enqueueAll(context: Context, tasks: List) {
- if (tasks.isEmpty())
- return
Intent(context, ApiService::class.java).let {
if (SDK_INT >= O)
context.startForegroundService(it)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/Notifications.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/Notifications.kt
index 21a5c112..7c049f5a 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/Notifications.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/Notifications.kt
@@ -34,7 +34,6 @@ class Notifications(val app: App, val notifications: MutableList,
announcementNotifications()
messageNotifications()
luckyNumberNotifications()
- teacherAbsenceNotifications()
}
private fun timetableNotifications() {
@@ -53,13 +52,13 @@ class Notifications(val app: App, val notifications: MutableList,
profileId = lesson.profileId,
profileName = profiles.singleOrNull { it.id == lesson.profileId }?.name,
viewId = MainActivity.DRAWER_ITEM_TIMETABLE,
- addedDate = System.currentTimeMillis()
+ addedDate = lesson.addedDate
).addExtra("timetableDate", lesson.displayDate?.stringY_m_d ?: "")
}
}
private fun eventNotifications() {
- for (event in app.db.eventDao().getNotNotifiedNow().filter { it.date >= today }) {
+ for (event in app.db.eventDao().notNotifiedNow.filter { it.eventDate >= today }) {
val text = if (event.type == Event.TYPE_HOMEWORK)
app.getString(
if (event.subjectLongName.isNullOrEmpty())
@@ -67,7 +66,7 @@ class Notifications(val app: App, val notifications: MutableList,
else
R.string.notification_homework_format,
event.subjectLongName,
- event.date.formattedString
+ event.eventDate.formattedString
)
else
app.getString(
@@ -75,8 +74,8 @@ class Notifications(val app: App, val notifications: MutableList,
R.string.notification_event_no_subject_format
else
R.string.notification_event_format,
- event.typeName ?: "wydarzenie",
- event.date.formattedString,
+ event.typeName,
+ event.eventDate.formattedString,
event.subjectLongName
)
val type = if (event.type == Event.TYPE_HOMEWORK) Notification.TYPE_NEW_HOMEWORK else Notification.TYPE_NEW_EVENT
@@ -89,17 +88,17 @@ class Notifications(val app: App, val notifications: MutableList,
profileName = profiles.singleOrNull { it.id == event.profileId }?.name,
viewId = if (event.type == Event.TYPE_HOMEWORK) MainActivity.DRAWER_ITEM_HOMEWORK else MainActivity.DRAWER_ITEM_AGENDA,
addedDate = event.addedDate
- ).addExtra("eventId", event.id).addExtra("eventDate", event.date.value.toLong())
+ ).addExtra("eventId", event.id).addExtra("eventDate", event.eventDate.value.toLong())
}
}
fun sharedEventNotifications() {
- for (event in app.db.eventDao().getNotNotifiedNow().filter { it.date >= today && it.sharedBy != null }) {
+ for (event in app.db.eventDao().notNotifiedNow.filter { it.eventDate >= today && it.sharedBy != null }) {
val text = app.getString(
R.string.notification_shared_event_format,
event.sharedByName,
event.typeName ?: "wydarzenie",
- event.date.formattedString,
+ event.eventDate.formattedString,
event.topic
)
val type = if (event.type == Event.TYPE_HOMEWORK) Notification.TYPE_NEW_HOMEWORK else Notification.TYPE_NEW_EVENT
@@ -112,12 +111,12 @@ class Notifications(val app: App, val notifications: MutableList,
profileName = profiles.singleOrNull { it.id == event.profileId }?.name,
viewId = if (event.type == Event.TYPE_HOMEWORK) MainActivity.DRAWER_ITEM_HOMEWORK else MainActivity.DRAWER_ITEM_AGENDA,
addedDate = event.addedDate
- ).addExtra("eventId", event.id).addExtra("eventDate", event.date.value.toLong())
+ ).addExtra("eventId", event.id).addExtra("eventDate", event.eventDate.value.toLong())
}
}
private fun gradeNotifications() {
- for (grade in app.db.gradeDao().getNotNotifiedNow()) {
+ for (grade in app.db.gradeDao().notNotifiedNow) {
val gradeName = when (grade.type) {
Grade.TYPE_SEMESTER1_PROPOSED, Grade.TYPE_SEMESTER2_PROPOSED -> app.getString(R.string.grade_semester_proposed_format_2, grade.name)
Grade.TYPE_SEMESTER1_FINAL, Grade.TYPE_SEMESTER2_FINAL -> app.getString(R.string.grade_semester_final_format_2, grade.name)
@@ -144,7 +143,7 @@ class Notifications(val app: App, val notifications: MutableList,
}
private fun behaviourNotifications() {
- for (notice in app.db.noticeDao().getNotNotifiedNow()) {
+ for (notice in app.db.noticeDao().notNotifiedNow) {
val noticeTypeStr = when (notice.type) {
Notice.TYPE_POSITIVE -> app.getString(R.string.notification_notice_praise)
@@ -155,7 +154,7 @@ class Notifications(val app: App, val notifications: MutableList,
val text = app.getString(
R.string.notification_notice_format,
noticeTypeStr,
- notice.teacherName,
+ notice.teacherFullName,
Date.fromMillis(notice.addedDate).formattedString
)
notifications += Notification(
@@ -172,9 +171,9 @@ class Notifications(val app: App, val notifications: MutableList,
}
private fun attendanceNotifications() {
- for (attendance in app.db.attendanceDao().getNotNotifiedNow()) {
+ for (attendance in app.db.attendanceDao().notNotifiedNow) {
- val attendanceTypeStr = when (attendance.baseType) {
+ val attendanceTypeStr = when (attendance.type) {
Attendance.TYPE_ABSENT -> app.getString(R.string.notification_absence)
Attendance.TYPE_ABSENT_EXCUSED -> app.getString(R.string.notification_absence_excused)
Attendance.TYPE_BELATED -> app.getString(R.string.notification_belated)
@@ -191,7 +190,7 @@ class Notifications(val app: App, val notifications: MutableList,
R.string.notification_attendance_format,
attendanceTypeStr,
attendance.subjectLongName,
- attendance.date.formattedString
+ attendance.lessonDate.formattedString
)
notifications += Notification(
id = Notification.buildId(attendance.profileId, Notification.TYPE_NEW_ATTENDANCE, attendance.id),
@@ -207,10 +206,10 @@ class Notifications(val app: App, val notifications: MutableList,
}
private fun announcementNotifications() {
- for (announcement in app.db.announcementDao().getNotNotifiedNow()) {
+ for (announcement in app.db.announcementDao().notNotifiedNow) {
val text = app.getString(
R.string.notification_announcement_format,
- announcement.teacherName,
+ announcement.teacherFullName,
announcement.subject
)
notifications += Notification(
@@ -227,10 +226,10 @@ class Notifications(val app: App, val notifications: MutableList,
}
private fun messageNotifications() {
- for (message in app.db.messageDao().getNotNotifiedNow()) {
+ for (message in app.db.messageDao().receivedNotNotifiedNow) {
val text = app.getString(
R.string.notification_message_format,
- message.senderName,
+ message.senderFullName,
message.subject
)
notifications += Notification(
@@ -247,9 +246,9 @@ class Notifications(val app: App, val notifications: MutableList,
}
private fun luckyNumberNotifications() {
- val luckyNumbers = app.db.luckyNumberDao().getNotNotifiedNow().toMutableList()
- luckyNumbers.removeAll { it.date < today }
- luckyNumbers.forEach { luckyNumber ->
+ val luckyNumbers = app.db.luckyNumberDao().notNotifiedNow
+ luckyNumbers?.removeAll { it.date < today }
+ luckyNumbers?.forEach { luckyNumber ->
val profile = profiles.singleOrNull { it.id == luckyNumber.profileId } ?: return@forEach
val text = when (profile.studentNumber != -1 && profile.studentNumber == luckyNumber.number) {
true -> when (luckyNumber.date.value) {
@@ -271,27 +270,8 @@ class Notifications(val app: App, val notifications: MutableList,
profileId = luckyNumber.profileId,
profileName = profile.name,
viewId = MainActivity.DRAWER_ITEM_HOME,
- addedDate = System.currentTimeMillis()
+ addedDate = luckyNumber.addedDate
)
}
}
-
- private fun teacherAbsenceNotifications() {
- for (teacherAbsence in app.db.teacherAbsenceDao().getNotNotifiedNow()) {
- val message = app.getString(
- R.string.notification_teacher_absence_new_format,
- teacherAbsence.teacherName
- )
- notifications += Notification(
- id = Notification.buildId(teacherAbsence.profileId, Notification.TYPE_TEACHER_ABSENCE, teacherAbsence.id),
- title = app.getNotificationTitle(Notification.TYPE_TEACHER_ABSENCE),
- text = message,
- type = Notification.TYPE_TEACHER_ABSENCE,
- profileId = teacherAbsence.profileId,
- profileName = profiles.singleOrNull { it.id == teacherAbsence.profileId }?.name,
- viewId = MainActivity.DRAWER_ITEM_AGENDA,
- addedDate = teacherAbsence.addedDate
- ).addExtra("eventDate", teacherAbsence.dateFrom.value.toLong())
- }
- }
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/PostNotifications.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/PostNotifications.kt
index 843f2174..d7caa776 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/PostNotifications.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/PostNotifications.kt
@@ -10,7 +10,6 @@ import androidx.core.util.forEach
import androidx.core.util.set
import pl.szczodrzynski.edziennik.*
import pl.szczodrzynski.edziennik.data.db.entity.Notification.Companion.TYPE_SERVER_MESSAGE
-import pl.szczodrzynski.edziennik.utils.models.Time
import pl.szczodrzynski.edziennik.data.db.entity.Notification as AppNotification
class PostNotifications(val app: App, nList: List) {
@@ -18,34 +17,22 @@ class PostNotifications(val app: App, nList: List) {
private const val TAG = "PostNotifications"
}
- private val quiet by lazy { shouldBeQuiet() }
- fun shouldBeQuiet(): Boolean {
- if (!app.config.sync.quietHoursEnabled)
- return false
- val now = Time.getNow().value
- val start = app.config.sync.quietHoursStart?.value ?: return false
- var end = app.config.sync.quietHoursEnd?.value ?: return false
+ /*public boolean shouldBeQuiet() {
+ long now = Time.getNow().getInMillis();
+ long start = app.config.getSync().getQuietHoursStart();
+ long end = app.config.getSync().getQuietHoursEnd();
if (start > end) {
- // the range spans between two days
- end += 240000
+ end += 1000 * 60 * 60 * 24;
+ //Log.d(TAG, "Night passing");
}
- return now in start..end || now+240000 in start..end
- }
-
- private fun NotificationCompat.Builder.addDefaults(): NotificationCompat.Builder {
- return this.setColor(0xff2196f3.toInt())
- .setLights(0xff2196f3.toInt(), 2000, 2000)
- .setPriority(if (quiet) NotificationCompat.PRIORITY_LOW else NotificationCompat.PRIORITY_MAX)
- .also {
- if (quiet) {
- it.setSound(null)
- it.setVibrate(longArrayOf())
- }
- else
- it.setDefaults(NotificationCompat.DEFAULT_ALL)
- }
- .setGroup(if (quiet) app.notificationChannelsManager.dataQuiet.key else app.notificationChannelsManager.data.key)
- }
+ if (start > now) {
+ now += 1000 * 60 * 60 * 24;
+ //Log.d(TAG, "Now is smaller");
+ }
+ //Log.d(TAG, "Start is "+start+", now is "+now+", end is "+end);
+ return start > 0 && now >= start && now <= end;
+ }*/
+ fun shouldBeQuiet() = false
private fun buildSummaryText(summaryCounts: SparseIntArray): CharSequence {
val summaryTexts = mutableListOf()
@@ -121,7 +108,11 @@ class PostNotifications(val app: App, nList: List) {
it.addLine(line)
}
})
- .addDefaults()
+ .setColor(0xff2196f3.toInt())
+ .setLights(0xff2196f3.toInt(), 2000, 2000)
+ .setPriority(NotificationCompat.PRIORITY_MAX)
+ .setDefaults(NotificationCompat.DEFAULT_ALL)
+ .setGroup(app.notificationChannelsManager.data.key)
.setContentIntent(summaryIntent)
.setAutoCancel(true)
.build()
@@ -140,7 +131,11 @@ class PostNotifications(val app: App, nList: List) {
.setStyle(NotificationCompat.BigTextStyle()
.bigText(it.text))
.setWhen(it.addedDate)
- .addDefaults()
+ .setColor(0xff2196f3.toInt())
+ .setLights(0xff2196f3.toInt(), 2000, 2000)
+ .setPriority(NotificationCompat.PRIORITY_MAX)
+ .setDefaults(NotificationCompat.DEFAULT_ALL)
+ .setGroup(app.notificationChannelsManager.data.key)
.setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY)
.setContentIntent(it.getPendingIntent(app))
.setAutoCancel(true)
@@ -160,7 +155,11 @@ class PostNotifications(val app: App, nList: List) {
.setContentText(buildSummaryText(summaryCounts))
.setTicker(newNotificationsText)
.setSmallIcon(R.drawable.ic_notification)
- .addDefaults()
+ .setColor(0xff2196f3.toInt())
+ .setLights(0xff2196f3.toInt(), 2000, 2000)
+ .setPriority(NotificationCompat.PRIORITY_MAX)
+ .setDefaults(NotificationCompat.DEFAULT_ALL)
+ .setGroup(app.notificationChannelsManager.data.key)
.setGroupSummary(true)
.setContentIntent(summaryIntent)
.setAutoCancel(true)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/SzkolnyTask.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/SzkolnyTask.kt
index 3ac80495..497efdee 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/SzkolnyTask.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/SzkolnyTask.kt
@@ -31,37 +31,19 @@ class SzkolnyTask(val app: App, val syncingProfiles: List) : IApiTask(-
val notifications = Notifications(app, notificationList, profiles)
notifications.run()
- val appSyncProfiles = profiles.filter { it.registration == Profile.REGISTRATION_ENABLED && !it.archived }
- // App Sync conditions:
- // - every 24 hours && any profile is registered
- // - if there are new notifications && any browser is paired
- val shouldAppSync =
- System.currentTimeMillis() - app.config.sync.lastAppSync > 24*HOUR*1000
- && appSyncProfiles.isNotEmpty()
- || notificationList.isNotEmpty()
- && app.config.sync.webPushEnabled
-
+ val shouldAppSync = notificationList.isNotEmpty() || (System.currentTimeMillis() - app.config.lastAppSync > 24*HOUR*1000)
+ // do an AppSync every 24 hours, or if WebPush has a notification
if (shouldAppSync) {
// send notifications to web push, get shared events
- val addedEvents = AppSync(app, notificationList, appSyncProfiles, api).run(app.config.sync.lastAppSync)
+ val addedEvents = AppSync(app, notificationList, profiles, api).run()
if (addedEvents > 0) {
// create notifications for shared events (not present before app sync)
notifications.sharedEventNotifications()
}
+ app.config.lastAppSync = System.currentTimeMillis()
}
d(TAG, "Created ${notificationList.count()} notifications.")
- // filter notifications
- notificationList
- .mapNotNull { it.profileId }
- .distinct()
- .map { app.config.getFor(it).sync.notificationFilter }
- .forEach { filter ->
- filter.forEach { type ->
- notificationList.removeAll { it.type == type }
- }
- }
-
// update the database
app.db.metadataDao().setAllNotified(true)
if (notificationList.isNotEmpty())
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt
index aee8e3af..8d521e83 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt
@@ -41,9 +41,8 @@ import pl.szczodrzynski.edziennik.data.db.migration.*
Lesson::class,
ConfigEntry::class,
LibrusLesson::class,
- TimetableManual::class,
Metadata::class
-], version = 89)
+], version = 77)
@TypeConverters(
ConverterTime::class,
ConverterDate::class,
@@ -81,7 +80,6 @@ abstract class AppDb : RoomDatabase() {
abstract fun timetableDao(): TimetableDao
abstract fun configDao(): ConfigDao
abstract fun librusLessonDao(): LibrusLessonDao
- abstract fun timetableManualDao(): TimetableManualDao
abstract fun metadataDao(): MetadataDao
companion object {
@@ -162,19 +160,7 @@ abstract class AppDb : RoomDatabase() {
Migration74(),
Migration75(),
Migration76(),
- Migration77(),
- Migration78(),
- Migration79(),
- Migration80(),
- Migration81(),
- Migration82(),
- Migration83(),
- Migration84(),
- Migration85(),
- Migration86(),
- Migration87(),
- Migration88(),
- Migration89()
+ Migration77()
).allowMainThreadQueries().build()
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/converter/ConverterDateInt.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/converter/ConverterDateInt.kt
index 0ffaadcb..fdcb5793 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/converter/ConverterDateInt.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/converter/ConverterDateInt.kt
@@ -8,7 +8,7 @@ import pl.szczodrzynski.edziennik.utils.models.Date
class ConverterDateInt {
@TypeConverter
- fun toDate(value: Int): Date? = if (value == 0) null else Date.fromValue(value)
+ fun toDate(value: Int): Date = Date.fromValue(value)
@TypeConverter
fun toInt(date: Date?): Int = date?.value ?: 0
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AnnouncementDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AnnouncementDao.java
new file mode 100644
index 00000000..ab32fb7c
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AnnouncementDao.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) Kacper Ziubryniewicz 2020-1-6
+ */
+
+package pl.szczodrzynski.edziennik.data.db.dao;
+
+import androidx.lifecycle.LiveData;
+import androidx.room.Dao;
+import androidx.room.Insert;
+import androidx.room.OnConflictStrategy;
+import androidx.room.Query;
+import androidx.room.RawQuery;
+import androidx.sqlite.db.SimpleSQLiteQuery;
+import androidx.sqlite.db.SupportSQLiteQuery;
+
+import java.util.List;
+
+import pl.szczodrzynski.edziennik.data.db.entity.Announcement;
+import pl.szczodrzynski.edziennik.data.db.entity.Metadata;
+import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull;
+
+import static pl.szczodrzynski.edziennik.data.db.entity.Metadata.TYPE_ANNOUNCEMENT;
+
+@Dao
+public abstract class AnnouncementDao {
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ public abstract long add(Announcement announcement);
+
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ public abstract void addAll(List announcementList);
+
+ @Insert(onConflict = OnConflictStrategy.IGNORE)
+ public abstract void addAllIgnore(List announcementList);
+
+ @Query("DELETE FROM announcements WHERE profileId = :profileId")
+ public abstract void clear(int profileId);
+
+ @RawQuery(observedEntities = {Announcement.class, Metadata.class})
+ abstract LiveData> getAll(SupportSQLiteQuery query);
+ public LiveData> getAll(int profileId, String filter) {
+ return getAll(new SimpleSQLiteQuery("SELECT \n" +
+ "*, \n" +
+ "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" +
+ "FROM announcements \n" +
+ "LEFT JOIN teachers USING(profileId, teacherId)\n" +
+ "LEFT JOIN metadata ON announcementId = thingId AND thingType = "+TYPE_ANNOUNCEMENT+" AND metadata.profileId = "+profileId+"\n" +
+ "WHERE announcements.profileId = "+profileId+" AND "+filter+"\n" +
+ "ORDER BY addedDate DESC"));
+ }
+ public LiveData> getAll(int profileId) {
+ return getAll(profileId, "1");
+ }
+ public LiveData> getAllWhere(int profileId, String filter) {
+ return getAll(profileId, filter);
+ }
+
+ @RawQuery(observedEntities = {Announcement.class, Metadata.class})
+ abstract List getAllNow(SupportSQLiteQuery query);
+ public List getAllNow(int profileId, String filter) {
+ return getAllNow(new SimpleSQLiteQuery("SELECT \n" +
+ "*, \n" +
+ "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" +
+ "FROM announcements \n" +
+ "LEFT JOIN teachers USING(profileId, teacherId)\n" +
+ "LEFT JOIN metadata ON announcementId = thingId AND thingType = "+TYPE_ANNOUNCEMENT+" AND metadata.profileId = "+profileId+"\n" +
+ "WHERE announcements.profileId = "+profileId+" AND "+filter+"\n" +
+ "ORDER BY addedDate DESC"));
+ }
+ public List getNotNotifiedNow(int profileId) {
+ return getAllNow(profileId, "notified = 0");
+ }
+
+ @Query("SELECT " +
+ "*, " +
+ "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName " +
+ "FROM announcements " +
+ "LEFT JOIN teachers USING(profileId, teacherId) " +
+ "LEFT JOIN metadata ON announcementId = thingId AND thingType = "+TYPE_ANNOUNCEMENT+" AND metadata.profileId = announcements.profileId " +
+ "WHERE notified = 0 " +
+ "ORDER BY addedDate DESC")
+ public abstract List getNotNotifiedNow();
+}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AnnouncementDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AnnouncementDao.kt
deleted file mode 100644
index 67e034c5..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AnnouncementDao.kt
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-4-25.
- */
-package pl.szczodrzynski.edziennik.data.db.dao
-
-import androidx.lifecycle.LiveData
-import androidx.room.Dao
-import androidx.room.Query
-import androidx.room.RawQuery
-import androidx.sqlite.db.SupportSQLiteQuery
-import pl.szczodrzynski.edziennik.App
-import pl.szczodrzynski.edziennik.annotation.SelectiveDao
-import pl.szczodrzynski.edziennik.annotation.UpdateSelective
-import pl.szczodrzynski.edziennik.data.db.AppDb
-import pl.szczodrzynski.edziennik.data.db.entity.Announcement
-import pl.szczodrzynski.edziennik.data.db.entity.Metadata
-import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
-
-@Dao
-@SelectiveDao(db = AppDb::class)
-abstract class AnnouncementDao : BaseDao {
- companion object {
- private const val QUERY = """
- SELECT
- *,
- teachers.teacherName ||" "|| teachers.teacherSurname AS teacherName
- FROM announcements
- LEFT JOIN teachers USING(profileId, teacherId)
- LEFT JOIN metadata ON announcementId = thingId AND thingType = ${Metadata.TYPE_ANNOUNCEMENT} AND metadata.profileId = announcements.profileId
- """
-
- private const val ORDER_BY = """ORDER BY addedDate DESC"""
- }
-
- private val selective by lazy { AnnouncementDaoSelective(App.db) }
-
- @RawQuery(observedEntities = [Announcement::class])
- abstract override fun getRaw(query: SupportSQLiteQuery): LiveData>
- @RawQuery(observedEntities = [Announcement::class])
- abstract override fun getOne(query: SupportSQLiteQuery): LiveData
-
- // SELECTIVE UPDATE
- @UpdateSelective(primaryKeys = ["profileId", "announcementId"], skippedColumns = ["addedDate", "announcementText"])
- override fun update(item: Announcement) = selective.update(item)
- override fun updateAll(items: List) = selective.updateAll(items)
-
- // CLEAR
- @Query("DELETE FROM announcements WHERE profileId = :profileId")
- abstract override fun clear(profileId: Int)
- // REMOVE NOT KEPT
- @Query("DELETE FROM announcements WHERE keep = 0")
- abstract override fun removeNotKept()
-
- // GET ALL - LIVE DATA
- fun getAll(profileId: Int) =
- getRaw("$QUERY WHERE announcements.profileId = $profileId $ORDER_BY")
-
- // GET ALL - NOW
- fun getAllNow(profileId: Int) =
- getRawNow("$QUERY WHERE announcements.profileId = $profileId $ORDER_BY")
- fun getNotNotifiedNow() =
- getRawNow("$QUERY WHERE notified = 0 $ORDER_BY")
- fun getNotNotifiedNow(profileId: Int) =
- getRawNow("$QUERY WHERE announcements.profileId = $profileId AND notified = 0 $ORDER_BY")
-
- // GET ONE - NOW
- fun getByIdNow(profileId: Int, id: Long) =
- getOneNow("$QUERY WHERE announcements.profileId = $profileId AND announcementId = $id")
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AttendanceDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AttendanceDao.java
new file mode 100644
index 00000000..95c3147f
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AttendanceDao.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) Kacper Ziubryniewicz 2020-1-6
+ */
+
+package pl.szczodrzynski.edziennik.data.db.dao;
+
+import androidx.lifecycle.LiveData;
+import androidx.room.Dao;
+import androidx.room.Insert;
+import androidx.room.OnConflictStrategy;
+import androidx.room.Query;
+import androidx.room.RawQuery;
+import androidx.sqlite.db.SimpleSQLiteQuery;
+import androidx.sqlite.db.SupportSQLiteQuery;
+
+import java.util.List;
+
+import pl.szczodrzynski.edziennik.data.db.entity.Attendance;
+import pl.szczodrzynski.edziennik.data.db.full.AttendanceFull;
+import pl.szczodrzynski.edziennik.utils.models.Date;
+
+import static pl.szczodrzynski.edziennik.data.db.entity.Metadata.TYPE_ATTENDANCE;
+
+@Dao
+public abstract class AttendanceDao {
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ public abstract long add(Attendance attendance);
+
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ public abstract void addAll(List attendanceList);
+
+ @Query("DELETE FROM attendances WHERE profileId = :profileId")
+ public abstract void clear(int profileId);
+
+ @Query("DELETE FROM attendances WHERE profileId = :profileId AND attendanceLessonDate > :date")
+ public abstract void clearAfterDate(int profileId, Date date);
+
+ @RawQuery(observedEntities = {Attendance.class})
+ abstract LiveData> getAll(SupportSQLiteQuery query);
+ public LiveData> getAll(int profileId, String filter) {
+ return getAll(new SimpleSQLiteQuery("SELECT \n" +
+ "*, \n" +
+ "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" +
+ "FROM attendances \n" +
+ "LEFT JOIN teachers USING(profileId, teacherId)\n" +
+ "LEFT JOIN subjects USING(profileId, subjectId)\n" +
+ "LEFT JOIN metadata ON attendanceId = thingId AND thingType = " + TYPE_ATTENDANCE + " AND metadata.profileId = "+profileId+"\n" +
+ "WHERE attendances.profileId = "+profileId+" AND "+filter+"\n" +
+ "ORDER BY attendanceLessonDate DESC, attendanceStartTime DESC"));
+ }
+ public LiveData> getAll(int profileId) {
+ return getAll(profileId, "1");
+ }
+ public LiveData> getAllWhere(int profileId, String filter) {
+ return getAll(profileId, filter);
+ }
+
+ @RawQuery
+ abstract List getAllNow(SupportSQLiteQuery query);
+ public List getAllNow(int profileId, String filter) {
+ return getAllNow(new SimpleSQLiteQuery("SELECT \n" +
+ "*, \n" +
+ "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName\n" +
+ "FROM attendances \n" +
+ "LEFT JOIN teachers USING(profileId, teacherId)\n" +
+ "LEFT JOIN subjects USING(profileId, subjectId)\n" +
+ "LEFT JOIN metadata ON attendanceId = thingId AND thingType = " + TYPE_ATTENDANCE + " AND metadata.profileId = "+profileId+"\n" +
+ "WHERE attendances.profileId = "+profileId+" AND "+filter+"\n" +
+ "ORDER BY attendanceLessonDate DESC, attendanceStartTime DESC"));
+ }
+ public List getNotNotifiedNow(int profileId) {
+ return getAllNow(profileId, "notified = 0");
+ }
+
+ @Query("SELECT * FROM attendances " +
+ "LEFT JOIN subjects USING(profileId, subjectId) " +
+ "LEFT JOIN metadata ON attendanceId = thingId AND thingType = " + TYPE_ATTENDANCE + " AND metadata.profileId = attendances.profileId " +
+ "WHERE notified = 0 " +
+ "ORDER BY attendanceLessonDate DESC, attendanceStartTime DESC")
+ public abstract List getNotNotifiedNow();
+
+ // only absent and absent_excused count as absences
+ // all the other types are counted as being present
+ @Query("SELECT \n" +
+ "CAST(SUM(CASE WHEN attendanceType != "+Attendance.TYPE_ABSENT+" AND attendanceType != "+ Attendance.TYPE_ABSENT_EXCUSED+" THEN 1 ELSE 0 END) AS float)\n" +
+ " / \n" +
+ "CAST(count() AS float)*100 \n" +
+ "FROM attendances \n" +
+ "WHERE profileId = :profileId")
+ public abstract LiveData getAttendancePercentage(int profileId);
+
+ @Query("SELECT \n" +
+ "CAST(SUM(CASE WHEN attendanceType != "+Attendance.TYPE_ABSENT+" AND attendanceType != "+Attendance.TYPE_ABSENT_EXCUSED+" THEN 1 ELSE 0 END) AS float)\n" +
+ " / \n" +
+ "CAST(count() AS float)*100 \n" +
+ "FROM attendances \n" +
+ "WHERE profileId = :profileId AND attendanceSemester = :semester")
+ public abstract float getAttendancePercentageNow(int profileId, int semester);
+
+ @Query("SELECT \n" +
+ "CAST(SUM(CASE WHEN attendanceType != "+Attendance.TYPE_ABSENT+" AND attendanceType != "+Attendance.TYPE_ABSENT_EXCUSED+" THEN 1 ELSE 0 END) AS float)\n" +
+ " / \n" +
+ "CAST(count() AS float)*100 \n" +
+ "FROM attendances \n" +
+ "WHERE profileId = :profileId")
+ public abstract float getAttendancePercentageNow(int profileId);
+}
+
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AttendanceDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AttendanceDao.kt
deleted file mode 100644
index 97513689..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/AttendanceDao.kt
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-4-24.
- */
-package pl.szczodrzynski.edziennik.data.db.dao
-
-import androidx.lifecycle.LiveData
-import androidx.room.Dao
-import androidx.room.Query
-import androidx.room.RawQuery
-import androidx.sqlite.db.SupportSQLiteQuery
-import pl.szczodrzynski.edziennik.App
-import pl.szczodrzynski.edziennik.annotation.SelectiveDao
-import pl.szczodrzynski.edziennik.annotation.UpdateSelective
-import pl.szczodrzynski.edziennik.data.db.AppDb
-import pl.szczodrzynski.edziennik.data.db.entity.Attendance
-import pl.szczodrzynski.edziennik.data.db.entity.Metadata
-import pl.szczodrzynski.edziennik.data.db.full.AttendanceFull
-import pl.szczodrzynski.edziennik.utils.models.Date
-
-@Dao
-@SelectiveDao(db = AppDb::class)
-abstract class AttendanceDao : BaseDao {
- companion object {
- private const val QUERY = """
- SELECT
- *,
- teachers.teacherName ||" "|| teachers.teacherSurname AS teacherName
- FROM attendances
- LEFT JOIN teachers USING(profileId, teacherId)
- LEFT JOIN subjects USING(profileId, subjectId)
- LEFT JOIN metadata ON attendanceId = thingId AND thingType = ${Metadata.TYPE_ATTENDANCE} AND metadata.profileId = attendances.profileId
- """
-
- private const val ORDER_BY = """ORDER BY attendanceDate DESC, attendanceTime DESC"""
- }
-
- private val selective by lazy { AttendanceDaoSelective(App.db) }
-
- @RawQuery(observedEntities = [Attendance::class])
- abstract override fun getRaw(query: SupportSQLiteQuery): LiveData>
- @RawQuery(observedEntities = [Attendance::class])
- abstract override fun getOne(query: SupportSQLiteQuery): LiveData
-
- // SELECTIVE UPDATE
- @UpdateSelective(primaryKeys = ["profileId", "attendanceId"], skippedColumns = ["addedDate", "announcementText"])
- override fun update(item: Attendance) = selective.update(item)
- override fun updateAll(items: List) = selective.updateAll(items)
-
- // CLEAR
- @Query("DELETE FROM attendances WHERE profileId = :profileId")
- abstract override fun clear(profileId: Int)
- // REMOVE NOT KEPT
- @Query("DELETE FROM attendances WHERE keep = 0")
- abstract override fun removeNotKept()
-
- // GET ALL - LIVE DATA
- fun getAll(profileId: Int) =
- getRaw("$QUERY WHERE attendances.profileId = $profileId $ORDER_BY")
-
- // GET ALL - NOW
- fun getAllNow(profileId: Int) =
- getRawNow("$QUERY WHERE attendances.profileId = $profileId $ORDER_BY")
- fun getNotNotifiedNow() =
- getRawNow("$QUERY WHERE notified = 0 $ORDER_BY")
- fun getNotNotifiedNow(profileId: Int) =
- getRawNow("$QUERY WHERE attendances.profileId = $profileId AND notified = 0 $ORDER_BY")
-
- // GET ONE - NOW
- fun getByIdNow(profileId: Int, id: Long) =
- getOneNow("$QUERY WHERE attendances.profileId = $profileId AND attendanceId = $id")
-
- @Query("UPDATE attendances SET keep = 0 WHERE profileId = :profileId AND attendanceDate >= :date")
- abstract fun dontKeepAfterDate(profileId: Int, date: Date?)
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/BaseDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/BaseDao.kt
deleted file mode 100644
index 0ae961db..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/BaseDao.kt
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) Kuba Szczodrzyński 2020-3-28.
- */
-
-package pl.szczodrzynski.edziennik.data.db.dao
-
-import androidx.lifecycle.LiveData
-import androidx.room.*
-import androidx.sqlite.db.SimpleSQLiteQuery
-import androidx.sqlite.db.SupportSQLiteQuery
-import pl.szczodrzynski.edziennik.data.db.entity.Keepable
-
-@Dao
-interface BaseDao {
- @RawQuery
- fun getRaw(query: SupportSQLiteQuery): LiveData>
- fun getRaw(query: String) = getRaw(SimpleSQLiteQuery(query))
- @RawQuery
- fun getOne(query: SupportSQLiteQuery): LiveData
- fun getOne(query: String) = getOne(SimpleSQLiteQuery(query))
- @RawQuery
- fun getRawNow(query: SupportSQLiteQuery): List
- fun getRawNow(query: String) = getRawNow(SimpleSQLiteQuery(query))
- @RawQuery
- fun getOneNow(query: SupportSQLiteQuery): F?
- fun getOneNow(query: String) = getOneNow(SimpleSQLiteQuery(query))
-
- fun removeNotKept()
-
- /**
- * INSERT an [item] into the database,
- * ignoring any conflicts.
- */
- @Insert(onConflict = OnConflictStrategy.IGNORE)
- fun add(item: T): Long
- /**
- * INSERT [items] into the database,
- * ignoring any conflicts.
- */
- @Insert(onConflict = OnConflictStrategy.IGNORE)
- fun addAll(items: List): LongArray
-
- /**
- * REPLACE an [item] in the database,
- * removing any conflicting rows.
- * Creates the item if it does not exist yet.
- */
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- fun replace(item: T)
- /**
- * REPLACE [items] in the database,
- * removing any conflicting rows.
- * Creates items if it does not exist yet.
- */
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- fun replaceAll(items: List)
-
- /**
- * Selective UPDATE an [item] in the database.
- * Do nothing if a matching item does not exist.
- */
- fun update(item: T): Long
- /**
- * Selective UPDATE [items] in the database.
- * Do nothing for those items which do not exist.
- */
- fun updateAll(items: List): LongArray
-
- /**
- * Remove all items from the database,
- * that match the given [profileId].
- */
- fun clear(profileId: Int)
-
- /**
- * INSERT an [item] into the database,
- * doing a selective [update] on conflicts.
- * @return the newly inserted item's ID or -1L if the item was updated instead
- */
- @Transaction
- fun upsert(item: T): Long {
- val id = add(item)
- if (id == -1L) update(item)
- return id
- }
- /**
- * INSERT [items] into the database,
- * doing a selective [update] on conflicts.
- * @return a [LongArray] of IDs of newly inserted items or -1L if the item existed before
- */
- @Transaction
- fun upsertAll(items: List, removeNotKept: Boolean = false): LongArray {
- val insertResult = addAll(items)
- val updateList = mutableListOf()
-
- insertResult.forEachIndexed { index, result ->
- if (result == -1L) updateList.add(items[index])
- }
-
- if (updateList.isNotEmpty()) updateAll(items)
- if (removeNotKept) removeNotKept()
- return insertResult
- }
-
- /**
- * Make sure that [items] are in the database.
- * When [forceReplace] == false, do a selective update (UPSERT).
- * When [forceReplace] == true, add all items replacing any conflicting ones (REPLACE).
- *
- * @param forceReplace whether to replace all items instead of selectively updating
- * @param removeNotKept whether to remove all items whose [keep] parameter is false
- */
- fun putAll(items: List, forceReplace: Boolean = false, removeNotKept: Boolean = false) {
- if (items.isEmpty())
- return
- if (forceReplace)
- replaceAll(items)
- else
- upsertAll(items, removeNotKept = false)
-
- if (removeNotKept) removeNotKept()
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventDao.java
new file mode 100644
index 00000000..8d11b11b
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventDao.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) Kacper Ziubryniewicz 2020-1-6
+ */
+
+package pl.szczodrzynski.edziennik.data.db.dao;
+
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.LiveData;
+import androidx.room.Dao;
+import androidx.room.Insert;
+import androidx.room.OnConflictStrategy;
+import androidx.room.Query;
+import androidx.room.RawQuery;
+import androidx.room.Transaction;
+import androidx.sqlite.db.SimpleSQLiteQuery;
+import androidx.sqlite.db.SupportSQLiteQuery;
+
+import java.util.List;
+
+import pl.szczodrzynski.edziennik.data.db.entity.Event;
+import pl.szczodrzynski.edziennik.data.db.full.EventFull;
+import pl.szczodrzynski.edziennik.utils.models.Date;
+import pl.szczodrzynski.edziennik.utils.models.Time;
+
+import static pl.szczodrzynski.edziennik.data.db.entity.Metadata.TYPE_EVENT;
+import static pl.szczodrzynski.edziennik.data.db.entity.Metadata.TYPE_HOMEWORK;
+import static pl.szczodrzynski.edziennik.data.db.entity.Metadata.TYPE_LESSON_CHANGE;
+
+@Dao
+public abstract class EventDao {
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ public abstract long add(Event event);
+
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ public abstract long[] addAll(List eventList);
+
+ @Query("DELETE FROM events WHERE profileId = :profileId")
+ public abstract void clear(int profileId);
+
+ @Query("DELETE FROM events WHERE profileId = :profileId AND eventId = :id")
+ public abstract void remove(int profileId, long id);
+ @Query("DELETE FROM metadata WHERE profileId = :profileId AND thingType = :thingType AND thingId = :thingId")
+ public abstract void removeMetadata(int profileId, int thingType, long thingId);
+ @Transaction
+ public void remove(int profileId, long type, long id) {
+ remove(profileId, id);
+ removeMetadata(profileId, type == Event.TYPE_HOMEWORK ? TYPE_HOMEWORK : TYPE_EVENT, id);
+ }
+ @Transaction
+ public void remove(Event event) {
+ remove(event.profileId, event.type, event.id);
+ }
+ @Transaction
+ public void remove(int profileId, Event event) {
+ remove(profileId, event.type, event.id);
+ }
+ @Query("DELETE FROM events WHERE teamId = :teamId AND eventId = :id")
+ public abstract void removeByTeamId(long teamId, long id);
+
+ @RawQuery(observedEntities = {Event.class})
+ abstract LiveData> getAll(SupportSQLiteQuery query);
+ public LiveData> getAll(int profileId, String filter) {
+ String query = "SELECT \n" +
+ "*, \n" +
+ "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName,\n" +
+ "eventTypes.eventTypeName AS typeName,\n" +
+ "eventTypes.eventTypeColor AS typeColor\n" +
+ "FROM events\n" +
+ "LEFT JOIN subjects USING(profileId, subjectId)\n" +
+ "LEFT JOIN teachers USING(profileId, teacherId)\n" +
+ "LEFT JOIN teams USING(profileId, teamId)\n" +
+ "LEFT JOIN eventTypes USING(profileId, eventType)\n" +
+ "LEFT JOIN metadata ON eventId = thingId AND (thingType = " + TYPE_EVENT + " OR thingType = " + TYPE_HOMEWORK + ") AND metadata.profileId = "+profileId+"\n" +
+ "WHERE events.profileId = "+profileId+" AND events.eventBlacklisted = 0 AND "+filter+"\n" +
+ "GROUP BY eventId\n" +
+ "ORDER BY eventDate, eventStartTime ASC";
+ Log.d("DB", query);
+ return getAll(new SimpleSQLiteQuery(query));
+ }
+ public LiveData> getAll(int profileId) {
+ return getAll(profileId, "1");
+ }
+ public List getAllNow(int profileId) {
+ return getAllNow(profileId, "1");
+ }
+ public LiveData> getAllWhere(int profileId, String filter) {
+ return getAll(profileId, filter);
+ }
+ public LiveData> getAllByType(int profileId, long type, String filter) {
+ return getAll(profileId, "eventType = "+type+" AND "+filter);
+ }
+ public LiveData> getAllByDate(int profileId, @NonNull Date date) {
+ return getAll(profileId, "eventDate = '"+date.getStringY_m_d()+"'");
+ }
+ public List getAllByDateNow(int profileId, @NonNull Date date) {
+ return getAllNow(profileId, "eventDate = '"+date.getStringY_m_d()+"'");
+ }
+ public LiveData> getAllByDateTime(int profileId, @NonNull Date date, Time time) {
+ if (time == null)
+ return getAllByDate(profileId, date);
+ return getAll(profileId, "eventDate = '"+date.getStringY_m_d()+"' AND eventStartTime = '"+time.getStringValue()+"'");
+ }
+
+ @RawQuery
+ abstract List getAllNow(SupportSQLiteQuery query);
+ public List getAllNow(int profileId, String filter) {
+ return getAllNow(new SimpleSQLiteQuery("SELECT \n" +
+ "*, \n" +
+ "teachers.teacherName || ' ' || teachers.teacherSurname AS teacherFullName,\n" +
+ "eventTypes.eventTypeName AS typeName,\n" +
+ "eventTypes.eventTypeColor AS typeColor\n" +
+ "FROM events \n" +
+ "LEFT JOIN subjects USING(profileId, subjectId)\n" +
+ "LEFT JOIN teachers USING(profileId, teacherId)\n" +
+ "LEFT JOIN teams USING(profileId, teamId)\n" +
+ "LEFT JOIN eventTypes USING(profileId, eventType)\n" +
+ "LEFT JOIN metadata ON eventId = thingId AND (thingType = " + TYPE_EVENT + " OR thingType = " + TYPE_HOMEWORK + ") AND metadata.profileId = "+profileId+"\n" +
+ "WHERE events.profileId = "+profileId+" AND events.eventBlacklisted = 0 AND "+filter+"\n" +
+ "GROUP BY eventId\n" +
+ "ORDER BY eventStartTime, addedDate ASC"));
+ }
+ public List getNotNotifiedNow(int profileId) {
+ return getAllNow(profileId, "notified = 0");
+ }
+
+ @Query("SELECT eventId FROM events WHERE profileId = :profileId AND eventBlacklisted = 1")
+ public abstract List getBlacklistedIds(int profileId);
+ @Query("SELECT eventId FROM events WHERE eventBlacklisted = 1")
+ public abstract List getBlacklistedIds();
+
+ @Query("SELECT " +
+ "*, " +
+ "eventTypes.eventTypeName AS typeName, " +
+ "eventTypes.eventTypeColor AS typeColor " +
+ "FROM events " +
+ "LEFT JOIN subjects USING(profileId, subjectId) " +
+ "LEFT JOIN eventTypes USING(profileId, eventType) " +
+ "LEFT JOIN metadata ON eventId = thingId AND (thingType = " + TYPE_EVENT + " OR thingType = " + TYPE_HOMEWORK + ") AND metadata.profileId = events.profileId " +
+ "WHERE events.eventBlacklisted = 0 AND notified = 0 " +
+ "GROUP BY eventId " +
+ "ORDER BY addedDate ASC")
+ public abstract List getNotNotifiedNow();
+
+ public EventFull getByIdNow(int profileId, long eventId) {
+ List eventList = getAllNow(profileId, "eventId = "+eventId);
+ return eventList.size() == 0 ? null : eventList.get(0);
+ }
+
+ @Query("UPDATE events SET eventAddedManually = 1 WHERE profileId = :profileId AND eventDate < :date")
+ public abstract void convertOlderToManual(int profileId, Date date);
+
+ @Query("DELETE FROM events WHERE profileId = :profileId AND eventAddedManually = 0")
+ public abstract void removeNotManual(int profileId);
+
+ @RawQuery
+ abstract long removeFuture(SupportSQLiteQuery query);
+ @Transaction
+ public void removeFuture(int profileId, Date todayDate, String filter) {
+ removeFuture(new SimpleSQLiteQuery("DELETE FROM events WHERE profileId = " + profileId
+ + " AND eventAddedManually = 0 AND eventDate >= '" + todayDate.getStringY_m_d() + "'" +
+ " AND " + filter));
+ }
+
+ @Query("DELETE FROM events WHERE profileId = :profileId AND eventAddedManually = 0 AND eventDate >= :todayDate AND eventType = :type")
+ public abstract void removeFutureWithType(int profileId, Date todayDate, long type);
+
+ @Query("DELETE FROM events WHERE profileId = :profileId AND eventAddedManually = 0 AND eventDate >= :todayDate AND eventType != :exceptType")
+ public abstract void removeFutureExceptType(int profileId, Date todayDate, long exceptType);
+
+ @Transaction
+ public void removeFutureExceptTypes(int profileId, Date todayDate, List exceptTypes) {
+ removeFuture(profileId, todayDate, "eventType NOT IN " + exceptTypes.toString().replace('[', '(').replace(']', ')'));
+ }
+
+ @Query("UPDATE metadata SET seen = :seen WHERE profileId = :profileId AND (thingType = "+TYPE_EVENT+" OR thingType = "+TYPE_LESSON_CHANGE+" OR thingType = "+TYPE_HOMEWORK+") AND thingId IN (SELECT eventId FROM events WHERE profileId = :profileId AND eventDate = :date)")
+ public abstract void setSeenByDate(int profileId, Date date, boolean seen);
+
+ @Query("UPDATE events SET eventBlacklisted = :blacklisted WHERE profileId = :profileId AND eventId = :eventId")
+ public abstract void setBlacklisted(int profileId, long eventId, boolean blacklisted);
+}
+
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventDao.kt
deleted file mode 100644
index a532602b..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventDao.kt
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-1-6
- */
-package pl.szczodrzynski.edziennik.data.db.dao
-
-import androidx.lifecycle.LiveData
-import androidx.room.Dao
-import androidx.room.Query
-import androidx.room.RawQuery
-import androidx.room.Transaction
-import androidx.sqlite.db.SimpleSQLiteQuery
-import androidx.sqlite.db.SupportSQLiteQuery
-import pl.szczodrzynski.edziennik.App
-import pl.szczodrzynski.edziennik.annotation.SelectiveDao
-import pl.szczodrzynski.edziennik.annotation.UpdateSelective
-import pl.szczodrzynski.edziennik.data.db.AppDb
-import pl.szczodrzynski.edziennik.data.db.entity.Event
-import pl.szczodrzynski.edziennik.data.db.entity.Metadata
-import pl.szczodrzynski.edziennik.data.db.full.EventFull
-import pl.szczodrzynski.edziennik.utils.models.Date
-import pl.szczodrzynski.edziennik.utils.models.Time
-
-@Dao
-@SelectiveDao(db = AppDb::class)
-abstract class EventDao : BaseDao {
- companion object {
- private const val QUERY = """
- SELECT
- *,
- teachers.teacherName ||" "|| teachers.teacherSurname AS teacherName,
- eventTypes.eventTypeName AS typeName,
- eventTypes.eventTypeColor AS typeColor
- FROM events
- LEFT JOIN teachers USING(profileId, teacherId)
- LEFT JOIN subjects USING(profileId, subjectId)
- LEFT JOIN teams USING(profileId, teamId)
- LEFT JOIN eventTypes USING(profileId, eventType)
- LEFT JOIN metadata ON eventId = thingId AND (thingType = ${Metadata.TYPE_EVENT} OR thingType = ${Metadata.TYPE_HOMEWORK}) AND metadata.profileId = events.profileId
- """
-
- private const val ORDER_BY = """GROUP BY eventId ORDER BY eventDate, eventTime, addedDate ASC"""
- private const val NOT_BLACKLISTED = """events.eventBlacklisted = 0"""
- private const val NOT_DONE = """events.eventIsDone = 0"""
- }
-
- private val selective by lazy { EventDaoSelective(App.db) }
-
- @RawQuery(observedEntities = [Event::class])
- abstract override fun getRaw(query: SupportSQLiteQuery): LiveData>
- @RawQuery(observedEntities = [Event::class])
- abstract override fun getOne(query: SupportSQLiteQuery): LiveData
-
- // SELECTIVE UPDATE
- @UpdateSelective(primaryKeys = ["profileId", "eventId"], skippedColumns = ["eventIsDone", "eventBlacklisted", "homeworkBody", "attachmentIds", "attachmentNames"])
- override fun update(item: Event) = selective.update(item)
- override fun updateAll(items: List) = selective.updateAll(items)
-
- // CLEAR
- @Query("DELETE FROM events WHERE profileId = :profileId")
- abstract override fun clear(profileId: Int)
- // REMOVE NOT KEPT
- @Query("DELETE FROM events WHERE keep = 0")
- abstract override fun removeNotKept()
-
- // GET ALL - LIVE DATA
- fun getAll(profileId: Int) =
- getRaw("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId $ORDER_BY")
- fun getAllByType(profileId: Int, type: Long, filter: String = "1") =
- getRaw("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId AND eventType = $type AND $filter $ORDER_BY")
- fun getAllByDate(profileId: Int, date: Date) =
- getRaw("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId AND eventDate = '${date.stringY_m_d}' $ORDER_BY")
- fun getAllByDateTime(profileId: Int, date: Date, time: Time) =
- getRaw("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId AND eventDate = '${date.stringY_m_d}' AND eventTime = '${time.stringValue}' $ORDER_BY")
- fun getNearestNotDone(profileId: Int, today: Date, limit: Int) =
- getRaw("$QUERY WHERE $NOT_BLACKLISTED AND $NOT_DONE AND events.profileId = $profileId AND eventDate >= '${today.stringY_m_d}' $ORDER_BY LIMIT $limit")
-
- // GET ALL - NOW
- fun getAllNow(profileId: Int) =
- getRawNow("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId $ORDER_BY")
- fun getNotNotifiedNow() =
- getRawNow("$QUERY WHERE $NOT_BLACKLISTED AND notified = 0 $ORDER_BY")
- fun getNotNotifiedNow(profileId: Int) =
- getRawNow("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId AND notified = 0 $ORDER_BY")
- fun getAllByDateNow(profileId: Int, date: Date) =
- getRawNow("$QUERY WHERE $NOT_BLACKLISTED AND events.profileId = $profileId AND eventDate = '${date.stringY_m_d}' $ORDER_BY")
-
- // GET ONE - NOW
- fun getByIdNow(profileId: Int, id: Long) =
- getOneNow("$QUERY WHERE events.profileId = $profileId AND eventId = $id")
-
-
- @Query("SELECT eventId FROM events WHERE profileId = :profileId AND eventBlacklisted = 1")
- abstract fun getBlacklistedIds(profileId: Int): List
-
- @get:Query("SELECT eventId FROM events WHERE eventBlacklisted = 1")
- abstract val blacklistedIds: List
-
- /*@Query("UPDATE events SET eventAddedManually = 1 WHERE profileId = :profileId AND eventDate < :date")
- abstract fun convertOlderToManual(profileId: Int, date: Date?)
-
- @Query("DELETE FROM events WHERE teamId = :teamId AND eventId = :id")
- abstract fun removeByTeamId(teamId: Long, id: Long)
-
- @Query("DELETE FROM events WHERE profileId = :profileId AND eventAddedManually = 0")
- abstract fun removeNotManual(profileId: Int)*/
-
- @RawQuery
- abstract fun dontKeepFuture(query: SupportSQLiteQuery?): Long
-
- @Transaction
- open fun dontKeepFuture(profileId: Int, todayDate: Date, filter: String) {
- dontKeepFuture(SimpleSQLiteQuery("UPDATE events SET keep = 0 WHERE profileId = " + profileId
- + " AND eventAddedManually = 0 AND eventDate >= '" + todayDate.stringY_m_d + "'" +
- " AND " + filter))
- }
-
- @Query("UPDATE events SET keep = 0 WHERE profileId = :profileId AND eventAddedManually = 0 AND eventDate >= :todayDate")
- abstract fun dontKeepFuture(profileId: Int, todayDate: Date)
-
- @Query("UPDATE events SET keep = 0 WHERE profileId = :profileId AND eventAddedManually = 0 AND eventDate >= :todayDate AND eventType = :type")
- abstract fun dontKeepFutureWithType(profileId: Int, todayDate: Date, type: Long)
-
- @Query("UPDATE events SET keep = 0 WHERE profileId = :profileId AND eventAddedManually = 0 AND eventDate >= :todayDate AND eventType != :exceptType")
- abstract fun dontKeepFutureExceptType(profileId: Int, todayDate: Date, exceptType: Long)
-
- @Transaction
- open fun dontKeepFutureExceptTypes(profileId: Int, todayDate: Date, exceptTypes: List) {
- dontKeepFuture(profileId, todayDate, "eventType NOT IN " + exceptTypes.toString().replace('[', '(').replace(']', ')'))
- }
-
- @Query("UPDATE metadata SET seen = :seen WHERE profileId = :profileId AND (thingType = " + Metadata.TYPE_EVENT + " OR thingType = " + Metadata.TYPE_LESSON_CHANGE + " OR thingType = " + Metadata.TYPE_HOMEWORK + ") AND thingId IN (SELECT eventId FROM events WHERE profileId = :profileId AND eventDate = :date)")
- abstract fun setSeenByDate(profileId: Int, date: Date, seen: Boolean)
-
- @Query("UPDATE events SET eventBlacklisted = :blacklisted WHERE profileId = :profileId AND eventId = :eventId")
- abstract fun setBlacklisted(profileId: Int, eventId: Long, blacklisted: Boolean)
-
- @Query("DELETE FROM events WHERE profileId = :profileId AND eventId = :id")
- abstract fun remove(profileId: Int, id: Long)
-
- @Query("DELETE FROM metadata WHERE profileId = :profileId AND thingType = :thingType AND thingId = :thingId")
- abstract fun removeMetadata(profileId: Int, thingType: Int, thingId: Long)
-
- @Transaction
- open fun remove(profileId: Int, type: Long, id: Long) {
- remove(profileId, id)
- removeMetadata(profileId, if (type == Event.TYPE_HOMEWORK) Metadata.TYPE_HOMEWORK else Metadata.TYPE_EVENT, id)
- }
-
- @Transaction
- open fun remove(event: Event) {
- remove(event.profileId, event.type, event.id)
- }
-
- @Transaction
- open fun remove(profileId: Int, event: Event) {
- remove(profileId, event.type, event.id)
- }
-
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventTypeDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventTypeDao.java
new file mode 100644
index 00000000..25366699
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventTypeDao.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) Kacper Ziubryniewicz 2020-1-6
+ */
+
+package pl.szczodrzynski.edziennik.data.db.dao;
+
+import androidx.lifecycle.LiveData;
+import androidx.room.Dao;
+import androidx.room.Insert;
+import androidx.room.OnConflictStrategy;
+import androidx.room.Query;
+
+import java.util.List;
+
+import pl.szczodrzynski.edziennik.data.db.entity.EventType;
+
+@Dao
+public interface EventTypeDao {
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ void add(EventType gradeCategory);
+
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ void addAll(List gradeCategoryList);
+
+ @Query("DELETE FROM eventTypes WHERE profileId = :profileId")
+ void clear(int profileId);
+
+ @Query("SELECT * FROM eventTypes WHERE profileId = :profileId AND eventType = :typeId")
+ EventType getByIdNow(int profileId, long typeId);
+
+ @Query("SELECT * FROM eventTypes WHERE profileId = :profileId")
+ LiveData> getAll(int profileId);
+
+ @Query("SELECT * FROM eventTypes WHERE profileId = :profileId")
+ List getAllNow(int profileId);
+
+ @Query("SELECT * FROM eventTypes")
+ List getAllNow();
+}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventTypeDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventTypeDao.kt
deleted file mode 100644
index 28be6d65..00000000
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/EventTypeDao.kt
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) Kacper Ziubryniewicz 2020-1-6
- */
-package pl.szczodrzynski.edziennik.data.db.dao
-
-import android.content.Context
-import androidx.lifecycle.LiveData
-import androidx.room.Dao
-import androidx.room.Insert
-import androidx.room.OnConflictStrategy
-import androidx.room.Query
-import pl.szczodrzynski.edziennik.R
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_CLASS_EVENT
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_DEFAULT
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_ESSAY
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_EXAM
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_EXCURSION
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_HOMEWORK
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_INFORMATION
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_PROJECT
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_PT_MEETING
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_READING
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_SHORT_QUIZ
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_CLASS_EVENT
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_DEFAULT
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_ESSAY
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_EXAM
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_EXCURSION
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_HOMEWORK
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_INFORMATION
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_PROJECT
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_PT_MEETING
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_READING
-import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_SHORT_QUIZ
-import pl.szczodrzynski.edziennik.data.db.entity.EventType
-
-@Dao
-abstract class EventTypeDao {
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- abstract fun add(eventType: EventType)
-
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- abstract fun addAll(eventTypeList: List)
-
- @Query("DELETE FROM eventTypes WHERE profileId = :profileId")
- abstract fun clear(profileId: Int)
-
- @Query("SELECT * FROM eventTypes WHERE profileId = :profileId AND eventType = :typeId")
- abstract fun getByIdNow(profileId: Int, typeId: Long): EventType?
-
- @Query("SELECT * FROM eventTypes WHERE profileId = :profileId")
- abstract fun getAll(profileId: Int): LiveData>
-
- @Query("SELECT * FROM eventTypes WHERE profileId = :profileId")
- abstract fun getAllNow(profileId: Int): List
-
- @get:Query("SELECT * FROM eventTypes")
- abstract val allNow: List
-
- fun addDefaultTypes(context: Context, profileId: Int): List {
- val typeList = listOf(
- EventType(profileId, TYPE_HOMEWORK, context.getString(R.string.event_type_homework), COLOR_HOMEWORK),
- EventType(profileId, TYPE_DEFAULT, context.getString(R.string.event_other), COLOR_DEFAULT),
- EventType(profileId, TYPE_EXAM, context.getString(R.string.event_exam), COLOR_EXAM),
- EventType(profileId, TYPE_SHORT_QUIZ, context.getString(R.string.event_short_quiz), COLOR_SHORT_QUIZ),
- EventType(profileId, TYPE_ESSAY, context.getString(R.string.event_essay), COLOR_ESSAY),
- EventType(profileId, TYPE_PROJECT, context.getString(R.string.event_project), COLOR_PROJECT),
- EventType(profileId, TYPE_PT_MEETING, context.getString(R.string.event_pt_meeting), COLOR_PT_MEETING),
- EventType(profileId, TYPE_EXCURSION, context.getString(R.string.event_excursion), COLOR_EXCURSION),
- EventType(profileId, TYPE_READING, context.getString(R.string.event_reading), COLOR_READING),
- EventType(profileId, TYPE_CLASS_EVENT, context.getString(R.string.event_class_event), COLOR_CLASS_EVENT),
- EventType(profileId, TYPE_INFORMATION, context.getString(R.string.event_information), COLOR_INFORMATION)
- )
- addAll(typeList)
- return typeList
- }
-}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/GradeDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/GradeDao.kt
index 4fcfc721..9c3e93c5 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/GradeDao.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/GradeDao.kt
@@ -1,103 +1,102 @@
/*
- * Copyright (c) Kuba Szczodrzyński 2020-4-24.
+ * Copyright (c) Kacper Ziubryniewicz 2020-1-6
*/
package pl.szczodrzynski.edziennik.data.db.dao
import androidx.lifecycle.LiveData
-import androidx.room.Dao
-import androidx.room.Query
-import androidx.room.RawQuery
-import androidx.room.Transaction
+import androidx.room.*
+import androidx.sqlite.db.SimpleSQLiteQuery
import androidx.sqlite.db.SupportSQLiteQuery
-import pl.szczodrzynski.edziennik.App
-import pl.szczodrzynski.edziennik.annotation.SelectiveDao
-import pl.szczodrzynski.edziennik.annotation.UpdateSelective
-import pl.szczodrzynski.edziennik.data.db.AppDb
import pl.szczodrzynski.edziennik.data.db.entity.Grade
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
import pl.szczodrzynski.edziennik.data.db.full.GradeFull
-import pl.szczodrzynski.edziennik.utils.models.Date
import java.util.*
+import kotlin.collections.List
import kotlin.collections.component1
import kotlin.collections.component2
+import kotlin.collections.iterator
import kotlin.collections.set
@Dao
-@SelectiveDao(db = AppDb::class)
-abstract class GradeDao : BaseDao {
- companion object {
- private const val QUERY = """
- SELECT
- *,
- teachers.teacherName ||" "|| teachers.teacherSurname AS teacherName
- FROM grades
- LEFT JOIN teachers USING(profileId, teacherId)
- LEFT JOIN subjects USING(profileId, subjectId)
- LEFT JOIN metadata ON gradeId = thingId AND thingType = ${Metadata.TYPE_GRADE} AND metadata.profileId = grades.profileId
- """
+abstract class GradeDao {
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ abstract fun add(grade: Grade): Long
- private const val ORDER_BY = """ORDER BY addedDate DESC"""
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ abstract fun addAll(gradeList: List