diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 00000000..733f463f
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 24f8c447..2f82ed79 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -11,7 +11,6 @@
-
@@ -51,7 +50,7 @@
-
+
diff --git a/app/build.gradle b/app/build.gradle
index 9bc32c1a..47b02774 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -203,8 +203,8 @@ dependencies {
implementation 'com.google.android:flexbox:2.0.1'
- implementation 'com.qifan.powerpermission:powerpermission:1.0.0'
- implementation 'com.qifan.powerpermission:powerpermission-coroutines:1.0.0'
+ implementation 'com.qifan.powerpermission:powerpermission:1.3.0'
+ implementation 'com.qifan.powerpermission:powerpermission-coroutines:1.3.0'
implementation 'com.github.kuba2k2.FSLogin:lib:master-SNAPSHOT'
implementation 'pl.droidsonroids:jspoon:1.3.2'
diff --git a/app/src/main/assets/pl-changelog.html b/app/src/main/assets/pl-changelog.html
index d7181f1b..dbb51c25 100644
--- a/app/src/main/assets/pl-changelog.html
+++ b/app/src/main/assets/pl-changelog.html
@@ -1,9 +1,7 @@
-Wersja 4.2.1, 2020-05-21
+Wersja 4.3, 2020-08-26
- - Poprawiona błędna godzina synchronizacji danych (przesunięcie w przód o 1-2h).
- - Vulcan: Naprawione logowanie.
- - Mobidziennik: Poprawione pobieranie szczęśliwego numerka.
- - Prymus: Naprawione logowane.
+ - Dodana opcja automatycznej archiwizacji profilu na nowy rok szkolny.
+ - Poprawione problemy z synchronizacją oraz mieszaniem się danych.
diff --git a/app/src/main/cpp/szkolny-signing.cpp b/app/src/main/cpp/szkolny-signing.cpp
index 2b2922e6..e2a5a9c1 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] = {
- 0x43, 0xfc, 0x2d, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+ 0x20, 0x98, 0x82, 0x66, 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/App.kt b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt
index bea90a98..65836b5e 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt
@@ -364,6 +364,9 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
if (!success) {
EventBus.getDefault().post(ProfileListEmptyEvent())
}
+ else {
+ onSuccess(profile)
+ }
}
}
fun profileSave() = profileSave(profile)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt
index 2443679b..7306109a 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt
@@ -42,6 +42,7 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import androidx.viewpager.widget.ViewPager
import com.google.android.gms.security.ProviderInstaller
import com.google.android.material.button.MaterialButton
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.gson.JsonArray
import com.google.gson.JsonElement
import com.google.gson.JsonObject
@@ -672,6 +673,16 @@ fun TextView.setText(@StringRes resid: Int, vararg formatArgs: Any) {
text = context.getString(resid, *formatArgs)
}
+fun MaterialAlertDialogBuilder.setTitle(@StringRes resid: Int, vararg formatArgs: Any): MaterialAlertDialogBuilder {
+ setTitle(context.getString(resid, *formatArgs))
+ return this
+}
+
+fun MaterialAlertDialogBuilder.setMessage(@StringRes resid: Int, vararg formatArgs: Any): MaterialAlertDialogBuilder {
+ setMessage(context.getString(resid, *formatArgs))
+ return this
+}
+
fun JsonObject(vararg properties: Pair): JsonObject {
return JsonObject().apply {
for (property in properties) {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
index 3033f0f0..3932ce3b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
@@ -43,6 +43,7 @@ import pl.szczodrzynski.edziennik.data.api.events.*
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
import pl.szczodrzynski.edziennik.data.db.entity.Metadata.*
+import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.databinding.ActivitySzkolnyBinding
import pl.szczodrzynski.edziennik.sync.AppManagerDetectedEvent
import pl.szczodrzynski.edziennik.sync.SyncWorker
@@ -295,12 +296,21 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
mainSnackbar.setCoordinator(b.navView.coordinator, b.navView.bottomBar)
errorSnackbar.setCoordinator(b.navView.coordinator, b.navView.bottomBar)
- if (BuildConfig.VERSION_NAME.contains("nightly")) {
- b.nightlyText.isVisible = true
- b.nightlyText.text = "Nightly\n"+BuildConfig.VERSION_NAME.substringAfterLast(".")
+ when {
+ BuildConfig.VERSION_NAME.contains("nightly") -> {
+ b.nightlyText.isVisible = true
+ b.nightlyText.text = "Nightly\n"+BuildConfig.VERSION_NAME.substringAfterLast(".")
+ }
+ BuildConfig.VERSION_NAME.contains("daily") -> {
+ b.nightlyText.isVisible = true
+ b.nightlyText.text = "Daily\n"+BuildConfig.VERSION_NAME.substringAfterLast(".")
+ }
+ BuildConfig.DEBUG -> {
+ b.nightlyText.isVisible = true
+ b.nightlyText.text = "Debug\n"+BuildConfig.VERSION_NAME
+ }
+ else -> b.nightlyText.isVisible = false
}
- else
- b.nightlyText.isVisible = false
navLoading = true
@@ -399,7 +409,20 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
}
app.db.profileDao().all.observe(this, Observer { profiles ->
- drawer.setProfileList(profiles.filter { it.id >= 0 }.toMutableList())
+ val allArchived = profiles.all { it.archived }
+ drawer.setProfileList(profiles.filter { it.id >= 0 && (!it.archived || allArchived) }.toMutableList())
+ //prepend the archived profile if loaded
+ if (app.profile.archived && !allArchived) {
+ drawer.prependProfile(Profile(
+ id = app.profile.id,
+ loginStoreId = app.profile.loginStoreId,
+ loginStoreType = app.profile.loginStoreType,
+ name = app.profile.name,
+ subname = "Archiwum - ${app.profile.subname}"
+ ).also {
+ it.archived = true
+ })
+ }
drawer.currentProfile = App.profileId
})
@@ -425,6 +448,23 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
SyncWorker.scheduleNext(app)
UpdateWorker.scheduleNext(app)
+ // if loaded profile is archived, switch to the up-to-date version of it
+ if (app.profile.archived) {
+ launch {
+ if (app.profile.archiveId != null) {
+ val profile = withContext(Dispatchers.IO) {
+ app.db.profileDao().getNotArchivedOf(app.profile.archiveId!!)
+ }
+ if (profile != null)
+ loadProfile(profile)
+ else
+ loadProfile(0)
+ } else {
+ loadProfile(0)
+ }
+ }
+ }
+
// APP BACKGROUND
if (app.config.ui.appBackground != null) {
try {
@@ -565,6 +605,41 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
__/ |
|__*/
fun syncCurrentFeature() {
+ if (app.profile.archived) {
+ MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.profile_archived_title)
+ .setMessage(
+ R.string.profile_archived_text,
+ app.profile.studentSchoolYearStart,
+ app.profile.studentSchoolYearStart + 1
+ )
+ .setPositiveButton(R.string.ok, null)
+ .show()
+ swipeRefreshLayout.isRefreshing = false
+ return
+ }
+ if (app.profile.shouldArchive()) {
+ MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.profile_archiving_title)
+ .setMessage(
+ R.string.profile_archiving_format,
+ app.profile.dateYearEnd.formattedString
+ )
+ .setPositiveButton(R.string.ok, null)
+ .show()
+ }
+ if (app.profile.isBeforeYear()) {
+ MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.profile_year_not_started_title)
+ .setMessage(
+ R.string.profile_year_not_started_format,
+ app.profile.dateSemester1Start.formattedString
+ )
+ .setPositiveButton(R.string.ok, null)
+ .show()
+ swipeRefreshLayout.isRefreshing = false
+ return
+ }
swipeRefreshLayout.isRefreshing = true
Toast.makeText(this, fragmentToSyncName(navTargetId), Toast.LENGTH_SHORT).show()
val fragmentParam = when (navTargetId) {
@@ -885,23 +960,51 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
fun loadProfile(id: Int) = loadProfile(id, navTargetId)
fun loadProfile(id: Int, arguments: Bundle?) = loadProfile(id, navTargetId, arguments)
- fun loadProfile(id: Int, drawerSelection: Int, arguments: Bundle? = null) {
+ fun loadProfile(profile: Profile) = loadProfile(
+ profile,
+ navTargetId,
+ null,
+ if (app.profile.archived) app.profile.id else null
+ )
+ private fun loadProfile(id: Int, drawerSelection: Int, arguments: Bundle? = null) {
if (App.profileId == id) {
drawer.currentProfile = app.profile.id
loadTarget(drawerSelection, arguments)
return
}
+ val previousArchivedId = if (app.profile.archived) app.profile.id else null
app.profileLoad(id) {
- MessagesFragment.pageSelection = -1
-
- setDrawerItems()
- // the drawer profile is updated automatically when the drawer item is clicked
- // update it manually when switching profiles from other source
- //if (drawer.currentProfile != app.profile.id)
- drawer.currentProfile = app.profileId
- loadTarget(drawerSelection, arguments)
+ loadProfile(it, drawerSelection, arguments, previousArchivedId)
}
}
+ private fun loadProfile(profile: Profile, drawerSelection: Int, arguments: Bundle?, previousArchivedId: Int?) {
+ App.profile = profile
+ MessagesFragment.pageSelection = -1
+
+ setDrawerItems()
+
+ if (previousArchivedId != null) {
+ // prevents accidentally removing the first item if the archived profile is not shown
+ drawer.removeProfileById(previousArchivedId)
+ }
+ if (profile.archived) {
+ drawer.prependProfile(Profile(
+ id = profile.id,
+ loginStoreId = profile.loginStoreId,
+ loginStoreType = profile.loginStoreType,
+ name = profile.name,
+ subname = "Archiwum - ${profile.subname}"
+ ).also {
+ it.archived = true
+ })
+ }
+
+ // the drawer profile is updated automatically when the drawer item is clicked
+ // update it manually when switching profiles from other source
+ //if (drawer.currentProfile != app.profile.id)
+ drawer.currentProfile = app.profileId
+ loadTarget(drawerSelection, arguments)
+ }
fun loadTarget(id: Int, arguments: Bundle? = null) {
var loadId = id
if (loadId == -1) {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt
index 4d3f0aca..e1a830b5 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt
@@ -25,6 +25,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.Teacher
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
+import pl.szczodrzynski.edziennik.utils.Utils.d
open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTask(profileId) {
companion object {
@@ -71,10 +72,24 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
private var edziennikInterface: EdziennikInterface? = null
internal fun run(app: App, taskCallback: EdziennikCallback) {
- if (profile?.archived == true) {
- taskCallback.onError(ApiError(TAG, ERROR_PROFILE_ARCHIVED))
- return
+ profile?.let { profile ->
+ if (profile.archived) {
+ d(TAG, "The profile $profileId is archived")
+ taskCallback.onError(ApiError(TAG, ERROR_PROFILE_ARCHIVED))
+ return
+ }
+ else if (profile.shouldArchive()) {
+ d(TAG, "The profile $profileId's year ended on ${profile.dateYearEnd}, archiving")
+ ProfileArchiver(app, profile)
+ }
+ if (profile.isBeforeYear()) {
+ d(TAG, "The profile $profileId's school year has not started yet; aborting sync")
+ cancel()
+ taskCallback.onCompleted()
+ return
+ }
}
+
edziennikInterface = when (loginStore.type) {
LOGIN_TYPE_LIBRUS -> Librus(app, profile, loginStore, taskCallback)
LOGIN_TYPE_MOBIDZIENNIK -> Mobidziennik(app, profile, loginStore, taskCallback)
@@ -108,6 +123,7 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
}
override fun cancel() {
+ d(TAG, "Task ${toString()} cancelling...")
edziennikInterface?.cancel()
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/ProfileArchiver.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/ProfileArchiver.kt
new file mode 100644
index 00000000..15da9765
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/ProfileArchiver.kt
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) Kuba Szczodrzyński 2020-8-25.
+ */
+
+package pl.szczodrzynski.edziennik.data.api.edziennik
+
+import android.content.Intent
+import pl.szczodrzynski.edziennik.App
+import pl.szczodrzynski.edziennik.Intent
+import pl.szczodrzynski.edziennik.data.api.*
+import pl.szczodrzynski.edziennik.data.db.entity.Profile
+import pl.szczodrzynski.edziennik.utils.Utils.d
+import pl.szczodrzynski.edziennik.utils.models.Date
+
+class ProfileArchiver(val app: App, val profile: Profile) {
+ companion object {
+ private const val TAG = "ProfileArchiver"
+ }
+
+ init {
+ if (profile.archiveId == null)
+ profile.archiveId = profile.id
+ d(TAG, "Processing ${profile.name}#${profile.id}, archiveId = ${profile.archiveId}")
+
+ profile.archived = true
+ app.db.profileDao().add(profile)
+ //app.db.metadataDao().setAllSeen(profile.id, true)
+ app.db.notificationDao().clear(profile.id)
+ app.db.endpointTimerDao().clear(profile.id)
+ d(TAG, "Archived profile ${profile.id} saved")
+ profile.archived = false
+
+ // guess the nearest school year
+ val today = Date.getToday()
+ profile.studentSchoolYearStart = when {
+ today.month <= profile.dateYearEnd.month -> today.year - 1
+ else -> today.year
+ }
+
+ // set default semester dates
+ profile.dateSemester1Start = Date(profile.studentSchoolYearStart, 9, 1)
+ profile.dateSemester2Start = Date(profile.studentSchoolYearStart + 1, 2, 1)
+ profile.dateYearEnd = Date(profile.studentSchoolYearStart + 1, 6, 30)
+
+ val oldId = profile.id
+ val newId = (app.db.profileDao().lastId ?: profile.id) + 1
+ profile.id = newId
+ profile.subname = "Nowy rok szkolny - ${profile.studentSchoolYearStart}"
+ profile.studentClassName = null
+
+ d(TAG, "New profile ID for ${profile.name}: ${profile.id}")
+
+ when (profile.loginStoreType) {
+ LOGIN_TYPE_LIBRUS -> {
+ profile.removeStudentData("isPremium")
+ profile.removeStudentData("pushDeviceId")
+ profile.removeStudentData("startPointsSemester1")
+ profile.removeStudentData("startPointsSemester2")
+ profile.removeStudentData("enablePointGrades")
+ profile.removeStudentData("enableDescriptiveGrades")
+ }
+ LOGIN_TYPE_MOBIDZIENNIK -> {
+
+ }
+ LOGIN_TYPE_VULCAN -> {
+ // DataVulcan.isApiLoginValid() returns false so it will update the semester
+ profile.removeStudentData("currentSemesterEndDate")
+ profile.removeStudentData("studentSemesterId")
+ profile.removeStudentData("studentSemesterNumber")
+ profile.removeStudentData("semester1Id")
+ profile.removeStudentData("semester2Id")
+ profile.removeStudentData("studentClassId")
+ }
+ LOGIN_TYPE_IDZIENNIK -> {
+ profile.removeStudentData("schoolYearId")
+ }
+ LOGIN_TYPE_EDUDZIENNIK -> {
+
+ }
+ LOGIN_TYPE_PODLASIE -> {
+
+ }
+ }
+
+ d(TAG, "Processed student data: ${profile.studentData}")
+
+ app.db.profileDao().add(profile)
+
+ if (app.profileId == oldId) {
+ val intent = Intent(
+ Intent.ACTION_MAIN,
+ "profileId" to newId
+ )
+ app.sendBroadcast(intent)
+ }
+ }
+}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/Edudziennik.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/Edudziennik.kt
index 17bf771f..23d9d3b1 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/Edudziennik.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/edudziennik/Edudziennik.kt
@@ -110,7 +110,6 @@ class Edudziennik(val app: App, val profile: Profile?, val loginStore: LoginStor
override fun cancel() {
d(TAG, "Cancelled")
data.cancel()
- callback.onCompleted()
}
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/Idziennik.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/Idziennik.kt
index e1fa6f00..e1550632 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/Idziennik.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/Idziennik.kt
@@ -133,7 +133,6 @@ class Idziennik(val app: App, val profile: Profile?, val loginStore: LoginStore,
override fun cancel() {
d(TAG, "Cancelled")
data.cancel()
- callback.onCompleted()
}
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt
index 2c6ad0e7..a2fd4d03 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/idziennik/login/IdziennikLoginWeb.kt
@@ -70,6 +70,14 @@ class IdziennikLoginWeb(val data: DataIdziennik, val onSuccess: () -> Unit) {
data.webSelectedRegister = registerId
}
+ // for profiles created after archiving
+ data.schoolYearId = Regexes.IDZIENNIK_LOGIN_FIRST_SCHOOL_YEAR.find(text)?.let {
+ it[1].toIntOrNull()
+ } ?: data.schoolYearId
+ data.profile?.studentClassName = Regexes.IDZIENNIK_LOGIN_FIRST_STUDENT.findAll(text)
+ .firstOrNull { it[1].toIntOrNull() == data.registerId }
+ ?.let { "${it[5]} ${it[6]}" } ?: data.profile?.studentClassName
+
data.profile?.let { profile ->
Regexes.IDZIENNIK_WEB_LUCKY_NUMBER.find(text)?.also {
val number = it[1].toIntOrNull() ?: return@also
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt
index 48f308f8..abf3ac5f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt
@@ -157,7 +157,6 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
override fun cancel() {
d(TAG, "Cancelled")
data.cancel()
- callback.onCompleted()
}
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/LibrusRecaptchaHelper.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/LibrusRecaptchaHelper.kt
index 94ab5ed1..3652f18a 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/LibrusRecaptchaHelper.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/LibrusRecaptchaHelper.kt
@@ -36,11 +36,14 @@ class LibrusRecaptchaHelper(
}
private var timeout: Job? = null
+ private var timedOut = false
inner class WebViewClient : android.webkit.WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
timeout?.cancel()
- onSuccess(url)
+ if (!timedOut) {
+ onSuccess(url)
+ }
return true
}
}
@@ -50,6 +53,7 @@ class LibrusRecaptchaHelper(
webView.loadDataWithBaseURL(url, html, "text/html", "UTF-8", null)
}
timeout = startCoroutineTimer(delayMillis = 10000L) {
+ timedOut = true
onTimeout()
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt
index ae5c6072..0e002576 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt
@@ -130,7 +130,6 @@ class Mobidziennik(val app: App, val profile: Profile?, val loginStore: LoginSto
override fun cancel() {
d(TAG, "Cancelled")
data.cancel()
- callback.onCompleted()
}
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/Podlasie.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/Podlasie.kt
index 30da6e02..d7ec441f 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/Podlasie.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/podlasie/Podlasie.kt
@@ -134,7 +134,6 @@ class Podlasie(val app: App, val profile: Profile?, val loginStore: LoginStore,
override fun cancel() {
Utils.d(TAG, "Cancelled")
data.cancel()
- callback.onCompleted()
}
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt
index 5843f927..843d36e9 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/Template.kt
@@ -100,7 +100,6 @@ class Template(val app: App, val profile: Profile?, val loginStore: LoginStore,
override fun cancel() {
d(TAG, "Cancelled")
data.cancel()
- callback.onCompleted()
}
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt
index e17d059f..9761343c 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt
@@ -194,7 +194,6 @@ class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, va
override fun cancel() {
d(TAG, "Cancelled")
data.cancel()
- callback.onCompleted()
}
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt
index 343c0c8b..087b8ef8 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/szkolny/interceptor/Signing.kt
@@ -46,6 +46,6 @@ object Signing {
/*fun provideKey(param1: String, param2: Long): ByteArray {*/
fun pleaseStopRightNow(param1: String, param2: Long): ByteArray {
- return "$param1.MTIzNDU2Nzg5MDtTu0zYCV===.$param2".sha256()
+ return "$param1.MTIzNDU2Nzg5MDQC7Eh97U===.$param2".sha256()
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt
index 333967b0..aee8e3af 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.kt
@@ -43,7 +43,7 @@ import pl.szczodrzynski.edziennik.data.db.migration.*
LibrusLesson::class,
TimetableManual::class,
Metadata::class
-], version = 88)
+], version = 89)
@TypeConverters(
ConverterTime::class,
ConverterDate::class,
@@ -173,7 +173,8 @@ abstract class AppDb : RoomDatabase() {
Migration85(),
Migration86(),
Migration87(),
- Migration88()
+ Migration88(),
+ Migration89()
).allowMainThreadQueries().build()
}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/ProfileDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/ProfileDao.kt
index 3225141e..6d1e799d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/ProfileDao.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/dao/ProfileDao.kt
@@ -60,4 +60,10 @@ interface ProfileDao {
@Query("UPDATE profiles SET empty = 0")
fun setAllNotEmpty()
+
+ @Query("SELECT * FROM profiles WHERE archiveId = :archiveId AND archived = 1")
+ fun getArchivesOf(archiveId: Int): List
+
+ @Query("SELECT * FROM profiles WHERE archiveId = :archiveId AND archived = 0 ORDER BY profileId DESC LIMIT 1")
+ fun getNotArchivedOf(archiveId: Int): Profile?
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Profile.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Profile.kt
index 50ad82a7..eab4cb8b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Profile.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Profile.kt
@@ -28,7 +28,7 @@ import pl.szczodrzynski.navlib.getDrawableFromRes
@Entity(tableName = "profiles", primaryKeys = ["profileId"])
open class Profile(
@ColumnInfo(name = "profileId")
- override val id: Int,
+ override var id: Int, /* needs to be var for ProfileArchiver */
val loginStoreId: Int,
val loginStoreType: Int,
@@ -64,6 +64,12 @@ open class Profile(
var empty = true
var archived = false
+ /**
+ * A unique ID matching [archived] profiles with current ones
+ * and vice-versa.
+ */
+ var archiveId: Int? = null
+
var syncEnabled = true
var enableSharedEvents = true
var registration = REGISTRATION_UNSPECIFIED
@@ -85,6 +91,23 @@ open class Profile(
@delegate:Ignore
val currentSemester by lazy { dateToSemester(Date.getToday()) }
+ fun shouldArchive(): Boolean {
+ // vulcan hotfix
+ if (dateYearEnd.month > 6) {
+ dateYearEnd.month = 6
+ dateYearEnd.day = 30
+ }
+ // fix for when versions <4.3 synced 2020/2021 year dates to older profiles during 2020 Jun-Aug
+ if (dateSemester1Start.year > studentSchoolYearStart) {
+ val diff = dateSemester1Start.year - studentSchoolYearStart
+ dateSemester1Start.year -= diff
+ dateSemester2Start.year -= diff
+ dateYearEnd.year -= diff
+ }
+ return Date.getToday() >= dateYearEnd && Date.getToday().year > studentSchoolYearStart
+ }
+ fun isBeforeYear() = Date.getToday() < dateSemester1Start
+
var disabledNotifications: List? = null
var lastReceiversSync: Long = 0
@@ -106,14 +129,18 @@ open class Profile(
get() = accountName != null
override fun getImageDrawable(context: Context): Drawable {
+ if (archived) {
+ return context.getDrawableFromRes(pl.szczodrzynski.edziennik.R.drawable.profile_archived).also {
+ it.colorFilter = PorterDuffColorFilter(colorFromName(name), PorterDuff.Mode.DST_OVER)
+ }
+ }
if (!image.isNullOrEmpty()) {
try {
- if (image?.endsWith(".gif", true) == true) {
- return GifDrawable(image ?: "")
- }
- else {
- return RoundedBitmapDrawableFactory.create(context.resources, image ?: "")
+ return if (image?.endsWith(".gif", true) == true) {
+ GifDrawable(image ?: "")
+ } else {
+ RoundedBitmapDrawableFactory.create(context.resources, image ?: "")
//return Drawable.createFromPath(image ?: "") ?: throw Exception()
}
}
@@ -125,9 +152,13 @@ open class Profile(
return context.getDrawableFromRes(R.drawable.profile).also {
it.colorFilter = PorterDuffColorFilter(colorFromName(name), PorterDuff.Mode.DST_OVER)
}
-
}
+
override fun getImageHolder(context: Context): ImageHolder {
+ if (archived) {
+ return ImageHolder(pl.szczodrzynski.edziennik.R.drawable.profile_archived, colorFromName(name))
+ }
+
return if (!image.isNullOrEmpty()) {
try {
ProfileImageHolder(image ?: "")
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/migration/Migration89.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/migration/Migration89.kt
new file mode 100644
index 00000000..ce665d1f
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/migration/Migration89.kt
@@ -0,0 +1,10 @@
+package pl.szczodrzynski.edziennik.data.db.migration
+
+import androidx.room.migration.Migration
+import androidx.sqlite.db.SupportSQLiteDatabase
+
+class Migration89 : Migration(88, 89) {
+ override fun migrate(database: SupportSQLiteDatabase) {
+ database.execSQL("ALTER TABLE profiles ADD COLUMN archiveId INTEGER DEFAULT NULL;")
+ }
+}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/debug/LabPageFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/debug/LabPageFragment.kt
index bad9fd9f..72b9f9f5 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/debug/LabPageFragment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/debug/LabPageFragment.kt
@@ -17,6 +17,7 @@ import pl.szczodrzynski.edziennik.*
import pl.szczodrzynski.edziennik.data.db.entity.Event
import pl.szczodrzynski.edziennik.databinding.LabFragmentBinding
import pl.szczodrzynski.edziennik.ui.modules.base.lazypager.LazyFragment
+import pl.szczodrzynski.edziennik.utils.TextInputDropDown
import pl.szczodrzynski.fslogin.decode
import kotlin.coroutines.CoroutineContext
@@ -62,6 +63,21 @@ class LabPageFragment : LazyFragment(), CoroutineScope {
app.db.eventDao().getRawNow("UPDATE events SET homeworkBody = NULL WHERE profileId = ${App.profileId}")
}
+ b.unarchive.onClick {
+ app.profile.archived = false
+ app.profile.archiveId = null
+ app.profileSave()
+ }
+
+ val profiles = app.db.profileDao().allNow
+ b.profile.clear()
+ b.profile += profiles.map { TextInputDropDown.Item(it.id.toLong(), "${it.id} ${it.name} archived ${it.archived}", tag = it) }
+ b.profile.select(app.profileId.toLong())
+ b.profile.setOnChangeListener {
+ activity.loadProfile(it.id.toInt())
+ return@setOnChangeListener true
+ }
+
val colorSecondary = android.R.attr.textColorSecondary.resolveAttr(activity)
startCoroutineTimer(500L, 300L) {
val text = app.cookieJar.sessionCookies
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/CardItemTouchHelperCallback.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/CardItemTouchHelperCallback.kt
index 66908998..34621474 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/CardItemTouchHelperCallback.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/CardItemTouchHelperCallback.kt
@@ -33,7 +33,7 @@ class CardItemTouchHelperCallback(private val cardAdapter: HomeCardAdapter, priv
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
- removeCard(viewHolder.adapterPosition)
+ removeCard(viewHolder.adapterPosition, cardAdapter)
cardAdapter.items.removeAt(viewHolder.adapterPosition)
cardAdapter.notifyItemRemoved(viewHolder.adapterPosition)
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/HomeFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/HomeFragment.kt
index 181dadc1..8d276a82 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/HomeFragment.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/HomeFragment.kt
@@ -28,10 +28,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
import pl.szczodrzynski.edziennik.databinding.FragmentHomeBinding
import pl.szczodrzynski.edziennik.onClick
import pl.szczodrzynski.edziennik.ui.dialogs.home.StudentNumberDialog
-import pl.szczodrzynski.edziennik.ui.modules.home.cards.HomeEventsCard
-import pl.szczodrzynski.edziennik.ui.modules.home.cards.HomeGradesCard
-import pl.szczodrzynski.edziennik.ui.modules.home.cards.HomeLuckyNumberCard
-import pl.szczodrzynski.edziennik.ui.modules.home.cards.HomeTimetableCard
+import pl.szczodrzynski.edziennik.ui.modules.home.cards.*
import pl.szczodrzynski.edziennik.utils.Themes
import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetPrimaryItem
import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetSeparatorItem
@@ -44,8 +41,8 @@ class HomeFragment : Fragment(), CoroutineScope {
fun swapCards(fromPosition: Int, toPosition: Int, cardAdapter: HomeCardAdapter): Boolean {
val fromCard = cardAdapter.items[fromPosition]
val toCard = cardAdapter.items[toPosition]
- if (fromCard.id == 100 || toCard.id == 100) {
- // debug card is not swappable
+ if (fromCard.id >= 100 || toCard.id >= 100) {
+ // debug & archive cards are not swappable
return false
}
cardAdapter.items[fromPosition] = cardAdapter.items[toPosition]
@@ -60,10 +57,16 @@ class HomeFragment : Fragment(), CoroutineScope {
return true
}
- fun removeCard(position: Int) {
+ fun removeCard(position: Int, cardAdapter: HomeCardAdapter) {
val homeCards = App.config.forProfile().ui.homeCards.toMutableList()
if (position >= homeCards.size)
return
+ val card = cardAdapter.items[position]
+ if (card.id >= 100) {
+ // debug & archive cards are not removable
+ cardAdapter.notifyDataSetChanged()
+ return
+ }
homeCards.removeAt(position)
App.config.forProfile().ui.homeCards = homeCards
}
@@ -160,6 +163,8 @@ class HomeFragment : Fragment(), CoroutineScope {
}
//if (App.devMode)
// items += HomeDebugCard(100, app, activity, this, app.profile)
+ if (app.profile.archived)
+ items.add(0, HomeArchiveCard(101, app, activity, this, app.profile))
val adapter = HomeCardAdapter(items)
val itemTouchHelper = ItemTouchHelper(CardItemTouchHelperCallback(adapter, b.refreshLayout))
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeArchiveCard.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeArchiveCard.kt
new file mode 100644
index 00000000..17fc89e4
--- /dev/null
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/home/cards/HomeArchiveCard.kt
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) Kuba Szczodrzyński 2020-8-25.
+ */
+
+package pl.szczodrzynski.edziennik.ui.modules.home.cards
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import androidx.core.view.plusAssign
+import androidx.core.view.setMargins
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import kotlinx.coroutines.*
+import pl.szczodrzynski.edziennik.*
+import pl.szczodrzynski.edziennik.data.db.entity.Profile
+import pl.szczodrzynski.edziennik.databinding.CardHomeArchiveBinding
+import pl.szczodrzynski.edziennik.ui.modules.home.HomeCard
+import pl.szczodrzynski.edziennik.ui.modules.home.HomeCardAdapter
+import pl.szczodrzynski.edziennik.ui.modules.home.HomeFragment
+import kotlin.coroutines.CoroutineContext
+
+class HomeArchiveCard(
+ override val id: Int,
+ val app: App,
+ val activity: MainActivity,
+ val fragment: HomeFragment,
+ val profile: Profile
+) : HomeCard, CoroutineScope {
+ companion object {
+ private const val TAG = "HomeArchiveCard"
+ }
+
+ private var job: Job = Job()
+ override val coroutineContext: CoroutineContext
+ get() = job + Dispatchers.Main
+
+ override fun bind(position: Int, holder: HomeCardAdapter.ViewHolder) {
+ holder.root.removeAllViews()
+ val b = CardHomeArchiveBinding.inflate(LayoutInflater.from(holder.root.context))
+ b.root.layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT).apply {
+ setMargins(8.dp)
+ }
+ holder.root += b.root
+
+ b.homeArchiveText.setText(
+ R.string.home_archive_text,
+ profile.studentSchoolYearStart,
+ profile.studentSchoolYearStart + 1
+ )
+
+ b.homeArchiveClose.onClick {
+ launch {
+ val profile = profile.archiveId?.let {
+ withContext(Dispatchers.IO) {
+ app.db.profileDao().getNotArchivedOf(it)
+ }
+ }
+ if (profile == null) {
+ MaterialAlertDialogBuilder(activity)
+ .setTitle(R.string.home_archive_close_no_target_title)
+ .setMessage(R.string.home_archive_close_no_target_text, this@HomeArchiveCard.profile.name)
+ .setPositiveButton(R.string.ok) { _, _ ->
+ activity.drawer.profileSelectionOpen()
+ activity.drawer.open()
+ }
+ .show()
+ return@launch
+ }
+ activity.loadProfile(profile)
+ }
+ }
+
+ holder.root.onClick {
+ activity.loadTarget(MainActivity.DRAWER_ITEM_AGENDA)
+ }
+ }
+
+ override fun unbind(position: Int, holder: HomeCardAdapter.ViewHolder) = Unit
+}
diff --git a/app/src/main/res/drawable/ic_archive.xml b/app/src/main/res/drawable/ic_archive.xml
new file mode 100644
index 00000000..a61f71cc
--- /dev/null
+++ b/app/src/main/res/drawable/ic_archive.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/profile_archived.xml b/app/src/main/res/drawable/profile_archived.xml
new file mode 100644
index 00000000..c816dcc8
--- /dev/null
+++ b/app/src/main/res/drawable/profile_archived.xml
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/app/src/main/res/layout/card_grades.xml b/app/src/main/res/layout/card_grades.xml
deleted file mode 100644
index 249a971f..00000000
--- a/app/src/main/res/layout/card_grades.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/card_home_archive.xml b/app/src/main/res/layout/card_home_archive.xml
new file mode 100644
index 00000000..ffe979bc
--- /dev/null
+++ b/app/src/main/res/layout/card_home_archive.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/card_home_debug.xml b/app/src/main/res/layout/card_home_debug.xml
index b0e2f41c..18d21c02 100644
--- a/app/src/main/res/layout/card_home_debug.xml
+++ b/app/src/main/res/layout/card_home_debug.xml
@@ -30,7 +30,7 @@
style="@style/Widget.MaterialComponents.Button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="Librus Captcha" />
+ android:text="LIBRUS® Captcha" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/card_home_timetable.xml b/app/src/main/res/layout/card_home_timetable.xml
index 5a1d8514..842e5b51 100644
--- a/app/src/main/res/layout/card_home_timetable.xml
+++ b/app/src/main/res/layout/card_home_timetable.xml
@@ -17,121 +17,130 @@
android:id="@+id/noTimetableLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone"
tools:visibility="visible">
-
-
+ android:text="@string/home_timetable_no_timetable"
+ android:textAppearance="@style/NavView.TextView.Title" />
-
+ android:layout_gravity="center_horizontal"
+ android:layout_margin="16dp"
+ android:fontFamily="sans-serif-light"
+ android:gravity="center_horizontal"
+ android:text="@string/home_timetable_no_timetable_text"
+ android:textSize="16sp" />
-
+
-
-
+ android:text="@string/home_timetable_no_lessons"
+ android:textAppearance="@style/NavView.TextView.Title" />
-
+ android:layout_gravity="center_horizontal"
+ android:layout_margin="16dp"
+ android:fontFamily="sans-serif-light"
+ android:gravity="center_horizontal"
+ android:text="@string/home_timetable_no_lessons_text"
+ android:textSize="16sp" />
+
-
-
+ android:text="@string/home_timetable_not_public"
+ android:textAppearance="@style/NavView.TextView.Title" />
-
+ android:layout_gravity="center_horizontal"
+ android:layout_margin="16dp"
+ android:fontFamily="sans-serif-light"
+ android:gravity="center_horizontal"
+ android:text="@string/home_timetable_not_public_text"
+ android:textSize="16sp" />
+
+ tools:layout_marginTop="410dp">
-
@@ -181,16 +189,16 @@
android:id="@+id/bellSync"
android:layout_width="40dp"
android:layout_height="40dp"
- android:padding="10dp"
android:background="?selectableItemBackgroundBorderless"
+ android:padding="10dp"
tools:src="@sample/settings" />
@@ -234,10 +242,9 @@
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:visibility="gone"
- tools:visibility="visible"
tools:max="2700"
- tools:progress="780" />
-
+ tools:progress="780"
+ tools:visibility="visible" />
-
-
-
diff --git a/app/src/main/res/layout/card_lucky_number.xml b/app/src/main/res/layout/card_lucky_number.xml
deleted file mode 100644
index 233334f5..00000000
--- a/app/src/main/res/layout/card_lucky_number.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/card_timetable.xml b/app/src/main/res/layout/card_timetable.xml
deleted file mode 100644
index 463ca17b..00000000
--- a/app/src/main/res/layout/card_timetable.xml
+++ /dev/null
@@ -1,214 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/lab_fragment.xml b/app/src/main/res/layout/lab_fragment.xml
index 279c241c..b023e11c 100644
--- a/app/src/main/res/layout/lab_fragment.xml
+++ b/app/src/main/res/layout/lab_fragment.xml
@@ -61,6 +61,19 @@
android:layout_height="wrap_content"
android:fontFamily="monospace"
tools:text="Cookies:\n\nsynergia.librus.pl\n DZIENNIKSID=L01~1234567890abcdef"/>
+
+
+
+
diff --git a/app/src/main/res/layout/login_chooser_fragment.xml b/app/src/main/res/layout/login_chooser_fragment.xml
index 90aa1bc8..a35250fb 100644
--- a/app/src/main/res/layout/login_chooser_fragment.xml
+++ b/app/src/main/res/layout/login_chooser_fragment.xml
@@ -1,11 +1,11 @@
-
-
+
+
+
+ android:layout_weight="1" />
+ tools:text="VULCAN® UONET+" />
+ tools:text="Musisz posiadać konto LIBRUS® Rodzina" />
diff --git a/app/src/main/res/layout/login_form_fragment.xml b/app/src/main/res/layout/login_form_fragment.xml
index dc6c4ffd..6bfb817f 100644
--- a/app/src/main/res/layout/login_form_fragment.xml
+++ b/app/src/main/res/layout/login_form_fragment.xml
@@ -39,7 +39,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:textSize="24sp"
- tools:text="Zaloguj się - Vulcan UONET+" />
+ tools:text="Zaloguj się - VULCAN® UONET+" />
bei iDziennik einloggen…
bei iDziennik einloggen…
Einloggen in die API…
- Einloggen bei Librus Nachrichten…
- Einloggen bei Librus Portal…
- Einloggen bei Librus Synergia…
+ Einloggen bei LIBRUS® nachrichten…
+ Einloggen bei LIBRUS® Rodzina…
+ Einloggen bei LIBRUS® Synergia…
Einloggen bei MobiDziennik…
Einloggen bei MobiDziennik…
Einloggen bei MobiDziennik API…
Einloggen bei Template API…
Einloggen bei Template WEB…
- Einloggen bei Vulcan
+ Einloggen bei VULCAN®
Gemeinsame Ereignisse synchronisieren…
Erstellen von Benachrichtigungen…
Fehler
@@ -572,13 +572,13 @@
Hilfe - iDziennik Progman
Melden Sie sich mit den Daten an, die Sie von Ihrer Schule erhalten haben. Bei Problemen verwenden Sie die Schaltfläche unter dem Formular.
Einloggen - iDziennik Progman
- Librus - Einloggen
- Um die App verwenden zu können, müssen Sie über ein Librus-Konto verfügen. Sie können sie unter portal.librus.pl erstellen. Verwenden Sie die Daten, die Sie an den im Bild markierten Stellen eingeben.
- Hilfe - Librus
- Melden Sie sich mit dem Token und der PIN an, die Sie in der Rubrik "mobile apps" von Librus Synergia erhalten können
- Einloggen - Librus JST
- Melden Sie sich mit Ihren Librus-Kontodaten an (zuvor unter Ihrer E-Mail-Adresse erstellt). Melden Sie sich nicht mit den von Ihrer Schule erhaltenen Daten an. Bei Problemen verwenden Sie die Schaltfläche unter dem Formular.
- Einloggen - Librus
+ LIBRUS® - Einloggen
+ Um die App verwenden zu können, müssen Sie über ein LIBRUS® Rodzina-Konto verfügen. Sie können sie unter portal.librus.pl erstellen. Verwenden Sie die Daten, die Sie an den im Bild markierten Stellen eingeben.
+ Hilfe für LIBRUS® einloggen
+ Melden Sie sich mit dem Token und der PIN an, die Sie in der Rubrik "mobile apps" von LIBRUS® Synergia erhalten können
+ Einloggen bei LIBRUS® JST
+ Melden Sie sich mit Ihren LIBRUS® Rodzina-Konto daten an (zuvor unter Ihrer E-Mail-Adresse erstellt). Melden Sie sich nicht mit den von Ihrer Schule erhaltenen Daten an. Bei Problemen verwenden Sie die Schaltfläche unter dem Formular.
+ Einloggen bei LIBRUS® Synergia
Ein Migrationsfehler ist aufgetreten. Er wurde bereits gemeldet, was bedeutet, dass ich versuchen werde, ihn zu beheben.\n\nSie können die App weiterhin verwenden. Bei Problemen versuchen Sie, das Profil zu entfernen und neu zu erstellen
Die App hat ein großes Update erhalten. Wenn bei der Operation Probleme auftreten, können Sie mich über die Hilfe und das Feedback im Menü kontaktieren.
Szkolny.eu wurde aktualisiert
@@ -604,12 +604,12 @@
Profil synchronisieren
Synchronisation…
Geräteregistrierung:
- Melden Sie sich bei der Desktop-Version von Vulcan E-Klassenbuch an und wählen Sie die Option \"Dostęp mobilny\". Klicken Sie \"Zarejestruj urządzenie mobilne\". Sie können die Daten eingeben oder den QR-Code scannen und nur die PIN eingeben
- Hilfe - Vulkan UONET+
+ Melden Sie sich bei der Desktop-Version von VULCAN® E-Klassenbuch an und wählen Sie die Option \"Dostęp mobilny\". Klicken Sie \"Zarejestruj urządzenie mobilne\". Sie können die Daten eingeben oder den QR-Code scannen und nur die PIN eingeben
+ Hilfe - VULCAN® UONET+
Erhaltene Daten:
QR-Code scannen
Wählen Sie \"Dostęp mobilny\" auf der E-Klassenbuch-Website, registrieren Sie ein neues Gerät und geben Sie die Daten ein. Bei Problemen verwenden Sie die Schaltfläche unter dem Formular.
- Einloggen - Vulkan UONET+
+ Einloggen - VULCAN® UONET+
Hinzufügen…
Ansicht ändern
Generieren Sie einen Blockzeitplan
@@ -803,7 +803,7 @@
Szkolny.eu: Update
Klicken Sie zum Herunterladen der Version %s
Update verfügbar
- Librus: erfordert eine Lösung für die Captcha-Aufgabe. Klicken Sie hier, um sich weiter im Tagebuch anzumelden.
+ LIBRUS® Rodzina einloggen: erfordert eine Lösung für die Captcha-Aufgabe. Klicken Sie hier, um sich weiter im Tagebuch anzumelden.
Das Problem, das die Synchronisierung verhindert, muss vom Benutzer gelöst werden. Klicken Sie für weitere Informationen
Erforderliche Aktion in der App
Keine Benachrichtigungen
@@ -854,7 +854,7 @@
Open-Source-Lizenzen
Datenschutzrichtlinie
E-Klassenbuch
- © Kuba Szczodrzyński && Kacper Ziubryniewicz\nSeptember 2018 - April 2020
+ © Kuba Szczodrzyński && Kacper Ziubryniewicz\nSeptember 2018 - August 2020
Klicken Sie hier, um nach Aktualisierungen zu suchen
Aktualisierung
Version
@@ -1049,8 +1049,8 @@
Ungültiger Schulname oder verbotene Zeichen
Die Serveradresse ist ungültig. Stellen Sie sicher, dass es korrekt eingegeben wurde und keine Leerzeichen enthält.
Ungültiges Token angegeben.
- Das LIBRUS-Konto hat die Verbindung zum Synergia-Konto verloren. Melden Sie sich bei portal.librus.pl oder der offiziellen Librus App an und befolgen Sie die Anweisungen zur Reparatur Ihres Kontos.
- Das LIBRUS-Konto wurde nicht aktiviert. Aktivieren Sie das Konto mit der E-Mail, die Sie erhalten haben.
+ Das LIBRUS® Rodzina-Konto hat die Verbindung zum LIBRUS® Synergia-Konto verloren. Melden Sie sich bei portal.librus.pl oder der offiziellen "LIBRUS®" App an und befolgen Sie die Anweisungen zur Reparatur Ihres Kontos.
+ Das LIBRUS® Rodzina-Konto wurde nicht aktiviert. Aktivieren Sie das Konto mit der E-Mail, die Sie erhalten haben.
Anmeldefehler
Technische Pause\n\nVersuchen Sie es später erneut
API-Adresse nicht gefunden. Versuchen Sie erneut, sich am Gerät anzumelden.
@@ -1063,7 +1063,7 @@
Student %s ist diesem Konto im Klassenbuch nicht zugeordnet (Login: %s).\n\nVersuchen Sie erneut, sich anzumelden, obwohl dies möglicherweise auf eine technische Unterbrechung im E-Klassenbuch hinweist.
Fehler beim Speichern der Daten. Melden Sie den Fehler.
Fehler beim Herstellen einer sicheren Verbindung.
- Das Synergia-Konto wurde nicht von einem Elternteil oder Erziehungsberechtigten aktiviert.\n\nLoggen Sie sich in portal.librus.pl ein und befolgen Sie die Anweisungen, um es zu aktivieren.
+ Das LIBRUS® Synergia-Konto wurde nicht von einem Elternteil oder Erziehungsberechtigten aktiviert.\n\nLoggen Sie sich in portal.librus.pl ein und befolgen Sie die Anweisungen, um es zu aktivieren.
Auszeit
Unbekannter Fehler
Stundenplan herunterladen
diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml
index e6d90882..c9cfc0c6 100644
--- a/app/src/main/res/values-en/strings.xml
+++ b/app/src/main/res/values-en/strings.xml
@@ -310,15 +310,15 @@
Logging in to iDziennik…
Logging in to iDziennik…
Logging in to the API…
- Logging in to Librus Messages…
- Logging in to Librus Portal…
- Logging in to Librus Synergia…
+ Logging in to LIBRUS® messages…
+ Logging in to LIBRUS® Rodzina…
+ Logging in to LIBRUS® Synergia…
Logging in to MobiDziennik…
Logging in to MobiDziennik…
Logging in to MobiDziennik…
Logging in to Template API…
Logging in to Template WEB…
- Logging in to Vulcan
+ Logging in to VULCAN®
Syncing shared events…
Creating notifications…
Error
@@ -572,13 +572,13 @@
Help - iDziennik Progman
Use the data which you got from your school. In case of any problems, use the button below the form.
Log in - iDziennik Progman
- Librus - login
- In order to use the app you need a Librus account. You can create it on portal.librus.pl. Use the data you normally enter in the fields marked on the image.
- Help - Librus
- Log in with the token and PIN, which you can get from the "mobile apps" section of Librus Synergia.
- Log in - Librus JST
- Log in using your Librus account data (created before on your e-mail address). You can\'t login using the data provided by your school. In case of any problems, use the button below the form.
- Log in - Librus
+ LIBRUS® - login
+ In order to use the app you need a LIBRUS® Rodzina account. You can create it on portal.librus.pl. Use the data you normally enter in the fields marked on the image.
+ Help for LIBRUS® login
+ Log in with the token and PIN, which you can get from the "mobile apps" section of LIBRUS® Synergia.
+ Log in to LIBRUS® JST
+ Log in using your LIBRUS® Rodzina account data (created before on your e-mail address). You can\'t login using the data provided by your school. In case of any problems, use the button below the form.
+ Log in to LIBRUS® Synergia
A migration error has occurred. It\'s already reported, which means I\'ll try to fix it.\n\nYou can continue using the app. In case of any problems try to remove the profile and create it again.
The app got a huge update. If you encounter any problems, feel free to contact me using the Feedback option in the menu.
Szkolny.eu has been updated
@@ -606,12 +606,12 @@
Syncing profile
Syncing…
Registering the device:
- Login into desktop version of Vulcan e-register and select \"Dostęp mobilny\" option. Click \"Zarejestruj urządzenie mobilne\". You can type in the data or scan the QR code and type only the PIN.
- Help - Vulcan UONET+
+ Login into desktop version of VULCAN® e-register and select \"Dostęp mobilny\" option. Click \"Zarejestruj urządzenie mobilne\". You can type in the data or scan the QR code and type only the PIN.
+ Help - VULCAN® UONET+
Obtained data:
Scan QR code
Choose \"Dostęp mobilny\" on e-register website, register a new device and enter the data. In case of any problems, use the button below the form.
- Log in - Vulcan UONET+
+ Log in - VULCAN® UONET+
Add…
Change view
Generate a block timetable
@@ -805,7 +805,7 @@
Szkolny.eu: update
Click to download version %s
Update available
- Librus: Captcha verification required. Click to continue logging into the e-journal.
+ LIBRUS® Rodzina login: Captcha verification required. Click to continue logging into the e-journal.
The problem that prevents synchronization must be solved by the user. Click for more information.
Action required in the application
No notifications.
@@ -856,7 +856,7 @@
Open-source licenses
Privacy policy
E-register
- © Kuba Szczodrzyński && Kacper Ziubryniewicz\nSeptember 2018 - April 2020
+ © Kuba Szczodrzyński && Kacper Ziubryniewicz\nSeptember 2018 - August 2020
Click to check for updates
Update
Version
@@ -1051,8 +1051,8 @@
Invalid school name or forbidden characters
Server address is invalid. Make sure it\'s entered correctly and doesn\'t contain whitespaces.
Invalid token specified.
- LIBRUS account has lost connection with the Synergia account. Login on portal.librus.pl or in the Librus mobile app and follow the instructions to fix the problem.
- LIBRUS account is not activated. Activate it using a link in the received e-mail.
+ LIBRUS® Rodzina account has lost connection with the LIBRUS® Synergia account. Login on portal.librus.pl or in the "LIBRUS®" mobile app and follow the instructions to fix the problem.
+ LIBRUS® account is not activated. Activate it using a link in the received e-mail.
Login error
Maintenance
API address not found. Try to login again.
@@ -1065,7 +1065,7 @@
Student %s is not assigned to this register (login: %s).\n\nTry to log in again although this may also indicate a maintenance time.
Error while saving data. Report the error.
Failed to establish a secure connection.
- The Synergia account hasn\'t been activated by a parent or legal guardian.\n\nLog into portal.librus.pl and follow the instructions in order to activate it.
+ The LIBRUS® Synergia account hasn\'t been activated by a parent or legal guardian.\n\nLog into portal.librus.pl and follow the instructions in order to activate it.
Timeout
Unknown error
Syncing agenda…
diff --git a/app/src/main/res/values/errors.xml b/app/src/main/res/values/errors.xml
index 0fe3df08..3e5f48d6 100644
--- a/app/src/main/res/values/errors.xml
+++ b/app/src/main/res/values/errors.xml
@@ -222,7 +222,7 @@
Brak uczniów przypisanych do konta
Wymagane rozwiązanie zadania Captcha
- Librus: wymagane rozwiązanie zadania Captcha
+ LIBRUS®️: wymagane rozwiązanie zadania Captcha
CODE_INTERNAL_LIBRUS_ACCOUNT_410
CODE_INTERNAL_LIBRUS_SYNERGIA_EXPIRED
@@ -232,7 +232,7 @@
Wymagana akceptacja regulaminu
Błąd zmiany hasła
Wymagana zmiana hasła
- Librus API: nieprawidłowe dane logowania
+ LIBRUS® API: nieprawidłowe dane logowania
Inny błąd logowania do API
Brak tokenu CSRF
Konto LIBRUS nie zostało aktywowane
@@ -256,12 +256,12 @@
Brak dostępu do Wiadomości
Brak dostępu do Synergii
Brak ID sesji Wiadomości
- Odmowa dostępu do Portalu Librus
- API Portalu Librus wyłączone
- Konto LIBRUS utraciło połączenie z kontem Synergia. Zaloguj się na stronie portal.librus.pl lub w oficjalnej aplikacji Librus i postępuj zgodnie z instrukcją, aby naprawić konto.
- Inny błąd Portalu Librus
- Nie znaleziono konta Synergia. Zaloguj się na stronie portal.librus.pl, a następnie powiąż swoje konto Synergia do konta Librus Portal.
- Inny błąd logowania do Portalu Librus
+ Odmowa dostępu do Portalu LIBRUS®
+ API Portalu LIBRUS® wyłączone
+ Konto LIBRUS® utraciło połączenie z kontem Synergia. Zaloguj się na stronie portal.librus.pl lub w oficjalnej aplikacji LIBRUS® i postępuj zgodnie z instrukcją, aby naprawić konto.
+ Inny błąd Portalu LIBRUS®
+ Nie znaleziono konta Synergia. Zaloguj się na stronie portal.librus.pl, a następnie powiąż swoje konto Synergia do konta LIBRUS® Portal.
+ Inny błąd logowania do Portalu LIBRUS®
ERROR_LOGIN_LIBRUS_PORTAL_CODE_EXPIRED
ERROR_LOGIN_LIBRUS_PORTAL_CODE_REVOKED
ERROR_LOGIN_LIBRUS_PORTAL_NO_CLIENT_ID
@@ -273,21 +273,21 @@
ERROR_LOGIN_LIBRUS_PORTAL_REFRESH_INVALID
ERROR_LOGIN_LIBRUS_PORTAL_REFRESH_REVOKED
ERROR_LIBRUS_SYNERGIA_OTHER
- Librus Synergia: przerwa techniczna
- Librus Wiadomości: przerwa techniczna
- Librus Wiadomości: serwer zwrócił błąd. Prześlij zgłoszenie błędu.
- Librus Wiadomości: serwer zwrócił nieznany błąd. Prześlij zgłoszenie błędu.
- Librus Wiadomości: nieprawidłowe dane logowania
- Librus Portal: nieprawidłowe dane logowania
- Librus API: przerwa techniczna
- Librus Portal: przerwa techniczna
+ LIBRUS® Synergia: przerwa techniczna
+ LIBRUS® Wiadomości: przerwa techniczna
+ LIBRUS® Wiadomości: serwer zwrócił błąd. Prześlij zgłoszenie błędu.
+ LIBRUS® Wiadomości: serwer zwrócił nieznany błąd. Prześlij zgłoszenie błędu.
+ LIBRUS® Wiadomości: nieprawidłowe dane logowania
+ LIBRUS® Portal: nieprawidłowe dane logowania
+ LIBRUS® API: przerwa techniczna
+ LIBRUS® Portal: przerwa techniczna
Wystąpił problem z tablicą ogłoszeń
- Librus: Sesja logowania wygasła. Zaloguj się ponownie.
+ LIBRUS®: Sesja logowania wygasła. Zaloguj się ponownie.
Urządzenie jest już zarejestrowane
Nie znaleziono wiadomości. Mogła zostać usunięta.
Nieprawidłowe dane dostępu. Sprawdź poprawność wprowadzonych danych.
Nie znaleziono załącznika. Mógł zostać usunięty.
- Logowanie Librus Wiadomości: ReCaptcha przekroczono czas oczekiwania.
+ Logowanie LIBRUS® Wiadomości: ReCaptcha przekroczono czas oczekiwania.
Nieprawidłowy login lub hasło
Podano stare hasło
@@ -311,13 +311,13 @@
Nieprawidłowy PIN: pozostała 1 próba
Nieprawidłowy PIN: pozostały 2 próby
Token wygasły, wygeneruj ponownie
- Inny błąd logowania do Vulcana
+ Inny błąd logowania do dziennika VULCAN®
Dziennik przedszkolny - logowanie niemożliwe
Brak uczniów przypisanych do konta, bądź ukończyli oni już szkołę
- Vulcan: przerwa techniczna
- Vulcan: błąd żądania, zgłoś błąd
- Vulcan: inny błąd, wyślij zgłoszenie
- Vulcan: nie znaleziono adresu załącznika
+ VULCAN®: przerwa techniczna
+ VULCAN®: błąd żądania, zgłoś błąd
+ VULCAN®: inny błąd, wyślij zgłoszenie
+ VULCAN®: nie znaleziono adresu załącznika
Nieprawidłowe dane logowania
Nieprawidłowa nazwa szkoły
@@ -360,14 +360,14 @@
EXCEPTION_LOGIN_LIBRUS_API_TOKEN
EXCEPTION_LOGIN_LIBRUS_PORTAL_TOKEN
EXCEPTION_LIBRUS_PORTAL_SYNERGIA_TOKEN
- Zgłoś błąd: wyjątek w API Librus
+ Zgłoś błąd: wyjątek w API LIBRUS®
EXCEPTION_LIBRUS_SYNERGIA_REQUEST
EXCEPTION_MOBIDZIENNIK_WEB_REQUEST
EXCEPTION_VULCAN_API_REQUEST
EXCEPTION_MOBIDZIENNIK_WEB_FILE_REQUEST
EXCEPTION_LIBRUS_MESSAGES_FILE_REQUEST
EXCEPTION_NOTIFY
- Zgłoś błąd: pobieranie wiadomości Librus
+ Zgłoś błąd: pobieranie wiadomości LIBRUS®
EXCEPTION_IDZIENNIK_WEB_REQUEST
EXCEPTION_IDZIENNIK_WEB_API_REQUEST
EXCEPTION_IDZIENNIK_API_REQUEST
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e06adfef..60874690 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -343,15 +343,15 @@
Logowanie do iDziennika…
Logowanie do iDziennika…
Logowanie do API
- Logowanie do wiadomości Librus
- Logowanie do Portalu Librus
- Logowanie do Librus Synergia
+ Logowanie do wiadomości LIBRUS®
+ Logowanie do Portalu LIBRUS® Rodzina
+ Logowanie do LIBRUS® Synergia
Logowanie do API MobiDziennika…
Logowanie do API MobiDziennika…
Logowanie do MobiDziennika…
Logowanie do Template API…
Logowanie do Template WEB…
- Logowanie do Vulcan API…
+ Logowanie do VULCAN® API…
Synchronizowanie udostępnionych wydarzeń…
Tworzenie powiadomień…
…
@@ -621,13 +621,13 @@
Pomoc - iDziennik Progman
Zaloguj się danymi, które otrzymałeś od swojej szkoły. W razie problemów skorzystaj z przycisku pod formularzem.
Zaloguj się - iDziennik Progman
- Librus - logowanie
- Aby korzystać z aplikacji musisz posiadać konto Librus. Możesz je założyć na stronie portal.librus.pl. Użyj danych, które wpisujesz w miejsca zaznaczone na obrazku.
- Pomoc - Librus
- Zaloguj się tokenem i kodem PIN, który można wygenerować po zalogowanu się do Synergii w zakładce Aplikacje mobilne.
- Zaloguj się - Librus JST
- Zaloguj się danymi swojego konta Librus (założonego wcześniej na swój adres e-mail). Nie należy logować się danymi otrzymanymi ze swojej szkoły. W razie problemów skorzystaj z przycisku pod formularzem.
- Zaloguj się - Librus
+ LIBRUS® - logowanie
+ Aby korzystać z aplikacji musisz posiadać konto LIBRUS® Rodzina. Możesz je założyć na stronie portal.librus.pl. Użyj danych, które wpisujesz w miejsca zaznaczone na obrazku.
+ Pomoc do logowania LIBRUS®
+ Zaloguj się tokenem i kodem PIN, który można wygenerować po zalogowanu się do LIBRUS® Synergia w zakładce Aplikacje mobilne.
+ Zaloguj się do LIBRUS® JST
+ Zaloguj się danymi swojego konta LIBRUS® Rodzina (założonego wcześniej na swój adres e-mail). Nie należy logować się danymi otrzymanymi ze swojej szkoły. W razie problemów skorzystaj z przycisku pod formularzem.
+ Zaloguj się do LIBRUS® Synergia
Wystąpił błąd w migracji danych. Został on już zgłoszony, co oznacza, że postaram się go naprawić.\n\nMożesz zacząć korzystać z aplikacji, jednak w przypadku jakichś błędów spróbuj usunąć profil i zalogować się ponownie.
Aplikacja otrzymała dużą aktualizację. Jeżeli będą występować jakieś problemy w działaniu, możesz się ze mną skontaktować używając pozycji Pomoc i opinie w menu.
Szkolny.eu został zaktualizowany
@@ -655,12 +655,12 @@
Synchronizuję profil
Synchronizacja…
Rejestracja urządzenia:
- Zaloguj się w wersji komputerowej dziennika Vulcan, a następnie wybierz opcję Dostęp mobilny. Kliknij Zarejestruj urządzenie mobilne. Możesz wpisać otrzymane dane lub zeskanować kod QR i wpisać sam kod PIN.
- Pomoc - Vulcan UONET+
+ Zaloguj się w wersji komputerowej dziennika VULCAN®, a następnie wybierz opcję Dostęp mobilny. Kliknij Zarejestruj urządzenie mobilne. Możesz wpisać otrzymane dane lub zeskanować kod QR i wpisać sam kod PIN.
+ Pomoc - VULCAN® UONET+
Otrzymane dane:
Skanuj kod QR
Wybierz opcję Dostęp mobilny na stronie e-dziennika, zarejestruj nowe urządzenie i wpisz otrzymane dane. W razie problemów skorzystaj z przycisku pod formularzem.
- Zaloguj się - Vulcan UONET+
+ Zaloguj się - VULCAN® UONET+
Dodaj…
Zmień widok
Generuj blokowy plan lekcji
@@ -861,7 +861,7 @@
Szkolny.eu: aktualizacja
Kliknij, aby pobrać wersję %s
Dostępna aktualizacja
- Librus: wymagane rozwiązanie zadania Captcha. Kliknij, aby kontynuować logowanie do dziennika.
+ Logowanie do LIBRUS® Rodzina: wymagane rozwiązanie zadania Captcha. Kliknij, aby kontynuować logowanie do dziennika.
Problem, który uniemożliwia synchronizację musi być rozwiązany przez użytkownika. Kliknij, aby uzyskać więcej informacji.
Wymagane działanie w aplikacji
Brak powiadomień.
@@ -919,7 +919,7 @@
Licencje open-source
Polityka prywatności
E-dziennik
- © Kuba Szczodrzyński && Kacper Ziubryniewicz\nwrzesień 2018 - kwiecień 2020
+ © Kuba Szczodrzyński && Kacper Ziubryniewicz\nwrzesień 2018 - sierpień 2020
Kliknij, aby sprawdzić aktualizacje
Aktualizacja
Wersja
@@ -1118,8 +1118,8 @@
Podano nieprawidłową nazwę szkoły lub zawiera niedozwolone znaki.
Podany adres serwera jest nieprawidłowy. Upewnij się, że jest wpisany poprawnie oraz nie zawiera żadnych spacji.\n\nWpisywany adres nie powinien zawierać części http://…mobidziennik.pl.
Podano nieprawidłowy token.
- Konto LIBRUS utraciło połączenie z kontem Synergia. Zaloguj się na stronie portal.librus.pl lub w oficjalnej aplikacji Librus i postępuj zgodnie z instrukcją, aby naprawić konto.
- Konto LIBRUS nie zostało aktywowane. Aktywuj konto korzystając z otrzymanego e-maila.
+ Konto LIBRUS® Rodzina utraciło połączenie z kontem LIBRUS® Synergia. Zaloguj się na stronie portal.librus.pl lub w oficjalnej aplikacji "LIBRUS®" i postępuj zgodnie z instrukcją, aby naprawić konto.
+ Konto LIBRUS® Rodzina nie zostało aktywowane. Aktywuj konto korzystając z otrzymanego e-maila.
Bład logowania
Chwilowa przerwa techniczna\n\nSpróbuj ponownie później
Nie znaleziono adresu API. Spróbuj zalogować urządzenie ponownie.
@@ -1132,7 +1132,7 @@
Uczeń %s nie jest przypisany do tego konta w dzienniku (login: %s).\n\nSpróbuj zalogować się ponownie, aczkolwiek może to oznaczać przerwę techniczną e-dziennika.
Błąd podczas zapisywania danych. Zgłoś błąd deweloperowi.
Nie można nawiązać bezpiecznego połączenia.
- Konto Synergia nie zostało potwierdzone przez rodzica/opiekuna prawnego.\n\nZaloguj się na stronie portal.librus.pl i postępuj zgodnie z instrukcjami.
+ Konto LIBRUS® Synergia nie zostało potwierdzone przez rodzica/opiekuna prawnego.\n\nZaloguj się na stronie portal.librus.pl i postępuj zgodnie z instrukcjami.
Przekroczono czas oczekiwania.\n\nNiewystarczająca jakość połączenia internetowego lub przerwa techniczna e-dziennika
Nieznany błąd
Pobieram terminarz…
@@ -1317,18 +1317,18 @@
ID rodzaju podstawowego
Jaki masz e-dziennik w szkole?
Wybierz z jakiego e-dziennika korzysta Twoja szkoła. Jeśli masz kilka kont w różnych dziennikach, będziesz mógł je dodać później.
- Librus/Synergia
+ LIBRUS® Rodzina / Synergia
Zaloguj używając e-maila
- Musisz posiadać konto Librus Rodzina
+ Musisz posiadać konto LIBRUS® Rodzina
Zaloguj używając loginu i hasła
Użyj loginu w postaci \"9874123u\"
- Logowanie przez platformę VULCAN
+ Logowanie przez platformę VULCAN®
Tylko Oświata w Radomiu oraz Innowacyjny Tarnobrzeg
- Vulcan UONET+
+ VULCAN® UONET+
Użyj tokenu, symbolu i kodu PIN
- Zarejestruj urządzenie na stronie dziennika Vulcan
+ Zarejestruj urządzenie na stronie dziennika VULCAN®
Użyj e-maila/nazwy użytkownika i hasła
- Zaloguj danymi, które podajesz na stronie e-dziennika VULCAN
+ Zaloguj danymi, które podajesz na stronie e-dziennika VULCAN®
MobiDziennik
Zaloguj nazwą serwera, loginem i hasłem
Podaj dane, których używasz na stronie e-dziennika
@@ -1337,13 +1337,13 @@
Ładowanie listy e-dzienników…
Jeśli trwa to za długo, sprawdź swoje połączenie internetowe i zrestartuj aplikację.
Zaloguj się - %s
- Zaloguj się swoim kontem Librus, które działa w oficjalnej aplikacji Librus oraz na stronie portal.librus.pl, w niebieskim formularzu.\n\nJeśli nie masz konta Librus, możesz je założyć na stronie https://portal.librus.pl/rodzina/register.
- Podaj login otrzymany od szkoły, którym logujesz się do Synergii (fioletowy formularz).\n\nZalecane jest logowanie kontem Portal Librus (używając e-maila) w poprzednim kroku.
- Zaloguj się do Librusa na komputerze, wybierz zakładkę Aplikacje Mobilne, następnie wpisz otrzymany Token i PIN poniżej.
- Zaloguj się do dziennika Vulcan na komputerze, wybierz zakładkę Dostęp Mobilny, kliknij przycisk Zarejestruj urządzenie mobilne. Podaj otrzymany Token, Symbol i PIN w polach poniżej.
- Podaj dane, którymi logujesz się na stronie internetowej dziennika VULCAN lub na miejskiej platformie.
+ Zaloguj się swoim kontem LIBRUS® Rodzina, które działa w oficjalnej aplikacji "LIBRUS®" oraz na stronie portal.librus.pl, w niebieskim formularzu.\n\nJeśli nie masz konta LIBRUS® Rodzina, możesz je założyć na stronie https://portal.librus.pl/rodzina/register.
+ Podaj login otrzymany od szkoły, którym logujesz się do LIBRUS® Synergia (fioletowy formularz).\n\nZalecane jest logowanie kontem LIBRUS® Rodzina (używając e-maila) w poprzednim kroku.
+ Zaloguj się do LIBRUS® Synergia na komputerze, wybierz zakładkę Aplikacje Mobilne, następnie wpisz otrzymany Token i PIN poniżej.
+ Zaloguj się do dziennika VULCAN® na komputerze, wybierz zakładkę Dostęp Mobilny, kliknij przycisk Zarejestruj urządzenie mobilne. Podaj otrzymany Token, Symbol i PIN w polach poniżej.
+ Podaj dane, którymi logujesz się na stronie internetowej dziennika VULCAN® lub na miejskiej platformie.
Podaj dane, których używasz do logowania na stronie MobiDziennika. Jako adres serwera możesz wpisać adres strony internetowej, na której masz MobiDziennik.
- Logowanie do dziennika Vulcan...
+ Logowanie do dziennika VULCAN®...
iDziennik Progman / iUczniowie
Zaloguj używając nazwy użytkownika i hasła
Podaj dane, których używasz na stronie internetowej e-dziennika
@@ -1356,4 +1356,16 @@
Zaloguj używając tokenu
Podaj token aplikacji mobilnej.
Logowanie do PPE…
+ Profil jest archiwalny
+ Przeglądasz dane ucznia z poprzedniego roku szkolnego (%d/%d). Synchronizacja oraz pobieranie wiadomości i niektórych zadań domowych zostały wyłączone.\n\nAby otworzyć profil ucznia z aktualnego roku, wybierz "Zamknij archiwum" na stronie głównej.
+ Wakacje ;)
+ Prawdopodobnie rok szkolny dla tego ucznia jeszcze się nie zaczął (zacznie się %s). Spróbuj wykonać synchronizację później.
+ Koniec roku szkolnego
+ Rok szkolny zakończył się %s. Dane ucznia z poprzedniego roku zostaną przeniesione do archiwum, aby można było je później przeglądać.
+ Profil archiwalny
+ Przeglądasz dane ucznia z roku szkolnego %d/%d.
+ Zamknij archiwum
+ Brak aktualnego profilu
+ Uczeń %s nie posiada profilu na tym koncie w aktualnym roku szkolnym. Prawdopodobnie ten profil został usunięty lub uczeń nie uczęszcza już do tej klasy.\n\nAby przejść do aktualnego profilu, wybierz ucznia z listy lub zaloguj się na jego konto przyciskiem Dodaj ucznia.
+ Znaki towarowe zamieszczone w tej aplikacji należą do ich prawowitych właścicieli i są używane wyłącznie w celach informacyjnych.
diff --git a/build.gradle b/build.gradle
index 6224a05e..da3c5573 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,8 +5,8 @@ buildscript {
kotlin_version = '1.3.61'
release = [
- versionName: "4.2.1",
- versionCode: 4020199
+ versionName: "4.3",
+ versionCode: 4030099
]
setup = [
@@ -17,7 +17,7 @@ buildscript {
]
versions = [
- gradleAndroid : '4.0.0-beta05',
+ gradleAndroid : '4.1.0-rc01',
kotlin : ext.kotlin_version,
ktx : "1.2.0",
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index d4331d8b..85e720be 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Fri Dec 06 18:23:03 CET 2019
+#Mon Aug 24 17:15:24 CEST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.2.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
diff --git a/gradlew b/gradlew
old mode 100644
new mode 100755
diff --git a/mhttp/src/main/java/im/wangchao/mhttp/internal/Version.java b/mhttp/src/main/java/im/wangchao/mhttp/internal/Version.java
index 70b59853..847fe87e 100644
--- a/mhttp/src/main/java/im/wangchao/mhttp/internal/Version.java
+++ b/mhttp/src/main/java/im/wangchao/mhttp/internal/Version.java
@@ -1,7 +1,5 @@
package im.wangchao.mhttp.internal;
-import im.wangchao.mhttp.BuildConfig;
-
/**
* Description : Version.
* Author : wangchao.
@@ -14,7 +12,7 @@ public class Version {
}
public static String userAgent() {
- return moduleName().concat(BuildConfig.VERSION_NAME);
+ return moduleName().concat("1.10.1");
}
public static String moduleName() {