From f883318bd2c3d8c71739e1949236f844dc95058b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 24 Aug 2020 17:42:53 +0200 Subject: [PATCH 01/15] [Gradle] Fix compilation issues in latest Android Studio. --- .idea/compiler.xml | 16 ++++++++++++++++ .idea/misc.xml | 3 +-- app/build.gradle | 4 ++-- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- .../java/im/wangchao/mhttp/internal/Version.java | 4 +--- 6 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 .idea/compiler.xml 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 @@ - - + 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/build.gradle b/build.gradle index 6224a05e..ad09a5b1 100644 --- a/build.gradle +++ b/build.gradle @@ -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/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() { From 300e2c4bc2c52c2f6c8107c4a05ea1b5f13c77bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 24 Aug 2020 18:16:47 +0200 Subject: [PATCH 02/15] [API/Librus] Fix doubled sync on reCaptcha timeout. --- .../data/api/edziennik/librus/LibrusRecaptchaHelper.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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() } } From 33a8fa2a1e4fd24047f650f9a0b0ca5474fd11ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Mon, 24 Aug 2020 18:56:26 +0200 Subject: [PATCH 03/15] [API] Fix doubled sync on API error. --- .../szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt | 2 ++ .../edziennik/data/api/edziennik/edudziennik/Edudziennik.kt | 1 - .../edziennik/data/api/edziennik/idziennik/Idziennik.kt | 1 - .../szczodrzynski/edziennik/data/api/edziennik/librus/Librus.kt | 1 - .../edziennik/data/api/edziennik/mobidziennik/Mobidziennik.kt | 1 - .../edziennik/data/api/edziennik/podlasie/Podlasie.kt | 1 - .../edziennik/data/api/edziennik/template/Template.kt | 1 - .../szczodrzynski/edziennik/data/api/edziennik/vulcan/Vulcan.kt | 1 - 8 files changed, 2 insertions(+), 7 deletions(-) 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..ce50bfad 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 { @@ -108,6 +109,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/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/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/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 { From 7c6dbca98610046710070bc87a9730a5b7a1a701 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Tue, 25 Aug 2020 10:46:50 +0200 Subject: [PATCH 04/15] [API] Implement basic profile archiving. --- .../szczodrzynski/edziennik/MainActivity.kt | 6 +- .../data/api/edziennik/EdziennikTask.kt | 25 +++++- .../data/api/edziennik/ProfileArchiver.kt | 88 +++++++++++++++++++ .../szczodrzynski/edziennik/data/db/AppDb.kt | 5 +- .../edziennik/data/db/entity/Profile.kt | 8 +- .../data/db/migration/Migration89.kt | 10 +++ .../ui/modules/debug/LabPageFragment.kt | 6 ++ app/src/main/res/layout/lab_fragment.xml | 7 ++ 8 files changed, 148 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/ProfileArchiver.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/migration/Migration89.kt diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt index 3033f0f0..54db8814 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt @@ -299,6 +299,10 @@ class MainActivity : AppCompatActivity(), CoroutineScope { b.nightlyText.isVisible = true b.nightlyText.text = "Nightly\n"+BuildConfig.VERSION_NAME.substringAfterLast(".") } + else if (BuildConfig.VERSION_NAME.contains("daily")) { + b.nightlyText.isVisible = true + b.nightlyText.text = "Daily\n"+BuildConfig.VERSION_NAME.substringAfterLast(".") + } else b.nightlyText.isVisible = false @@ -399,7 +403,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope { } app.db.profileDao().all.observe(this, Observer { profiles -> - drawer.setProfileList(profiles.filter { it.id >= 0 }.toMutableList()) + drawer.setProfileList(profiles.filter { it.id >= 0 && !it.archived }.toMutableList()) drawer.currentProfile = App.profileId }) 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 ce50bfad..90780d7b 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 @@ -26,6 +26,7 @@ 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 +import pl.szczodrzynski.edziennik.utils.models.Date open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTask(profileId) { companion object { @@ -72,10 +73,28 @@ 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.dateYearEnd.month > 6) { + profile.dateYearEnd.month = 6 + profile.dateYearEnd.day = 30 + } + if (profile.archived) { + d(TAG, "The profile $profileId is archived") + taskCallback.onError(ApiError(TAG, ERROR_PROFILE_ARCHIVED)) + return + } + else if (Date.getToday() >= profile.dateYearEnd) { + d(TAG, "The profile $profileId's year ended on ${profile.dateYearEnd}, archiving") + ProfileArchiver(app, profile) + } + if (Date.getToday() < profile.dateSemester1Start) { + 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) 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..7c8e9aa9 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/ProfileArchiver.kt @@ -0,0 +1,88 @@ +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") + } + 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/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/entity/Profile.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/entity/Profile.kt index 50ad82a7..e9d931a5 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 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..304a7df7 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 @@ -62,6 +62,12 @@ 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 colorSecondary = android.R.attr.textColorSecondary.resolveAttr(activity) startCoroutineTimer(500L, 300L) { val text = app.cookieJar.sessionCookies diff --git a/app/src/main/res/layout/lab_fragment.xml b/app/src/main/res/layout/lab_fragment.xml index 279c241c..acc924a7 100644 --- a/app/src/main/res/layout/lab_fragment.xml +++ b/app/src/main/res/layout/lab_fragment.xml @@ -61,6 +61,13 @@ android:layout_height="wrap_content" android:fontFamily="monospace" tools:text="Cookies:\n\nsynergia.librus.pl\n DZIENNIKSID=L01~1234567890abcdef"/> + +