Compare commits

...

5 Commits

Author SHA1 Message Date
cb553b1a33
merge: v2.6.5
All checks were successful
Generate debug APK / build (push) Successful in 47m47s
2024-05-12 20:59:38 +02:00
f5a95421a1
refresh & normalize READMEs 2024-05-12 19:47:36 +02:00
Mikołaj Pich
26596e8254
Merge branch 'release/2.6.5' into develop 2024-05-12 17:51:07 +02:00
Mikołaj Pich
6e472d6c5c
Version 2.6.5 2024-05-12 17:50:56 +02:00
Rafał Borcz
6f4826249c
Add remote mapping for Wulkanowy SDK (#2550)
Co-authored-by: Mikołaj Pich <m.pich@outlook.com>
2024-05-12 16:21:28 +02:00
24 changed files with 249 additions and 137 deletions

View File

@ -8,30 +8,34 @@
* Skrýt komentáře. * Skrýt komentáře.
* falešná docházka % * falešná docházka %
Přístup ke skrytému panelu: Chcete-li se dostat na skrytý panel:
1. přejděte na záložku "Více". 1. Přejděte na kartu „Další“.
2. přejděte na panel "Nastavení". 2. Přejděte na panel „Nastavení“.
3. přejděte na panel "O aplikaci". 3. Přejděte na panel „O aplikaci“.
4. klikněte pětkrát na logo aplikace 4. Klikněte 5x na logo aplikace
5. přejděte zpět do nastavení (budete muset obnovit zobrazení, přejít na domovskou obrazovku a vrátit se do nastavení). 5. Přejděte na domovskou obrazovku
6. Přejděte do nastavení
7. Zadejte „tajná nastavení“
# Instalace # Instalace
Legenda:
- `*-fdroid-*` - verze přizpůsobená F-Droid | Název souboru | Přizpůsobeno |
- `*-hms-*` - verze přizpůsobená Huawei AppGallery | ---------------- | ----------------- |
- `*-play-*` - verze přizpůsobená Obchodu Play | `*-fdroid-*.apk` | F-Droid |
| `*-hms-*.apk` | Huawei AppGallery |
| `*-play-*.apk` | Play Store |
- Verze vydání (**doporučeno pro většinu uživatelů**) 1. Vydaná verze (**doporučeno pro většinu uživatelů**):
Stáhněte si vybranou verzi z [releases](https://git.sador.me/sadorowo/wulkanowy-mod/releases). Stáhněte si vybranou verzi z [releases](https://git.sador.me/sadorowo/wulkanowy-mod/releases).
Doporučujeme stáhnout nejnovější dostupnou verzi. Doporučujeme stáhnout nejnovější dostupnou verzi.
- Verze ladění (pro lidi, kteří chtějí ladit aplikaci, zejména požadavky na server VULCAN)
2. Verze ladění (pro lidi, kteří chtějí ladit aplikaci, zejména požadavky na server VULCAN):
Přejděte [sem](https://git.sador.me/sadorowo/wulkanowy-mod/actions?workflow=build_android_debug.yml).
Přejděte na první výsledek shora nebo vyberte verzi DEV, kterou chcete stáhnout. Přejděte [sem](https://git.sador.me/sadorowo/wulkanowy-mod/actions?workflow=build_android_debug.yml).
Stáhněte si vybranou verzi ze souborů vygenerovaných při sestavování aplikace. Přejděte na první výsledek shora nebo vyberte verzi DEV, kterou chcete stáhnout.
Stáhněte si vybranou verzi ze souborů vygenerovaných při sestavování aplikace.
> Chcete si přečíst více o projektu Wulkanowy?
> # O projektu Wulkanowy
> [Klikněte zde](https://github.com/wulkanowy/wulkanowy)
Chcete si přečíst více o projektu Wulkanowy? [Klikněte sem](https://github.com/wulkanowy/wulkanowy)

View File

@ -8,30 +8,34 @@
* Kommentare ausblenden. * Kommentare ausblenden.
* Anwesenheit fälschen % * Anwesenheit fälschen %
So greifen Sie auf das verborgene Panel zu: So gelangen Sie zum ausgeblendeten Bereich:
1. Gehen Sie auf die Registerkarte "Mehr". 1. Gehen Sie zur Registerkarte „Mehr“.
2. Gehen Sie zum Bereich "Einstellungen". 2. Gehen Sie zum Bereich „Einstellungen“.
3. Gehen Sie auf das Feld "Über die Anwendung". 3. Gehen Sie zum Bereich „Über die Anwendung“.
4. Klicken Sie 5 Mal auf das Logo der Anwendung 4. Klicken Sie fünfmal auf das Anwendungslogo
5. Gehen Sie zurück zu den Einstellungen (Sie müssen die Ansicht aktualisieren, zum Startbildschirm wechseln und zu den Einstellungen zurückkehren) 5. Gehen Sie zum Startbildschirm
6. Gehen Sie zu den Einstellungen
7. Geben Sie „Geheime Einstellungen“ ein
# Installation # Installation
Legende:
- `*-fdroid-*` an F-Droid angepasste Version | Dateiname | Angepasst an |
- `*-hms-*` an Huawei AppGallery angepasste Version | ---------------- | ----------------- |
- `*-play-*` an den Play Store angepasste Version | `*-fdroid-*.apk` | F-Droid |
| `*-hms-*.apk` | Huawei AppGallery |
| `*-play-*.apk` | Play Store |
- Release-Version (**für die meisten Benutzer empfohlen**) 1. Release-Version (**empfohlen für die meisten Benutzer**):
Laden Sie die ausgewählte Version von [releases](https://git.sador.me/sadorowo/wulkanowy-mod/releases) herunter.
Wir empfehlen, die neueste verfügbare Version herunterzuladen.
- Debug-Version (für Leute, die die Anwendung debuggen möchten, insbesondere Anfragen an den VULCAN-Server)
Gehen Sie [hier](https://git.sador.me/sadorowo/wulkanowy-mod/actions?workflow=build_android_debug.yml).
Gehen Sie zum ersten Ergebnis von oben oder wählen Sie die DEV-Version aus, die Sie herunterladen möchten.
Laden Sie die ausgewählte Version aus den beim Erstellen der Anwendung generierten Dateien herunter.
> Möchten Sie mehr über das Wulkanowy-Projekt lesen? Laden Sie die ausgewählte Version von [releases](https://git.sador.me/sadorowo/wulkanowy-mod/releases) herunter.
> Wir empfehlen, die neueste verfügbare Version herunterzuladen.
> [Klicken Sie hier](https://github.com/wulkanowy/wulkanowy)
2. Debug-Version (für Leute, die die Anwendung debuggen möchten, insbesondere Anfragen an den VULCAN-Server):
Gehen Sie [hier](https://git.sador.me/sadorowo/wulkanowy-mod/actions?workflow=build_android_debug.yml).
Gehen Sie zum ersten Ergebnis von oben oder wählen Sie die DEV-Version aus, die Sie herunterladen möchten.
Laden Sie die ausgewählte Version aus den beim Erstellen der Anwendung generierten Dateien herunter.
# Über das Wulkanowy-Projekt
Möchten Sie mehr über das Wulkanowy-Projekt lesen? [Hier klicken](https://github.com/wulkanowy/wulkanowy)

View File

@ -9,29 +9,33 @@
* fake attendance %. * fake attendance %.
To get to the hidden panel: To get to the hidden panel:
1. go to the "More" tab 1. Go to the "More" tab
2. go to the "Settings" panel 2. Go to the "Settings" panel
3. go to the "About application" panel 3. Go to the "About application" panel
4. click 5 times on the application logo 4. Click on the application logo 5 times
5. go back to settings (a refresh of the view will be required, go to the home screen and return to settings) 5. Go to the home screen
6. Go to settings
7. Enter "secret settings"
# Installation # Installation
Legend:
- `*-fdroid-*` - version adapted to F-Droid | File name | Adapted to |
- `*-hms-*` - version adapted to Huawei AppGallery | ---------------- | ----------------- |
- `*-play-*` - version adapted to the Play Store | `*-fdroid-*.apk` | F-Droid |
| `*-hms-*.apk` | Huawei AppGallery |
| `*-play-*.apk` | Play Store |
- Release version (**recommended for most users**) 1. Release version (**recommended for most users**):
Download the selected version from [releases](https://git.sador.me/sadorowo/wulkanowy-mod/releases).
We recommend downloading the latest available version.
- Debug version (for people who want to debug the application, especially requests to the VULCAN server)
Go [here](https://git.sador.me/sadorowo/wulkanowy-mod/actions?workflow=build_android_debug.yml).
Go to the first result from the top or select the DEV version you want to download.
Download the selected version from artifacts generated when building the application.
> Do you want to read more about the Wulkanowy project? Download the selected version from [releases](https://git.sador.me/sadorowo/wulkanowy-mod/releases).
> We recommend downloading the latest available version.
> [Click here](https://github.com/wulkanowy/wulkanowy)
2. Debug version (for people who want to debug the application, especially requests to the VULCAN server):
Go [here](https://git.sador.me/sadorowo/wulkanowy-mod/actions?workflow=build_android_debug.yml).
Go to the first result from the top or select the DEV version you want to download.
Download the selected version from the files generated when building the application.
# About the Wulkanowy project
Want to read more about the Wulkanowy project? [Click here](https://github.com/wulkanowy/wulkanowy)

View File

@ -13,25 +13,29 @@ Aby dostać się do ukrytego panelu:
2. Przejdź do panelu "Ustawienia" 2. Przejdź do panelu "Ustawienia"
3. Przejdź do panelu "O aplikacji" 3. Przejdź do panelu "O aplikacji"
4. Kliknij 5 razy w logo aplikacji 4. Kliknij 5 razy w logo aplikacji
5. Wróć do ustawień (wymagane będzie odświeżenie widoku, przejdź na ekran główny i wróć do ustawień) 5. Przejdź na ekran główny
6. Wejdź w ustawienia
7. Wejdź w "sekretne ustawienia"
# Instalacja # Instalacja
Legenda:
- `*-fdroid-*` - wersja przystosowana do F-Droid | Nazwa pliku | Przystosowana do |
- `*-hms-*` - wersja przystosowana do Huawei AppGallery | ---------------- | ----------------- |
- `*-play-*` - wersja przystosowana do Play Store | `*-fdroid-*.apk` | F-Droid |
| `*-hms-*.apk` | Huawei AppGallery |
| `*-play-*.apk` | Sklep Play |
- Wersja release (**zalecana dla większości użytkowników**) 1. Wersja release (**zalecana dla większości użytkowników**):
Pobierz wybraną wersję z [wydań](https://git.sador.me/sadorowo/wulkanowy-mod/releases).
Zalecamy pobranie najnowszej dostępnej wersji.
- Wersja debug (dla osób chcących debugować aplikację, a w szczególności żądania do serwera VULCANa)
Udaj się [tutaj](https://git.sador.me/sadorowo/wulkanowy-mod/actions?workflow=build_android_debug.yml).
Wejdź na pierwszy wynik od góry, bądź wybierz wersję DEV którą chcesz pobrać.
Pobierz wybraną wersję z plików wygenerowanych podczas budowania aplikacji.
> Chcesz poczytać więcej o projekcie Wulkanowy? Pobierz wybraną wersję z [wydań](https://git.sador.me/sadorowo/wulkanowy-mod/releases).
> Zalecamy pobranie najnowszej dostępnej wersji.
> [Kliknij tutaj](https://github.com/wulkanowy/wulkanowy)
2. Wersja debug (dla osób chcących debugować aplikację, a w szczególności żądania do serwera VULCANa):
Udaj się [tutaj](https://git.sador.me/sadorowo/wulkanowy-mod/actions?workflow=build_android_debug.yml).
Wejdź na pierwszy wynik od góry, bądź wybierz wersję DEV którą chcesz pobrać.
Pobierz wybraną wersję z plików wygenerowanych podczas budowania aplikacji.
# O projekcie Wulkanowy
Chcesz poczytać więcej o projekcie Wulkanowy? [Kliknij tutaj](https://github.com/wulkanowy/wulkanowy)

View File

@ -8,30 +8,34 @@
* Skryť komentáre. * Skryť komentáre.
* falošná dochádzka % * falošná dochádzka %
Prístup k skrytému panelu: Ak chcete prejsť na skrytý panel:
1. prejdite na kartu "Viac". 1. Prejdite na kartu „Viac“.
2. prejdite na panel "Nastavenia". 2. Prejdite na panel „Nastavenia“.
3. prejdite na panel "O aplikácii" 3. Prejdite na panel „O aplikácii“.
4. 5-krát kliknite na logo aplikácie 4. Kliknite 5-krát na logo aplikácie
5. vráťte sa do nastavení (budete musieť obnoviť zobrazenie, prejsť na domovskú obrazovku a vrátiť sa do nastavení) 5. Prejdite na domovskú obrazovku
6. Prejdite do nastavení
7. Zadajte „tajné nastavenia“
# Inštalácia # Inštalácia
Legenda:
- `*-fdroid-*` - verzia prispôsobená pre F-Droid | Názov súboru | Prispôsobené |
- `*-hms-*` - verzia prispôsobená Huawei AppGallery | ---------------- | ----------------- |
- `*-play-*` - verzia prispôsobená Obchodu Play | `*-fdroid-*.apk` | F-Droid |
| `*-hms-*.apk` | Huawei AppGallery |
| `*-play-*.apk` | Play Store |
- Verzia vydania (**odporúčané pre väčšinu používateľov**) 1. Verzia vydania (**odporúčané pre väčšinu používateľov**):
Stiahnite si vybranú verziu z [releases](https://git.sador.me/sadorowo/wulkanowy-mod/releases). Stiahnite si vybranú verziu z [releases](https://git.sador.me/sadorowo/wulkanowy-mod/releases).
Odporúčame stiahnuť najnovšiu dostupnú verziu. Odporúčame stiahnuť najnovšiu dostupnú verziu.
- Verzia ladenia (pre ľudí, ktorí chcú ladiť aplikáciu, najmä požiadavky na server VULCAN)
Choďte [sem](https://git.sador.me/sadorowo/wulkanowy-mod/actions?workflow=build_android_debug.yml).
Prejdite na prvý výsledok zhora alebo vyberte verziu DEV, ktorú chcete stiahnuť.
Stiahnite si vybranú verziu zo súborov vygenerovaných pri zostavovaní aplikácie.
> Chcete si prečítať viac o projekte Wulkanowy? 2. Verzia ladenia (pre ľudí, ktorí chcú ladiť aplikáciu, najmä požiadavky na server VULCAN):
>
> [Kliknite sem](https://github.com/wulkanowy/wulkanowy) Choďte [sem](https://git.sador.me/sadorowo/wulkanowy-mod/actions?workflow=build_android_debug.yml).
Prejdite na prvý výsledok zhora alebo vyberte verziu DEV, ktorú chcete stiahnuť.
Stiahnite si vybranú verziu zo súborov vygenerovaných pri zostavovaní aplikácie.
# O projekte Wulkanowy
Chcete si prečítať viac o projekte Wulkanowy? [Kliknite sem](https://github.com/wulkanowy/wulkanowy)

View File

@ -27,8 +27,8 @@ android {
testApplicationId "io.github.tests.wulkanowy" testApplicationId "io.github.tests.wulkanowy"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 34 targetSdkVersion 34
versionCode 164 versionCode 165
versionName "2.6.4" versionName "2.6.5"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
resValue "string", "app_name", "Wulkanowy" resValue "string", "app_name", "Wulkanowy"
@ -161,7 +161,7 @@ play {
track = 'production' track = 'production'
releaseStatus = ReleaseStatus.IN_PROGRESS releaseStatus = ReleaseStatus.IN_PROGRESS
userFraction = 0.99d userFraction = 0.99d
updatePriority = 4 updatePriority = 3
enabled.set(false) enabled.set(false)
} }
@ -191,7 +191,7 @@ ext {
} }
dependencies { dependencies {
implementation 'io.github.wulkanowy:sdk:2.6.3' implementation 'io.github.wulkanowy:sdk:2.6.4'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'

View File

@ -13,8 +13,8 @@ import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import io.github.wulkanowy.data.api.AdminMessageService import io.github.wulkanowy.data.api.services.SchoolsService
import io.github.wulkanowy.data.api.SchoolsService import io.github.wulkanowy.data.api.services.WulkanowyService
import io.github.wulkanowy.data.db.AppDatabase import io.github.wulkanowy.data.db.AppDatabase
import io.github.wulkanowy.data.db.SharedPrefProvider import io.github.wulkanowy.data.db.SharedPrefProvider
import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.PreferencesRepository
@ -71,7 +71,7 @@ internal class DataModule {
okHttpClient: OkHttpClient, okHttpClient: OkHttpClient,
json: Json, json: Json,
appInfo: AppInfo appInfo: AppInfo
): AdminMessageService = Retrofit.Builder() ): WulkanowyService = Retrofit.Builder()
.baseUrl(appInfo.messagesBaseUrl) .baseUrl(appInfo.messagesBaseUrl)
.client(okHttpClient) .client(okHttpClient)
.addConverterFactory(json.asConverterFactory("application/json".toMediaType())) .addConverterFactory(json.asConverterFactory("application/json".toMediaType()))

View File

@ -5,6 +5,7 @@ import io.github.wulkanowy.data.db.dao.StudentDao
import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Semester
import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.data.db.entities.StudentIsEduOne import io.github.wulkanowy.data.db.entities.StudentIsEduOne
import io.github.wulkanowy.data.repositories.WulkanowyRepository
import io.github.wulkanowy.sdk.Sdk import io.github.wulkanowy.sdk.Sdk
import io.github.wulkanowy.utils.RemoteConfigHelper import io.github.wulkanowy.utils.RemoteConfigHelper
import io.github.wulkanowy.utils.WebkitCookieManagerProxy import io.github.wulkanowy.utils.WebkitCookieManagerProxy
@ -20,6 +21,7 @@ class WulkanowySdkFactory @Inject constructor(
private val remoteConfig: RemoteConfigHelper, private val remoteConfig: RemoteConfigHelper,
private val webkitCookieManagerProxy: WebkitCookieManagerProxy, private val webkitCookieManagerProxy: WebkitCookieManagerProxy,
private val studentDb: StudentDao, private val studentDb: StudentDao,
private val wulkanowyRepository: WulkanowyRepository,
) { ) {
private val eduOneMutex = Mutex() private val eduOneMutex = Mutex()
@ -36,14 +38,29 @@ class WulkanowySdkFactory @Inject constructor(
addInterceptor(chuckerInterceptor, network = true) addInterceptor(chuckerInterceptor, network = true)
} }
fun create() = sdk fun createBase() = sdk
suspend fun create(): Sdk {
val mapping = wulkanowyRepository.getMapping()
return createBase().apply {
if (mapping != null) {
endpointsMapping = mapping.endpoints
vTokenMapping = mapping.vTokens
}
}
}
suspend fun create(student: Student, semester: Semester? = null): Sdk { suspend fun create(student: Student, semester: Semester? = null): Sdk {
val overrideIsEduOne = checkEduOneAndMigrateIfNecessary(student) val overrideIsEduOne = checkEduOneAndMigrateIfNecessary(student)
return buildSdk(student, semester, overrideIsEduOne) return buildSdk(student, semester, overrideIsEduOne)
} }
private fun buildSdk(student: Student, semester: Semester?, isStudentEduOne: Boolean): Sdk { private suspend fun buildSdk(
student: Student,
semester: Semester?,
isStudentEduOne: Boolean
): Sdk {
return create().apply { return create().apply {
email = student.email email = student.email
password = student.password password = student.password

View File

@ -0,0 +1,14 @@
package io.github.wulkanowy.data.api.models
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class Mapping(
@SerialName("endpoints")
val endpoints: Map<String, Map<String, Map<String, String>>>,
@SerialName("vTokens")
val vTokens: Map<String, Map<String, Map<String, String>>>,
)

View File

@ -1,4 +1,4 @@
package io.github.wulkanowy.data.api package io.github.wulkanowy.data.api.services
import io.github.wulkanowy.data.pojos.IntegrityRequest import io.github.wulkanowy.data.pojos.IntegrityRequest
import io.github.wulkanowy.data.pojos.LoginEvent import io.github.wulkanowy.data.pojos.LoginEvent

View File

@ -1,12 +1,16 @@
package io.github.wulkanowy.data.api package io.github.wulkanowy.data.api.services
import io.github.wulkanowy.data.api.models.Mapping
import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.db.entities.AdminMessage
import retrofit2.http.GET import retrofit2.http.GET
import javax.inject.Singleton import javax.inject.Singleton
@Singleton @Singleton
interface AdminMessageService { interface WulkanowyService {
@GET("/v1.json") @GET("/v1.json")
suspend fun getAdminMessages(): List<AdminMessage> suspend fun getAdminMessages(): List<AdminMessage>
}
@GET("/mapping1.json")
suspend fun getMapping(): Mapping
}

View File

@ -10,6 +10,7 @@ import com.fredporciuncula.flow.preferences.Serializer
import com.fredporciuncula.flow.preferences.map import com.fredporciuncula.flow.preferences.map
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import io.github.wulkanowy.R import io.github.wulkanowy.R
import io.github.wulkanowy.data.api.models.Mapping
import io.github.wulkanowy.data.enums.AppTheme import io.github.wulkanowy.data.enums.AppTheme
import io.github.wulkanowy.data.enums.AttendanceCalculatorSortingMode import io.github.wulkanowy.data.enums.AttendanceCalculatorSortingMode
import io.github.wulkanowy.data.enums.GradeColorTheme import io.github.wulkanowy.data.enums.GradeColorTheme
@ -445,6 +446,15 @@ class PreferencesRepository @Inject constructor(
get() = sharedPref.getString(PREF_KEY_INSTALLATION_ID, null).orEmpty() get() = sharedPref.getString(PREF_KEY_INSTALLATION_ID, null).orEmpty()
private set(value) = sharedPref.edit { putString(PREF_KEY_INSTALLATION_ID, value) } private set(value) = sharedPref.edit { putString(PREF_KEY_INSTALLATION_ID, value) }
var mapping: Mapping?
get() {
val value = sharedPref.getString("mapping", null)
return value?.let { json.decodeFromString(it) }
}
set(value) = sharedPref.edit(commit = true) {
putString("mapping", value?.let { json.encodeToString(it) })
}
init { init {
if (installationId.isEmpty()) { if (installationId.isEmpty()) {
installationId = UUID.randomUUID().toString() installationId = UUID.randomUUID().toString()

View File

@ -1,7 +1,7 @@
package io.github.wulkanowy.data.repositories package io.github.wulkanowy.data.repositories
import io.github.wulkanowy.data.WulkanowySdkFactory import io.github.wulkanowy.data.WulkanowySdkFactory
import io.github.wulkanowy.data.api.SchoolsService import io.github.wulkanowy.data.api.services.SchoolsService
import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Semester
import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.data.db.entities.StudentWithSemesters

View File

@ -1,20 +1,23 @@
package io.github.wulkanowy.data.repositories package io.github.wulkanowy.data.repositories
import io.github.wulkanowy.data.Resource import io.github.wulkanowy.data.Resource
import io.github.wulkanowy.data.api.AdminMessageService import io.github.wulkanowy.data.api.models.Mapping
import io.github.wulkanowy.data.api.services.WulkanowyService
import io.github.wulkanowy.data.db.dao.AdminMessageDao import io.github.wulkanowy.data.db.dao.AdminMessageDao
import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.db.entities.AdminMessage
import io.github.wulkanowy.data.networkBoundResource import io.github.wulkanowy.data.networkBoundResource
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.filterNot import kotlinx.coroutines.flow.filterNot
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@Singleton @Singleton
class AdminMessageRepository @Inject constructor( class WulkanowyRepository @Inject constructor(
private val adminMessageService: AdminMessageService, private val wulkanowyService: WulkanowyService,
private val adminMessageDao: AdminMessageDao, private val adminMessageDao: AdminMessageDao,
private val preferencesRepository: PreferencesRepository,
) { ) {
private val saveFetchResultMutex = Mutex() private val saveFetchResultMutex = Mutex()
@ -24,11 +27,28 @@ class AdminMessageRepository @Inject constructor(
mutex = saveFetchResultMutex, mutex = saveFetchResultMutex,
isResultEmpty = { false }, isResultEmpty = { false },
query = { adminMessageDao.loadAll() }, query = { adminMessageDao.loadAll() },
fetch = { adminMessageService.getAdminMessages() }, fetch = { wulkanowyService.getAdminMessages() },
shouldFetch = { true }, shouldFetch = { true },
saveFetchResult = { oldItems, newItems -> saveFetchResult = { oldItems, newItems ->
adminMessageDao.removeOldAndSaveNew(oldItems, newItems) adminMessageDao.removeOldAndSaveNew(oldItems, newItems)
}, },
) )
.filterNot { it is Resource.Intermediate } .filterNot { it is Resource.Intermediate }
suspend fun getMapping(): Mapping? {
var savedMapping = preferencesRepository.mapping
if (savedMapping == null) {
fetchMapping()
savedMapping = preferencesRepository.mapping
}
return savedMapping
}
suspend fun fetchMapping() {
runCatching { wulkanowyService.getMapping() }
.onFailure { Timber.e(it) }
.onSuccess { preferencesRepository.mapping = it }
}
} }

View File

@ -5,14 +5,14 @@ import io.github.wulkanowy.data.db.entities.AdminMessage
import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.data.enums.MessageType import io.github.wulkanowy.data.enums.MessageType
import io.github.wulkanowy.data.mapResourceData import io.github.wulkanowy.data.mapResourceData
import io.github.wulkanowy.data.repositories.AdminMessageRepository
import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.PreferencesRepository
import io.github.wulkanowy.data.repositories.WulkanowyRepository
import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.AppInfo
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import javax.inject.Inject import javax.inject.Inject
class GetAppropriateAdminMessageUseCase @Inject constructor( class GetAppropriateAdminMessageUseCase @Inject constructor(
private val adminMessageRepository: AdminMessageRepository, private val wulkanowyRepository: WulkanowyRepository,
private val preferencesRepository: PreferencesRepository, private val preferencesRepository: PreferencesRepository,
private val appInfo: AppInfo private val appInfo: AppInfo
) { ) {
@ -22,7 +22,7 @@ class GetAppropriateAdminMessageUseCase @Inject constructor(
} }
operator fun invoke(scrapperBaseUrl: String, type: MessageType): Flow<Resource<AdminMessage?>> { operator fun invoke(scrapperBaseUrl: String, type: MessageType): Flow<Resource<AdminMessage?>> {
return adminMessageRepository.getAdminMessages().mapResourceData { adminMessages -> return wulkanowyRepository.getAdminMessages().mapResourceData { adminMessages ->
adminMessages adminMessages
.asSequence() .asSequence()
.filter { it.isNotDismissed() } .filter { it.isNotDismissed() }

View File

@ -59,7 +59,7 @@ class CaptchaDialog : BaseDialogFragment<DialogCaptchaBinding>() {
webView = this webView = this
with(settings) { with(settings) {
javaScriptEnabled = true javaScriptEnabled = true
userAgentString = wulkanowySdkFactory.create().userAgent userAgentString = wulkanowySdkFactory.createBase().userAgent
} }
webViewClient = object : WebViewClient() { webViewClient = object : WebViewClient() {

View File

@ -118,5 +118,6 @@ class LoginActivity : BaseActivity<LoginPresenter, ActivityLoginBinding>(), Logi
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
inAppUpdateHelper.onResume() inAppUpdateHelper.onResume()
presenter.updateSdkMappings()
} }
} }

View File

@ -1,12 +1,15 @@
package io.github.wulkanowy.ui.modules.login package io.github.wulkanowy.ui.modules.login
import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.data.repositories.WulkanowyRepository
import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.BasePresenter
import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.base.ErrorHandler
import kotlinx.coroutines.launch
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
class LoginPresenter @Inject constructor( class LoginPresenter @Inject constructor(
private val wulkanowyRepository: WulkanowyRepository,
errorHandler: ErrorHandler, errorHandler: ErrorHandler,
studentRepository: StudentRepository studentRepository: StudentRepository
) : BasePresenter<LoginView>(errorHandler, studentRepository) { ) : BasePresenter<LoginView>(errorHandler, studentRepository) {
@ -16,4 +19,11 @@ class LoginPresenter @Inject constructor(
view.initView() view.initView()
Timber.i("Login view was initialized") Timber.i("Login view was initialized")
} }
fun updateSdkMappings() {
presenterScope.launch {
runCatching { wulkanowyRepository.fetchMapping() }
.onFailure { Timber.e(it) }
}
}
} }

View File

@ -138,6 +138,7 @@ class MainActivity : BaseActivity<MainPresenter, ActivityMainBinding>(), MainVie
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
inAppUpdateHelper.onResume() inAppUpdateHelper.onResume()
presenter.updateSdkMappings()
} }
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {

View File

@ -6,6 +6,7 @@ import io.github.wulkanowy.data.onResourceError
import io.github.wulkanowy.data.onResourceSuccess import io.github.wulkanowy.data.onResourceSuccess
import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.PreferencesRepository
import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.data.repositories.WulkanowyRepository
import io.github.wulkanowy.data.resourceFlow import io.github.wulkanowy.data.resourceFlow
import io.github.wulkanowy.services.sync.SyncManager import io.github.wulkanowy.services.sync.SyncManager
import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.BasePresenter
@ -29,6 +30,7 @@ class MainPresenter @Inject constructor(
errorHandler: ErrorHandler, errorHandler: ErrorHandler,
studentRepository: StudentRepository, studentRepository: StudentRepository,
private val preferencesRepository: PreferencesRepository, private val preferencesRepository: PreferencesRepository,
private val wulkanowyRepository: WulkanowyRepository,
private val syncManager: SyncManager, private val syncManager: SyncManager,
private val analytics: AnalyticsHelper, private val analytics: AnalyticsHelper,
private val json: Json, private val json: Json,
@ -199,4 +201,11 @@ class MainPresenter @Inject constructor(
.onFailure { errorHandler.dispatch(it) } .onFailure { errorHandler.dispatch(it) }
} }
} }
fun updateSdkMappings() {
presenterScope.launch {
runCatching { wulkanowyRepository.fetchMapping() }
.onFailure { Timber.e(it) }
}
}
} }

View File

@ -1,5 +1,5 @@
Wersja 2.6.4 Wersja 2.6.5
— naprawiliśmy dostęp do modułu ucznia i modułu wiadomości po kolejnej próbie blokady nas (niestety jeszcze bez nowego modułu ucznia) — naprawiliśmy pozostałe bieżące problemy spowodowane ostatnimi blokadami Wulkanowego przez wiadomo kogo
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases

View File

@ -8,6 +8,7 @@ import io.mockk.mockk
fun createWulkanowySdkFactoryMock(sdk: Sdk) = mockk<WulkanowySdkFactory>() fun createWulkanowySdkFactoryMock(sdk: Sdk) = mockk<WulkanowySdkFactory>()
.apply { .apply {
every { create() } returns sdk every { createBase() } returns sdk
coEvery { create() } returns sdk
coEvery { create(any(), any()) } returns sdk coEvery { create(any(), any()) } returns sdk
} }

View File

@ -11,7 +11,6 @@ import io.github.wulkanowy.sdk.pojo.RegisterStudent
import io.mockk.Runs import io.mockk.Runs
import io.mockk.coEvery import io.mockk.coEvery
import io.mockk.coVerify import io.mockk.coVerify
import io.mockk.every
import io.mockk.just import io.mockk.just
import io.mockk.mockk import io.mockk.mockk
import io.mockk.spyk import io.mockk.spyk
@ -40,11 +39,12 @@ class WulkanowySdkFactoryTest {
chuckerInterceptor = mockk(), chuckerInterceptor = mockk(),
remoteConfig = mockk(relaxed = true), remoteConfig = mockk(relaxed = true),
webkitCookieManagerProxy = mockk(), webkitCookieManagerProxy = mockk(),
studentDb = studentDao studentDb = studentDao,
wulkanowyRepository = mockk(relaxed = true),
) )
) )
every { wulkanowySdkFactory.create() } returns sdk coEvery { wulkanowySdkFactory.create() } returns sdk
} }
@Test @Test

View File

@ -3,6 +3,7 @@ package io.github.wulkanowy.ui.modules.main
import io.github.wulkanowy.MainCoroutineRule import io.github.wulkanowy.MainCoroutineRule
import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.PreferencesRepository
import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.data.repositories.WulkanowyRepository
import io.github.wulkanowy.services.sync.SyncManager import io.github.wulkanowy.services.sync.SyncManager
import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.base.ErrorHandler
import io.github.wulkanowy.utils.AdsHelper import io.github.wulkanowy.utils.AdsHelper
@ -31,6 +32,9 @@ class MainPresenterTest {
@MockK @MockK
lateinit var studentRepository: StudentRepository lateinit var studentRepository: StudentRepository
@MockK(relaxed = true)
lateinit var wulkanowyRepository: WulkanowyRepository
@MockK(relaxed = true) @MockK(relaxed = true)
lateinit var prefRepository: PreferencesRepository lateinit var prefRepository: PreferencesRepository
@ -65,7 +69,8 @@ class MainPresenterTest {
analytics = analytics, analytics = analytics,
json = Json, json = Json,
appInfo = appInfo, appInfo = appInfo,
adsHelper = adsHelper adsHelper = adsHelper,
wulkanowyRepository = wulkanowyRepository
) )
presenter.onAttachView(mainView, null) presenter.onAttachView(mainView, null)
} }