forked from github/wulkanowy-mirror
Merge branch 'release/1.4.2'
This commit is contained in:
commit
601d573283
2
.github/workflows/deploy-store.yml
vendored
2
.github/workflows/deploy-store.yml
vendored
@ -37,6 +37,7 @@ jobs:
|
|||||||
ANDROID_PUBLISHER_CREDENTIALS: ${{ secrets.ANDROID_PUBLISHER_CREDENTIALS }}
|
ANDROID_PUBLISHER_CREDENTIALS: ${{ secrets.ANDROID_PUBLISHER_CREDENTIALS }}
|
||||||
ADMOB_PROJECT_ID: ${{ secrets.ADMOB_PROJECT_ID }}
|
ADMOB_PROJECT_ID: ${{ secrets.ADMOB_PROJECT_ID }}
|
||||||
SINGLE_SUPPORT_AD_ID: ${{ secrets.SINGLE_SUPPORT_AD_ID }}
|
SINGLE_SUPPORT_AD_ID: ${{ secrets.SINGLE_SUPPORT_AD_ID }}
|
||||||
|
SET_BUILD_TIMESTAMP: ${{ secrets.SET_BUILD_TIMESTAMP }}
|
||||||
run: ./gradlew publishPlayReleaseApps -PenableFirebase --stacktrace;
|
run: ./gradlew publishPlayReleaseApps -PenableFirebase --stacktrace;
|
||||||
|
|
||||||
deploy-app-gallery:
|
deploy-app-gallery:
|
||||||
@ -71,4 +72,5 @@ jobs:
|
|||||||
PLAY_STORE_PASSWORD: ${{ secrets.PLAY_STORE_PASSWORD }}
|
PLAY_STORE_PASSWORD: ${{ secrets.PLAY_STORE_PASSWORD }}
|
||||||
PLAY_KEY_ALIAS: ${{ secrets.PLAY_KEY_ALIAS }}
|
PLAY_KEY_ALIAS: ${{ secrets.PLAY_KEY_ALIAS }}
|
||||||
PLAY_KEY_PASSWORD: ${{ secrets.PLAY_KEY_PASSWORD }}
|
PLAY_KEY_PASSWORD: ${{ secrets.PLAY_KEY_PASSWORD }}
|
||||||
|
SET_BUILD_TIMESTAMP: ${{ secrets.SET_BUILD_TIMESTAMP }}
|
||||||
run: ./gradlew bundleHmsRelease --stacktrace && ./gradlew publishHuaweiAppGalleryHmsRelease --stacktrace
|
run: ./gradlew bundleHmsRelease --stacktrace && ./gradlew publishHuaweiAppGalleryHmsRelease --stacktrace
|
||||||
|
78
README.cs.md
Normal file
78
README.cs.md
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
[English version of README](README.en.md)
|
||||||
|
|
||||||
|
[Deutsche Version von README](README.de.md)
|
||||||
|
|
||||||
|
[Polska wersja README](README.md)
|
||||||
|
|
||||||
|
[Slovenská verzia README](README.sk.md)
|
||||||
|
|
||||||
|
# Wulkanowy
|
||||||
|
|
||||||
|
[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/wulkanowy/wulkanowy/Tests/develop?style=flat-square)](https://github.com/wulkanowy/wulkanowy/actions)
|
||||||
|
[![Codecov](https://img.shields.io/codecov/c/github/wulkanowy/wulkanowy/master.svg?style=flat-square)](https://codecov.io/gh/wulkanowy/wulkanowy)
|
||||||
|
[![Discord](https://img.shields.io/discord/390889354199040011.svg?style=flat-square)](https://discord.gg/vccAQBr)
|
||||||
|
[![F-Droid](https://img.shields.io/f-droid/v/io.github.wulkanowy.svg?style=flat-square)](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
|
[![Last release](https://img.shields.io/github/release/wulkanowy/wulkanowy.svg?logo=github&style=flat-square)](https://github.com/wulkanowy/wulkanowy/releases)
|
||||||
|
|
||||||
|
Neoficiální klient deníku VULCAN UONET+ pro žáka a rodiče
|
||||||
|
|
||||||
|
## Funkce
|
||||||
|
|
||||||
|
* přihlášení pomocí emailu a hesla
|
||||||
|
* funkce z webové stránky deníku:
|
||||||
|
* známky
|
||||||
|
* statistiky známek
|
||||||
|
* frekvence
|
||||||
|
* procento frekvence
|
||||||
|
* zkoušky
|
||||||
|
* plán lekce
|
||||||
|
* dokončené lekce
|
||||||
|
* zprávy
|
||||||
|
* domácí úkoly
|
||||||
|
* poznámky
|
||||||
|
* šťastné číslo
|
||||||
|
* další lekce
|
||||||
|
* školní setkání
|
||||||
|
* informace o žáku a škole
|
||||||
|
* výpočet průměru nezávisle na preferencích školy
|
||||||
|
* upozornění, např. o nových známkách
|
||||||
|
* podpora více účtů s možností přejmenování žáků
|
||||||
|
* tmavý a černý (AMOLED) motiv
|
||||||
|
* offline režim
|
||||||
|
* žádné reklamy
|
||||||
|
|
||||||
|
## Stáhnout
|
||||||
|
|
||||||
|
Aktuální verzi si můžete stáhnout z Google Play, F-Droid nebo Huawei AppGallery
|
||||||
|
|
||||||
|
[<img src="https://play.google.com/intl/cs-CZ/badges/images/generic/cs_badge_web_generic.png"
|
||||||
|
alt="Nyní na Google Play"
|
||||||
|
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
||||||
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
|
alt="Stáhnout s F-Droid"
|
||||||
|
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
|
[<img src="https://i.imgur.com/baTGiDP.png"
|
||||||
|
alt="Objevuj v AppGallery"
|
||||||
|
height="80">](https://appgallery.cloud.huawei.com/ag/n/app/C101440411?channelId=Badge&id=1b3f7fbb700849a9be0dba6b520b2282&s=EB1D3BF9ED9D1564D869B7B94B18016D3CABFCA5AEFB8E29F675FA04E0DC131D&detailType=0&v=)
|
||||||
|
|
||||||
|
Můžete si také stáhnout [vývojovou verzi](https://wulkanowy.github.io/#download), která zahrnuje nové funkce připravované pro příští vydání
|
||||||
|
|
||||||
|
## Postaveno s
|
||||||
|
|
||||||
|
|
||||||
|
* [Wulkanowy SDK](https://github.com/wulkanowy/sdk)
|
||||||
|
* [Kotlin Coroutines](https://kotlinlang.org/docs/reference/coroutines-overview.html)
|
||||||
|
* [Hilt](https://dagger.dev/hilt/)
|
||||||
|
* [Room](https://developer.android.com/topic/libraries/architecture/room)
|
||||||
|
* [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager)
|
||||||
|
|
||||||
|
## Spolupráce
|
||||||
|
|
||||||
|
Přispějte do projektu vytvořením PR nebo odesláním issue na GitHub.
|
||||||
|
|
||||||
|
Pro zájemce o překlad aplikace do různých jazyků poskytujeme Crowdin:
|
||||||
|
https://crowdin.com/project/wulkanowy2
|
||||||
|
|
||||||
|
## Licence
|
||||||
|
|
||||||
|
Tento projekt je licencován pod licencí Apache License 2.0 - podrobnosti v souboru [LICENSE](LICENSE)
|
74
README.de.md
Normal file
74
README.de.md
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
[Polska wersja README](README.md)
|
||||||
|
|
||||||
|
[English version of README](README.en.md)
|
||||||
|
|
||||||
|
# Wulkanowy
|
||||||
|
|
||||||
|
[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/wulkanowy/wulkanowy/Tests/develop?style=flat-square)](https://github.com/wulkanowy/wulkanowy/actions)
|
||||||
|
[![Codecov](https://img.shields.io/codecov/c/github/wulkanowy/wulkanowy/master.svg?style=flat-square)](https://codecov.io/gh/wulkanowy/wulkanowy)
|
||||||
|
[![Discord](https://img.shields.io/discord/390889354199040011.svg?style=flat-square)](https://discord.gg/vccAQBr)
|
||||||
|
[![F-Droid](https://img.shields.io/f-droid/v/io.github.wulkanowy.svg?style=flat-square)](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
|
[![Last release](https://img.shields.io/github/release/wulkanowy/wulkanowy.svg?logo=github&style=flat-square)](https://github.com/wulkanowy/wulkanowy/releases)
|
||||||
|
|
||||||
|
Inoffizieller Android VULCAN UONET+ Registrierungsclient für Schüler und ihre Eltern
|
||||||
|
|
||||||
|
## Merkmale
|
||||||
|
|
||||||
|
* Einloggen mit E-Mail und Passwort
|
||||||
|
* Funktionen von der Registerwebsite:
|
||||||
|
* Noten
|
||||||
|
* Notenstatistik
|
||||||
|
* Anwesenheit
|
||||||
|
* Prozentsatz der Anwesenheit
|
||||||
|
* Prüfungen
|
||||||
|
* Stundenplan
|
||||||
|
* Unterricht abgeschlossen
|
||||||
|
* Nachrichten
|
||||||
|
* Hausaufgaben
|
||||||
|
* Anmerkungen
|
||||||
|
* Glückszahl
|
||||||
|
* Zusätzliche Lektionen
|
||||||
|
* Schulkonferenzen
|
||||||
|
* Schüler- und Schulinformationen
|
||||||
|
* Berechnung des Durchschnitts unabhängig von den Präferenzen der Schule
|
||||||
|
* Benachrichtigungen, z. B. über eine neue Note
|
||||||
|
* Unterstützung für mehrere Konten mit der Möglichkeit, den Namen des Schülers zu ändern
|
||||||
|
* dunkles und schwarzes (AMOLED) Thema
|
||||||
|
* Offline-Modus
|
||||||
|
* keine Werbung
|
||||||
|
|
||||||
|
## Herunterladen
|
||||||
|
|
||||||
|
Die aktuelle Version können Sie von der Google Play, F-Droid oder Huawei AppGallery store herunterladen
|
||||||
|
|
||||||
|
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
|
||||||
|
alt="Get it on Google Play"
|
||||||
|
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
||||||
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
|
alt="Get it on F-Droid"
|
||||||
|
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
|
[<img src="appgallery_badge.png"
|
||||||
|
alt="Explore it on AppGallery"
|
||||||
|
height="80">](https://appgallery.cloud.huawei.com/ag/n/app/C101440411?channelId=Badge&id=1b3f7fbb700849a9be0dba6b520b2282&s=EB1D3BF9ED9D1564D869B7B94B18016D3CABFCA5AEFB8E29F675FA04E0DC131D&detailType=0&v=)
|
||||||
|
|
||||||
|
Sie können auch ein [Entwicklungsversion herunterladen](https://wulkanowy.github.io/#download) das beinhaltet neue Funktionen, die für die nächste Version vorbereitet werden
|
||||||
|
|
||||||
|
## Gebaut mit
|
||||||
|
|
||||||
|
|
||||||
|
* [Wulkanowy SDK](https://github.com/wulkanowy/sdk)
|
||||||
|
* [Kotlin Coroutines](https://kotlinlang.org/docs/reference/coroutines-overview.html)
|
||||||
|
* [Hilt](https://dagger.dev/hilt/)
|
||||||
|
* [Room](https://developer.android.com/topic/libraries/architecture/room)
|
||||||
|
* [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager)
|
||||||
|
|
||||||
|
## Beitragen
|
||||||
|
|
||||||
|
Bitte tragen Sie zum Projekt bei, indem Sie entweder eine PR erstellen oder ein Issue auf GitHub einreichen.
|
||||||
|
|
||||||
|
Für Personen, die daran interessiert sind, die Anwendung in verschiedene Sprachen zu übersetzen, bieten wir Crowdin
|
||||||
|
https://crowdin.com/project/wulkanowy2
|
||||||
|
|
||||||
|
## Lizenz
|
||||||
|
|
||||||
|
Dieses Projekt ist unter der Apache License 2.0 lizenziert - siehe die [LIZENZ](LICENSE) Datei für Details
|
@ -1,5 +1,11 @@
|
|||||||
[Polska wersja README](README.md)
|
[Polska wersja README](README.md)
|
||||||
|
|
||||||
|
[Deutsche Version von README](README.de.md)
|
||||||
|
|
||||||
|
[Česká verze README](README.cs.md)
|
||||||
|
|
||||||
|
[Slovenská verzia README](README.sk.md)
|
||||||
|
|
||||||
# Wulkanowy
|
# Wulkanowy
|
||||||
|
|
||||||
[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/wulkanowy/wulkanowy/Tests/develop?style=flat-square)](https://github.com/wulkanowy/wulkanowy/actions)
|
[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/wulkanowy/wulkanowy/Tests/develop?style=flat-square)](https://github.com/wulkanowy/wulkanowy/actions)
|
||||||
|
@ -1,5 +1,11 @@
|
|||||||
[English version of README](README.en.md)
|
[English version of README](README.en.md)
|
||||||
|
|
||||||
|
[Deutsche Version von README](README.de.md)
|
||||||
|
|
||||||
|
[Česká verze README](README.cs.md)
|
||||||
|
|
||||||
|
[Slovenská verzia README](README.sk.md)
|
||||||
|
|
||||||
# Wulkanowy
|
# Wulkanowy
|
||||||
|
|
||||||
[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/wulkanowy/wulkanowy/Tests/develop?style=flat-square)](https://github.com/wulkanowy/wulkanowy/actions)
|
[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/wulkanowy/wulkanowy/Tests/develop?style=flat-square)](https://github.com/wulkanowy/wulkanowy/actions)
|
||||||
|
78
README.sk.md
Normal file
78
README.sk.md
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
[English version of README](README.en.md)
|
||||||
|
|
||||||
|
[Deutsche Version von README](README.de.md)
|
||||||
|
|
||||||
|
[Polska wersja README](README.md)
|
||||||
|
|
||||||
|
[Česká verze README](README.cs.md)
|
||||||
|
|
||||||
|
# Wulkanowy
|
||||||
|
|
||||||
|
[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/wulkanowy/wulkanowy/Tests/develop?style=flat-square)](https://github.com/wulkanowy/wulkanowy/actions)
|
||||||
|
[![Codecov](https://img.shields.io/codecov/c/github/wulkanowy/wulkanowy/master.svg?style=flat-square)](https://codecov.io/gh/wulkanowy/wulkanowy)
|
||||||
|
[![Discord](https://img.shields.io/discord/390889354199040011.svg?style=flat-square)](https://discord.gg/vccAQBr)
|
||||||
|
[![F-Droid](https://img.shields.io/f-droid/v/io.github.wulkanowy.svg?style=flat-square)](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
|
[![Last release](https://img.shields.io/github/release/wulkanowy/wulkanowy.svg?logo=github&style=flat-square)](https://github.com/wulkanowy/wulkanowy/releases)
|
||||||
|
|
||||||
|
Neoficiálny klient denníka VULCAN UONET+ pre žiaka a rodičov
|
||||||
|
|
||||||
|
## Funkcie
|
||||||
|
|
||||||
|
* prihlásenie pomocou emailu a hesla
|
||||||
|
* funkcie z webovej stránky denníka:
|
||||||
|
* známky
|
||||||
|
* štatistiky známok
|
||||||
|
* frekvencia
|
||||||
|
* percento frekvencie
|
||||||
|
* skúšky
|
||||||
|
* plán lekcie
|
||||||
|
* dokončené lekcie
|
||||||
|
* správy
|
||||||
|
* domáce úlohy
|
||||||
|
* poznámky
|
||||||
|
* šťastné číslo
|
||||||
|
* ďalšie lekcie
|
||||||
|
* školské stretnutie
|
||||||
|
* informácie o žiakovi a škole
|
||||||
|
* výpočet priemeru nezávisle od preferencií školy
|
||||||
|
* upozornenia, napr. o nových známkach
|
||||||
|
* podpora viacerých účtov s možnosťou premenovania žiakov
|
||||||
|
* tmavý a čierny (AMOLED) motív
|
||||||
|
* offline režim
|
||||||
|
* žiadne reklamy
|
||||||
|
|
||||||
|
## Stiahnuť
|
||||||
|
|
||||||
|
Aktuálnu verziu si môžete stiahnuť z Google Play, F-Droid alebo Huawei AppGallery
|
||||||
|
|
||||||
|
[<img src="https://play.google.com/intl/sk/badges/images/generic/sk_badge_web_generic.png"
|
||||||
|
alt="Nyní na Google Play"
|
||||||
|
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
|
||||||
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
|
alt="Stiahnuť s F-Droid"
|
||||||
|
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
|
||||||
|
[<img src="https://i.imgur.com/sX8UyAw.png"
|
||||||
|
alt="Objavíte v AppGallery"
|
||||||
|
height="80">](https://appgallery.cloud.huawei.com/ag/n/app/C101440411?channelId=Badge&id=1b3f7fbb700849a9be0dba6b520b2282&s=EB1D3BF9ED9D1564D869B7B94B18016D3CABFCA5AEFB8E29F675FA04E0DC131D&detailType=0&v=)
|
||||||
|
|
||||||
|
Môžete si tiež stiahnuť [vývojovú verziu](https://wulkanowy.github.io/#download), ktorá zahrňuje nové funkcie pripravované pre budúce vydanie
|
||||||
|
|
||||||
|
## Postavené s
|
||||||
|
|
||||||
|
|
||||||
|
* [Wulkanowy SDK](https://github.com/wulkanowy/sdk)
|
||||||
|
* [Kotlin Coroutines](https://kotlinlang.org/docs/reference/coroutines-overview.html)
|
||||||
|
* [Hilt](https://dagger.dev/hilt/)
|
||||||
|
* [Room](https://developer.android.com/topic/libraries/architecture/room)
|
||||||
|
* [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager)
|
||||||
|
|
||||||
|
## Spolupráca
|
||||||
|
|
||||||
|
Prispejte do projektu vytvorením PR alebo odoslaním issue na GitHub.
|
||||||
|
|
||||||
|
Pre záujemcov o preklad aplikácie do rôznych jazykov poskytujeme Crowdin:
|
||||||
|
https://crowdin.com/project/wulkanowy2
|
||||||
|
|
||||||
|
## Licencia
|
||||||
|
|
||||||
|
Tento projekt je licencovaný pod licenciou Apache License 2.0 - podrobnosti v súbore [LICENSE](LICENSE)
|
@ -22,8 +22,8 @@ android {
|
|||||||
testApplicationId "io.github.tests.wulkanowy"
|
testApplicationId "io.github.tests.wulkanowy"
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 31
|
targetSdkVersion 31
|
||||||
versionCode 99
|
versionCode 100
|
||||||
versionName "1.4.1"
|
versionName "1.4.2"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
resValue "string", "app_name", "Wulkanowy"
|
resValue "string", "app_name", "Wulkanowy"
|
||||||
@ -165,16 +165,16 @@ huaweiPublish {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
work_manager = "2.7.0"
|
work_manager = "2.7.1"
|
||||||
android_hilt = "1.0.0"
|
android_hilt = "1.0.0"
|
||||||
room = "2.3.0"
|
room = "2.3.0"
|
||||||
chucker = "3.5.2"
|
chucker = "3.5.2"
|
||||||
mockk = "1.12.0"
|
mockk = "1.12.1"
|
||||||
coroutines = "1.5.2"
|
coroutines = "1.5.2"
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation "io.github.wulkanowy:sdk:1.4.0"
|
implementation "io.github.wulkanowy:sdk:1.4.2"
|
||||||
|
|
||||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
|
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
|
||||||
|
|
||||||
@ -184,15 +184,15 @@ dependencies {
|
|||||||
implementation "androidx.core:core-ktx:1.7.0"
|
implementation "androidx.core:core-ktx:1.7.0"
|
||||||
implementation 'androidx.core:core-splashscreen:1.0.0-alpha02'
|
implementation 'androidx.core:core-splashscreen:1.0.0-alpha02'
|
||||||
implementation "androidx.activity:activity-ktx:1.4.0"
|
implementation "androidx.activity:activity-ktx:1.4.0"
|
||||||
implementation "androidx.appcompat:appcompat:1.4.0-rc01"
|
implementation "androidx.appcompat:appcompat:1.4.0"
|
||||||
implementation "androidx.fragment:fragment-ktx:1.4.0-rc01"
|
implementation "androidx.fragment:fragment-ktx:1.4.0"
|
||||||
implementation "androidx.annotation:annotation:1.3.0"
|
implementation "androidx.annotation:annotation:1.3.0"
|
||||||
|
|
||||||
implementation "androidx.preference:preference-ktx:1.1.1"
|
implementation "androidx.preference:preference-ktx:1.1.1"
|
||||||
implementation "androidx.recyclerview:recyclerview:1.2.1"
|
implementation "androidx.recyclerview:recyclerview:1.2.1"
|
||||||
implementation "androidx.viewpager:viewpager:1.0.0"
|
implementation "androidx.viewpager:viewpager:1.0.0"
|
||||||
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
|
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
|
||||||
implementation "androidx.constraintlayout:constraintlayout:2.1.1"
|
implementation "androidx.constraintlayout:constraintlayout:2.1.2"
|
||||||
implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"
|
implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"
|
||||||
implementation "com.google.android.material:material:1.4.0"
|
implementation "com.google.android.material:material:1.4.0"
|
||||||
implementation "com.github.wulkanowy:material-chips-input:2.3.1"
|
implementation "com.github.wulkanowy:material-chips-input:2.3.1"
|
||||||
@ -227,7 +227,7 @@ dependencies {
|
|||||||
implementation "io.coil-kt:coil:1.4.0"
|
implementation "io.coil-kt:coil:1.4.0"
|
||||||
implementation "io.github.wulkanowy:AppKillerManager:3.0.0"
|
implementation "io.github.wulkanowy:AppKillerManager:3.0.0"
|
||||||
implementation 'me.xdrop:fuzzywuzzy:1.3.1'
|
implementation 'me.xdrop:fuzzywuzzy:1.3.1'
|
||||||
implementation 'com.fredporciuncula:flow-preferences:1.5.0'
|
implementation 'com.fredporciuncula:flow-preferences:1.6.0'
|
||||||
|
|
||||||
playImplementation platform('com.google.firebase:firebase-bom:29.0.0')
|
playImplementation platform('com.google.firebase:firebase-bom:29.0.0')
|
||||||
playImplementation 'com.google.firebase:firebase-analytics-ktx'
|
playImplementation 'com.google.firebase:firebase-analytics-ktx'
|
||||||
|
2414
app/schemas/io.github.wulkanowy.data.db.AppDatabase/44.json
Normal file
2414
app/schemas/io.github.wulkanowy.data.db.AppDatabase/44.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -9,6 +9,7 @@
|
|||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||||
<uses-permission android:name="android.permission.VIBRATE" />
|
<uses-permission android:name="android.permission.VIBRATE" />
|
||||||
|
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
|
||||||
|
|
||||||
<queries>
|
<queries>
|
||||||
<intent>
|
<intent>
|
||||||
|
@ -103,6 +103,7 @@ import io.github.wulkanowy.data.db.migrations.Migration40
|
|||||||
import io.github.wulkanowy.data.db.migrations.Migration41
|
import io.github.wulkanowy.data.db.migrations.Migration41
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration42
|
import io.github.wulkanowy.data.db.migrations.Migration42
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration43
|
import io.github.wulkanowy.data.db.migrations.Migration43
|
||||||
|
import io.github.wulkanowy.data.db.migrations.Migration44
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration5
|
import io.github.wulkanowy.data.db.migrations.Migration5
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration6
|
import io.github.wulkanowy.data.db.migrations.Migration6
|
||||||
import io.github.wulkanowy.data.db.migrations.Migration7
|
import io.github.wulkanowy.data.db.migrations.Migration7
|
||||||
@ -152,7 +153,7 @@ import javax.inject.Singleton
|
|||||||
abstract class AppDatabase : RoomDatabase() {
|
abstract class AppDatabase : RoomDatabase() {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val VERSION_SCHEMA = 43
|
const val VERSION_SCHEMA = 44
|
||||||
|
|
||||||
fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf(
|
fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf(
|
||||||
Migration2(),
|
Migration2(),
|
||||||
@ -196,7 +197,8 @@ abstract class AppDatabase : RoomDatabase() {
|
|||||||
Migration40(),
|
Migration40(),
|
||||||
Migration41(sharedPrefProvider),
|
Migration41(sharedPrefProvider),
|
||||||
Migration42(),
|
Migration42(),
|
||||||
Migration43()
|
Migration43(),
|
||||||
|
Migration44()
|
||||||
)
|
)
|
||||||
|
|
||||||
fun newInstance(
|
fun newInstance(
|
||||||
|
@ -33,5 +33,8 @@ data class AdminMessage(
|
|||||||
|
|
||||||
val priority: String,
|
val priority: String,
|
||||||
|
|
||||||
val type: String
|
val type: String,
|
||||||
|
|
||||||
|
@ColumnInfo(name = "is_dismissible")
|
||||||
|
val isDismissible: Boolean = false
|
||||||
)
|
)
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
package io.github.wulkanowy.data.db.migrations
|
||||||
|
|
||||||
|
import androidx.room.migration.Migration
|
||||||
|
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||||
|
|
||||||
|
class Migration44 : Migration(43, 44) {
|
||||||
|
|
||||||
|
override fun migrate(database: SupportSQLiteDatabase) {
|
||||||
|
database.execSQL("ALTER TABLE AdminMessages ADD COLUMN is_dismissible INTEGER NOT NULL DEFAULT 0")
|
||||||
|
}
|
||||||
|
}
|
@ -20,8 +20,6 @@ import kotlinx.coroutines.flow.map
|
|||||||
import kotlinx.serialization.decodeFromString
|
import kotlinx.serialization.decodeFromString
|
||||||
import kotlinx.serialization.encodeToString
|
import kotlinx.serialization.encodeToString
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import java.lang.ClassCastException
|
|
||||||
import java.lang.IllegalStateException
|
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
@ -105,7 +103,10 @@ class PreferencesRepository @Inject constructor(
|
|||||||
|
|
||||||
val isUpcomingLessonsNotificationsEnableKey =
|
val isUpcomingLessonsNotificationsEnableKey =
|
||||||
context.getString(R.string.pref_key_notifications_upcoming_lessons_enable)
|
context.getString(R.string.pref_key_notifications_upcoming_lessons_enable)
|
||||||
val isUpcomingLessonsNotificationsEnable: Boolean
|
var isUpcomingLessonsNotificationsEnable: Boolean
|
||||||
|
set(value) {
|
||||||
|
sharedPref.edit { putBoolean(isUpcomingLessonsNotificationsEnableKey, value) }
|
||||||
|
}
|
||||||
get() = getBoolean(
|
get() = getBoolean(
|
||||||
isUpcomingLessonsNotificationsEnableKey,
|
isUpcomingLessonsNotificationsEnableKey,
|
||||||
R.bool.pref_default_notification_upcoming_lessons_enable
|
R.bool.pref_default_notification_upcoming_lessons_enable
|
||||||
@ -244,6 +245,14 @@ class PreferencesRepository @Inject constructor(
|
|||||||
return flowSharedPref.getStringSet(prefKey, defaultSet)
|
return flowSharedPref.getStringSet(prefKey, defaultSet)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var dismissedAdminMessageIds: List<Int>
|
||||||
|
get() = sharedPref.getStringSet(PREF_KEY_ADMIN_DISMISSED_MESSAGE_IDS, emptySet())
|
||||||
|
.orEmpty()
|
||||||
|
.map { it.toInt() }
|
||||||
|
set(value) = sharedPref.edit {
|
||||||
|
putStringSet(PREF_KEY_ADMIN_DISMISSED_MESSAGE_IDS, value.map { it.toString() }.toSet())
|
||||||
|
}
|
||||||
|
|
||||||
var inAppReviewCount: Int
|
var inAppReviewCount: Int
|
||||||
get() = sharedPref.getInt(PREF_KEY_IN_APP_REVIEW_COUNT, 0)
|
get() = sharedPref.getInt(PREF_KEY_IN_APP_REVIEW_COUNT, 0)
|
||||||
set(value) = sharedPref.edit().putInt(PREF_KEY_IN_APP_REVIEW_COUNT, value).apply()
|
set(value) = sharedPref.edit().putInt(PREF_KEY_IN_APP_REVIEW_COUNT, value).apply()
|
||||||
@ -285,5 +294,7 @@ class PreferencesRepository @Inject constructor(
|
|||||||
private const val PREF_KEY_IN_APP_REVIEW_DATE = "in_app_review_date"
|
private const val PREF_KEY_IN_APP_REVIEW_DATE = "in_app_review_date"
|
||||||
|
|
||||||
private const val PREF_KEY_IN_APP_REVIEW_DONE = "in_app_review_done"
|
private const val PREF_KEY_IN_APP_REVIEW_DONE = "in_app_review_done"
|
||||||
|
|
||||||
|
private const val PREF_KEY_ADMIN_DISMISSED_MESSAGE_IDS = "admin_message_dismissed_ids"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import android.app.AlarmManager.RTC_WAKEUP
|
|||||||
import android.app.PendingIntent
|
import android.app.PendingIntent
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.os.Build
|
||||||
import androidx.core.app.AlarmManagerCompat
|
import androidx.core.app.AlarmManagerCompat
|
||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
@ -91,6 +92,12 @@ class TimetableNotificationSchedulerHelper @Inject constructor(
|
|||||||
return cancelScheduled(lessons, student)
|
return cancelScheduled(lessons, student)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!canScheduleExactAlarms()) {
|
||||||
|
Timber.w("Exact alarms are disabled by user")
|
||||||
|
preferencesRepository.isUpcomingLessonsNotificationsEnable = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if (lessons.firstOrNull()?.date?.isAfter(LocalDate.now().plusDays(2)) == true) {
|
if (lessons.firstOrNull()?.date?.isAfter(LocalDate.now().plusDays(2)) == true) {
|
||||||
Timber.d("Timetable notification scheduling skipped - lessons are too far")
|
Timber.d("Timetable notification scheduling skipped - lessons are too far")
|
||||||
return
|
return
|
||||||
@ -169,8 +176,18 @@ class TimetableNotificationSchedulerHelper @Inject constructor(
|
|||||||
intent.getStringExtra(LESSON_TITLE)
|
intent.getStringExtra(LESSON_TITLE)
|
||||||
}, start: $time, student: $studentId"
|
}, start: $time, student: $studentId"
|
||||||
)
|
)
|
||||||
} catch (e: IllegalStateException) {
|
} catch (e: Throwable) {
|
||||||
Timber.e(e)
|
Timber.e(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun canScheduleExactAlarms(): Boolean {
|
||||||
|
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
try {
|
||||||
|
alarmManager.canScheduleExactAlarms()
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
} else true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ import androidx.recyclerview.widget.DiffUtil
|
|||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import io.github.wulkanowy.R
|
import io.github.wulkanowy.R
|
||||||
|
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.db.entities.Timetable
|
import io.github.wulkanowy.data.db.entities.Timetable
|
||||||
import io.github.wulkanowy.data.db.entities.TimetableHeader
|
import io.github.wulkanowy.data.db.entities.TimetableHeader
|
||||||
@ -68,6 +69,8 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView
|
|||||||
|
|
||||||
var onAdminMessageClickListener: (String?) -> Unit = {}
|
var onAdminMessageClickListener: (String?) -> Unit = {}
|
||||||
|
|
||||||
|
var onAdminMessageDismissClickListener: (AdminMessage) -> Unit = {}
|
||||||
|
|
||||||
val items = mutableListOf<DashboardItem>()
|
val items = mutableListOf<DashboardItem>()
|
||||||
|
|
||||||
fun submitList(newItems: List<DashboardItem>) {
|
fun submitList(newItems: List<DashboardItem>) {
|
||||||
@ -727,6 +730,10 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView
|
|||||||
dashboardAdminMessageItemDescription.text = item.content
|
dashboardAdminMessageItemDescription.text = item.content
|
||||||
dashboardAdminMessageItemDescription.setTextColor(textColor)
|
dashboardAdminMessageItemDescription.setTextColor(textColor)
|
||||||
dashboardAdminMessageItemIcon.setColorFilter(textColor)
|
dashboardAdminMessageItemIcon.setColorFilter(textColor)
|
||||||
|
dashboardAdminMessageItemDismiss.isVisible = item.isDismissible
|
||||||
|
dashboardAdminMessageItemDismiss.setOnClickListener {
|
||||||
|
onAdminMessageDismissClickListener(item)
|
||||||
|
}
|
||||||
|
|
||||||
root.setCardBackgroundColor(backgroundColor?.let { ColorStateList.valueOf(it) })
|
root.setCardBackgroundColor(backgroundColor?.let { ColorStateList.valueOf(it) })
|
||||||
item.destinationUrl?.let { url ->
|
item.destinationUrl?.let { url ->
|
||||||
|
@ -100,6 +100,7 @@ class DashboardFragment : BaseFragment<FragmentDashboardBinding>(R.layout.fragme
|
|||||||
mainActivity.pushView(ConferenceFragment.newInstance())
|
mainActivity.pushView(ConferenceFragment.newInstance())
|
||||||
}
|
}
|
||||||
onAdminMessageClickListener = presenter::onAdminMessageSelected
|
onAdminMessageClickListener = presenter::onAdminMessageSelected
|
||||||
|
onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed
|
||||||
|
|
||||||
registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
|
registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
|
||||||
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
|
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
|
||||||
|
@ -2,6 +2,7 @@ package io.github.wulkanowy.ui.modules.dashboard
|
|||||||
|
|
||||||
import io.github.wulkanowy.data.Resource
|
import io.github.wulkanowy.data.Resource
|
||||||
import io.github.wulkanowy.data.Status
|
import io.github.wulkanowy.data.Status
|
||||||
|
import io.github.wulkanowy.data.db.entities.AdminMessage
|
||||||
import io.github.wulkanowy.data.db.entities.LuckyNumber
|
import io.github.wulkanowy.data.db.entities.LuckyNumber
|
||||||
import io.github.wulkanowy.data.db.entities.Student
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
import io.github.wulkanowy.data.enums.MessageFolder
|
import io.github.wulkanowy.data.enums.MessageFolder
|
||||||
@ -81,6 +82,12 @@ class DashboardPresenter @Inject constructor(
|
|||||||
.launch("dashboard_pref")
|
.launch("dashboard_pref")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun onAdminMessageDismissed(adminMessage: AdminMessage) {
|
||||||
|
preferencesRepository.dismissedAdminMessageIds += adminMessage.id
|
||||||
|
|
||||||
|
loadData(preferencesRepository.selectedDashboardTiles)
|
||||||
|
}
|
||||||
|
|
||||||
fun onDragAndDropEnd(list: List<DashboardItem>) {
|
fun onDragAndDropEnd(list: List<DashboardItem>) {
|
||||||
with(dashboardItemLoadedList) {
|
with(dashboardItemLoadedList) {
|
||||||
clear()
|
clear()
|
||||||
@ -117,6 +124,7 @@ class DashboardPresenter @Inject constructor(
|
|||||||
forceRefresh: Boolean
|
forceRefresh: Boolean
|
||||||
) = dashboardTilesToLoad.filter { newItemToLoad ->
|
) = dashboardTilesToLoad.filter { newItemToLoad ->
|
||||||
dashboardLoadedTiles.none { it == newItemToLoad } || forceRefresh
|
dashboardLoadedTiles.none { it == newItemToLoad } || forceRefresh
|
||||||
|
|| newItemToLoad == DashboardItem.Tile.ADMIN_MESSAGE
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun removeUnselectedTiles(tilesToLoad: List<DashboardItem.Tile>) {
|
private fun removeUnselectedTiles(tilesToLoad: List<DashboardItem.Tile>) {
|
||||||
@ -575,6 +583,10 @@ class DashboardPresenter @Inject constructor(
|
|||||||
|
|
||||||
private fun loadAdminMessage(student: Student, forceRefresh: Boolean) {
|
private fun loadAdminMessage(student: Student, forceRefresh: Boolean) {
|
||||||
flowWithResourceIn { adminMessageRepository.getAdminMessages(student, forceRefresh) }
|
flowWithResourceIn { adminMessageRepository.getAdminMessages(student, forceRefresh) }
|
||||||
|
.map {
|
||||||
|
val isDismissed = it.data?.id in preferencesRepository.dismissedAdminMessageIds
|
||||||
|
it.copy(data = it.data.takeUnless { isDismissed })
|
||||||
|
}
|
||||||
.onEach {
|
.onEach {
|
||||||
when (it.status) {
|
when (it.status) {
|
||||||
Status.LOADING -> {
|
Status.LOADING -> {
|
||||||
@ -617,11 +629,16 @@ class DashboardPresenter @Inject constructor(
|
|||||||
|
|
||||||
sortDashboardItems()
|
sortDashboardItems()
|
||||||
|
|
||||||
if (dashboardItem is DashboardItem.AdminMessages && !dashboardItem.isDataLoaded) {
|
if (dashboardItem is DashboardItem.AdminMessages) {
|
||||||
|
if (!dashboardItem.isDataLoaded) {
|
||||||
dashboardItemsToLoad = dashboardItemsToLoad - DashboardItem.Type.ADMIN_MESSAGE
|
dashboardItemsToLoad = dashboardItemsToLoad - DashboardItem.Type.ADMIN_MESSAGE
|
||||||
dashboardTileLoadedList = dashboardTileLoadedList - DashboardItem.Tile.ADMIN_MESSAGE
|
dashboardTileLoadedList = dashboardTileLoadedList - DashboardItem.Tile.ADMIN_MESSAGE
|
||||||
|
|
||||||
dashboardItemLoadedList.removeAll { it.type == DashboardItem.Type.ADMIN_MESSAGE }
|
dashboardItemLoadedList.removeAll { it.type == DashboardItem.Type.ADMIN_MESSAGE }
|
||||||
|
} else {
|
||||||
|
dashboardItemsToLoad = dashboardItemsToLoad + DashboardItem.Type.ADMIN_MESSAGE
|
||||||
|
dashboardTileLoadedList = dashboardTileLoadedList + DashboardItem.Tile.ADMIN_MESSAGE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (forceRefresh) {
|
if (forceRefresh) {
|
||||||
|
@ -43,7 +43,7 @@ class GradeStatisticsFragment :
|
|||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
binding = FragmentGradeStatisticsBinding.bind(view)
|
binding = FragmentGradeStatisticsBinding.bind(view)
|
||||||
messageContainer = binding.gradeStatisticsSwipe
|
messageContainer = binding.gradeStatisticsRecycler
|
||||||
presenter.onAttachView(
|
presenter.onAttachView(
|
||||||
this,
|
this,
|
||||||
savedInstanceState?.getSerializable(SAVED_CHART_TYPE) as? GradeStatisticsItem.DataType
|
savedInstanceState?.getSerializable(SAVED_CHART_TYPE) as? GradeStatisticsItem.DataType
|
||||||
|
@ -72,9 +72,9 @@ class LoginActivity : BaseActivity<LoginPresenter, ActivityLoginBinding>(), Logi
|
|||||||
}
|
}
|
||||||
|
|
||||||
with(binding.loginViewpager) {
|
with(binding.loginViewpager) {
|
||||||
offscreenPageLimit = 2
|
|
||||||
adapter = pagerAdapter
|
adapter = pagerAdapter
|
||||||
isUserInputEnabled = false
|
isUserInputEnabled = false
|
||||||
|
offscreenPageLimit = 2
|
||||||
setOnSelectPageListener(presenter::onViewSelected)
|
setOnSelectPageListener(presenter::onViewSelected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +50,10 @@ class LoginSymbolPresenter @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun attemptLogin(symbol: String) {
|
fun attemptLogin(symbol: String) {
|
||||||
if (loginData == null) throw IllegalArgumentException("Login data is null")
|
if (loginData == null) {
|
||||||
|
Timber.w("LoginSymbolPresenter - Login data is null")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if (symbol.isBlank()) {
|
if (symbol.isBlank()) {
|
||||||
view?.setErrorSymbolRequire()
|
view?.setErrorSymbolRequire()
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package io.github.wulkanowy.ui.modules.settings.notifications
|
package io.github.wulkanowy.ui.modules.settings.notifications
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
@ -50,10 +51,14 @@ class NotificationsFragment : PreferenceFragmentCompat(),
|
|||||||
return appPackageName in packageNameList
|
return appPackageName in packageNameList
|
||||||
}
|
}
|
||||||
|
|
||||||
private val notificationSettingsContract =
|
private val notificationSettingsPiggybackContract =
|
||||||
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
||||||
|
presenter.onNotificationPiggybackPermissionResult()
|
||||||
|
}
|
||||||
|
|
||||||
presenter.onNotificationPermissionResult()
|
private val notificationSettingsExactAlarmsContract =
|
||||||
|
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
||||||
|
presenter.onNotificationExactAlarmPermissionResult()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun initView(showDebugNotificationSwitch: Boolean) {
|
override fun initView(showDebugNotificationSwitch: Boolean) {
|
||||||
@ -136,7 +141,7 @@ class NotificationsFragment : PreferenceFragmentCompat(),
|
|||||||
.setTitle(R.string.pref_notify_fix_sync_issues)
|
.setTitle(R.string.pref_notify_fix_sync_issues)
|
||||||
.setMessage(R.string.pref_notify_fix_sync_issues_message)
|
.setMessage(R.string.pref_notify_fix_sync_issues_message)
|
||||||
.setNegativeButton(android.R.string.cancel) { _, _ -> }
|
.setNegativeButton(android.R.string.cancel) { _, _ -> }
|
||||||
.setPositiveButton(R.string.pref_notify_fix_sync_issues_settings_button) { _, _ ->
|
.setPositiveButton(R.string.pref_notify_open_system_settings) { _, _ ->
|
||||||
try {
|
try {
|
||||||
AppKillerManager.doActionPowerSaving(requireContext())
|
AppKillerManager.doActionPowerSaving(requireContext())
|
||||||
AppKillerManager.doActionAutoStart(requireContext())
|
AppKillerManager.doActionAutoStart(requireContext())
|
||||||
@ -151,6 +156,7 @@ class NotificationsFragment : PreferenceFragmentCompat(),
|
|||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("InlinedApi")
|
||||||
override fun openSystemSettings() {
|
override fun openSystemSettings() {
|
||||||
val intent = if (appInfo.systemVersion >= Build.VERSION_CODES.O) {
|
val intent = if (appInfo.systemVersion >= Build.VERSION_CODES.O) {
|
||||||
Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply {
|
Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply {
|
||||||
@ -172,8 +178,8 @@ class NotificationsFragment : PreferenceFragmentCompat(),
|
|||||||
AlertDialog.Builder(requireContext())
|
AlertDialog.Builder(requireContext())
|
||||||
.setTitle(getString(R.string.pref_notification_piggyback_popup_title))
|
.setTitle(getString(R.string.pref_notification_piggyback_popup_title))
|
||||||
.setMessage(getString(R.string.pref_notification_piggyback_popup_description))
|
.setMessage(getString(R.string.pref_notification_piggyback_popup_description))
|
||||||
.setPositiveButton(getString(R.string.pref_notification_piggyback_popup_positive)) { _, _ ->
|
.setPositiveButton(getString(R.string.pref_notification_go_to_settings)) { _, _ ->
|
||||||
notificationSettingsContract.launch(Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"))
|
notificationSettingsPiggybackContract.launch(Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"))
|
||||||
}
|
}
|
||||||
.setNegativeButton(android.R.string.cancel) { _, _ ->
|
.setNegativeButton(android.R.string.cancel) { _, _ ->
|
||||||
setNotificationPiggybackPreferenceChecked(false)
|
setNotificationPiggybackPreferenceChecked(false)
|
||||||
@ -182,11 +188,30 @@ class NotificationsFragment : PreferenceFragmentCompat(),
|
|||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun openNotificationExactAlarmSettings() {
|
||||||
|
AlertDialog.Builder(requireContext())
|
||||||
|
.setTitle(getString(R.string.pref_notification_exact_alarm_popup_title))
|
||||||
|
.setMessage(getString(R.string.pref_notification_exact_alarm_popup_descriptions))
|
||||||
|
.setPositiveButton(getString(R.string.pref_notification_go_to_settings)) { _, _ ->
|
||||||
|
notificationSettingsExactAlarmsContract.launch(Intent("android.settings.REQUEST_SCHEDULE_EXACT_ALARM"))
|
||||||
|
}
|
||||||
|
.setNegativeButton(android.R.string.cancel) { _, _ ->
|
||||||
|
setUpcomingLessonsNotificationPreferenceChecked(false)
|
||||||
|
}
|
||||||
|
.setOnDismissListener { setUpcomingLessonsNotificationPreferenceChecked(false) }
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
|
||||||
override fun setNotificationPiggybackPreferenceChecked(isChecked: Boolean) {
|
override fun setNotificationPiggybackPreferenceChecked(isChecked: Boolean) {
|
||||||
findPreference<SwitchPreferenceCompat>(getString(R.string.pref_key_notifications_piggyback))?.isChecked =
|
findPreference<SwitchPreferenceCompat>(getString(R.string.pref_key_notifications_piggyback))?.isChecked =
|
||||||
isChecked
|
isChecked
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun setUpcomingLessonsNotificationPreferenceChecked(isChecked: Boolean) {
|
||||||
|
findPreference<SwitchPreferenceCompat>(getString(R.string.pref_key_notifications_upcoming_lessons_enable))?.isChecked =
|
||||||
|
isChecked
|
||||||
|
}
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
super.onResume()
|
super.onResume()
|
||||||
preferenceScreen.sharedPreferences.registerOnSharedPreferenceChangeListener(this)
|
preferenceScreen.sharedPreferences.registerOnSharedPreferenceChangeListener(this)
|
||||||
|
@ -45,6 +45,8 @@ class NotificationsPresenter @Inject constructor(
|
|||||||
isUpcomingLessonsNotificationsEnableKey, isUpcomingLessonsNotificationsPersistentKey -> {
|
isUpcomingLessonsNotificationsEnableKey, isUpcomingLessonsNotificationsPersistentKey -> {
|
||||||
if (!isUpcomingLessonsNotificationsEnable) {
|
if (!isUpcomingLessonsNotificationsEnable) {
|
||||||
timetableNotificationHelper.cancelNotification()
|
timetableNotificationHelper.cancelNotification()
|
||||||
|
} else if (!timetableNotificationHelper.canScheduleExactAlarms()) {
|
||||||
|
view?.openNotificationExactAlarmSettings()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
isDebugNotificationEnableKey -> {
|
isDebugNotificationEnableKey -> {
|
||||||
@ -68,12 +70,16 @@ class NotificationsPresenter @Inject constructor(
|
|||||||
view?.openSystemSettings()
|
view?.openSystemSettings()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onNotificationPermissionResult() {
|
fun onNotificationPiggybackPermissionResult() {
|
||||||
view?.run {
|
view?.run {
|
||||||
setNotificationPiggybackPreferenceChecked(isNotificationPermissionGranted)
|
setNotificationPiggybackPreferenceChecked(isNotificationPermissionGranted)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun onNotificationExactAlarmPermissionResult() {
|
||||||
|
view?.setUpcomingLessonsNotificationPreferenceChecked(timetableNotificationHelper.canScheduleExactAlarms())
|
||||||
|
}
|
||||||
|
|
||||||
private fun checkNotificationPiggybackState() {
|
private fun checkNotificationPiggybackState() {
|
||||||
if (preferencesRepository.isNotificationPiggybackEnabled) {
|
if (preferencesRepository.isNotificationPiggybackEnabled) {
|
||||||
view?.run {
|
view?.run {
|
||||||
|
@ -16,5 +16,9 @@ interface NotificationsView : BaseView {
|
|||||||
|
|
||||||
fun openNotificationPermissionDialog()
|
fun openNotificationPermissionDialog()
|
||||||
|
|
||||||
|
fun openNotificationExactAlarmSettings()
|
||||||
|
|
||||||
fun setNotificationPiggybackPreferenceChecked(isChecked: Boolean)
|
fun setNotificationPiggybackPreferenceChecked(isChecked: Boolean)
|
||||||
|
|
||||||
|
fun setUpcomingLessonsNotificationPreferenceChecked(isChecked: Boolean)
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
Wersja 1.4.0
|
Wersja 1.4.2
|
||||||
|
|
||||||
- dodaliśmy możliwość dodawania własnych zadań domowych
|
- dodaliśmy możliwość dodawania własnych zadań domowych
|
||||||
- dodaliśmy kafelek z wiadomościami od twórców
|
- dodaliśmy kafelek z wiadomościami od twórców
|
||||||
|
@ -33,8 +33,8 @@
|
|||||||
android:layout_marginStart="8dp"
|
android:layout_marginStart="8dp"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp"
|
||||||
android:textStyle="bold"
|
|
||||||
android:textSize="18sp"
|
android:textSize="18sp"
|
||||||
|
android:textStyle="bold"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toEndOf="@id/dashboard_admin_message_item_icon"
|
app:layout_constraintStart_toEndOf="@id/dashboard_admin_message_item_icon"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
@ -53,8 +53,23 @@
|
|||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/dashboard_admin_message_item_title"
|
app:layout_constraintTop_toBottomOf="@id/dashboard_admin_message_item_title"
|
||||||
|
app:layout_constraintVertical_bias="0"
|
||||||
app:lineHeight="20dp"
|
app:lineHeight="20dp"
|
||||||
tools:maxLines="5"
|
tools:maxLines="5"
|
||||||
tools:text="@tools:sample/lorem/random" />
|
tools:text="@tools:sample/lorem/random" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/dashboard_admin_message_item_dismiss"
|
||||||
|
style="@style/Widget.MaterialComponents.Button.TextButton.Dialog"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_marginBottom="8dp"
|
||||||
|
android:text="@android:string/ok"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/dashboard_admin_message_item_description"
|
||||||
|
app:layout_constraintVertical_bias="0" />
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
</com.google.android.material.card.MaterialCardView>
|
</com.google.android.material.card.MaterialCardView>
|
@ -678,13 +678,14 @@
|
|||||||
<string name="pref_notify_open_system_settings">Otevřít systémová nastavení upozornění</string>
|
<string name="pref_notify_open_system_settings">Otevřít systémová nastavení upozornění</string>
|
||||||
<string name="pref_notify_fix_sync_issues">Opravte problémy se synchronizací a upozorněním</string>
|
<string name="pref_notify_fix_sync_issues">Opravte problémy se synchronizací a upozorněním</string>
|
||||||
<string name="pref_notify_fix_sync_issues_message">Vaše zařízení může mít problémy se synchronizací dat as upozorněními.\n\nChcete-li je opravit, přidejte Wulkanového do funkce Autostart a vypněte optimalizaci/úsporu baterie v nastavení systému telefonu.</string>
|
<string name="pref_notify_fix_sync_issues_message">Vaše zařízení může mít problémy se synchronizací dat as upozorněními.\n\nChcete-li je opravit, přidejte Wulkanového do funkce Autostart a vypněte optimalizaci/úsporu baterie v nastavení systému telefonu.</string>
|
||||||
<string name="pref_notify_fix_sync_issues_settings_button">Přejít do nastavení</string>
|
|
||||||
<string name="pref_notify_debug_switch">Zobrazit upozornění o ladění</string>
|
<string name="pref_notify_debug_switch">Zobrazit upozornění o ladění</string>
|
||||||
<string name="pref_notify_disabled_summary">Synchronizace je vypnutá</string>
|
<string name="pref_notify_disabled_summary">Synchronizace je vypnutá</string>
|
||||||
<string name="pref_notify_notifications_piggyback">Zachytit upozornění oficiální aplikací</string>
|
<string name="pref_notify_notifications_piggyback">Zachytit upozornění oficiální aplikací</string>
|
||||||
<string name="pref_notification_piggyback_popup_title">Zachytit upozornění</string>
|
<string name="pref_notification_piggyback_popup_title">Zachytit upozornění</string>
|
||||||
<string name="pref_notification_piggyback_popup_description">S touto funkcí můžete získat náhradu push upozornění jako v oficiální aplikaci. Vše, co musíte udělat, je povolit Wulkanowému číst všechna vaše upozornění v nastaveních systému.\n\nJak to funguje?\nKdyž obdržíte oznámení v Deníčku VULCAN, Wulkanowy bude o tom informován (k tomu je to dodatečné povolení) a spustí synchronizaci, aby mohl zaslat vlastní upozornění.\n\nPOUZE PRO POKROČILÉ UŽIVATELE</string>
|
<string name="pref_notification_piggyback_popup_description">S touto funkcí můžete získat náhradu push upozornění jako v oficiální aplikaci. Vše, co musíte udělat, je povolit Wulkanowému číst všechna vaše upozornění v nastaveních systému.\n\nJak to funguje?\nKdyž obdržíte oznámení v Deníčku VULCAN, Wulkanowy bude o tom informován (k tomu je to dodatečné povolení) a spustí synchronizaci, aby mohl zaslat vlastní upozornění.\n\nPOUZE PRO POKROČILÉ UŽIVATELE</string>
|
||||||
<string name="pref_notification_piggyback_popup_positive">Přejít do nastavení</string>
|
<string name="pref_notification_exact_alarm_popup_title">Upozornění o nadcházející lekci</string>
|
||||||
|
<string name="pref_notification_exact_alarm_popup_descriptions">Musíte povolit Wulkanovému nastavit budíky a připomenutí v nastavení vašeho systému pro použití této funkce.</string>
|
||||||
|
<string name="pref_notification_go_to_settings">Přejít do nastavení</string>
|
||||||
<string name="pref_services_header">Synchronizace</string>
|
<string name="pref_services_header">Synchronizace</string>
|
||||||
<string name="pref_services_switch">Automatická aktualizace</string>
|
<string name="pref_services_switch">Automatická aktualizace</string>
|
||||||
<string name="pref_services_suspended">Pozastaveno na dovolené</string>
|
<string name="pref_services_suspended">Pozastaveno na dovolené</string>
|
||||||
@ -706,6 +707,7 @@
|
|||||||
<string name="pref_ads_privacy_agree">Souhlasím</string>
|
<string name="pref_ads_privacy_agree">Souhlasím</string>
|
||||||
<string name="pref_ads_privacy_link">Ochrana osobních údajů</string>
|
<string name="pref_ads_privacy_link">Ochrana osobních údajů</string>
|
||||||
<string name="pref_ads_loading">Reklama se načítá</string>
|
<string name="pref_ads_loading">Reklama se načítá</string>
|
||||||
|
<string name="pref_ads_once_per_visit">Thank you for your support, come back later for more ads</string>
|
||||||
<string name="pref_settings_advanced_title">Pokročilé</string>
|
<string name="pref_settings_advanced_title">Pokročilé</string>
|
||||||
<string name="pref_settings_appearance_title">Vzhled a chování</string>
|
<string name="pref_settings_appearance_title">Vzhled a chování</string>
|
||||||
<string name="pref_settings_notifications_title">Upozornění</string>
|
<string name="pref_settings_notifications_title">Upozornění</string>
|
||||||
|
@ -588,13 +588,14 @@
|
|||||||
<string name="pref_notify_open_system_settings">Systembenachrichtigungseinstellungen öffnen</string>
|
<string name="pref_notify_open_system_settings">Systembenachrichtigungseinstellungen öffnen</string>
|
||||||
<string name="pref_notify_fix_sync_issues">Synchronisierungs- und Benachrichtigungsprobleme reparieren</string>
|
<string name="pref_notify_fix_sync_issues">Synchronisierungs- und Benachrichtigungsprobleme reparieren</string>
|
||||||
<string name="pref_notify_fix_sync_issues_message">Ihr Gerät hat möglicherweise Probleme mit der Datensynchronisierung und Benachrichtigungen.\n\nUm diese zu reparieren, fügen Sie Wulkanowy zum Autostart hinzu und deaktivieren Sie die Batterieoptimierung in den Systemeinstellungen des Geräts.</string>
|
<string name="pref_notify_fix_sync_issues_message">Ihr Gerät hat möglicherweise Probleme mit der Datensynchronisierung und Benachrichtigungen.\n\nUm diese zu reparieren, fügen Sie Wulkanowy zum Autostart hinzu und deaktivieren Sie die Batterieoptimierung in den Systemeinstellungen des Geräts.</string>
|
||||||
<string name="pref_notify_fix_sync_issues_settings_button">Gehe zu den Einstellungen</string>
|
|
||||||
<string name="pref_notify_debug_switch">Debug-Benachrichtigungen anzeigen</string>
|
<string name="pref_notify_debug_switch">Debug-Benachrichtigungen anzeigen</string>
|
||||||
<string name="pref_notify_disabled_summary">Synchronisierung ist deaktiviert</string>
|
<string name="pref_notify_disabled_summary">Synchronisierung ist deaktiviert</string>
|
||||||
<string name="pref_notify_notifications_piggyback">Offizielle App-Benachrichtigungen erfassen</string>
|
<string name="pref_notify_notifications_piggyback">Offizielle App-Benachrichtigungen erfassen</string>
|
||||||
<string name="pref_notification_piggyback_popup_title">Benachrichtigungen erfassen</string>
|
<string name="pref_notification_piggyback_popup_title">Benachrichtigungen erfassen</string>
|
||||||
<string name="pref_notification_piggyback_popup_description">With this feature you can gain a substitute of push notifications like in the official app. All you need to do is allow Wulkanowy to receive all notifications in your system settings.\n\nHow it works?\nWhen you get a notification in Dziennik VULCAN, Wulkanowy will be notified (that\'s what these extra permissions are for) and will trigger a sync so that can send its own notification.\n\nFOR ADVANCED USERS ONLY</string>
|
<string name="pref_notification_piggyback_popup_description">With this feature you can gain a substitute of push notifications like in the official app. All you need to do is allow Wulkanowy to receive all notifications in your system settings.\n\nHow it works?\nWhen you get a notification in Dziennik VULCAN, Wulkanowy will be notified (that\'s what these extra permissions are for) and will trigger a sync so that can send its own notification.\n\nFOR ADVANCED USERS ONLY</string>
|
||||||
<string name="pref_notification_piggyback_popup_positive">Gehe zu Einstellungen</string>
|
<string name="pref_notification_exact_alarm_popup_title">Upcoming lesson notifications</string>
|
||||||
|
<string name="pref_notification_exact_alarm_popup_descriptions">You must allow the Wulkanowy app to set alarms and reminders in your system settings to use this feature.</string>
|
||||||
|
<string name="pref_notification_go_to_settings">Go to settings</string>
|
||||||
<string name="pref_services_header">Synchronisierung</string>
|
<string name="pref_services_header">Synchronisierung</string>
|
||||||
<string name="pref_services_switch">Automatische Aktualisierung</string>
|
<string name="pref_services_switch">Automatische Aktualisierung</string>
|
||||||
<string name="pref_services_suspended">An Feiertagen suspendiert</string>
|
<string name="pref_services_suspended">An Feiertagen suspendiert</string>
|
||||||
@ -616,6 +617,7 @@
|
|||||||
<string name="pref_ads_privacy_agree">Agree</string>
|
<string name="pref_ads_privacy_agree">Agree</string>
|
||||||
<string name="pref_ads_privacy_link">Privacy policy</string>
|
<string name="pref_ads_privacy_link">Privacy policy</string>
|
||||||
<string name="pref_ads_loading">Ad is loading</string>
|
<string name="pref_ads_loading">Ad is loading</string>
|
||||||
|
<string name="pref_ads_once_per_visit">Thank you for your support, come back later for more ads</string>
|
||||||
<string name="pref_settings_advanced_title">Erweitert</string>
|
<string name="pref_settings_advanced_title">Erweitert</string>
|
||||||
<string name="pref_settings_appearance_title">Aussehen & Verhalten</string>
|
<string name="pref_settings_appearance_title">Aussehen & Verhalten</string>
|
||||||
<string name="pref_settings_notifications_title">Benachrichtigungen</string>
|
<string name="pref_settings_notifications_title">Benachrichtigungen</string>
|
||||||
|
@ -678,13 +678,14 @@
|
|||||||
<string name="pref_notify_open_system_settings">Otwórz systemowe ustawienia powiadomień</string>
|
<string name="pref_notify_open_system_settings">Otwórz systemowe ustawienia powiadomień</string>
|
||||||
<string name="pref_notify_fix_sync_issues">Napraw problemy z synchronizacją i powiadomieniami</string>
|
<string name="pref_notify_fix_sync_issues">Napraw problemy z synchronizacją i powiadomieniami</string>
|
||||||
<string name="pref_notify_fix_sync_issues_message">Na twoim urządzeniu mogą występować problemy z synchronizacją danych i powiadomieniami.\n\nBy je naprawić, dodaj Wulkanowego do autostartu i wyłącz optymalizację/oszczędzanie baterii w ustawieniach systemowych telefonu.</string>
|
<string name="pref_notify_fix_sync_issues_message">Na twoim urządzeniu mogą występować problemy z synchronizacją danych i powiadomieniami.\n\nBy je naprawić, dodaj Wulkanowego do autostartu i wyłącz optymalizację/oszczędzanie baterii w ustawieniach systemowych telefonu.</string>
|
||||||
<string name="pref_notify_fix_sync_issues_settings_button">Przejdź do ustawień</string>
|
|
||||||
<string name="pref_notify_debug_switch">Pokazuj powiadomienia debugowania</string>
|
<string name="pref_notify_debug_switch">Pokazuj powiadomienia debugowania</string>
|
||||||
<string name="pref_notify_disabled_summary">Synchronizacja jest wyłączona</string>
|
<string name="pref_notify_disabled_summary">Synchronizacja jest wyłączona</string>
|
||||||
<string name="pref_notify_notifications_piggyback">Przechwytywanie powiadomień oficjalnej aplikacji</string>
|
<string name="pref_notify_notifications_piggyback">Przechwytywanie powiadomień oficjalnej aplikacji</string>
|
||||||
<string name="pref_notification_piggyback_popup_title">Przechwytywanie powiadomień</string>
|
<string name="pref_notification_piggyback_popup_title">Przechwytywanie powiadomień</string>
|
||||||
<string name="pref_notification_piggyback_popup_description">Dzięki tej funkcji możesz uzyskać namiastkę powiadomień push, takich jak w oficjalnej aplikacji. Wszystko, co musisz zrobić, to zezwolić Wulkanowemu na odczytywanie wszystkich powiadomień w ustawieniach systemowych.\n\nJak to działa?\nKiedy otrzymasz powiadomienie w Dzienniczku VULCAN, Wulkanowy zostanie o tym powiadomiony (do tego jest to dodatkowe uprawnienie) i uruchomi synchronizację, aby mógł wysłać własne powiadomienie.\n\nWYŁĄCZNIE DLA ZAAWANSOWANYCH UŻYTKOWNIKÓW</string>
|
<string name="pref_notification_piggyback_popup_description">Dzięki tej funkcji możesz uzyskać namiastkę powiadomień push, takich jak w oficjalnej aplikacji. Wszystko, co musisz zrobić, to zezwolić Wulkanowemu na odczytywanie wszystkich powiadomień w ustawieniach systemowych.\n\nJak to działa?\nKiedy otrzymasz powiadomienie w Dzienniczku VULCAN, Wulkanowy zostanie o tym powiadomiony (do tego jest to dodatkowe uprawnienie) i uruchomi synchronizację, aby mógł wysłać własne powiadomienie.\n\nWYŁĄCZNIE DLA ZAAWANSOWANYCH UŻYTKOWNIKÓW</string>
|
||||||
<string name="pref_notification_piggyback_popup_positive">Przejdź do ustawień</string>
|
<string name="pref_notification_exact_alarm_popup_title">Powiadomienia o nadchodzących lekcjach</string>
|
||||||
|
<string name="pref_notification_exact_alarm_popup_descriptions">Musisz pozwolić Wulkanowemu na tworzenie alarmów i przypomnień w ustawieniach Twojego systemu, aby użyć tej funkcji.</string>
|
||||||
|
<string name="pref_notification_go_to_settings">Przejdź do ustawień</string>
|
||||||
<string name="pref_services_header">Synchronizacja</string>
|
<string name="pref_services_header">Synchronizacja</string>
|
||||||
<string name="pref_services_switch">Automatyczna aktualizacja</string>
|
<string name="pref_services_switch">Automatyczna aktualizacja</string>
|
||||||
<string name="pref_services_suspended">Zawieszona na wakacjach</string>
|
<string name="pref_services_suspended">Zawieszona na wakacjach</string>
|
||||||
@ -706,6 +707,7 @@
|
|||||||
<string name="pref_ads_privacy_agree">Akceptuję</string>
|
<string name="pref_ads_privacy_agree">Akceptuję</string>
|
||||||
<string name="pref_ads_privacy_link">Polityka prywatności</string>
|
<string name="pref_ads_privacy_link">Polityka prywatności</string>
|
||||||
<string name="pref_ads_loading">Ładowanie reklamy</string>
|
<string name="pref_ads_loading">Ładowanie reklamy</string>
|
||||||
|
<string name="pref_ads_once_per_visit">Dziękujemy za wsparcie, wróć później po więcej reklam</string>
|
||||||
<string name="pref_settings_advanced_title">Zaawansowane</string>
|
<string name="pref_settings_advanced_title">Zaawansowane</string>
|
||||||
<string name="pref_settings_appearance_title">Wygląd i zachowanie</string>
|
<string name="pref_settings_appearance_title">Wygląd i zachowanie</string>
|
||||||
<string name="pref_settings_notifications_title">Powiadomienia</string>
|
<string name="pref_settings_notifications_title">Powiadomienia</string>
|
||||||
|
@ -678,13 +678,14 @@
|
|||||||
<string name="pref_notify_open_system_settings">Открыть настройки уведомлений системы</string>
|
<string name="pref_notify_open_system_settings">Открыть настройки уведомлений системы</string>
|
||||||
<string name="pref_notify_fix_sync_issues">Исправить проблемы с синхронизацией и уведомлениями</string>
|
<string name="pref_notify_fix_sync_issues">Исправить проблемы с синхронизацией и уведомлениями</string>
|
||||||
<string name="pref_notify_fix_sync_issues_message">На вашем устройстве могут быть проблемы с синхронизацией данных и уведомлениями.\n\nЧтобы их исправить, вам необходимо добавить Wulkanowy в авто-старт и выключить оптимизацию/экономию батареи в настройках устройства.</string>
|
<string name="pref_notify_fix_sync_issues_message">На вашем устройстве могут быть проблемы с синхронизацией данных и уведомлениями.\n\nЧтобы их исправить, вам необходимо добавить Wulkanowy в авто-старт и выключить оптимизацию/экономию батареи в настройках устройства.</string>
|
||||||
<string name="pref_notify_fix_sync_issues_settings_button">Перейти в настройски</string>
|
|
||||||
<string name="pref_notify_debug_switch">Показывать дебаг-уведомления</string>
|
<string name="pref_notify_debug_switch">Показывать дебаг-уведомления</string>
|
||||||
<string name="pref_notify_disabled_summary">Синхронизация отключена</string>
|
<string name="pref_notify_disabled_summary">Синхронизация отключена</string>
|
||||||
<string name="pref_notify_notifications_piggyback">Записывать официальные уведомления</string>
|
<string name="pref_notify_notifications_piggyback">Записывать официальные уведомления</string>
|
||||||
<string name="pref_notification_piggyback_popup_title">Показывать push-уведомления</string>
|
<string name="pref_notification_piggyback_popup_title">Показывать push-уведомления</string>
|
||||||
<string name="pref_notification_piggyback_popup_description">С помощью этой функции вы можете получить замену push-уведомлений, как в официальном приложении. Все, что вам нужно сделать, это разрешить Wulkanowy получать все уведомления в настройках системы.\n\nКак это работает?\nКогда вы получаете уведомление в Dziennik VULCAN, Wulkanowy будет уведомлен (это требует дополнительных прав) и запустит синхронизацию, чтобы отправить свое уведомление.\n\nТОЛЬКО ДЛЯ ПОЛЬЗОВАТЕЛЯ</string>
|
<string name="pref_notification_piggyback_popup_description">С помощью этой функции вы можете получить замену push-уведомлений, как в официальном приложении. Все, что вам нужно сделать, это разрешить Wulkanowy получать все уведомления в настройках системы.\n\nКак это работает?\nКогда вы получаете уведомление в Dziennik VULCAN, Wulkanowy будет уведомлен (это требует дополнительных прав) и запустит синхронизацию, чтобы отправить свое уведомление.\n\nТОЛЬКО ДЛЯ ПОЛЬЗОВАТЕЛЯ</string>
|
||||||
<string name="pref_notification_piggyback_popup_positive">Перейти к настройкам</string>
|
<string name="pref_notification_exact_alarm_popup_title">Upcoming lesson notifications</string>
|
||||||
|
<string name="pref_notification_exact_alarm_popup_descriptions">You must allow the Wulkanowy app to set alarms and reminders in your system settings to use this feature.</string>
|
||||||
|
<string name="pref_notification_go_to_settings">Go to settings</string>
|
||||||
<string name="pref_services_header">Синхронизация</string>
|
<string name="pref_services_header">Синхронизация</string>
|
||||||
<string name="pref_services_switch">Автоматическая синхронизация</string>
|
<string name="pref_services_switch">Автоматическая синхронизация</string>
|
||||||
<string name="pref_services_suspended">Приостановить синхронизации во время каникул</string>
|
<string name="pref_services_suspended">Приостановить синхронизации во время каникул</string>
|
||||||
@ -706,6 +707,7 @@
|
|||||||
<string name="pref_ads_privacy_agree">Согласен</string>
|
<string name="pref_ads_privacy_agree">Согласен</string>
|
||||||
<string name="pref_ads_privacy_link">Политика конфиденциальности</string>
|
<string name="pref_ads_privacy_link">Политика конфиденциальности</string>
|
||||||
<string name="pref_ads_loading">Объявление загружается</string>
|
<string name="pref_ads_loading">Объявление загружается</string>
|
||||||
|
<string name="pref_ads_once_per_visit">Thank you for your support, come back later for more ads</string>
|
||||||
<string name="pref_settings_advanced_title">Расширенные</string>
|
<string name="pref_settings_advanced_title">Расширенные</string>
|
||||||
<string name="pref_settings_appearance_title">Внешний вид & Поведение</string>
|
<string name="pref_settings_appearance_title">Внешний вид & Поведение</string>
|
||||||
<string name="pref_settings_notifications_title">Уведомления</string>
|
<string name="pref_settings_notifications_title">Уведомления</string>
|
||||||
|
@ -678,13 +678,14 @@
|
|||||||
<string name="pref_notify_open_system_settings">Otvoriť systémové nastavenia upozornení</string>
|
<string name="pref_notify_open_system_settings">Otvoriť systémové nastavenia upozornení</string>
|
||||||
<string name="pref_notify_fix_sync_issues">Opravte problémy so synchronizáciou a upozornením</string>
|
<string name="pref_notify_fix_sync_issues">Opravte problémy so synchronizáciou a upozornením</string>
|
||||||
<string name="pref_notify_fix_sync_issues_message">Vaše zariadenie môže mať problémy so synchronizáciou dát as upozorneniami.\n\nAk ich chcete opraviť, pridajte Wulkanového do funkcie Autostart a vypnite optimalizáciu/úsporu batérie v nastavení systému telefóne.</string>
|
<string name="pref_notify_fix_sync_issues_message">Vaše zariadenie môže mať problémy so synchronizáciou dát as upozorneniami.\n\nAk ich chcete opraviť, pridajte Wulkanového do funkcie Autostart a vypnite optimalizáciu/úsporu batérie v nastavení systému telefóne.</string>
|
||||||
<string name="pref_notify_fix_sync_issues_settings_button">Prejsť do nastavení</string>
|
|
||||||
<string name="pref_notify_debug_switch">Zobraziť upozornenia o ladení</string>
|
<string name="pref_notify_debug_switch">Zobraziť upozornenia o ladení</string>
|
||||||
<string name="pref_notify_disabled_summary">Synchronizácia je vypnutá</string>
|
<string name="pref_notify_disabled_summary">Synchronizácia je vypnutá</string>
|
||||||
<string name="pref_notify_notifications_piggyback">Zachytiť upozornenia oficiálnej aplikácie</string>
|
<string name="pref_notify_notifications_piggyback">Zachytiť upozornenia oficiálnej aplikácie</string>
|
||||||
<string name="pref_notification_piggyback_popup_title">Zachytiť upozornenia</string>
|
<string name="pref_notification_piggyback_popup_title">Zachytiť upozornenia</string>
|
||||||
<string name="pref_notification_piggyback_popup_description">S touto funkciou môžete získať náhradu push upozornení ako v oficiálnej aplikácii. Všetko, čo musíte urobiť, je povoliť Wulkanowému čítať všetky vaše upozornenia v nastaveniach systému.\n\nAko to funguje?\nKeď dostanete oznámenie v Deníčku VULCAN, Wulkanowy bude o tom informovaný (k tomu je to dodatočné povolenie) a spustí synchronizáciu, aby mohol zaslať vlastné upozornenie.\n\nLEN PRE POKROČILÝCH POUŽĺVATEĹOV</string>
|
<string name="pref_notification_piggyback_popup_description">S touto funkciou môžete získať náhradu push upozornení ako v oficiálnej aplikácii. Všetko, čo musíte urobiť, je povoliť Wulkanowému čítať všetky vaše upozornenia v nastaveniach systému.\n\nAko to funguje?\nKeď dostanete oznámenie v Deníčku VULCAN, Wulkanowy bude o tom informovaný (k tomu je to dodatočné povolenie) a spustí synchronizáciu, aby mohol zaslať vlastné upozornenie.\n\nLEN PRE POKROČILÝCH POUŽĺVATEĹOV</string>
|
||||||
<string name="pref_notification_piggyback_popup_positive">Prejsť do nastavení</string>
|
<string name="pref_notification_exact_alarm_popup_title">Upozornenia o nadchádzajúcej lekciu</string>
|
||||||
|
<string name="pref_notification_exact_alarm_popup_descriptions">Musíte povoliť Wulkanovému nastaviť budíky a pripomenutie v nastavení vášho systému pre použitie tejto funkcie.</string>
|
||||||
|
<string name="pref_notification_go_to_settings">Prejsť do nastavení</string>
|
||||||
<string name="pref_services_header">Synchronizácia</string>
|
<string name="pref_services_header">Synchronizácia</string>
|
||||||
<string name="pref_services_switch">Automatická aktualizácia</string>
|
<string name="pref_services_switch">Automatická aktualizácia</string>
|
||||||
<string name="pref_services_suspended">Pozastavený počas dovolenky</string>
|
<string name="pref_services_suspended">Pozastavený počas dovolenky</string>
|
||||||
@ -706,6 +707,7 @@
|
|||||||
<string name="pref_ads_privacy_agree">Súhlasím</string>
|
<string name="pref_ads_privacy_agree">Súhlasím</string>
|
||||||
<string name="pref_ads_privacy_link">Ochrana osobných údajov</string>
|
<string name="pref_ads_privacy_link">Ochrana osobných údajov</string>
|
||||||
<string name="pref_ads_loading">Reklama sa načítava</string>
|
<string name="pref_ads_loading">Reklama sa načítava</string>
|
||||||
|
<string name="pref_ads_once_per_visit">Thank you for your support, come back later for more ads</string>
|
||||||
<string name="pref_settings_advanced_title">Pokročilé</string>
|
<string name="pref_settings_advanced_title">Pokročilé</string>
|
||||||
<string name="pref_settings_appearance_title">Vzhľad a správanie</string>
|
<string name="pref_settings_appearance_title">Vzhľad a správanie</string>
|
||||||
<string name="pref_settings_notifications_title">Upozornenia</string>
|
<string name="pref_settings_notifications_title">Upozornenia</string>
|
||||||
|
@ -678,13 +678,14 @@
|
|||||||
<string name="pref_notify_open_system_settings">Відкрити налаштування сповіщень системи</string>
|
<string name="pref_notify_open_system_settings">Відкрити налаштування сповіщень системи</string>
|
||||||
<string name="pref_notify_fix_sync_issues">Виправити помилки з синхронізацією і повідомленнями</string>
|
<string name="pref_notify_fix_sync_issues">Виправити помилки з синхронізацією і повідомленнями</string>
|
||||||
<string name="pref_notify_fix_sync_issues_message">На вашому пристрої можуть бути помилки з синхронізацією і повідомленнями\n\nЩоб виправити іх, вам необхідно додати Wulkanowy в авто-старт и вимкнути оптимізацію/экономію батареї в налаштуваннях пристрою.</string>
|
<string name="pref_notify_fix_sync_issues_message">На вашому пристрої можуть бути помилки з синхронізацією і повідомленнями\n\nЩоб виправити іх, вам необхідно додати Wulkanowy в авто-старт и вимкнути оптимізацію/экономію батареї в налаштуваннях пристрою.</string>
|
||||||
<string name="pref_notify_fix_sync_issues_settings_button">Перейти до налаштувань</string>
|
|
||||||
<string name="pref_notify_debug_switch">Показувати дебаг-повідомлення</string>
|
<string name="pref_notify_debug_switch">Показувати дебаг-повідомлення</string>
|
||||||
<string name="pref_notify_disabled_summary">Синхронізація вимкнена</string>
|
<string name="pref_notify_disabled_summary">Синхронізація вимкнена</string>
|
||||||
<string name="pref_notify_notifications_piggyback">Захоплювати офіційні сповіщення програм</string>
|
<string name="pref_notify_notifications_piggyback">Захоплювати офіційні сповіщення програм</string>
|
||||||
<string name="pref_notification_piggyback_popup_title">Показувати push-повідомлення</string>
|
<string name="pref_notification_piggyback_popup_title">Показувати push-повідомлення</string>
|
||||||
<string name="pref_notification_piggyback_popup_description">За допомогою цієї функції ви можете отримати заміну push -повідомлень, як у офіційному додатку. Все, що вам потрібно зробити, це дозволити Wulkanowy отримувати всі сповіщення у налаштуваннях вашої системи. \ N \ nЯк це працює? \ NКоли ви отримаєте сповіщення у Dziennik VULCAN, Wulkanowy отримає сповіщення (для цього призначені ці додаткові дозволи) і запустить синхронізація, яка може надсилати власне сповіщення. \ n \ n ТІЛЬКИ ДЛЯ РОЗШИРЕНИХ КОРИСТУВАЧІВ</string>
|
<string name="pref_notification_piggyback_popup_description">За допомогою цієї функції ви можете отримати заміну push -повідомлень, як у офіційному додатку. Все, що вам потрібно зробити, це дозволити Wulkanowy отримувати всі сповіщення у налаштуваннях вашої системи. \ N \ nЯк це працює? \ NКоли ви отримаєте сповіщення у Dziennik VULCAN, Wulkanowy отримає сповіщення (для цього призначені ці додаткові дозволи) і запустить синхронізація, яка може надсилати власне сповіщення. \ n \ n ТІЛЬКИ ДЛЯ РОЗШИРЕНИХ КОРИСТУВАЧІВ</string>
|
||||||
<string name="pref_notification_piggyback_popup_positive">Перейти до налаштувань</string>
|
<string name="pref_notification_exact_alarm_popup_title">Upcoming lesson notifications</string>
|
||||||
|
<string name="pref_notification_exact_alarm_popup_descriptions">You must allow the Wulkanowy app to set alarms and reminders in your system settings to use this feature.</string>
|
||||||
|
<string name="pref_notification_go_to_settings">Go to settings</string>
|
||||||
<string name="pref_services_header">Синхронізація</string>
|
<string name="pref_services_header">Синхронізація</string>
|
||||||
<string name="pref_services_switch">Автоматична синхронізація</string>
|
<string name="pref_services_switch">Автоматична синхронізація</string>
|
||||||
<string name="pref_services_suspended">Призупинено на час канікул</string>
|
<string name="pref_services_suspended">Призупинено на час канікул</string>
|
||||||
@ -706,6 +707,7 @@
|
|||||||
<string name="pref_ads_privacy_agree">Погоджуюсь</string>
|
<string name="pref_ads_privacy_agree">Погоджуюсь</string>
|
||||||
<string name="pref_ads_privacy_link">Політика конфіденційності</string>
|
<string name="pref_ads_privacy_link">Політика конфіденційності</string>
|
||||||
<string name="pref_ads_loading">Реклама завантажується</string>
|
<string name="pref_ads_loading">Реклама завантажується</string>
|
||||||
|
<string name="pref_ads_once_per_visit">Thank you for your support, come back later for more ads</string>
|
||||||
<string name="pref_settings_advanced_title">Додатково</string>
|
<string name="pref_settings_advanced_title">Додатково</string>
|
||||||
<string name="pref_settings_appearance_title">Вигляд & Поведінка</string>
|
<string name="pref_settings_appearance_title">Вигляд & Поведінка</string>
|
||||||
<string name="pref_settings_notifications_title">Повідомлення</string>
|
<string name="pref_settings_notifications_title">Повідомлення</string>
|
||||||
|
@ -667,13 +667,14 @@
|
|||||||
<string name="pref_notify_open_system_settings">Open system notification settings</string>
|
<string name="pref_notify_open_system_settings">Open system notification settings</string>
|
||||||
<string name="pref_notify_fix_sync_issues">Fix synchronization & notifications issues</string>
|
<string name="pref_notify_fix_sync_issues">Fix synchronization & notifications issues</string>
|
||||||
<string name="pref_notify_fix_sync_issues_message">Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings.</string>
|
<string name="pref_notify_fix_sync_issues_message">Your device may have data synchronization issues and with notifications.\n\nTo fix them, you need to add Wulkanowy to the autostart and turn off battery optimization/saving in the phone settings.</string>
|
||||||
<string name="pref_notify_fix_sync_issues_settings_button">Go to settings</string>
|
|
||||||
<string name="pref_notify_debug_switch">Show debug notifications</string>
|
<string name="pref_notify_debug_switch">Show debug notifications</string>
|
||||||
<string name="pref_notify_disabled_summary">Synchronization is disabled</string>
|
<string name="pref_notify_disabled_summary">Synchronization is disabled</string>
|
||||||
<string name="pref_notify_notifications_piggyback">Capture official app notifications</string>
|
<string name="pref_notify_notifications_piggyback">Capture official app notifications</string>
|
||||||
<string name="pref_notification_piggyback_popup_title">Capture notifications</string>
|
<string name="pref_notification_piggyback_popup_title">Capture notifications</string>
|
||||||
<string name="pref_notification_piggyback_popup_description">With this feature you can gain a substitute of push notifications like in the official app. All you need to do is allow Wulkanowy to receive all notifications in your system settings.\n\nHow it works?\nWhen you get a notification in Dziennik VULCAN, Wulkanowy will be notified (that\'s what these extra permissions are for) and will trigger a sync so that can send its own notification.\n\nFOR ADVANCED USERS ONLY</string>
|
<string name="pref_notification_piggyback_popup_description">With this feature you can gain a substitute of push notifications like in the official app. All you need to do is allow Wulkanowy to receive all notifications in your system settings.\n\nHow it works?\nWhen you get a notification in Dziennik VULCAN, Wulkanowy will be notified (that\'s what these extra permissions are for) and will trigger a sync so that can send its own notification.\n\nFOR ADVANCED USERS ONLY</string>
|
||||||
<string name="pref_notification_piggyback_popup_positive">Go to settings</string>
|
<string name="pref_notification_exact_alarm_popup_title">Upcoming lesson notifications</string>
|
||||||
|
<string name="pref_notification_exact_alarm_popup_descriptions">You must allow the Wulkanowy app to set alarms and reminders in your system settings to use this feature.</string>
|
||||||
|
<string name="pref_notification_go_to_settings">Go to settings</string>
|
||||||
|
|
||||||
<string name="pref_services_header">Synchronization</string>
|
<string name="pref_services_header">Synchronization</string>
|
||||||
<string name="pref_services_switch">Automatic update</string>
|
<string name="pref_services_switch">Automatic update</string>
|
||||||
@ -698,6 +699,7 @@
|
|||||||
<string name="pref_ads_privacy_agree">Agree</string>
|
<string name="pref_ads_privacy_agree">Agree</string>
|
||||||
<string name="pref_ads_privacy_link">Privacy policy</string>
|
<string name="pref_ads_privacy_link">Privacy policy</string>
|
||||||
<string name="pref_ads_loading">Ad is loading</string>
|
<string name="pref_ads_loading">Ad is loading</string>
|
||||||
|
<string name="pref_ads_once_per_visit">Thank you for your support, come back later for more ads</string>
|
||||||
|
|
||||||
<string name="pref_settings_advanced_title">Advanced</string>
|
<string name="pref_settings_advanced_title">Advanced</string>
|
||||||
<string name="pref_settings_appearance_title">Appearance & Behavior</string>
|
<string name="pref_settings_appearance_title">Appearance & Behavior</string>
|
||||||
|
@ -68,6 +68,13 @@ class AdsFragment : PreferenceFragmentCompat(), MainView.TitledView, AdsView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun showWatchAdOncePerVisit(show: Boolean) {
|
||||||
|
findPreference<Preference>(getString(R.string.pref_key_ads_single_support))?.run {
|
||||||
|
isEnabled = !show
|
||||||
|
summary = if (show) getString(R.string.pref_ads_once_per_visit) else null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun showError(text: String, error: Throwable) {
|
override fun showError(text: String, error: Throwable) {
|
||||||
(activity as? BaseActivity<*, *>)?.showError(text, error)
|
(activity as? BaseActivity<*, *>)?.showError(text, error)
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,10 @@ class AdsPresenter @Inject constructor(
|
|||||||
.onFailure(errorHandler::dispatch)
|
.onFailure(errorHandler::dispatch)
|
||||||
.onSuccess { it?.let { view?.showAd(it) } }
|
.onSuccess { it?.let { view?.showAd(it) } }
|
||||||
|
|
||||||
view?.showLoadingSupportAd(false)
|
view?.run {
|
||||||
|
showLoadingSupportAd(false)
|
||||||
|
showWatchAdOncePerVisit(true)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -14,4 +14,6 @@ interface AdsView : BaseView {
|
|||||||
fun openPrivacyPolicy()
|
fun openPrivacyPolicy()
|
||||||
|
|
||||||
fun showLoadingSupportAd(show: Boolean)
|
fun showLoadingSupportAd(show: Boolean)
|
||||||
|
|
||||||
|
fun showWatchAdOncePerVisit(show: Boolean)
|
||||||
}
|
}
|
@ -1,6 +1,8 @@
|
|||||||
package io.github.wulkanowy.utils
|
package io.github.wulkanowy.utils
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.os.Bundle
|
||||||
|
import com.google.ads.mediation.admob.AdMobAdapter
|
||||||
import com.google.android.gms.ads.AdRequest
|
import com.google.android.gms.ads.AdRequest
|
||||||
import com.google.android.gms.ads.LoadAdError
|
import com.google.android.gms.ads.LoadAdError
|
||||||
import com.google.android.gms.ads.MobileAds
|
import com.google.android.gms.ads.MobileAds
|
||||||
@ -18,7 +20,10 @@ class AdsHelper @Inject constructor(@ApplicationContext private val context: Con
|
|||||||
suspend fun getSupportAd(): RewardedInterstitialAd? {
|
suspend fun getSupportAd(): RewardedInterstitialAd? {
|
||||||
MobileAds.initialize(context)
|
MobileAds.initialize(context)
|
||||||
|
|
||||||
val adRequest = AdRequest.Builder().build()
|
val extra = Bundle().apply { putString("npa", "1") }
|
||||||
|
val adRequest = AdRequest.Builder()
|
||||||
|
.addNetworkExtrasBundle(AdMobAdapter::class.java, extra)
|
||||||
|
.build()
|
||||||
|
|
||||||
return suspendCoroutine {
|
return suspendCoroutine {
|
||||||
RewardedInterstitialAd.load(
|
RewardedInterstitialAd.load(
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<Preference
|
<Preference
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
app:key="@string/pref_key_ads_single_support"
|
app:key="@string/pref_key_ads_single_support"
|
||||||
app:singleLineTitle="true"
|
app:singleLineTitle="false"
|
||||||
app:title="@string/pref_ads_support" />
|
app:title="@string/pref_ads_support" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
@ -1,6 +1,6 @@
|
|||||||
buildscript {
|
buildscript {
|
||||||
ext {
|
ext {
|
||||||
kotlin_version = '1.5.31'
|
kotlin_version = '1.6.0'
|
||||||
about_libraries = '8.9.4'
|
about_libraries = '8.9.4'
|
||||||
hilt_version = "2.40.1"
|
hilt_version = "2.40.1"
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user