Compare commits
26 commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1033be4503 | ||
![]() |
e67066f3ae | ||
![]() |
bc22808b0e | ||
![]() |
e05abb3539 | ||
![]() |
6153c7b97d | ||
![]() |
e574e5e2ec | ||
![]() |
e6571a1dfc | ||
![]() |
d566de0282 | ||
![]() |
558db061f5 | ||
![]() |
190f40ede8 | ||
![]() |
4b795d6ef5 | ||
![]() |
d139bd5b14 | ||
![]() |
bf34cb0c1e | ||
![]() |
eed091aad2 | ||
![]() |
535206056d | ||
![]() |
f2cb3b4f9e | ||
![]() |
54372e0a55 | ||
![]() |
5c17c38d1d | ||
![]() |
f68a8e4215 | ||
![]() |
70c2cb7dbf | ||
![]() |
7f6fd60821 | ||
![]() |
62c04fb205 | ||
![]() |
10c36f19bf | ||
![]() |
37d756b8fe | ||
![]() |
de1bc4809f | ||
![]() |
3d6ec93cde |
22 changed files with 389 additions and 44 deletions
1
.github/workflows/deploy-store.yml
vendored
1
.github/workflows/deploy-store.yml
vendored
|
@ -38,6 +38,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 }}
|
||||||
|
DASHBOARD_TILE_AD_ID: ${{ secrets.DASHBOARD_TILE_AD_ID }}
|
||||||
SET_BUILD_TIMESTAMP: ${{ secrets.SET_BUILD_TIMESTAMP }}
|
SET_BUILD_TIMESTAMP: ${{ secrets.SET_BUILD_TIMESTAMP }}
|
||||||
run: ./gradlew publishPlayReleaseApps -PenableFirebase --stacktrace;
|
run: ./gradlew publishPlayReleaseApps -PenableFirebase --stacktrace;
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,8 @@ android {
|
||||||
testApplicationId "io.github.tests.wulkanowy"
|
testApplicationId "io.github.tests.wulkanowy"
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 32
|
targetSdkVersion 32
|
||||||
versionCode 109
|
versionCode 113
|
||||||
versionName "1.7.0"
|
versionName "1.7.4"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
resValue "string", "app_name", "Wulkanowy"
|
resValue "string", "app_name", "Wulkanowy"
|
||||||
|
@ -160,8 +160,8 @@ kapt {
|
||||||
play {
|
play {
|
||||||
defaultToAppBundles = false
|
defaultToAppBundles = false
|
||||||
track = 'production'
|
track = 'production'
|
||||||
releaseStatus = com.github.triplet.gradle.androidpublisher.ReleaseStatus.IN_PROGRESS
|
// releaseStatus = com.github.triplet.gradle.androidpublisher.ReleaseStatus.IN_PROGRESS
|
||||||
userFraction = 0.05d
|
// userFraction = 0.05d
|
||||||
updatePriority = 5
|
updatePriority = 5
|
||||||
enabled.set(false)
|
enabled.set(false)
|
||||||
}
|
}
|
||||||
|
@ -181,16 +181,16 @@ ext {
|
||||||
android_hilt = "1.0.0"
|
android_hilt = "1.0.0"
|
||||||
room = "2.4.3"
|
room = "2.4.3"
|
||||||
chucker = "3.5.2"
|
chucker = "3.5.2"
|
||||||
mockk = "1.12.5"
|
mockk = "1.12.7"
|
||||||
coroutines = "1.6.4"
|
coroutines = "1.6.4"
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation "io.github.wulkanowy:sdk:1.7.0"
|
implementation "io.github.wulkanowy:sdk:1.7.4"
|
||||||
|
|
||||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.6'
|
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.8'
|
||||||
|
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.3"
|
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.0"
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines"
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines"
|
||||||
|
|
||||||
implementation "androidx.core:core-ktx:1.8.0"
|
implementation "androidx.core:core-ktx:1.8.0"
|
||||||
|
@ -263,7 +263,7 @@ dependencies {
|
||||||
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines"
|
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines"
|
||||||
testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
|
testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
|
||||||
|
|
||||||
testImplementation 'org.robolectric:robolectric:4.8.1'
|
testImplementation 'org.robolectric:robolectric:4.8.2'
|
||||||
testImplementation "androidx.test:runner:1.4.0"
|
testImplementation "androidx.test:runner:1.4.0"
|
||||||
testImplementation "androidx.test.ext:junit:1.1.3"
|
testImplementation "androidx.test.ext:junit:1.1.3"
|
||||||
testImplementation "androidx.test:core:1.4.0"
|
testImplementation "androidx.test:core:1.4.0"
|
||||||
|
|
|
@ -2,11 +2,12 @@ package io.github.wulkanowy.data.db.dao
|
||||||
|
|
||||||
import androidx.room.Delete
|
import androidx.room.Delete
|
||||||
import androidx.room.Insert
|
import androidx.room.Insert
|
||||||
|
import androidx.room.OnConflictStrategy
|
||||||
import androidx.room.Update
|
import androidx.room.Update
|
||||||
|
|
||||||
interface BaseDao<T> {
|
interface BaseDao<T> {
|
||||||
|
|
||||||
@Insert
|
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||||
suspend fun insertAll(items: List<T>): List<Long>
|
suspend fun insertAll(items: List<T>): List<Long>
|
||||||
|
|
||||||
@Update
|
@Update
|
||||||
|
|
|
@ -11,7 +11,4 @@ interface MailboxDao : BaseDao<Mailbox> {
|
||||||
|
|
||||||
@Query("SELECT * FROM Mailboxes WHERE userLoginId = :userLoginId ")
|
@Query("SELECT * FROM Mailboxes WHERE userLoginId = :userLoginId ")
|
||||||
suspend fun loadAll(userLoginId: Int): List<Mailbox>
|
suspend fun loadAll(userLoginId: Int): List<Mailbox>
|
||||||
|
|
||||||
@Query("SELECT * FROM Mailboxes WHERE userLoginId = :userLoginId AND studentName = :studentName ")
|
|
||||||
suspend fun load(userLoginId: Int, studentName: String): Mailbox?
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,17 +32,52 @@ class MailboxRepository @Inject constructor(
|
||||||
|
|
||||||
suspend fun getMailbox(student: Student): Mailbox {
|
suspend fun getMailbox(student: Student): Mailbox {
|
||||||
val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, student))
|
val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, student))
|
||||||
val mailbox = mailboxDao.load(student.userLoginId, student.studentName)
|
val mailboxes = mailboxDao.loadAll(student.userLoginId)
|
||||||
|
val mailbox = mailboxes.filterByStudent(student)
|
||||||
|
|
||||||
return if (isExpired || mailbox == null) {
|
return if (isExpired || mailbox == null) {
|
||||||
refreshMailboxes(student)
|
refreshMailboxes(student)
|
||||||
val newMailbox = mailboxDao.load(student.userLoginId, student.studentName)
|
val newMailbox = mailboxDao.loadAll(student.userLoginId).filterByStudent(student)
|
||||||
|
|
||||||
requireNotNull(newMailbox) {
|
requireNotNull(newMailbox) {
|
||||||
"Mailbox for ${student.userName} - ${student.studentName} not found!"
|
"Mailbox for ${student.userName} - ${student.studentName} not found! Saved mailboxes: $mailboxes"
|
||||||
}
|
}
|
||||||
|
|
||||||
newMailbox
|
newMailbox
|
||||||
} else mailbox
|
} else mailbox
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun List<Mailbox>.filterByStudent(student: Student): Mailbox? {
|
||||||
|
val normalizedStudentName = student.studentName.normalizeStudentName()
|
||||||
|
|
||||||
|
return find {
|
||||||
|
it.studentName.normalizeStudentName() == normalizedStudentName
|
||||||
|
} ?: singleOrNull {
|
||||||
|
it.studentName.getFirstAndLastPart() == normalizedStudentName.getFirstAndLastPart()
|
||||||
|
} ?: singleOrNull {
|
||||||
|
it.studentName.getUnauthorizedVersion() == normalizedStudentName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun String.normalizeStudentName(): String {
|
||||||
|
return trim().split(" ").joinToString(" ") { part ->
|
||||||
|
part.lowercase().replaceFirstChar { it.uppercase() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun String.getFirstAndLastPart(): String {
|
||||||
|
val parts = normalizeStudentName().split(" ")
|
||||||
|
|
||||||
|
val endParts = parts.filterIndexed { i, _ ->
|
||||||
|
i == 0 || parts.size == i - 1
|
||||||
|
}
|
||||||
|
return endParts.joinToString(" ")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun String.getUnauthorizedVersion(): String {
|
||||||
|
return normalizeStudentName().split(" ")
|
||||||
|
.joinToString(" ") {
|
||||||
|
it.first() + "*".repeat(it.length - 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,10 @@ class MessageRepository @Inject constructor(
|
||||||
},
|
},
|
||||||
query = { messagesDb.loadAll(mailbox.globalKey, folder.id) },
|
query = { messagesDb.loadAll(mailbox.globalKey, folder.id) },
|
||||||
fetch = {
|
fetch = {
|
||||||
sdk.init(student).getMessages(Folder.valueOf(folder.name)).mapToEntities(mailbox)
|
sdk.init(student).getMessages(
|
||||||
|
folder = Folder.valueOf(folder.name),
|
||||||
|
mailboxKey = mailbox.globalKey,
|
||||||
|
).mapToEntities(mailbox)
|
||||||
},
|
},
|
||||||
saveFetchResult = { old, new ->
|
saveFetchResult = { old, new ->
|
||||||
messagesDb.deleteAll(old uniqueSubtract new)
|
messagesDb.deleteAll(old uniqueSubtract new)
|
||||||
|
@ -89,7 +92,7 @@ class MessageRepository @Inject constructor(
|
||||||
},
|
},
|
||||||
query = { messagesDb.loadMessageWithAttachment(message.messageGlobalKey) },
|
query = { messagesDb.loadMessageWithAttachment(message.messageGlobalKey) },
|
||||||
fetch = {
|
fetch = {
|
||||||
sdk.init(student).getMessageDetails(it!!.message.messageGlobalKey)
|
sdk.init(student).getMessageDetails(it!!.message.messageGlobalKey, markAsRead)
|
||||||
},
|
},
|
||||||
saveFetchResult = { old, new ->
|
saveFetchResult = { old, new ->
|
||||||
checkNotNull(old) { "Fetched message no longer exist!" }
|
checkNotNull(old) { "Fetched message no longer exist!" }
|
||||||
|
@ -98,7 +101,7 @@ class MessageRepository @Inject constructor(
|
||||||
id = message.id
|
id = message.id
|
||||||
unread = !markAsRead
|
unread = !markAsRead
|
||||||
sender = new.sender
|
sender = new.sender
|
||||||
recipients = new.recipients.firstOrNull() ?: "Wielu adresoatów"
|
recipients = new.recipients.singleOrNull() ?: "Wielu adresatów"
|
||||||
content = content.ifBlank { new.content }
|
content = content.ifBlank { new.content }
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
@ -167,10 +170,10 @@ class MessageRepository @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
var draftMessage: MessageDraft?
|
var draftMessage: MessageDraft?
|
||||||
get() = sharedPrefProvider.getString(context.getString(R.string.pref_key_message_send_draft))
|
get() = sharedPrefProvider.getString(context.getString(R.string.pref_key_message_draft))
|
||||||
?.let { json.decodeFromString(it) }
|
?.let { json.decodeFromString(it) }
|
||||||
set(value) = sharedPrefProvider.putString(
|
set(value) = sharedPrefProvider.putString(
|
||||||
context.getString(R.string.pref_key_message_send_draft),
|
context.getString(R.string.pref_key_message_draft),
|
||||||
value?.let { json.encodeToString(it) }
|
value?.let { json.encodeToString(it) }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@ package io.github.wulkanowy.ui.modules.grade.details
|
||||||
import io.github.wulkanowy.data.*
|
import io.github.wulkanowy.data.*
|
||||||
import io.github.wulkanowy.data.db.entities.Grade
|
import io.github.wulkanowy.data.db.entities.Grade
|
||||||
import io.github.wulkanowy.data.enums.GradeExpandMode
|
import io.github.wulkanowy.data.enums.GradeExpandMode
|
||||||
import io.github.wulkanowy.data.enums.GradeSortingMode
|
|
||||||
import io.github.wulkanowy.data.enums.GradeSortingMode.*
|
import io.github.wulkanowy.data.enums.GradeSortingMode.*
|
||||||
import io.github.wulkanowy.data.repositories.GradeRepository
|
import io.github.wulkanowy.data.repositories.GradeRepository
|
||||||
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
||||||
|
@ -132,16 +131,17 @@ class GradeDetailsPresenter @Inject constructor(
|
||||||
}
|
}
|
||||||
.logResourceStatus("load grade details")
|
.logResourceStatus("load grade details")
|
||||||
.onResourceData {
|
.onResourceData {
|
||||||
|
val gradeItems = createGradeItems(it)
|
||||||
view?.run {
|
view?.run {
|
||||||
enableSwipe(true)
|
enableSwipe(true)
|
||||||
showProgress(false)
|
showProgress(false)
|
||||||
showErrorView(false)
|
showErrorView(false)
|
||||||
showContent(it.isNotEmpty())
|
showContent(gradeItems.isNotEmpty())
|
||||||
showEmpty(it.isEmpty())
|
showEmpty(gradeItems.isEmpty())
|
||||||
updateNewGradesAmount(it)
|
updateNewGradesAmount(it)
|
||||||
updateMarkAsDoneButton()
|
updateMarkAsDoneButton()
|
||||||
updateData(
|
updateData(
|
||||||
data = createGradeItems(it),
|
data = gradeItems,
|
||||||
expandMode = preferencesRepository.gradeExpandMode,
|
expandMode = preferencesRepository.gradeExpandMode,
|
||||||
preferencesRepository.gradeColorTheme
|
preferencesRepository.gradeColorTheme
|
||||||
)
|
)
|
||||||
|
|
|
@ -15,5 +15,8 @@ fun List<Semester>.getCurrentOrLast(): Semester {
|
||||||
// when there is more than one current semester - find one with higher id
|
// when there is more than one current semester - find one with higher id
|
||||||
singleOrNull { semester -> semester.semesterId == maxByOrNull { it.semesterId }?.semesterId }?.let { return it }
|
singleOrNull { semester -> semester.semesterId == maxByOrNull { it.semesterId }?.semesterId }?.let { return it }
|
||||||
|
|
||||||
|
// when there is no active kindergarten semester - get one from last year
|
||||||
|
singleOrNull { semester -> semester.schoolYear == maxByOrNull { it.schoolYear }?.schoolYear }?.let { return it }
|
||||||
|
|
||||||
throw IllegalArgumentException("Duplicated last semester! Semesters: ${joinToString(separator = "\n")}")
|
throw IllegalArgumentException("Duplicated last semester! Semesters: ${joinToString(separator = "\n")}")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
Wersja 1.7.0
|
Wersja 1.7.4
|
||||||
|
|
||||||
- naprawiliśmy logowanie do aplikacji
|
- naprawiliśmy kilka błędów w obsłudze nowego modułu wiadomości
|
||||||
- dodaliśmy wsparcie nowego modułu Wiadomości Plus
|
- naprawiliśmy wyświetlanie napisu "Brak ocen", jesli uczeń nie zdobył w danym semestrze jeszcze żadnych ocen
|
||||||
- dodaliśmy nową możliwość wsparcia naszego projektu przez opcjonalne reklamy
|
|
||||||
- dodaliśmy sortowanie po średniej
|
|
||||||
- naprawiliśmy też kilka usterek wpływających na komfort używania aplikacji
|
|
||||||
|
|
||||||
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases
|
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
android:insetRight="0dp"
|
android:insetRight="0dp"
|
||||||
android:insetBottom="0dp"
|
android:insetBottom="0dp"
|
||||||
android:padding="0dp"
|
android:padding="0dp"
|
||||||
android:text="Privacy Policy"
|
android:text="@string/pref_ads_privacy_policy"
|
||||||
android:textAllCaps="false"
|
android:textAllCaps="false"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
@ -26,9 +26,9 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="17dp"
|
android:layout_marginHorizontal="17dp"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
android:text="I am over 18 years old"
|
android:text="@string/pref_ads_over_18_years_old"
|
||||||
android:textColor="?android:textColorSecondary"
|
android:textColor="?android:textColorSecondary"
|
||||||
android:textSize="14dp"
|
android:textSize="14sp"
|
||||||
app:layout_constraintTop_toBottomOf="@id/ads_consent_privacy" />
|
app:layout_constraintTop_toBottomOf="@id/ads_consent_privacy" />
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
|
@ -42,7 +42,7 @@
|
||||||
android:insetTop="0dp"
|
android:insetTop="0dp"
|
||||||
android:insetRight="0dp"
|
android:insetRight="0dp"
|
||||||
android:insetBottom="0dp"
|
android:insetBottom="0dp"
|
||||||
android:text="Yes, personalized ads"
|
android:text="@string/pref_ads_option_personalized"
|
||||||
app:layout_constraintTop_toBottomOf="@id/ads_consent_over" />
|
app:layout_constraintTop_toBottomOf="@id/ads_consent_over" />
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
|
@ -56,7 +56,7 @@
|
||||||
android:insetTop="0dp"
|
android:insetTop="0dp"
|
||||||
android:insetRight="0dp"
|
android:insetRight="0dp"
|
||||||
android:insetBottom="0dp"
|
android:insetBottom="0dp"
|
||||||
android:text="Yes, non-personalized ads"
|
android:text="@string/pref_ads_option_non_personalized"
|
||||||
app:layout_constraintBottom_toTopOf="@id/ads_consent_cancel"
|
app:layout_constraintBottom_toTopOf="@id/ads_consent_cancel"
|
||||||
app:layout_constraintTop_toBottomOf="@id/ads_consent_personalised"
|
app:layout_constraintTop_toBottomOf="@id/ads_consent_personalised"
|
||||||
app:layout_constraintVertical_bias="0" />
|
app:layout_constraintVertical_bias="0" />
|
||||||
|
@ -73,7 +73,7 @@
|
||||||
android:insetTop="0dp"
|
android:insetTop="0dp"
|
||||||
android:insetRight="0dp"
|
android:insetRight="0dp"
|
||||||
android:insetBottom="0dp"
|
android:insetBottom="0dp"
|
||||||
android:text="Cancel"
|
android:text="@android:string/cancel"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintVertical_bias="0" />
|
app:layout_constraintVertical_bias="0" />
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
|
@ -720,6 +720,10 @@
|
||||||
<string name="pref_other_fill_message_content">Odpovědět s historií zpráv</string>
|
<string name="pref_other_fill_message_content">Odpovědět s historií zpráv</string>
|
||||||
<string name="pref_other_optional_arithmetic_average">Vypočítat aritmetický průměr, pokud žádná známka nemá váhu</string>
|
<string name="pref_other_optional_arithmetic_average">Vypočítat aritmetický průměr, pokud žádná známka nemá váhu</string>
|
||||||
<string name="pref_ads_support_category_name">Podpora</string>
|
<string name="pref_ads_support_category_name">Podpora</string>
|
||||||
|
<string name="pref_ads_privacy_policy">Ochrana osobních údajů</string>
|
||||||
|
<string name="pref_ads_agreements">Souhlasy</string>
|
||||||
|
<string name="pref_ads_consent">Souhlas se zpracováním údajů souvisejících s reklamami</string>
|
||||||
|
<string name="pref_ads_show_in_app">Zobrazit reklamy v aplikaci</string>
|
||||||
<string name="pref_ads_support">Podívejte se na jednu reklamu pro podporu projektu</string>
|
<string name="pref_ads_support">Podívejte se na jednu reklamu pro podporu projektu</string>
|
||||||
<string name="pref_ads_privacy_title">Souhlas se zpracováním dat</string>
|
<string name="pref_ads_privacy_title">Souhlas se zpracováním dat</string>
|
||||||
<string name="pref_ads_privacy_description">Jestli chcete sledovat reklamu, musíte souhlasit s podmínkami zpracování údajů v našich Zásadách Ochrany Osobních Údajů</string>
|
<string name="pref_ads_privacy_description">Jestli chcete sledovat reklamu, musíte souhlasit s podmínkami zpracování údajů v našich Zásadách Ochrany Osobních Údajů</string>
|
||||||
|
@ -731,6 +735,9 @@
|
||||||
<string name="pref_ads_consent_description">Volbu můžete kdykoliv změnit v nastavení aplikace. Můžeme použít Vaše data k zobrazení reklam šitých pro vás nebo pomocí méně vašich dat zobrazovat nepřizpůsobené reklamy. Podrobnosti naleznete v našich Zásadách ochrany osobních údajů</string>
|
<string name="pref_ads_consent_description">Volbu můžete kdykoliv změnit v nastavení aplikace. Můžeme použít Vaše data k zobrazení reklam šitých pro vás nebo pomocí méně vašich dat zobrazovat nepřizpůsobené reklamy. Podrobnosti naleznete v našich Zásadách ochrany osobních údajů</string>
|
||||||
<string name="pref_ads_summary_personalized">Přizpůsobené reklamy</string>
|
<string name="pref_ads_summary_personalized">Přizpůsobené reklamy</string>
|
||||||
<string name="pref_ads_summary_non_personalized">Nepřizpůsobené reklamy</string>
|
<string name="pref_ads_summary_non_personalized">Nepřizpůsobené reklamy</string>
|
||||||
|
<string name="pref_ads_over_18_years_old">Mám ukončené 18 let</string>
|
||||||
|
<string name="pref_ads_option_personalized">Ano, přizpůsobené reklamy</string>
|
||||||
|
<string name="pref_ads_option_non_personalized">Ano, nepřizpůsobené reklamy</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">Oznámení</string>
|
<string name="pref_settings_notifications_title">Oznámení</string>
|
||||||
|
|
|
@ -632,6 +632,10 @@
|
||||||
<string name="pref_other_fill_message_content">Antwort mit Nachrichtenhistorie</string>
|
<string name="pref_other_fill_message_content">Antwort mit Nachrichtenhistorie</string>
|
||||||
<string name="pref_other_optional_arithmetic_average">Arithmetisches Mittel anzeigen, wenn keine Gewichte angegeben sind</string>
|
<string name="pref_other_optional_arithmetic_average">Arithmetisches Mittel anzeigen, wenn keine Gewichte angegeben sind</string>
|
||||||
<string name="pref_ads_support_category_name">Unterstützung</string>
|
<string name="pref_ads_support_category_name">Unterstützung</string>
|
||||||
|
<string name="pref_ads_privacy_policy">Privacy Policy</string>
|
||||||
|
<string name="pref_ads_agreements">Agreements</string>
|
||||||
|
<string name="pref_ads_consent">Consent to processing of data related to ads</string>
|
||||||
|
<string name="pref_ads_show_in_app">Show ads in app</string>
|
||||||
<string name="pref_ads_support">Einzelanzeige ansehen, um Projekt zu unterstützen</string>
|
<string name="pref_ads_support">Einzelanzeige ansehen, um Projekt zu unterstützen</string>
|
||||||
<string name="pref_ads_privacy_title">Einwilligung in die Datenverarbeitung</string>
|
<string name="pref_ads_privacy_title">Einwilligung in die Datenverarbeitung</string>
|
||||||
<string name="pref_ads_privacy_description">Um eine Anzeige zu sehen, müssen Sie mit den Datenverarbeitungsbedingungen unserer Datenschutzerklärung einverstanden sein</string>
|
<string name="pref_ads_privacy_description">Um eine Anzeige zu sehen, müssen Sie mit den Datenverarbeitungsbedingungen unserer Datenschutzerklärung einverstanden sein</string>
|
||||||
|
@ -643,6 +647,9 @@
|
||||||
<string name="pref_ads_consent_description">Sie können Ihre Wahl jederzeit in den App-Einstellungen ändern. Wir verwenden Ihre Daten, um auf Sie zugeschnittene Anzeigen anzuzeigen oder unter Verwendung weniger Ihrer Daten nicht personalisierte Werbung anzuzeigen. Bitte lesen Sie unsere Datenschutzerklärung für Details</string>
|
<string name="pref_ads_consent_description">Sie können Ihre Wahl jederzeit in den App-Einstellungen ändern. Wir verwenden Ihre Daten, um auf Sie zugeschnittene Anzeigen anzuzeigen oder unter Verwendung weniger Ihrer Daten nicht personalisierte Werbung anzuzeigen. Bitte lesen Sie unsere Datenschutzerklärung für Details</string>
|
||||||
<string name="pref_ads_summary_personalized">Personalisierte Werbung</string>
|
<string name="pref_ads_summary_personalized">Personalisierte Werbung</string>
|
||||||
<string name="pref_ads_summary_non_personalized">keine personalisierte Werbung</string>
|
<string name="pref_ads_summary_non_personalized">keine personalisierte Werbung</string>
|
||||||
|
<string name="pref_ads_over_18_years_old">I am over 18 years old</string>
|
||||||
|
<string name="pref_ads_option_personalized">Yes, personalized ads</string>
|
||||||
|
<string name="pref_ads_option_non_personalized">Yes, non-personalized 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>
|
||||||
|
|
|
@ -720,6 +720,10 @@
|
||||||
<string name="pref_other_fill_message_content">Odpowiadaj z historią wiadomości</string>
|
<string name="pref_other_fill_message_content">Odpowiadaj z historią wiadomości</string>
|
||||||
<string name="pref_other_optional_arithmetic_average">Licz średnią arytmetyczną, gdy żadna ocena nie ma wagi</string>
|
<string name="pref_other_optional_arithmetic_average">Licz średnią arytmetyczną, gdy żadna ocena nie ma wagi</string>
|
||||||
<string name="pref_ads_support_category_name">Wsparcie</string>
|
<string name="pref_ads_support_category_name">Wsparcie</string>
|
||||||
|
<string name="pref_ads_privacy_policy">Polityka prywatności</string>
|
||||||
|
<string name="pref_ads_agreements">Zgody</string>
|
||||||
|
<string name="pref_ads_consent">Zgoda na przetwarzanie danych związanych z reklamami</string>
|
||||||
|
<string name="pref_ads_show_in_app">Pokazuj reklamy w aplikacji</string>
|
||||||
<string name="pref_ads_support">Obejrzyj pojedynczą reklamę, aby wesprzeć projekt</string>
|
<string name="pref_ads_support">Obejrzyj pojedynczą reklamę, aby wesprzeć projekt</string>
|
||||||
<string name="pref_ads_privacy_title">Zgoda na przetwarzanie danych</string>
|
<string name="pref_ads_privacy_title">Zgoda na przetwarzanie danych</string>
|
||||||
<string name="pref_ads_privacy_description">Aby obejrzeć reklamę, musisz zaakceptować warunki przetwarzania danych zawarte w naszej Polityce Prywatności</string>
|
<string name="pref_ads_privacy_description">Aby obejrzeć reklamę, musisz zaakceptować warunki przetwarzania danych zawarte w naszej Polityce Prywatności</string>
|
||||||
|
@ -731,6 +735,9 @@
|
||||||
<string name="pref_ads_consent_description">Możesz zmienić swój wybór w dowolnym momencie w ustawieniach aplikacji. Możemy wykorzystać Twoje dane do wyświetlania reklam dostosowanych do Ciebie lub, przy użyciu mniejszej ilości danych, wyświetlić niepersonalizowane reklamy. Zobacz naszą Politykę Prywatności, aby uzyskać więcej informacji</string>
|
<string name="pref_ads_consent_description">Możesz zmienić swój wybór w dowolnym momencie w ustawieniach aplikacji. Możemy wykorzystać Twoje dane do wyświetlania reklam dostosowanych do Ciebie lub, przy użyciu mniejszej ilości danych, wyświetlić niepersonalizowane reklamy. Zobacz naszą Politykę Prywatności, aby uzyskać więcej informacji</string>
|
||||||
<string name="pref_ads_summary_personalized">Spersonalizowane reklamy</string>
|
<string name="pref_ads_summary_personalized">Spersonalizowane reklamy</string>
|
||||||
<string name="pref_ads_summary_non_personalized">Niespersonalizowane reklamy</string>
|
<string name="pref_ads_summary_non_personalized">Niespersonalizowane reklamy</string>
|
||||||
|
<string name="pref_ads_over_18_years_old">Mam ukończone 18 lat</string>
|
||||||
|
<string name="pref_ads_option_personalized">Tak, spersonalizowane reklamy</string>
|
||||||
|
<string name="pref_ads_option_non_personalized">Tak, niespersonalizowane reklamy</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>
|
||||||
|
|
|
@ -720,6 +720,10 @@
|
||||||
<string name="pref_other_fill_message_content">Отвечать с историей сообщений</string>
|
<string name="pref_other_fill_message_content">Отвечать с историей сообщений</string>
|
||||||
<string name="pref_other_optional_arithmetic_average">Показывать среднее арифметическое при отсутствии стоимости</string>
|
<string name="pref_other_optional_arithmetic_average">Показывать среднее арифметическое при отсутствии стоимости</string>
|
||||||
<string name="pref_ads_support_category_name">Поддержка</string>
|
<string name="pref_ads_support_category_name">Поддержка</string>
|
||||||
|
<string name="pref_ads_privacy_policy">Privacy Policy</string>
|
||||||
|
<string name="pref_ads_agreements">Agreements</string>
|
||||||
|
<string name="pref_ads_consent">Consent to processing of data related to ads</string>
|
||||||
|
<string name="pref_ads_show_in_app">Show ads in app</string>
|
||||||
<string name="pref_ads_support">Посмотреть рекламу для поддержки проекта</string>
|
<string name="pref_ads_support">Посмотреть рекламу для поддержки проекта</string>
|
||||||
<string name="pref_ads_privacy_title">Согласие на обработку данных</string>
|
<string name="pref_ads_privacy_title">Согласие на обработку данных</string>
|
||||||
<string name="pref_ads_privacy_description">Для просмотра рекламы вы должны согласиться с условиями обработки данных нашей Политики конфиденциальности</string>
|
<string name="pref_ads_privacy_description">Для просмотра рекламы вы должны согласиться с условиями обработки данных нашей Политики конфиденциальности</string>
|
||||||
|
@ -731,6 +735,9 @@
|
||||||
<string name="pref_ads_consent_description">You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details</string>
|
<string name="pref_ads_consent_description">You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details</string>
|
||||||
<string name="pref_ads_summary_personalized">Personalized ads</string>
|
<string name="pref_ads_summary_personalized">Personalized ads</string>
|
||||||
<string name="pref_ads_summary_non_personalized">Non-personalized ads</string>
|
<string name="pref_ads_summary_non_personalized">Non-personalized ads</string>
|
||||||
|
<string name="pref_ads_over_18_years_old">I am over 18 years old</string>
|
||||||
|
<string name="pref_ads_option_personalized">Yes, personalized ads</string>
|
||||||
|
<string name="pref_ads_option_non_personalized">Yes, non-personalized 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>
|
||||||
|
|
|
@ -720,6 +720,10 @@
|
||||||
<string name="pref_other_fill_message_content">Odpovedať s históriou správ</string>
|
<string name="pref_other_fill_message_content">Odpovedať s históriou správ</string>
|
||||||
<string name="pref_other_optional_arithmetic_average">Vypočítať aritmetický priemer, ak žiadna známka nemá váhu</string>
|
<string name="pref_other_optional_arithmetic_average">Vypočítať aritmetický priemer, ak žiadna známka nemá váhu</string>
|
||||||
<string name="pref_ads_support_category_name">Podpora</string>
|
<string name="pref_ads_support_category_name">Podpora</string>
|
||||||
|
<string name="pref_ads_privacy_policy">Ochrana osobných údajov</string>
|
||||||
|
<string name="pref_ads_agreements">Súhlasy</string>
|
||||||
|
<string name="pref_ads_consent">Súhlas so spracovaním údajov súvisiacich s reklamami</string>
|
||||||
|
<string name="pref_ads_show_in_app">Zobraziť reklamy v aplikácii</string>
|
||||||
<string name="pref_ads_support">Pozrite sa na jednu reklamu pre podporu projektu</string>
|
<string name="pref_ads_support">Pozrite sa na jednu reklamu pre podporu projektu</string>
|
||||||
<string name="pref_ads_privacy_title">Súhlas so spracovaním dát</string>
|
<string name="pref_ads_privacy_title">Súhlas so spracovaním dát</string>
|
||||||
<string name="pref_ads_privacy_description">Ak chcete sledovať reklamu, musíte súhlasiť s podmienkami spracovania údajov v našich Zásadách Ochrany Osobných Údajov</string>
|
<string name="pref_ads_privacy_description">Ak chcete sledovať reklamu, musíte súhlasiť s podmienkami spracovania údajov v našich Zásadách Ochrany Osobných Údajov</string>
|
||||||
|
@ -731,6 +735,9 @@
|
||||||
<string name="pref_ads_consent_description">Voľbu môžete kedykoľvek zmeniť v nastavení aplikácie. Môžeme použiť vaše údaje na zobrazenie reklám šitých pre vás alebo pomocou menej vašich dát zobrazovať neprispôsobené reklamy. Podrobnosti nájdete v našich Zásadách ochrany osobných údajov</string>
|
<string name="pref_ads_consent_description">Voľbu môžete kedykoľvek zmeniť v nastavení aplikácie. Môžeme použiť vaše údaje na zobrazenie reklám šitých pre vás alebo pomocou menej vašich dát zobrazovať neprispôsobené reklamy. Podrobnosti nájdete v našich Zásadách ochrany osobných údajov</string>
|
||||||
<string name="pref_ads_summary_personalized">Prispôsobené reklamy</string>
|
<string name="pref_ads_summary_personalized">Prispôsobené reklamy</string>
|
||||||
<string name="pref_ads_summary_non_personalized">Neprispôsobené reklamy</string>
|
<string name="pref_ads_summary_non_personalized">Neprispôsobené reklamy</string>
|
||||||
|
<string name="pref_ads_over_18_years_old">Mám ukončené 18 rokov</string>
|
||||||
|
<string name="pref_ads_option_personalized">Áno, prispôsobené reklamy</string>
|
||||||
|
<string name="pref_ads_option_non_personalized">Áno, neprispôsobené reklamy</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">Oznámenia</string>
|
<string name="pref_settings_notifications_title">Oznámenia</string>
|
||||||
|
|
|
@ -720,6 +720,10 @@
|
||||||
<string name="pref_other_fill_message_content">Відповісти з історією повідомлень</string>
|
<string name="pref_other_fill_message_content">Відповісти з історією повідомлень</string>
|
||||||
<string name="pref_other_optional_arithmetic_average">Вилічити середню аритметичну, якщо оцінка немає вартості</string>
|
<string name="pref_other_optional_arithmetic_average">Вилічити середню аритметичну, якщо оцінка немає вартості</string>
|
||||||
<string name="pref_ads_support_category_name">Підтримка</string>
|
<string name="pref_ads_support_category_name">Підтримка</string>
|
||||||
|
<string name="pref_ads_privacy_policy">Privacy Policy</string>
|
||||||
|
<string name="pref_ads_agreements">Agreements</string>
|
||||||
|
<string name="pref_ads_consent">Consent to processing of data related to ads</string>
|
||||||
|
<string name="pref_ads_show_in_app">Show ads in app</string>
|
||||||
<string name="pref_ads_support">Подивіться одну рекламу для підтримки проєкту</string>
|
<string name="pref_ads_support">Подивіться одну рекламу для підтримки проєкту</string>
|
||||||
<string name="pref_ads_privacy_title">Згода в обробці даних</string>
|
<string name="pref_ads_privacy_title">Згода в обробці даних</string>
|
||||||
<string name="pref_ads_privacy_description">Щоб переглянути рекламу, ви повинні погодитися з умовами обробки даних нашої Політики конфіденційності</string>
|
<string name="pref_ads_privacy_description">Щоб переглянути рекламу, ви повинні погодитися з умовами обробки даних нашої Політики конфіденційності</string>
|
||||||
|
@ -731,6 +735,9 @@
|
||||||
<string name="pref_ads_consent_description">You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details</string>
|
<string name="pref_ads_consent_description">You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details</string>
|
||||||
<string name="pref_ads_summary_personalized">Personalized ads</string>
|
<string name="pref_ads_summary_personalized">Personalized ads</string>
|
||||||
<string name="pref_ads_summary_non_personalized">Non-personalized ads</string>
|
<string name="pref_ads_summary_non_personalized">Non-personalized ads</string>
|
||||||
|
<string name="pref_ads_over_18_years_old">I am over 18 years old</string>
|
||||||
|
<string name="pref_ads_option_personalized">Yes, personalized ads</string>
|
||||||
|
<string name="pref_ads_option_non_personalized">Yes, non-personalized 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>
|
||||||
|
|
|
@ -31,8 +31,7 @@
|
||||||
<string name="pref_key_homework_fullscreen">homework_fullscreen</string>
|
<string name="pref_key_homework_fullscreen">homework_fullscreen</string>
|
||||||
<string name="pref_key_subjects_without_grades">subjects_without_grades</string>
|
<string name="pref_key_subjects_without_grades">subjects_without_grades</string>
|
||||||
<string name="pref_key_optional_arithmetic_average">optional_arithmetic_average</string>
|
<string name="pref_key_optional_arithmetic_average">optional_arithmetic_average</string>
|
||||||
<string name="pref_key_message_send_is_draft">message_send_is_draft</string>
|
<string name="pref_key_message_draft">message_draft</string>
|
||||||
<string name="pref_key_message_send_draft">message_send_recipients</string>
|
|
||||||
<string name="pref_key_last_sync_date">last_sync_date</string>
|
<string name="pref_key_last_sync_date">last_sync_date</string>
|
||||||
<string name="pref_key_notifications_piggyback">notifications_piggyback</string>
|
<string name="pref_key_notifications_piggyback">notifications_piggyback</string>
|
||||||
<string name="pref_key_notifications_piggyback_cancel_original">notifications_piggyback_cancel_original</string>
|
<string name="pref_key_notifications_piggyback_cancel_original">notifications_piggyback_cancel_original</string>
|
||||||
|
|
|
@ -714,6 +714,10 @@
|
||||||
<string name="pref_other_optional_arithmetic_average">Show arithmetic average when no weights provided</string>
|
<string name="pref_other_optional_arithmetic_average">Show arithmetic average when no weights provided</string>
|
||||||
|
|
||||||
<string name="pref_ads_support_category_name">Support</string>
|
<string name="pref_ads_support_category_name">Support</string>
|
||||||
|
<string name="pref_ads_privacy_policy">Privacy Policy</string>
|
||||||
|
<string name="pref_ads_agreements">Agreements</string>
|
||||||
|
<string name="pref_ads_consent">Consent to processing of data related to ads</string>
|
||||||
|
<string name="pref_ads_show_in_app">Show ads in app</string>
|
||||||
<string name="pref_ads_support">Watch single ad to support project</string>
|
<string name="pref_ads_support">Watch single ad to support project</string>
|
||||||
<string name="pref_ads_privacy_title">Consent to data processing</string>
|
<string name="pref_ads_privacy_title">Consent to data processing</string>
|
||||||
<string name="pref_ads_privacy_description">To view an advertisement you must agree to the data processing terms of our Privacy Policy</string>
|
<string name="pref_ads_privacy_description">To view an advertisement you must agree to the data processing terms of our Privacy Policy</string>
|
||||||
|
@ -725,6 +729,9 @@
|
||||||
<string name="pref_ads_consent_description">You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details</string>
|
<string name="pref_ads_consent_description">You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details</string>
|
||||||
<string name="pref_ads_summary_personalized">Personalized ads</string>
|
<string name="pref_ads_summary_personalized">Personalized ads</string>
|
||||||
<string name="pref_ads_summary_non_personalized">Non-personalized ads</string>
|
<string name="pref_ads_summary_non_personalized">Non-personalized ads</string>
|
||||||
|
<string name="pref_ads_over_18_years_old">I am over 18 years old</string>
|
||||||
|
<string name="pref_ads_option_personalized">Yes, personalized ads</string>
|
||||||
|
<string name="pref_ads_option_non_personalized">Yes, non-personalized 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>
|
||||||
|
|
|
@ -2,18 +2,18 @@
|
||||||
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
|
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
app:title="Agreements">
|
app:title="@string/pref_ads_agreements">
|
||||||
<Preference
|
<Preference
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
app:key="@string/pref_key_ads_privacy_policy"
|
app:key="@string/pref_key_ads_privacy_policy"
|
||||||
app:singleLineTitle="false"
|
app:singleLineTitle="false"
|
||||||
app:title="Privacy Policy" />
|
app:title="@string/pref_ads_privacy_policy" />
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
app:defaultValue="@bool/pref_default_ads_consent_data_processing"
|
app:defaultValue="@bool/pref_default_ads_consent_data_processing"
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
app:key="@string/pref_key_ads_consent_data_processing"
|
app:key="@string/pref_key_ads_consent_data_processing"
|
||||||
app:singleLineTitle="false"
|
app:singleLineTitle="false"
|
||||||
app:title="Consent to processing of data related to ads" />
|
app:title="@string/pref_ads_consent" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
app:key="@string/pref_key_ads_enabled"
|
app:key="@string/pref_key_ads_enabled"
|
||||||
app:singleLineTitle="false"
|
app:singleLineTitle="false"
|
||||||
app:title="Show ads in app" />
|
app:title="@string/pref_ads_show_in_app" />
|
||||||
<Preference
|
<Preference
|
||||||
app:dependency="@string/pref_key_ads_consent_data_processing"
|
app:dependency="@string/pref_key_ads_consent_data_processing"
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
|
|
|
@ -0,0 +1,188 @@
|
||||||
|
package io.github.wulkanowy.data.repositories
|
||||||
|
|
||||||
|
import io.github.wulkanowy.data.db.dao.MailboxDao
|
||||||
|
import io.github.wulkanowy.data.db.entities.Mailbox
|
||||||
|
import io.github.wulkanowy.data.db.entities.MailboxType
|
||||||
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
|
import io.github.wulkanowy.sdk.Sdk
|
||||||
|
import io.github.wulkanowy.utils.AutoRefreshHelper
|
||||||
|
import io.mockk.MockKAnnotations
|
||||||
|
import io.mockk.Runs
|
||||||
|
import io.mockk.coEvery
|
||||||
|
import io.mockk.impl.annotations.MockK
|
||||||
|
import io.mockk.impl.annotations.SpyK
|
||||||
|
import io.mockk.just
|
||||||
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||||
|
import kotlinx.coroutines.test.runTest
|
||||||
|
import org.junit.Assert.assertEquals
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import java.time.Instant
|
||||||
|
|
||||||
|
@OptIn(ExperimentalCoroutinesApi::class)
|
||||||
|
class MailboxRepositoryTest {
|
||||||
|
|
||||||
|
@SpyK
|
||||||
|
private var sdk = Sdk()
|
||||||
|
|
||||||
|
@MockK
|
||||||
|
private lateinit var mailboxDao: MailboxDao
|
||||||
|
|
||||||
|
@MockK
|
||||||
|
private lateinit var refreshHelper: AutoRefreshHelper
|
||||||
|
|
||||||
|
private lateinit var systemUnderTest: MailboxRepository
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun setUp() {
|
||||||
|
MockKAnnotations.init(this)
|
||||||
|
|
||||||
|
coEvery { refreshHelper.shouldBeRefreshed(any()) } returns false
|
||||||
|
coEvery { refreshHelper.updateLastRefreshTimestamp(any()) } just Runs
|
||||||
|
coEvery { mailboxDao.deleteAll(any()) } just Runs
|
||||||
|
coEvery { mailboxDao.insertAll(any()) } returns emptyList()
|
||||||
|
coEvery { mailboxDao.loadAll(any()) } returns emptyList()
|
||||||
|
coEvery { sdk.getMailboxes() } returns emptyList()
|
||||||
|
|
||||||
|
systemUnderTest = MailboxRepository(
|
||||||
|
mailboxDao = mailboxDao,
|
||||||
|
sdk = sdk,
|
||||||
|
refreshHelper = refreshHelper,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException::class)
|
||||||
|
fun `get mailbox that doesn't exist`() = runTest {
|
||||||
|
val student = getStudentEntity(
|
||||||
|
userName = "Stanisław Kowalski",
|
||||||
|
studentName = "Jan Kowalski",
|
||||||
|
)
|
||||||
|
coEvery { sdk.getMailboxes() } returns emptyList()
|
||||||
|
|
||||||
|
systemUnderTest.getMailbox(student)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `get mailbox for user with additional spaces`() = runTest {
|
||||||
|
val student = getStudentEntity(
|
||||||
|
userName = " Stanisław Kowalski ",
|
||||||
|
studentName = " Jan Kowalski ",
|
||||||
|
)
|
||||||
|
val expectedMailbox = getMailboxEntity("Jan Kowalski ")
|
||||||
|
coEvery { mailboxDao.loadAll(any()) } returns listOf(
|
||||||
|
expectedMailbox,
|
||||||
|
)
|
||||||
|
|
||||||
|
val selectedMailbox = systemUnderTest.getMailbox(student)
|
||||||
|
assertEquals(expectedMailbox, selectedMailbox)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `get mailbox for unique non-authorized student`() = runTest {
|
||||||
|
val student = getStudentEntity(
|
||||||
|
userName = "Stanisław Kowalski",
|
||||||
|
studentName = "J** K*******",
|
||||||
|
)
|
||||||
|
val expectedMailbox = getMailboxEntity("Jan Kowalski")
|
||||||
|
coEvery { mailboxDao.loadAll(any()) } returns listOf(
|
||||||
|
expectedMailbox,
|
||||||
|
)
|
||||||
|
|
||||||
|
assertEquals(expectedMailbox, systemUnderTest.getMailbox(student))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException::class)
|
||||||
|
fun `get mailbox for not-unique non-authorized student`() = runTest {
|
||||||
|
val student = getStudentEntity(
|
||||||
|
userName = "Stanisław Kowalski",
|
||||||
|
studentName = "J** K*******",
|
||||||
|
)
|
||||||
|
coEvery { mailboxDao.loadAll(any()) } returns listOf(
|
||||||
|
getMailboxEntity("Jan Kowalski"),
|
||||||
|
getMailboxEntity("Jan Kurowski"),
|
||||||
|
)
|
||||||
|
|
||||||
|
systemUnderTest.getMailbox(student)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `get mailbox for student with uppercase name`() = runTest {
|
||||||
|
val student = getStudentEntity(
|
||||||
|
userName = "Mochoń Julia",
|
||||||
|
studentName = "KLAUDIA MOCHOŃ",
|
||||||
|
)
|
||||||
|
val expectedMailbox = getMailboxEntity("Klaudia Mochoń")
|
||||||
|
coEvery { mailboxDao.loadAll(any()) } returns listOf(
|
||||||
|
expectedMailbox,
|
||||||
|
)
|
||||||
|
|
||||||
|
assertEquals(expectedMailbox, systemUnderTest.getMailbox(student))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `get mailbox for student with second name`() = runTest {
|
||||||
|
val student = getStudentEntity(
|
||||||
|
userName = "Fistaszek Karolina",
|
||||||
|
studentName = "Julia Fistaszek",
|
||||||
|
)
|
||||||
|
val expectedMailbox = getMailboxEntity("Julia Maria Fistaszek")
|
||||||
|
coEvery { mailboxDao.loadAll(any()) } returns listOf(
|
||||||
|
expectedMailbox,
|
||||||
|
)
|
||||||
|
|
||||||
|
assertEquals(expectedMailbox, systemUnderTest.getMailbox(student))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `get mailbox for student with second name and uppercase`() = runTest {
|
||||||
|
val student = getStudentEntity(
|
||||||
|
userName = "BEDNAREK KAMIL",
|
||||||
|
studentName = "ALEKSANDRA BEDNAREK",
|
||||||
|
)
|
||||||
|
val expectedMailbox = getMailboxEntity("Aleksandra Anna Bednarek")
|
||||||
|
coEvery { mailboxDao.loadAll(any()) } returns listOf(
|
||||||
|
expectedMailbox,
|
||||||
|
)
|
||||||
|
|
||||||
|
assertEquals(expectedMailbox, systemUnderTest.getMailbox(student))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getMailboxEntity(
|
||||||
|
studentName: String,
|
||||||
|
) = Mailbox(
|
||||||
|
globalKey = "",
|
||||||
|
fullName = "",
|
||||||
|
userName = "",
|
||||||
|
userLoginId = 123,
|
||||||
|
studentName = studentName,
|
||||||
|
schoolNameShort = "",
|
||||||
|
type = MailboxType.STUDENT,
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun getStudentEntity(
|
||||||
|
studentName: String,
|
||||||
|
userName: String,
|
||||||
|
) = Student(
|
||||||
|
scrapperBaseUrl = "http://fakelog.cf",
|
||||||
|
email = "jan@fakelog.cf",
|
||||||
|
certificateKey = "",
|
||||||
|
classId = 0,
|
||||||
|
className = "",
|
||||||
|
isCurrent = false,
|
||||||
|
isParent = false,
|
||||||
|
loginMode = Sdk.Mode.API.name,
|
||||||
|
loginType = Sdk.ScrapperLoginType.STANDARD.name,
|
||||||
|
mobileBaseUrl = "",
|
||||||
|
password = "",
|
||||||
|
privateKey = "",
|
||||||
|
registrationDate = Instant.now(),
|
||||||
|
schoolName = "",
|
||||||
|
schoolShortName = "test",
|
||||||
|
schoolSymbol = "",
|
||||||
|
studentId = 1,
|
||||||
|
studentName = studentName,
|
||||||
|
symbol = "",
|
||||||
|
userLoginId = 1,
|
||||||
|
userName = userName,
|
||||||
|
)
|
||||||
|
}
|
|
@ -141,7 +141,7 @@ class MessageRepositoryTest {
|
||||||
messageDb.loadMessageWithAttachment("v4")
|
messageDb.loadMessageWithAttachment("v4")
|
||||||
} returnsMany listOf(flowOf(mWa), flowOf(mWaWithContent))
|
} returnsMany listOf(flowOf(mWa), flowOf(mWaWithContent))
|
||||||
coEvery {
|
coEvery {
|
||||||
sdk.getMessageDetails("v4")
|
sdk.getMessageDetails("v4", any())
|
||||||
} returns mockk {
|
} returns mockk {
|
||||||
every { sender } returns ""
|
every { sender } returns ""
|
||||||
every { recipients } returns listOf("")
|
every { recipients } returns listOf("")
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
package io.github.wulkanowy.utils
|
||||||
|
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import io.github.wulkanowy.getSemesterEntity
|
||||||
|
import org.junit.Test
|
||||||
|
import java.time.LocalDate
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class SemesterExtensionKtTest {
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException::class)
|
||||||
|
fun `get current semester when current is doubled`() {
|
||||||
|
val semesters = listOf(
|
||||||
|
getSemesterEntity(1, 1, LocalDate.now(), LocalDate.now()),
|
||||||
|
getSemesterEntity(1, 1, LocalDate.now(), LocalDate.now())
|
||||||
|
)
|
||||||
|
|
||||||
|
semesters.getCurrentOrLast()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = RuntimeException::class)
|
||||||
|
fun `get current semester when there is empty list`() {
|
||||||
|
val semesters = listOf<Semester>()
|
||||||
|
|
||||||
|
semesters.getCurrentOrLast()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `get current kindergarten semester when there is no any current`() {
|
||||||
|
val semesters = listOf(
|
||||||
|
createSemesterEntity(
|
||||||
|
kindergartenDiaryId = 281,
|
||||||
|
schoolYear = 2020,
|
||||||
|
semesterId = 0,
|
||||||
|
start = LocalDate.of(2020, 9, 1),
|
||||||
|
end = LocalDate.of(2021, 8, 31),
|
||||||
|
),
|
||||||
|
createSemesterEntity(
|
||||||
|
kindergartenDiaryId = 342,
|
||||||
|
schoolYear = 2021,
|
||||||
|
semesterId = 0,
|
||||||
|
start = LocalDate.of(2021, 9, 1),
|
||||||
|
end = LocalDate.of(2022, 8, 31),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
val res = semesters.getCurrentOrLast()
|
||||||
|
|
||||||
|
assertEquals(2021, res.schoolYear)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createSemesterEntity(
|
||||||
|
diaryId: Int = 0,
|
||||||
|
kindergartenDiaryId: Int = 0,
|
||||||
|
semesterId: Int = 0,
|
||||||
|
schoolYear: Int = 0,
|
||||||
|
start: LocalDate = LocalDate.now(),
|
||||||
|
end: LocalDate = LocalDate.now().plusMonths(6),
|
||||||
|
) = Semester(
|
||||||
|
studentId = 1,
|
||||||
|
diaryId = diaryId,
|
||||||
|
kindergartenDiaryId = kindergartenDiaryId,
|
||||||
|
semesterId = semesterId,
|
||||||
|
diaryName = "$semesterId",
|
||||||
|
schoolYear = schoolYear,
|
||||||
|
classId = 0,
|
||||||
|
semesterName = semesterId,
|
||||||
|
unitId = 1,
|
||||||
|
start = start,
|
||||||
|
end = end
|
||||||
|
)
|
||||||
|
}
|
Reference in a new issue