forked from github/szkolny
Compare commits
No commits in common. "v4.3.1" and "v4.0-beta.14" have entirely different histories.
v4.3.1
...
v4.0-beta.
554 changed files with 10405 additions and 20014 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -87,4 +87,3 @@ app/schemas/
|
||||||
signatures/
|
signatures/
|
||||||
|
|
||||||
app/.cxx
|
app/.cxx
|
||||||
/i18n/
|
|
||||||
|
|
16
.idea/compiler.xml
generated
16
.idea/compiler.xml
generated
|
@ -1,16 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="CompilerConfiguration">
|
|
||||||
<bytecodeTargetLevel target="1.7">
|
|
||||||
<module name="annotation" target="1.7" />
|
|
||||||
<module name="codegen" target="1.7" />
|
|
||||||
<module name="Szkolny.eu.agendacalendarview" target="1.8" />
|
|
||||||
<module name="Szkolny.eu.app" target="1.8" />
|
|
||||||
<module name="Szkolny.eu.cafebar" target="1.8" />
|
|
||||||
<module name="Szkolny.eu.material-about-library" target="1.8" />
|
|
||||||
<module name="Szkolny.eu.mhttp" target="1.8" />
|
|
||||||
<module name="Szkolny.eu.nachos" target="1.8" />
|
|
||||||
<module name="Szkolny.eu.szkolny-font" target="1.8" />
|
|
||||||
</bytecodeTargetLevel>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
10
.idea/jarRepositories.xml
generated
10
.idea/jarRepositories.xml
generated
|
@ -41,15 +41,5 @@
|
||||||
<option name="name" value="MavenRepo" />
|
<option name="name" value="MavenRepo" />
|
||||||
<option name="url" value="https://repo.maven.apache.org/maven2/" />
|
<option name="url" value="https://repo.maven.apache.org/maven2/" />
|
||||||
</remote-repository>
|
</remote-repository>
|
||||||
<remote-repository>
|
|
||||||
<option name="id" value="maven4" />
|
|
||||||
<option name="name" value="maven4" />
|
|
||||||
<option name="url" value="https://dl.bintray.com/undervoid/Powerpermission" />
|
|
||||||
</remote-repository>
|
|
||||||
<remote-repository>
|
|
||||||
<option name="id" value="maven4" />
|
|
||||||
<option name="name" value="maven4" />
|
|
||||||
<option name="url" value="https://dl.bintray.com/undervoid/PowerPermission" />
|
|
||||||
</remote-repository>
|
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
3
.idea/misc.xml
generated
3
.idea/misc.xml
generated
|
@ -11,6 +11,7 @@
|
||||||
<item index="1" class="java.lang.String" itemvalue="org.greenrobot.eventbus.Subscribe" />
|
<item index="1" class="java.lang.String" itemvalue="org.greenrobot.eventbus.Subscribe" />
|
||||||
</list>
|
</list>
|
||||||
</component>
|
</component>
|
||||||
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
<component name="NullableNotNullManager">
|
<component name="NullableNotNullManager">
|
||||||
<option name="myDefaultNullable" value="org.jetbrains.annotations.Nullable" />
|
<option name="myDefaultNullable" value="org.jetbrains.annotations.Nullable" />
|
||||||
<option name="myDefaultNotNull" value="androidx.annotation.RecentlyNonNull" />
|
<option name="myDefaultNotNull" value="androidx.annotation.RecentlyNonNull" />
|
||||||
|
@ -50,7 +51,7 @@
|
||||||
</value>
|
</value>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="false" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectType">
|
<component name="ProjectType">
|
||||||
|
|
1
annotation/.gitignore
vendored
1
annotation/.gitignore
vendored
|
@ -1 +0,0 @@
|
||||||
/build
|
|
|
@ -1,29 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) Kuba Szczodrzyński 2020-3-28.
|
|
||||||
*/
|
|
||||||
|
|
||||||
apply plugin: 'java-library'
|
|
||||||
apply plugin: 'kotlin'
|
|
||||||
apply plugin: 'kotlin-kapt'
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
|
||||||
}
|
|
||||||
|
|
||||||
sourceCompatibility = "7"
|
|
||||||
targetCompatibility = "7"
|
|
||||||
|
|
||||||
repositories {
|
|
||||||
mavenCentral()
|
|
||||||
}
|
|
||||||
compileKotlin {
|
|
||||||
kotlinOptions {
|
|
||||||
jvmTarget = "1.8"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
compileTestKotlin {
|
|
||||||
kotlinOptions {
|
|
||||||
jvmTarget = "1.8"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) Kuba Szczodrzyński 2020-3-28.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.annotation
|
|
||||||
|
|
||||||
import kotlin.reflect.KClass
|
|
||||||
|
|
||||||
@Target(AnnotationTarget.CLASS)
|
|
||||||
@Retention(AnnotationRetention.SOURCE)
|
|
||||||
@MustBeDocumented
|
|
||||||
annotation class SelectiveDao(
|
|
||||||
val db: KClass<*>
|
|
||||||
)
|
|
|
@ -1,13 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) Kuba Szczodrzyński 2020-3-28.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.annotation
|
|
||||||
|
|
||||||
@Target(AnnotationTarget.FUNCTION)
|
|
||||||
@Retention(AnnotationRetention.SOURCE)
|
|
||||||
@MustBeDocumented
|
|
||||||
annotation class UpdateSelective(
|
|
||||||
val primaryKeys: Array<String>,
|
|
||||||
val skippedColumns: Array<String> = []
|
|
||||||
)
|
|
|
@ -128,7 +128,6 @@ dependencies {
|
||||||
implementation "com.mikepenz:iconics-core:${versions.iconics}"
|
implementation "com.mikepenz:iconics-core:${versions.iconics}"
|
||||||
implementation "com.mikepenz:iconics-views:${versions.iconics}"
|
implementation "com.mikepenz:iconics-views:${versions.iconics}"
|
||||||
implementation "com.mikepenz:community-material-typeface:${versions.font_cmd}@aar"
|
implementation "com.mikepenz:community-material-typeface:${versions.font_cmd}@aar"
|
||||||
implementation "com.mikepenz:materialize:1.2.1"
|
|
||||||
|
|
||||||
implementation "com.github.kuba2k2:NavLib:${versions.navlib}"
|
implementation "com.github.kuba2k2:NavLib:${versions.navlib}"
|
||||||
|
|
||||||
|
@ -145,11 +144,7 @@ dependencies {
|
||||||
implementation("com.github.ozodrukh:CircularReveal:2.0.1@aar") {transitive = true}
|
implementation("com.github.ozodrukh:CircularReveal:2.0.1@aar") {transitive = true}
|
||||||
implementation "com.heinrichreimersoftware:material-intro:1.5.8" // do not update
|
implementation "com.heinrichreimersoftware:material-intro:1.5.8" // do not update
|
||||||
implementation "com.jaredrummler:colorpicker:1.0.2"
|
implementation "com.jaredrummler:colorpicker:1.0.2"
|
||||||
implementation("com.squareup.okhttp3:okhttp") {
|
implementation "com.squareup.okhttp3:okhttp:3.12.2"
|
||||||
version {
|
|
||||||
strictly "3.12.2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
implementation "com.theartofdev.edmodo:android-image-cropper:2.8.0" // do not update
|
implementation "com.theartofdev.edmodo:android-image-cropper:2.8.0" // do not update
|
||||||
implementation "com.wdullaer:materialdatetimepicker:4.1.2"
|
implementation "com.wdullaer:materialdatetimepicker:4.1.2"
|
||||||
implementation "com.yuyh.json:jsonviewer:1.0.6"
|
implementation "com.yuyh.json:jsonviewer:1.0.6"
|
||||||
|
@ -197,19 +192,6 @@ dependencies {
|
||||||
implementation "io.coil-kt:coil:0.9.2"
|
implementation "io.coil-kt:coil:0.9.2"
|
||||||
|
|
||||||
implementation 'com.github.kuba2k2:NumberSlidingPicker:2921225f76'
|
implementation 'com.github.kuba2k2:NumberSlidingPicker:2921225f76'
|
||||||
|
|
||||||
implementation project(":annotation")
|
|
||||||
kapt project(":codegen")
|
|
||||||
|
|
||||||
implementation 'com.google.android:flexbox:2.0.1'
|
|
||||||
|
|
||||||
implementation 'com.qifan.powerpermission:powerpermission:1.3.0'
|
|
||||||
implementation 'com.qifan.powerpermission:powerpermission-coroutines:1.3.0'
|
|
||||||
|
|
||||||
implementation 'com.github.kuba2k2.FSLogin:lib:master-SNAPSHOT'
|
|
||||||
implementation 'pl.droidsonroids:jspoon:1.3.2'
|
|
||||||
implementation "com.squareup.retrofit2:converter-scalars:2.8.1"
|
|
||||||
implementation "pl.droidsonroids.retrofit2:converter-jspoon:1.3.2"
|
|
||||||
}
|
}
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
|
|
@ -31,12 +31,6 @@
|
||||||
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.notifications.WidgetNotificationsProvider
|
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.notifications.WidgetNotificationsProvider
|
||||||
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.luckynumber.WidgetLuckyNumberProvider
|
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.luckynumber.WidgetLuckyNumberProvider
|
||||||
|
|
||||||
-keepnames class androidx.appcompat.view.menu.MenuBuilder { setHeaderTitleInt(java.lang.CharSequence); }
|
|
||||||
-keepclassmembernames class androidx.appcompat.view.menu.StandardMenuPopup { private *; }
|
|
||||||
-keepnames class androidx.appcompat.view.menu.MenuPopupHelper { showPopup(int, int, boolean, boolean); }
|
|
||||||
|
|
||||||
-keepclassmembernames class com.mikepenz.materialdrawer.widget.MiniDrawerSliderView { private *; }
|
|
||||||
|
|
||||||
-keep class .R
|
-keep class .R
|
||||||
-keep class **.R$* {
|
-keep class **.R$* {
|
||||||
<fields>;
|
<fields>;
|
||||||
|
@ -66,4 +60,3 @@
|
||||||
|
|
||||||
-keepclassmembernames class pl.szczodrzynski.edziennik.data.api.szkolny.request.** { *; }
|
-keepclassmembernames class pl.szczodrzynski.edziennik.data.api.szkolny.request.** { *; }
|
||||||
-keepclassmembernames class pl.szczodrzynski.edziennik.data.api.szkolny.response.** { *; }
|
-keepclassmembernames class pl.szczodrzynski.edziennik.data.api.szkolny.response.** { *; }
|
||||||
-keepclassmembernames class pl.szczodrzynski.edziennik.ui.modules.login.LoginInfo.Platform { *; }
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 7.6 KiB |
|
@ -14,9 +14,6 @@
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
<!-- PowerPermission uses minSdk 21, it's safe to override as it is used only in >= 23 -->
|
|
||||||
<uses-sdk tools:overrideLibrary="com.qifan.powerpermission.coroutines, com.qifan.powerpermission.core" />
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".App"
|
android:name=".App"
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
|
@ -24,6 +21,7 @@
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:networkSecurityConfig="@xml/network_security_config"
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/AppTheme.Dark"
|
android:theme="@style/AppTheme.Dark"
|
||||||
android:usesCleartextTraffic="true"
|
android:usesCleartextTraffic="true"
|
||||||
|
@ -134,6 +132,9 @@
|
||||||
android:configChanges="orientation|screenSize"
|
android:configChanges="orientation|screenSize"
|
||||||
android:launchMode="singleTop"
|
android:launchMode="singleTop"
|
||||||
android:theme="@style/AppTheme.Light" />
|
android:theme="@style/AppTheme.Light" />
|
||||||
|
<activity android:name=".ui.modules.login.LoginLibrusCaptchaActivity"
|
||||||
|
android:theme="@android:style/Theme.Dialog"
|
||||||
|
android:excludeFromRecents="true"/>
|
||||||
<activity android:name=".ui.modules.home.CounterActivity"
|
<activity android:name=".ui.modules.home.CounterActivity"
|
||||||
android:theme="@style/AppTheme.Black" />
|
android:theme="@style/AppTheme.Black" />
|
||||||
<activity android:name=".ui.modules.feedback.FeedbackActivity"
|
<activity android:name=".ui.modules.feedback.FeedbackActivity"
|
||||||
|
|
|
@ -1,10 +1,38 @@
|
||||||
<h3>Wersja 4.3.1, 2020-08-27</h3>
|
<h3>Wersja 4.0-beta.14, 2020-03-24</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Dodana opcja automatycznej archiwizacji profilu na nowy rok szkolny.</li>
|
<li><b>Przebudowaliśmy cały moduł synchronizacji</b>, co oznacza większą stabilność aplikacji, szybkość oraz poprawność pobieranych danych.</li>
|
||||||
<li>Poprawione problemy z synchronizacją oraz mieszaniem się danych.</li>
|
<li><b><u>Wysyłanie wiadomości</u></b> - funkcja, na którą czekał każdy. Od teraz w Szkolnym można wysyłać oraz odpowiadać na wiadomości do nauczycieli 👏</li>
|
||||||
<li>Przywrócona synchronizacja w wakacje.</li>
|
<li>Udoskonalony wygląd Szkolnego - sprawi, że korzystanie z aplikacji będzie jeszcze przyjemniejsze</li>
|
||||||
|
<li>Nowa <b>Strona główna</b> - ładniejszy wygląd oraz możliwość przestawiania kart na każdym profilu</li>
|
||||||
|
<li>Nowy <b>Plan lekcji</b> - z doskonałą obsługą lekcji przesuniętych oraz dwóch lekcji o tej samej godzinie</li>
|
||||||
|
<li>Nowe <b>Oceny</b> - z możliwością zmiany wartości plusów oraz minusów oraz wyłączenia niektórych ocen ze średniej</li>
|
||||||
|
<li>Opcja wyłączenia wybranych powiadomień z aplikacji</li>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<li>Nowe okienka informacji o wydarzeniach oraz lekcjach</li>
|
||||||
|
<li>Nowe, przyjemniejsze powiadomienia</li>
|
||||||
|
<li>Dużo poprawek w widoku <b>Wiadomości</b> oraz <b>Ogłoszeń</b></li>
|
||||||
|
<li>Częściowa <b>Obsługa dziennika EduDziennik</b></li>
|
||||||
|
<li>Librus: opcja logowania w dziennikach <b>Jednostek Samorządu Terytorialnego</b> oraz <b>Oświata w Radomiu</b></li>
|
||||||
|
<li>Librus: <b>poprawione obliczanie frekwencji</b></li>
|
||||||
|
<li>Librus: obsługa Zadań domowych bez posiadania Mobilnych dodatków (przez system Synergia)</li>
|
||||||
|
<li>Lepsze <b>przekazywanie powiadomień na komputer</b> oraz łatwiejsze parowanie</li>
|
||||||
|
<li>Łatwiejsze dodawanie własnych wydarzeń</li>
|
||||||
|
<li>Poprawiliśmy synchronizację w tle na niektórych telefonach</li>
|
||||||
|
<li>Usunąłem denerwujący brak zaznaczenia w lewym menu</li>
|
||||||
|
<li>Znaczna ilość błędów z poprzednich wersji już nie występuje</li>
|
||||||
|
<li><strike>Występują natomiast nowe błędy, dlatego proszę o ich zgłaszanie :)</strike></li>
|
||||||
</ul>
|
</ul>
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
<br>
|
||||||
|
<b>Uwaga.</b> Ponieważ to wersja <i>beta</i>, niektóre funkcje mogą nie działać prawidłowo.<br>
|
||||||
|
Staramy się usuwać takie przypadki, jednak na chwilę obecną mogą występować błędy w:
|
||||||
|
<ul>
|
||||||
|
<li>Wysyłanie wiadomości może nie działać w pełni prawidłowo - proszę o zgłaszanie wszystkich błędów na naszym serwerze Discord</li>
|
||||||
|
</ul>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
Dzięki za korzystanie ze Szkolnego!<br>
|
Dzięki za korzystanie ze Szkolnego!<br>
|
||||||
<i>© Kuba Szczodrzyński, Kacper Ziubryniewicz 2020</i>
|
<i>© Kuba Szczodrzyński, Kacper Ziubryniewicz 2020</i>
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
/*secret password - removed for source code publication*/
|
/*secret password - removed for source code publication*/
|
||||||
static toys AES_IV[16] = {
|
static toys AES_IV[16] = {
|
||||||
0x24, 0x85, 0x31, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
0xc4, 0x97, 0xfb, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||||
|
|
||||||
unsigned char *agony(unsigned int laugh, unsigned char *box, unsigned char *heat);
|
unsigned char *agony(unsigned int laugh, unsigned char *box, unsigned char *heat);
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,9 @@ import com.hypertrack.hyperlog.HyperLog
|
||||||
import com.mikepenz.iconics.Iconics
|
import com.mikepenz.iconics.Iconics
|
||||||
import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont
|
import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont
|
||||||
import im.wangchao.mhttp.MHttp
|
import im.wangchao.mhttp.MHttp
|
||||||
|
import im.wangchao.mhttp.internal.cookie.PersistentCookieJar
|
||||||
|
import im.wangchao.mhttp.internal.cookie.cache.SetCookieCache
|
||||||
|
import im.wangchao.mhttp.internal.cookie.persistence.SharedPrefsCookiePersistor
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
import me.leolin.shortcutbadger.ShortcutBadger
|
import me.leolin.shortcutbadger.ShortcutBadger
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
|
@ -38,13 +41,14 @@ import pl.szczodrzynski.edziennik.data.api.szkolny.interceptor.Signing
|
||||||
import pl.szczodrzynski.edziennik.data.db.AppDb
|
import pl.szczodrzynski.edziennik.data.db.AppDb
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
||||||
import pl.szczodrzynski.edziennik.network.NetworkUtils
|
import pl.szczodrzynski.edziennik.network.NetworkUtils
|
||||||
import pl.szczodrzynski.edziennik.network.cookie.DumbCookieJar
|
|
||||||
import pl.szczodrzynski.edziennik.sync.SyncWorker
|
import pl.szczodrzynski.edziennik.sync.SyncWorker
|
||||||
import pl.szczodrzynski.edziennik.sync.UpdateWorker
|
import pl.szczodrzynski.edziennik.sync.UpdateWorker
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.base.CrashActivity
|
import pl.szczodrzynski.edziennik.ui.modules.base.CrashActivity
|
||||||
import pl.szczodrzynski.edziennik.utils.*
|
import pl.szczodrzynski.edziennik.utils.*
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
import pl.szczodrzynski.edziennik.utils.managers.GradesManager
|
||||||
import pl.szczodrzynski.edziennik.utils.managers.*
|
import pl.szczodrzynski.edziennik.utils.managers.NotificationChannelsManager
|
||||||
|
import pl.szczodrzynski.edziennik.utils.managers.TimetableManager
|
||||||
|
import pl.szczodrzynski.edziennik.utils.managers.UserActionManager
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import kotlin.coroutines.CoroutineContext
|
import kotlin.coroutines.CoroutineContext
|
||||||
|
|
||||||
|
@ -65,9 +69,6 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
||||||
val userActionManager by lazy { UserActionManager(this) }
|
val userActionManager by lazy { UserActionManager(this) }
|
||||||
val gradesManager by lazy { GradesManager(this) }
|
val gradesManager by lazy { GradesManager(this) }
|
||||||
val timetableManager by lazy { TimetableManager(this) }
|
val timetableManager by lazy { TimetableManager(this) }
|
||||||
val eventManager by lazy { EventManager(this) }
|
|
||||||
val permissionManager by lazy { PermissionManager(this) }
|
|
||||||
val attendanceManager by lazy { AttendanceManager(this) }
|
|
||||||
|
|
||||||
val db
|
val db
|
||||||
get() = App.db
|
get() = App.db
|
||||||
|
@ -102,9 +103,9 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
||||||
.followSslRedirects(true)
|
.followSslRedirects(true)
|
||||||
.retryOnConnectionFailure(true)
|
.retryOnConnectionFailure(true)
|
||||||
.cookieJar(cookieJar)
|
.cookieJar(cookieJar)
|
||||||
.connectTimeout(15, TimeUnit.SECONDS)
|
.connectTimeout(20, TimeUnit.SECONDS)
|
||||||
.writeTimeout(10, TimeUnit.SECONDS)
|
.writeTimeout(5, TimeUnit.SECONDS)
|
||||||
.readTimeout(30, TimeUnit.SECONDS)
|
.readTimeout(10, TimeUnit.SECONDS)
|
||||||
builder.installHttpsSupport(this)
|
builder.installHttpsSupport(this)
|
||||||
|
|
||||||
if (debugMode || BuildConfig.DEBUG) {
|
if (debugMode || BuildConfig.DEBUG) {
|
||||||
|
@ -124,7 +125,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
||||||
.followSslRedirects(false)
|
.followSslRedirects(false)
|
||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
val cookieJar by lazy { DumbCookieJar(this) }
|
val cookieJar by lazy { PersistentCookieJar(SetCookieCache(), SharedPrefsCookiePersistor(this)) }
|
||||||
|
|
||||||
/* _____ _ _
|
/* _____ _ _
|
||||||
/ ____(_) | |
|
/ ____(_) | |
|
||||||
|
@ -169,13 +170,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
||||||
db.profileDao().firstId?.let { profileLoadById(it) }
|
db.profileDao().firstId?.let { profileLoadById(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
config.ui.language?.let {
|
devMode = "f054761fbdb6a238" == deviceId || BuildConfig.DEBUG
|
||||||
setLanguage(it)
|
|
||||||
}
|
|
||||||
|
|
||||||
devMode = BuildConfig.DEBUG
|
|
||||||
if (BuildConfig.DEBUG)
|
|
||||||
debugMode = true
|
|
||||||
|
|
||||||
Signing.getCert(this)
|
Signing.getCert(this)
|
||||||
|
|
||||||
|
@ -258,10 +253,6 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
||||||
val pushMobidziennikApp = FirebaseApp.initializeApp(
|
val pushMobidziennikApp = FirebaseApp.initializeApp(
|
||||||
this@App,
|
this@App,
|
||||||
FirebaseOptions.Builder()
|
FirebaseOptions.Builder()
|
||||||
.setProjectId("mobidziennik")
|
|
||||||
.setStorageBucket("mobidziennik.appspot.com")
|
|
||||||
.setDatabaseUrl("https://mobidziennik.firebaseio.com")
|
|
||||||
.setGcmSenderId("747285019373")
|
|
||||||
.setApiKey("AIzaSyCi5LmsZ5BBCQnGtrdvWnp1bWLCNP8OWQE")
|
.setApiKey("AIzaSyCi5LmsZ5BBCQnGtrdvWnp1bWLCNP8OWQE")
|
||||||
.setApplicationId("1:747285019373:android:f6341bf7b158621d")
|
.setApplicationId("1:747285019373:android:f6341bf7b158621d")
|
||||||
.build(),
|
.build(),
|
||||||
|
@ -271,10 +262,6 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
||||||
val pushLibrusApp = FirebaseApp.initializeApp(
|
val pushLibrusApp = FirebaseApp.initializeApp(
|
||||||
this@App,
|
this@App,
|
||||||
FirebaseOptions.Builder()
|
FirebaseOptions.Builder()
|
||||||
.setProjectId("synergiadru")
|
|
||||||
.setStorageBucket("synergiadru.appspot.com")
|
|
||||||
.setDatabaseUrl("https://synergiadru.firebaseio.com")
|
|
||||||
.setGcmSenderId("513056078587")
|
|
||||||
.setApiKey("AIzaSyDfTuEoYPKdv4aceEws1CO3n0-HvTndz-o")
|
.setApiKey("AIzaSyDfTuEoYPKdv4aceEws1CO3n0-HvTndz-o")
|
||||||
.setApplicationId("1:513056078587:android:1e29083b760af544")
|
.setApplicationId("1:513056078587:android:1e29083b760af544")
|
||||||
.build(),
|
.build(),
|
||||||
|
@ -284,10 +271,6 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
||||||
val pushVulcanApp = FirebaseApp.initializeApp(
|
val pushVulcanApp = FirebaseApp.initializeApp(
|
||||||
this@App,
|
this@App,
|
||||||
FirebaseOptions.Builder()
|
FirebaseOptions.Builder()
|
||||||
.setProjectId("dzienniczekplus")
|
|
||||||
.setStorageBucket("dzienniczekplus.appspot.com")
|
|
||||||
.setDatabaseUrl("https://dzienniczekplus.firebaseio.com")
|
|
||||||
.setGcmSenderId("987828170337")
|
|
||||||
.setApiKey("AIzaSyDW8MUtanHy64_I0oCpY6cOxB3jrvJd_iA")
|
.setApiKey("AIzaSyDW8MUtanHy64_I0oCpY6cOxB3jrvJd_iA")
|
||||||
.setApplicationId("1:987828170337:android:ac97431a0a4578c3")
|
.setApplicationId("1:987828170337:android:ac97431a0a4578c3")
|
||||||
.build(),
|
.build(),
|
||||||
|
@ -297,12 +280,10 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
||||||
try {
|
try {
|
||||||
FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener { instanceIdResult ->
|
FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener { instanceIdResult ->
|
||||||
val token = instanceIdResult.token
|
val token = instanceIdResult.token
|
||||||
d("Firebase", "Got App token: $token")
|
|
||||||
config.sync.tokenApp = token
|
config.sync.tokenApp = token
|
||||||
}
|
}
|
||||||
FirebaseInstanceId.getInstance(pushMobidziennikApp).instanceId.addOnSuccessListener { instanceIdResult ->
|
FirebaseInstanceId.getInstance(pushMobidziennikApp).instanceId.addOnSuccessListener { instanceIdResult ->
|
||||||
val token = instanceIdResult.token
|
val token = instanceIdResult.token
|
||||||
d("Firebase", "Got Mobidziennik2 token: $token")
|
|
||||||
if (token != config.sync.tokenMobidziennik) {
|
if (token != config.sync.tokenMobidziennik) {
|
||||||
config.sync.tokenMobidziennik = token
|
config.sync.tokenMobidziennik = token
|
||||||
config.sync.tokenMobidziennikList = listOf()
|
config.sync.tokenMobidziennikList = listOf()
|
||||||
|
@ -310,7 +291,6 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
||||||
}
|
}
|
||||||
FirebaseInstanceId.getInstance(pushLibrusApp).instanceId.addOnSuccessListener { instanceIdResult ->
|
FirebaseInstanceId.getInstance(pushLibrusApp).instanceId.addOnSuccessListener { instanceIdResult ->
|
||||||
val token = instanceIdResult.token
|
val token = instanceIdResult.token
|
||||||
d("Firebase", "Got Librus token: $token")
|
|
||||||
if (token != config.sync.tokenLibrus) {
|
if (token != config.sync.tokenLibrus) {
|
||||||
config.sync.tokenLibrus = token
|
config.sync.tokenLibrus = token
|
||||||
config.sync.tokenLibrusList = listOf()
|
config.sync.tokenLibrusList = listOf()
|
||||||
|
@ -318,7 +298,6 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
||||||
}
|
}
|
||||||
FirebaseInstanceId.getInstance(pushVulcanApp).instanceId.addOnSuccessListener { instanceIdResult ->
|
FirebaseInstanceId.getInstance(pushVulcanApp).instanceId.addOnSuccessListener { instanceIdResult ->
|
||||||
val token = instanceIdResult.token
|
val token = instanceIdResult.token
|
||||||
d("Firebase", "Got Vulcan token: $token")
|
|
||||||
if (token != config.sync.tokenVulcan) {
|
if (token != config.sync.tokenVulcan) {
|
||||||
config.sync.tokenVulcan = token
|
config.sync.tokenVulcan = token
|
||||||
config.sync.tokenVulcanList = listOf()
|
config.sync.tokenVulcanList = listOf()
|
||||||
|
@ -364,9 +343,6 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
|
||||||
if (!success) {
|
if (!success) {
|
||||||
EventBus.getDefault().post(ProfileListEmptyEvent())
|
EventBus.getDefault().post(ProfileListEmptyEvent())
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
onSuccess(profile)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fun profileSave() = profileSave(profile)
|
fun profileSave() = profileSave(profile)
|
||||||
|
|
|
@ -27,7 +27,10 @@ import android.util.Base64.NO_WRAP
|
||||||
import android.util.Base64.encodeToString
|
import android.util.Base64.encodeToString
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
import android.widget.*
|
import android.widget.CheckBox
|
||||||
|
import android.widget.CompoundButton
|
||||||
|
import android.widget.RadioButton
|
||||||
|
import android.widget.TextView
|
||||||
import androidx.annotation.*
|
import androidx.annotation.*
|
||||||
import androidx.core.app.ActivityCompat
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.core.database.getIntOrNull
|
import androidx.core.database.getIntOrNull
|
||||||
|
@ -37,12 +40,7 @@ import androidx.core.util.forEach
|
||||||
import androidx.lifecycle.LifecycleOwner
|
import androidx.lifecycle.LifecycleOwner
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import androidx.lifecycle.Observer
|
import androidx.lifecycle.Observer
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
|
||||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
|
||||||
import androidx.viewpager.widget.ViewPager
|
|
||||||
import com.google.android.gms.security.ProviderInstaller
|
import com.google.android.gms.security.ProviderInstaller
|
||||||
import com.google.android.material.button.MaterialButton
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
|
||||||
import com.google.gson.JsonArray
|
import com.google.gson.JsonArray
|
||||||
import com.google.gson.JsonElement
|
import com.google.gson.JsonElement
|
||||||
import com.google.gson.JsonObject
|
import com.google.gson.JsonObject
|
||||||
|
@ -143,10 +141,6 @@ fun CharSequence?.isNotNullNorEmpty(): Boolean {
|
||||||
return this != null && this.isNotEmpty()
|
return this != null && this.isNotEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <T> Collection<T>?.isNotNullNorEmpty(): Boolean {
|
|
||||||
return this != null && this.isNotEmpty()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun CharSequence?.isNotNullNorBlank(): Boolean {
|
fun CharSequence?.isNotNullNorBlank(): Boolean {
|
||||||
return this != null && this.isNotBlank()
|
return this != null && this.isNotBlank()
|
||||||
}
|
}
|
||||||
|
@ -166,13 +160,6 @@ fun Bundle?.getString(key: String, defaultValue: String): String {
|
||||||
return this?.getString(key, defaultValue) ?: defaultValue
|
return this?.getString(key, defaultValue) ?: defaultValue
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Bundle?.getIntOrNull(key: String): Int? {
|
|
||||||
return this?.get(key) as? Int
|
|
||||||
}
|
|
||||||
fun <T : Any> Bundle?.get(key: String): T? {
|
|
||||||
return this?.get(key) as? T?
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ` The quick BROWN_fox Jumps OveR THE LAZy-DOG. `
|
* ` The quick BROWN_fox Jumps OveR THE LAZy-DOG. `
|
||||||
*
|
*
|
||||||
|
@ -455,7 +442,7 @@ operator fun MatchResult.get(group: Int): String {
|
||||||
return groupValues[group]
|
return groupValues[group]
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Context.setLanguage(language: String) {
|
fun Activity.setLanguage(language: String) {
|
||||||
val locale = Locale(language.toLowerCase(Locale.ROOT))
|
val locale = Locale(language.toLowerCase(Locale.ROOT))
|
||||||
val configuration = resources.configuration
|
val configuration = resources.configuration
|
||||||
Locale.setDefault(locale)
|
Locale.setDefault(locale)
|
||||||
|
@ -464,6 +451,7 @@ fun Context.setLanguage(language: String) {
|
||||||
}
|
}
|
||||||
configuration.locale = locale
|
configuration.locale = locale
|
||||||
resources.updateConfiguration(configuration, resources.displayMetrics)
|
resources.updateConfiguration(configuration, resources.displayMetrics)
|
||||||
|
baseContext.resources.updateConfiguration(configuration, baseContext.resources.displayMetrics)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -572,7 +560,7 @@ fun CharSequence?.asBoldSpannable(): Spannable {
|
||||||
spannable.setSpan(StyleSpan(Typeface.BOLD), 0, spannable.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
spannable.setSpan(StyleSpan(Typeface.BOLD), 0, spannable.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||||
return spannable
|
return spannable
|
||||||
}
|
}
|
||||||
fun CharSequence.asSpannable(vararg spans: Any, substring: String? = null, ignoreCase: Boolean = false, ignoreDiacritics: Boolean = false): Spannable {
|
fun CharSequence.asSpannable(vararg spans: Any, substring: String? = null, ignoreCase: Boolean = false): Spannable {
|
||||||
val spannable = SpannableString(this)
|
val spannable = SpannableString(this)
|
||||||
if (substring == null) {
|
if (substring == null) {
|
||||||
spans.forEach {
|
spans.forEach {
|
||||||
|
@ -580,44 +568,17 @@ fun CharSequence.asSpannable(vararg spans: Any, substring: String? = null, ignor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (substring.isNotEmpty()) {
|
else if (substring.isNotEmpty()) {
|
||||||
val string =
|
var index = indexOf(substring, ignoreCase = ignoreCase)
|
||||||
if (ignoreDiacritics)
|
|
||||||
this.cleanDiacritics()
|
|
||||||
else this
|
|
||||||
|
|
||||||
var index = string.indexOf(substring, ignoreCase = ignoreCase)
|
|
||||||
.takeIf { it != -1 } ?: indexOf(substring, ignoreCase = ignoreCase)
|
|
||||||
while (index >= 0) {
|
while (index >= 0) {
|
||||||
spans.forEach {
|
spans.forEach {
|
||||||
spannable.setSpan(it, index, index + substring.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
spannable.setSpan(it, index, index + substring.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||||
}
|
}
|
||||||
index = string.indexOf(substring, startIndex = index + 1, ignoreCase = ignoreCase)
|
index = indexOf(substring, startIndex = index + 1, ignoreCase = ignoreCase)
|
||||||
.takeIf { it != -1 } ?: indexOf(substring, startIndex = index + 1, ignoreCase = ignoreCase)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return spannable
|
return spannable
|
||||||
}
|
}
|
||||||
|
|
||||||
fun CharSequence.cleanDiacritics(): String {
|
|
||||||
val nameClean = StringBuilder()
|
|
||||||
forEach {
|
|
||||||
val ch = when (it) {
|
|
||||||
'ż' -> 'z'
|
|
||||||
'ó' -> 'o'
|
|
||||||
'ł' -> 'l'
|
|
||||||
'ć' -> 'c'
|
|
||||||
'ę' -> 'e'
|
|
||||||
'ś' -> 's'
|
|
||||||
'ą' -> 'a'
|
|
||||||
'ź' -> 'z'
|
|
||||||
'ń' -> 'n'
|
|
||||||
else -> it
|
|
||||||
}
|
|
||||||
nameClean.append(ch)
|
|
||||||
}
|
|
||||||
return nameClean.toString()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a new read-only list only of those given elements, that are not empty.
|
* Returns a new read-only list only of those given elements, that are not empty.
|
||||||
* Applies for CharSequence and descendants.
|
* Applies for CharSequence and descendants.
|
||||||
|
@ -673,16 +634,6 @@ fun TextView.setText(@StringRes resid: Int, vararg formatArgs: Any) {
|
||||||
text = context.getString(resid, *formatArgs)
|
text = context.getString(resid, *formatArgs)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun MaterialAlertDialogBuilder.setTitle(@StringRes resid: Int, vararg formatArgs: Any): MaterialAlertDialogBuilder {
|
|
||||||
setTitle(context.getString(resid, *formatArgs))
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
fun MaterialAlertDialogBuilder.setMessage(@StringRes resid: Int, vararg formatArgs: Any): MaterialAlertDialogBuilder {
|
|
||||||
setMessage(context.getString(resid, *formatArgs))
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
fun JsonObject(vararg properties: Pair<String, Any?>): JsonObject {
|
fun JsonObject(vararg properties: Pair<String, Any?>): JsonObject {
|
||||||
return JsonObject().apply {
|
return JsonObject().apply {
|
||||||
for (property in properties) {
|
for (property in properties) {
|
||||||
|
@ -771,13 +722,6 @@ inline fun <T : View> T.onClick(crossinline onClickListener: (v: T) -> Unit) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
inline fun <T : View> T.onLongClick(crossinline onLongClickListener: (v: T) -> Boolean) {
|
|
||||||
setOnLongClickListener { v: View ->
|
|
||||||
onLongClickListener(v as T)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
inline fun <T : CompoundButton> T.onChange(crossinline onChangeListener: (v: T, isChecked: Boolean) -> Unit) {
|
inline fun <T : CompoundButton> T.onChange(crossinline onChangeListener: (v: T, isChecked: Boolean) -> Unit) {
|
||||||
setOnCheckedChangeListener { buttonView, isChecked ->
|
setOnCheckedChangeListener { buttonView, isChecked ->
|
||||||
|
@ -785,19 +729,6 @@ inline fun <T : CompoundButton> T.onChange(crossinline onChangeListener: (v: T,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
inline fun <T : MaterialButton> T.onChange(crossinline onChangeListener: (v: T, isChecked: Boolean) -> Unit) {
|
|
||||||
clearOnCheckedChangeListeners()
|
|
||||||
addOnCheckedChangeListener { buttonView, isChecked ->
|
|
||||||
onChangeListener(buttonView as T, isChecked)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun View.attachToastHint(stringRes: Int) = onLongClick {
|
|
||||||
Toast.makeText(it.context, stringRes, Toast.LENGTH_SHORT).show()
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
fun <T> LiveData<T>.observeOnce(lifecycleOwner: LifecycleOwner, observer: Observer<T>) {
|
fun <T> LiveData<T>.observeOnce(lifecycleOwner: LifecycleOwner, observer: Observer<T>) {
|
||||||
observe(lifecycleOwner, object : Observer<T> {
|
observe(lifecycleOwner, object : Observer<T> {
|
||||||
override fun onChanged(t: T?) {
|
override fun onChanged(t: T?) {
|
||||||
|
@ -853,7 +784,7 @@ fun View.findParentById(targetId: Int): View? {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
fun CoroutineScope.startCoroutineTimer(delayMillis: Long = 0, repeatMillis: Long = 0, action: suspend CoroutineScope.() -> Unit) = launch {
|
fun CoroutineScope.startCoroutineTimer(delayMillis: Long = 0, repeatMillis: Long = 0, action: () -> Unit) = launch {
|
||||||
delay(delayMillis)
|
delay(delayMillis)
|
||||||
if (repeatMillis > 0) {
|
if (repeatMillis > 0) {
|
||||||
while (true) {
|
while (true) {
|
||||||
|
@ -1077,7 +1008,6 @@ fun Context.getNotificationTitle(type: Int): String {
|
||||||
Notification.TYPE_FEEDBACK_MESSAGE -> R.string.notification_type_feedback_message
|
Notification.TYPE_FEEDBACK_MESSAGE -> R.string.notification_type_feedback_message
|
||||||
Notification.TYPE_NEW_ANNOUNCEMENT -> R.string.notification_type_new_announcement
|
Notification.TYPE_NEW_ANNOUNCEMENT -> R.string.notification_type_new_announcement
|
||||||
Notification.TYPE_AUTO_ARCHIVING -> R.string.notification_type_auto_archiving
|
Notification.TYPE_AUTO_ARCHIVING -> R.string.notification_type_auto_archiving
|
||||||
Notification.TYPE_TEACHER_ABSENCE -> R.string.notification_type_new_teacher_absence
|
|
||||||
Notification.TYPE_GENERAL -> R.string.notification_type_general
|
Notification.TYPE_GENERAL -> R.string.notification_type_general
|
||||||
else -> R.string.notification_type_general
|
else -> R.string.notification_type_general
|
||||||
})
|
})
|
||||||
|
@ -1236,25 +1166,3 @@ fun TextView.getTextPosition(range: IntRange): Rect {
|
||||||
|
|
||||||
return parentTextViewRect
|
return parentTextViewRect
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun ViewPager.addOnPageSelectedListener(crossinline block: (position: Int) -> Unit) = addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
|
|
||||||
override fun onPageScrollStateChanged(state: Int) {}
|
|
||||||
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
|
|
||||||
override fun onPageSelected(position: Int) { block(position) }
|
|
||||||
})
|
|
||||||
|
|
||||||
val SwipeRefreshLayout.onScrollListener: RecyclerView.OnScrollListener
|
|
||||||
get() = object : RecyclerView.OnScrollListener() {
|
|
||||||
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
|
|
||||||
if (recyclerView.canScrollVertically(-1))
|
|
||||||
this@onScrollListener.isEnabled = false
|
|
||||||
if (!recyclerView.canScrollVertically(-1) && newState == RecyclerView.SCROLL_STATE_IDLE)
|
|
||||||
this@onScrollListener.isEnabled = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
operator fun <K, V> Iterable<Pair<K, V>>.get(key: K): V? {
|
|
||||||
return firstOrNull { it.first == key }?.second
|
|
||||||
}
|
|
||||||
|
|
||||||
fun ByteArray.toHexString() = joinToString("") { "%02x".format(it) }
|
|
||||||
|
|
|
@ -18,9 +18,9 @@ import android.widget.Toast
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.appcompat.widget.PopupMenu
|
import androidx.appcompat.widget.PopupMenu
|
||||||
import androidx.core.graphics.ColorUtils
|
import androidx.core.graphics.ColorUtils
|
||||||
import androidx.core.view.isVisible
|
|
||||||
import androidx.lifecycle.Observer
|
import androidx.lifecycle.Observer
|
||||||
import androidx.navigation.NavOptions
|
import androidx.navigation.NavOptions
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import com.danimahardhika.cafebar.CafeBar
|
import com.danimahardhika.cafebar.CafeBar
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
import com.mikepenz.iconics.IconicsColor
|
import com.mikepenz.iconics.IconicsColor
|
||||||
|
@ -31,8 +31,8 @@ import com.mikepenz.iconics.typeface.library.szkolny.font.SzkolnyFont
|
||||||
import com.mikepenz.materialdrawer.model.DividerDrawerItem
|
import com.mikepenz.materialdrawer.model.DividerDrawerItem
|
||||||
import com.mikepenz.materialdrawer.model.ProfileDrawerItem
|
import com.mikepenz.materialdrawer.model.ProfileDrawerItem
|
||||||
import com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem
|
import com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem
|
||||||
import com.mikepenz.materialdrawer.model.interfaces.*
|
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem
|
||||||
import com.mikepenz.materialdrawer.model.utils.withIsHiddenInMiniDrawer
|
import com.mikepenz.materialdrawer.model.interfaces.IProfile
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
import org.greenrobot.eventbus.EventBus
|
import org.greenrobot.eventbus.EventBus
|
||||||
import org.greenrobot.eventbus.Subscribe
|
import org.greenrobot.eventbus.Subscribe
|
||||||
|
@ -43,7 +43,6 @@ import pl.szczodrzynski.edziennik.data.api.events.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
|
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata.*
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata.*
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
|
||||||
import pl.szczodrzynski.edziennik.databinding.ActivitySzkolnyBinding
|
import pl.szczodrzynski.edziennik.databinding.ActivitySzkolnyBinding
|
||||||
import pl.szczodrzynski.edziennik.sync.AppManagerDetectedEvent
|
import pl.szczodrzynski.edziennik.sync.AppManagerDetectedEvent
|
||||||
import pl.szczodrzynski.edziennik.sync.SyncWorker
|
import pl.szczodrzynski.edziennik.sync.SyncWorker
|
||||||
|
@ -56,22 +55,22 @@ import pl.szczodrzynski.edziennik.ui.dialogs.sync.SyncViewListDialog
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.agenda.AgendaFragment
|
import pl.szczodrzynski.edziennik.ui.modules.agenda.AgendaFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.announcements.AnnouncementsFragment
|
import pl.szczodrzynski.edziennik.ui.modules.announcements.AnnouncementsFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.attendance.AttendanceFragment
|
import pl.szczodrzynski.edziennik.ui.modules.attendance.AttendanceFragment
|
||||||
|
import pl.szczodrzynski.edziennik.ui.modules.base.DebugFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.base.MainSnackbar
|
import pl.szczodrzynski.edziennik.ui.modules.base.MainSnackbar
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.behaviour.BehaviourFragment
|
import pl.szczodrzynski.edziennik.ui.modules.behaviour.BehaviourFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.debug.DebugFragment
|
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.debug.LabFragment
|
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.error.ErrorSnackbar
|
import pl.szczodrzynski.edziennik.ui.modules.error.ErrorSnackbar
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.feedback.FeedbackFragment
|
import pl.szczodrzynski.edziennik.ui.modules.feedback.FeedbackFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.feedback.HelpFragment
|
import pl.szczodrzynski.edziennik.ui.modules.feedback.HelpFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.grades.GradesListFragment
|
import pl.szczodrzynski.edziennik.ui.modules.grades.GradesFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.grades.editor.GradesEditorFragment
|
import pl.szczodrzynski.edziennik.ui.modules.grades.editor.GradesEditorFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.home.HomeFragment
|
import pl.szczodrzynski.edziennik.ui.modules.home.HomeFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.homework.HomeworkFragment
|
import pl.szczodrzynski.edziennik.ui.modules.homework.HomeworkFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.login.LoginActivity
|
import pl.szczodrzynski.edziennik.ui.modules.login.LoginActivity
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.messages.MessageFragment
|
import pl.szczodrzynski.edziennik.ui.modules.messages.MessageFragment
|
||||||
|
import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesComposeFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesFragment
|
import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.messages.compose.MessagesComposeFragment
|
import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesListFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.notifications.NotificationsListFragment
|
import pl.szczodrzynski.edziennik.ui.modules.notifications.NotificationsFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.settings.ProfileManagerFragment
|
import pl.szczodrzynski.edziennik.ui.modules.settings.ProfileManagerFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.settings.SettingsNewFragment
|
import pl.szczodrzynski.edziennik.ui.modules.settings.SettingsNewFragment
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.timetable.TimetableFragment
|
import pl.szczodrzynski.edziennik.ui.modules.timetable.TimetableFragment
|
||||||
|
@ -91,6 +90,7 @@ import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetPrimaryItem
|
||||||
import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetSeparatorItem
|
import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetSeparatorItem
|
||||||
import pl.szczodrzynski.navlib.drawer.NavDrawer
|
import pl.szczodrzynski.navlib.drawer.NavDrawer
|
||||||
import pl.szczodrzynski.navlib.drawer.items.DrawerPrimaryItem
|
import pl.szczodrzynski.navlib.drawer.items.DrawerPrimaryItem
|
||||||
|
import pl.szczodrzynski.navlib.drawer.items.withAppTitle
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
@ -130,7 +130,6 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
const val TARGET_MESSAGES_DETAILS = 503
|
const val TARGET_MESSAGES_DETAILS = 503
|
||||||
const val TARGET_MESSAGES_COMPOSE = 504
|
const val TARGET_MESSAGES_COMPOSE = 504
|
||||||
const val TARGET_WEB_PUSH = 140
|
const val TARGET_WEB_PUSH = 140
|
||||||
const val TARGET_LAB = 1000
|
|
||||||
|
|
||||||
const val HOME_ID = DRAWER_ITEM_HOME
|
const val HOME_ID = DRAWER_ITEM_HOME
|
||||||
|
|
||||||
|
@ -155,7 +154,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
.withBadgeTypeId(TYPE_EVENT)
|
.withBadgeTypeId(TYPE_EVENT)
|
||||||
.isInDrawer(true)
|
.isInDrawer(true)
|
||||||
|
|
||||||
list += NavTarget(DRAWER_ITEM_GRADES, R.string.menu_grades, GradesListFragment::class)
|
list += NavTarget(DRAWER_ITEM_GRADES, R.string.menu_grades, GradesFragment::class)
|
||||||
.withIcon(CommunityMaterial.Icon2.cmd_numeric_5_box_outline)
|
.withIcon(CommunityMaterial.Icon2.cmd_numeric_5_box_outline)
|
||||||
.withBadgeTypeId(TYPE_GRADE)
|
.withBadgeTypeId(TYPE_GRADE)
|
||||||
.isInDrawer(true)
|
.isInDrawer(true)
|
||||||
|
@ -187,7 +186,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
|
|
||||||
|
|
||||||
// static drawer items
|
// static drawer items
|
||||||
list += NavTarget(DRAWER_ITEM_NOTIFICATIONS, R.string.menu_notifications, NotificationsListFragment::class)
|
list += NavTarget(DRAWER_ITEM_NOTIFICATIONS, R.string.menu_notifications, NotificationsFragment::class)
|
||||||
.withIcon(CommunityMaterial.Icon.cmd_bell_ring_outline)
|
.withIcon(CommunityMaterial.Icon.cmd_bell_ring_outline)
|
||||||
.isInDrawer(true)
|
.isInDrawer(true)
|
||||||
.isStatic(true)
|
.isStatic(true)
|
||||||
|
@ -228,14 +227,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
list += NavTarget(TARGET_MESSAGES_DETAILS, R.string.menu_message, MessageFragment::class).withPopTo(DRAWER_ITEM_MESSAGES)
|
list += NavTarget(TARGET_MESSAGES_DETAILS, R.string.menu_message, MessageFragment::class).withPopTo(DRAWER_ITEM_MESSAGES)
|
||||||
list += NavTarget(TARGET_MESSAGES_COMPOSE, R.string.menu_message_compose, MessagesComposeFragment::class)
|
list += NavTarget(TARGET_MESSAGES_COMPOSE, R.string.menu_message_compose, MessagesComposeFragment::class)
|
||||||
list += NavTarget(TARGET_WEB_PUSH, R.string.menu_web_push, WebPushFragment::class)
|
list += NavTarget(TARGET_WEB_PUSH, R.string.menu_web_push, WebPushFragment::class)
|
||||||
if (App.debugMode) {
|
|
||||||
list += NavTarget(DRAWER_ITEM_DEBUG, R.string.menu_debug, DebugFragment::class)
|
list += NavTarget(DRAWER_ITEM_DEBUG, R.string.menu_debug, DebugFragment::class)
|
||||||
list += NavTarget(TARGET_LAB, R.string.menu_lab, LabFragment::class)
|
|
||||||
.withIcon(CommunityMaterial.Icon.cmd_flask_outline)
|
|
||||||
.isInDrawer(true)
|
|
||||||
.isBelowSeparator(true)
|
|
||||||
.isStatic(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
list
|
list
|
||||||
}
|
}
|
||||||
|
@ -296,22 +288,6 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
mainSnackbar.setCoordinator(b.navView.coordinator, b.navView.bottomBar)
|
mainSnackbar.setCoordinator(b.navView.coordinator, b.navView.bottomBar)
|
||||||
errorSnackbar.setCoordinator(b.navView.coordinator, b.navView.bottomBar)
|
errorSnackbar.setCoordinator(b.navView.coordinator, b.navView.bottomBar)
|
||||||
|
|
||||||
when {
|
|
||||||
BuildConfig.VERSION_NAME.contains("nightly") -> {
|
|
||||||
b.nightlyText.isVisible = true
|
|
||||||
b.nightlyText.text = "Nightly\n"+BuildConfig.VERSION_NAME.substringAfterLast(".")
|
|
||||||
}
|
|
||||||
BuildConfig.VERSION_NAME.contains("daily") -> {
|
|
||||||
b.nightlyText.isVisible = true
|
|
||||||
b.nightlyText.text = "Daily\n"+BuildConfig.VERSION_NAME.substringAfterLast(".")
|
|
||||||
}
|
|
||||||
BuildConfig.DEBUG -> {
|
|
||||||
b.nightlyText.isVisible = true
|
|
||||||
b.nightlyText.text = "Debug\n"+BuildConfig.VERSION_NAME
|
|
||||||
}
|
|
||||||
else -> b.nightlyText.isVisible = false
|
|
||||||
}
|
|
||||||
|
|
||||||
navLoading = true
|
navLoading = true
|
||||||
|
|
||||||
b.navView.apply {
|
b.navView.apply {
|
||||||
|
@ -385,7 +361,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
drawerProfileLongClickListener = { _, profile, _, view ->
|
drawerProfileLongClickListener = { _, profile, _, view ->
|
||||||
if (view != null && profile is ProfileDrawerItem) {
|
if (profile is ProfileDrawerItem) {
|
||||||
showProfileContextMenu(profile, view)
|
showProfileContextMenu(profile, view)
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
@ -409,20 +385,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
}
|
}
|
||||||
|
|
||||||
app.db.profileDao().all.observe(this, Observer { profiles ->
|
app.db.profileDao().all.observe(this, Observer { profiles ->
|
||||||
val allArchived = profiles.all { it.archived }
|
drawer.setProfileList(profiles.filter { it.id >= 0 }.toMutableList())
|
||||||
drawer.setProfileList(profiles.filter { it.id >= 0 && (!it.archived || allArchived) }.toMutableList())
|
|
||||||
//prepend the archived profile if loaded
|
|
||||||
if (app.profile.archived && !allArchived) {
|
|
||||||
drawer.prependProfile(Profile(
|
|
||||||
id = app.profile.id,
|
|
||||||
loginStoreId = app.profile.loginStoreId,
|
|
||||||
loginStoreType = app.profile.loginStoreType,
|
|
||||||
name = app.profile.name,
|
|
||||||
subname = "Archiwum - ${app.profile.subname}"
|
|
||||||
).also {
|
|
||||||
it.archived = true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
drawer.currentProfile = App.profileId
|
drawer.currentProfile = App.profileId
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -445,26 +408,11 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
R.color.md_green_500
|
R.color.md_green_500
|
||||||
)
|
)
|
||||||
|
|
||||||
|
isStoragePermissionGranted()
|
||||||
|
|
||||||
SyncWorker.scheduleNext(app)
|
SyncWorker.scheduleNext(app)
|
||||||
UpdateWorker.scheduleNext(app)
|
UpdateWorker.scheduleNext(app)
|
||||||
|
|
||||||
// if loaded profile is archived, switch to the up-to-date version of it
|
|
||||||
if (app.profile.archived) {
|
|
||||||
launch {
|
|
||||||
if (app.profile.archiveId != null) {
|
|
||||||
val profile = withContext(Dispatchers.IO) {
|
|
||||||
app.db.profileDao().getNotArchivedOf(app.profile.archiveId!!)
|
|
||||||
}
|
|
||||||
if (profile != null)
|
|
||||||
loadProfile(profile)
|
|
||||||
else
|
|
||||||
loadProfile(0)
|
|
||||||
} else {
|
|
||||||
loadProfile(0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// APP BACKGROUND
|
// APP BACKGROUND
|
||||||
if (app.config.ui.appBackground != null) {
|
if (app.config.ui.appBackground != null) {
|
||||||
try {
|
try {
|
||||||
|
@ -562,7 +510,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
.withIcon(CommunityMaterial.Icon2.cmd_help_circle_outline)
|
.withIcon(CommunityMaterial.Icon2.cmd_help_circle_outline)
|
||||||
.withOnClickListener(View.OnClickListener { loadTarget(TARGET_FEEDBACK) })
|
.withOnClickListener(View.OnClickListener { loadTarget(TARGET_FEEDBACK) })
|
||||||
)
|
)
|
||||||
if (App.debugMode) {
|
if (App.devMode) {
|
||||||
bottomSheet += BottomSheetPrimaryItem(false)
|
bottomSheet += BottomSheetPrimaryItem(false)
|
||||||
.withTitle(R.string.menu_debug)
|
.withTitle(R.string.menu_debug)
|
||||||
.withIcon(CommunityMaterial.Icon.cmd_android_studio)
|
.withIcon(CommunityMaterial.Icon.cmd_android_studio)
|
||||||
|
@ -605,41 +553,6 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
__/ |
|
__/ |
|
||||||
|__*/
|
|__*/
|
||||||
fun syncCurrentFeature() {
|
fun syncCurrentFeature() {
|
||||||
if (app.profile.archived) {
|
|
||||||
MaterialAlertDialogBuilder(this)
|
|
||||||
.setTitle(R.string.profile_archived_title)
|
|
||||||
.setMessage(
|
|
||||||
R.string.profile_archived_text,
|
|
||||||
app.profile.studentSchoolYearStart,
|
|
||||||
app.profile.studentSchoolYearStart + 1
|
|
||||||
)
|
|
||||||
.setPositiveButton(R.string.ok, null)
|
|
||||||
.show()
|
|
||||||
swipeRefreshLayout.isRefreshing = false
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (app.profile.shouldArchive()) {
|
|
||||||
MaterialAlertDialogBuilder(this)
|
|
||||||
.setTitle(R.string.profile_archiving_title)
|
|
||||||
.setMessage(
|
|
||||||
R.string.profile_archiving_format,
|
|
||||||
app.profile.dateYearEnd.formattedString
|
|
||||||
)
|
|
||||||
.setPositiveButton(R.string.ok, null)
|
|
||||||
.show()
|
|
||||||
}
|
|
||||||
if (app.profile.isBeforeYear()) {
|
|
||||||
MaterialAlertDialogBuilder(this)
|
|
||||||
.setTitle(R.string.profile_year_not_started_title)
|
|
||||||
.setMessage(
|
|
||||||
R.string.profile_year_not_started_format,
|
|
||||||
app.profile.dateSemester1Start.formattedString
|
|
||||||
)
|
|
||||||
.setPositiveButton(R.string.ok, null)
|
|
||||||
.show()
|
|
||||||
swipeRefreshLayout.isRefreshing = false
|
|
||||||
return
|
|
||||||
}
|
|
||||||
swipeRefreshLayout.isRefreshing = true
|
swipeRefreshLayout.isRefreshing = true
|
||||||
Toast.makeText(this, fragmentToSyncName(navTargetId), Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, fragmentToSyncName(navTargetId), Toast.LENGTH_SHORT).show()
|
||||||
val fragmentParam = when (navTargetId) {
|
val fragmentParam = when (navTargetId) {
|
||||||
|
@ -960,51 +873,26 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
|
|
||||||
fun loadProfile(id: Int) = loadProfile(id, navTargetId)
|
fun loadProfile(id: Int) = loadProfile(id, navTargetId)
|
||||||
fun loadProfile(id: Int, arguments: Bundle?) = loadProfile(id, navTargetId, arguments)
|
fun loadProfile(id: Int, arguments: Bundle?) = loadProfile(id, navTargetId, arguments)
|
||||||
fun loadProfile(profile: Profile) = loadProfile(
|
fun loadProfile(id: Int, drawerSelection: Int, arguments: Bundle? = null) {
|
||||||
profile,
|
|
||||||
navTargetId,
|
|
||||||
null,
|
|
||||||
if (app.profile.archived) app.profile.id else null
|
|
||||||
)
|
|
||||||
private fun loadProfile(id: Int, drawerSelection: Int, arguments: Bundle? = null) {
|
|
||||||
if (App.profileId == id) {
|
if (App.profileId == id) {
|
||||||
drawer.currentProfile = app.profile.id
|
drawer.currentProfile = app.profile.id
|
||||||
loadTarget(drawerSelection, arguments)
|
loadTarget(drawerSelection, arguments)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
val previousArchivedId = if (app.profile.archived) app.profile.id else null
|
|
||||||
app.profileLoad(id) {
|
app.profileLoad(id) {
|
||||||
loadProfile(it, drawerSelection, arguments, previousArchivedId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private fun loadProfile(profile: Profile, drawerSelection: Int, arguments: Bundle?, previousArchivedId: Int?) {
|
|
||||||
App.profile = profile
|
|
||||||
MessagesFragment.pageSelection = -1
|
MessagesFragment.pageSelection = -1
|
||||||
|
MessagesListFragment.tapPositions = intArrayOf(RecyclerView.NO_POSITION, RecyclerView.NO_POSITION)
|
||||||
|
MessagesListFragment.topPositions = intArrayOf(RecyclerView.NO_POSITION, RecyclerView.NO_POSITION)
|
||||||
|
MessagesListFragment.bottomPositions = intArrayOf(RecyclerView.NO_POSITION, RecyclerView.NO_POSITION)
|
||||||
|
|
||||||
setDrawerItems()
|
setDrawerItems()
|
||||||
|
|
||||||
if (previousArchivedId != null) {
|
|
||||||
// prevents accidentally removing the first item if the archived profile is not shown
|
|
||||||
drawer.removeProfileById(previousArchivedId)
|
|
||||||
}
|
|
||||||
if (profile.archived) {
|
|
||||||
drawer.prependProfile(Profile(
|
|
||||||
id = profile.id,
|
|
||||||
loginStoreId = profile.loginStoreId,
|
|
||||||
loginStoreType = profile.loginStoreType,
|
|
||||||
name = profile.name,
|
|
||||||
subname = "Archiwum - ${profile.subname}"
|
|
||||||
).also {
|
|
||||||
it.archived = true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// the drawer profile is updated automatically when the drawer item is clicked
|
// the drawer profile is updated automatically when the drawer item is clicked
|
||||||
// update it manually when switching profiles from other source
|
// update it manually when switching profiles from other source
|
||||||
//if (drawer.currentProfile != app.profile.id)
|
//if (drawer.currentProfile != app.profile.id)
|
||||||
drawer.currentProfile = app.profileId
|
drawer.currentProfile = app.profileId
|
||||||
loadTarget(drawerSelection, arguments)
|
loadTarget(drawerSelection, arguments)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
fun loadTarget(id: Int, arguments: Bundle? = null) {
|
fun loadTarget(id: Int, arguments: Bundle? = null) {
|
||||||
var loadId = id
|
var loadId = id
|
||||||
if (loadId == -1) {
|
if (loadId == -1) {
|
||||||
|
@ -1020,15 +908,13 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
loadTarget(target, arguments)
|
loadTarget(target, arguments)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private fun loadTarget(target: NavTarget, args: Bundle? = null) {
|
private fun loadTarget(target: NavTarget, arguments: Bundle? = null) {
|
||||||
d("NavDebug", "loadTarget(target = $target, args = $args)")
|
d("NavDebug", "loadTarget(target = $target, arguments = $arguments)")
|
||||||
|
|
||||||
val arguments = args ?: navBackStack.firstOrNull { it.first.id == target.id }?.second ?: Bundle()
|
|
||||||
bottomSheet.close()
|
bottomSheet.close()
|
||||||
bottomSheet.removeAllContextual()
|
bottomSheet.removeAllContextual()
|
||||||
bottomSheet.toggleGroupEnabled = false
|
bottomSheet.toggleGroupEnabled = false
|
||||||
drawer.close()
|
drawer.close()
|
||||||
if (drawer.getSelection() != target.id)
|
|
||||||
drawer.setSelection(target.id, fireOnClick = false)
|
drawer.setSelection(target.id, fireOnClick = false)
|
||||||
navView.toolbar.setTitle(target.title ?: target.name)
|
navView.toolbar.setTitle(target.title ?: target.name)
|
||||||
navView.bottomBar.fabEnable = false
|
navView.bottomBar.fabEnable = false
|
||||||
|
@ -1071,7 +957,6 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
navBackStack.removeAt(navBackStack.lastIndex)
|
navBackStack.removeAt(navBackStack.lastIndex)
|
||||||
}
|
}
|
||||||
navTarget = target
|
navTarget = target
|
||||||
navArguments = arguments
|
|
||||||
|
|
||||||
return@let null
|
return@let null
|
||||||
}?.let {
|
}?.let {
|
||||||
|
@ -1081,7 +966,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
R.anim.task_open_enter,
|
R.anim.task_open_enter,
|
||||||
R.anim.task_open_exit
|
R.anim.task_open_exit
|
||||||
)
|
)
|
||||||
navBackStack.add(navTarget to navArguments)
|
navBackStack.add(navTarget to arguments)
|
||||||
navTarget = target
|
navTarget = target
|
||||||
navArguments = arguments
|
navArguments = arguments
|
||||||
}
|
}
|
||||||
|
@ -1178,12 +1063,11 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
val item = DrawerPrimaryItem()
|
val item = DrawerPrimaryItem()
|
||||||
.withIdentifier(target.id.toLong())
|
.withIdentifier(target.id.toLong())
|
||||||
.withName(target.name)
|
.withName(target.name)
|
||||||
.withIsHiddenInMiniDrawer(!app.config.ui.miniMenuButtons.contains(target.id))
|
.withHiddenInMiniDrawer(!app.config.ui.miniMenuButtons.contains(target.id))
|
||||||
.also { if (target.description != null) it.withDescription(target.description!!) }
|
.also { if (target.description != null) it.withDescription(target.description!!) }
|
||||||
.also { if (target.icon != null) it.withIcon(target.icon!!) }
|
.also { if (target.icon != null) it.withIcon(target.icon!!) }
|
||||||
.also { if (target.title != null) it.withAppTitle(getString(target.title!!)) }
|
.also { if (target.title != null) it.withAppTitle(getString(target.title!!)) }
|
||||||
.also { if (target.badgeTypeId != null) it.withBadgeStyle(drawer.badgeStyle)}
|
.also { if (target.badgeTypeId != null) it.withBadgeStyle(drawer.badgeStyle)}
|
||||||
.withSelectedBackgroundAnimated(false)
|
|
||||||
|
|
||||||
if (target.badgeTypeId != null)
|
if (target.badgeTypeId != null)
|
||||||
drawer.addUnreadCounterType(target.badgeTypeId!!, target.id)
|
drawer.addUnreadCounterType(target.badgeTypeId!!, target.id)
|
||||||
|
@ -1243,7 +1127,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
drawer.addProfileSettings(*drawerProfiles.toTypedArray())
|
drawer.addProfileSettings(*drawerProfiles.toTypedArray())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showProfileContextMenu(profile: IProfile, view: View) {
|
private fun showProfileContextMenu(profile: IProfile<*>, view: View) {
|
||||||
val profileId = profile.identifier.toInt()
|
val profileId = profile.identifier.toInt()
|
||||||
val popupMenu = PopupMenu(this, view)
|
val popupMenu = PopupMenu(this, view)
|
||||||
popupMenu.menu.add(0, 1, 1, R.string.profile_menu_open_settings)
|
popupMenu.menu.add(0, 1, 1, R.string.profile_menu_open_settings)
|
||||||
|
@ -1256,7 +1140,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||||
}
|
}
|
||||||
loadTarget(DRAWER_ITEM_SETTINGS, null)
|
loadTarget(DRAWER_ITEM_SETTINGS, null)
|
||||||
} else if (item.itemId == 2) {
|
} else if (item.itemId == 2) {
|
||||||
ProfileRemoveDialog(this, profileId, profile.name?.getText(this) ?: "?")
|
ProfileRemoveDialog(this, profileId, profile.name?.getText(this)?.toString() ?: "?")
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ import kotlin.coroutines.CoroutineContext
|
||||||
|
|
||||||
class Config(val db: AppDb) : CoroutineScope, AbstractConfig {
|
class Config(val db: AppDb) : CoroutineScope, AbstractConfig {
|
||||||
companion object {
|
companion object {
|
||||||
const val DATA_VERSION = 12
|
const val DATA_VERSION = 11
|
||||||
}
|
}
|
||||||
|
|
||||||
private val job = Job()
|
private val job = Job()
|
||||||
|
|
|
@ -18,7 +18,7 @@ import kotlin.coroutines.CoroutineContext
|
||||||
|
|
||||||
class ProfileConfig(val db: AppDb, val profileId: Int, rawEntries: List<ConfigEntry>) : CoroutineScope, AbstractConfig {
|
class ProfileConfig(val db: AppDb, val profileId: Int, rawEntries: List<ConfigEntry>) : CoroutineScope, AbstractConfig {
|
||||||
companion object {
|
companion object {
|
||||||
const val DATA_VERSION = 2
|
const val DATA_VERSION = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
private val job = Job()
|
private val job = Job()
|
||||||
|
@ -30,7 +30,6 @@ class ProfileConfig(val db: AppDb, val profileId: Int, rawEntries: List<ConfigEn
|
||||||
val grades by lazy { ProfileConfigGrades(this) }
|
val grades by lazy { ProfileConfigGrades(this) }
|
||||||
val ui by lazy { ProfileConfigUI(this) }
|
val ui by lazy { ProfileConfigUI(this) }
|
||||||
val sync by lazy { ProfileConfigSync(this) }
|
val sync by lazy { ProfileConfigSync(this) }
|
||||||
val attendance by lazy { ProfileConfigAttendance(this) }
|
|
||||||
/*
|
/*
|
||||||
val timetable by lazy { ConfigTimetable(this) }
|
val timetable by lazy { ConfigTimetable(this) }
|
||||||
val grades by lazy { ConfigGrades(this) }*/
|
val grades by lazy { ConfigGrades(this) }*/
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) Kuba Szczodrzyński 2020-4-29.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.config
|
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.config.utils.get
|
|
||||||
import pl.szczodrzynski.edziennik.config.utils.set
|
|
||||||
|
|
||||||
class ProfileConfigAttendance(private val config: ProfileConfig) {
|
|
||||||
private var mAttendancePageSelection: Int? = null
|
|
||||||
var attendancePageSelection: Int
|
|
||||||
get() { mAttendancePageSelection = mAttendancePageSelection ?: config.values.get("attendancePageSelection", 1); return mAttendancePageSelection ?: 1 }
|
|
||||||
set(value) { config.set("attendancePageSelection", value); mAttendancePageSelection = value }
|
|
||||||
|
|
||||||
private var mUseSymbols: Boolean? = null
|
|
||||||
var useSymbols: Boolean
|
|
||||||
get() { mUseSymbols = mUseSymbols ?: config.values.get("useSymbols", false); return mUseSymbols ?: false }
|
|
||||||
set(value) { config.set("useSymbols", value); mUseSymbols = value }
|
|
||||||
|
|
||||||
private var mGroupConsecutiveDays: Boolean? = null
|
|
||||||
var groupConsecutiveDays: Boolean
|
|
||||||
get() { mGroupConsecutiveDays = mGroupConsecutiveDays ?: config.values.get("groupConsecutiveDays", true); return mGroupConsecutiveDays ?: true }
|
|
||||||
set(value) { config.set("groupConsecutiveDays", value); mGroupConsecutiveDays = value }
|
|
||||||
|
|
||||||
private var mShowPresenceInMonth: Boolean? = null
|
|
||||||
var showPresenceInMonth: Boolean
|
|
||||||
get() { mShowPresenceInMonth = mShowPresenceInMonth ?: config.values.get("showPresenceInMonth", false); return mShowPresenceInMonth ?: false }
|
|
||||||
set(value) { config.set("showPresenceInMonth", value); mShowPresenceInMonth = value }
|
|
||||||
}
|
|
|
@ -64,25 +64,11 @@ class ConfigMigration(app: App, config: Config) {
|
||||||
dataVersion = 2
|
dataVersion = 2
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dataVersion < 3) {
|
|
||||||
update = null
|
|
||||||
privacyPolicyAccepted = false
|
|
||||||
debugMode = false
|
|
||||||
devModePassword = null
|
|
||||||
appInstalledTime = 0L
|
|
||||||
appRateSnackbarTime = 0L
|
|
||||||
|
|
||||||
dataVersion = 3
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dataVersion < 10) {
|
if (dataVersion < 10) {
|
||||||
ui.openDrawerOnBackPressed = false
|
ui.openDrawerOnBackPressed = false
|
||||||
ui.snowfall = false
|
ui.snowfall = false
|
||||||
ui.bottomSheetOpened = false
|
ui.bottomSheetOpened = false
|
||||||
sync.dontShowAppManagerDialog = false
|
sync.dontShowAppManagerDialog = false
|
||||||
sync.webPushEnabled = true
|
|
||||||
sync.lastAppSync = 0L
|
|
||||||
|
|
||||||
|
|
||||||
dataVersion = 10
|
dataVersion = 10
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
package pl.szczodrzynski.edziennik.config.utils
|
package pl.szczodrzynski.edziennik.config.utils
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.config.ProfileConfig
|
import pl.szczodrzynski.edziennik.config.ProfileConfig
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Notification
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile.Companion.AGENDA_DEFAULT
|
import pl.szczodrzynski.edziennik.data.db.entity.Profile.Companion.AGENDA_DEFAULT
|
||||||
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.COLOR_MODE_WEIGHTED
|
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.COLOR_MODE_WEIGHTED
|
||||||
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_ALL_GRADES
|
import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_ALL_GRADES
|
||||||
|
@ -15,23 +14,11 @@ class ProfileConfigMigration(config: ProfileConfig) {
|
||||||
|
|
||||||
if (dataVersion < 1) {
|
if (dataVersion < 1) {
|
||||||
grades.colorMode = COLOR_MODE_WEIGHTED
|
grades.colorMode = COLOR_MODE_WEIGHTED
|
||||||
grades.yearAverageMode = YEAR_ALL_GRADES
|
|
||||||
grades.hideImproved = false
|
|
||||||
grades.averageWithoutWeight = true
|
|
||||||
grades.plusValue = null
|
|
||||||
grades.minusValue = null
|
|
||||||
grades.dontCountEnabled = false
|
grades.dontCountEnabled = false
|
||||||
grades.dontCountGrades = listOf()
|
grades.yearAverageMode = YEAR_ALL_GRADES
|
||||||
ui.agendaViewType = AGENDA_DEFAULT
|
ui.agendaViewType = AGENDA_DEFAULT
|
||||||
// no migration for ui.homeCards
|
|
||||||
|
|
||||||
dataVersion = 1
|
dataVersion = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dataVersion < 2) {
|
|
||||||
sync.notificationFilter = sync.notificationFilter + Notification.TYPE_TEACHER_ABSENCE
|
|
||||||
|
|
||||||
dataVersion = 2
|
|
||||||
}
|
|
||||||
}}
|
}}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,9 +38,6 @@ class ApiService : Service() {
|
||||||
context.startService(Intent(context, ApiService::class.java))
|
context.startService(Intent(context, ApiService::class.java))
|
||||||
EventBus.getDefault().postSticky(request)
|
EventBus.getDefault().postSticky(request)
|
||||||
}
|
}
|
||||||
|
|
||||||
var lastEventTime = System.currentTimeMillis()
|
|
||||||
var taskCancelTries = 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private val app by lazy { applicationContext as App }
|
private val app by lazy { applicationContext as App }
|
||||||
|
@ -67,6 +64,9 @@ class ApiService : Service() {
|
||||||
|
|
||||||
private val notification by lazy { EdziennikNotification(app) }
|
private val notification by lazy { EdziennikNotification(app) }
|
||||||
|
|
||||||
|
private var lastEventTime = System.currentTimeMillis()
|
||||||
|
private var taskCancelTries = 0
|
||||||
|
|
||||||
/* ______ _ _ _ _ _____ _ _ _ _
|
/* ______ _ _ _ _ _____ _ _ _ _
|
||||||
| ____| | | (_) (_) | / ____| | | | | | |
|
| ____| | | (_) (_) | / ____| | | | | | |
|
||||||
| |__ __| |_____ ___ _ __ _ __ _| | __ | | __ _| | | |__ __ _ ___| | __
|
| |__ __| |_____ ___ _ __ _ __ _| | __ | | __ _| | | |__ __ _ ___| | __
|
||||||
|
|
|
@ -24,14 +24,14 @@ const val FAKE_LIBRUS_ACCOUNTS = "/synergia_accounts.php"
|
||||||
|
|
||||||
val LIBRUS_USER_AGENT = "${SYSTEM_USER_AGENT}LibrusMobileApp"
|
val LIBRUS_USER_AGENT = "${SYSTEM_USER_AGENT}LibrusMobileApp"
|
||||||
const val SYNERGIA_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko/20100101 Firefox/62.0"
|
const val SYNERGIA_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko/20100101 Firefox/62.0"
|
||||||
const val LIBRUS_CLIENT_ID = "0RbsDOkV9tyKEQYzlLv5hs3DM1ukrynFI4p6C1Yc"
|
const val LIBRUS_CLIENT_ID = "6XPsKf10LPz1nxgHQLcvZ1KM48DYzlBAhxipaXY8"
|
||||||
const val LIBRUS_REDIRECT_URL = "app://librus"
|
const val LIBRUS_REDIRECT_URL = "http://localhost/bar"
|
||||||
const val LIBRUS_AUTHORIZE_URL = "https://portal.librus.pl/oauth2/authorize?client_id=$LIBRUS_CLIENT_ID&redirect_uri=$LIBRUS_REDIRECT_URL&response_type=code"
|
const val LIBRUS_AUTHORIZE_URL = "https://portal.librus.pl/oauth2/authorize?client_id=$LIBRUS_CLIENT_ID&redirect_uri=$LIBRUS_REDIRECT_URL&response_type=code"
|
||||||
const val LIBRUS_LOGIN_URL = "https://portal.librus.pl/rodzina/login/action"
|
const val LIBRUS_LOGIN_URL = "https://portal.librus.pl/rodzina/login/action"
|
||||||
const val LIBRUS_TOKEN_URL = "https://portal.librus.pl/oauth2/access_token"
|
const val LIBRUS_TOKEN_URL = "https://portal.librus.pl/oauth2/access_token"
|
||||||
|
|
||||||
const val LIBRUS_ACCOUNT_URL = "/v3/SynergiaAccounts/fresh/" // + login
|
const val LIBRUS_ACCOUNT_URL = "/v2/SynergiaAccounts/fresh/" // + login
|
||||||
const val LIBRUS_ACCOUNTS_URL = "/v3/SynergiaAccounts"
|
const val LIBRUS_ACCOUNTS_URL = "/v2/SynergiaAccounts"
|
||||||
|
|
||||||
/** https://api.librus.pl/2.0 */
|
/** https://api.librus.pl/2.0 */
|
||||||
const val LIBRUS_API_URL = "https://api.librus.pl/2.0"
|
const val LIBRUS_API_URL = "https://api.librus.pl/2.0"
|
||||||
|
@ -56,9 +56,6 @@ const val LIBRUS_SYNERGIA_TOKEN_LOGIN_URL = "https://synergia.librus.pl/loguj/to
|
||||||
const val LIBRUS_MESSAGES_URL = "https://wiadomosci.librus.pl/module"
|
const val LIBRUS_MESSAGES_URL = "https://wiadomosci.librus.pl/module"
|
||||||
const val LIBRUS_SANDBOX_URL = "https://sandbox.librus.pl/index.php?action="
|
const val LIBRUS_SANDBOX_URL = "https://sandbox.librus.pl/index.php?action="
|
||||||
|
|
||||||
const val LIBRUS_SYNERGIA_HOMEWORK_ATTACHMENT_URL = "https://synergia.librus.pl/homework/downloadFile"
|
|
||||||
const val LIBRUS_SYNERGIA_MESSAGES_ATTACHMENT_URL = "https://synergia.librus.pl/wiadomosci/pobierz_zalacznik"
|
|
||||||
|
|
||||||
const val IDZIENNIK_USER_AGENT = SYNERGIA_USER_AGENT
|
const val IDZIENNIK_USER_AGENT = SYNERGIA_USER_AGENT
|
||||||
const val IDZIENNIK_WEB_URL = "https://iuczniowie.progman.pl/idziennik"
|
const val IDZIENNIK_WEB_URL = "https://iuczniowie.progman.pl/idziennik"
|
||||||
const val IDZIENNIK_WEB_LOGIN = "login.aspx"
|
const val IDZIENNIK_WEB_LOGIN = "login.aspx"
|
||||||
|
@ -77,8 +74,6 @@ const val IDZIENNIK_WEB_GET_MESSAGE = "mod_komunikator/WS_wiadomosci.asmx/Pobier
|
||||||
const val IDZIENNIK_WEB_GET_RECIPIENT_LIST = "mod_komunikator/WS_wiadomosci.asmx/pobierzListeOdbiorcowPanelRodzic"
|
const val IDZIENNIK_WEB_GET_RECIPIENT_LIST = "mod_komunikator/WS_wiadomosci.asmx/pobierzListeOdbiorcowPanelRodzic"
|
||||||
const val IDZIENNIK_WEB_SEND_MESSAGE = "mod_komunikator/WS_wiadomosci.asmx/WyslijWiadomosc"
|
const val IDZIENNIK_WEB_SEND_MESSAGE = "mod_komunikator/WS_wiadomosci.asmx/WyslijWiadomosc"
|
||||||
const val IDZIENNIK_WEB_GET_ATTACHMENT = "mod_komunikator/Download.ashx"
|
const val IDZIENNIK_WEB_GET_ATTACHMENT = "mod_komunikator/Download.ashx"
|
||||||
const val IDZIENNIK_WEB_GET_HOMEWORK = "mod_panelRodzica/pracaDomowa/WS_pracaDomowa.asmx/pobierzJednaPraceDomowa"
|
|
||||||
const val IDZIENNIK_WEB_GET_HOMEWORK_ATTACHMENT = "mod_panelRodzica/pracaDomowa.aspx"
|
|
||||||
|
|
||||||
val IDZIENNIK_API_USER_AGENT = SYSTEM_USER_AGENT
|
val IDZIENNIK_API_USER_AGENT = SYSTEM_USER_AGENT
|
||||||
const val IDZIENNIK_API_URL = "https://iuczniowie.progman.pl/idziennik/api"
|
const val IDZIENNIK_API_URL = "https://iuczniowie.progman.pl/idziennik/api"
|
||||||
|
@ -92,7 +87,7 @@ val MOBIDZIENNIK_USER_AGENT = SYSTEM_USER_AGENT
|
||||||
|
|
||||||
const val VULCAN_API_USER_AGENT = "MobileUserAgent"
|
const val VULCAN_API_USER_AGENT = "MobileUserAgent"
|
||||||
const val VULCAN_API_APP_NAME = "VULCAN-Android-ModulUcznia"
|
const val VULCAN_API_APP_NAME = "VULCAN-Android-ModulUcznia"
|
||||||
const val VULCAN_API_APP_VERSION = "20.5.1.470"
|
const val VULCAN_API_APP_VERSION = "19.4.1.436"
|
||||||
const val VULCAN_API_PASSWORD = "CE75EA598C7743AD9B0B7328DED85B06"
|
const val VULCAN_API_PASSWORD = "CE75EA598C7743AD9B0B7328DED85B06"
|
||||||
const val VULCAN_API_PASSWORD_FAKELOG = "012345678901234567890123456789AB"
|
const val VULCAN_API_PASSWORD_FAKELOG = "012345678901234567890123456789AB"
|
||||||
val VULCAN_API_DEVICE_NAME = "Szkolny.eu ${Build.MODEL}"
|
val VULCAN_API_DEVICE_NAME = "Szkolny.eu ${Build.MODEL}"
|
||||||
|
@ -112,13 +107,5 @@ const val VULCAN_API_ENDPOINT_MESSAGES_SENT = "mobile-api/Uczen.v3.Uczen/Wiadomo
|
||||||
const val VULCAN_API_ENDPOINT_MESSAGES_CHANGE_STATUS = "mobile-api/Uczen.v3.Uczen/ZmienStatusWiadomosci"
|
const val VULCAN_API_ENDPOINT_MESSAGES_CHANGE_STATUS = "mobile-api/Uczen.v3.Uczen/ZmienStatusWiadomosci"
|
||||||
const val VULCAN_API_ENDPOINT_MESSAGES_ADD = "mobile-api/Uczen.v3.Uczen/DodajWiadomosc"
|
const val VULCAN_API_ENDPOINT_MESSAGES_ADD = "mobile-api/Uczen.v3.Uczen/DodajWiadomosc"
|
||||||
const val VULCAN_API_ENDPOINT_PUSH = "mobile-api/Uczen.v3.Uczen/UstawPushToken"
|
const val VULCAN_API_ENDPOINT_PUSH = "mobile-api/Uczen.v3.Uczen/UstawPushToken"
|
||||||
const val VULCAN_API_ENDPOINT_MESSAGES_ATTACHMENTS = "mobile-api/Uczen.v3.Uczen/WiadomosciZalacznik"
|
|
||||||
const val VULCAN_API_ENDPOINT_HOMEWORK_ATTACHMENTS = "mobile-api/Uczen.v3.Uczen/ZadaniaDomoweZalacznik"
|
|
||||||
const val VULCAN_WEB_ENDPOINT_LUCKY_NUMBER = "Start.mvc/GetKidsLuckyNumbers"
|
|
||||||
const val VULCAN_WEB_ENDPOINT_REGISTER_DEVICE = "RejestracjaUrzadzeniaToken.mvc/Get"
|
|
||||||
|
|
||||||
const val EDUDZIENNIK_USER_AGENT = "Szkolny.eu/${BuildConfig.VERSION_NAME}"
|
const val EDUDZIENNIK_USER_AGENT = "Szkolny.eu/${BuildConfig.VERSION_NAME}"
|
||||||
|
|
||||||
const val PODLASIE_API_VERSION = "1.0.31"
|
|
||||||
const val PODLASIE_API_URL = "https://cpdklaser.zeto.bialystok.pl/api"
|
|
||||||
const val PODLASIE_API_USER_ENDPOINT = "/pobierzDaneUcznia"
|
|
||||||
|
|
|
@ -8,12 +8,11 @@ import android.app.Notification
|
||||||
import android.app.NotificationManager
|
import android.app.NotificationManager
|
||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.core.app.NotificationCompat.PRIORITY_MIN
|
import androidx.core.app.NotificationCompat.PRIORITY_MIN
|
||||||
import pl.szczodrzynski.edziennik.App
|
import pl.szczodrzynski.edziennik.App
|
||||||
import pl.szczodrzynski.edziennik.Bundle
|
|
||||||
import pl.szczodrzynski.edziennik.R
|
import pl.szczodrzynski.edziennik.R
|
||||||
import pl.szczodrzynski.edziennik.receivers.SzkolnyReceiver
|
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,18 +35,16 @@ class EdziennikNotification(val app: App) {
|
||||||
var serviceClosed = false
|
var serviceClosed = false
|
||||||
|
|
||||||
private fun cancelPendingIntent(taskId: Int): PendingIntent {
|
private fun cancelPendingIntent(taskId: Int): PendingIntent {
|
||||||
val intent = SzkolnyReceiver.getIntent(app, Bundle(
|
val intent = Intent("pl.szczodrzynski.edziennik.SZKOLNY_MAIN")
|
||||||
"task" to "TaskCancelRequest",
|
intent.putExtra("task", "TaskCancelRequest")
|
||||||
"taskId" to taskId
|
intent.putExtra("taskId", taskId)
|
||||||
))
|
return PendingIntent.getBroadcast(app, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT) as PendingIntent
|
||||||
return PendingIntent.getBroadcast(app, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) as PendingIntent
|
|
||||||
}
|
}
|
||||||
private val closePendingIntent: PendingIntent
|
private val closePendingIntent: PendingIntent
|
||||||
get() {
|
get() {
|
||||||
val intent = SzkolnyReceiver.getIntent(app, Bundle(
|
val intent = Intent("pl.szczodrzynski.edziennik.SZKOLNY_MAIN")
|
||||||
"task" to "ServiceCloseRequest"
|
intent.putExtra("task", "ServiceCloseRequest")
|
||||||
))
|
return PendingIntent.getBroadcast(app, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT) as PendingIntent
|
||||||
return PendingIntent.getBroadcast(app, 0, intent, 0) as PendingIntent
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun errorCountText(): String? {
|
private fun errorCountText(): String? {
|
||||||
|
|
|
@ -126,8 +126,6 @@ const val ERROR_LOGIN_LIBRUS_PORTAL_CSRF_EXPIRED = 184
|
||||||
const val ERROR_LIBRUS_API_DEVICE_REGISTERED = 185
|
const val ERROR_LIBRUS_API_DEVICE_REGISTERED = 185
|
||||||
const val ERROR_LIBRUS_MESSAGES_NOT_FOUND = 186
|
const val ERROR_LIBRUS_MESSAGES_NOT_FOUND = 186
|
||||||
const val ERROR_LOGIN_LIBRUS_API_INVALID_REQUEST = 187
|
const val ERROR_LOGIN_LIBRUS_API_INVALID_REQUEST = 187
|
||||||
const val ERROR_LIBRUS_MESSAGES_ATTACHMENT_NOT_FOUND = 188
|
|
||||||
const val ERROR_LOGIN_LIBRUS_MESSAGES_TIMEOUT = 189
|
|
||||||
|
|
||||||
const val ERROR_LOGIN_MOBIDZIENNIK_WEB_INVALID_LOGIN = 201
|
const val ERROR_LOGIN_MOBIDZIENNIK_WEB_INVALID_LOGIN = 201
|
||||||
const val ERROR_LOGIN_MOBIDZIENNIK_WEB_OLD_PASSWORD = 202
|
const val ERROR_LOGIN_MOBIDZIENNIK_WEB_OLD_PASSWORD = 202
|
||||||
|
@ -159,17 +157,6 @@ const val ERROR_LOGIN_VULCAN_NO_PUPILS = 331
|
||||||
const val ERROR_VULCAN_API_MAINTENANCE = 340
|
const val ERROR_VULCAN_API_MAINTENANCE = 340
|
||||||
const val ERROR_VULCAN_API_BAD_REQUEST = 341
|
const val ERROR_VULCAN_API_BAD_REQUEST = 341
|
||||||
const val ERROR_VULCAN_API_OTHER = 342
|
const val ERROR_VULCAN_API_OTHER = 342
|
||||||
const val ERROR_VULCAN_ATTACHMENT_DOWNLOAD = 343
|
|
||||||
const val ERROR_VULCAN_WEB_DATA_MISSING = 344
|
|
||||||
const val ERROR_VULCAN_WEB_429 = 345
|
|
||||||
const val ERROR_VULCAN_WEB_OTHER = 346
|
|
||||||
const val ERROR_VULCAN_WEB_NO_CERTIFICATE = 347
|
|
||||||
const val ERROR_VULCAN_WEB_NO_REGISTER = 348
|
|
||||||
const val ERROR_VULCAN_WEB_CERTIFICATE_EXPIRED = 349
|
|
||||||
const val ERROR_VULCAN_WEB_LOGGED_OUT = 350
|
|
||||||
const val ERROR_VULCAN_WEB_CERTIFICATE_POST_FAILED = 351
|
|
||||||
const val ERROR_VULCAN_WEB_GRADUATE_ACCOUNT = 352
|
|
||||||
const val ERROR_VULCAN_WEB_NO_SCHOOLS = 353
|
|
||||||
|
|
||||||
const val ERROR_LOGIN_IDZIENNIK_WEB_INVALID_LOGIN = 401
|
const val ERROR_LOGIN_IDZIENNIK_WEB_INVALID_LOGIN = 401
|
||||||
const val ERROR_LOGIN_IDZIENNIK_WEB_INVALID_SCHOOL_NAME = 402
|
const val ERROR_LOGIN_IDZIENNIK_WEB_INVALID_SCHOOL_NAME = 402
|
||||||
|
@ -200,12 +187,6 @@ const val ERROR_EDUDZIENNIK_WEB_LIMITED_ACCESS = 521
|
||||||
const val ERROR_EDUDZIENNIK_WEB_SESSION_EXPIRED = 522
|
const val ERROR_EDUDZIENNIK_WEB_SESSION_EXPIRED = 522
|
||||||
const val ERROR_EDUDZIENNIK_WEB_TEAM_MISSING = 530
|
const val ERROR_EDUDZIENNIK_WEB_TEAM_MISSING = 530
|
||||||
|
|
||||||
const val ERROR_LOGIN_PODLASIE_API_INVALID_TOKEN = 601
|
|
||||||
const val ERROR_LOGIN_PODLASIE_API_DEVICE_LIMIT = 602
|
|
||||||
const val ERROR_PODLASIE_API_NO_TOKEN = 630
|
|
||||||
const val ERROR_PODLASIE_API_OTHER = 631
|
|
||||||
const val ERROR_PODLASIE_API_DATA_MISSING = 632
|
|
||||||
|
|
||||||
const val ERROR_TEMPLATE_WEB_OTHER = 801
|
const val ERROR_TEMPLATE_WEB_OTHER = 801
|
||||||
|
|
||||||
const val EXCEPTION_API_TASK = 900
|
const val EXCEPTION_API_TASK = 900
|
||||||
|
@ -225,9 +206,5 @@ const val EXCEPTION_IDZIENNIK_WEB_API_REQUEST = 913
|
||||||
const val EXCEPTION_IDZIENNIK_API_REQUEST = 914
|
const val EXCEPTION_IDZIENNIK_API_REQUEST = 914
|
||||||
const val EXCEPTION_EDUDZIENNIK_WEB_REQUEST = 920
|
const val EXCEPTION_EDUDZIENNIK_WEB_REQUEST = 920
|
||||||
const val EXCEPTION_EDUDZIENNIK_FILE_REQUEST = 921
|
const val EXCEPTION_EDUDZIENNIK_FILE_REQUEST = 921
|
||||||
const val ERROR_ONEDRIVE_DOWNLOAD = 930
|
|
||||||
const val EXCEPTION_VULCAN_WEB_LOGIN = 931
|
|
||||||
const val EXCEPTION_VULCAN_WEB_REQUEST = 932
|
|
||||||
const val EXCEPTION_PODLASIE_API_REQUEST = 940
|
|
||||||
|
|
||||||
const val LOGIN_NO_ARGUMENTS = 1201
|
const val LOGIN_NO_ARGUMENTS = 1201
|
||||||
|
|
|
@ -13,8 +13,8 @@ import pl.szczodrzynski.edziennik.MainActivity.Companion.DRAWER_ITEM_HOME
|
||||||
import pl.szczodrzynski.edziennik.MainActivity.Companion.DRAWER_ITEM_HOMEWORK
|
import pl.szczodrzynski.edziennik.MainActivity.Companion.DRAWER_ITEM_HOMEWORK
|
||||||
import pl.szczodrzynski.edziennik.MainActivity.Companion.DRAWER_ITEM_MESSAGES
|
import pl.szczodrzynski.edziennik.MainActivity.Companion.DRAWER_ITEM_MESSAGES
|
||||||
import pl.szczodrzynski.edziennik.MainActivity.Companion.DRAWER_ITEM_TIMETABLE
|
import pl.szczodrzynski.edziennik.MainActivity.Companion.DRAWER_ITEM_TIMETABLE
|
||||||
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.Message.Companion.TYPE_SENT
|
import pl.szczodrzynski.edziennik.data.db.entity.Message.TYPE_SENT
|
||||||
|
|
||||||
internal const val FEATURE_TIMETABLE = 1
|
internal const val FEATURE_TIMETABLE = 1
|
||||||
internal const val FEATURE_AGENDA = 2
|
internal const val FEATURE_AGENDA = 2
|
||||||
|
|
|
@ -13,11 +13,9 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLoginPor
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLoginSynergia
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLoginSynergia
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.login.MobidziennikLoginApi2
|
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.login.MobidziennikLoginApi2
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.login.MobidziennikLoginWeb
|
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.login.MobidziennikLoginWeb
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.login.PodlasieLoginApi
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.template.login.TemplateLoginApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.template.login.TemplateLoginApi
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.template.login.TemplateLoginWeb
|
import pl.szczodrzynski.edziennik.data.api.edziennik.template.login.TemplateLoginWeb
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginApi
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.login.VulcanLoginWebMain
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.LoginMethod
|
import pl.szczodrzynski.edziennik.data.api.models.LoginMethod
|
||||||
|
|
||||||
// librus
|
// librus
|
||||||
|
@ -29,6 +27,7 @@ import pl.szczodrzynski.edziennik.data.api.models.LoginMethod
|
||||||
const val SYNERGIA_API_ENABLED = false
|
const val SYNERGIA_API_ENABLED = false
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const val LOGIN_TYPE_IDZIENNIK = 3
|
const val LOGIN_TYPE_IDZIENNIK = 3
|
||||||
|
|
||||||
const val LOGIN_TYPE_TEMPLATE = 21
|
const val LOGIN_TYPE_TEMPLATE = 21
|
||||||
|
@ -71,13 +70,13 @@ val librusLoginMethods = listOf(
|
||||||
LoginMethod(LOGIN_TYPE_LIBRUS, LOGIN_METHOD_LIBRUS_SYNERGIA, LibrusLoginSynergia::class.java)
|
LoginMethod(LOGIN_TYPE_LIBRUS, LOGIN_METHOD_LIBRUS_SYNERGIA, LibrusLoginSynergia::class.java)
|
||||||
.withIsPossible { _, loginStore -> !loginStore.hasLoginData("fakeLogin") }
|
.withIsPossible { _, loginStore -> !loginStore.hasLoginData("fakeLogin") }
|
||||||
.withRequiredLoginMethod { profile, _ ->
|
.withRequiredLoginMethod { profile, _ ->
|
||||||
if (profile?.hasStudentData("accountPassword") == false || true) LOGIN_METHOD_LIBRUS_API else LOGIN_METHOD_NOT_NEEDED
|
if (profile?.hasStudentData("accountPassword") == false) LOGIN_METHOD_LIBRUS_API else LOGIN_METHOD_NOT_NEEDED
|
||||||
},
|
},
|
||||||
|
|
||||||
LoginMethod(LOGIN_TYPE_LIBRUS, LOGIN_METHOD_LIBRUS_MESSAGES, LibrusLoginMessages::class.java)
|
LoginMethod(LOGIN_TYPE_LIBRUS, LOGIN_METHOD_LIBRUS_MESSAGES, LibrusLoginMessages::class.java)
|
||||||
.withIsPossible { _, loginStore -> !loginStore.hasLoginData("fakeLogin") }
|
.withIsPossible { _, loginStore -> !loginStore.hasLoginData("fakeLogin") }
|
||||||
.withRequiredLoginMethod { profile, _ ->
|
.withRequiredLoginMethod { profile, _ ->
|
||||||
if (profile?.hasStudentData("accountPassword") == false || true) LOGIN_METHOD_LIBRUS_SYNERGIA else LOGIN_METHOD_NOT_NEEDED
|
if (profile?.hasStudentData("accountPassword") == false) LOGIN_METHOD_LIBRUS_SYNERGIA else LOGIN_METHOD_NOT_NEEDED
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -104,11 +103,11 @@ const val LOGIN_METHOD_VULCAN_WEB_OLD = 300
|
||||||
const val LOGIN_METHOD_VULCAN_WEB_MESSAGES = 400
|
const val LOGIN_METHOD_VULCAN_WEB_MESSAGES = 400
|
||||||
const val LOGIN_METHOD_VULCAN_API = 500
|
const val LOGIN_METHOD_VULCAN_API = 500
|
||||||
val vulcanLoginMethods = listOf(
|
val vulcanLoginMethods = listOf(
|
||||||
LoginMethod(LOGIN_TYPE_VULCAN, LOGIN_METHOD_VULCAN_WEB_MAIN, VulcanLoginWebMain::class.java)
|
/*LoginMethod(LOGIN_TYPE_VULCAN, LOGIN_METHOD_VULCAN_WEB_MAIN, VulcanLoginWebMain::class.java)
|
||||||
.withIsPossible { _, loginStore -> loginStore.hasLoginData("webHost") }
|
.withIsPossible { _, _ -> false }
|
||||||
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED },
|
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED },
|
||||||
|
|
||||||
/*LoginMethod(LOGIN_TYPE_VULCAN, LOGIN_METHOD_VULCAN_WEB_NEW, VulcanLoginWebNew::class.java)
|
LoginMethod(LOGIN_TYPE_VULCAN, LOGIN_METHOD_VULCAN_WEB_NEW, VulcanLoginWebNew::class.java)
|
||||||
.withIsPossible { _, _ -> false }
|
.withIsPossible { _, _ -> false }
|
||||||
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_VULCAN_WEB_MAIN },
|
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_VULCAN_WEB_MAIN },
|
||||||
|
|
||||||
|
@ -119,7 +118,7 @@ val vulcanLoginMethods = listOf(
|
||||||
LoginMethod(LOGIN_TYPE_VULCAN, LOGIN_METHOD_VULCAN_API, VulcanLoginApi::class.java)
|
LoginMethod(LOGIN_TYPE_VULCAN, LOGIN_METHOD_VULCAN_API, VulcanLoginApi::class.java)
|
||||||
.withIsPossible { _, _ -> true }
|
.withIsPossible { _, _ -> true }
|
||||||
.withRequiredLoginMethod { _, loginStore ->
|
.withRequiredLoginMethod { _, loginStore ->
|
||||||
if (loginStore.mode == LOGIN_MODE_VULCAN_WEB) LOGIN_METHOD_VULCAN_WEB_MAIN else LOGIN_METHOD_NOT_NEEDED
|
if (loginStore.mode == LOGIN_MODE_VULCAN_WEB) LOGIN_METHOD_VULCAN_WEB_NEW else LOGIN_METHOD_NOT_NEEDED
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -134,7 +133,6 @@ val idziennikLoginMethods = listOf(
|
||||||
)
|
)
|
||||||
|
|
||||||
const val LOGIN_TYPE_EDUDZIENNIK = 5
|
const val LOGIN_TYPE_EDUDZIENNIK = 5
|
||||||
const val LOGIN_MODE_EDUDZIENNIK_WEB = 0
|
|
||||||
const val LOGIN_METHOD_EDUDZIENNIK_WEB = 100
|
const val LOGIN_METHOD_EDUDZIENNIK_WEB = 100
|
||||||
val edudziennikLoginMethods = listOf(
|
val edudziennikLoginMethods = listOf(
|
||||||
LoginMethod(LOGIN_TYPE_EDUDZIENNIK, LOGIN_METHOD_EDUDZIENNIK_WEB, EdudziennikLoginWeb::class.java)
|
LoginMethod(LOGIN_TYPE_EDUDZIENNIK, LOGIN_METHOD_EDUDZIENNIK_WEB, EdudziennikLoginWeb::class.java)
|
||||||
|
@ -142,15 +140,6 @@ val edudziennikLoginMethods = listOf(
|
||||||
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED }
|
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED }
|
||||||
)
|
)
|
||||||
|
|
||||||
const val LOGIN_TYPE_PODLASIE = 6
|
|
||||||
const val LOGIN_MODE_PODLASIE_API = 0
|
|
||||||
const val LOGIN_METHOD_PODLASIE_API = 100
|
|
||||||
val podlasieLoginMethods = listOf(
|
|
||||||
LoginMethod(LOGIN_TYPE_PODLASIE, LOGIN_METHOD_PODLASIE_API, PodlasieLoginApi::class.java)
|
|
||||||
.withIsPossible { _, _ -> true }
|
|
||||||
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED }
|
|
||||||
)
|
|
||||||
|
|
||||||
val templateLoginMethods = listOf(
|
val templateLoginMethods = listOf(
|
||||||
LoginMethod(LOGIN_TYPE_TEMPLATE, LOGIN_METHOD_TEMPLATE_WEB, TemplateLoginWeb::class.java)
|
LoginMethod(LOGIN_TYPE_TEMPLATE, LOGIN_METHOD_TEMPLATE_WEB, TemplateLoginWeb::class.java)
|
||||||
.withIsPossible { _, _ -> true }
|
.withIsPossible { _, _ -> true }
|
||||||
|
|
|
@ -40,7 +40,7 @@ object Regexes {
|
||||||
"""\(([0-9A-ząęóżźńśłć]*?)\)$""".toRegex(DOT_MATCHES_ALL)
|
"""\(([0-9A-ząęóżźńśłć]*?)\)$""".toRegex(DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
val MOBIDZIENNIK_LUCKY_NUMBER by lazy {
|
val MOBIDZIENNIK_LUCKY_NUMBER by lazy {
|
||||||
"""class="szczesliwy_numerek".*?>0?([0-9]+)/?0?([0-9]+)?</a>""".toRegex(DOT_MATCHES_ALL)
|
"""class="szczesliwy_numerek".*>0*([0-9]+)(?:/0*[0-9]+)*</a>""".toRegex(DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
val MOBIDZIENNIK_CLASS_CALENDAR by lazy {
|
val MOBIDZIENNIK_CLASS_CALENDAR by lazy {
|
||||||
"""events: (.+),$""".toRegex(RegexOption.MULTILINE)
|
"""events: (.+),$""".toRegex(RegexOption.MULTILINE)
|
||||||
|
@ -68,9 +68,6 @@ object Regexes {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
val MOBIDZIENNIK_ATTENDANCE_TYPES by lazy {
|
|
||||||
"""Legenda:.+?normal;">(.+?)</span>""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val MOBIDZIENNIK_ATTENDANCE_TABLE by lazy {
|
val MOBIDZIENNIK_ATTENDANCE_TABLE by lazy {
|
||||||
"""<table .+?id="obecnosci_tabela">(.+?)</table>""".toRegex(DOT_MATCHES_ALL)
|
"""<table .+?id="obecnosci_tabela">(.+?)</table>""".toRegex(DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
|
@ -84,23 +81,7 @@ object Regexes {
|
||||||
"""<span>([0-9:]+) - .+? (.+?)</span></a>""".toRegex(DOT_MATCHES_ALL)
|
"""<span>([0-9:]+) - .+? (.+?)</span></a>""".toRegex(DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
val MOBIDZIENNIK_ATTENDANCE_LESSON by lazy {
|
val MOBIDZIENNIK_ATTENDANCE_LESSON by lazy {
|
||||||
"""<strong>(.+?)</strong>\s*<small>\s*\((.+?),\s*(.+?)\)""".toRegex(DOT_MATCHES_ALL)
|
"""<strong>(.+?) - (.*?)</strong>.+?<small>.+?\((.+?), .+?(.+?)\)""".toRegex(DOT_MATCHES_ALL)
|
||||||
}
|
|
||||||
|
|
||||||
val MOBIDZIENNIK_HOMEWORK_ROW by lazy {
|
|
||||||
"""class="rowRolling">(.+?</div>\s*</td>)""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val MOBIDZIENNIK_HOMEWORK_ITEM by lazy {
|
|
||||||
"""<p><b>(.+?):</b>\s*(.+?)\s*</p>""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
val MOBIDZIENNIK_HOMEWORK_BODY by lazy {
|
|
||||||
"""Treść:</b>(.+?)<p><b>""".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">(.+?)</td>""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -142,21 +123,12 @@ object Regexes {
|
||||||
val VULCAN_SHIFT_ANNOTATION by lazy {
|
val VULCAN_SHIFT_ANNOTATION by lazy {
|
||||||
"""\(przeniesiona (z|na) lekcj[ię] ([0-9]+), (.+)\)""".toRegex()
|
"""\(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 {
|
val LIBRUS_ATTACHMENT_KEY by lazy {
|
||||||
"""singleUseKey=([0-9A-z_]+)""".toRegex()
|
"""singleUseKey=([0-9A-z_]+)""".toRegex()
|
||||||
}
|
}
|
||||||
val LIBRUS_MESSAGE_ID by lazy {
|
|
||||||
"""/wiadomosci/[0-9]+/[0-9]+/([0-9]+?)/""".toRegex()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -183,9 +155,6 @@ object Regexes {
|
||||||
val EDUDZIENNIK_ANNOUNCEMENT_DESCRIPTION by lazy {
|
val EDUDZIENNIK_ANNOUNCEMENT_DESCRIPTION by lazy {
|
||||||
"""<div class="desc">.*?<p>(.*?)</p>""".toRegex(DOT_MATCHES_ALL)
|
"""<div class="desc">.*?<p>(.*?)</p>""".toRegex(DOT_MATCHES_ALL)
|
||||||
}
|
}
|
||||||
val EDUDZIENNIK_HOMEWORK_DESCRIPTION by lazy {
|
|
||||||
"""<div class="desc">(.*?)</div>""".toRegex(DOT_MATCHES_ALL)
|
|
||||||
}
|
|
||||||
|
|
||||||
val EDUDZIENNIK_SUBJECT_ID by lazy {
|
val EDUDZIENNIK_SUBJECT_ID by lazy {
|
||||||
"""/Courses/([\w-_]+?)/""".toRegex()
|
"""/Courses/([\w-_]+?)/""".toRegex()
|
||||||
|
|
|
@ -12,7 +12,6 @@ import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.Edudziennik
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.Idziennik
|
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.Idziennik
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.Librus
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.Librus
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.Mobidziennik
|
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.Mobidziennik
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.podlasie.Podlasie
|
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.template.Template
|
import pl.szczodrzynski.edziennik.data.api.edziennik.template.Template
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.Vulcan
|
import pl.szczodrzynski.edziennik.data.api.edziennik.vulcan.Vulcan
|
||||||
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
|
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
|
||||||
|
@ -20,20 +19,15 @@ import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
import pl.szczodrzynski.edziennik.data.api.task.IApiTask
|
import pl.szczodrzynski.edziennik.data.api.task.IApiTask
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
|
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
import pl.szczodrzynski.edziennik.data.db.entity.Message
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
|
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
|
||||||
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
|
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.data.db.full.MessageFull
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
|
||||||
|
|
||||||
open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTask(profileId) {
|
open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTask(profileId) {
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "EdziennikTask"
|
private const val TAG = "EdziennikTask"
|
||||||
|
|
||||||
var profile: Profile? = null
|
|
||||||
var loginStore: LoginStore? = null
|
|
||||||
|
|
||||||
fun firstLogin(loginStore: LoginStore) = EdziennikTask(-1, FirstLoginRequest(loginStore))
|
fun firstLogin(loginStore: LoginStore) = EdziennikTask(-1, FirstLoginRequest(loginStore))
|
||||||
fun sync() = EdziennikTask(-1, SyncRequest())
|
fun sync() = EdziennikTask(-1, SyncRequest())
|
||||||
fun syncProfile(profileId: Int, viewIds: List<Pair<Int, Int>>? = null, onlyEndpoints: List<Int>? = null, arguments: JsonObject? = null) = EdziennikTask(profileId, SyncProfileRequest(viewIds, onlyEndpoints, arguments))
|
fun syncProfile(profileId: Int, viewIds: List<Pair<Int, Int>>? = null, onlyEndpoints: List<Int>? = null, arguments: JsonObject? = null) = EdziennikTask(profileId, SyncProfileRequest(viewIds, onlyEndpoints, arguments))
|
||||||
|
@ -42,9 +36,8 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
|
||||||
fun messageSend(profileId: Int, recipients: List<Teacher>, subject: String, text: String) = EdziennikTask(profileId, MessageSendRequest(recipients, subject, text))
|
fun messageSend(profileId: Int, recipients: List<Teacher>, subject: String, text: String) = EdziennikTask(profileId, MessageSendRequest(recipients, subject, text))
|
||||||
fun announcementsRead(profileId: Int) = EdziennikTask(profileId, AnnouncementsReadRequest())
|
fun announcementsRead(profileId: Int) = EdziennikTask(profileId, AnnouncementsReadRequest())
|
||||||
fun announcementGet(profileId: Int, announcement: AnnouncementFull) = EdziennikTask(profileId, AnnouncementGetRequest(announcement))
|
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 recipientListGet(profileId: Int) = EdziennikTask(profileId, RecipientListGetRequest())
|
||||||
fun eventGet(profileId: Int, event: EventFull) = EdziennikTask(profileId, EventGetRequest(event))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private lateinit var loginStore: LoginStore
|
private lateinit var loginStore: LoginStore
|
||||||
|
@ -65,38 +58,21 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
|
||||||
// save the profile ID and name as the current task's
|
// save the profile ID and name as the current task's
|
||||||
taskName = app.getString(R.string.edziennik_notification_api_sync_title_format, profile.name)
|
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
|
private var edziennikInterface: EdziennikInterface? = null
|
||||||
|
|
||||||
internal fun run(app: App, taskCallback: EdziennikCallback) {
|
internal fun run(app: App, taskCallback: EdziennikCallback) {
|
||||||
profile?.let { profile ->
|
if (profile?.archived == true) {
|
||||||
if (profile.archived) {
|
|
||||||
d(TAG, "The profile $profileId is archived")
|
|
||||||
taskCallback.onError(ApiError(TAG, ERROR_PROFILE_ARCHIVED))
|
taskCallback.onError(ApiError(TAG, ERROR_PROFILE_ARCHIVED))
|
||||||
return
|
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
edziennikInterface = when (loginStore.type) {
|
edziennikInterface = when (loginStore.type) {
|
||||||
LOGIN_TYPE_LIBRUS -> Librus(app, profile, loginStore, taskCallback)
|
LOGIN_TYPE_LIBRUS -> Librus(app, profile, loginStore, taskCallback)
|
||||||
LOGIN_TYPE_MOBIDZIENNIK -> Mobidziennik(app, profile, loginStore, taskCallback)
|
LOGIN_TYPE_MOBIDZIENNIK -> Mobidziennik(app, profile, loginStore, taskCallback)
|
||||||
LOGIN_TYPE_VULCAN -> Vulcan(app, profile, loginStore, taskCallback)
|
LOGIN_TYPE_VULCAN -> Vulcan(app, profile, loginStore, taskCallback)
|
||||||
LOGIN_TYPE_IDZIENNIK -> Idziennik(app, profile, loginStore, taskCallback)
|
LOGIN_TYPE_IDZIENNIK -> Idziennik(app, profile, loginStore, taskCallback)
|
||||||
LOGIN_TYPE_EDUDZIENNIK -> Edudziennik(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)
|
LOGIN_TYPE_TEMPLATE -> Template(app, profile, loginStore, taskCallback)
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
@ -116,14 +92,12 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
|
||||||
is FirstLoginRequest -> edziennikInterface?.firstLogin()
|
is FirstLoginRequest -> edziennikInterface?.firstLogin()
|
||||||
is AnnouncementsReadRequest -> edziennikInterface?.markAllAnnouncementsAsRead()
|
is AnnouncementsReadRequest -> edziennikInterface?.markAllAnnouncementsAsRead()
|
||||||
is AnnouncementGetRequest -> edziennikInterface?.getAnnouncement(request.announcement)
|
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 RecipientListGetRequest -> edziennikInterface?.getRecipientList()
|
||||||
is EventGetRequest -> edziennikInterface?.getEvent(request.event)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun cancel() {
|
override fun cancel() {
|
||||||
d(TAG, "Task ${toString()} cancelling...")
|
|
||||||
edziennikInterface?.cancel()
|
edziennikInterface?.cancel()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,7 +113,6 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
|
||||||
data class MessageSendRequest(val recipients: List<Teacher>, val subject: String, val text: String)
|
data class MessageSendRequest(val recipients: List<Teacher>, val subject: String, val text: String)
|
||||||
class AnnouncementsReadRequest
|
class AnnouncementsReadRequest
|
||||||
data class AnnouncementGetRequest(val announcement: AnnouncementFull)
|
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
|
class RecipientListGetRequest
|
||||||
data class EventGetRequest(val event: EventFull)
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -9,7 +9,6 @@ import pl.szczodrzynski.edziennik.App
|
||||||
import pl.szczodrzynski.edziennik.data.api.*
|
import pl.szczodrzynski.edziennik.data.api.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikData
|
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.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.firstlogin.EdudziennikFirstLogin
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login.EdudziennikLogin
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login.EdudziennikLogin
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login.EdudziennikLoginWeb
|
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.interfaces.EdziennikInterface
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
|
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.Profile
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
|
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
|
||||||
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
|
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.data.db.full.MessageFull
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||||
|
|
||||||
|
@ -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 getRecipientList() {}
|
||||||
|
|
||||||
override fun getEvent(eventFull: EventFull) {
|
|
||||||
EdudziennikLoginWeb(data) {
|
|
||||||
EdudziennikWebGetHomework(data, eventFull) {
|
|
||||||
completed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun firstLogin() { EdudziennikFirstLogin(data) { completed() } }
|
override fun firstLogin() { EdudziennikFirstLogin(data) { completed() } }
|
||||||
override fun cancel() {
|
override fun cancel() {
|
||||||
d(TAG, "Cancelled")
|
d(TAG, "Cancelled")
|
||||||
|
|
|
@ -7,6 +7,7 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data
|
||||||
import im.wangchao.mhttp.Request
|
import im.wangchao.mhttp.Request
|
||||||
import im.wangchao.mhttp.Response
|
import im.wangchao.mhttp.Response
|
||||||
import im.wangchao.mhttp.callback.TextCallbackHandler
|
import im.wangchao.mhttp.callback.TextCallbackHandler
|
||||||
|
import okhttp3.Cookie
|
||||||
import pl.szczodrzynski.edziennik.data.api.*
|
import pl.szczodrzynski.edziennik.data.api.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
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")) {
|
if (semester == null && url.contains("start")) {
|
||||||
profile?.also { profile ->
|
profile?.also { profile ->
|
||||||
val cookies = data.app.cookieJar.getAll("dziennikel.appspot.com")
|
val cookies = data.app.cookieJar.getForDomain("dziennikel.appspot.com")
|
||||||
val semesterCookie = cookies["semester"]?.toIntOrNull()
|
val semesterCookie = cookies.firstOrNull { it.name() == "semester" }?.value()?.toIntOrNull()
|
||||||
|
|
||||||
semesterCookie?.let { data.currentSemester = it }
|
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()
|
Request.builder()
|
||||||
.url(url)
|
.url(url)
|
||||||
|
|
|
@ -45,25 +45,24 @@ class EdudziennikWebAnnouncements(override val data: DataEdudziennik,
|
||||||
val addedDate = Date.fromIsoHm(dateString)
|
val addedDate = Date.fromIsoHm(dateString)
|
||||||
|
|
||||||
val announcementObject = Announcement(
|
val announcementObject = Announcement(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
subject = subject,
|
subject,
|
||||||
text = null,
|
null,
|
||||||
startDate = startDate,
|
startDate,
|
||||||
endDate = null,
|
null,
|
||||||
teacherId = teacher.id,
|
teacher.id,
|
||||||
addedDate = addedDate
|
longId
|
||||||
).also {
|
)
|
||||||
it.idString = longId
|
|
||||||
}
|
|
||||||
|
|
||||||
data.announcementList.add(announcementObject)
|
data.announcementIgnoreList.add(announcementObject)
|
||||||
data.metadataList.add(Metadata(
|
data.metadataList.add(Metadata(
|
||||||
profileId,
|
profileId,
|
||||||
Metadata.TYPE_ANNOUNCEMENT,
|
Metadata.TYPE_ANNOUNCEMENT,
|
||||||
id,
|
id,
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,12 +39,12 @@ class EdudziennikWebAttendance(override val data: DataEdudziennik,
|
||||||
|
|
||||||
val attendanceTypes = EDUDZIENNIK_ATTENDANCE_TYPES.find(text)?.get(1)?.split(',')?.map {
|
val attendanceTypes = EDUDZIENNIK_ATTENDANCE_TYPES.find(text)?.get(1)?.split(',')?.map {
|
||||||
val type = EDUDZIENNIK_ATTENDANCE_TYPE.find(it.trim())
|
val type = EDUDZIENNIK_ATTENDANCE_TYPE.find(it.trim())
|
||||||
val symbol = type?.get(1)?.trim() ?: "?"
|
val symbol = type?.get(1)?.trim()
|
||||||
val name = type?.get(2)?.trim() ?: "nieznany rodzaj"
|
val name = type?.get(2)?.trim()
|
||||||
return@map Triple(
|
return@map Triple(
|
||||||
symbol,
|
symbol,
|
||||||
name,
|
name,
|
||||||
when (name.toLowerCase(Locale.ROOT)) {
|
when (name?.toLowerCase(Locale.ROOT)) {
|
||||||
"obecność" -> Attendance.TYPE_PRESENT
|
"obecność" -> Attendance.TYPE_PRESENT
|
||||||
"nieobecność" -> Attendance.TYPE_ABSENT
|
"nieobecność" -> Attendance.TYPE_ABSENT
|
||||||
"spóźnienie" -> Attendance.TYPE_BELATED
|
"spóźnienie" -> Attendance.TYPE_BELATED
|
||||||
|
@ -52,7 +52,7 @@ class EdudziennikWebAttendance(override val data: DataEdudziennik,
|
||||||
"dzień wolny" -> Attendance.TYPE_DAY_FREE
|
"dzień wolny" -> Attendance.TYPE_DAY_FREE
|
||||||
"brak zajęć" -> Attendance.TYPE_DAY_FREE
|
"brak zajęć" -> Attendance.TYPE_DAY_FREE
|
||||||
"oddelegowany" -> Attendance.TYPE_RELEASED
|
"oddelegowany" -> Attendance.TYPE_RELEASED
|
||||||
else -> Attendance.TYPE_UNKNOWN
|
else -> Attendance.TYPE_CUSTOM
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
} ?: emptyList()
|
} ?: emptyList()
|
||||||
|
@ -62,42 +62,38 @@ class EdudziennikWebAttendance(override val data: DataEdudziennik,
|
||||||
val lessonNumber = attendanceElement[2].toInt()
|
val lessonNumber = attendanceElement[2].toInt()
|
||||||
val attendanceSymbol = attendanceElement[3]
|
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 lesson = lessons.firstOrNull { it.lessonNumber == lessonNumber }
|
||||||
|
|
||||||
val id = "${date.stringY_m_d}:$lessonNumber:$attendanceSymbol".crc32()
|
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
|
?: return@forEach
|
||||||
|
|
||||||
val startTime = data.lessonRanges.singleOrNull { it.lessonNumber == lessonNumber }?.startTime
|
val startTime = data.lessonRanges.singleOrNull { it.lessonNumber == lessonNumber }?.startTime
|
||||||
?: return@forEach
|
?: return@forEach
|
||||||
|
|
||||||
val attendanceObject = Attendance(
|
val attendanceObject = Attendance(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
baseType = baseType,
|
lesson?.displayTeacherId ?: -1,
|
||||||
typeName = typeName,
|
lesson?.displaySubjectId ?: -1,
|
||||||
typeShort = data.app.attendanceManager.getTypeShort(baseType),
|
profile.currentSemester,
|
||||||
typeSymbol = typeSymbol,
|
name,
|
||||||
typeColor = null,
|
date,
|
||||||
date = date,
|
lesson?.displayStartTime ?: startTime,
|
||||||
startTime = lesson?.displayStartTime ?: startTime,
|
type
|
||||||
semester = profile.currentSemester,
|
)
|
||||||
teacherId = lesson?.displayTeacherId ?: -1,
|
|
||||||
subjectId = lesson?.displaySubjectId ?: -1
|
|
||||||
).also {
|
|
||||||
it.lessonNumber = lessonNumber
|
|
||||||
}
|
|
||||||
|
|
||||||
data.attendanceList.add(attendanceObject)
|
data.attendanceList.add(attendanceObject)
|
||||||
if (baseType != Attendance.TYPE_PRESENT) {
|
if(type != Attendance.TYPE_PRESENT) {
|
||||||
data.metadataList.add(Metadata(
|
data.metadataList.add(Metadata(
|
||||||
profileId,
|
profileId,
|
||||||
Metadata.TYPE_ATTENDANCE,
|
Metadata.TYPE_ATTENDANCE,
|
||||||
id,
|
id,
|
||||||
profile.empty || baseType == Attendance.TYPE_PRESENT_CUSTOM || baseType == Attendance.TYPE_UNKNOWN,
|
profile.empty,
|
||||||
profile.empty || baseType == Attendance.TYPE_PRESENT_CUSTOM || baseType == Attendance.TYPE_UNKNOWN
|
profile.empty,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,16 +39,17 @@ class EdudziennikWebEvents(override val data: DataEdudziennik,
|
||||||
?: return@forEach
|
?: return@forEach
|
||||||
|
|
||||||
val eventObject = Event(
|
val eventObject = Event(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
date = date,
|
date,
|
||||||
time = null,
|
null,
|
||||||
topic = title,
|
title,
|
||||||
color = null,
|
-1,
|
||||||
type = Event.TYPE_CLASS_EVENT,
|
Event.TYPE_CLASS_EVENT,
|
||||||
teacherId = -1,
|
false,
|
||||||
subjectId = -1,
|
-1,
|
||||||
teamId = data.teamClass?.id ?: -1
|
-1,
|
||||||
|
data.teamClass?.id ?: -1
|
||||||
)
|
)
|
||||||
|
|
||||||
data.eventList.add(eventObject)
|
data.eventList.add(eventObject)
|
||||||
|
@ -57,7 +58,8 @@ class EdudziennikWebEvents(override val data: DataEdudziennik,
|
||||||
Metadata.TYPE_EVENT,
|
Metadata.TYPE_EVENT,
|
||||||
id,
|
id,
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ class EdudziennikWebExams(override val data: DataEdudziennik,
|
||||||
if (dateString.isBlank()) return@forEach
|
if (dateString.isBlank()) return@forEach
|
||||||
val date = Date.fromY_m_d(dateString)
|
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 startTime = lessons.firstOrNull { it.displaySubjectId == subject.id }?.displayStartTime
|
||||||
|
|
||||||
val eventTypeElement = examElement.child(3).child(0)
|
val eventTypeElement = examElement.child(3).child(0)
|
||||||
|
@ -56,16 +56,17 @@ class EdudziennikWebExams(override val data: DataEdudziennik,
|
||||||
val eventType = data.getEventType(eventTypeId, eventTypeName)
|
val eventType = data.getEventType(eventTypeId, eventTypeName)
|
||||||
|
|
||||||
val eventObject = Event(
|
val eventObject = Event(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
date = date,
|
date,
|
||||||
time = startTime,
|
startTime,
|
||||||
topic = topic,
|
topic,
|
||||||
color = null,
|
-1,
|
||||||
type = eventType.id,
|
eventType.id,
|
||||||
teacherId = -1,
|
false,
|
||||||
subjectId = subject.id,
|
-1,
|
||||||
teamId = data.teamClass?.id ?: -1
|
subject.id,
|
||||||
|
data.teamClass?.id ?: -1
|
||||||
)
|
)
|
||||||
|
|
||||||
data.eventList.add(eventObject)
|
data.eventList.add(eventObject)
|
||||||
|
@ -74,7 +75,8 @@ class EdudziennikWebExams(override val data: DataEdudziennik,
|
||||||
Metadata.TYPE_EVENT,
|
Metadata.TYPE_EVENT,
|
||||||
id,
|
id,
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -126,8 +126,7 @@ class EdudziennikWebGrades(override val data: DataEdudziennik,
|
||||||
comment = null,
|
comment = null,
|
||||||
semester = semester,
|
semester = semester,
|
||||||
teacherId = teacher.id,
|
teacherId = teacher.id,
|
||||||
subjectId = subject.id,
|
subjectId = subject.id
|
||||||
addedDate = addedDate
|
|
||||||
)
|
)
|
||||||
|
|
||||||
data.gradeList.add(gradeObject)
|
data.gradeList.add(gradeObject)
|
||||||
|
@ -136,7 +135,8 @@ class EdudziennikWebGrades(override val data: DataEdudziennik,
|
||||||
Metadata.TYPE_GRADE,
|
Metadata.TYPE_GRADE,
|
||||||
id,
|
id,
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,7 +168,8 @@ class EdudziennikWebGrades(override val data: DataEdudziennik,
|
||||||
Metadata.TYPE_GRADE,
|
Metadata.TYPE_GRADE,
|
||||||
proposedGradeObject.id,
|
proposedGradeObject.id,
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,7 +201,8 @@ class EdudziennikWebGrades(override val data: DataEdudziennik,
|
||||||
Metadata.TYPE_GRADE,
|
Metadata.TYPE_GRADE,
|
||||||
finalGradeObject.id,
|
finalGradeObject.id,
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,8 +33,8 @@ class EdudziennikWebHomework(override val data: DataEdudziennik,
|
||||||
if (doc.getElementsByClass("message").text().trim() != "Brak prac domowych") {
|
if (doc.getElementsByClass("message").text().trim() != "Brak prac domowych") {
|
||||||
doc.getElementsByTag("tr").forEach { homeworkElement ->
|
doc.getElementsByTag("tr").forEach { homeworkElement ->
|
||||||
val dateElement = homeworkElement.getElementsByClass("date").first().child(0)
|
val dateElement = homeworkElement.getElementsByClass("date").first().child(0)
|
||||||
val idStr = EDUDZIENNIK_HOMEWORK_ID.find(dateElement.attr("href"))?.get(1) ?: return@forEach
|
val id = EDUDZIENNIK_HOMEWORK_ID.find(dateElement.attr("href"))?.get(1)?.crc32()
|
||||||
val id = idStr.crc32()
|
?: return@forEach
|
||||||
val date = Date.fromY_m_d(dateElement.text())
|
val date = Date.fromY_m_d(dateElement.text())
|
||||||
|
|
||||||
val subjectElement = homeworkElement.child(1).child(0)
|
val subjectElement = homeworkElement.child(1).child(0)
|
||||||
|
@ -43,36 +43,36 @@ class EdudziennikWebHomework(override val data: DataEdudziennik,
|
||||||
val subjectName = subjectElement.text()
|
val subjectName = subjectElement.text()
|
||||||
val subject = data.getSubject(subjectId, subjectName)
|
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 startTime = lessons.firstOrNull { it.subjectId == subject.id }?.displayStartTime
|
||||||
|
|
||||||
val teacherName = homeworkElement.child(2).text()
|
val teacherName = homeworkElement.child(2).text()
|
||||||
val teacher = data.getTeacherByFirstLast(teacherName)
|
val teacher = data.getTeacherByFirstLast(teacherName)
|
||||||
|
|
||||||
val topic = homeworkElement.child(4).text()?.trim()
|
val topic = homeworkElement.child(4).text()
|
||||||
|
|
||||||
val eventObject = Event(
|
val eventObject = Event(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
date = date,
|
date,
|
||||||
time = startTime,
|
startTime,
|
||||||
topic = topic ?: "",
|
topic,
|
||||||
color = null,
|
-1,
|
||||||
type = Event.TYPE_HOMEWORK,
|
Event.TYPE_HOMEWORK,
|
||||||
teacherId = teacher.id,
|
false,
|
||||||
subjectId = subject.id,
|
teacher.id,
|
||||||
teamId = data.teamClass?.id ?: -1
|
subject.id,
|
||||||
|
data.teamClass?.id ?: -1
|
||||||
)
|
)
|
||||||
|
|
||||||
eventObject.attachmentNames = mutableListOf(idStr)
|
|
||||||
|
|
||||||
data.eventList.add(eventObject)
|
data.eventList.add(eventObject)
|
||||||
data.metadataList.add(Metadata(
|
data.metadataList.add(Metadata(
|
||||||
profileId,
|
profileId,
|
||||||
Metadata.TYPE_HOMEWORK,
|
Metadata.TYPE_HOMEWORK,
|
||||||
id,
|
id,
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,9 +24,9 @@ class EdudziennikWebLuckyNumber(override val data: DataEdudziennik,
|
||||||
webGet(TAG, data.schoolEndpoint + "Lucky", xhr = true) { text ->
|
webGet(TAG, data.schoolEndpoint + "Lucky", xhr = true) { text ->
|
||||||
text.toIntOrNull()?.also { luckyNumber ->
|
text.toIntOrNull()?.also { luckyNumber ->
|
||||||
val luckyNumberObject = LuckyNumber(
|
val luckyNumberObject = LuckyNumber(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
date = Date.getToday(),
|
Date.getToday(),
|
||||||
number = luckyNumber
|
luckyNumber
|
||||||
)
|
)
|
||||||
|
|
||||||
data.luckyNumberList.add(luckyNumberObject)
|
data.luckyNumberList.add(luckyNumberObject)
|
||||||
|
@ -35,7 +35,8 @@ class EdudziennikWebLuckyNumber(override val data: DataEdudziennik,
|
||||||
Metadata.TYPE_LUCKY_NUMBER,
|
Metadata.TYPE_LUCKY_NUMBER,
|
||||||
luckyNumberObject.date.value.toLong(),
|
luckyNumberObject.date.value.toLong(),
|
||||||
true,
|
true,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,15 +41,12 @@ class EdudziennikWebNotes(override val data: DataEdudziennik,
|
||||||
val description = noteElement.child(3).text()
|
val description = noteElement.child(3).text()
|
||||||
|
|
||||||
val noticeObject = Notice(
|
val noticeObject = Notice(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
type = Notice.TYPE_NEUTRAL,
|
description,
|
||||||
semester = profile.currentSemester,
|
profile.currentSemester,
|
||||||
text = description,
|
Notice.TYPE_NEUTRAL,
|
||||||
category = null,
|
teacher.id
|
||||||
points = null,
|
|
||||||
teacherId = teacher.id,
|
|
||||||
addedDate = addedDate
|
|
||||||
)
|
)
|
||||||
|
|
||||||
data.noticeList.add(noticeObject)
|
data.noticeList.add(noticeObject)
|
||||||
|
@ -58,7 +55,8 @@ class EdudziennikWebNotes(override val data: DataEdudziennik,
|
||||||
Metadata.TYPE_NOTICE,
|
Metadata.TYPE_NOTICE,
|
||||||
id,
|
id,
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -124,7 +124,8 @@ class EdudziennikWebTimetable(override val data: DataEdudziennik,
|
||||||
Metadata.TYPE_LESSON_CHANGE,
|
Metadata.TYPE_LESSON_CHANGE,
|
||||||
lessonObject.id,
|
lessonObject.id,
|
||||||
seen,
|
seen,
|
||||||
seen
|
seen,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,7 +59,7 @@ class EdudziennikFirstLogin(val data: DataEdudziennik, val onSuccess: () -> Unit
|
||||||
profileList.add(profile)
|
profileList.add(profile)
|
||||||
}
|
}
|
||||||
|
|
||||||
EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore))
|
EventBus.getDefault().post(FirstLoginFinishedEvent(profileList, data.loginStore))
|
||||||
onSuccess()
|
onSuccess()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ class EdudziennikLoginWeb(val data: DataEdudziennik, val onSuccess: () -> Unit)
|
||||||
onSuccess()
|
onSuccess()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
data.app.cookieJar.clear("dziennikel.appspot.com")
|
data.app.cookieJar.clearForDomain("dziennikel.appspot.com")
|
||||||
if (data.loginEmail.isNotNullNorEmpty() && data.loginPassword.isNotNullNorEmpty()) {
|
if (data.loginEmail.isNotNullNorEmpty() && data.loginPassword.isNotNullNorEmpty()) {
|
||||||
loginWithCredentials()
|
loginWithCredentials()
|
||||||
}
|
}
|
||||||
|
@ -59,8 +59,8 @@ class EdudziennikLoginWeb(val data: DataEdudziennik, val onSuccess: () -> Unit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val cookies = data.app.cookieJar.getAll("dziennikel.appspot.com")
|
val cookies = data.app.cookieJar.getForDomain("dziennikel.appspot.com")
|
||||||
val sessionId = cookies["sessionid"]
|
val sessionId = cookies.firstOrNull { it.name() == "sessionid" }?.value()
|
||||||
|
|
||||||
if (sessionId == null) {
|
if (sessionId == null) {
|
||||||
data.error(ApiError(TAG, ERROR_LOGIN_EDUDZIENNIK_WEB_NO_SESSION_ID)
|
data.error(ApiError(TAG, ERROR_LOGIN_EDUDZIENNIK_WEB_NO_SESSION_ID)
|
||||||
|
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,6 +5,7 @@
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.idziennik
|
package pl.szczodrzynski.edziennik.data.api.edziennik.idziennik
|
||||||
|
|
||||||
import androidx.core.util.set
|
import androidx.core.util.set
|
||||||
|
import okhttp3.Cookie
|
||||||
import pl.szczodrzynski.edziennik.*
|
import pl.szczodrzynski.edziennik.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_IDZIENNIK_API
|
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_IDZIENNIK_API
|
||||||
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_IDZIENNIK_WEB
|
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()
|
loginMethods.clear()
|
||||||
if (isWebLoginValid()) {
|
if (isWebLoginValid()) {
|
||||||
loginMethods += LOGIN_METHOD_IDZIENNIK_WEB
|
loginMethods += LOGIN_METHOD_IDZIENNIK_WEB
|
||||||
app.cookieJar.set("iuczniowie.progman.pl", "ASP.NET_SessionId_iDziennik", webSessionId)
|
app.cookieJar.saveFromResponse(null, listOf(
|
||||||
app.cookieJar.set("iuczniowie.progman.pl", ".ASPXAUTH", webAuth)
|
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())
|
if (isApiLoginValid())
|
||||||
loginMethods += LOGIN_METHOD_IDZIENNIK_API
|
loginMethods += LOGIN_METHOD_IDZIENNIK_API
|
||||||
|
|
|
@ -8,15 +8,20 @@ import com.google.gson.JsonObject
|
||||||
import pl.szczodrzynski.edziennik.App
|
import pl.szczodrzynski.edziennik.App
|
||||||
import pl.szczodrzynski.edziennik.data.api.*
|
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.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.firstlogin.IdziennikFirstLogin
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.login.IdziennikLogin
|
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.EdziennikCallback
|
||||||
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface
|
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
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.AnnouncementFull
|
||||||
import pl.szczodrzynski.edziennik.data.db.full.EventFull
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
|
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||||
|
|
||||||
|
@ -98,19 +103,12 @@ class Idziennik(val app: App, val profile: Profile?, val loginStore: LoginStore,
|
||||||
override fun markAllAnnouncementsAsRead() {}
|
override fun markAllAnnouncementsAsRead() {}
|
||||||
override fun getAnnouncement(announcement: AnnouncementFull) {}
|
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) {
|
login(LOGIN_METHOD_IDZIENNIK_WEB) {
|
||||||
if (owner is Message) {
|
IdziennikWebGetAttachment(data, message, attachmentId, attachmentName) {
|
||||||
IdziennikWebGetAttachment(data, owner, attachmentId, attachmentName) {
|
|
||||||
completed()
|
completed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (owner is Event) {
|
|
||||||
IdziennikWebGetHomeworkAttachment(data, owner, attachmentId, attachmentName) {
|
|
||||||
completed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getRecipientList() {
|
override fun getRecipientList() {
|
||||||
|
@ -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 firstLogin() { IdziennikFirstLogin(data) { completed() } }
|
||||||
override fun cancel() {
|
override fun cancel() {
|
||||||
d(TAG, "Cancelled")
|
d(TAG, "Cancelled")
|
||||||
|
|
|
@ -229,7 +229,6 @@ open class IdziennikWeb(open val data: DataIdziennik, open val lastSync: Long?)
|
||||||
.apply {
|
.apply {
|
||||||
parameters.forEach { (k, v) -> addParameter(k, v) }
|
parameters.forEach { (k, v) -> addParameter(k, v) }
|
||||||
}
|
}
|
||||||
.contentType("application/x-www-form-urlencoded")
|
|
||||||
.post()
|
.post()
|
||||||
.callback(callback)
|
.callback(callback)
|
||||||
.build()
|
.build()
|
||||||
|
|
|
@ -68,9 +68,9 @@ class IdziennikApiCurrentRegister(override val data: DataIdziennik,
|
||||||
|
|
||||||
|
|
||||||
val luckyNumberObject = LuckyNumber(
|
val luckyNumberObject = LuckyNumber(
|
||||||
profileId = data.profileId,
|
data.profileId,
|
||||||
date = luckyNumberDate,
|
luckyNumberDate,
|
||||||
number = luckyNumber
|
luckyNumber
|
||||||
)
|
)
|
||||||
|
|
||||||
data.luckyNumberList.add(luckyNumberObject)
|
data.luckyNumberList.add(luckyNumberObject)
|
||||||
|
@ -80,7 +80,8 @@ class IdziennikApiCurrentRegister(override val data: DataIdziennik,
|
||||||
Metadata.TYPE_LUCKY_NUMBER,
|
Metadata.TYPE_LUCKY_NUMBER,
|
||||||
luckyNumberObject.date.value.toLong(),
|
luckyNumberObject.date.value.toLong(),
|
||||||
true,
|
true,
|
||||||
data.profile?.empty ?: false
|
data.profile?.empty ?: false,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.ENDPOINT_IDZIENNIK_API_MESSAGES_INBOX
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.*
|
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.TYPE_DELETED
|
||||||
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.getBoolean
|
import pl.szczodrzynski.edziennik.getBoolean
|
||||||
import pl.szczodrzynski.edziennik.getString
|
import pl.szczodrzynski.edziennik.getString
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.crc32
|
import pl.szczodrzynski.edziennik.utils.Utils.crc32
|
||||||
|
@ -33,11 +33,11 @@ class IdziennikApiMessagesInbox(override val data: DataIdziennik,
|
||||||
return@apiGet
|
return@apiGet
|
||||||
}
|
}
|
||||||
|
|
||||||
json.asJsonObjectList().forEach { jMessage ->
|
json.asJsonObjectList()?.forEach { jMessage ->
|
||||||
val subject = jMessage.getString("tytul") ?: ""
|
val subject = jMessage.getString("tytul")
|
||||||
if (subject.contains("(") && subject.startsWith("iDziennik - "))
|
if (subject?.contains("(") == true && subject.startsWith("iDziennik - "))
|
||||||
return@forEach
|
return@forEach
|
||||||
if (subject.startsWith("Uwaga dla ucznia (klasa:"))
|
if (subject?.startsWith("Uwaga dla ucznia (klasa:") == true)
|
||||||
return@forEach
|
return@forEach
|
||||||
|
|
||||||
val messageIdStr = jMessage.getString("id")
|
val messageIdStr = jMessage.getString("id")
|
||||||
|
@ -64,13 +64,13 @@ class IdziennikApiMessagesInbox(override val data: DataIdziennik,
|
||||||
rTeacher.setTeacherType(Teacher.TYPE_OTHER)
|
rTeacher.setTeacherType(Teacher.TYPE_OTHER)
|
||||||
|
|
||||||
val message = Message(
|
val message = Message(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = messageId,
|
messageId,
|
||||||
type = if (jMessage.getBoolean("rekordUsuniety") == true) TYPE_DELETED else TYPE_RECEIVED,
|
subject,
|
||||||
subject = subject,
|
body,
|
||||||
body = body,
|
if (jMessage.getBoolean("rekordUsuniety") == true) TYPE_DELETED else TYPE_RECEIVED,
|
||||||
senderId = rTeacher.id,
|
rTeacher.id,
|
||||||
addedDate = sentDate
|
-1
|
||||||
)
|
)
|
||||||
|
|
||||||
val messageRecipient = MessageRecipient(
|
val messageRecipient = MessageRecipient(
|
||||||
|
@ -81,14 +81,15 @@ class IdziennikApiMessagesInbox(override val data: DataIdziennik,
|
||||||
/*messageId*/ messageId
|
/*messageId*/ messageId
|
||||||
)
|
)
|
||||||
|
|
||||||
data.messageList.add(message)
|
data.messageIgnoreList.add(message)
|
||||||
data.messageRecipientList.add(messageRecipient)
|
data.messageRecipientList.add(messageRecipient)
|
||||||
data.setSeenMetadataList.add(Metadata(
|
data.setSeenMetadataList.add(Metadata(
|
||||||
profileId,
|
profileId,
|
||||||
Metadata.TYPE_MESSAGE,
|
Metadata.TYPE_MESSAGE,
|
||||||
message.id,
|
message.id,
|
||||||
readDate > 0,
|
readDate > 0,
|
||||||
readDate > 0 || profile?.empty ?: false
|
readDate > 0 || profile?.empty ?: false,
|
||||||
|
sentDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.ENDPOINT_IDZIENNIK_API_MESSAGES_SENT
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikApi
|
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
|
||||||
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.MessageRecipient
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.crc32
|
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 sentDate = Date.fromIso(jMessage.get("dataWyslania").asString)
|
||||||
|
|
||||||
val message = Message(
|
val message = Message(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = messageId,
|
messageId,
|
||||||
type = TYPE_SENT,
|
subject,
|
||||||
subject = subject,
|
body,
|
||||||
body = body,
|
TYPE_SENT,
|
||||||
senderId = null,
|
-1,
|
||||||
addedDate = sentDate
|
-1
|
||||||
)
|
)
|
||||||
|
|
||||||
for (recipientEl in jMessage.getAsJsonArray("odbiorcy")) {
|
for (recipientEl in jMessage.getAsJsonArray("odbiorcy")) {
|
||||||
|
@ -76,8 +76,8 @@ class IdziennikApiMessagesSent(override val data: DataIdziennik,
|
||||||
data.messageRecipientIgnoreList.add(messageRecipient)
|
data.messageRecipientIgnoreList.add(messageRecipient)
|
||||||
}
|
}
|
||||||
|
|
||||||
data.messageList.add(message)
|
data.messageIgnoreList.add(message)
|
||||||
data.metadataList.add(Metadata(profileId, Metadata.TYPE_MESSAGE, message.id, true, true))
|
data.metadataList.add(Metadata(profileId, Metadata.TYPE_MESSAGE, message.id, true, true, sentDate))
|
||||||
}
|
}
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_IDZIENNIK_API_MESSAGES_SENT, DAY, DRAWER_ITEM_MESSAGES)
|
data.setSyncNext(ENDPOINT_IDZIENNIK_API_MESSAGES_SENT, DAY, DRAWER_ITEM_MESSAGES)
|
||||||
|
|
|
@ -52,14 +52,14 @@ class IdziennikWebAnnouncements(override val data: DataIdziennik,
|
||||||
val startDate = jAnnouncement.getString("DataWydarzenia")?.replace("[^\\d]".toRegex(), "")?.toLongOrNull()?.let { Date.fromMillis(it) }
|
val startDate = jAnnouncement.getString("DataWydarzenia")?.replace("[^\\d]".toRegex(), "")?.toLongOrNull()?.let { Date.fromMillis(it) }
|
||||||
|
|
||||||
val announcementObject = Announcement(
|
val announcementObject = Announcement(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = announcementId,
|
announcementId,
|
||||||
subject = jAnnouncement.get("Temat").asString,
|
jAnnouncement.get("Temat").asString,
|
||||||
text = jAnnouncement.get("Tresc").asString,
|
jAnnouncement.get("Tresc").asString,
|
||||||
startDate = startDate,
|
startDate,
|
||||||
endDate = null,
|
null,
|
||||||
teacherId = rTeacher.id,
|
rTeacher.id,
|
||||||
addedDate = addedDate
|
null
|
||||||
)
|
)
|
||||||
data.announcementList.add(announcementObject)
|
data.announcementList.add(announcementObject)
|
||||||
data.metadataList.add(Metadata(
|
data.metadataList.add(Metadata(
|
||||||
|
@ -67,7 +67,8 @@ class IdziennikWebAnnouncements(override val data: DataIdziennik,
|
||||||
Metadata.TYPE_ANNOUNCEMENT,
|
Metadata.TYPE_ANNOUNCEMENT,
|
||||||
announcementObject.id,
|
announcementObject.id,
|
||||||
profile?.empty ?: false,
|
profile?.empty ?: false,
|
||||||
profile?.empty ?: false
|
profile?.empty ?: false,
|
||||||
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.edziennik.idziennik.data.IdziennikWeb
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Attendance
|
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.*
|
||||||
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.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
import pl.szczodrzynski.edziennik.getInt
|
|
||||||
import pl.szczodrzynski.edziennik.getJsonObject
|
import pl.szczodrzynski.edziennik.getJsonObject
|
||||||
import pl.szczodrzynski.edziennik.getString
|
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Time
|
import pl.szczodrzynski.edziennik.utils.models.Time
|
||||||
|
|
||||||
|
@ -59,97 +51,71 @@ class IdziennikWebAttendance(override val data: DataIdziennik,
|
||||||
for (jAttendanceEl in json.getAsJsonArray("Obecnosci")) {
|
for (jAttendanceEl in json.getAsJsonArray("Obecnosci")) {
|
||||||
val jAttendance = jAttendanceEl.asJsonObject
|
val jAttendance = jAttendanceEl.asJsonObject
|
||||||
// jAttendance
|
// jAttendance
|
||||||
val type = jAttendance.get("TypObecnosci").asInt
|
val attendanceTypeIdziennik = jAttendance.get("TypObecnosci").asInt
|
||||||
|
if (attendanceTypeIdziennik == 5 || attendanceTypeIdziennik == 7)
|
||||||
// skip "zajęcia nie odbyły się" and "Ferie"
|
continue
|
||||||
if (type == 5 || type == 7)
|
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
|
continue
|
||||||
|
|
||||||
val date = Date.fromY_m_d(jAttendance.get("Data").asString)
|
val attendanceId = jAttendance.get("IdLesson").asString.crc16().toLong()
|
||||||
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 rSubject = data.getSubject(jAttendance.get("Przedmiot").asString, jAttendance.get("IdPrzedmiot").asLong, "")
|
val rSubject = data.getSubject(jAttendance.get("Przedmiot").asString, jAttendance.get("IdPrzedmiot").asLong, "")
|
||||||
val rTeacher = data.getTeacherByFDotSpaceLast(jAttendance.get("PrzedmiotNauczyciel").asString)
|
val rTeacher = data.getTeacherByFDotSpaceLast(jAttendance.get("PrzedmiotNauczyciel").asString)
|
||||||
|
|
||||||
var baseType = TYPE_UNKNOWN
|
var attendanceName = "obecność"
|
||||||
var typeName = "nieznany rodzaj"
|
var attendanceType = Attendance.TYPE_CUSTOM
|
||||||
var typeSymbol: String? = null
|
|
||||||
var typeColor: Long? = null
|
|
||||||
|
|
||||||
/* https://iuczniowie.progman.pl/idziennik/mod_panelRodzica/obecnosci/obecnosciUcznia_lmt637231494660000000.js */
|
when (attendanceTypeIdziennik) {
|
||||||
/* https://iuczniowie.progman.pl/idziennik/mod_panelRodzica/obecnosci/obecnosci_lmt637231494660000000.css */
|
1 /* nieobecność usprawiedliwiona */ -> {
|
||||||
when (type) {
|
attendanceName = "nieobecność usprawiedliwiona"
|
||||||
1 -> {
|
attendanceType = TYPE_ABSENT_EXCUSED
|
||||||
baseType = TYPE_ABSENT_EXCUSED
|
|
||||||
typeName = "nieobecność usprawiedliwiona"
|
|
||||||
typeColor = 0xffffe099
|
|
||||||
}
|
}
|
||||||
2 -> {
|
2 /* spóźnienie */ -> {
|
||||||
baseType = TYPE_BELATED
|
attendanceName = "spóźnienie"
|
||||||
typeName = "spóźnienie"
|
attendanceType = TYPE_BELATED
|
||||||
typeColor = 0xffffffaa
|
|
||||||
}
|
}
|
||||||
3 -> {
|
3 /* nieobecność nieusprawiedliwiona */ -> {
|
||||||
baseType = TYPE_ABSENT
|
attendanceName = "nieobecność nieusprawiedliwiona"
|
||||||
typeName = "nieobecność nieusprawiedliwiona"
|
attendanceType = TYPE_ABSENT
|
||||||
typeColor = 0xffffad99
|
|
||||||
}
|
}
|
||||||
4, 9 -> {
|
4 /* zwolnienie */, 9 /* zwolniony / obecny */ -> {
|
||||||
baseType = TYPE_RELEASED
|
attendanceType = TYPE_RELEASED
|
||||||
if (type == 4) {
|
if (attendanceTypeIdziennik == 4)
|
||||||
typeName = "zwolnienie"
|
attendanceName = "zwolnienie"
|
||||||
typeColor = 0xffa8beff
|
if (attendanceTypeIdziennik == 9)
|
||||||
|
attendanceName = "zwolnienie / obecność"
|
||||||
}
|
}
|
||||||
if (type == 9) {
|
0 /* obecny */, 8 /* Wycieczka */ -> {
|
||||||
typeName = "zwolniony / obecny"
|
attendanceType = TYPE_PRESENT
|
||||||
typeSymbol = "zb"
|
if (attendanceTypeIdziennik == 8)
|
||||||
typeColor = 0xffff69b4
|
attendanceName = "wycieczka"
|
||||||
}
|
|
||||||
}
|
|
||||||
8 -> {
|
|
||||||
baseType = TYPE_PRESENT_CUSTOM
|
|
||||||
typeName = "wycieczka"
|
|
||||||
typeSymbol = "w"
|
|
||||||
typeColor = null
|
|
||||||
}
|
|
||||||
0 -> {
|
|
||||||
baseType = TYPE_PRESENT
|
|
||||||
typeName = "obecny"
|
|
||||||
typeColor = 0xffccffcc
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val semester = profile?.dateToSemester(date) ?: 1
|
val semester = profile?.dateToSemester(attendanceDate) ?: 1
|
||||||
|
|
||||||
val attendanceObject = Attendance(
|
val attendanceObject = Attendance(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
attendanceId,
|
||||||
baseType = baseType,
|
rTeacher.id,
|
||||||
typeName = typeName,
|
rSubject.id,
|
||||||
typeShort = typeSymbol ?: data.app.attendanceManager.getTypeShort(baseType),
|
semester,
|
||||||
typeSymbol = typeSymbol ?: data.app.attendanceManager.getTypeShort(baseType),
|
attendanceName,
|
||||||
typeColor = typeColor?.toInt(),
|
attendanceDate,
|
||||||
date = date,
|
attendanceTime,
|
||||||
startTime = time,
|
attendanceType
|
||||||
semester = semester,
|
)
|
||||||
teacherId = rTeacher.id,
|
|
||||||
subjectId = rSubject.id
|
|
||||||
).also {
|
|
||||||
it.lessonTopic = jAttendance.getString("PrzedmiotTemat")
|
|
||||||
it.lessonNumber = jAttendance.getInt("Godzina")
|
|
||||||
}
|
|
||||||
|
|
||||||
data.attendanceList.add(attendanceObject)
|
data.attendanceList.add(attendanceObject)
|
||||||
if (attendanceObject.baseType != TYPE_PRESENT) {
|
if (attendanceObject.type != TYPE_PRESENT) {
|
||||||
data.metadataList.add(Metadata(
|
data.metadataList.add(Metadata(
|
||||||
profileId,
|
profileId,
|
||||||
Metadata.TYPE_ATTENDANCE,
|
Metadata.TYPE_ATTENDANCE,
|
||||||
attendanceObject.id,
|
attendanceObject.id,
|
||||||
profile?.empty ?: false || baseType == TYPE_PRESENT_CUSTOM || baseType == TYPE_UNKNOWN,
|
profile?.empty ?: false,
|
||||||
profile?.empty ?: false || baseType == TYPE_PRESENT_CUSTOM || baseType == TYPE_UNKNOWN
|
profile?.empty ?: false,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,9 +66,9 @@ class IdziennikWebExams(override val data: DataIdziennik,
|
||||||
val subjectId = data.getSubject(subjectName, null, subjectName).id
|
val subjectId = data.getSubject(subjectName, null, subjectName).id
|
||||||
val teacherName = exam.getString("wpisal") ?: return@forEach
|
val teacherName = exam.getString("wpisal") ?: return@forEach
|
||||||
val teacherId = data.getTeacherByLastFirst(teacherName).id
|
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 startTime = lessonList.firstOrNull { it.subjectId == subjectId }?.startTime
|
||||||
|
|
||||||
val eventType = when (exam.getString("rodzaj")?.toLowerCase(Locale.getDefault())) {
|
val eventType = when (exam.getString("rodzaj")?.toLowerCase(Locale.getDefault())) {
|
||||||
|
@ -80,16 +80,17 @@ class IdziennikWebExams(override val data: DataIdziennik,
|
||||||
}
|
}
|
||||||
|
|
||||||
val eventObject = Event(
|
val eventObject = Event(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
date = examDate,
|
examDate,
|
||||||
time = startTime,
|
startTime,
|
||||||
topic = topic,
|
topic,
|
||||||
color = null,
|
-1,
|
||||||
type = eventType,
|
eventType,
|
||||||
teacherId = teacherId,
|
false,
|
||||||
subjectId = subjectId,
|
teacherId,
|
||||||
teamId = data.teamClass?.id ?: -1
|
subjectId,
|
||||||
|
data.teamClass?.id ?: -1
|
||||||
)
|
)
|
||||||
|
|
||||||
data.eventList.add(eventObject)
|
data.eventList.add(eventObject)
|
||||||
|
@ -98,7 +99,8 @@ class IdziennikWebExams(override val data: DataIdziennik,
|
||||||
Metadata.TYPE_EVENT,
|
Metadata.TYPE_EVENT,
|
||||||
eventObject.id,
|
eventObject.id,
|
||||||
profile?.empty ?: false,
|
profile?.empty ?: false,
|
||||||
profile?.empty ?: false
|
profile?.empty ?: false,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ import pl.szczodrzynski.edziennik.utils.Utils
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class IdziennikWebGetAttachment(override val data: DataIdziennik,
|
class IdziennikWebGetAttachment(override val data: DataIdziennik,
|
||||||
val owner: Any,
|
val message: Message,
|
||||||
val attachmentId: Long,
|
val attachmentId: Long,
|
||||||
val attachmentName: String,
|
val attachmentName: String,
|
||||||
val onSuccess: () -> Unit
|
val onSuccess: () -> Unit
|
||||||
|
@ -25,8 +25,6 @@ class IdziennikWebGetAttachment(override val data: DataIdziennik,
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
val message = owner as Message
|
|
||||||
|
|
||||||
val messageId = "\\[META:([A-z0-9]+);([0-9-]+)]".toRegex().find(message.body ?: "")?.get(2) ?: -1
|
val messageId = "\\[META:([A-z0-9]+);([0-9-]+)]".toRegex().find(message.body ?: "")?.get(2) ?: -1
|
||||||
val targetFile = File(Utils.getStorageDir(), attachmentName)
|
val targetFile = File(Utils.getStorageDir(), attachmentName)
|
||||||
|
|
||||||
|
@ -36,29 +34,29 @@ class IdziennikWebGetAttachment(override val data: DataIdziennik,
|
||||||
), { file ->
|
), { file ->
|
||||||
val event = AttachmentGetEvent(
|
val event = AttachmentGetEvent(
|
||||||
profileId,
|
profileId,
|
||||||
owner,
|
message.id,
|
||||||
attachmentId,
|
attachmentId,
|
||||||
AttachmentGetEvent.TYPE_FINISHED,
|
AttachmentGetEvent.TYPE_FINISHED,
|
||||||
file.absolutePath
|
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)
|
Utils.writeStringToFile(attachmentDataFile, event.fileName)
|
||||||
|
|
||||||
EventBus.getDefault().postSticky(event)
|
EventBus.getDefault().post(event)
|
||||||
|
|
||||||
onSuccess()
|
onSuccess()
|
||||||
|
|
||||||
}) { written, _ ->
|
}) { written, _ ->
|
||||||
val event = AttachmentGetEvent(
|
val event = AttachmentGetEvent(
|
||||||
profileId,
|
profileId,
|
||||||
owner,
|
message.id,
|
||||||
attachmentId,
|
attachmentId,
|
||||||
AttachmentGetEvent.TYPE_PROGRESS,
|
AttachmentGetEvent.TYPE_PROGRESS,
|
||||||
bytesWritten = written
|
bytesWritten = written
|
||||||
)
|
)
|
||||||
|
|
||||||
EventBus.getDefault().postSticky(event)
|
EventBus.getDefault().post(event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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.DataIdziennik
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb
|
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.data.IdziennikWeb
|
||||||
import pl.szczodrzynski.edziennik.data.api.events.MessageGetEvent
|
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.TYPE_RECEIVED
|
||||||
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.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
|
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
|
||||||
import pl.szczodrzynski.edziennik.data.db.full.MessageRecipientFull
|
import pl.szczodrzynski.edziennik.data.db.full.MessageRecipientFull
|
||||||
|
@ -50,11 +50,7 @@ class IdziennikWebGetMessage(override val data: DataIdziennik,
|
||||||
message.recipients?.clear()
|
message.recipients?.clear()
|
||||||
when (message.type) {
|
when (message.type) {
|
||||||
TYPE_RECEIVED -> {
|
TYPE_RECEIVED -> {
|
||||||
val recipientObject = MessageRecipientFull(
|
val recipientObject = MessageRecipientFull(profileId, -1, message.id)
|
||||||
profileId = profileId,
|
|
||||||
id = -1,
|
|
||||||
messageId = message.id
|
|
||||||
)
|
|
||||||
|
|
||||||
val readDateString = it.getString("DataOdczytania")
|
val readDateString = it.getString("DataOdczytania")
|
||||||
recipientObject.readDate = if (readDateString.isNullOrBlank()) System.currentTimeMillis()
|
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 recipientName = recipient.getString("NazwaOdbiorcy") ?: return@forEach
|
||||||
val teacher = data.getTeacherByLastFirst(recipientName)
|
val teacher = data.getTeacherByLastFirst(recipientName)
|
||||||
|
|
||||||
val recipientObject = MessageRecipientFull(
|
val recipientObject = MessageRecipientFull(profileId, teacher.id, message.id)
|
||||||
profileId = profileId,
|
|
||||||
id = teacher.id,
|
|
||||||
messageId = message.id
|
|
||||||
)
|
|
||||||
|
|
||||||
recipientObject.readDate = recipient.getLong("Status") ?: return@forEach
|
recipientObject.readDate = recipient.getLong("Status") ?: return@forEach
|
||||||
recipientObject.fullName = teacher.fullName
|
recipientObject.fullName = teacher.fullName
|
||||||
|
@ -94,14 +86,14 @@ class IdziennikWebGetMessage(override val data: DataIdziennik,
|
||||||
Metadata.TYPE_MESSAGE,
|
Metadata.TYPE_MESSAGE,
|
||||||
message.id,
|
message.id,
|
||||||
message.seen,
|
message.seen,
|
||||||
message.notified
|
message.notified,
|
||||||
|
message.addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
data.messageList.add(message)
|
|
||||||
data.messageListReplace = true
|
|
||||||
|
|
||||||
EventBus.getDefault().postSticky(MessageGetEvent(message))
|
EventBus.getDefault().postSticky(MessageGetEvent(message))
|
||||||
|
|
||||||
|
data.messageList.add(message)
|
||||||
onSuccess()
|
onSuccess()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,8 +63,6 @@ class IdziennikWebGrades(override val data: DataIdziennik,
|
||||||
colorInt = Color.parseColor("#$gradeColor")
|
colorInt = Color.parseColor("#$gradeColor")
|
||||||
}
|
}
|
||||||
|
|
||||||
val addedDate = grade.getString("Data_wystaw")?.let { Date.fromY_m_d(it).inMillis } ?: System.currentTimeMillis()
|
|
||||||
|
|
||||||
val gradeObject = Grade(
|
val gradeObject = Grade(
|
||||||
profileId = profileId,
|
profileId = profileId,
|
||||||
id = id,
|
id = id,
|
||||||
|
@ -78,9 +76,7 @@ class IdziennikWebGrades(override val data: DataIdziennik,
|
||||||
comment = null,
|
comment = null,
|
||||||
semester = semester,
|
semester = semester,
|
||||||
teacherId = teacher.id,
|
teacherId = teacher.id,
|
||||||
subjectId = subject.id,
|
subjectId = subject.id)
|
||||||
addedDate = addedDate
|
|
||||||
)
|
|
||||||
|
|
||||||
when (grade.getInt("Typ")) {
|
when (grade.getInt("Typ")) {
|
||||||
0 -> {
|
0 -> {
|
||||||
|
@ -104,8 +100,6 @@ class IdziennikWebGrades(override val data: DataIdziennik,
|
||||||
colorInt = Color.parseColor("#$historyColor")
|
colorInt = Color.parseColor("#$historyColor")
|
||||||
}
|
}
|
||||||
|
|
||||||
val addedDate = historyItem.getString("Data_wystaw")?.let { Date.fromY_m_d(it).inMillis } ?: System.currentTimeMillis()
|
|
||||||
|
|
||||||
val historyObject = Grade(
|
val historyObject = Grade(
|
||||||
profileId = profileId,
|
profileId = profileId,
|
||||||
id = gradeObject.id * -1,
|
id = gradeObject.id * -1,
|
||||||
|
@ -119,18 +113,19 @@ class IdziennikWebGrades(override val data: DataIdziennik,
|
||||||
comment = null,
|
comment = null,
|
||||||
semester = historyItem.getInt("Semestr") ?: 1,
|
semester = historyItem.getInt("Semestr") ?: 1,
|
||||||
teacherId = teacher.id,
|
teacherId = teacher.id,
|
||||||
subjectId = subject.id,
|
subjectId = subject.id)
|
||||||
addedDate = addedDate
|
|
||||||
)
|
|
||||||
historyObject.parentId = gradeObject.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.gradeList.add(historyObject)
|
||||||
data.metadataList.add(Metadata(
|
data.metadataList.add(Metadata(
|
||||||
profileId,
|
profileId,
|
||||||
Metadata.TYPE_GRADE,
|
Metadata.TYPE_GRADE,
|
||||||
historyObject.id,
|
historyObject.id,
|
||||||
true,
|
true,
|
||||||
true
|
true,
|
||||||
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
// update the current grade's value with an average of all historical grades and itself
|
// update the current grade's value with an average of all historical grades and itself
|
||||||
|
@ -152,6 +147,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.gradeList.add(gradeObject)
|
||||||
data.metadataList.add(
|
data.metadataList.add(
|
||||||
Metadata(
|
Metadata(
|
||||||
|
@ -159,7 +156,8 @@ class IdziennikWebGrades(override val data: DataIdziennik,
|
||||||
Metadata.TYPE_GRADE,
|
Metadata.TYPE_GRADE,
|
||||||
id,
|
id,
|
||||||
data.profile.empty,
|
data.profile.empty,
|
||||||
data.profile.empty
|
data.profile.empty,
|
||||||
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,14 +52,13 @@ class IdziennikWebHomework(override val data: DataIdziennik,
|
||||||
json.getJsonArray("ListK")?.asJsonObjectList()?.forEach { homework ->
|
json.getJsonArray("ListK")?.asJsonObjectList()?.forEach { homework ->
|
||||||
val id = homework.getLong("_recordId") ?: return@forEach
|
val id = homework.getLong("_recordId") ?: return@forEach
|
||||||
val eventDate = Date.fromY_m_d(homework.getString("dataO") ?: 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 subjectName = homework.getString("przed") ?: return@forEach
|
||||||
val subjectId = data.getSubject(subjectName, null, subjectName).id
|
val subjectId = data.getSubject(subjectName, null, subjectName).id
|
||||||
val teacherName = homework.getString("usr") ?: return@forEach
|
val teacherName = homework.getString("usr") ?: return@forEach
|
||||||
val teacherId = data.getTeacherByLastFirst(teacherName).id
|
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 startTime = lessonList.firstOrNull { it.subjectId == subjectId }?.displayStartTime
|
||||||
val topic = homework.getString("tytul")?.trim() ?: ""
|
val topic = homework.getString("tytul") ?: ""
|
||||||
|
|
||||||
val seen = when (profile?.empty) {
|
val seen = when (profile?.empty) {
|
||||||
true -> true
|
true -> true
|
||||||
|
@ -68,17 +67,17 @@ class IdziennikWebHomework(override val data: DataIdziennik,
|
||||||
|
|
||||||
|
|
||||||
val eventObject = Event(
|
val eventObject = Event(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
date = eventDate,
|
eventDate,
|
||||||
time = startTime,
|
startTime,
|
||||||
topic = topic,
|
topic,
|
||||||
color = null,
|
-1,
|
||||||
type = Event.TYPE_HOMEWORK,
|
Event.TYPE_HOMEWORK,
|
||||||
teacherId = teacherId,
|
false,
|
||||||
subjectId = subjectId,
|
teacherId,
|
||||||
teamId = data.teamClass?.id ?: -1,
|
subjectId,
|
||||||
addedDate = addedDate.inMillis
|
data.teamClass?.id ?: -1
|
||||||
)
|
)
|
||||||
|
|
||||||
data.eventList.add(eventObject)
|
data.eventList.add(eventObject)
|
||||||
|
@ -87,7 +86,8 @@ class IdziennikWebHomework(override val data: DataIdziennik,
|
||||||
Metadata.TYPE_HOMEWORK,
|
Metadata.TYPE_HOMEWORK,
|
||||||
eventObject.id,
|
eventObject.id,
|
||||||
seen,
|
seen,
|
||||||
seen
|
seen,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.api.models.ApiError
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Notice
|
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.*
|
||||||
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.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
import pl.szczodrzynski.edziennik.getJsonObject
|
import pl.szczodrzynski.edziennik.getJsonObject
|
||||||
import pl.szczodrzynski.edziennik.getString
|
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
|
||||||
class IdziennikWebNotices(override val data: DataIdziennik,
|
class IdziennikWebNotices(override val data: DataIdziennik,
|
||||||
|
@ -56,24 +53,20 @@ class IdziennikWebNotices(override val data: DataIdziennik,
|
||||||
}
|
}
|
||||||
|
|
||||||
val noticeObject = Notice(
|
val noticeObject = Notice(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = noticeId,
|
noticeId,
|
||||||
type = nType,
|
jNotice.get("Tresc").asString,
|
||||||
semester = jNotice.get("Semestr").asInt,
|
jNotice.get("Semestr").asInt,
|
||||||
text = jNotice.getString("Tresc") ?: "",
|
nType,
|
||||||
category = null,
|
rTeacher.id)
|
||||||
points = null,
|
|
||||||
teacherId = rTeacher.id,
|
|
||||||
addedDate = addedDate.inMillis
|
|
||||||
)
|
|
||||||
|
|
||||||
data.noticeList.add(noticeObject)
|
data.noticeList.add(noticeObject)
|
||||||
data.metadataList.add(Metadata(
|
data.metadataList.add(Metadata(
|
||||||
profileId,
|
profileId,
|
||||||
Metadata.TYPE_NOTICE,
|
Metadata.TYPE_NOTICE,
|
||||||
noticeObject.id,
|
noticeObject.id,
|
||||||
profile?.empty ?: false,
|
profile?.empty ?: false,
|
||||||
profile?.empty ?: false
|
profile?.empty ?: false,
|
||||||
|
addedDate.inMillis
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,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.ApiError
|
||||||
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
import pl.szczodrzynski.edziennik.data.api.models.DataRemoveModel
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Grade
|
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_SEMESTER1_PROPOSED
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_YEAR_PROPOSED
|
import pl.szczodrzynski.edziennik.data.db.entity.Grade.Companion.TYPE_YEAR_PROPOSED
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
|
@ -21,6 +20,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||||
import pl.szczodrzynski.edziennik.getJsonArray
|
import pl.szczodrzynski.edziennik.getJsonArray
|
||||||
import pl.szczodrzynski.edziennik.getJsonObject
|
import pl.szczodrzynski.edziennik.getJsonObject
|
||||||
import pl.szczodrzynski.edziennik.getString
|
import pl.szczodrzynski.edziennik.getString
|
||||||
|
import pl.szczodrzynski.edziennik.utils.Utils.getWordGradeValue
|
||||||
|
|
||||||
class IdziennikWebProposedGrades(override val data: DataIdziennik,
|
class IdziennikWebProposedGrades(override val data: DataIdziennik,
|
||||||
override val lastSync: Long?,
|
override val lastSync: Long?,
|
||||||
|
@ -39,105 +39,77 @@ class IdziennikWebProposedGrades(override val data: DataIdziennik,
|
||||||
.withApiResponse(result))
|
.withApiResponse(result))
|
||||||
return@webApiGet
|
return@webApiGet
|
||||||
}
|
}
|
||||||
val manager = data.app.gradesManager
|
|
||||||
|
|
||||||
json.getJsonArray("Przedmioty")?.asJsonObjectList()?.forEach { subject ->
|
json.getJsonArray("Przedmioty")?.asJsonObjectList()?.forEach { subject ->
|
||||||
val subjectName = subject.getString("Przedmiot") ?: return@forEach
|
val subjectName = subject.getString("Przedmiot") ?: return@forEach
|
||||||
val subjectObject = data.getSubject(subjectName, null, subjectName)
|
val subjectObject = data.getSubject(subjectName, null, subjectName)
|
||||||
|
|
||||||
val semester1Proposed = subject.getString("OcenaSem1") ?: ""
|
val semester1Proposed = subject.getString("OcenaSem1") ?: ""
|
||||||
val semester1Value = manager.getGradeValue(semester1Proposed)
|
val semester1Value = getWordGradeValue(semester1Proposed)
|
||||||
val semester1Id = subjectObject.id * (-100) - 1
|
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 semester2Proposed = subject.getString("OcenaSem2") ?: ""
|
||||||
val semester2Value = manager.getGradeValue(semester2Proposed)
|
val semester2Value = getWordGradeValue(semester2Proposed)
|
||||||
val semester2Id = subjectObject.id * (-100) - 2
|
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 != "") {
|
if (semester1Proposed != "") {
|
||||||
|
val gradeObject = Grade(
|
||||||
|
profileId = profileId,
|
||||||
|
id = semester1Id,
|
||||||
|
name = semester1Value.toString(),
|
||||||
|
type = TYPE_SEMESTER1_PROPOSED,
|
||||||
|
value = semester1Value.toFloat(),
|
||||||
|
weight = 0f,
|
||||||
|
color = -1,
|
||||||
|
category = null,
|
||||||
|
description = null,
|
||||||
|
comment = null,
|
||||||
|
semester = 1,
|
||||||
|
teacherId = -1,
|
||||||
|
subjectId = subjectObject.id
|
||||||
|
)
|
||||||
|
|
||||||
|
data.gradeList.add(gradeObject)
|
||||||
|
data.metadataList.add(Metadata(
|
||||||
|
profileId,
|
||||||
|
Metadata.TYPE_GRADE,
|
||||||
|
gradeObject.id,
|
||||||
|
profile.empty,
|
||||||
|
profile.empty,
|
||||||
|
System.currentTimeMillis()
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (semester2Proposed != "") {
|
||||||
|
val gradeObject = Grade(
|
||||||
|
profileId = profileId,
|
||||||
|
id = semester2Id,
|
||||||
|
name = semester2Value.toString(),
|
||||||
|
type = TYPE_YEAR_PROPOSED,
|
||||||
|
value = semester2Value.toFloat(),
|
||||||
|
weight = 0f,
|
||||||
|
color = -1,
|
||||||
|
category = null,
|
||||||
|
description = null,
|
||||||
|
comment = null,
|
||||||
|
semester = 2,
|
||||||
|
teacherId = -1,
|
||||||
|
subjectId = subjectObject.id
|
||||||
|
)
|
||||||
|
|
||||||
val addedDate = if (data.profile.empty)
|
val addedDate = if (data.profile.empty)
|
||||||
data.profile.dateSemester1Start.inMillis
|
data.profile.dateSemester1Start.inMillis
|
||||||
else
|
else
|
||||||
System.currentTimeMillis()
|
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
|
|
||||||
)
|
|
||||||
|
|
||||||
data.gradeList.add(gradeObject)
|
data.gradeList.add(gradeObject)
|
||||||
data.metadataList.add(Metadata(
|
data.metadataList.add(Metadata(
|
||||||
profileId,
|
profileId,
|
||||||
Metadata.TYPE_GRADE,
|
Metadata.TYPE_GRADE,
|
||||||
gradeObject.id,
|
gradeObject.id,
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
)
|
|
||||||
|
|
||||||
data.gradeList.add(gradeObject)
|
|
||||||
data.metadataList.add(Metadata(
|
|
||||||
profileId,
|
|
||||||
Metadata.TYPE_GRADE,
|
|
||||||
gradeObject.id,
|
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,9 +57,9 @@ class IdziennikWebSendMessage(override val data: DataIdziennik,
|
||||||
}
|
}
|
||||||
|
|
||||||
IdziennikApiMessagesSent(data, null) {
|
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 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)
|
EventBus.getDefault().postSticky(event)
|
||||||
onSuccess()
|
onSuccess()
|
||||||
|
|
|
@ -165,7 +165,8 @@ class IdziennikWebTimetable(override val data: DataIdziennik,
|
||||||
Metadata.TYPE_LESSON_CHANGE,
|
Metadata.TYPE_LESSON_CHANGE,
|
||||||
lessonObject.id,
|
lessonObject.id,
|
||||||
seen,
|
seen,
|
||||||
seen
|
seen,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,7 +89,7 @@ class IdziennikFirstLogin(val data: DataIdziennik, val onSuccess: () -> Unit) {
|
||||||
profileList.add(profile)
|
profileList.add(profile)
|
||||||
}
|
}
|
||||||
|
|
||||||
EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore))
|
EventBus.getDefault().post(FirstLoginFinishedEvent(profileList, data.loginStore))
|
||||||
onSuccess()
|
onSuccess()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.login
|
||||||
import im.wangchao.mhttp.Request
|
import im.wangchao.mhttp.Request
|
||||||
import im.wangchao.mhttp.Response
|
import im.wangchao.mhttp.Response
|
||||||
import im.wangchao.mhttp.callback.TextCallbackHandler
|
import im.wangchao.mhttp.callback.TextCallbackHandler
|
||||||
|
import okhttp3.Cookie
|
||||||
import pl.szczodrzynski.edziennik.*
|
import pl.szczodrzynski.edziennik.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.*
|
import pl.szczodrzynski.edziennik.data.api.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.DataIdziennik
|
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.DataIdziennik
|
||||||
|
@ -23,12 +24,22 @@ class IdziennikLoginWeb(val data: DataIdziennik, val onSuccess: () -> Unit) {
|
||||||
|
|
||||||
init { run {
|
init { run {
|
||||||
if (data.isWebLoginValid()) {
|
if (data.isWebLoginValid()) {
|
||||||
data.app.cookieJar.set("iuczniowie.progman.pl", "ASP.NET_SessionId_iDziennik", data.webSessionId)
|
data.app.cookieJar.saveFromResponse(null, listOf(
|
||||||
data.app.cookieJar.set("iuczniowie.progman.pl", ".ASPXAUTH", data.webAuth)
|
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()
|
onSuccess()
|
||||||
}
|
}
|
||||||
else {
|
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) {
|
if (data.webSchoolName != null && data.webUsername != null && data.webPassword != null) {
|
||||||
loginWithCredentials()
|
loginWithCredentials()
|
||||||
}
|
}
|
||||||
|
@ -51,11 +62,11 @@ class IdziennikLoginWeb(val data: DataIdziennik, val onSuccess: () -> Unit) {
|
||||||
|
|
||||||
// login succeeded: there is a start page
|
// login succeeded: there is a start page
|
||||||
if (text.contains("czyWyswietlicDostepMobilny")) {
|
if (text.contains("czyWyswietlicDostepMobilny")) {
|
||||||
val cookies = data.app.cookieJar.getAll("iuczniowie.progman.pl")
|
val cookies = data.app.cookieJar.getForDomain("iuczniowie.progman.pl")
|
||||||
run {
|
run {
|
||||||
data.webSessionId = cookies["ASP.NET_SessionId_iDziennik"] ?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_SESSION
|
data.webSessionId = cookies.singleOrNull { it.name() == "ASP.NET_SessionId_iDziennik" }?.value() ?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_SESSION
|
||||||
data.webAuth = cookies[".ASPXAUTH"] ?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_AUTH
|
data.webAuth = cookies.singleOrNull { it.name() == ".ASPXAUTH" }?.value() ?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_AUTH
|
||||||
data.apiBearer = cookies["Bearer"]?: return@run ERROR_LOGIN_IDZIENNIK_WEB_NO_BEARER
|
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.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. */
|
data.apiExpiryTime = response.getUnixDate() + 12 * HOUR /* actually it expires after 24 hours but I'm not sure when does the token refresh. */
|
||||||
|
|
||||||
|
@ -70,21 +81,13 @@ class IdziennikLoginWeb(val data: DataIdziennik, val onSuccess: () -> Unit) {
|
||||||
data.webSelectedRegister = registerId
|
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 ->
|
data.profile?.let { profile ->
|
||||||
Regexes.IDZIENNIK_WEB_LUCKY_NUMBER.find(text)?.also {
|
Regexes.IDZIENNIK_WEB_LUCKY_NUMBER.find(text)?.also {
|
||||||
val number = it[1].toIntOrNull() ?: return@also
|
val number = it[1].toIntOrNull() ?: return@also
|
||||||
val luckyNumberObject = LuckyNumber(
|
val luckyNumberObject = LuckyNumber(
|
||||||
profileId = data.profileId,
|
data.profileId,
|
||||||
date = Date.getToday(),
|
Date.getToday(),
|
||||||
number = number
|
number
|
||||||
)
|
)
|
||||||
|
|
||||||
data.luckyNumberList.add(luckyNumberObject)
|
data.luckyNumberList.add(luckyNumberObject)
|
||||||
|
@ -94,7 +97,8 @@ class IdziennikLoginWeb(val data: DataIdziennik, val onSuccess: () -> Unit) {
|
||||||
Metadata.TYPE_LUCKY_NUMBER,
|
Metadata.TYPE_LUCKY_NUMBER,
|
||||||
luckyNumberObject.date.value.toLong(),
|
luckyNumberObject.date.value.toLong(),
|
||||||
true,
|
true,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.librus
|
package pl.szczodrzynski.edziennik.data.api.edziennik.librus
|
||||||
|
|
||||||
|
import okhttp3.Cookie
|
||||||
import pl.szczodrzynski.edziennik.App
|
import pl.szczodrzynski.edziennik.App
|
||||||
import pl.szczodrzynski.edziennik.currentTimeUnix
|
import pl.szczodrzynski.edziennik.currentTimeUnix
|
||||||
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_LIBRUS_API
|
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
|
loginMethods += LOGIN_METHOD_LIBRUS_API
|
||||||
if (isSynergiaLoginValid()) {
|
if (isSynergiaLoginValid()) {
|
||||||
loginMethods += LOGIN_METHOD_LIBRUS_SYNERGIA
|
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()) {
|
if (isMessagesLoginValid()) {
|
||||||
loginMethods += LOGIN_METHOD_LIBRUS_MESSAGES
|
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
|
private var mApiLogin: String? = null
|
||||||
var apiLogin: String?
|
var apiLogin: String?
|
||||||
get() { mApiLogin = mApiLogin ?: profile?.getStudentData("accountLogin", null); return mApiLogin }
|
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.
|
* A Synergia password.
|
||||||
* Used: for login (API Login Method) in Synergia mode.
|
* 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
|
private var mApiPassword: String? = null
|
||||||
var apiPassword: String?
|
var apiPassword: String?
|
||||||
get() { mApiPassword = mApiPassword ?: profile?.getStudentData("accountPassword", null); return mApiPassword }
|
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.
|
* A JST login Code.
|
||||||
|
@ -138,7 +151,8 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
|
||||||
private var mApiCode: String? = null
|
private var mApiCode: String? = null
|
||||||
var apiCode: String?
|
var apiCode: String?
|
||||||
get() { mApiCode = mApiCode ?: loginStore.getLoginData("accountCode", null); return mApiCode }
|
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.
|
* A JST login PIN.
|
||||||
* Used only during first login in JST mode.
|
* 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
|
private var mApiPin: String? = null
|
||||||
var apiPin: String?
|
var apiPin: String?
|
||||||
get() { mApiPin = mApiPin ?: loginStore.getLoginData("accountPin", null); return mApiPin }
|
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.
|
* A Synergia API access token.
|
||||||
|
@ -275,10 +290,4 @@ class DataLibrus(app: App, profile: Profile?, loginStore: LoginStore) : Data(app
|
||||||
var timetableNotPublic: Boolean
|
var timetableNotPublic: Boolean
|
||||||
get() { mTimetableNotPublic = mTimetableNotPublic ?: profile?.getStudentData("timetableNotPublic", false); return mTimetableNotPublic ?: false }
|
get() { mTimetableNotPublic = mTimetableNotPublic ?: profile?.getStudentData("timetableNotPublic", false); return mTimetableNotPublic ?: false }
|
||||||
set(value) { profile?.putStudentData("timetableNotPublic", value) ?: return; mTimetableNotPublic = value }
|
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
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.LibrusMessagesGetMessage
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.messages.LibrusMessagesGetRecipientList
|
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.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.firstlogin.LibrusFirstLogin
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLogin
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLogin
|
||||||
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
|
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.Profile
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
|
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
|
||||||
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
|
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.data.db.full.MessageFull
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||||
|
|
||||||
|
@ -89,8 +88,9 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
|
||||||
|
|
||||||
override fun getMessage(message: MessageFull) {
|
override fun getMessage(message: MessageFull) {
|
||||||
login(LOGIN_METHOD_LIBRUS_MESSAGES) {
|
login(LOGIN_METHOD_LIBRUS_MESSAGES) {
|
||||||
if (data.messagesLoginSuccessful) LibrusMessagesGetMessage(data, message) { completed() }
|
LibrusMessagesGetMessage(data, message) {
|
||||||
else LibrusSynergiaGetMessage(data, message) { completed() }
|
completed()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,24 +118,13 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getAttachment(owner: Any, attachmentId: Long, attachmentName: String) {
|
override fun getAttachment(message: Message, attachmentId: Long, attachmentName: String) {
|
||||||
when (owner) {
|
login(LOGIN_METHOD_LIBRUS_MESSAGES) {
|
||||||
is Message -> {
|
LibrusMessagesGetAttachment(data, message, attachmentId, attachmentName) {
|
||||||
login(LOGIN_METHOD_LIBRUS_SYNERGIA) {
|
|
||||||
if (data.messagesLoginSuccessful) LibrusMessagesGetAttachment(data, owner, attachmentId, attachmentName) { completed() }
|
|
||||||
LibrusSynergiaGetAttachment(data, owner, attachmentId, attachmentName) { completed() }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
is EventFull -> {
|
|
||||||
login(LOGIN_METHOD_LIBRUS_SYNERGIA) {
|
|
||||||
LibrusSynergiaHomeworkGetAttachment(data, owner, attachmentId, attachmentName) {
|
|
||||||
completed()
|
completed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else -> completed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getRecipientList() {
|
override fun getRecipientList() {
|
||||||
login(LOGIN_METHOD_LIBRUS_MESSAGES) {
|
login(LOGIN_METHOD_LIBRUS_MESSAGES) {
|
||||||
|
@ -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 firstLogin() { LibrusFirstLogin(data) { completed() } }
|
||||||
override fun cancel() {
|
override fun cancel() {
|
||||||
d(TAG, "Cancelled")
|
d(TAG, "Cancelled")
|
||||||
|
|
|
@ -50,8 +50,6 @@ const val ENDPOINT_LIBRUS_API_CLASS_FREE_DAYS = 1130
|
||||||
const val ENDPOINT_LIBRUS_SYNERGIA_INFO = 2010
|
const val ENDPOINT_LIBRUS_SYNERGIA_INFO = 2010
|
||||||
const val ENDPOINT_LIBRUS_SYNERGIA_GRADES = 2020
|
const val ENDPOINT_LIBRUS_SYNERGIA_GRADES = 2020
|
||||||
const val ENDPOINT_LIBRUS_SYNERGIA_HOMEWORK = 2030
|
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_RECEIVED = 3010
|
||||||
const val ENDPOINT_LIBRUS_MESSAGES_SENT = 3020
|
const val ENDPOINT_LIBRUS_MESSAGES_SENT = 3020
|
||||||
const val ENDPOINT_LIBRUS_MESSAGES_TRASH = 3030
|
const val ENDPOINT_LIBRUS_MESSAGES_TRASH = 3030
|
||||||
|
@ -66,7 +64,7 @@ val LibrusFeatures = listOf(
|
||||||
Feature(LOGIN_TYPE_LIBRUS, FEATURE_PUSH_CONFIG, listOf(
|
Feature(LOGIN_TYPE_LIBRUS, FEATURE_PUSH_CONFIG, listOf(
|
||||||
ENDPOINT_LIBRUS_API_PUSH_CONFIG to LOGIN_METHOD_LIBRUS_API
|
ENDPOINT_LIBRUS_API_PUSH_CONFIG to LOGIN_METHOD_LIBRUS_API
|
||||||
), listOf(LOGIN_METHOD_LIBRUS_API)).withShouldSync { data ->
|
), 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 +116,11 @@ val LibrusFeatures = listOf(
|
||||||
* Homework - using API.
|
* Homework - using API.
|
||||||
* Sync only if account has premium access.
|
* 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
|
ENDPOINT_LIBRUS_API_HOMEWORK to LOGIN_METHOD_LIBRUS_API
|
||||||
), listOf(LOGIN_METHOD_LIBRUS_API)).withShouldSync { data ->
|
), listOf(LOGIN_METHOD_LIBRUS_API)).withShouldSync { data ->
|
||||||
(data as DataLibrus).isPremium
|
(data as DataLibrus).isPremium
|
||||||
},*/
|
},
|
||||||
/**
|
/**
|
||||||
* Behaviour - using API.
|
* Behaviour - using API.
|
||||||
*/
|
*/
|
||||||
|
@ -229,9 +227,9 @@ val LibrusFeatures = listOf(
|
||||||
*/
|
*/
|
||||||
Feature(LOGIN_TYPE_LIBRUS, FEATURE_HOMEWORK, listOf(
|
Feature(LOGIN_TYPE_LIBRUS, FEATURE_HOMEWORK, listOf(
|
||||||
ENDPOINT_LIBRUS_SYNERGIA_HOMEWORK to LOGIN_METHOD_LIBRUS_SYNERGIA
|
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
|
!(data as DataLibrus).isPremium
|
||||||
}*/,
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Messages inbox - using messages website.
|
* Messages inbox - using messages website.
|
||||||
|
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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.*
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api.*
|
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.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.LibrusSynergiaHomework
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia.LibrusSynergiaInfo
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.synergia.LibrusSynergiaInfo
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Message
|
import pl.szczodrzynski.edziennik.data.db.entity.Message
|
||||||
|
@ -202,27 +201,17 @@ class LibrusData(val data: DataLibrus, val onSuccess: () -> Unit) {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_student_info)
|
data.startProgress(R.string.edziennik_progress_endpoint_student_info)
|
||||||
LibrusSynergiaInfo(data, lastSync, onSuccess)
|
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
|
* MESSAGES
|
||||||
*/
|
*/
|
||||||
ENDPOINT_LIBRUS_MESSAGES_RECEIVED -> {
|
ENDPOINT_LIBRUS_MESSAGES_RECEIVED -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox)
|
data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox)
|
||||||
if (data.messagesLoginSuccessful) LibrusMessagesGetList(data, type = Message.TYPE_RECEIVED, lastSync = lastSync, onSuccess = onSuccess)
|
LibrusMessagesGetList(data, type = Message.TYPE_RECEIVED, lastSync = lastSync, onSuccess = onSuccess)
|
||||||
else LibrusSynergiaGetMessages(data, type = Message.TYPE_RECEIVED, lastSync = lastSync, onSuccess = onSuccess)
|
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_MESSAGES_SENT -> {
|
ENDPOINT_LIBRUS_MESSAGES_SENT -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_messages_outbox)
|
data.startProgress(R.string.edziennik_progress_endpoint_messages_outbox)
|
||||||
if (data.messagesLoginSuccessful) LibrusMessagesGetList(data, type = Message.TYPE_SENT, lastSync = lastSync, onSuccess = onSuccess)
|
LibrusMessagesGetList(data, type = Message.TYPE_SENT, lastSync = lastSync, onSuccess = onSuccess)
|
||||||
else LibrusSynergiaGetMessages(data, type = Message.TYPE_SENT, lastSync = lastSync, onSuccess = onSuccess)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> onSuccess(endpointId)
|
else -> onSuccess(endpointId)
|
||||||
|
|
|
@ -12,6 +12,7 @@ import im.wangchao.mhttp.body.MediaTypeUtils
|
||||||
import im.wangchao.mhttp.callback.FileCallbackHandler
|
import im.wangchao.mhttp.callback.FileCallbackHandler
|
||||||
import im.wangchao.mhttp.callback.JsonCallbackHandler
|
import im.wangchao.mhttp.callback.JsonCallbackHandler
|
||||||
import im.wangchao.mhttp.callback.TextCallbackHandler
|
import im.wangchao.mhttp.callback.TextCallbackHandler
|
||||||
|
import okhttp3.Cookie
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import org.json.XML
|
import org.json.XML
|
||||||
import org.jsoup.Jsoup
|
import org.jsoup.Jsoup
|
||||||
|
@ -88,7 +89,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 docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
|
||||||
val doc = docBuilder.newDocument()
|
val doc = docBuilder.newDocument()
|
||||||
|
@ -172,7 +180,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 docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
|
||||||
val doc = docBuilder.newDocument()
|
val doc = docBuilder.newDocument()
|
||||||
|
@ -252,11 +267,10 @@ open class LibrusMessages(open val data: DataLibrus, open val lastSync: Long?) {
|
||||||
.enqueue()
|
.enqueue()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun sandboxGetFile(tag: String, url: String, targetFile: File, onSuccess: (file: File) -> Unit,
|
fun sandboxGetFile(tag: String, action: String, targetFile: File, onSuccess: (file: File) -> Unit,
|
||||||
method: Int = GET,
|
|
||||||
onProgress: (written: Long, total: Long) -> 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) {
|
val callback = object : FileCallbackHandler(targetFile) {
|
||||||
override fun onSuccess(file: File?, response: Response?) {
|
override fun onSuccess(file: File?, response: Response?) {
|
||||||
|
@ -292,14 +306,9 @@ open class LibrusMessages(open val data: DataLibrus, open val lastSync: Long?) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Request.builder()
|
Request.builder()
|
||||||
.url(url)
|
.url("$LIBRUS_SANDBOX_URL$action")
|
||||||
.userAgent(SYNERGIA_USER_AGENT)
|
.userAgent(SYNERGIA_USER_AGENT)
|
||||||
.also {
|
.post()
|
||||||
when (method) {
|
|
||||||
POST -> it.post()
|
|
||||||
else -> it.get()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.callback(callback)
|
.callback(callback)
|
||||||
.build()
|
.build()
|
||||||
.enqueue()
|
.enqueue()
|
||||||
|
|
|
@ -35,7 +35,7 @@ open class LibrusSynergia(open val data: DataLibrus, open val lastSync: Long?) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!text.contains("jesteś zalogowany") && !text.contains("Podgląd zadania")) {
|
if (!text.contains("jesteś zalogowany")) {
|
||||||
when {
|
when {
|
||||||
text.contains("stop.png") -> ERROR_LIBRUS_SYNERGIA_ACCESS_DENIED
|
text.contains("stop.png") -> ERROR_LIBRUS_SYNERGIA_ACCESS_DENIED
|
||||||
text.contains("Przerwa techniczna") -> ERROR_LIBRUS_SYNERGIA_MAINTENANCE
|
text.contains("Przerwa techniczna") -> ERROR_LIBRUS_SYNERGIA_MAINTENANCE
|
||||||
|
@ -48,6 +48,7 @@ open class LibrusSynergia(open val data: DataLibrus, open val lastSync: Long?) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
onSuccess(text)
|
onSuccess(text)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
@ -89,44 +90,4 @@ open class LibrusSynergia(open val data: DataLibrus, open val lastSync: Long?) {
|
||||||
.build()
|
.build()
|
||||||
.enqueue()
|
.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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,8 @@ class LibrusApiAnnouncementMarkAsRead(override val data: DataLibrus,
|
||||||
Metadata.TYPE_ANNOUNCEMENT,
|
Metadata.TYPE_ANNOUNCEMENT,
|
||||||
announcement.id,
|
announcement.id,
|
||||||
announcement.seen,
|
announcement.seen,
|
||||||
announcement.notified
|
announcement.notified,
|
||||||
|
announcement.addedDate
|
||||||
))
|
))
|
||||||
onSuccess()
|
onSuccess()
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,17 +38,15 @@ class LibrusApiAnnouncements(override val data: DataLibrus,
|
||||||
val read = announcement.getBoolean("WasRead") ?: false
|
val read = announcement.getBoolean("WasRead") ?: false
|
||||||
|
|
||||||
val announcementObject = Announcement(
|
val announcementObject = Announcement(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
subject = subject,
|
subject,
|
||||||
text = text,
|
text,
|
||||||
startDate = startDate,
|
startDate,
|
||||||
endDate = endDate,
|
endDate,
|
||||||
teacherId = teacherId,
|
teacherId,
|
||||||
addedDate = addedDate
|
longId
|
||||||
).also {
|
)
|
||||||
it.idString = longId
|
|
||||||
}
|
|
||||||
|
|
||||||
data.announcementList.add(announcementObject)
|
data.announcementList.add(announcementObject)
|
||||||
data.setSeenMetadataList.add(Metadata(
|
data.setSeenMetadataList.add(Metadata(
|
||||||
|
@ -56,7 +54,8 @@ class LibrusApiAnnouncements(override val data: DataLibrus,
|
||||||
Metadata.TYPE_ANNOUNCEMENT,
|
Metadata.TYPE_ANNOUNCEMENT,
|
||||||
id,
|
id,
|
||||||
read,
|
read,
|
||||||
profile.empty || read
|
profile.empty || read,
|
||||||
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,39 +26,25 @@ class LibrusApiAttendanceTypes(override val data: DataLibrus,
|
||||||
|
|
||||||
attendanceTypes?.forEach { attendanceType ->
|
attendanceTypes?.forEach { attendanceType ->
|
||||||
val id = attendanceType.getLong("Id") ?: return@forEach
|
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 standardId = when (attendanceType.getBoolean("Standard") ?: false) {
|
||||||
val typeSymbol = attendanceType.getString("Short") ?: ""
|
true -> id
|
||||||
val typeColor = attendanceType.getString("ColorRGB")?.let { Color.parseColor("#$it") }
|
false -> attendanceType.getJsonObject("StandardType")?.getLong("Id") ?: id
|
||||||
|
}
|
||||||
val isStandard = attendanceType.getBoolean("Standard") ?: false
|
val type = when (standardId) {
|
||||||
val baseType = when (attendanceType.getJsonObject("StandardType")?.getLong("Id") ?: id) {
|
|
||||||
1L -> Attendance.TYPE_ABSENT
|
1L -> Attendance.TYPE_ABSENT
|
||||||
2L -> Attendance.TYPE_BELATED
|
2L -> Attendance.TYPE_BELATED
|
||||||
3L -> Attendance.TYPE_ABSENT_EXCUSED
|
3L -> Attendance.TYPE_ABSENT_EXCUSED
|
||||||
4L -> Attendance.TYPE_RELEASED
|
4L -> Attendance.TYPE_RELEASED
|
||||||
/*100*/else -> when (isStandard) {
|
/*100*/else -> Attendance.TYPE_PRESENT
|
||||||
true -> Attendance.TYPE_PRESENT
|
|
||||||
false -> Attendance.TYPE_PRESENT_CUSTOM
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val typeShort = when (isStandard) {
|
|
||||||
true -> data.app.attendanceManager.getTypeShort(baseType)
|
|
||||||
false -> typeSymbol
|
|
||||||
}
|
}
|
||||||
|
|
||||||
data.attendanceTypes.put(id, AttendanceType(
|
data.attendanceTypes.put(id, AttendanceType(profileId, id, name, type, color))
|
||||||
profileId,
|
|
||||||
id,
|
|
||||||
baseType,
|
|
||||||
typeName,
|
|
||||||
typeShort,
|
|
||||||
typeSymbol,
|
|
||||||
typeColor
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES, 2*DAY)
|
data.setSyncNext(ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES, 4*DAY)
|
||||||
onSuccess(ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES)
|
onSuccess(ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,44 +41,39 @@ class LibrusApiAttendances(override val data: DataLibrus,
|
||||||
val lessonDate = Date.fromY_m_d(attendance.getString("Date"))
|
val lessonDate = Date.fromY_m_d(attendance.getString("Date"))
|
||||||
val teacherId = attendance.getJsonObject("AddedBy")?.getLong("Id")
|
val teacherId = attendance.getJsonObject("AddedBy")?.getLong("Id")
|
||||||
val semester = attendance.getInt("Semester") ?: return@forEach
|
val semester = attendance.getInt("Semester") ?: return@forEach
|
||||||
|
val type = attendance.getJsonObject("Type")?.getLong("Id") ?: return@forEach
|
||||||
|
val typeObject = data.attendanceTypes[type] ?: null
|
||||||
|
val topic = typeObject?.name ?: ""
|
||||||
|
|
||||||
val typeId = attendance.getJsonObject("Type")?.getLong("Id") ?: return@forEach
|
val startTime = data.lessonRanges.get(lessonNo).startTime
|
||||||
val type = data.attendanceTypes[typeId] ?: null
|
|
||||||
|
|
||||||
val startTime = data.lessonRanges.get(lessonNo)?.startTime
|
|
||||||
|
|
||||||
val lesson = if (lessonId != -1L)
|
val lesson = if (lessonId != -1L)
|
||||||
data.librusLessons.singleOrNull { it.lessonId == lessonId }
|
data.librusLessons.singleOrNull { it.lessonId == lessonId }
|
||||||
else null
|
else null
|
||||||
|
|
||||||
|
val attendanceObject = Attendance(
|
||||||
|
profileId,
|
||||||
|
id,
|
||||||
|
teacherId ?: lesson?.teacherId ?: -1,
|
||||||
|
lesson?.subjectId ?: -1,
|
||||||
|
semester,
|
||||||
|
topic,
|
||||||
|
lessonDate,
|
||||||
|
startTime,
|
||||||
|
typeObject?.type ?: Attendance.TYPE_CUSTOM
|
||||||
|
)
|
||||||
|
|
||||||
val addedDate = Date.fromIso(attendance.getString("AddDate") ?: return@forEach)
|
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)
|
data.attendanceList.add(attendanceObject)
|
||||||
if(type?.baseType != Attendance.TYPE_PRESENT) {
|
if(typeObject?.type != Attendance.TYPE_PRESENT) {
|
||||||
data.metadataList.add(Metadata(
|
data.metadataList.add(Metadata(
|
||||||
profileId,
|
profileId,
|
||||||
Metadata.TYPE_ATTENDANCE,
|
Metadata.TYPE_ATTENDANCE,
|
||||||
id,
|
id,
|
||||||
profile?.empty ?: false || type?.baseType == Attendance.TYPE_PRESENT_CUSTOM || type?.baseType == Attendance.TYPE_UNKNOWN,
|
profile?.empty ?: false,
|
||||||
profile?.empty ?: false || type?.baseType == Attendance.TYPE_PRESENT_CUSTOM || type?.baseType == Attendance.TYPE_UNKNOWN
|
profile?.empty ?: false,
|
||||||
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,8 +55,7 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus,
|
||||||
comment = null,
|
comment = null,
|
||||||
semester = 1,
|
semester = 1,
|
||||||
teacherId = -1,
|
teacherId = -1,
|
||||||
subjectId = 1,
|
subjectId = 1
|
||||||
addedDate = profile.getSemesterStart(1).inMillis
|
|
||||||
)
|
)
|
||||||
|
|
||||||
data.gradeList.add(semester1StartGradeObject)
|
data.gradeList.add(semester1StartGradeObject)
|
||||||
|
@ -65,7 +64,8 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus,
|
||||||
Metadata.TYPE_GRADE,
|
Metadata.TYPE_GRADE,
|
||||||
semester1StartGradeObject.id,
|
semester1StartGradeObject.id,
|
||||||
true,
|
true,
|
||||||
true
|
true,
|
||||||
|
profile.getSemesterStart(1).inMillis
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,8 +83,7 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus,
|
||||||
comment = null,
|
comment = null,
|
||||||
semester = 2,
|
semester = 2,
|
||||||
teacherId = -1,
|
teacherId = -1,
|
||||||
subjectId = 1,
|
subjectId = 1
|
||||||
addedDate = profile.getSemesterStart(2).inMillis
|
|
||||||
)
|
)
|
||||||
|
|
||||||
data.gradeList.add(semester2StartGradeObject)
|
data.gradeList.add(semester2StartGradeObject)
|
||||||
|
@ -93,7 +92,8 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus,
|
||||||
Metadata.TYPE_GRADE,
|
Metadata.TYPE_GRADE,
|
||||||
semester2StartGradeObject.id,
|
semester2StartGradeObject.id,
|
||||||
true,
|
true,
|
||||||
true
|
true,
|
||||||
|
profile.getSemesterStart(2).inMillis
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,8 +155,7 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus,
|
||||||
comment = if (text != null) description.join(" - ") else null,
|
comment = if (text != null) description.join(" - ") else null,
|
||||||
semester = semester,
|
semester = semester,
|
||||||
teacherId = teacherId,
|
teacherId = teacherId,
|
||||||
subjectId = 1,
|
subjectId = 1
|
||||||
addedDate = addedDate
|
|
||||||
).apply {
|
).apply {
|
||||||
valueMax = valueTo
|
valueMax = valueTo
|
||||||
}
|
}
|
||||||
|
@ -167,7 +166,8 @@ class LibrusApiBehaviourGrades(override val data: DataLibrus,
|
||||||
Metadata.TYPE_GRADE,
|
Metadata.TYPE_GRADE,
|
||||||
id,
|
id,
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,8 +65,7 @@ class LibrusApiDescriptiveGrades(override val data: DataLibrus,
|
||||||
comment = null,
|
comment = null,
|
||||||
semester = semester,
|
semester = semester,
|
||||||
teacherId = teacherId,
|
teacherId = teacherId,
|
||||||
subjectId = subjectId,
|
subjectId = subjectId
|
||||||
addedDate = addedDate
|
|
||||||
)
|
)
|
||||||
|
|
||||||
data.gradeList.add(gradeObject)
|
data.gradeList.add(gradeObject)
|
||||||
|
@ -75,7 +74,8 @@ class LibrusApiDescriptiveGrades(override val data: DataLibrus,
|
||||||
Metadata.TYPE_GRADE,
|
Metadata.TYPE_GRADE,
|
||||||
id,
|
id,
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ class LibrusApiEvents(override val data: DataLibrus,
|
||||||
events?.forEach { event ->
|
events?.forEach { event ->
|
||||||
val id = event.getLong("Id") ?: return@forEach
|
val id = event.getLong("Id") ?: return@forEach
|
||||||
val eventDate = Date.fromY_m_d(event.getString("Date"))
|
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 type = event.getJsonObject("Category")?.getLong("Id") ?: -1
|
||||||
val teacherId = event.getJsonObject("CreatedBy")?.getLong("Id") ?: -1
|
val teacherId = event.getJsonObject("CreatedBy")?.getLong("Id") ?: -1
|
||||||
val subjectId = event.getJsonObject("Subject")?.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 startTime = lessonRange?.startTime ?: Time.fromH_m(event.getString("TimeFrom"))
|
||||||
val addedDate = Date.fromIso(event.getString("AddDate"))
|
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(
|
val eventObject = Event(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
date = eventDate,
|
eventDate,
|
||||||
time = startTime,
|
startTime,
|
||||||
topic = topic,
|
topic,
|
||||||
color = null,
|
-1,
|
||||||
type = type,
|
type,
|
||||||
teacherId = teacherId,
|
false,
|
||||||
subjectId = subjectId,
|
teacherId,
|
||||||
teamId = teamId,
|
subjectId,
|
||||||
addedDate = addedDate
|
teamId
|
||||||
)
|
)
|
||||||
|
|
||||||
data.eventList.add(eventObject)
|
data.eventList.add(eventObject)
|
||||||
|
@ -73,7 +67,8 @@ class LibrusApiEvents(override val data: DataLibrus,
|
||||||
Metadata.TYPE_EVENT,
|
Metadata.TYPE_EVENT,
|
||||||
id,
|
id,
|
||||||
profile?.empty ?: false,
|
profile?.empty ?: false,
|
||||||
profile?.empty ?: false
|
profile?.empty ?: false,
|
||||||
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,8 +79,7 @@ class LibrusApiGrades(override val data: DataLibrus,
|
||||||
comment = null,
|
comment = null,
|
||||||
semester = semester,
|
semester = semester,
|
||||||
teacherId = teacherId,
|
teacherId = teacherId,
|
||||||
subjectId = subjectId,
|
subjectId = subjectId
|
||||||
addedDate = addedDate
|
|
||||||
)
|
)
|
||||||
|
|
||||||
grade.getJsonObject("Improvement")?.also {
|
grade.getJsonObject("Improvement")?.also {
|
||||||
|
@ -99,7 +98,8 @@ class LibrusApiGrades(override val data: DataLibrus,
|
||||||
Metadata.TYPE_GRADE,
|
Metadata.TYPE_GRADE,
|
||||||
id,
|
id,
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,17 +34,17 @@ class LibrusApiHomework(override val data: DataLibrus,
|
||||||
val addedDate = Date.fromY_m_d(homework.getString("Date"))
|
val addedDate = Date.fromY_m_d(homework.getString("Date"))
|
||||||
|
|
||||||
val eventObject = Event(
|
val eventObject = Event(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
date = eventDate,
|
eventDate,
|
||||||
time = null,
|
null,
|
||||||
topic = topic,
|
topic,
|
||||||
color = null,
|
-1,
|
||||||
type = -1,
|
-1,
|
||||||
teacherId = teacherId,
|
false,
|
||||||
subjectId = -1,
|
teacherId,
|
||||||
teamId = -1,
|
-1,
|
||||||
addedDate = addedDate.inMillis
|
-1
|
||||||
)
|
)
|
||||||
|
|
||||||
data.eventList.add(eventObject)
|
data.eventList.add(eventObject)
|
||||||
|
@ -53,7 +53,8 @@ class LibrusApiHomework(override val data: DataLibrus,
|
||||||
Metadata.TYPE_HOMEWORK,
|
Metadata.TYPE_HOMEWORK,
|
||||||
id,
|
id,
|
||||||
profile?.empty ?: false,
|
profile?.empty ?: false,
|
||||||
profile?.empty ?: false
|
profile?.empty ?: false,
|
||||||
|
addedDate.inMillis
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,12 +4,15 @@
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.api
|
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.DataLibrus
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_LUCKY_NUMBER
|
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.api.edziennik.librus.data.LibrusApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber
|
import pl.szczodrzynski.edziennik.data.db.entity.LuckyNumber
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
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.Date
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Time
|
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 luckyNumberDate = Date.fromY_m_d(luckyNumberEl.getString("LuckyNumberDay")) ?: Date.getToday()
|
||||||
val luckyNumber = luckyNumberEl.getInt("LuckyNumber") ?: -1
|
val luckyNumber = luckyNumberEl.getInt("LuckyNumber") ?: -1
|
||||||
val luckyNumberObject = LuckyNumber(
|
val luckyNumberObject = LuckyNumber(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
date = luckyNumberDate,
|
luckyNumberDate,
|
||||||
number = luckyNumber
|
luckyNumber
|
||||||
)
|
)
|
||||||
|
|
||||||
if (luckyNumberDate >= Date.getToday())
|
//if (luckyNumberDate > Date.getToday()) {
|
||||||
nextSync = luckyNumberDate.combineWith(Time(15, 0, 0))
|
nextSync = luckyNumberDate.combineWith(Time(15, 0, 0))
|
||||||
else
|
//}
|
||||||
nextSync = System.currentTimeMillis() + 6*HOUR*1000
|
|
||||||
|
|
||||||
data.luckyNumberList.add(luckyNumberObject)
|
data.luckyNumberList.add(luckyNumberObject)
|
||||||
data.metadataList.add(
|
data.metadataList.add(
|
||||||
|
@ -50,7 +52,8 @@ class LibrusApiLuckyNumber(override val data: DataLibrus,
|
||||||
Metadata.TYPE_LUCKY_NUMBER,
|
Metadata.TYPE_LUCKY_NUMBER,
|
||||||
luckyNumberObject.date.value.toLong(),
|
luckyNumberObject.date.value.toLong(),
|
||||||
true,
|
true,
|
||||||
profile?.empty ?: false
|
profile?.empty ?: false,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,15 +46,12 @@ class LibrusApiNotices(override val data: DataLibrus,
|
||||||
val semester = profile?.dateToSemester(addedDate) ?: 1
|
val semester = profile?.dateToSemester(addedDate) ?: 1
|
||||||
|
|
||||||
val noticeObject = Notice(
|
val noticeObject = Notice(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
type = type,
|
categoryText + "\n" + text,
|
||||||
semester = semester,
|
semester,
|
||||||
text = text,
|
type,
|
||||||
category = categoryText,
|
teacherId
|
||||||
points = null,
|
|
||||||
teacherId = teacherId,
|
|
||||||
addedDate = addedDate.inMillis
|
|
||||||
)
|
)
|
||||||
|
|
||||||
data.noticeList.add(noticeObject)
|
data.noticeList.add(noticeObject)
|
||||||
|
@ -64,7 +61,8 @@ class LibrusApiNotices(override val data: DataLibrus,
|
||||||
Metadata.TYPE_NOTICE,
|
Metadata.TYPE_NOTICE,
|
||||||
id,
|
id,
|
||||||
profile?.empty ?: false,
|
profile?.empty ?: false,
|
||||||
profile?.empty ?: false
|
profile?.empty ?: false,
|
||||||
|
addedDate.inMillis
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,8 +56,7 @@ class LibrusApiPointGrades(override val data: DataLibrus,
|
||||||
comment = null,
|
comment = null,
|
||||||
semester = semester,
|
semester = semester,
|
||||||
teacherId = teacherId,
|
teacherId = teacherId,
|
||||||
subjectId = subjectId,
|
subjectId = subjectId
|
||||||
addedDate = addedDate
|
|
||||||
).apply {
|
).apply {
|
||||||
valueMax = category?.valueTo ?: 0f
|
valueMax = category?.valueTo ?: 0f
|
||||||
}
|
}
|
||||||
|
@ -68,7 +67,8 @@ class LibrusApiPointGrades(override val data: DataLibrus,
|
||||||
Metadata.TYPE_GRADE,
|
Metadata.TYPE_GRADE,
|
||||||
id,
|
id,
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,16 +39,17 @@ class LibrusApiPtMeetings(override val data: DataLibrus,
|
||||||
}
|
}
|
||||||
|
|
||||||
val eventObject = Event(
|
val eventObject = Event(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
date = eventDate,
|
eventDate,
|
||||||
time = startTime,
|
startTime,
|
||||||
topic = topic,
|
topic,
|
||||||
color = null,
|
-1,
|
||||||
type = Event.TYPE_PT_MEETING,
|
Event.TYPE_PT_MEETING,
|
||||||
teacherId = teacherId,
|
false,
|
||||||
subjectId = -1,
|
teacherId,
|
||||||
teamId = data.teamClass?.id ?: -1
|
-1,
|
||||||
|
data.teamClass?.id ?: -1
|
||||||
)
|
)
|
||||||
|
|
||||||
data.eventList.add(eventObject)
|
data.eventList.add(eventObject)
|
||||||
|
@ -58,7 +59,8 @@ class LibrusApiPtMeetings(override val data: DataLibrus,
|
||||||
Metadata.TYPE_EVENT,
|
Metadata.TYPE_EVENT,
|
||||||
id,
|
id,
|
||||||
profile?.empty ?: false,
|
profile?.empty ?: false,
|
||||||
profile?.empty ?: false
|
profile?.empty ?: false,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,14 +21,6 @@ class LibrusApiPushConfig(override val data: DataLibrus,
|
||||||
}
|
}
|
||||||
|
|
||||||
init { data.app.config.sync.tokenLibrus?.also { tokenLibrus ->
|
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(
|
apiGet(TAG, "ChangeRegister", payload = JsonObject(
|
||||||
"provider" to "FCM",
|
"provider" to "FCM",
|
||||||
"device" to tokenLibrus,
|
"device" to tokenLibrus,
|
||||||
|
|
|
@ -43,15 +43,15 @@ class LibrusApiTeacherFreeDays(override val data: DataLibrus,
|
||||||
val timeTo = teacherAbsence.getString("TimeTo")?.let { Time.fromH_m_s(it) }
|
val timeTo = teacherAbsence.getString("TimeTo")?.let { Time.fromH_m_s(it) }
|
||||||
|
|
||||||
val teacherAbsenceObject = TeacherAbsence(
|
val teacherAbsenceObject = TeacherAbsence(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
type = type,
|
teacherId,
|
||||||
name = name,
|
type,
|
||||||
dateFrom = dateFrom,
|
name,
|
||||||
dateTo = dateTo,
|
dateFrom,
|
||||||
timeFrom = timeFrom,
|
dateTo,
|
||||||
timeTo = timeTo,
|
timeFrom,
|
||||||
teacherId = teacherId
|
timeTo
|
||||||
)
|
)
|
||||||
|
|
||||||
data.teacherAbsenceList.add(teacherAbsenceObject)
|
data.teacherAbsenceList.add(teacherAbsenceObject)
|
||||||
|
@ -59,8 +59,9 @@ class LibrusApiTeacherFreeDays(override val data: DataLibrus,
|
||||||
profileId,
|
profileId,
|
||||||
Metadata.TYPE_TEACHER_ABSENCE,
|
Metadata.TYPE_TEACHER_ABSENCE,
|
||||||
id,
|
id,
|
||||||
true,
|
profile?.empty ?: false,
|
||||||
profile?.empty ?: false
|
profile?.empty ?: false,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,8 +60,7 @@ class LibrusApiTextGrades(override val data: DataLibrus,
|
||||||
comment = grade.getString("Phrase") /* whatever it is */,
|
comment = grade.getString("Phrase") /* whatever it is */,
|
||||||
semester = semester,
|
semester = semester,
|
||||||
teacherId = teacherId,
|
teacherId = teacherId,
|
||||||
subjectId = subjectId,
|
subjectId = subjectId
|
||||||
addedDate = addedDate
|
|
||||||
)
|
)
|
||||||
|
|
||||||
data.gradeList.add(gradeObject)
|
data.gradeList.add(gradeObject)
|
||||||
|
@ -70,7 +69,8 @@ class LibrusApiTextGrades(override val data: DataLibrus,
|
||||||
Metadata.TYPE_GRADE,
|
Metadata.TYPE_GRADE,
|
||||||
id,
|
id,
|
||||||
profile.empty,
|
profile.empty,
|
||||||
profile.empty
|
profile.empty,
|
||||||
|
addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -198,7 +198,8 @@ class LibrusApiTimetables(override val data: DataLibrus,
|
||||||
Metadata.TYPE_LESSON_CHANGE,
|
Metadata.TYPE_LESSON_CHANGE,
|
||||||
lessonObject.id,
|
lessonObject.id,
|
||||||
seen,
|
seen,
|
||||||
seen
|
seen,
|
||||||
|
System.currentTimeMillis()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
data.lessonList.add(lessonObject)
|
data.lessonList.add(lessonObject)
|
||||||
|
|
|
@ -4,12 +4,22 @@
|
||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.messages
|
package pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.messages
|
||||||
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.*
|
||||||
import kotlinx.coroutines.Dispatchers
|
import org.greenrobot.eventbus.EventBus
|
||||||
import kotlinx.coroutines.Job
|
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.DataLibrus
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusMessages
|
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.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
|
import kotlin.coroutines.CoroutineContext
|
||||||
|
|
||||||
class LibrusMessagesGetAttachment(override val data: DataLibrus,
|
class LibrusMessagesGetAttachment(override val data: DataLibrus,
|
||||||
|
@ -27,6 +37,8 @@ class LibrusMessagesGetAttachment(override val data: DataLibrus,
|
||||||
override val coroutineContext: CoroutineContext
|
override val coroutineContext: CoroutineContext
|
||||||
get() = job + Dispatchers.Default
|
get() = job + Dispatchers.Default
|
||||||
|
|
||||||
|
private var getAttachmentCheckKeyTries = 0
|
||||||
|
|
||||||
init {
|
init {
|
||||||
messagesGet(TAG, "GetFileDownloadLink", parameters = mapOf(
|
messagesGet(TAG, "GetFileDownloadLink", parameters = mapOf(
|
||||||
"fileId" to attachmentId,
|
"fileId" to attachmentId,
|
||||||
|
@ -34,8 +46,81 @@ class LibrusMessagesGetAttachment(override val data: DataLibrus,
|
||||||
"archive" to 0
|
"archive" to 0
|
||||||
)) { doc ->
|
)) { doc ->
|
||||||
val downloadLink = doc.select("response GetFileDownloadLink downloadLink").text()
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.ENDPOINT_LIBRUS_MESSAGES_SENT
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusMessages
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusMessages
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.*
|
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.fixName
|
||||||
import pl.szczodrzynski.edziennik.singleOrNull
|
import pl.szczodrzynski.edziennik.singleOrNull
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils
|
import pl.szczodrzynski.edziennik.utils.Utils
|
||||||
|
@ -78,7 +78,7 @@ class LibrusMessagesGetList(override val data: DataLibrus,
|
||||||
|
|
||||||
val senderId = when (type) {
|
val senderId = when (type) {
|
||||||
TYPE_RECEIVED -> recipientId
|
TYPE_RECEIVED -> recipientId
|
||||||
else -> null
|
else -> -1
|
||||||
}
|
}
|
||||||
|
|
||||||
val receiverId = when (type) {
|
val receiverId = when (type) {
|
||||||
|
@ -92,13 +92,13 @@ class LibrusMessagesGetList(override val data: DataLibrus,
|
||||||
}
|
}
|
||||||
|
|
||||||
val messageObject = Message(
|
val messageObject = Message(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = id,
|
id,
|
||||||
type = type,
|
subject,
|
||||||
subject = subject,
|
null,
|
||||||
body = null,
|
type,
|
||||||
senderId = senderId,
|
senderId,
|
||||||
addedDate = sentDate
|
-1
|
||||||
)
|
)
|
||||||
|
|
||||||
val messageRecipientObject = MessageRecipient(
|
val messageRecipientObject = MessageRecipient(
|
||||||
|
@ -109,19 +109,15 @@ class LibrusMessagesGetList(override val data: DataLibrus,
|
||||||
id
|
id
|
||||||
)
|
)
|
||||||
|
|
||||||
element.select("isAnyFileAttached")?.text()?.let {
|
data.messageIgnoreList.add(messageObject)
|
||||||
if (it == "1")
|
|
||||||
messageObject.hasAttachments = true
|
|
||||||
}
|
|
||||||
|
|
||||||
data.messageList.add(messageObject)
|
|
||||||
data.messageRecipientList.add(messageRecipientObject)
|
data.messageRecipientList.add(messageRecipientObject)
|
||||||
data.setSeenMetadataList.add(Metadata(
|
data.setSeenMetadataList.add(Metadata(
|
||||||
profileId,
|
profileId,
|
||||||
Metadata.TYPE_MESSAGE,
|
Metadata.TYPE_MESSAGE,
|
||||||
id,
|
id,
|
||||||
notified,
|
notified,
|
||||||
notified
|
notified,
|
||||||
|
sentDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.DataLibrus
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusMessages
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusMessages
|
||||||
import pl.szczodrzynski.edziennik.data.api.events.MessageGetEvent
|
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.TYPE_RECEIVED
|
||||||
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.Metadata
|
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||||
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
|
import pl.szczodrzynski.edziennik.data.db.entity.Teacher
|
||||||
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
|
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
|
||||||
|
@ -102,10 +102,11 @@ class LibrusMessagesGetMessage(override val data: DataLibrus,
|
||||||
}
|
}
|
||||||
|
|
||||||
val messageRecipientObject = MessageRecipientFull(
|
val messageRecipientObject = MessageRecipientFull(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = -1,
|
-1,
|
||||||
messageId = messageObject.id,
|
-1,
|
||||||
readDate = readDate
|
readDate,
|
||||||
|
messageObject.id
|
||||||
)
|
)
|
||||||
|
|
||||||
messageRecipientObject.fullName = profile.accountName ?: profile.studentNameLong ?: ""
|
messageRecipientObject.fullName = profile.accountName ?: profile.studentNameLong ?: ""
|
||||||
|
@ -131,10 +132,11 @@ class LibrusMessagesGetMessage(override val data: DataLibrus,
|
||||||
}
|
}
|
||||||
|
|
||||||
val messageRecipientObject = MessageRecipientFull(
|
val messageRecipientObject = MessageRecipientFull(
|
||||||
profileId = profileId,
|
profileId,
|
||||||
id = receiverId,
|
receiverId,
|
||||||
messageId = messageObject.id,
|
-1,
|
||||||
readDate = readDate
|
readDate,
|
||||||
|
messageObject.id
|
||||||
)
|
)
|
||||||
|
|
||||||
messageRecipientObject.fullName = "$receiverFirstName $receiverLastName"
|
messageRecipientObject.fullName = "$receiverFirstName $receiverLastName"
|
||||||
|
@ -150,15 +152,14 @@ class LibrusMessagesGetMessage(override val data: DataLibrus,
|
||||||
Metadata.TYPE_MESSAGE,
|
Metadata.TYPE_MESSAGE,
|
||||||
messageObject.id,
|
messageObject.id,
|
||||||
true,
|
true,
|
||||||
true
|
true,
|
||||||
|
messageObject.addedDate
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
messageObject.recipients = messageRecipientList
|
messageObject.recipients = messageRecipientList
|
||||||
data.messageRecipientList.addAll(messageRecipientList)
|
data.messageRecipientList.addAll(messageRecipientList)
|
||||||
|
|
||||||
data.messageList.add(messageObject)
|
data.messageList.add(messageObject)
|
||||||
data.messageListReplace = true
|
|
||||||
|
|
||||||
EventBus.getDefault().postSticky(MessageGetEvent(messageObject))
|
EventBus.getDefault().postSticky(MessageGetEvent(messageObject))
|
||||||
onSuccess()
|
onSuccess()
|
||||||
|
|
|
@ -48,9 +48,9 @@ class LibrusMessagesSendMessage(override val data: DataLibrus,
|
||||||
}
|
}
|
||||||
|
|
||||||
LibrusMessagesGetList(data, type = Message.TYPE_SENT, lastSync = null) {
|
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 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)
|
EventBus.getDefault().postSticky(event)
|
||||||
onSuccess()
|
onSuccess()
|
||||||
|
|
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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<MessageRecipientFull>()
|
|
||||||
|
|
||||||
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()
|
|
||||||
}
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue