diff --git a/app/src/main/assets/pl-changelog.html b/app/src/main/assets/pl-changelog.html
index a8944f04..70dd9bea 100644
--- a/app/src/main/assets/pl-changelog.html
+++ b/app/src/main/assets/pl-changelog.html
@@ -1,8 +1,6 @@
-
Wersja 4.3.1, 2020-08-27
+Wersja 4.4, 2020-08-27
- - Dodana opcja automatycznej archiwizacji profilu na nowy rok szkolny.
- - Poprawione problemy z synchronizacją oraz mieszaniem się danych.
- - Przywrócona synchronizacja w wakacje.
+ - Poprawione komunikaty o aktualizacjach aplikacji.
diff --git a/app/src/main/cpp/szkolny-signing.cpp b/app/src/main/cpp/szkolny-signing.cpp
index 8e1f92dd..a66cabf6 100644
--- a/app/src/main/cpp/szkolny-signing.cpp
+++ b/app/src/main/cpp/szkolny-signing.cpp
@@ -9,7 +9,7 @@
/*secret password - removed for source code publication*/
static toys AES_IV[16] = {
- 0x24, 0x85, 0x31, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+ 0x85, 0xd2, 0x0d, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
unsigned char *agony(unsigned int laugh, unsigned char *box, unsigned char *heat);
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
index 3932ce3b..e1fe3b0c 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
@@ -41,6 +41,8 @@ import pl.droidsonroids.gif.GifDrawable
import pl.szczodrzynski.edziennik.data.api.edziennik.EdziennikTask
import pl.szczodrzynski.edziennik.data.api.events.*
import pl.szczodrzynski.edziennik.data.api.models.ApiError
+import pl.szczodrzynski.edziennik.data.api.szkolny.SzkolnyApi
+import pl.szczodrzynski.edziennik.data.api.szkolny.response.Update
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
import pl.szczodrzynski.edziennik.data.db.entity.Metadata.*
import pl.szczodrzynski.edziennik.data.db.entity.Profile
@@ -48,7 +50,9 @@ import pl.szczodrzynski.edziennik.databinding.ActivitySzkolnyBinding
import pl.szczodrzynski.edziennik.sync.AppManagerDetectedEvent
import pl.szczodrzynski.edziennik.sync.SyncWorker
import pl.szczodrzynski.edziennik.sync.UpdateWorker
+import pl.szczodrzynski.edziennik.ui.dialogs.RegisterUnavailableDialog
import pl.szczodrzynski.edziennik.ui.dialogs.ServerMessageDialog
+import pl.szczodrzynski.edziennik.ui.dialogs.UpdateAvailableDialog
import pl.szczodrzynski.edziennik.ui.dialogs.changelog.ChangelogDialog
import pl.szczodrzynski.edziennik.ui.dialogs.event.EventManualDialog
import pl.szczodrzynski.edziennik.ui.dialogs.settings.ProfileRemoveDialog
@@ -438,7 +442,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
})
b.swipeRefreshLayout.isEnabled = true
- b.swipeRefreshLayout.setOnRefreshListener { this.syncCurrentFeature() }
+ b.swipeRefreshLayout.setOnRefreshListener { launch { syncCurrentFeature() } }
b.swipeRefreshLayout.setColorSchemeResources(
R.color.md_blue_500,
R.color.md_amber_500,
@@ -604,7 +608,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|_____/ \__, |_| |_|\___|
__/ |
|__*/
- fun syncCurrentFeature() {
+ suspend fun syncCurrentFeature() {
if (app.profile.archived) {
MaterialAlertDialogBuilder(this)
.setTitle(R.string.profile_archived_title)
@@ -640,6 +644,30 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
swipeRefreshLayout.isRefreshing = false
return
}
+
+ app.profile.registerName?.let { registerName ->
+ var status = app.config.sync.registerAvailability[registerName]
+ if (status == null || status.nextCheck < currentTimeUnix()) {
+ withContext(Dispatchers.IO) {
+ val api = SzkolnyApi(app)
+ api.runCatching(this@MainActivity) {
+ val availability = getRegisterAvailability()
+ app.config.sync.registerAvailability = availability
+ status = availability[registerName]
+ }
+ }
+ }
+
+ if (status?.available != true
+ || status?.minVersionCode ?: BuildConfig.VERSION_CODE > BuildConfig.VERSION_CODE) {
+ swipeRefreshLayout.isRefreshing = false
+ loadTarget(DRAWER_ITEM_HOME)
+ if (status != null)
+ RegisterUnavailableDialog(this, status!!)
+ return
+ }
+ }
+
swipeRefreshLayout.isRefreshing = true
Toast.makeText(this, fragmentToSyncName(navTargetId), Toast.LENGTH_SHORT).show()
val fragmentParam = when (navTargetId) {
@@ -656,6 +684,20 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
arguments = arguments
).enqueue(this)
}
+ @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
+ fun onUpdateEvent(event: Update) {
+ EventBus.getDefault().removeStickyEvent(event)
+ UpdateAvailableDialog(this, event)
+ }
+ @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
+ fun onRegisterAvailabilityEvent(event: RegisterAvailabilityEvent) {
+ EventBus.getDefault().removeStickyEvent(event)
+ app.profile.registerName?.let { registerName ->
+ event.data[registerName]?.let {
+ RegisterUnavailableDialog(this, it)
+ }
+ }
+ }
@Subscribe(threadMode = ThreadMode.MAIN)
fun onApiTaskStartedEvent(event: ApiTaskStartedEvent) {
swipeRefreshLayout.isRefreshing = true
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/config/ConfigSync.kt b/app/src/main/java/pl/szczodrzynski/edziennik/config/ConfigSync.kt
index a6bb68df..2d7dcf78 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/config/ConfigSync.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/config/ConfigSync.kt
@@ -4,12 +4,18 @@
package pl.szczodrzynski.edziennik.config
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
import pl.szczodrzynski.edziennik.config.utils.get
import pl.szczodrzynski.edziennik.config.utils.getIntList
import pl.szczodrzynski.edziennik.config.utils.set
+import pl.szczodrzynski.edziennik.config.utils.setMap
+import pl.szczodrzynski.edziennik.data.api.szkolny.response.RegisterAvailabilityStatus
import pl.szczodrzynski.edziennik.utils.models.Time
class ConfigSync(private val config: Config) {
+ private val gson = Gson()
+
private var mDontShowAppManagerDialog: Boolean? = null
var dontShowAppManagerDialog: Boolean
get() { mDontShowAppManagerDialog = mDontShowAppManagerDialog ?: config.values.get("dontShowAppManagerDialog", false); return mDontShowAppManagerDialog ?: false }
@@ -106,4 +112,9 @@ class ConfigSync(private val config: Config) {
var tokenVulcanList: List
get() { mTokenVulcanList = mTokenVulcanList ?: config.values.getIntList("tokenVulcanList", listOf()); return mTokenVulcanList ?: listOf() }
set(value) { config.set("tokenVulcanList", value); mTokenVulcanList = value }
+
+ private var mRegisterAvailability: Map? = null
+ var registerAvailability: Map
+ get() { mRegisterAvailability = mRegisterAvailability ?: config.values.get("registerAvailability", null as String?)?.let { it -> gson.fromJson