mirror of
https://github.com/szkolny-eu/szkolny-android.git
synced 2025-06-14 22:50:17 +02:00
Compare commits
11 Commits
code-refor
...
v3.9.3-dev
Author | SHA1 | Date | |
---|---|---|---|
01ac26e67b | |||
434ddd1342 | |||
3925496595 | |||
5711c02170 | |||
ca1c691bf0 | |||
39c8a743bb | |||
14cd548dff | |||
b72324805f | |||
a049effa61 | |||
23d55ec571 | |||
385fe21d16 |
@ -159,11 +159,13 @@ dependencies {
|
|||||||
//implementation 'com.github.wulkanowy:uonet-request-signer:master-SNAPSHOT'
|
//implementation 'com.github.wulkanowy:uonet-request-signer:master-SNAPSHOT'
|
||||||
//implementation 'com.github.kuba2k2.uonet-request-signer:android:master-63f094b14a-1'
|
//implementation 'com.github.kuba2k2.uonet-request-signer:android:master-63f094b14a-1'
|
||||||
|
|
||||||
implementation "org.redundent:kotlin-xml-builder:1.5.3"
|
//implementation "org.redundent:kotlin-xml-builder:1.5.3"
|
||||||
|
|
||||||
implementation "io.github.wulkanowy:signer-android:0.1.1"
|
implementation "io.github.wulkanowy:signer-android:0.1.1"
|
||||||
|
|
||||||
implementation "androidx.work:work-runtime-ktx:${versions.work}"
|
implementation "androidx.work:work-runtime-ktx:${versions.work}"
|
||||||
|
|
||||||
|
implementation 'com.hypertrack:hyperlog:0.0.10'
|
||||||
}
|
}
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
@ -15,10 +15,14 @@
|
|||||||
android:theme="@style/SplashTheme"
|
android:theme="@style/SplashTheme"
|
||||||
android:usesCleartextTraffic="true"
|
android:usesCleartextTraffic="true"
|
||||||
tools:ignore="UnusedAttribute">
|
tools:ignore="UnusedAttribute">
|
||||||
|
<activity
|
||||||
|
android:name=".ui.modules.login.LoginLibrusCaptchaActivity"
|
||||||
|
android:theme="@android:style/Theme.Dialog"
|
||||||
|
android:excludeFromRecents="true"/>
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:label="@string/app_name"
|
|
||||||
android:configChanges="orientation|screenSize"
|
android:configChanges="orientation|screenSize"
|
||||||
|
android:label="@string/app_name"
|
||||||
android:launchMode="singleTop"
|
android:launchMode="singleTop"
|
||||||
android:theme="@style/SplashTheme">
|
android:theme="@style/SplashTheme">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
@ -29,7 +33,7 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
android:name="pl.szczodrzynski.edziennik.ui.modules.messages.MessagesComposeActivity"
|
android:name=".ui.modules.messages.MessagesComposeActivity"
|
||||||
android:configChanges="orientation|screenSize"
|
android:configChanges="orientation|screenSize"
|
||||||
android:label="@string/messages_compose_title"
|
android:label="@string/messages_compose_title"
|
||||||
android:theme="@style/AppTheme.Black" />
|
android:theme="@style/AppTheme.Black" />
|
||||||
@ -39,7 +43,7 @@
|
|||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:theme="@style/AppTheme" />
|
android:theme="@style/AppTheme" />
|
||||||
<activity
|
<activity
|
||||||
android:name="pl.szczodrzynski.edziennik.ui.modules.login.LoginActivity"
|
android:name=".ui.modules.login.LoginActivity"
|
||||||
android:configChanges="orientation|screenSize"
|
android:configChanges="orientation|screenSize"
|
||||||
android:launchMode="singleTop"
|
android:launchMode="singleTop"
|
||||||
android:theme="@style/AppTheme.Light" />
|
android:theme="@style/AppTheme.Light" />
|
||||||
@ -101,22 +105,18 @@
|
|||||||
android:excludeFromRecents="true"
|
android:excludeFromRecents="true"
|
||||||
android:noHistory="true"
|
android:noHistory="true"
|
||||||
android:theme="@style/AppTheme.NoDisplay" />
|
android:theme="@style/AppTheme.NoDisplay" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.modules.settings.SettingsLicenseActivity"
|
android:name=".ui.modules.settings.SettingsLicenseActivity"
|
||||||
android:configChanges="orientation|keyboardHidden"
|
android:configChanges="orientation|keyboardHidden"
|
||||||
android:theme="@style/AppTheme" />
|
android:theme="@style/AppTheme" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="com.theartofdev.edmodo.cropper.CropImageActivity"
|
android:name="com.theartofdev.edmodo.cropper.CropImageActivity"
|
||||||
android:configChanges="orientation|keyboardHidden"
|
android:configChanges="orientation|keyboardHidden"
|
||||||
android:theme="@style/Base.Theme.AppCompat" />
|
android:theme="@style/Base.Theme.AppCompat" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.modules.webpush.WebPushConfigActivity"
|
android:name=".ui.modules.webpush.WebPushConfigActivity"
|
||||||
android:configChanges="orientation|keyboardHidden"
|
android:configChanges="orientation|keyboardHidden"
|
||||||
android:theme="@style/AppTheme.Dark" />
|
android:theme="@style/AppTheme.Dark" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.modules.home.CounterActivity"
|
android:name=".ui.modules.home.CounterActivity"
|
||||||
android:theme="@style/AppTheme.Black" />
|
android:theme="@style/AppTheme.Black" />
|
||||||
@ -169,7 +169,6 @@
|
|||||||
android:name="android.appwidget.provider"
|
android:name="android.appwidget.provider"
|
||||||
android:resource="@xml/widget_notifications_info" />
|
android:resource="@xml/widget_notifications_info" />
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
<receiver
|
<receiver
|
||||||
android:name=".widgets.luckynumber.WidgetLuckyNumber"
|
android:name=".widgets.luckynumber.WidgetLuckyNumber"
|
||||||
android:label="@string/widget_lucky_number_title">
|
android:label="@string/widget_lucky_number_title">
|
||||||
@ -188,7 +187,6 @@
|
|||||||
<action android:name="android.intent.action.USER_PRESENT" />
|
<action android:name="android.intent.action.USER_PRESENT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
<receiver android:name=".receivers.BootReceiver">
|
<receiver android:name=".receivers.BootReceiver">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||||
@ -196,14 +194,7 @@
|
|||||||
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
|
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
<service
|
|
||||||
android:name=".sync.MyFirebaseMessagingService"
|
|
||||||
android:exported="false">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
|
|
||||||
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
|
||||||
</intent-filter>
|
|
||||||
</service>
|
|
||||||
<receiver
|
<receiver
|
||||||
android:name=".sync.FirebaseBroadcastReceiver"
|
android:name=".sync.FirebaseBroadcastReceiver"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
@ -212,6 +203,23 @@
|
|||||||
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
|
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
|
<receiver
|
||||||
|
android:name=".receivers.SzkolnyReceiver"
|
||||||
|
android:exported="true">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="pl.szczodrzynski.edziennik.SZKOLNY_MAIN" />
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".sync.MyFirebaseMessagingService"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
|
||||||
|
<action android:name="com.google.firebase.MESSAGING_EVENT" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
<service
|
<service
|
||||||
android:name=".widgets.timetable.WidgetTimetableService"
|
android:name=".widgets.timetable.WidgetTimetableService"
|
||||||
android:permission="android.permission.BIND_REMOTEVIEWS" />
|
android:permission="android.permission.BIND_REMOTEVIEWS" />
|
||||||
@ -222,14 +230,6 @@
|
|||||||
|
|
||||||
<service android:name=".Notifier$GetDataRetryService" />
|
<service android:name=".Notifier$GetDataRetryService" />
|
||||||
|
|
||||||
<receiver
|
|
||||||
android:name=".receivers.SzkolnyReceiver"
|
|
||||||
android:exported="true">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="pl.szczodrzynski.edziennik.SZKOLNY_MAIN" />
|
|
||||||
</intent-filter>
|
|
||||||
</receiver>
|
|
||||||
|
|
||||||
<service android:name=".api.v2.ApiService" />
|
<service android:name=".api.v2.ApiService" />
|
||||||
</application>
|
</application>
|
||||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
||||||
|
@ -31,57 +31,11 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
<h3>Wersja 3.1.1, 2019-10-09</h3>
|
<h3>Wersja 4.0, 2019-jeszcze-nie-wiem-kiedy</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Librus: poprawiona synchronizacja kategorii i kolorów ocen.</li>
|
<li>UWAGA. To jest wersja in-development. Wiele funkcji może nie działać prawidłowo (lub wcale), co oznacza tylko że nie zostały jeszcze przeniesione
|
||||||
<li>Zmieniony kolor dolnego paska w ciemnym motywie.</li>
|
z wersji 3.x. Proszę o cierpliwość oraz <b>nie udostępnianie</b> tej wersji <u>nikomu</u>.</li>
|
||||||
<li>Zaktualizowany licznik czasu lekcji.</li>
|
<li>Bardzo dużo zmian</li>
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3>Wersja 3.1, 2019-09-29</h3>
|
|
||||||
<ul>
|
|
||||||
<li>Poprawiony interfejs zadań domowych.</li>
|
|
||||||
<li>Librus: wyświetlanie komentarzy ocen.</li>
|
|
||||||
<li>Librus: wyświetlanie nieobecności nauczycieli w Terminarzu.</li>
|
|
||||||
<li>Librus: usprawniona synchronizacja ocen.</li>
|
|
||||||
<li>Poprawki angielskiego tłumaczenia.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3>Wersja 3.0.3, 2019-09-26</h3>
|
|
||||||
<ul>
|
|
||||||
<li>Librus: poprawka kilku błędów synchronizacji.</li>
|
|
||||||
<li>Vulcan: prawidłowe oznaczanie wiadomości jako przeczytana.</li>
|
|
||||||
<li>Vulcan: poprawiona synchronizacja wiadomości i frekwencji.</li>
|
|
||||||
<li>Vulcan: poprawka błędów logowania.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3>Wersja 3.0.2, 2019-09-24</h3>
|
|
||||||
<ul>
|
|
||||||
<li>Librus: pobieranie Bieżących ocen opisowych.</li>
|
|
||||||
<li>Poprawki UI: kolor ikon paska statusu w jasnym motywie.</li>
|
|
||||||
<li>Poprawka braku skanera QR do przekazywania powiadomień.</li>
|
|
||||||
<li>Poprawka wyboru koloru i daty własnego wydarzenia, które crashowały aplikację.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3>Wersja 3.0.1, 2019-09-19</h3>
|
|
||||||
<ul>
|
|
||||||
<li>Librus: Poprawa błędu synchronizacji.</li>
|
|
||||||
<li>Poprawki UI związane z paskiem nawigacji.</li>
|
|
||||||
<li>Mobidziennik: Pobieranie ocen w niektórych przedmiotach.</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h3>Wersja 3.0, 2019-09-13</h3>
|
|
||||||
<ul>
|
|
||||||
<li><b>Nowy wygląd i sposób nawigacji</b> w całej aplikacji.</li>
|
|
||||||
<li>Menu nawigacji można teraz otworzyć przyciskiem na <b>dolnym pasku</b>. Pociągnięcie w górę tego paska wyświetla <b>menu kontekstowe</b> dotyczące danego widoku.</li>
|
|
||||||
<li>Założyliśmy serwer Discord! <a href="https://discord.gg/n9e8pWr">https://discord.gg/n9e8pWr</a></li>
|
|
||||||
<br>
|
|
||||||
<li>Librus: poprawka powielonych ogłoszeń szkolnych.</li>
|
|
||||||
<li>Naprawiłem błąd nieskończonej synchronizacji w Vulcanie.</li>
|
|
||||||
<li>Naprawiłem crash launchera przy dodaniu widgetu.</li>
|
|
||||||
<li>Naprawiłem częste crashe związane z widokiem kalendarza.</li>
|
|
||||||
<li>Nowe, ładniejsze (choć trochę) motywy kolorów.</li>
|
|
||||||
<li>Dużo drobnych poprawek UI i działania aplikacji.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<!--<i>
|
<!--<i>
|
||||||
|
@ -36,6 +36,7 @@ import com.google.gson.Gson;
|
|||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonSyntaxException;
|
import com.google.gson.JsonSyntaxException;
|
||||||
|
import com.hypertrack.hyperlog.HyperLog;
|
||||||
import com.mikepenz.iconics.Iconics;
|
import com.mikepenz.iconics.Iconics;
|
||||||
import com.mikepenz.iconics.IconicsColor;
|
import com.mikepenz.iconics.IconicsColor;
|
||||||
import com.mikepenz.iconics.IconicsDrawable;
|
import com.mikepenz.iconics.IconicsDrawable;
|
||||||
@ -81,6 +82,7 @@ import pl.szczodrzynski.edziennik.network.NetworkUtils;
|
|||||||
import pl.szczodrzynski.edziennik.network.TLSSocketFactory;
|
import pl.szczodrzynski.edziennik.network.TLSSocketFactory;
|
||||||
import pl.szczodrzynski.edziennik.sync.SyncWorker;
|
import pl.szczodrzynski.edziennik.sync.SyncWorker;
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.base.CrashActivity;
|
import pl.szczodrzynski.edziennik.ui.modules.base.CrashActivity;
|
||||||
|
import pl.szczodrzynski.edziennik.utils.DebugLogFormat;
|
||||||
import pl.szczodrzynski.edziennik.utils.PermissionChecker;
|
import pl.szczodrzynski.edziennik.utils.PermissionChecker;
|
||||||
import pl.szczodrzynski.edziennik.utils.Themes;
|
import pl.szczodrzynski.edziennik.utils.Themes;
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils;
|
import pl.szczodrzynski.edziennik.utils.Utils;
|
||||||
@ -294,6 +296,10 @@ public class App extends androidx.multidex.MultiDexApplication implements Config
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (App.devMode || BuildConfig.DEBUG) {
|
if (App.devMode || BuildConfig.DEBUG) {
|
||||||
|
HyperLog.initialize(this);
|
||||||
|
HyperLog.setLogLevel(Log.VERBOSE);
|
||||||
|
HyperLog.setLogFormat(new DebugLogFormat(this));
|
||||||
|
|
||||||
ChuckerCollector chuckerCollector = new ChuckerCollector(this, true, RetentionManager.Period.ONE_HOUR);
|
ChuckerCollector chuckerCollector = new ChuckerCollector(this, true, RetentionManager.Period.ONE_HOUR);
|
||||||
ChuckerInterceptor chuckerInterceptor = new ChuckerInterceptor(this, chuckerCollector);
|
ChuckerInterceptor chuckerInterceptor = new ChuckerInterceptor(this, chuckerCollector);
|
||||||
httpBuilder.addInterceptor(chuckerInterceptor);
|
httpBuilder.addInterceptor(chuckerInterceptor);
|
||||||
|
@ -2,10 +2,15 @@ package pl.szczodrzynski.edziennik
|
|||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.app.ActivityManager
|
import android.app.ActivityManager
|
||||||
import android.content.*
|
import android.content.BroadcastReceiver
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.IntentFilter
|
||||||
|
import android.content.pm.PackageManager
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
import android.graphics.drawable.BitmapDrawable
|
import android.graphics.drawable.BitmapDrawable
|
||||||
import android.os.*
|
import android.os.*
|
||||||
|
import android.provider.Settings
|
||||||
import android.view.Gravity
|
import android.view.Gravity
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
@ -31,7 +36,6 @@ import org.greenrobot.eventbus.Subscribe
|
|||||||
import org.greenrobot.eventbus.ThreadMode
|
import org.greenrobot.eventbus.ThreadMode
|
||||||
import pl.droidsonroids.gif.GifDrawable
|
import pl.droidsonroids.gif.GifDrawable
|
||||||
import pl.szczodrzynski.edziennik.App.APP_URL
|
import pl.szczodrzynski.edziennik.App.APP_URL
|
||||||
import pl.szczodrzynski.edziennik.api.v2.ApiService
|
|
||||||
import pl.szczodrzynski.edziennik.api.v2.events.*
|
import pl.szczodrzynski.edziennik.api.v2.events.*
|
||||||
import pl.szczodrzynski.edziennik.api.v2.events.task.EdziennikTask
|
import pl.szczodrzynski.edziennik.api.v2.events.task.EdziennikTask
|
||||||
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface.*
|
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface.*
|
||||||
@ -64,6 +68,7 @@ import pl.szczodrzynski.edziennik.utils.Themes
|
|||||||
import pl.szczodrzynski.edziennik.utils.Utils
|
import pl.szczodrzynski.edziennik.utils.Utils
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.dpToPx
|
import pl.szczodrzynski.edziennik.utils.Utils.dpToPx
|
||||||
|
import pl.szczodrzynski.edziennik.utils.appManagerIntentList
|
||||||
import pl.szczodrzynski.edziennik.utils.models.NavTarget
|
import pl.szczodrzynski.edziennik.utils.models.NavTarget
|
||||||
import pl.szczodrzynski.navlib.*
|
import pl.szczodrzynski.navlib.*
|
||||||
import pl.szczodrzynski.navlib.SystemBarsUtil.Companion.COLOR_HALF_TRANSPARENT
|
import pl.szczodrzynski.navlib.SystemBarsUtil.Companion.COLOR_HALF_TRANSPARENT
|
||||||
@ -518,17 +523,14 @@ class MainActivity : AppCompatActivity() {
|
|||||||
fun syncCurrentFeature() {
|
fun syncCurrentFeature() {
|
||||||
swipeRefreshLayout.isRefreshing = true
|
swipeRefreshLayout.isRefreshing = true
|
||||||
Toast.makeText(this, fragmentToSyncName(navTargetId), Toast.LENGTH_SHORT).show()
|
Toast.makeText(this, fragmentToSyncName(navTargetId), Toast.LENGTH_SHORT).show()
|
||||||
ApiService.start(this)
|
|
||||||
val fragmentParam = when (navTargetId) {
|
val fragmentParam = when (navTargetId) {
|
||||||
DRAWER_ITEM_MESSAGES -> MessagesFragment.pageSelection
|
DRAWER_ITEM_MESSAGES -> MessagesFragment.pageSelection
|
||||||
else -> 0
|
else -> 0
|
||||||
}
|
}
|
||||||
EventBus.getDefault().postSticky(
|
EdziennikTask.syncProfile(
|
||||||
EdziennikTask.syncProfile(
|
App.profileId,
|
||||||
App.profileId,
|
listOf(navTargetId to fragmentParam)
|
||||||
listOf(navTargetId to fragmentParam)
|
).enqueue(this)
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||||
fun onSyncStartedEvent(event: ApiTaskStartedEvent) {
|
fun onSyncStartedEvent(event: ApiTaskStartedEvent) {
|
||||||
@ -582,29 +584,18 @@ class MainActivity : AppCompatActivity() {
|
|||||||
.setMessage(R.string.app_manager_dialog_text)
|
.setMessage(R.string.app_manager_dialog_text)
|
||||||
.setPositiveButton(R.string.ok) { dialog, which ->
|
.setPositiveButton(R.string.ok) { dialog, which ->
|
||||||
try {
|
try {
|
||||||
val intent = Intent()
|
for (intent in appManagerIntentList) {
|
||||||
intent.component = ComponentName(
|
if (packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) {
|
||||||
"com.huawei.systemmanager",
|
startActivity(intent)
|
||||||
"com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity"
|
|
||||||
)
|
|
||||||
startActivity(intent)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
try {
|
|
||||||
val intent = Intent()
|
|
||||||
intent.component = ComponentName(
|
|
||||||
"com.asus.mobilemanager",
|
|
||||||
"com.asus.mobilemanager.MainActivity"
|
|
||||||
)
|
|
||||||
startActivity(intent)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
try {
|
|
||||||
startActivity(Intent(android.provider.Settings.ACTION_SETTINGS))
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
Toast.makeText(this, R.string.app_manager_open_failed, Toast.LENGTH_SHORT).show()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
try {
|
||||||
|
startActivity(Intent(Settings.ACTION_SETTINGS))
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
Toast.makeText(this, R.string.app_manager_open_failed, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.setNeutralButton(R.string.dont_ask_again) { dialog, which ->
|
.setNeutralButton(R.string.dont_ask_again) { dialog, which ->
|
||||||
@ -788,7 +779,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
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(id: Int, drawerSelection: Int, arguments: Bundle? = null) {
|
fun loadProfile(id: Int, drawerSelection: Int, arguments: Bundle? = null) {
|
||||||
d("NavDebug", "loadProfile(id = $id, drawerSelection = $drawerSelection)")
|
//d("NavDebug", "loadProfile(id = $id, drawerSelection = $drawerSelection)")
|
||||||
if (app.profile != null && App.profileId == id) {
|
if (app.profile != null && App.profileId == id) {
|
||||||
drawer.currentProfile = app.profile.id
|
drawer.currentProfile = app.profile.id
|
||||||
loadTarget(drawerSelection, arguments)
|
loadTarget(drawerSelection, arguments)
|
||||||
|
@ -90,6 +90,7 @@ class ApiService : Service() {
|
|||||||
errorList.add(apiError)
|
errorList.add(apiError)
|
||||||
apiError.throwable?.printStackTrace()
|
apiError.throwable?.printStackTrace()
|
||||||
if (apiError.isCritical) {
|
if (apiError.isCritical) {
|
||||||
|
taskRunning?.cancel()
|
||||||
notification.setCriticalError().post()
|
notification.setCriticalError().post()
|
||||||
taskRunning = null
|
taskRunning = null
|
||||||
taskIsRunning = false
|
taskIsRunning = false
|
||||||
@ -154,10 +155,14 @@ class ApiService : Service() {
|
|||||||
// post an event
|
// post an event
|
||||||
EventBus.getDefault().post(ApiTaskStartedEvent(taskProfileId, task.profile))
|
EventBus.getDefault().post(ApiTaskStartedEvent(taskProfileId, task.profile))
|
||||||
|
|
||||||
when (task) {
|
try {
|
||||||
is EdziennikTask -> task.run(app, taskCallback)
|
when (task) {
|
||||||
is NotifyTask -> task.run(app, taskCallback)
|
is EdziennikTask -> task.run(app, taskCallback)
|
||||||
is ErrorReportTask -> task.run(app, taskCallback, notification, errorList)
|
is NotifyTask -> task.run(app, taskCallback)
|
||||||
|
is ErrorReportTask -> task.run(app, taskCallback, notification, errorList)
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
taskCallback.onError(ApiError(TAG, EXCEPTION_API_TASK).withThrowable(e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -227,11 +232,13 @@ class ApiService : Service() {
|
|||||||
____) | __/ | \ V /| | (_| __/ | (_) \ V / __/ | | | | | (_| | __/\__ \
|
____) | __/ | \ V /| | (_| __/ | (_) \ V / __/ | | | | | (_| | __/\__ \
|
||||||
|_____/ \___|_| \_/ |_|\___\___| \___/ \_/ \___|_| |_| |_|\__,_|\___||__*/
|
|_____/ \___|_| \_/ |_|\___\___| \___/ \_/ \___|_| |_| |_|\__,_|\___||__*/
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
|
d(TAG, "Service created")
|
||||||
EventBus.getDefault().register(this)
|
EventBus.getDefault().register(this)
|
||||||
notification.setIdle().setCloseAction()
|
notification.setIdle().setCloseAction()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||||
|
d(TAG, "Foreground service onStartCommand")
|
||||||
startForeground(EdziennikNotification.NOTIFICATION_ID, notification.notification)
|
startForeground(EdziennikNotification.NOTIFICATION_ID, notification.notification)
|
||||||
return START_NOT_STICKY
|
return START_NOT_STICKY
|
||||||
}
|
}
|
||||||
|
@ -150,6 +150,7 @@ const val ERROR_IDZIENNIK_API_OTHER = 451
|
|||||||
|
|
||||||
const val ERROR_TEMPLATE_WEB_OTHER = 801
|
const val ERROR_TEMPLATE_WEB_OTHER = 801
|
||||||
|
|
||||||
|
const val EXCEPTION_API_TASK = 900
|
||||||
const val EXCEPTION_LOGIN_LIBRUS_API_TOKEN = 901
|
const val EXCEPTION_LOGIN_LIBRUS_API_TOKEN = 901
|
||||||
const val EXCEPTION_LOGIN_LIBRUS_PORTAL_TOKEN = 902
|
const val EXCEPTION_LOGIN_LIBRUS_PORTAL_TOKEN = 902
|
||||||
const val EXCEPTION_LIBRUS_PORTAL_SYNERGIA_TOKEN = 903
|
const val EXCEPTION_LIBRUS_PORTAL_SYNERGIA_TOKEN = 903
|
||||||
|
@ -6,6 +6,8 @@ package pl.szczodrzynski.edziennik.api.v2.events.task
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.os.Build.VERSION.SDK_INT
|
||||||
|
import android.os.Build.VERSION_CODES.O
|
||||||
import org.greenrobot.eventbus.EventBus
|
import org.greenrobot.eventbus.EventBus
|
||||||
import pl.szczodrzynski.edziennik.App
|
import pl.szczodrzynski.edziennik.App
|
||||||
import pl.szczodrzynski.edziennik.api.v2.ApiService
|
import pl.szczodrzynski.edziennik.api.v2.ApiService
|
||||||
@ -25,7 +27,12 @@ abstract class IApiTask(open val profileId: Int) {
|
|||||||
abstract fun cancel()
|
abstract fun cancel()
|
||||||
|
|
||||||
fun enqueue(context: Context) {
|
fun enqueue(context: Context) {
|
||||||
context.startService(Intent(context, ApiService::class.java))
|
Intent(context, ApiService::class.java).let {
|
||||||
|
if (SDK_INT >= O)
|
||||||
|
context.startForegroundService(it)
|
||||||
|
else
|
||||||
|
context.startService(it)
|
||||||
|
}
|
||||||
EventBus.getDefault().postSticky(this)
|
EventBus.getDefault().postSticky(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,43 +41,43 @@ class IdziennikData(val data: DataIdziennik, val onSuccess: () -> Unit) {
|
|||||||
when (endpointId) {
|
when (endpointId) {
|
||||||
ENDPOINT_IDZIENNIK_WEB_TIMETABLE -> {
|
ENDPOINT_IDZIENNIK_WEB_TIMETABLE -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_timetable)
|
data.startProgress(R.string.edziennik_progress_endpoint_timetable)
|
||||||
IdziennikWebTimetable(data) { onSuccess() }
|
IdziennikWebTimetable(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_IDZIENNIK_WEB_GRADES -> {
|
ENDPOINT_IDZIENNIK_WEB_GRADES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_grades)
|
data.startProgress(R.string.edziennik_progress_endpoint_grades)
|
||||||
IdziennikWebGrades(data) { onSuccess() }
|
IdziennikWebGrades(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_IDZIENNIK_WEB_PROPOSED_GRADES -> {
|
ENDPOINT_IDZIENNIK_WEB_PROPOSED_GRADES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_proposed_grades)
|
data.startProgress(R.string.edziennik_progress_endpoint_proposed_grades)
|
||||||
IdziennikWebProposedGrades(data) { onSuccess() }
|
IdziennikWebProposedGrades(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_IDZIENNIK_WEB_EXAMS -> {
|
ENDPOINT_IDZIENNIK_WEB_EXAMS -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_exams)
|
data.startProgress(R.string.edziennik_progress_endpoint_exams)
|
||||||
IdziennikWebExams(data) { onSuccess() }
|
IdziennikWebExams(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_IDZIENNIK_WEB_NOTICES -> {
|
ENDPOINT_IDZIENNIK_WEB_NOTICES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_notices)
|
data.startProgress(R.string.edziennik_progress_endpoint_notices)
|
||||||
IdziennikWebNotices(data) { onSuccess() }
|
IdziennikWebNotices(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_IDZIENNIK_WEB_ANNOUNCEMENTS -> {
|
ENDPOINT_IDZIENNIK_WEB_ANNOUNCEMENTS -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_announcements)
|
data.startProgress(R.string.edziennik_progress_endpoint_announcements)
|
||||||
IdziennikWebAnnouncements(data) { onSuccess() }
|
IdziennikWebAnnouncements(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_IDZIENNIK_WEB_ATTENDANCE -> {
|
ENDPOINT_IDZIENNIK_WEB_ATTENDANCE -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_attendance)
|
data.startProgress(R.string.edziennik_progress_endpoint_attendance)
|
||||||
IdziennikWebAttendance(data) { onSuccess() }
|
IdziennikWebAttendance(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_IDZIENNIK_API_CURRENT_REGISTER -> {
|
ENDPOINT_IDZIENNIK_API_CURRENT_REGISTER -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_lucky_number)
|
data.startProgress(R.string.edziennik_progress_endpoint_lucky_number)
|
||||||
IdziennikApiCurrentRegister(data) { onSuccess() }
|
IdziennikApiCurrentRegister(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_IDZIENNIK_API_MESSAGES_INBOX -> {
|
ENDPOINT_IDZIENNIK_API_MESSAGES_INBOX -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox)
|
data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox)
|
||||||
IdziennikApiMessagesInbox(data) { onSuccess() }
|
IdziennikApiMessagesInbox(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_IDZIENNIK_API_MESSAGES_SENT -> {
|
ENDPOINT_IDZIENNIK_API_MESSAGES_SENT -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_messages_outbox)
|
data.startProgress(R.string.edziennik_progress_endpoint_messages_outbox)
|
||||||
IdziennikApiMessagesSent(data) { onSuccess() }
|
IdziennikApiMessagesSent(data, onSuccess)
|
||||||
}
|
}
|
||||||
else -> onSuccess()
|
else -> onSuccess()
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
package pl.szczodrzynski.edziennik.api.v2.librus
|
package pl.szczodrzynski.edziennik.api.v2.librus
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.App
|
import pl.szczodrzynski.edziennik.App
|
||||||
import pl.szczodrzynski.edziennik.api.v2.CODE_INTERNAL_LIBRUS_ACCOUNT_410
|
import pl.szczodrzynski.edziennik.api.v2.*
|
||||||
import pl.szczodrzynski.edziennik.api.v2.interfaces.EdziennikCallback
|
import pl.szczodrzynski.edziennik.api.v2.interfaces.EdziennikCallback
|
||||||
import pl.szczodrzynski.edziennik.api.v2.interfaces.EdziennikInterface
|
import pl.szczodrzynski.edziennik.api.v2.interfaces.EdziennikInterface
|
||||||
import pl.szczodrzynski.edziennik.api.v2.librus.data.LibrusData
|
import pl.szczodrzynski.edziennik.api.v2.librus.data.LibrusData
|
||||||
@ -14,9 +14,7 @@ import pl.szczodrzynski.edziennik.api.v2.librus.firstlogin.LibrusFirstLogin
|
|||||||
import pl.szczodrzynski.edziennik.api.v2.librus.login.LibrusLogin
|
import pl.szczodrzynski.edziennik.api.v2.librus.login.LibrusLogin
|
||||||
import pl.szczodrzynski.edziennik.api.v2.librus.login.LibrusLoginApi
|
import pl.szczodrzynski.edziennik.api.v2.librus.login.LibrusLoginApi
|
||||||
import pl.szczodrzynski.edziennik.api.v2.librus.login.LibrusLoginSynergia
|
import pl.szczodrzynski.edziennik.api.v2.librus.login.LibrusLoginSynergia
|
||||||
import pl.szczodrzynski.edziennik.api.v2.librusLoginMethods
|
|
||||||
import pl.szczodrzynski.edziennik.api.v2.models.ApiError
|
import pl.szczodrzynski.edziennik.api.v2.models.ApiError
|
||||||
import pl.szczodrzynski.edziennik.api.v2.prepare
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.modules.login.LoginStore
|
import pl.szczodrzynski.edziennik.data.db.modules.login.LoginStore
|
||||||
import pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile
|
import pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||||
@ -53,12 +51,28 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
|
|||||||
|__*/
|
|__*/
|
||||||
override fun sync(featureIds: List<Int>, viewId: Int?) {
|
override fun sync(featureIds: List<Int>, viewId: Int?) {
|
||||||
data.prepare(librusLoginMethods, LibrusFeatures, featureIds, viewId)
|
data.prepare(librusLoginMethods, LibrusFeatures, featureIds, viewId)
|
||||||
d(TAG, "LoginMethod IDs: ${data.targetLoginMethodIds}")
|
login()
|
||||||
d(TAG, "Endpoint IDs: ${data.targetEndpointIds}")
|
}
|
||||||
|
|
||||||
|
private fun login() {
|
||||||
|
d(TAG, "Trying to login with ${data.targetLoginMethodIds}")
|
||||||
|
if (internalErrorList.isNotEmpty()) {
|
||||||
|
d(TAG, " - Internal errors:")
|
||||||
|
internalErrorList.forEach { d(TAG, " - code $it") }
|
||||||
|
}
|
||||||
LibrusLogin(data) {
|
LibrusLogin(data) {
|
||||||
LibrusData(data) {
|
data()
|
||||||
completed()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun data() {
|
||||||
|
d(TAG, "Endpoint IDs: ${data.targetEndpointIds}")
|
||||||
|
if (internalErrorList.isNotEmpty()) {
|
||||||
|
d(TAG, " - Internal errors:")
|
||||||
|
internalErrorList.forEach { d(TAG, " - code $it") }
|
||||||
|
}
|
||||||
|
LibrusData(data) {
|
||||||
|
completed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,15 +116,67 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onError(apiError: ApiError) {
|
override fun onError(apiError: ApiError) {
|
||||||
|
if (apiError.errorCode in internalErrorList) {
|
||||||
|
// finish immediately if the same error occurs twice during the same sync
|
||||||
|
callback.onError(apiError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
internalErrorList.add(apiError.errorCode)
|
||||||
when (apiError.errorCode) {
|
when (apiError.errorCode) {
|
||||||
in internalErrorList -> {
|
ERROR_LIBRUS_PORTAL_ACCESS_DENIED -> {
|
||||||
// finish immediately if the same error occurs twice during the same sync
|
data.loginMethods.remove(LOGIN_METHOD_LIBRUS_PORTAL)
|
||||||
callback.onError(apiError)
|
data.targetLoginMethodIds.add(LOGIN_METHOD_LIBRUS_PORTAL)
|
||||||
|
data.targetLoginMethodIds.sort()
|
||||||
|
data.portalTokenExpiryTime = 0
|
||||||
|
login()
|
||||||
}
|
}
|
||||||
CODE_INTERNAL_LIBRUS_ACCOUNT_410 -> {
|
ERROR_LIBRUS_API_ACCESS_DENIED,
|
||||||
internalErrorList.add(apiError.errorCode)
|
ERROR_LIBRUS_API_TOKEN_EXPIRED -> {
|
||||||
loginStore.removeLoginData("refreshToken") // force a clean login
|
data.loginMethods.remove(LOGIN_METHOD_LIBRUS_API)
|
||||||
//loginLibrus()
|
data.targetLoginMethodIds.add(LOGIN_METHOD_LIBRUS_API)
|
||||||
|
data.targetLoginMethodIds.sort()
|
||||||
|
data.apiTokenExpiryTime = 0
|
||||||
|
login()
|
||||||
|
}
|
||||||
|
ERROR_LIBRUS_SYNERGIA_ACCESS_DENIED -> {
|
||||||
|
data.loginMethods.remove(LOGIN_METHOD_LIBRUS_SYNERGIA)
|
||||||
|
data.targetLoginMethodIds.add(LOGIN_METHOD_LIBRUS_SYNERGIA)
|
||||||
|
data.targetLoginMethodIds.sort()
|
||||||
|
data.synergiaSessionIdExpiryTime = 0
|
||||||
|
login()
|
||||||
|
}
|
||||||
|
ERROR_LIBRUS_MESSAGES_ACCESS_DENIED -> {
|
||||||
|
data.loginMethods.remove(LOGIN_METHOD_LIBRUS_MESSAGES)
|
||||||
|
data.targetLoginMethodIds.add(LOGIN_METHOD_LIBRUS_MESSAGES)
|
||||||
|
data.targetLoginMethodIds.sort()
|
||||||
|
data.messagesSessionIdExpiryTime = 0
|
||||||
|
login()
|
||||||
|
}
|
||||||
|
ERROR_LOGIN_LIBRUS_PORTAL_NO_CODE,
|
||||||
|
ERROR_LOGIN_LIBRUS_PORTAL_CSRF_MISSING,
|
||||||
|
ERROR_LOGIN_LIBRUS_PORTAL_CODE_REVOKED,
|
||||||
|
ERROR_LOGIN_LIBRUS_PORTAL_CODE_EXPIRED -> {
|
||||||
|
login()
|
||||||
|
}
|
||||||
|
ERROR_LOGIN_LIBRUS_PORTAL_NO_REFRESH,
|
||||||
|
ERROR_LOGIN_LIBRUS_PORTAL_REFRESH_REVOKED,
|
||||||
|
ERROR_LOGIN_LIBRUS_PORTAL_REFRESH_INVALID -> {
|
||||||
|
data.portalRefreshToken = null
|
||||||
|
login()
|
||||||
|
}
|
||||||
|
ERROR_LOGIN_LIBRUS_SYNERGIA_TOKEN_INVALID,
|
||||||
|
ERROR_LOGIN_LIBRUS_SYNERGIA_NO_TOKEN,
|
||||||
|
ERROR_LOGIN_LIBRUS_SYNERGIA_NO_SESSION_ID -> {
|
||||||
|
login()
|
||||||
|
}
|
||||||
|
ERROR_LOGIN_LIBRUS_MESSAGES_NO_SESSION_ID -> {
|
||||||
|
login()
|
||||||
|
}
|
||||||
|
// TODO PORTAL CAPTCHA
|
||||||
|
ERROR_LIBRUS_API_TIMETABLE_NOT_PUBLIC,
|
||||||
|
ERROR_LIBRUS_API_LUCKY_NUMBER_NOT_ACTIVE,
|
||||||
|
ERROR_LIBRUS_API_NOTES_NOT_ACTIVE -> {
|
||||||
|
data()
|
||||||
}
|
}
|
||||||
else -> callback.onError(apiError)
|
else -> callback.onError(apiError)
|
||||||
}
|
}
|
||||||
|
@ -45,92 +45,96 @@ class LibrusData(val data: DataLibrus, val onSuccess: () -> Unit) {
|
|||||||
*/
|
*/
|
||||||
ENDPOINT_LIBRUS_API_ME -> {
|
ENDPOINT_LIBRUS_API_ME -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_student_info)
|
data.startProgress(R.string.edziennik_progress_endpoint_student_info)
|
||||||
LibrusApiMe(data) { onSuccess() }
|
LibrusApiMe(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_SCHOOLS -> {
|
ENDPOINT_LIBRUS_API_SCHOOLS -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_school_info)
|
data.startProgress(R.string.edziennik_progress_endpoint_school_info)
|
||||||
LibrusApiSchools(data) { onSuccess() }
|
LibrusApiSchools(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_CLASSES -> {
|
ENDPOINT_LIBRUS_API_CLASSES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_classes)
|
data.startProgress(R.string.edziennik_progress_endpoint_classes)
|
||||||
LibrusApiClasses(data) { onSuccess() }
|
LibrusApiClasses(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_VIRTUAL_CLASSES -> {
|
ENDPOINT_LIBRUS_API_VIRTUAL_CLASSES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_teams)
|
data.startProgress(R.string.edziennik_progress_endpoint_teams)
|
||||||
LibrusApiVirtualClasses(data) { onSuccess() }
|
LibrusApiVirtualClasses(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_UNITS -> {
|
ENDPOINT_LIBRUS_API_UNITS -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_units)
|
data.startProgress(R.string.edziennik_progress_endpoint_units)
|
||||||
LibrusApiUnits(data) { onSuccess() }
|
LibrusApiUnits(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_USERS -> {
|
ENDPOINT_LIBRUS_API_USERS -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_teachers)
|
data.startProgress(R.string.edziennik_progress_endpoint_teachers)
|
||||||
LibrusApiUsers(data) { onSuccess() }
|
LibrusApiUsers(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_SUBJECTS -> {
|
ENDPOINT_LIBRUS_API_SUBJECTS -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_subjects)
|
data.startProgress(R.string.edziennik_progress_endpoint_subjects)
|
||||||
LibrusApiSubjects(data) { onSuccess() }
|
LibrusApiSubjects(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_CLASSROOMS -> {
|
ENDPOINT_LIBRUS_API_CLASSROOMS -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_classrooms)
|
data.startProgress(R.string.edziennik_progress_endpoint_classrooms)
|
||||||
LibrusApiClassrooms(data) { onSuccess() }
|
LibrusApiClassrooms(data, onSuccess)
|
||||||
}
|
}
|
||||||
// TODO push config
|
// TODO push config
|
||||||
// TODO timetable
|
// TODO timetable
|
||||||
|
|
||||||
ENDPOINT_LIBRUS_API_NORMAL_GRADES -> {
|
ENDPOINT_LIBRUS_API_NORMAL_GRADES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_grades)
|
data.startProgress(R.string.edziennik_progress_endpoint_grades)
|
||||||
LibrusApiGrades(data) { onSuccess() }
|
LibrusApiGrades(data, onSuccess)
|
||||||
|
}
|
||||||
|
ENDPOINT_LIBRUS_API_NORMAL_GC -> {
|
||||||
|
data.startProgress(R.string.edziennik_progress_endpoint_grade_categories)
|
||||||
|
LibrusApiGradeCategories(data, onSuccess)
|
||||||
}
|
}
|
||||||
// TODO grades
|
// TODO grades
|
||||||
|
|
||||||
ENDPOINT_LIBRUS_API_EVENT_TYPES -> {
|
ENDPOINT_LIBRUS_API_EVENT_TYPES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_event_types)
|
data.startProgress(R.string.edziennik_progress_endpoint_event_types)
|
||||||
LibrusApiEventTypes(data) { onSuccess() }
|
LibrusApiEventTypes(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_EVENTS -> {
|
ENDPOINT_LIBRUS_API_EVENTS -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_events)
|
data.startProgress(R.string.edziennik_progress_endpoint_events)
|
||||||
LibrusApiEvents(data) { onSuccess() }
|
LibrusApiEvents(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_HOMEWORK -> {
|
ENDPOINT_LIBRUS_API_HOMEWORK -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_homework)
|
data.startProgress(R.string.edziennik_progress_endpoint_homework)
|
||||||
LibrusApiHomework(data) { onSuccess() }
|
LibrusApiHomework(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_LUCKY_NUMBER -> {
|
ENDPOINT_LIBRUS_API_LUCKY_NUMBER -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_lucky_number)
|
data.startProgress(R.string.edziennik_progress_endpoint_lucky_number)
|
||||||
LibrusApiLuckyNumber(data) { onSuccess() }
|
LibrusApiLuckyNumber(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_NOTICE_TYPES -> {
|
ENDPOINT_LIBRUS_API_NOTICE_TYPES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_notice_types)
|
data.startProgress(R.string.edziennik_progress_endpoint_notice_types)
|
||||||
LibrusApiNoticeTypes(data) { onSuccess() }
|
LibrusApiNoticeTypes(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_NOTICES -> {
|
ENDPOINT_LIBRUS_API_NOTICES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_notices)
|
data.startProgress(R.string.edziennik_progress_endpoint_notices)
|
||||||
LibrusApiNotices(data) { onSuccess() }
|
LibrusApiNotices(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES -> {
|
ENDPOINT_LIBRUS_API_ATTENDANCE_TYPES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_attendance_types)
|
data.startProgress(R.string.edziennik_progress_endpoint_attendance_types)
|
||||||
LibrusApiAttendanceTypes(data) { onSuccess() }
|
LibrusApiAttendanceTypes(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_ATTENDANCES -> {
|
ENDPOINT_LIBRUS_API_ATTENDANCES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_attendance)
|
data.startProgress(R.string.edziennik_progress_endpoint_attendance)
|
||||||
LibrusApiAttendances(data) { onSuccess() }
|
LibrusApiAttendances(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_ANNOUNCEMENTS -> {
|
ENDPOINT_LIBRUS_API_ANNOUNCEMENTS -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_announcements)
|
data.startProgress(R.string.edziennik_progress_endpoint_announcements)
|
||||||
LibrusApiAnnouncements(data) { onSuccess() }
|
LibrusApiAnnouncements(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_PT_MEETINGS -> {
|
ENDPOINT_LIBRUS_API_PT_MEETINGS -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_pt_meetings)
|
data.startProgress(R.string.edziennik_progress_endpoint_pt_meetings)
|
||||||
LibrusApiPtMeetings(data) { onSuccess() }
|
LibrusApiPtMeetings(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_TEACHER_FREE_DAY_TYPES -> {
|
ENDPOINT_LIBRUS_API_TEACHER_FREE_DAY_TYPES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_teacher_free_day_types)
|
data.startProgress(R.string.edziennik_progress_endpoint_teacher_free_day_types)
|
||||||
LibrusApiTeacherFreeDayTypes(data) { onSuccess() }
|
LibrusApiTeacherFreeDayTypes(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_API_TEACHER_FREE_DAYS -> {
|
ENDPOINT_LIBRUS_API_TEACHER_FREE_DAYS -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_teacher_free_days)
|
data.startProgress(R.string.edziennik_progress_endpoint_teacher_free_days)
|
||||||
LibrusApiTeacherFreeDays(data) { onSuccess() }
|
LibrusApiTeacherFreeDays(data, onSuccess)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -138,11 +142,11 @@ class LibrusData(val data: DataLibrus, val onSuccess: () -> Unit) {
|
|||||||
*/
|
*/
|
||||||
ENDPOINT_LIBRUS_SYNERGIA_HOMEWORK -> {
|
ENDPOINT_LIBRUS_SYNERGIA_HOMEWORK -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_homework)
|
data.startProgress(R.string.edziennik_progress_endpoint_homework)
|
||||||
LibrusSynergiaHomework(data) { onSuccess() }
|
LibrusSynergiaHomework(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_LIBRUS_SYNERGIA_INFO -> {
|
ENDPOINT_LIBRUS_SYNERGIA_INFO -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_student_info)
|
data.startProgress(R.string.edziennik_progress_endpoint_student_info)
|
||||||
LibrusSynergiaInfo(data) { onSuccess() }
|
LibrusSynergiaInfo(data, onSuccess)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -150,11 +154,11 @@ class LibrusData(val data: DataLibrus, val onSuccess: () -> Unit) {
|
|||||||
*/
|
*/
|
||||||
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)
|
||||||
LibrusMessagesGetList(data, type = Message.TYPE_RECEIVED) { onSuccess() }
|
LibrusMessagesGetList(data, type = Message.TYPE_RECEIVED, 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)
|
||||||
LibrusMessagesGetList(data, type = Message.TYPE_SENT) { onSuccess() }
|
LibrusMessagesGetList(data, type = Message.TYPE_SENT, onSuccess = onSuccess)
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> onSuccess()
|
else -> onSuccess()
|
||||||
|
@ -12,13 +12,17 @@ import okhttp3.Cookie
|
|||||||
import org.jsoup.Jsoup
|
import org.jsoup.Jsoup
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
import org.jsoup.parser.Parser
|
import org.jsoup.parser.Parser
|
||||||
import org.redundent.kotlin.xml.PrintOptions
|
|
||||||
import org.redundent.kotlin.xml.xml
|
|
||||||
import pl.szczodrzynski.edziennik.api.v2.*
|
import pl.szczodrzynski.edziennik.api.v2.*
|
||||||
import pl.szczodrzynski.edziennik.api.v2.librus.DataLibrus
|
import pl.szczodrzynski.edziennik.api.v2.librus.DataLibrus
|
||||||
import pl.szczodrzynski.edziennik.api.v2.models.ApiError
|
import pl.szczodrzynski.edziennik.api.v2.models.ApiError
|
||||||
import pl.szczodrzynski.edziennik.get
|
import pl.szczodrzynski.edziennik.get
|
||||||
import pl.szczodrzynski.edziennik.utils.Utils.d
|
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||||
|
import java.io.StringWriter
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory
|
||||||
|
import javax.xml.transform.OutputKeys
|
||||||
|
import javax.xml.transform.TransformerFactory
|
||||||
|
import javax.xml.transform.dom.DOMSource
|
||||||
|
import javax.xml.transform.stream.StreamResult
|
||||||
|
|
||||||
open class LibrusMessages(open val data: DataLibrus) {
|
open class LibrusMessages(open val data: DataLibrus) {
|
||||||
companion object {
|
companion object {
|
||||||
@ -80,7 +84,27 @@ open class LibrusMessages(open val data: DataLibrus) {
|
|||||||
.secure().httpOnly().build()
|
.secure().httpOnly().build()
|
||||||
))
|
))
|
||||||
|
|
||||||
val requestXml = xml("service") {
|
|
||||||
|
val docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
|
||||||
|
val doc = docBuilder.newDocument()
|
||||||
|
val serviceElement = doc.createElement("service")
|
||||||
|
val headerElement = doc.createElement("header")
|
||||||
|
val dataElement = doc.createElement("data")
|
||||||
|
for ((key, value) in parameters.orEmpty()) {
|
||||||
|
val element = doc.createElement(key)
|
||||||
|
element.appendChild(doc.createTextNode(value.toString()))
|
||||||
|
dataElement.appendChild(element)
|
||||||
|
}
|
||||||
|
serviceElement.appendChild(headerElement)
|
||||||
|
serviceElement.appendChild(dataElement)
|
||||||
|
doc.appendChild(serviceElement)
|
||||||
|
val transformer = TransformerFactory.newInstance().newTransformer()
|
||||||
|
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes")
|
||||||
|
val stringWriter = StringWriter()
|
||||||
|
transformer.transform(DOMSource(doc), StreamResult(stringWriter))
|
||||||
|
val requestXml = stringWriter.toString()
|
||||||
|
|
||||||
|
/*val requestXml = xml("service") {
|
||||||
"header" { }
|
"header" { }
|
||||||
"data" {
|
"data" {
|
||||||
for ((key, value) in parameters.orEmpty()) {
|
for ((key, value) in parameters.orEmpty()) {
|
||||||
@ -92,7 +116,7 @@ open class LibrusMessages(open val data: DataLibrus) {
|
|||||||
}.toString(PrintOptions(
|
}.toString(PrintOptions(
|
||||||
singleLineTextElements = true,
|
singleLineTextElements = true,
|
||||||
useSelfClosingTags = true
|
useSelfClosingTags = true
|
||||||
))
|
))*/
|
||||||
|
|
||||||
Request.builder()
|
Request.builder()
|
||||||
.url("$LIBRUS_MESSAGES_URL/$endpoint")
|
.url("$LIBRUS_MESSAGES_URL/$endpoint")
|
||||||
|
@ -44,7 +44,10 @@ open class LibrusPortal(open val data: DataLibrus) {
|
|||||||
"Access token is invalid" -> ERROR_LIBRUS_PORTAL_ACCESS_DENIED
|
"Access token is invalid" -> ERROR_LIBRUS_PORTAL_ACCESS_DENIED
|
||||||
"ApiDisabled" -> ERROR_LIBRUS_PORTAL_API_DISABLED
|
"ApiDisabled" -> ERROR_LIBRUS_PORTAL_API_DISABLED
|
||||||
"Account not found" -> ERROR_LIBRUS_PORTAL_SYNERGIA_NOT_FOUND
|
"Account not found" -> ERROR_LIBRUS_PORTAL_SYNERGIA_NOT_FOUND
|
||||||
else -> ERROR_LIBRUS_PORTAL_OTHER
|
else -> when (json.getString("hint")) {
|
||||||
|
"Error while decoding to JSON" -> ERROR_LIBRUS_PORTAL_ACCESS_DENIED
|
||||||
|
else -> ERROR_LIBRUS_PORTAL_OTHER
|
||||||
|
}
|
||||||
}.let { errorCode ->
|
}.let { errorCode ->
|
||||||
data.error(ApiError(tag, errorCode)
|
data.error(ApiError(tag, errorCode)
|
||||||
.withApiResponse(json)
|
.withApiResponse(json)
|
||||||
|
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2019-11-5
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.api.v2.librus.data.api
|
||||||
|
|
||||||
|
import android.graphics.Color
|
||||||
|
import pl.szczodrzynski.edziennik.*
|
||||||
|
import pl.szczodrzynski.edziennik.api.v2.librus.DataLibrus
|
||||||
|
import pl.szczodrzynski.edziennik.api.v2.librus.ENDPOINT_LIBRUS_API_NORMAL_GC
|
||||||
|
import pl.szczodrzynski.edziennik.api.v2.librus.data.LibrusApi
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.api.SYNC_ALWAYS
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.grades.GradeCategory
|
||||||
|
|
||||||
|
class LibrusApiGradeCategories(override val data: DataLibrus,
|
||||||
|
val onSuccess: () -> Unit) : LibrusApi(data) {
|
||||||
|
companion object {
|
||||||
|
const val TAG = "LibrusApiGradeCategories"
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
apiGet(TAG, "Grades/Categories") { json ->
|
||||||
|
json.getJsonArray("Categories")?.asJsonObjectList()?.forEach { category ->
|
||||||
|
val id = category.getLong("Id") ?: return@forEach
|
||||||
|
val name = category.getString("Name") ?: ""
|
||||||
|
val weight = when (category.getBoolean("CountToTheAverage")) {
|
||||||
|
true -> category.getFloat("Weight") ?: 0f
|
||||||
|
else -> 0f
|
||||||
|
}
|
||||||
|
val color = category.getJsonObject("Color")?.getInt("Id")
|
||||||
|
?.let { data.getColor(it) } ?: Color.BLUE
|
||||||
|
|
||||||
|
val gradeCategoryObject = GradeCategory(
|
||||||
|
profileId,
|
||||||
|
id,
|
||||||
|
weight,
|
||||||
|
color,
|
||||||
|
name
|
||||||
|
)
|
||||||
|
|
||||||
|
data.gradeCategories.put(id, gradeCategoryObject)
|
||||||
|
}
|
||||||
|
|
||||||
|
data.setSyncNext(ENDPOINT_LIBRUS_API_NORMAL_GC, SYNC_ALWAYS)
|
||||||
|
onSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -42,7 +42,7 @@ class MobidziennikData(val data: DataMobidziennik, val onSuccess: () -> Unit) {
|
|||||||
when (endpointId) {
|
when (endpointId) {
|
||||||
ENDPOINT_MOBIDZIENNIK_API_MAIN -> {
|
ENDPOINT_MOBIDZIENNIK_API_MAIN -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_data)
|
data.startProgress(R.string.edziennik_progress_endpoint_data)
|
||||||
MobidziennikApi(data) { onSuccess() }
|
MobidziennikApi(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_MOBIDZIENNIK_WEB_MESSAGES_INBOX -> {
|
ENDPOINT_MOBIDZIENNIK_WEB_MESSAGES_INBOX -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox)
|
data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox)
|
||||||
|
@ -390,8 +390,6 @@ open class Data(val app: App, val profile: Profile?, val loginStore: LoginStore)
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun error(apiError: ApiError) {
|
fun error(apiError: ApiError) {
|
||||||
if (apiError.isCritical)
|
|
||||||
cancel()
|
|
||||||
callback.onError(apiError)
|
callback.onError(apiError)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,35 +38,39 @@ class VulcanData(val data: DataVulcan, val onSuccess: () -> Unit) {
|
|||||||
when (endpointId) {
|
when (endpointId) {
|
||||||
ENDPOINT_VULCAN_API_DICTIONARIES -> {
|
ENDPOINT_VULCAN_API_DICTIONARIES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_dictionaries)
|
data.startProgress(R.string.edziennik_progress_endpoint_dictionaries)
|
||||||
VulcanApiDictionaries(data) { onSuccess() }
|
VulcanApiDictionaries(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_VULCAN_API_GRADES -> {
|
ENDPOINT_VULCAN_API_GRADES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_grades)
|
data.startProgress(R.string.edziennik_progress_endpoint_grades)
|
||||||
VulcanApiGrades(data) { onSuccess() }
|
VulcanApiGrades(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_VULCAN_API_GRADES_SUMMARY -> {
|
ENDPOINT_VULCAN_API_GRADES_SUMMARY -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_proposed_grades)
|
data.startProgress(R.string.edziennik_progress_endpoint_proposed_grades)
|
||||||
VulcanApiProposedGrades(data) { onSuccess() }
|
VulcanApiProposedGrades(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_VULCAN_API_EVENTS -> {
|
ENDPOINT_VULCAN_API_EVENTS -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_events)
|
data.startProgress(R.string.edziennik_progress_endpoint_events)
|
||||||
VulcanApiEvents(data, isHomework = false) { onSuccess() }
|
VulcanApiEvents(data, isHomework = false, onSuccess = onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_VULCAN_API_HOMEWORK -> {
|
ENDPOINT_VULCAN_API_HOMEWORK -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_homework)
|
data.startProgress(R.string.edziennik_progress_endpoint_homework)
|
||||||
VulcanApiEvents(data, isHomework = true) { onSuccess() }
|
VulcanApiEvents(data, isHomework = true, onSuccess = onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_VULCAN_API_NOTICES -> {
|
ENDPOINT_VULCAN_API_NOTICES -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_notices)
|
data.startProgress(R.string.edziennik_progress_endpoint_notices)
|
||||||
VulcanApiNotices(data) { onSuccess() }
|
VulcanApiNotices(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_VULCAN_API_ATTENDANCE -> {
|
ENDPOINT_VULCAN_API_ATTENDANCE -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_attendance)
|
data.startProgress(R.string.edziennik_progress_endpoint_attendance)
|
||||||
VulcanApiAttendance(data) { onSuccess() }
|
VulcanApiAttendance(data, onSuccess)
|
||||||
}
|
}
|
||||||
ENDPOINT_VULCAN_API_MESSAGES_INBOX -> {
|
ENDPOINT_VULCAN_API_MESSAGES_INBOX -> {
|
||||||
data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox)
|
data.startProgress(R.string.edziennik_progress_endpoint_messages_inbox)
|
||||||
VulcanApiMessagesInbox(data) { onSuccess() }
|
VulcanApiMessagesInbox(data, onSuccess)
|
||||||
|
}
|
||||||
|
ENDPOINT_VULCAN_API_MESSAGES_SENT -> {
|
||||||
|
data.startProgress(R.string.edziennik_progress_endpoint_messages_outbox)
|
||||||
|
VulcanApiMessagesSent(data, onSuccess)
|
||||||
}
|
}
|
||||||
else -> onSuccess()
|
else -> onSuccess()
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import pl.szczodrzynski.edziennik.api.v2.vulcan.ENDPOINT_VULCAN_API_MESSAGES_INB
|
|||||||
import pl.szczodrzynski.edziennik.api.v2.vulcan.data.VulcanApi
|
import pl.szczodrzynski.edziennik.api.v2.vulcan.data.VulcanApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.modules.api.SYNC_ALWAYS
|
import pl.szczodrzynski.edziennik.data.db.modules.api.SYNC_ALWAYS
|
||||||
import pl.szczodrzynski.edziennik.data.db.modules.messages.Message
|
import pl.szczodrzynski.edziennik.data.db.modules.messages.Message
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.messages.Message.TYPE_RECEIVED
|
||||||
import pl.szczodrzynski.edziennik.data.db.modules.messages.MessageRecipient
|
import pl.szczodrzynski.edziennik.data.db.modules.messages.MessageRecipient
|
||||||
import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata
|
import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata
|
||||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
@ -20,64 +21,68 @@ class VulcanApiMessagesInbox(override val data: DataVulcan, val onSuccess: () ->
|
|||||||
const val TAG = "VulcanApiMessagesInbox"
|
const val TAG = "VulcanApiMessagesInbox"
|
||||||
}
|
}
|
||||||
|
|
||||||
init { data.profile?.also { profile ->
|
init {
|
||||||
|
data.profile?.also { profile ->
|
||||||
|
|
||||||
val startDate: String = when (profile.empty) {
|
val startDate: String = when (profile.empty) {
|
||||||
true -> profile.getSemesterStart(profile.currentSemester).stringY_m_d
|
true -> profile.getSemesterStart(profile.currentSemester).stringY_m_d
|
||||||
else -> Date.getToday().stepForward(0, -1, 0).stringY_m_d
|
else -> Date.getToday().stepForward(0, -1, 0).stringY_m_d
|
||||||
}
|
|
||||||
val endDate: String = profile.getSemesterEnd(profile.currentSemester).stringY_m_d
|
|
||||||
|
|
||||||
apiGet(TAG, VULCAN_API_ENDPOINT_MESSAGES_RECEIVED, parameters = mapOf(
|
|
||||||
"DataPoczatkowa" to startDate,
|
|
||||||
"DataKoncowa" to endDate,
|
|
||||||
"LoginId" to data.studentLoginId,
|
|
||||||
"IdUczen" to data.studentId
|
|
||||||
)) { json, _ ->
|
|
||||||
json.getJsonArray("Data").asJsonObjectList()?.forEach { message ->
|
|
||||||
val id = message.getLong("WiadomoscId") ?: return@forEach
|
|
||||||
val subject = message.getString("Tytul") ?: ""
|
|
||||||
val body = message.getString("Tresc") ?: ""
|
|
||||||
|
|
||||||
val senderLoginId = message.getString("NadawcaId") ?: return@forEach
|
|
||||||
val senderId = data.teacherList
|
|
||||||
.singleOrNull { it.loginId == senderLoginId }?.id ?: return@forEach
|
|
||||||
|
|
||||||
val addedDate = message.getLong("DataWyslaniaUnixEpoch")?.let { it * 1000 } ?: -1
|
|
||||||
val readDate = message.getLong("DataPrzeczytaniaUnixEpoch")?.let { it * 1000 } ?: -1
|
|
||||||
|
|
||||||
val messageObject = Message(
|
|
||||||
profileId,
|
|
||||||
id,
|
|
||||||
subject,
|
|
||||||
body,
|
|
||||||
Message.TYPE_RECEIVED,
|
|
||||||
senderId,
|
|
||||||
-1
|
|
||||||
)
|
|
||||||
|
|
||||||
val messageRecipientObject = MessageRecipient(
|
|
||||||
profileId,
|
|
||||||
-1,
|
|
||||||
-1,
|
|
||||||
readDate,
|
|
||||||
id
|
|
||||||
)
|
|
||||||
|
|
||||||
data.messageList.add(messageObject)
|
|
||||||
data.messageRecipientList.add(messageRecipientObject)
|
|
||||||
data.metadataList.add(Metadata(
|
|
||||||
profileId,
|
|
||||||
Metadata.TYPE_MESSAGE,
|
|
||||||
id,
|
|
||||||
readDate > 0,
|
|
||||||
readDate > 0,
|
|
||||||
addedDate
|
|
||||||
))
|
|
||||||
}
|
}
|
||||||
|
val endDate: String = profile.getSemesterEnd(profile.currentSemester).stringY_m_d
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_VULCAN_API_MESSAGES_INBOX, SYNC_ALWAYS)
|
apiGet(TAG, VULCAN_API_ENDPOINT_MESSAGES_RECEIVED, parameters = mapOf(
|
||||||
onSuccess()
|
"DataPoczatkowa" to startDate,
|
||||||
}
|
"DataKoncowa" to endDate,
|
||||||
} ?: onSuccess()}
|
"LoginId" to data.studentLoginId,
|
||||||
|
"IdUczen" to data.studentId
|
||||||
|
)) { json, _ ->
|
||||||
|
json.getJsonArray("Data").asJsonObjectList()?.forEach { message ->
|
||||||
|
val id = message.getLong("WiadomoscId") ?: return@forEach
|
||||||
|
val subject = message.getString("Tytul") ?: ""
|
||||||
|
val body = message.getString("Tresc") ?: ""
|
||||||
|
|
||||||
|
val senderLoginId = message.getString("NadawcaId") ?: return@forEach
|
||||||
|
val senderId = data.teacherList
|
||||||
|
.singleOrNull { it.loginId == senderLoginId }?.id ?: return@forEach
|
||||||
|
|
||||||
|
val sentDate = message.getLong("DataWyslaniaUnixEpoch")?.let { it * 1000 }
|
||||||
|
?: -1
|
||||||
|
val readDate = message.getLong("DataPrzeczytaniaUnixEpoch")?.let { it * 1000 }
|
||||||
|
?: -1
|
||||||
|
|
||||||
|
val messageObject = Message(
|
||||||
|
profileId,
|
||||||
|
id,
|
||||||
|
subject,
|
||||||
|
body,
|
||||||
|
TYPE_RECEIVED,
|
||||||
|
senderId,
|
||||||
|
-1
|
||||||
|
)
|
||||||
|
|
||||||
|
val messageRecipientObject = MessageRecipient(
|
||||||
|
profileId,
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
readDate,
|
||||||
|
id
|
||||||
|
)
|
||||||
|
|
||||||
|
data.messageList.add(messageObject)
|
||||||
|
data.messageRecipientList.add(messageRecipientObject)
|
||||||
|
data.metadataList.add(Metadata(
|
||||||
|
profileId,
|
||||||
|
Metadata.TYPE_MESSAGE,
|
||||||
|
id,
|
||||||
|
readDate > 0,
|
||||||
|
readDate > 0,
|
||||||
|
sentDate
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
data.setSyncNext(ENDPOINT_VULCAN_API_MESSAGES_INBOX, SYNC_ALWAYS)
|
||||||
|
onSuccess()
|
||||||
|
}
|
||||||
|
} ?: onSuccess()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2019-11-5
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.api.v2.vulcan.data.api
|
||||||
|
|
||||||
|
import pl.szczodrzynski.edziennik.*
|
||||||
|
import pl.szczodrzynski.edziennik.MainActivity.Companion.DRAWER_ITEM_MESSAGES
|
||||||
|
import pl.szczodrzynski.edziennik.api.v2.VULCAN_API_ENDPOINT_MESSAGES_SENT
|
||||||
|
import pl.szczodrzynski.edziennik.api.v2.vulcan.DataVulcan
|
||||||
|
import pl.szczodrzynski.edziennik.api.v2.vulcan.ENDPOINT_VULCAN_API_MESSAGES_SENT
|
||||||
|
import pl.szczodrzynski.edziennik.api.v2.vulcan.data.VulcanApi
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.messages.Message
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.messages.Message.TYPE_SENT
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.messages.MessageRecipient
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata
|
||||||
|
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||||
|
|
||||||
|
class VulcanApiMessagesSent(override val data: DataVulcan, val onSuccess: () -> Unit) : VulcanApi(data) {
|
||||||
|
companion object {
|
||||||
|
const val TAG = "VulcanApiMessagesSent"
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
data.profile?.also { profile ->
|
||||||
|
val startDate: String = when (profile.empty) {
|
||||||
|
true -> profile.getSemesterStart(profile.currentSemester).stringY_m_d
|
||||||
|
else -> Date.getToday().stepForward(0, -1, 0).stringY_m_d
|
||||||
|
}
|
||||||
|
val endDate: String = profile.getSemesterEnd(profile.currentSemester).stringY_m_d
|
||||||
|
|
||||||
|
apiGet(TAG, VULCAN_API_ENDPOINT_MESSAGES_SENT, parameters = mapOf(
|
||||||
|
"DataPoczatkowa" to startDate,
|
||||||
|
"DataKoncowa" to endDate,
|
||||||
|
"LoginId" to data.studentLoginId,
|
||||||
|
"IdUczen" to data.studentId
|
||||||
|
)) { json, _ ->
|
||||||
|
json.getJsonArray("Data")?.asJsonObjectList()?.forEach { message ->
|
||||||
|
val id = message.getLong("WiadomoscId") ?: return@forEach
|
||||||
|
val subject = message.getString("Tytul") ?: ""
|
||||||
|
val body = message.getString("Tresc") ?: ""
|
||||||
|
val readBy = message.getInt("Przeczytane") ?: 0
|
||||||
|
val unreadBy = message.getInt("Nieprzeczytane") ?: 0
|
||||||
|
val sentDate = message.getLong("DataWyslaniaUnixEpoch")?.let { it * 1000 } ?: -1
|
||||||
|
|
||||||
|
val messageObject = Message(
|
||||||
|
profileId,
|
||||||
|
id,
|
||||||
|
subject,
|
||||||
|
body,
|
||||||
|
TYPE_SENT,
|
||||||
|
-1,
|
||||||
|
-1
|
||||||
|
)
|
||||||
|
|
||||||
|
message.getJsonArray("Adresaci")?.asJsonObjectList()
|
||||||
|
?.forEachIndexed { _, recipient ->
|
||||||
|
|
||||||
|
val recipientLoginId = recipient.getString("LoginId")
|
||||||
|
?: return@forEachIndexed
|
||||||
|
val recipientId = data.teacherList.singleOrNull { it.loginId == recipientLoginId }?.id
|
||||||
|
?: return@forEachIndexed
|
||||||
|
|
||||||
|
val readDate: Long = when (readBy) {
|
||||||
|
0 -> 0
|
||||||
|
else -> when (unreadBy) {
|
||||||
|
0 -> 1
|
||||||
|
else -> -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val messageRecipientObject = MessageRecipient(
|
||||||
|
profileId,
|
||||||
|
recipientId,
|
||||||
|
-1,
|
||||||
|
readDate,
|
||||||
|
id
|
||||||
|
)
|
||||||
|
|
||||||
|
data.messageRecipientList.add(messageRecipientObject)
|
||||||
|
}
|
||||||
|
|
||||||
|
data.messageList.add(messageObject)
|
||||||
|
data.metadataList.add(Metadata(
|
||||||
|
profileId,
|
||||||
|
Metadata.TYPE_MESSAGE,
|
||||||
|
id,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
sentDate
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
data.setSyncNext(ENDPOINT_VULCAN_API_MESSAGES_SENT, 1 * DAY, DRAWER_ITEM_MESSAGES)
|
||||||
|
onSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -6,8 +6,6 @@ package pl.szczodrzynski.edziennik.api.v2.vulcan.data.api
|
|||||||
|
|
||||||
import pl.szczodrzynski.edziennik.api.v2.vulcan.DataVulcan
|
import pl.szczodrzynski.edziennik.api.v2.vulcan.DataVulcan
|
||||||
import pl.szczodrzynski.edziennik.api.v2.vulcan.data.VulcanApi
|
import pl.szczodrzynski.edziennik.api.v2.vulcan.data.VulcanApi
|
||||||
import pl.szczodrzynski.edziennik.data.db.modules.api.SYNC_ALWAYS
|
|
||||||
import pl.szczodrzynski.edziennik.getJsonArray
|
|
||||||
|
|
||||||
class VulcanApiTemplate(override val data: DataVulcan, val onSuccess: () -> Unit) : VulcanApi(data) {
|
class VulcanApiTemplate(override val data: DataVulcan, val onSuccess: () -> Unit) : VulcanApi(data) {
|
||||||
companion object {
|
companion object {
|
||||||
@ -15,10 +13,12 @@ class VulcanApiTemplate(override val data: DataVulcan, val onSuccess: () -> Unit
|
|||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
/* apiGet(TAG, VULCAN_API_ENDPOINT_) { json, _ ->
|
/* data.profile?.also { profile ->
|
||||||
|
apiGet(TAG, VULCAN_API_ENDPOINT_) { json, _ ->
|
||||||
|
|
||||||
data.setSyncNext(ENDPOINT_VULCAN_API_, SYNC_ALWAYS)
|
data.setSyncNext(ENDPOINT_VULCAN_API_, SYNC_ALWAYS)
|
||||||
onSuccess()
|
onSuccess()
|
||||||
|
}
|
||||||
} */
|
} */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import androidx.room.Entity;
|
|||||||
import androidx.room.Ignore;
|
import androidx.room.Ignore;
|
||||||
|
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
|
import com.google.gson.JsonNull;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
|
||||||
import pl.szczodrzynski.edziennik.data.db.modules.profiles.ProfileFull;
|
import pl.szczodrzynski.edziennik.data.db.modules.profiles.ProfileFull;
|
||||||
@ -73,7 +74,7 @@ public class LoginStore {
|
|||||||
if (data == null)
|
if (data == null)
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
JsonElement element = data.get(key);
|
JsonElement element = data.get(key);
|
||||||
if (element != null) {
|
if (element != null && !(element instanceof JsonNull)) {
|
||||||
return element.getAsString();
|
return element.getAsString();
|
||||||
}
|
}
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
@ -83,7 +84,7 @@ public class LoginStore {
|
|||||||
if (data == null)
|
if (data == null)
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
JsonElement element = data.get(key);
|
JsonElement element = data.get(key);
|
||||||
if (element != null) {
|
if (element != null && !(element instanceof JsonNull)) {
|
||||||
return element.getAsInt();
|
return element.getAsInt();
|
||||||
}
|
}
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
@ -93,7 +94,7 @@ public class LoginStore {
|
|||||||
if (data == null)
|
if (data == null)
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
JsonElement element = data.get(key);
|
JsonElement element = data.get(key);
|
||||||
if (element != null) {
|
if (element != null && !(element instanceof JsonNull)) {
|
||||||
return element.getAsLong();
|
return element.getAsLong();
|
||||||
}
|
}
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
@ -103,7 +104,7 @@ public class LoginStore {
|
|||||||
if (data == null)
|
if (data == null)
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
JsonElement element = data.get(key);
|
JsonElement element = data.get(key);
|
||||||
if (element != null) {
|
if (element != null && !(element instanceof JsonNull)) {
|
||||||
return element.getAsFloat();
|
return element.getAsFloat();
|
||||||
}
|
}
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
@ -112,7 +113,7 @@ public class LoginStore {
|
|||||||
if (data == null)
|
if (data == null)
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
JsonElement element = data.get(key);
|
JsonElement element = data.get(key);
|
||||||
if (element != null) {
|
if (element != null && !(element instanceof JsonNull)) {
|
||||||
return element.getAsBoolean();
|
return element.getAsBoolean();
|
||||||
}
|
}
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
|
@ -6,6 +6,7 @@ import android.content.Intent;
|
|||||||
import android.graphics.PorterDuff;
|
import android.graphics.PorterDuff;
|
||||||
import android.graphics.PorterDuffColorFilter;
|
import android.graphics.PorterDuffColorFilter;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@ -30,11 +31,14 @@ import androidx.fragment.app.Fragment;
|
|||||||
import androidx.work.WorkManager;
|
import androidx.work.WorkManager;
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.MaterialDialog;
|
import com.afollestad.materialdialogs.MaterialDialog;
|
||||||
|
import com.chuckerteam.chucker.api.Chucker;
|
||||||
|
import com.hypertrack.hyperlog.HyperLog;
|
||||||
import com.mikepenz.iconics.IconicsColor;
|
import com.mikepenz.iconics.IconicsColor;
|
||||||
import com.mikepenz.iconics.IconicsDrawable;
|
import com.mikepenz.iconics.IconicsDrawable;
|
||||||
import com.mikepenz.iconics.IconicsSize;
|
import com.mikepenz.iconics.IconicsSize;
|
||||||
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial;
|
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -50,6 +54,7 @@ import pl.szczodrzynski.edziennik.databinding.CardLuckyNumberBinding;
|
|||||||
import pl.szczodrzynski.edziennik.databinding.CardUpdateBinding;
|
import pl.szczodrzynski.edziennik.databinding.CardUpdateBinding;
|
||||||
import pl.szczodrzynski.edziennik.databinding.FragmentHomeBinding;
|
import pl.szczodrzynski.edziennik.databinding.FragmentHomeBinding;
|
||||||
import pl.szczodrzynski.edziennik.receivers.BootReceiver;
|
import pl.szczodrzynski.edziennik.receivers.BootReceiver;
|
||||||
|
import pl.szczodrzynski.edziennik.ui.modules.login.LoginLibrusCaptchaActivity;
|
||||||
import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesComposeActivity;
|
import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesComposeActivity;
|
||||||
import pl.szczodrzynski.edziennik.utils.Colors;
|
import pl.szczodrzynski.edziennik.utils.Colors;
|
||||||
import pl.szczodrzynski.edziennik.utils.Themes;
|
import pl.szczodrzynski.edziennik.utils.Themes;
|
||||||
@ -104,6 +109,27 @@ public class HomeFragment extends Fragment {
|
|||||||
|
|
||||||
b.pruneWorkButton.setOnClickListener((v -> WorkManager.getInstance(app).pruneWork()));
|
b.pruneWorkButton.setOnClickListener((v -> WorkManager.getInstance(app).pruneWork()));
|
||||||
|
|
||||||
|
b.runChucker.setOnClickListener((v -> {
|
||||||
|
startActivity(Chucker.getLaunchIntent(activity, 1));
|
||||||
|
}));
|
||||||
|
|
||||||
|
b.librusCaptchaButton.setOnClickListener((v -> {
|
||||||
|
startActivity(new Intent(activity, LoginLibrusCaptchaActivity.class));
|
||||||
|
}));
|
||||||
|
|
||||||
|
b.getLogs.setOnClickListener((v -> {
|
||||||
|
File logs = HyperLog.getDeviceLogsInFile(activity, true);
|
||||||
|
Intent intent = new Intent(Intent.ACTION_SEND);
|
||||||
|
|
||||||
|
if(logs.exists()) {
|
||||||
|
intent.setType("text/plain");
|
||||||
|
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+logs.getAbsolutePath()));
|
||||||
|
intent.putExtra(Intent.EXTRA_SUBJECT, "Share debug logs");
|
||||||
|
intent.putExtra(Intent.EXTRA_TEXT, "Share debug logs");
|
||||||
|
startActivity(Intent.createChooser(intent, "Share debug logs"));
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
//((TextView)v.findViewById(R.id.nextSync)).setText(getString(R.string.next_sync_format,Time.fromMillis(app.appJobs.syncJobTime).getStringHMS()));
|
//((TextView)v.findViewById(R.id.nextSync)).setText(getString(R.string.next_sync_format,Time.fromMillis(app.appJobs.syncJobTime).getStringHMS()));
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,116 @@
|
|||||||
|
package pl.szczodrzynski.edziennik.ui.modules.login
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.util.Base64
|
||||||
|
import android.webkit.JavascriptInterface
|
||||||
|
import android.webkit.WebView
|
||||||
|
import androidx.appcompat.app.AlertDialog
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import com.afollestad.materialdialogs.MaterialDialog
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
|
import pl.szczodrzynski.edziennik.R
|
||||||
|
import pl.szczodrzynski.edziennik.api.v2.LIBRUS_USER_AGENT
|
||||||
|
import pl.szczodrzynski.edziennik.utils.Themes
|
||||||
|
import pl.szczodrzynski.edziennik.utils.Utils.hexFromColorInt
|
||||||
|
import java.nio.charset.Charset
|
||||||
|
|
||||||
|
class LoginLibrusCaptchaActivity : AppCompatActivity() {
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "LoginLibrusCaptchaActivity"
|
||||||
|
}
|
||||||
|
|
||||||
|
private lateinit var webView: WebView
|
||||||
|
private lateinit var dialog: AlertDialog
|
||||||
|
private lateinit var jsInterface: CaptchaCallbackInterface
|
||||||
|
|
||||||
|
@SuppressLint("AddJavascriptInterface", "SetJavaScriptEnabled")
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setTheme(Themes.appThemeNoDisplay)
|
||||||
|
setFinishOnTouchOutside(false)
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||||
|
WebView.setWebContentsDebuggingEnabled(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
val base64Content = """
|
||||||
|
PCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vd3d3Lmdvb2ds
|
||||||
|
ZS5jb20vcmVjYXB0Y2hhL2FwaS5qcz9vbmxvYWQ9cmVhZHkmcmVuZGVyPWV4cGxpY2l0Ij48L3Nj
|
||||||
|
cmlwdD48L2hlYWQ+PGJvZHk+PGJyPjxjZW50ZXIgaWQ9ImdyIj48L2NlbnRlcj48YnI+PHNjcmlw
|
||||||
|
dD5mdW5jdGlvbiByZWFkeSgpe2dyZWNhcHRjaGEucmVuZGVyKCdncicse3NpdGVrZXk6JzZMZjQ4
|
||||||
|
bW9VQUFBQUFCOUNsaGR2SHI0NmdSV1ItQ04zMUNYUVBHMlUnLHRoZW1lOidUSEVNRScsY2FsbGJh
|
||||||
|
Y2s6ZnVuY3Rpb24oZSl7d2luZG93LmlmLmNhbGxiYWNrKGUpO30sImV4cGlyZWQtY2FsbGJhY2si
|
||||||
|
OmZ1bmN0aW9uKCl7d2luZG93LmlmLmV4cGlyZWRDYWxsYmFjayhlKTt9LCJlcnJvci1jYWxsYmFj
|
||||||
|
ayI6ZnVuY3Rpb24oKXt3aW5kb3cuaWYuZXJyb3JDYWxsYmFjayhlKTt9fSk7fTwvc2NyaXB0Pjwv
|
||||||
|
Ym9keT48L2h0bWw+"""
|
||||||
|
|
||||||
|
val backgroundColor = if (Themes.isDark) 0x424242 else 0xffffff
|
||||||
|
val backgroundColorString = hexFromColorInt(backgroundColor)
|
||||||
|
|
||||||
|
val htmlContent = Base64.decode(base64Content, Base64.DEFAULT)
|
||||||
|
.toString(Charset.defaultCharset())
|
||||||
|
.replace("COLOR", backgroundColorString, true)
|
||||||
|
.replace("THEME", if (Themes.isDark) "dark" else "light")
|
||||||
|
|
||||||
|
jsInterface = object : CaptchaCallbackInterface {
|
||||||
|
@JavascriptInterface
|
||||||
|
override fun callback(recaptchaResponse: String) {
|
||||||
|
MaterialDialog.Builder(this@LoginLibrusCaptchaActivity)
|
||||||
|
.title("Captcha checked")
|
||||||
|
.content("Response: $recaptchaResponse")
|
||||||
|
.positiveText("OK")
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
override fun expiredCallback() {
|
||||||
|
MaterialDialog.Builder(this@LoginLibrusCaptchaActivity)
|
||||||
|
.title("Captcha expired")
|
||||||
|
.content("Captcha expired")
|
||||||
|
.positiveText("OK")
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
@JavascriptInterface
|
||||||
|
override fun errorCallback() {
|
||||||
|
MaterialDialog.Builder(this@LoginLibrusCaptchaActivity)
|
||||||
|
.title("Captcha error")
|
||||||
|
.content("Captcha error")
|
||||||
|
.positiveText("OK")
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
webView = WebView(this).apply {
|
||||||
|
//setBackgroundColor((backgroundColor.toLong() or 0xff000000).toInt())
|
||||||
|
setBackgroundColor(Color.TRANSPARENT)
|
||||||
|
settings.javaScriptEnabled = true
|
||||||
|
settings.userAgentString = LIBRUS_USER_AGENT
|
||||||
|
addJavascriptInterface(jsInterface, "if")
|
||||||
|
loadDataWithBaseURL("https://portal.librus.pl/rodzina/login/", htmlContent, "text/html", "UTF-8", null)
|
||||||
|
setLayerType(WebView.LAYER_TYPE_SOFTWARE, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
dialog = MaterialAlertDialogBuilder(this)
|
||||||
|
.setTitle(R.string.login_librus_captcha_title)
|
||||||
|
.setView(webView)
|
||||||
|
.setNegativeButton(R.string.cancel) { dialog, _ ->
|
||||||
|
dialog.dismiss()
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
.setCancelable(false)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface CaptchaCallbackInterface {
|
||||||
|
@JavascriptInterface
|
||||||
|
fun callback(recaptchaResponse: String)
|
||||||
|
@JavascriptInterface
|
||||||
|
fun expiredCallback()
|
||||||
|
@JavascriptInterface
|
||||||
|
fun errorCallback()
|
||||||
|
}
|
||||||
|
}
|
@ -533,7 +533,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
|
|||||||
syncCardIntervalItem.setChecked(app.appConfig.registerSyncEnabled);
|
syncCardIntervalItem.setChecked(app.appConfig.registerSyncEnabled);
|
||||||
syncCardIntervalItem.setOnClickAction(() -> {
|
syncCardIntervalItem.setOnClickAction(() -> {
|
||||||
List<CharSequence> intervalNames = new ArrayList<>();
|
List<CharSequence> intervalNames = new ArrayList<>();
|
||||||
if (App.devMode) {
|
if (App.devMode && false) {
|
||||||
intervalNames.add(HomeFragment.plural(activity, R.plurals.time_till_seconds, 30));
|
intervalNames.add(HomeFragment.plural(activity, R.plurals.time_till_seconds, 30));
|
||||||
intervalNames.add(HomeFragment.plural(activity, R.plurals.time_till_minutes, 2));
|
intervalNames.add(HomeFragment.plural(activity, R.plurals.time_till_minutes, 2));
|
||||||
}
|
}
|
||||||
@ -545,7 +545,7 @@ public class SettingsNewFragment extends MaterialAboutFragment {
|
|||||||
intervalNames.add(HomeFragment.plural(activity, R.plurals.time_till_hours, 3));
|
intervalNames.add(HomeFragment.plural(activity, R.plurals.time_till_hours, 3));
|
||||||
intervalNames.add(HomeFragment.plural(activity, R.plurals.time_till_hours, 4));
|
intervalNames.add(HomeFragment.plural(activity, R.plurals.time_till_hours, 4));
|
||||||
List<Integer> intervals = new ArrayList<>();
|
List<Integer> intervals = new ArrayList<>();
|
||||||
if (App.devMode) {
|
if (App.devMode && false) {
|
||||||
intervals.add(30);
|
intervals.add(30);
|
||||||
intervals.add(2 * 60);
|
intervals.add(2 * 60);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,24 @@
|
|||||||
|
package pl.szczodrzynski.edziennik.utils
|
||||||
|
|
||||||
|
import android.content.ComponentName
|
||||||
|
import android.content.Intent
|
||||||
|
|
||||||
|
val appManagerIntentList = listOf(
|
||||||
|
Intent().setClassName("com.miui.powerkeeper", "com.miui.powerkeeper.ui.HiddenAppsConfigActivity")
|
||||||
|
.putExtra("packageName", "pl.szczodrzynski.edziennik")
|
||||||
|
.putExtra("package_label", "Szkolny.eu"),
|
||||||
|
Intent().setComponent(ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.coloros.safecenter", "com.coloros.safecenter.startupapp.StartupAppListActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.oppo.safe", "com.oppo.safe.permission.startup.StartupAppListActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.BgStartUpManager")),
|
||||||
|
Intent().setComponent(ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.BgStartUpManagerActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.samsung.android.lool", "com.samsung.android.sm.ui.battery.BatteryActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.htc.pitroad", "com.htc.pitroad.landingpage.activity.LandingPageActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.asus.mobilemanager", "com.asus.mobilemanager.MainActivity"))
|
||||||
|
)
|
@ -0,0 +1,10 @@
|
|||||||
|
package pl.szczodrzynski.edziennik.utils
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import com.hypertrack.hyperlog.LogFormat
|
||||||
|
|
||||||
|
class DebugLogFormat(context: Context) : LogFormat(context) {
|
||||||
|
override fun getFormattedLogMessage(logLevelName: String?, tag: String?, message: String?, timeStamp: String?, senderName: String?, osVersion: String?, deviceUUID: String?): String {
|
||||||
|
return "${timeStamp?.replace("[TZ]".toRegex(), " ")}D/$tag: $message"
|
||||||
|
}
|
||||||
|
}
|
@ -26,6 +26,8 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.content.FileProvider;
|
import androidx.core.content.FileProvider;
|
||||||
|
|
||||||
|
import com.hypertrack.hyperlog.HyperLog;
|
||||||
|
|
||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
import java.io.BufferedOutputStream;
|
import java.io.BufferedOutputStream;
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
@ -106,15 +108,15 @@ public class Utils {
|
|||||||
|
|
||||||
public static void d(String TAG, String message) {
|
public static void d(String TAG, String message) {
|
||||||
if (App.devMode) {
|
if (App.devMode) {
|
||||||
Log.d("Szkolny/"+TAG, message);
|
HyperLog.d("Szkolny/"+TAG, message);
|
||||||
//debugLog.add(TAG+": "+message);
|
//debugLog.add(TAG+": "+message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static void c(String TAG, String message) {
|
public static void c(String TAG, String message) {
|
||||||
if (App.devMode) {
|
/*if (App.devMode) {
|
||||||
Log.d(TAG, "// " + message);
|
Log.d(TAG, "// " + message);
|
||||||
///debugLog.add(TAG+": // "+message);
|
///debugLog.add(TAG+": // "+message);
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -36,24 +36,54 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
tools:visibility="visible">
|
tools:visibility="visible"
|
||||||
|
tools:ignore="HardcodedText">
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/getLogs"
|
||||||
|
style="@style/Widget.MaterialComponents.Button"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
android:text="Save Debug Logs" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/librusCaptchaButton"
|
||||||
|
style="@style/Widget.MaterialComponents.Button"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
android:text="Librus Captcha" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/runChucker"
|
||||||
|
style="@style/Widget.MaterialComponents.Button"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
android:text="Launch Chucker" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center">
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/mobidziennikMessagesSwitch"
|
android:id="@+id/mobidziennikMessagesSwitch"
|
||||||
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
|
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
|
||||||
android:layout_margin="8dp"
|
android:layout_width="0dp"
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
android:layout_weight="1"
|
||||||
android:text="Zmień moduł wiadomości" />
|
android:text="Zmień moduł wiadomości" />
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/composeButton"
|
android:id="@+id/composeButton"
|
||||||
style="@style/Widget.MaterialComponents.Button"
|
style="@style/Widget.MaterialComponents.Button"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="8dp"
|
android:layout_margin="8dp"
|
||||||
|
android:layout_weight="1"
|
||||||
android:text="Compose" />
|
android:text="Compose" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
@ -930,6 +930,7 @@
|
|||||||
<string name="settings_register_show_teacher_absences_text">Pokazuj nieobecności nauczycieli w Terminarzu</string>
|
<string name="settings_register_show_teacher_absences_text">Pokazuj nieobecności nauczycieli w Terminarzu</string>
|
||||||
<string name="edziennik_progress_endpoint_school_info">Pobieram informacje o szkole...</string>
|
<string name="edziennik_progress_endpoint_school_info">Pobieram informacje o szkole...</string>
|
||||||
<string name="edziennik_progress_endpoint_grades">Pobieranie ocen ucznia...</string>
|
<string name="edziennik_progress_endpoint_grades">Pobieranie ocen ucznia...</string>
|
||||||
|
<string name="edziennik_progress_endpoint_grade_categories">Pobieranie kategorii ocen...</string>
|
||||||
<string name="edziennik_progress_login_template_web">Logowanie do Template WEB...</string>
|
<string name="edziennik_progress_login_template_web">Logowanie do Template WEB...</string>
|
||||||
<string name="edziennik_progress_login_template_api">Logowanie do Template API...</string>
|
<string name="edziennik_progress_login_template_api">Logowanie do Template API...</string>
|
||||||
<string name="edziennik_progress_login_mobidziennik_web">Logowanie do MobiDziennika...</string>
|
<string name="edziennik_progress_login_mobidziennik_web">Logowanie do MobiDziennika...</string>
|
||||||
@ -983,4 +984,5 @@
|
|||||||
<string name="dont_ask_again">Nie pytaj ponownie</string>
|
<string name="dont_ask_again">Nie pytaj ponownie</string>
|
||||||
<string name="app_manager_open_failed">Nie udało się otworzyć ustawień</string>
|
<string name="app_manager_open_failed">Nie udało się otworzyć ustawień</string>
|
||||||
<string name="edziennik_notification_api_notify_title">Tworzenie powiadomień</string>
|
<string name="edziennik_notification_api_notify_title">Tworzenie powiadomień</string>
|
||||||
|
<string name="login_librus_captcha_title">Librus - logowanie</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -5,8 +5,8 @@ buildscript {
|
|||||||
kotlin_version = '1.3.50'
|
kotlin_version = '1.3.50'
|
||||||
|
|
||||||
release = [
|
release = [
|
||||||
versionName: "3.1.1",
|
versionName: "3.9.3-dev",
|
||||||
versionCode: 3010199
|
versionCode: 3090300
|
||||||
]
|
]
|
||||||
|
|
||||||
setup = [
|
setup = [
|
||||||
|
Reference in New Issue
Block a user