diff --git a/.github/workflows/build-release-aab-play.yml b/.github/workflows/build-release-aab-play.yml
index 95fec5cb..eb6923bb 100644
--- a/.github/workflows/build-release-aab-play.yml
+++ b/.github/workflows/build-release-aab-play.yml
@@ -113,10 +113,11 @@ jobs:
with:
serviceAccountJsonPlainText: ${{ secrets.PLAY_SERVICE_ACCOUNT_JSON }}
packageName: pl.szczodrzynski.edziennik
- releaseFile: ${{ needs.sign.outputs.signedReleaseFile }}
+ releaseFiles: ${{ needs.sign.outputs.signedReleaseFile }}
releaseName: ${{ steps.changelog.outputs.appVersionName }}
track: ${{ secrets.PLAY_RELEASE_TRACK }}
whatsNewDirectory: ${{ steps.changelog.outputs.changelogDir }}
+ status: completed
- name: Upload workflow artifact
uses: actions/upload-artifact@v2
diff --git a/app/build.gradle b/app/build.gradle
index c6e8ef86..0ceae1a1 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -156,6 +156,7 @@ dependencies {
implementation "androidx.navigation:navigation-fragment-ktx:2.5.2"
implementation "androidx.recyclerview:recyclerview:1.2.1"
implementation "androidx.room:room-runtime:2.4.3"
+ implementation "androidx.room:room-ktx:2.4.3"
implementation "androidx.work:work-runtime-ktx:2.7.1"
kapt "androidx.room:room-compiler:2.4.3"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2c24b426..da531480 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -160,7 +160,11 @@
+ android:theme="@style/Theme.MaterialComponents.Light.DarkActionBar" />
+
diff --git a/app/src/main/assets/pl-changelog.html b/app/src/main/assets/pl-changelog.html
index e49ccaa1..af4aaca4 100644
--- a/app/src/main/assets/pl-changelog.html
+++ b/app/src/main/assets/pl-changelog.html
@@ -1,9 +1,10 @@
-
Wersja 4.13.2, 2022-11-28
+Wersja 4.13.6, 2023-03-24
- - Poprawiono synchronizację w Mobidzienniku bez ustawionego adresu e-mail.
- - Poprawiono błąd synchronizacji w Vulcanie.
+ - Naprawiono pobieranie załączników na Androidzie 13 i nowszym.
+ - Dodano opcję odświeżenia planu lekcji na wybrany tydzień.
+ - Usunięto błędy logowania. @BxOxSxS
Dzięki za korzystanie ze Szkolnego!
-© [Kuba Szczodrzyński](@kuba2k2) 2022
+© [Kuba Szczodrzyński](@kuba2k2) 2023
diff --git a/app/src/main/cpp/szkolny-signing.cpp b/app/src/main/cpp/szkolny-signing.cpp
index 582bc8b3..9ae8f745 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] = {
- 0x8c, 0xad, 0x9c, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+ 0x6d, 0xa5, 0x32, 0xe6, 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 30225982..74e23d88 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt
@@ -235,6 +235,7 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
}
Signing.getCert(this)
+ Utils.initializeStorageDir(this)
launch {
withContext(Dispatchers.Default) {
@@ -422,6 +423,12 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
try {
App.data = AppData.get(profile.loginStoreType)
d("App", "Loaded AppData: ${App.data}")
+ // apply newly-added config overrides, if not changed by the user yet
+ for ((key, value) in App.data.configOverrides) {
+ val config = App.profile.config
+ if (!config.has(key))
+ config.set(key, value)
+ }
} catch (e: Exception) {
Log.e("App", "Cannot load AppData", e)
Toast.makeText(this, R.string.app_cannot_load_data, Toast.LENGTH_LONG).show()
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
index ce39bc77..7965d17a 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
@@ -322,7 +322,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
// IT'S WINTER MY DUDES
val today = Date.getToday()
- if ((today.month % 11 == 1) && app.config.ui.snowfall) {
+ if ((today.month / 3 % 4 == 0) && app.config.ui.snowfall) {
b.rootFrame.addView(layoutInflater.inflate(R.layout.snowfall, b.rootFrame, false))
} else if (app.config.ui.eggfall && BigNightUtil().isDataWielkanocyNearDzisiaj()) {
val eggfall = layoutInflater.inflate(
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/config/AppData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/config/AppData.kt
index 6f72b82e..a0fa7c27 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/config/AppData.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/config/AppData.kt
@@ -59,10 +59,11 @@ data class AppData(
val lessonHeight: Int,
val enableMarkAsReadAnnouncements: Boolean,
val enableNoticePoints: Boolean,
+ val eventManualShowSubjectDropdown: Boolean,
)
data class EventType(
- val id: Int,
+ val id: Long,
val color: String,
val name: String,
)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/config/BaseConfig.kt b/app/src/main/java/pl/szczodrzynski/edziennik/config/BaseConfig.kt
index 69d232c5..76d95b0b 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/config/BaseConfig.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/config/BaseConfig.kt
@@ -43,4 +43,6 @@ abstract class BaseConfig(
db.configDao().add(ConfigEntry(profileId ?: -1, key, value))
}
}
+
+ fun has(key: String) = values.containsKey(key)
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/config/ProfileConfig.kt b/app/src/main/java/pl/szczodrzynski/edziennik/config/ProfileConfig.kt
index 4df2ef47..c36b6fae 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/config/ProfileConfig.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/config/ProfileConfig.kt
@@ -15,7 +15,7 @@ class ProfileConfig(
entries: List?,
) : BaseConfig(db, profileId, entries) {
companion object {
- const val DATA_VERSION = 4
+ const val DATA_VERSION = 5
}
val grades by lazy { ProfileConfigGrades(this) }
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/config/ProfileConfigUI.kt b/app/src/main/java/pl/szczodrzynski/edziennik/config/ProfileConfigUI.kt
index 4bfaf047..35951082 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/config/ProfileConfigUI.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/config/ProfileConfigUI.kt
@@ -15,6 +15,7 @@ class ProfileConfigUI(base: ProfileConfig) {
var agendaGroupByType by base.config(false)
var agendaLessonChanges by base.config(true)
var agendaTeacherAbsence by base.config(true)
+ var agendaSubjectImportant by base.config(false)
var agendaElearningMark by base.config(false)
var agendaElearningGroup by base.config(true)
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/config/utils/ProfileConfigMigration.kt b/app/src/main/java/pl/szczodrzynski/edziennik/config/utils/ProfileConfigMigration.kt
index c5b56690..ab915b1d 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/config/utils/ProfileConfigMigration.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/config/utils/ProfileConfigMigration.kt
@@ -16,6 +16,8 @@ import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.YEAR_AL
class ProfileConfigMigration(config: ProfileConfig) {
init { config.apply {
+ val profile = db.profileDao().getByIdNow(profileId ?: -1)
+
if (dataVersion < 2) {
sync.notificationFilter = sync.notificationFilter + NotificationType.TEACHER_ABSENCE
@@ -37,11 +39,23 @@ class ProfileConfigMigration(config: ProfileConfig) {
// switch to new event types (USOS)
dataVersion = 4
- val profile = db.profileDao().getByIdNow(profileId ?: -1)
if (profile?.loginStoreType?.schoolType == SchoolType.UNIVERSITY) {
db.eventTypeDao().clear(profileId ?: -1)
db.eventTypeDao().addDefaultTypes(profile)
}
}
+
+ if (dataVersion < 5) {
+ // update USOS event types and the appropriate events (2022-12-25)
+ dataVersion = 5
+
+ if (profile?.loginStoreType?.schoolType == SchoolType.UNIVERSITY) {
+ db.eventTypeDao().getAllWithDefaults(profile)
+ // wejściówka (4) -> kartkówka (3)
+ db.eventDao().getRawNow("UPDATE events SET eventType = 3 WHERE profileId = $profileId AND eventType = 4;")
+ // zadanie (6) -> zadanie domowe (-1)
+ db.eventDao().getRawNow("UPDATE events SET eventType = -1 WHERE profileId = $profileId AND eventType = 6;")
+ }
+ }
}}
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt
index c29b8698..31fabaea 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt
@@ -26,9 +26,10 @@ val LIBRUS_USER_AGENT = "${SYSTEM_USER_AGENT}LibrusMobileApp"
const val SYNERGIA_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Gecko/20100101 Firefox/62.0"
const val LIBRUS_CLIENT_ID = "VaItV6oRutdo8fnjJwysnTjVlvaswf52ZqmXsJGP"
const val LIBRUS_REDIRECT_URL = "app://librus"
-const val LIBRUS_AUTHORIZE_URL = "https://portal.librus.pl/oauth2/authorize?client_id=$LIBRUS_CLIENT_ID&redirect_uri=$LIBRUS_REDIRECT_URL&response_type=code"
-const val LIBRUS_LOGIN_URL = "https://portal.librus.pl/rodzina/login/action"
+const val LIBRUS_AUTHORIZE_URL = "https://portal.librus.pl/konto-librus/redirect/dru"
+const val LIBRUS_LOGIN_URL = "https://portal.librus.pl/konto-librus/login/action"
const val LIBRUS_TOKEN_URL = "https://portal.librus.pl/oauth2/access_token"
+const val LIBRUS_HEADER = "pl.librus.synergiaDru2"
const val LIBRUS_ACCOUNT_URL = "/v3/SynergiaAccounts/fresh/" // + login
const val LIBRUS_ACCOUNTS_URL = "/v3/SynergiaAccounts"
@@ -59,9 +60,6 @@ const val LIBRUS_SANDBOX_URL = "https://sandbox.librus.pl/index.php?action="
const val LIBRUS_SYNERGIA_HOMEWORK_ATTACHMENT_URL = "https://synergia.librus.pl/homework/downloadFile"
const val LIBRUS_SYNERGIA_MESSAGES_ATTACHMENT_URL = "https://synergia.librus.pl/wiadomosci/pobierz_zalacznik"
-const val LIBRUS_PORTAL_RECAPTCHA_KEY = "6Lf48moUAAAAAB9ClhdvHr46gRWR"
-const val LIBRUS_PORTAL_RECAPTCHA_REFERER = "https://portal.librus.pl/rodzina/login"
-
val MOBIDZIENNIK_USER_AGENT = SYSTEM_USER_AGENT
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt
index f3d5a297..70388abf 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Regexes.kt
@@ -24,6 +24,25 @@ object Regexes {
"""^\[META:([A-z0-9-&=]+)]""".toRegex()
}
+ val HTML_INPUT_HIDDEN by lazy {
+ """""".toRegex()
+ }
+ val HTML_INPUT_NAME by lazy {
+ """name="(.+?)"""".toRegex()
+ }
+ val HTML_INPUT_VALUE by lazy {
+ """value="(.+?)"""".toRegex()
+ }
+ val HTML_CSRF_TOKEN by lazy {
+ """name="csrf-token" content="([A-z0-9=+/\-_]+?)"""".toRegex()
+ }
+ val HTML_FORM_ACTION by lazy {
+ """