Compare commits
59 Commits
Author | SHA1 | Date | |
---|---|---|---|
387ff1cba7 | |||
eef3464d0b | |||
61297a01c7 | |||
762d4b1393 | |||
2e86b67eec | |||
6071b7571b | |||
fcea2218b5 | |||
a4a191700e | |||
3d76d41b55 | |||
0e1c20a952 | |||
5d14ee7f4e | |||
83527d91f3 | |||
9d62410530 | |||
5dffbdadfa | |||
516922d5aa | |||
9098e74065 | |||
2f5577cc54 | |||
3272c38356 | |||
bcd305bef3 | |||
fc5ad16cb7 | |||
c8332a0642 | |||
3212efe21e | |||
693ce8217d | |||
2cdd322ed4 | |||
c04b3e40d2 | |||
d1d665bbdf | |||
d70568c446 | |||
1d8378e136 | |||
4a2bf539f0 | |||
4d085f8266 | |||
fca69e7234 | |||
711de0f77f | |||
58d5196ac9 | |||
26a95ecb99 | |||
1835446468 | |||
4d3b16ec80 | |||
95b4d53fac | |||
0fa197d520 | |||
646b4a149d | |||
afd0c8513a | |||
c4a3da93ca | |||
ff2aa6f195 | |||
1d8d71709f | |||
aabd7345c1 | |||
09d16cf6d8 | |||
81d8f7ea48 | |||
05a804832b | |||
db02f0c1e1 | |||
0a40237809 | |||
017d46e5db | |||
8478b8b7ed | |||
8cc69728aa | |||
c82e6ae95b | |||
50a177d18c | |||
a77b3d4cd7 | |||
aff56a8311 | |||
5238e4d187 | |||
10f9812495 | |||
ab1de323d4 |
4
.github/workflows/deploy-store.yml
vendored
4
.github/workflows/deploy-store.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
|||||||
environment: google-play
|
environment: google-play
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-java@v2
|
- uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: 'zulu'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
@ -49,7 +49,7 @@ jobs:
|
|||||||
environment: app-gallery
|
environment: app-gallery
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-java@v2
|
- uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: 'zulu'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
|
4
.github/workflows/deploy-test.yml
vendored
4
.github/workflows/deploy-test.yml
vendored
@ -19,7 +19,7 @@ jobs:
|
|||||||
environment: app-center
|
environment: app-center
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-java@v2
|
- uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: 'zulu'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
@ -89,7 +89,7 @@ jobs:
|
|||||||
if: github.event_name != 'pull_request_target'
|
if: github.event_name != 'pull_request_target'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-java@v2
|
- uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: 'zulu'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
|
6
.github/workflows/test.yml
vendored
6
.github/workflows/test.yml
vendored
@ -19,7 +19,7 @@ jobs:
|
|||||||
- uses: fkirc/skip-duplicate-actions@master
|
- uses: fkirc/skip-duplicate-actions@master
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: gradle/wrapper-validation-action@v1
|
- uses: gradle/wrapper-validation-action@v1
|
||||||
- uses: actions/setup-java@v2
|
- uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: 'zulu'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
@ -45,7 +45,7 @@ jobs:
|
|||||||
- uses: fkirc/skip-duplicate-actions@master
|
- uses: fkirc/skip-duplicate-actions@master
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: gradle/wrapper-validation-action@v1
|
- uses: gradle/wrapper-validation-action@v1
|
||||||
- uses: actions/setup-java@v2
|
- uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: 'zulu'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
@ -71,7 +71,7 @@ jobs:
|
|||||||
- uses: fkirc/skip-duplicate-actions@master
|
- uses: fkirc/skip-duplicate-actions@master
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: gradle/wrapper-validation-action@v1
|
- uses: gradle/wrapper-validation-action@v1
|
||||||
- uses: actions/setup-java@v2
|
- uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: 'zulu'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
|
@ -20,19 +20,18 @@ apply from: 'hooks.gradle'
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
namespace 'io.github.wulkanowy'
|
namespace 'io.github.wulkanowy'
|
||||||
compileSdk 33
|
compileSdk 34
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "io.github.wulkanowy"
|
applicationId "io.github.wulkanowy"
|
||||||
testApplicationId "io.github.tests.wulkanowy"
|
testApplicationId "io.github.tests.wulkanowy"
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 33
|
targetSdkVersion 34
|
||||||
versionCode 131
|
versionCode 135
|
||||||
versionName "2.1.0"
|
versionName "2.2.3"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
resValue "string", "app_name", "Wulkanowy"
|
resValue "string", "app_name", "Wulkanowy"
|
||||||
|
|
||||||
manifestPlaceholders = [
|
manifestPlaceholders = [
|
||||||
firebase_enabled: project.hasProperty("enableFirebase"),
|
firebase_enabled: project.hasProperty("enableFirebase"),
|
||||||
admob_project_id: ""
|
admob_project_id: ""
|
||||||
@ -69,6 +68,7 @@ android {
|
|||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
signingConfig signingConfigs.release
|
signingConfig signingConfigs.release
|
||||||
buildConfigField "String", "MESSAGES_BASE_URL", "\"https://messages.wulkanowy.net.pl\""
|
buildConfigField "String", "MESSAGES_BASE_URL", "\"https://messages.wulkanowy.net.pl\""
|
||||||
|
buildConfigField "String", "SCHOOLS_BASE_URL", '"https://schools.wulkanowy.net.pl"'
|
||||||
}
|
}
|
||||||
debug {
|
debug {
|
||||||
minifyEnabled false
|
minifyEnabled false
|
||||||
@ -78,6 +78,7 @@ android {
|
|||||||
versionNameSuffix "-dev"
|
versionNameSuffix "-dev"
|
||||||
ext.enableCrashlytics = project.hasProperty("enableFirebase")
|
ext.enableCrashlytics = project.hasProperty("enableFirebase")
|
||||||
buildConfigField "String", "MESSAGES_BASE_URL", "\"https://messages.wulkanowy.net.pl\""
|
buildConfigField "String", "MESSAGES_BASE_URL", "\"https://messages.wulkanowy.net.pl\""
|
||||||
|
buildConfigField "String", "SCHOOLS_BASE_URL", '"https://schools.wulkanowy.net.pl"'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,7 +161,7 @@ play {
|
|||||||
defaultToAppBundles = false
|
defaultToAppBundles = false
|
||||||
track = 'production'
|
track = 'production'
|
||||||
releaseStatus = ReleaseStatus.IN_PROGRESS
|
releaseStatus = ReleaseStatus.IN_PROGRESS
|
||||||
userFraction = 0.25d
|
userFraction = 0.01d
|
||||||
updatePriority = 3
|
updatePriority = 3
|
||||||
enabled.set(false)
|
enabled.set(false)
|
||||||
}
|
}
|
||||||
@ -184,34 +185,34 @@ huaweiPublish {
|
|||||||
ext {
|
ext {
|
||||||
work_manager = "2.8.1"
|
work_manager = "2.8.1"
|
||||||
android_hilt = "1.0.0"
|
android_hilt = "1.0.0"
|
||||||
room = "2.5.2"
|
room = "2.6.0"
|
||||||
chucker = "3.5.2"
|
chucker = "3.5.2"
|
||||||
mockk = "1.13.7"
|
mockk = "1.13.8"
|
||||||
coroutines = "1.7.3"
|
coroutines = "1.7.3"
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'io.github.wulkanowy:sdk:2.1.0'
|
implementation 'io.github.wulkanowy:sdk:2.2.3'
|
||||||
|
|
||||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
|
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
|
||||||
|
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1"
|
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0"
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines"
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines"
|
||||||
|
|
||||||
implementation "androidx.core:core-ktx:1.10.1"
|
implementation 'androidx.core:core-ktx:1.12.0'
|
||||||
implementation 'androidx.core:core-splashscreen:1.0.1'
|
implementation 'androidx.core:core-splashscreen:1.0.1'
|
||||||
implementation "androidx.activity:activity-ktx:1.7.2"
|
implementation "androidx.activity:activity-ktx:1.8.0"
|
||||||
implementation "androidx.appcompat:appcompat:1.6.1"
|
implementation "androidx.appcompat:appcompat:1.6.1"
|
||||||
implementation "androidx.fragment:fragment-ktx:1.6.1"
|
implementation "androidx.fragment:fragment-ktx:1.6.1"
|
||||||
implementation "androidx.annotation:annotation:1.6.0"
|
implementation "androidx.annotation:annotation:1.7.0"
|
||||||
|
|
||||||
implementation "androidx.preference:preference-ktx:1.2.1"
|
implementation "androidx.preference:preference-ktx:1.2.1"
|
||||||
implementation "androidx.recyclerview:recyclerview:1.3.1"
|
implementation "androidx.recyclerview:recyclerview:1.3.2"
|
||||||
implementation "androidx.viewpager2:viewpager2:1.1.0-beta02"
|
implementation "androidx.viewpager2:viewpager2:1.1.0-beta02"
|
||||||
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
|
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
|
||||||
implementation "androidx.constraintlayout:constraintlayout:2.1.4"
|
implementation "androidx.constraintlayout:constraintlayout:2.1.4"
|
||||||
implementation "androidx.coordinatorlayout:coordinatorlayout:1.2.0"
|
implementation "androidx.coordinatorlayout:coordinatorlayout:1.2.0"
|
||||||
implementation "com.google.android.material:material:1.9.0"
|
implementation "com.google.android.material:material:1.10.0"
|
||||||
implementation "com.github.wulkanowy:material-chips-input:2.3.1"
|
implementation "com.github.wulkanowy:material-chips-input:2.3.1"
|
||||||
implementation "com.github.PhilJay:MPAndroidChart:v3.1.0"
|
implementation "com.github.PhilJay:MPAndroidChart:v3.1.0"
|
||||||
implementation 'com.github.lopspower:CircularImageView:4.3.0'
|
implementation 'com.github.lopspower:CircularImageView:4.3.0'
|
||||||
@ -219,7 +220,7 @@ dependencies {
|
|||||||
implementation "androidx.work:work-runtime-ktx:$work_manager"
|
implementation "androidx.work:work-runtime-ktx:$work_manager"
|
||||||
playImplementation "androidx.work:work-gcm:$work_manager"
|
playImplementation "androidx.work:work-gcm:$work_manager"
|
||||||
|
|
||||||
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.1"
|
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2"
|
||||||
|
|
||||||
implementation "androidx.room:room-runtime:$room"
|
implementation "androidx.room:room-runtime:$room"
|
||||||
implementation "androidx.room:room-ktx:$room"
|
implementation "androidx.room:room-ktx:$room"
|
||||||
@ -235,11 +236,11 @@ dependencies {
|
|||||||
|
|
||||||
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
|
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
|
||||||
implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0"
|
implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0"
|
||||||
implementation "com.squareup.okhttp3:logging-interceptor:4.11.0"
|
implementation "com.squareup.okhttp3:logging-interceptor:4.12.0"
|
||||||
|
|
||||||
implementation "com.jakewharton.timber:timber:5.0.1"
|
implementation "com.jakewharton.timber:timber:5.0.1"
|
||||||
implementation "at.favre.lib:slf4j-timber:1.0.1"
|
implementation "at.favre.lib:slf4j-timber:1.0.1"
|
||||||
implementation 'com.github.bastienpaulfr:Treessence:1.0.5'
|
implementation 'com.github.bastienpaulfr:Treessence:1.1.2'
|
||||||
implementation "com.mikepenz:aboutlibraries-core:$about_libraries"
|
implementation "com.mikepenz:aboutlibraries-core:$about_libraries"
|
||||||
implementation "io.coil-kt:coil:2.4.0"
|
implementation "io.coil-kt:coil:2.4.0"
|
||||||
implementation "io.github.wulkanowy:AppKillerManager:3.0.1"
|
implementation "io.github.wulkanowy:AppKillerManager:3.0.1"
|
||||||
@ -247,17 +248,18 @@ dependencies {
|
|||||||
implementation 'com.fredporciuncula:flow-preferences:1.9.1'
|
implementation 'com.fredporciuncula:flow-preferences:1.9.1'
|
||||||
implementation 'org.apache.commons:commons-text:1.10.0'
|
implementation 'org.apache.commons:commons-text:1.10.0'
|
||||||
|
|
||||||
playImplementation platform('com.google.firebase:firebase-bom:32.2.2')
|
playImplementation platform('com.google.firebase:firebase-bom:32.4.0')
|
||||||
playImplementation 'com.google.firebase:firebase-analytics-ktx'
|
playImplementation 'com.google.firebase:firebase-analytics-ktx'
|
||||||
playImplementation 'com.google.firebase:firebase-messaging:'
|
playImplementation 'com.google.firebase:firebase-messaging:'
|
||||||
playImplementation 'com.google.firebase:firebase-crashlytics:'
|
playImplementation 'com.google.firebase:firebase-crashlytics:'
|
||||||
playImplementation 'com.google.firebase:firebase-config-ktx'
|
playImplementation 'com.google.firebase:firebase-config-ktx'
|
||||||
playImplementation 'com.google.android.play:core:1.10.3'
|
playImplementation 'com.google.android.play:core:1.10.3'
|
||||||
playImplementation 'com.google.android.play:core-ktx:1.8.1'
|
playImplementation 'com.google.android.play:core-ktx:1.8.1'
|
||||||
playImplementation 'com.google.android.gms:play-services-ads:22.2.0'
|
playImplementation 'com.google.android.gms:play-services-ads:22.4.0'
|
||||||
|
playImplementation "com.google.android.play:integrity:1.2.0"
|
||||||
|
|
||||||
hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.303'
|
hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.300'
|
||||||
hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.300'
|
hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.301'
|
||||||
|
|
||||||
releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker"
|
releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker"
|
||||||
|
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
apply plugin: "jacoco"
|
apply plugin: "jacoco"
|
||||||
|
|
||||||
jacoco {
|
jacoco {
|
||||||
toolVersion "0.8.7"
|
toolVersion "0.8.10"
|
||||||
reportsDirectory.set(file("$buildDir/reports"))
|
reportsDirectory.set(file("$buildDir/reports"))
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType(Test) {
|
tasks.withType(Test).configureEach {
|
||||||
jacoco.includeNoLocationClasses = true
|
jacoco.includeNoLocationClasses = true
|
||||||
jacoco.excludes = ['jdk.internal.*']
|
jacoco.excludes = ['jdk.internal.*']
|
||||||
}
|
}
|
||||||
|
|
||||||
task jacocoTestReport(type: JacocoReport) {
|
tasks.register('jacocoTestReport', JacocoReport) {
|
||||||
|
|
||||||
group = "Reporting"
|
group = "Reporting"
|
||||||
description = "Generate Jacoco coverage reports"
|
description = "Generate Jacoco coverage reports"
|
||||||
@ -33,19 +33,19 @@ task jacocoTestReport(type: JacocoReport) {
|
|||||||
'**/*_Factory.*']
|
'**/*_Factory.*']
|
||||||
|
|
||||||
classDirectories.setFrom(fileTree(
|
classDirectories.setFrom(fileTree(
|
||||||
dir: "$buildDir/intermediates/classes/debug",
|
dir: "$buildDir/intermediates/classes/debug",
|
||||||
excludes: excludes
|
excludes: excludes
|
||||||
) + fileTree(
|
) + fileTree(
|
||||||
dir: "$buildDir/tmp/kotlin-classes/fdroidDebug",
|
dir: "$buildDir/tmp/kotlin-classes/fdroidDebug",
|
||||||
excludes: excludes
|
excludes: excludes
|
||||||
))
|
))
|
||||||
|
|
||||||
sourceDirectories.setFrom(files([
|
sourceDirectories.setFrom(files([
|
||||||
"src/main/java",
|
"src/main/java",
|
||||||
"src/fdroid/java"
|
"src/fdroid/java"
|
||||||
]))
|
]))
|
||||||
executionData.setFrom(fileTree(
|
executionData.setFrom(fileTree(
|
||||||
dir: project.projectDir,
|
dir: project.projectDir,
|
||||||
includes: ["**/*.exec", "**/*.ec"]
|
includes: ["**/*.exec", "**/*.ec"]
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
package io.github.wulkanowy.utils
|
||||||
|
|
||||||
|
import javax.inject.Inject
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
class IntegrityHelper @Inject constructor() {
|
||||||
|
|
||||||
|
@Suppress("UNUSED_PARAMETER")
|
||||||
|
fun getIntegrityToken(requestId: String): String? = null
|
||||||
|
}
|
@ -2,8 +2,8 @@ package io.github.wulkanowy.utils
|
|||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.huawei.agconnect.crash.AGConnectCrash
|
import com.huawei.agconnect.crash.AGConnectCrash
|
||||||
import fr.bipi.tressence.base.FormatterPriorityTree
|
import fr.bipi.treessence.base.FormatterPriorityTree
|
||||||
import fr.bipi.tressence.common.StackTraceRecorder
|
import fr.bipi.treessence.common.StackTraceRecorder
|
||||||
|
|
||||||
class CrashLogTree : FormatterPriorityTree(Log.VERBOSE) {
|
class CrashLogTree : FormatterPriorityTree(Log.VERBOSE) {
|
||||||
|
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
package io.github.wulkanowy.utils
|
||||||
|
|
||||||
|
import javax.inject.Inject
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
class IntegrityHelper @Inject constructor() {
|
||||||
|
|
||||||
|
@Suppress("UNUSED_PARAMETER")
|
||||||
|
fun getIntegrityToken(requestId: String): String? = null
|
||||||
|
}
|
@ -6,7 +6,7 @@ import androidx.hilt.work.HiltWorkerFactory
|
|||||||
import androidx.work.Configuration
|
import androidx.work.Configuration
|
||||||
import com.yariksoffice.lingver.Lingver
|
import com.yariksoffice.lingver.Lingver
|
||||||
import dagger.hilt.android.HiltAndroidApp
|
import dagger.hilt.android.HiltAndroidApp
|
||||||
import fr.bipi.tressence.file.FileLoggerTree
|
import fr.bipi.treessence.file.FileLoggerTree
|
||||||
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
||||||
import io.github.wulkanowy.ui.base.ThemeManager
|
import io.github.wulkanowy.ui.base.ThemeManager
|
||||||
import io.github.wulkanowy.utils.*
|
import io.github.wulkanowy.utils.*
|
||||||
|
@ -14,6 +14,7 @@ import dagger.hilt.InstallIn
|
|||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
import dagger.hilt.components.SingletonComponent
|
import dagger.hilt.components.SingletonComponent
|
||||||
import io.github.wulkanowy.data.api.AdminMessageService
|
import io.github.wulkanowy.data.api.AdminMessageService
|
||||||
|
import io.github.wulkanowy.data.api.SchoolsService
|
||||||
import io.github.wulkanowy.data.db.AppDatabase
|
import io.github.wulkanowy.data.db.AppDatabase
|
||||||
import io.github.wulkanowy.data.db.SharedPrefProvider
|
import io.github.wulkanowy.data.db.SharedPrefProvider
|
||||||
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
||||||
@ -82,19 +83,29 @@ internal class DataModule {
|
|||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
fun provideRetrofit(
|
fun provideAdminMessageService(
|
||||||
okHttpClient: OkHttpClient,
|
okHttpClient: OkHttpClient,
|
||||||
json: Json,
|
json: Json,
|
||||||
appInfo: AppInfo
|
appInfo: AppInfo
|
||||||
): Retrofit = Retrofit.Builder()
|
): AdminMessageService = Retrofit.Builder()
|
||||||
.baseUrl(appInfo.messagesBaseUrl)
|
.baseUrl(appInfo.messagesBaseUrl)
|
||||||
.client(okHttpClient)
|
.client(okHttpClient)
|
||||||
.addConverterFactory(json.asConverterFactory("application/json".toMediaType()))
|
.addConverterFactory(json.asConverterFactory("application/json".toMediaType()))
|
||||||
.build()
|
.build()
|
||||||
|
.create()
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
fun provideAdminMessageService(retrofit: Retrofit): AdminMessageService = retrofit.create()
|
fun provideSchoolsService(
|
||||||
|
okHttpClient: OkHttpClient,
|
||||||
|
json: Json,
|
||||||
|
appInfo: AppInfo,
|
||||||
|
): SchoolsService = Retrofit.Builder()
|
||||||
|
.baseUrl(appInfo.schoolsBaseUrl)
|
||||||
|
.client(okHttpClient)
|
||||||
|
.addConverterFactory(json.asConverterFactory("application/json".toMediaType()))
|
||||||
|
.build()
|
||||||
|
.create()
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@Provides
|
@Provides
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
package io.github.wulkanowy.data.api
|
||||||
|
|
||||||
|
import io.github.wulkanowy.data.pojos.IntegrityRequest
|
||||||
|
import io.github.wulkanowy.data.pojos.LoginEvent
|
||||||
|
import retrofit2.http.Body
|
||||||
|
import retrofit2.http.POST
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
interface SchoolsService {
|
||||||
|
|
||||||
|
@POST("/log/loginEvent")
|
||||||
|
suspend fun logLoginEvent(@Body request: IntegrityRequest<LoginEvent>)
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
package io.github.wulkanowy.data.db.dao
|
package io.github.wulkanowy.data.db.dao
|
||||||
|
|
||||||
import androidx.room.*
|
import androidx.room.*
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
import io.github.wulkanowy.data.db.entities.Student
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
import io.github.wulkanowy.data.db.entities.StudentName
|
import io.github.wulkanowy.data.db.entities.StudentName
|
||||||
import io.github.wulkanowy.data.db.entities.StudentNickAndAvatar
|
import io.github.wulkanowy.data.db.entities.StudentNickAndAvatar
|
||||||
@ -33,12 +34,12 @@ abstract class StudentDao {
|
|||||||
abstract suspend fun loadAll(): List<Student>
|
abstract suspend fun loadAll(): List<Student>
|
||||||
|
|
||||||
@Transaction
|
@Transaction
|
||||||
@Query("SELECT * FROM Students")
|
@Query("SELECT * FROM Students JOIN Semesters ON Students.student_id = Semesters.student_id AND Students.class_id = Semesters.class_id")
|
||||||
abstract suspend fun loadStudentsWithSemesters(): List<StudentWithSemesters>
|
abstract suspend fun loadStudentsWithSemesters(): Map<Student, List<Semester>>
|
||||||
|
|
||||||
@Transaction
|
@Transaction
|
||||||
@Query("SELECT * FROM Students WHERE id = :id")
|
@Query("SELECT * FROM Students JOIN Semesters ON Students.student_id = Semesters.student_id AND Students.class_id = Semesters.class_id WHERE Students.id = :id")
|
||||||
abstract suspend fun loadStudentWithSemestersById(id: Long): StudentWithSemesters?
|
abstract suspend fun loadStudentWithSemestersById(id: Long): Map<Student, List<Semester>>
|
||||||
|
|
||||||
@Query("UPDATE Students SET is_current = 1 WHERE id = :id")
|
@Query("UPDATE Students SET is_current = 1 WHERE id = :id")
|
||||||
abstract suspend fun updateCurrent(id: Long)
|
abstract suspend fun updateCurrent(id: Long)
|
||||||
|
@ -1,13 +1,8 @@
|
|||||||
package io.github.wulkanowy.data.db.entities
|
package io.github.wulkanowy.data.db.entities
|
||||||
|
|
||||||
import androidx.room.Embedded
|
|
||||||
import androidx.room.Relation
|
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
|
|
||||||
data class StudentWithSemesters(
|
data class StudentWithSemesters(
|
||||||
@Embedded
|
|
||||||
val student: Student,
|
val student: Student,
|
||||||
|
|
||||||
@Relation(parentColumn = "student_id", entityColumn = "student_id")
|
|
||||||
val semesters: List<Semester>
|
val semesters: List<Semester>
|
||||||
) : Serializable
|
) : Serializable
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
package io.github.wulkanowy.data.pojos
|
||||||
|
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class LoginEvent(
|
||||||
|
val uuid: String,
|
||||||
|
val schoolName: String,
|
||||||
|
val schoolShort: String,
|
||||||
|
val schoolAddress: String,
|
||||||
|
val scraperBaseUrl: String,
|
||||||
|
val symbol: String,
|
||||||
|
val schoolId: String,
|
||||||
|
val loginType: String,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class IntegrityRequest<T>(
|
||||||
|
val tokenString: String,
|
||||||
|
val data: T,
|
||||||
|
)
|
@ -194,12 +194,6 @@ class PreferencesRepository @Inject constructor(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
val showTimetableTimers: Boolean
|
|
||||||
get() = getBoolean(
|
|
||||||
R.string.pref_key_timetable_show_timers,
|
|
||||||
R.bool.pref_default_timetable_show_timers
|
|
||||||
)
|
|
||||||
|
|
||||||
val showTimetableGaps: TimetableGapsMode
|
val showTimetableGaps: TimetableGapsMode
|
||||||
get() = TimetableGapsMode.getByValue(
|
get() = TimetableGapsMode.getByValue(
|
||||||
getString(
|
getString(
|
||||||
|
@ -0,0 +1,68 @@
|
|||||||
|
package io.github.wulkanowy.data.repositories
|
||||||
|
|
||||||
|
import io.github.wulkanowy.data.api.SchoolsService
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
|
import io.github.wulkanowy.data.db.entities.StudentWithSemesters
|
||||||
|
import io.github.wulkanowy.data.pojos.IntegrityRequest
|
||||||
|
import io.github.wulkanowy.data.pojos.LoginEvent
|
||||||
|
import io.github.wulkanowy.sdk.Sdk
|
||||||
|
import io.github.wulkanowy.ui.modules.login.LoginData
|
||||||
|
import io.github.wulkanowy.utils.IntegrityHelper
|
||||||
|
import io.github.wulkanowy.utils.getCurrentOrLast
|
||||||
|
import io.github.wulkanowy.utils.init
|
||||||
|
import kotlinx.coroutines.withTimeout
|
||||||
|
import timber.log.Timber
|
||||||
|
import java.util.UUID
|
||||||
|
import javax.inject.Inject
|
||||||
|
import javax.inject.Singleton
|
||||||
|
import kotlin.time.Duration.Companion.seconds
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
class SchoolsRepository @Inject constructor(
|
||||||
|
private val integrityHelper: IntegrityHelper,
|
||||||
|
private val schoolsService: SchoolsService,
|
||||||
|
private val sdk: Sdk,
|
||||||
|
) {
|
||||||
|
|
||||||
|
suspend fun logSchoolLogin(loginData: LoginData, students: List<StudentWithSemesters>) {
|
||||||
|
students.forEach {
|
||||||
|
runCatching {
|
||||||
|
withTimeout(10.seconds) {
|
||||||
|
logLogin(loginData, it.student, it.semesters.getCurrentOrLast())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.onFailure { Timber.e(it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private suspend fun logLogin(loginData: LoginData, student: Student, semester: Semester) {
|
||||||
|
val requestId = UUID.randomUUID().toString()
|
||||||
|
val token = integrityHelper.getIntegrityToken(requestId) ?: return
|
||||||
|
|
||||||
|
val schoolInfo = sdk
|
||||||
|
.init(student.copy(password = loginData.password))
|
||||||
|
.switchDiary(
|
||||||
|
diaryId = semester.diaryId,
|
||||||
|
kindergartenDiaryId = semester.kindergartenDiaryId,
|
||||||
|
schoolYear = semester.schoolYear
|
||||||
|
)
|
||||||
|
.getSchool()
|
||||||
|
|
||||||
|
schoolsService.logLoginEvent(
|
||||||
|
IntegrityRequest(
|
||||||
|
tokenString = token,
|
||||||
|
data = LoginEvent(
|
||||||
|
uuid = requestId,
|
||||||
|
schoolAddress = schoolInfo.address,
|
||||||
|
schoolName = schoolInfo.name,
|
||||||
|
schoolShort = student.schoolShortName,
|
||||||
|
scraperBaseUrl = student.scrapperBaseUrl,
|
||||||
|
loginType = student.loginType,
|
||||||
|
symbol = student.symbol,
|
||||||
|
schoolId = student.schoolSymbol,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@ -62,20 +62,28 @@ class StudentRepository @Inject constructor(
|
|||||||
.getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol)
|
.getStudentsHybrid(email, password, scrapperBaseUrl, "", symbol)
|
||||||
.mapToPojo(password)
|
.mapToPojo(password)
|
||||||
|
|
||||||
suspend fun getSavedStudents(decryptPass: Boolean = true) =
|
suspend fun getSavedStudents(decryptPass: Boolean = true): List<StudentWithSemesters> {
|
||||||
studentDb.loadStudentsWithSemesters()
|
return studentDb.loadStudentsWithSemesters().map { (student, semesters) ->
|
||||||
.map {
|
StudentWithSemesters(
|
||||||
it.apply {
|
student = student.apply {
|
||||||
if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE) {
|
if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE) {
|
||||||
student.password = withContext(dispatchers.io) {
|
student.password = withContext(dispatchers.io) {
|
||||||
decrypt(student.password)
|
decrypt(student.password)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
}
|
semesters = semesters,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun getSavedStudentById(id: Long, decryptPass: Boolean = true) =
|
suspend fun getSavedStudentById(id: Long, decryptPass: Boolean = true): StudentWithSemesters? =
|
||||||
studentDb.loadStudentWithSemestersById(id)?.apply {
|
studentDb.loadStudentWithSemestersById(id).let { res ->
|
||||||
|
StudentWithSemesters(
|
||||||
|
student = res.keys.firstOrNull() ?: return null,
|
||||||
|
semesters = res.values.first(),
|
||||||
|
)
|
||||||
|
}.apply {
|
||||||
if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE) {
|
if (decryptPass && Sdk.Mode.valueOf(student.loginMode) != Sdk.Mode.HEBE) {
|
||||||
student.password = withContext(dispatchers.io) {
|
student.password = withContext(dispatchers.io) {
|
||||||
decrypt(student.password)
|
decrypt(student.password)
|
||||||
|
@ -148,6 +148,10 @@ class AttendanceFragment : BaseFragment<FragmentAttendanceBinding>(R.layout.frag
|
|||||||
binding.attendanceNavDate.text = date
|
binding.attendanceNavDate.text = date
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun showNavigation(show: Boolean) {
|
||||||
|
binding.attendanceNavContainer.isVisible = show
|
||||||
|
}
|
||||||
|
|
||||||
override fun clearData() {
|
override fun clearData() {
|
||||||
with(attendanceAdapter) {
|
with(attendanceAdapter) {
|
||||||
items = emptyList()
|
items = emptyList()
|
||||||
@ -281,7 +285,9 @@ class AttendanceFragment : BaseFragment<FragmentAttendanceBinding>(R.layout.frag
|
|||||||
|
|
||||||
override fun onSaveInstanceState(outState: Bundle) {
|
override fun onSaveInstanceState(outState: Bundle) {
|
||||||
super.onSaveInstanceState(outState)
|
super.onSaveInstanceState(outState)
|
||||||
outState.putLong(SAVED_DATE_KEY, presenter.currentDate.toEpochDay())
|
presenter.currentDate?.let {
|
||||||
|
outState.putLong(SAVED_DATE_KEY, it.toEpochDay())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
|
@ -3,10 +3,14 @@ package io.github.wulkanowy.ui.modules.attendance
|
|||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import io.github.wulkanowy.data.*
|
import io.github.wulkanowy.data.*
|
||||||
import io.github.wulkanowy.data.db.entities.Attendance
|
import io.github.wulkanowy.data.db.entities.Attendance
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
|
import io.github.wulkanowy.data.db.entities.Timetable
|
||||||
import io.github.wulkanowy.data.repositories.AttendanceRepository
|
import io.github.wulkanowy.data.repositories.AttendanceRepository
|
||||||
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
||||||
import io.github.wulkanowy.data.repositories.SemesterRepository
|
import io.github.wulkanowy.data.repositories.SemesterRepository
|
||||||
import io.github.wulkanowy.data.repositories.StudentRepository
|
import io.github.wulkanowy.data.repositories.StudentRepository
|
||||||
|
import io.github.wulkanowy.data.repositories.TimetableRepository
|
||||||
import io.github.wulkanowy.ui.base.BasePresenter
|
import io.github.wulkanowy.ui.base.BasePresenter
|
||||||
import io.github.wulkanowy.ui.base.ErrorHandler
|
import io.github.wulkanowy.ui.base.ErrorHandler
|
||||||
import io.github.wulkanowy.utils.*
|
import io.github.wulkanowy.utils.*
|
||||||
@ -14,6 +18,7 @@ import kotlinx.coroutines.flow.catch
|
|||||||
import kotlinx.coroutines.flow.flow
|
import kotlinx.coroutines.flow.flow
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
import java.time.DayOfWeek
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
import java.time.LocalDate.now
|
import java.time.LocalDate.now
|
||||||
import java.time.LocalDate.ofEpochDay
|
import java.time.LocalDate.ofEpochDay
|
||||||
@ -28,9 +33,10 @@ class AttendancePresenter @Inject constructor(
|
|||||||
private val analytics: AnalyticsHelper
|
private val analytics: AnalyticsHelper
|
||||||
) : BasePresenter<AttendanceView>(errorHandler, studentRepository) {
|
) : BasePresenter<AttendanceView>(errorHandler, studentRepository) {
|
||||||
|
|
||||||
private var baseDate: LocalDate = now().previousOrSameSchoolDay
|
private var initialDate: LocalDate? = null
|
||||||
|
private var isWeekendHasLessons: Boolean = false
|
||||||
|
|
||||||
lateinit var currentDate: LocalDate
|
var currentDate: LocalDate? = null
|
||||||
private set
|
private set
|
||||||
|
|
||||||
private lateinit var lastError: Throwable
|
private lateinit var lastError: Throwable
|
||||||
@ -44,27 +50,34 @@ class AttendancePresenter @Inject constructor(
|
|||||||
view.initView()
|
view.initView()
|
||||||
Timber.i("Attendance view was initialized")
|
Timber.i("Attendance view was initialized")
|
||||||
errorHandler.showErrorMessage = ::showErrorViewOnError
|
errorHandler.showErrorMessage = ::showErrorViewOnError
|
||||||
reloadView(ofEpochDay(date ?: baseDate.toEpochDay()))
|
currentDate = date?.let(::ofEpochDay)
|
||||||
loadData()
|
loadData()
|
||||||
if (currentDate.isHolidays) setBaseDateOnHolidays()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onPreviousDay() {
|
fun onPreviousDay() {
|
||||||
|
val date = if (isWeekendHasLessons) {
|
||||||
|
currentDate?.minusDays(1)
|
||||||
|
} else currentDate?.previousSchoolDay
|
||||||
|
|
||||||
view?.finishActionMode()
|
view?.finishActionMode()
|
||||||
attendanceToExcuseList.clear()
|
attendanceToExcuseList.clear()
|
||||||
reloadView(currentDate.previousSchoolDay)
|
reloadView(date ?: return)
|
||||||
loadData()
|
loadData()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onNextDay() {
|
fun onNextDay() {
|
||||||
|
val date = if (isWeekendHasLessons) {
|
||||||
|
currentDate?.plusDays(1)
|
||||||
|
} else currentDate?.nextSchoolDay
|
||||||
|
|
||||||
view?.finishActionMode()
|
view?.finishActionMode()
|
||||||
attendanceToExcuseList.clear()
|
attendanceToExcuseList.clear()
|
||||||
reloadView(currentDate.nextSchoolDay)
|
reloadView(date ?: return)
|
||||||
loadData()
|
loadData()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onPickDate() {
|
fun onPickDate() {
|
||||||
view?.showDatePickerDialog(currentDate)
|
view?.showDatePickerDialog(currentDate ?: return)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onDateSet(year: Int, month: Int, day: Int) {
|
fun onDateSet(year: Int, month: Int, day: Int) {
|
||||||
@ -93,10 +106,8 @@ class AttendancePresenter @Inject constructor(
|
|||||||
Timber.i("Attendance view is reselected")
|
Timber.i("Attendance view is reselected")
|
||||||
view?.let { view ->
|
view?.let { view ->
|
||||||
if (view.currentStackSize == 1) {
|
if (view.currentStackSize == 1) {
|
||||||
baseDate = now().previousOrSameSchoolDay
|
if (currentDate != initialDate) {
|
||||||
|
reloadView(initialDate ?: return)
|
||||||
if (currentDate != baseDate) {
|
|
||||||
reloadView(baseDate)
|
|
||||||
loadData()
|
loadData()
|
||||||
} else if (!view.isViewEmpty) {
|
} else if (!view.isViewEmpty) {
|
||||||
view.resetView()
|
view.resetView()
|
||||||
@ -188,19 +199,6 @@ class AttendancePresenter @Inject constructor(
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setBaseDateOnHolidays() {
|
|
||||||
flow {
|
|
||||||
val student = studentRepository.getCurrentStudent()
|
|
||||||
emit(semesterRepository.getCurrentSemester(student))
|
|
||||||
}.catch {
|
|
||||||
Timber.i("Loading semester result: An exception occurred")
|
|
||||||
}.onEach {
|
|
||||||
baseDate = baseDate.getLastSchoolDayIfHoliday(it.schoolYear)
|
|
||||||
currentDate = baseDate
|
|
||||||
reloadNavigation()
|
|
||||||
}.launch("holidays")
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun loadData(forceRefresh: Boolean = false) {
|
private fun loadData(forceRefresh: Boolean = false) {
|
||||||
Timber.i("Loading attendance data started")
|
Timber.i("Loading attendance data started")
|
||||||
|
|
||||||
@ -211,11 +209,13 @@ class AttendancePresenter @Inject constructor(
|
|||||||
isParent = student.isParent
|
isParent = student.isParent
|
||||||
|
|
||||||
val semester = semesterRepository.getCurrentSemester(student)
|
val semester = semesterRepository.getCurrentSemester(student)
|
||||||
|
|
||||||
|
checkInitialAndCurrentDate(student, semester)
|
||||||
attendanceRepository.getAttendance(
|
attendanceRepository.getAttendance(
|
||||||
student = student,
|
student = student,
|
||||||
semester = semester,
|
semester = semester,
|
||||||
start = currentDate,
|
start = currentDate ?: now(),
|
||||||
end = currentDate,
|
end = currentDate ?: now(),
|
||||||
forceRefresh = forceRefresh
|
forceRefresh = forceRefresh
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -231,6 +231,8 @@ class AttendancePresenter @Inject constructor(
|
|||||||
}.sortedBy { item -> item.number }
|
}.sortedBy { item -> item.number }
|
||||||
}
|
}
|
||||||
.onResourceData {
|
.onResourceData {
|
||||||
|
isWeekendHasLessons = isWeekendHasLessons || isWeekendHasLessons(it)
|
||||||
|
|
||||||
view?.run {
|
view?.run {
|
||||||
enableSwipe(true)
|
enableSwipe(true)
|
||||||
showProgress(false)
|
showProgress(false)
|
||||||
@ -238,6 +240,7 @@ class AttendancePresenter @Inject constructor(
|
|||||||
showEmpty(it.isEmpty())
|
showEmpty(it.isEmpty())
|
||||||
showContent(it.isNotEmpty())
|
showContent(it.isNotEmpty())
|
||||||
updateData(it)
|
updateData(it)
|
||||||
|
reloadNavigation()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onResourceIntermediate { view?.showRefresh(true) }
|
.onResourceIntermediate { view?.showRefresh(true) }
|
||||||
@ -263,6 +266,43 @@ class AttendancePresenter @Inject constructor(
|
|||||||
.launch()
|
.launch()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private suspend fun checkInitialAndCurrentDate(student: Student, semester: Semester) {
|
||||||
|
if (initialDate == null) {
|
||||||
|
val lessons = attendanceRepository.getAttendance(
|
||||||
|
student = student,
|
||||||
|
semester = semester,
|
||||||
|
start = now().monday,
|
||||||
|
end = now().sunday,
|
||||||
|
forceRefresh = false,
|
||||||
|
).toFirstResult().dataOrNull.orEmpty()
|
||||||
|
isWeekendHasLessons = isWeekendHasLessons(lessons)
|
||||||
|
initialDate = getInitialDate(semester)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentDate == null) {
|
||||||
|
currentDate = initialDate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isWeekendHasLessons(
|
||||||
|
lessons: List<Attendance>,
|
||||||
|
): Boolean = lessons.any {
|
||||||
|
it.date.dayOfWeek in listOf(
|
||||||
|
DayOfWeek.SATURDAY,
|
||||||
|
DayOfWeek.SUNDAY,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getInitialDate(semester: Semester): LocalDate {
|
||||||
|
val now = now()
|
||||||
|
|
||||||
|
return when {
|
||||||
|
now.isHolidays -> now.getLastSchoolDayIfHoliday(semester.schoolYear)
|
||||||
|
isWeekendHasLessons -> now
|
||||||
|
else -> now.previousOrSameSchoolDay
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun excuseAbsence(reason: String?, toExcuseList: List<Attendance>) {
|
private fun excuseAbsence(reason: String?, toExcuseList: List<Attendance>) {
|
||||||
resourceFlow {
|
resourceFlow {
|
||||||
val student = studentRepository.getCurrentStudent()
|
val student = studentRepository.getCurrentStudent()
|
||||||
@ -311,7 +351,7 @@ class AttendancePresenter @Inject constructor(
|
|||||||
private fun reloadView(date: LocalDate) {
|
private fun reloadView(date: LocalDate) {
|
||||||
currentDate = date
|
currentDate = date
|
||||||
|
|
||||||
Timber.i("Reload attendance view with the date ${currentDate.toFormattedString()}")
|
Timber.i("Reload attendance view with the date ${currentDate?.toFormattedString()}")
|
||||||
view?.apply {
|
view?.apply {
|
||||||
showProgress(true)
|
showProgress(true)
|
||||||
enableSwipe(false)
|
enableSwipe(false)
|
||||||
@ -326,10 +366,13 @@ class AttendancePresenter @Inject constructor(
|
|||||||
|
|
||||||
@SuppressLint("DefaultLocale")
|
@SuppressLint("DefaultLocale")
|
||||||
private fun reloadNavigation() {
|
private fun reloadNavigation() {
|
||||||
|
val currentDate = currentDate ?: return
|
||||||
|
|
||||||
view?.apply {
|
view?.apply {
|
||||||
showPreButton(!currentDate.minusDays(1).isHolidays)
|
showPreButton(!currentDate.minusDays(1).isHolidays)
|
||||||
showNextButton(!currentDate.plusDays(1).isHolidays)
|
showNextButton(!currentDate.plusDays(1).isHolidays)
|
||||||
updateNavigationDay(currentDate.toFormattedString("EEEE, dd.MM").capitalise())
|
updateNavigationDay(currentDate.toFormattedString("EEEE, dd.MM").capitalise())
|
||||||
|
showNavigation(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,8 @@ interface AttendanceView : BaseView {
|
|||||||
|
|
||||||
fun showContent(show: Boolean)
|
fun showContent(show: Boolean)
|
||||||
|
|
||||||
|
fun showNavigation(show: Boolean)
|
||||||
|
|
||||||
fun showPreButton(show: Boolean)
|
fun showPreButton(show: Boolean)
|
||||||
|
|
||||||
fun showNextButton(show: Boolean)
|
fun showNextButton(show: Boolean)
|
||||||
|
@ -386,7 +386,7 @@ class DashboardPresenter @Inject constructor(
|
|||||||
private fun loadLessons(student: Student, forceRefresh: Boolean) {
|
private fun loadLessons(student: Student, forceRefresh: Boolean) {
|
||||||
flatResourceFlow {
|
flatResourceFlow {
|
||||||
val semester = semesterRepository.getCurrentSemester(student)
|
val semester = semesterRepository.getCurrentSemester(student)
|
||||||
val date = LocalDate.now().nextOrSameSchoolDay
|
val date = LocalDate.now()
|
||||||
|
|
||||||
timetableRepository.getTimetable(
|
timetableRepository.getTimetable(
|
||||||
student = student,
|
student = student,
|
||||||
|
@ -58,7 +58,7 @@ class GradeAverageProvider @Inject constructor(
|
|||||||
when (params.gradeAverageMode) {
|
when (params.gradeAverageMode) {
|
||||||
ONE_SEMESTER -> getGradeSubjects(
|
ONE_SEMESTER -> getGradeSubjects(
|
||||||
student = student,
|
student = student,
|
||||||
semester = semesters.single { it.semesterId == semesterId },
|
semester = semesters.first { it.semesterId == semesterId },
|
||||||
forceRefresh = forceRefresh,
|
forceRefresh = forceRefresh,
|
||||||
params = params,
|
params = params,
|
||||||
)
|
)
|
||||||
|
@ -22,6 +22,8 @@ import io.github.wulkanowy.databinding.ItemGradeStatisticsHeaderBinding
|
|||||||
import io.github.wulkanowy.databinding.ItemGradeStatisticsPieBinding
|
import io.github.wulkanowy.databinding.ItemGradeStatisticsPieBinding
|
||||||
import io.github.wulkanowy.utils.getThemeAttrColor
|
import io.github.wulkanowy.utils.getThemeAttrColor
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import kotlin.math.max
|
||||||
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
class GradeStatisticsAdapter @Inject constructor() :
|
class GradeStatisticsAdapter @Inject constructor() :
|
||||||
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||||
@ -269,7 +271,7 @@ class GradeStatisticsAdapter @Inject constructor() :
|
|||||||
valueTextSize = 12f
|
valueTextSize = 12f
|
||||||
valueTextColor = binding.root.context.getThemeAttrColor(android.R.attr.textColorPrimary)
|
valueTextColor = binding.root.context.getThemeAttrColor(android.R.attr.textColorPrimary)
|
||||||
valueFormatter = object : ValueFormatter() {
|
valueFormatter = object : ValueFormatter() {
|
||||||
override fun getBarLabel(barEntry: BarEntry) = "${barEntry.y}%"
|
override fun getBarLabel(barEntry: BarEntry) = "${barEntry.y}"
|
||||||
}
|
}
|
||||||
colors = gradePointsColors
|
colors = gradePointsColors
|
||||||
}
|
}
|
||||||
@ -304,15 +306,20 @@ class GradeStatisticsAdapter @Inject constructor() :
|
|||||||
}
|
}
|
||||||
xAxis.setDrawLabels(false)
|
xAxis.setDrawLabels(false)
|
||||||
xAxis.setDrawGridLines(false)
|
xAxis.setDrawGridLines(false)
|
||||||
|
|
||||||
|
val yMaxFromValues = (max(points.others, points.student)).roundToInt() + 30f
|
||||||
|
val yMaxFromValuesWithMargin = ((yMaxFromValues / 10.0).roundToInt() * 10).toFloat()
|
||||||
|
val yMax = yMaxFromValuesWithMargin.coerceAtLeast(100f)
|
||||||
|
val yLabelCount = (yMax / 10).toInt() + 1
|
||||||
with(axisLeft) {
|
with(axisLeft) {
|
||||||
axisMinimum = 0f
|
axisMinimum = 0f
|
||||||
axisMaximum = 100f
|
axisMaximum = yMax
|
||||||
labelCount = 11
|
labelCount = yLabelCount
|
||||||
}
|
}
|
||||||
with(axisRight) {
|
with(axisRight) {
|
||||||
axisMinimum = 0f
|
axisMinimum = 0f
|
||||||
axisMaximum = 100f
|
axisMaximum = yMax
|
||||||
labelCount = 11
|
labelCount = yLabelCount
|
||||||
}
|
}
|
||||||
invalidate()
|
invalidate()
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,8 @@ import io.github.wulkanowy.ui.base.BaseFragment
|
|||||||
import io.github.wulkanowy.ui.modules.dashboard.viewholders.AdminMessageViewHolder
|
import io.github.wulkanowy.ui.modules.dashboard.viewholders.AdminMessageViewHolder
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginActivity
|
import io.github.wulkanowy.ui.modules.login.LoginActivity
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginData
|
import io.github.wulkanowy.ui.modules.login.LoginData
|
||||||
|
import io.github.wulkanowy.ui.modules.login.support.LoginSupportDialog
|
||||||
|
import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo
|
||||||
import io.github.wulkanowy.utils.*
|
import io.github.wulkanowy.utils.*
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@ -184,7 +186,9 @@ class LoginFormFragment : BaseFragment<FragmentLoginFormBinding>(R.layout.fragme
|
|||||||
|
|
||||||
override fun clearPassError() {
|
override fun clearPassError() {
|
||||||
binding.loginFormPassLayout.error = null
|
binding.loginFormPassLayout.error = null
|
||||||
binding.loginFormPassLayout.setEndIconTintList(null)
|
binding.loginFormPassLayout.setEndIconTintList(
|
||||||
|
requireContext().getAttrColorStateList(R.attr.colorOnSurface)
|
||||||
|
)
|
||||||
binding.loginFormErrorBox.isVisible = false
|
binding.loginFormErrorBox.isVisible = false
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,8 +240,7 @@ class LoginFormFragment : BaseFragment<FragmentLoginFormBinding>(R.layout.fragme
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun showContact(show: Boolean) {
|
override fun showContact(show: Boolean) {
|
||||||
binding.loginFormContact.visibility = if (show) VISIBLE else GONE
|
binding.loginFormContact.isVisible = show
|
||||||
binding.loginFormRecoverLink.visibility = if (show) GONE else VISIBLE
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun openPrivacyPolicyPage() {
|
override fun openPrivacyPolicyPage() {
|
||||||
@ -281,20 +284,7 @@ class LoginFormFragment : BaseFragment<FragmentLoginFormBinding>(R.layout.fragme
|
|||||||
presenter.updateCustomDomainSuffixVisibility()
|
presenter.updateCustomDomainSuffixVisibility()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun openEmail(lastError: String) {
|
override fun openEmail(supportInfo: LoginSupportInfo) {
|
||||||
context?.openEmailClient(
|
LoginSupportDialog.newInstance(supportInfo).show(childFragmentManager, "support_dialog")
|
||||||
chooserTitle = requireContext().getString(R.string.login_email_intent_title),
|
|
||||||
email = "wulkanowyinc@gmail.com",
|
|
||||||
subject = requireContext().getString(R.string.login_email_subject),
|
|
||||||
body = requireContext().getString(
|
|
||||||
R.string.login_email_text,
|
|
||||||
"${appInfo.systemManufacturer} ${appInfo.systemModel}",
|
|
||||||
appInfo.systemVersion.toString(),
|
|
||||||
"${appInfo.versionName}-${appInfo.buildFlavor}",
|
|
||||||
"$formHostValue/$formHostSymbol",
|
|
||||||
preferencesRepository.installationId,
|
|
||||||
lastError
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ import io.github.wulkanowy.domain.adminmessage.GetAppropriateAdminMessageUseCase
|
|||||||
import io.github.wulkanowy.ui.base.BasePresenter
|
import io.github.wulkanowy.ui.base.BasePresenter
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginData
|
import io.github.wulkanowy.ui.modules.login.LoginData
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginErrorHandler
|
import io.github.wulkanowy.ui.modules.login.LoginErrorHandler
|
||||||
|
import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo
|
||||||
import io.github.wulkanowy.utils.AnalyticsHelper
|
import io.github.wulkanowy.utils.AnalyticsHelper
|
||||||
import io.github.wulkanowy.utils.AppInfo
|
import io.github.wulkanowy.utils.AppInfo
|
||||||
import io.github.wulkanowy.utils.ifNullOrBlank
|
import io.github.wulkanowy.utils.ifNullOrBlank
|
||||||
@ -133,7 +134,7 @@ class LoginFormPresenter @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onSignInClick() {
|
private fun getLoginData(): LoginData {
|
||||||
val email = view?.formUsernameValue.orEmpty().trim()
|
val email = view?.formUsernameValue.orEmpty().trim()
|
||||||
val password = view?.formPassValue.orEmpty().trim()
|
val password = view?.formPassValue.orEmpty().trim()
|
||||||
val host = view?.formHostValue.orEmpty().trim()
|
val host = view?.formHostValue.orEmpty().trim()
|
||||||
@ -142,15 +143,27 @@ class LoginFormPresenter @Inject constructor(
|
|||||||
}.orEmpty()
|
}.orEmpty()
|
||||||
val symbol = view?.formHostSymbol.orEmpty().trim()
|
val symbol = view?.formHostSymbol.orEmpty().trim()
|
||||||
|
|
||||||
if (!validateCredentials(email, password, host)) return
|
return LoginData(
|
||||||
|
login = email,
|
||||||
|
password = password,
|
||||||
|
baseUrl = host,
|
||||||
|
domainSuffix = domainSuffix,
|
||||||
|
symbol = symbol
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onSignInClick() {
|
||||||
|
val loginData = getLoginData()
|
||||||
|
|
||||||
|
if (!validateCredentials(loginData.login, loginData.password, loginData.baseUrl)) return
|
||||||
|
|
||||||
resourceFlow {
|
resourceFlow {
|
||||||
studentRepository.getUserSubjectsFromScrapper(
|
studentRepository.getUserSubjectsFromScrapper(
|
||||||
email = email,
|
email = loginData.login,
|
||||||
password = password,
|
password = loginData.password,
|
||||||
scrapperBaseUrl = host,
|
scrapperBaseUrl = loginData.baseUrl,
|
||||||
domainSuffix = domainSuffix,
|
domainSuffix = loginData.domainSuffix,
|
||||||
symbol = symbol
|
symbol = loginData.symbol.orEmpty(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
.logResourceStatus("login")
|
.logResourceStatus("login")
|
||||||
@ -162,7 +175,6 @@ class LoginFormPresenter @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onResourceSuccess {
|
.onResourceSuccess {
|
||||||
val loginData = LoginData(email, password, host, domainSuffix, symbol)
|
|
||||||
when (it.symbols.size) {
|
when (it.symbols.size) {
|
||||||
0 -> view?.navigateToSymbol(loginData)
|
0 -> view?.navigateToSymbol(loginData)
|
||||||
else -> view?.navigateToStudentSelect(loginData, it)
|
else -> view?.navigateToStudentSelect(loginData, it)
|
||||||
@ -170,7 +182,7 @@ class LoginFormPresenter @Inject constructor(
|
|||||||
analytics.logEvent(
|
analytics.logEvent(
|
||||||
"registration_form",
|
"registration_form",
|
||||||
"success" to true,
|
"success" to true,
|
||||||
"scrapperBaseUrl" to host,
|
"scrapperBaseUrl" to loginData.baseUrl,
|
||||||
"error" to "No error"
|
"error" to "No error"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -187,7 +199,7 @@ class LoginFormPresenter @Inject constructor(
|
|||||||
analytics.logEvent(
|
analytics.logEvent(
|
||||||
"registration_form",
|
"registration_form",
|
||||||
"success" to false,
|
"success" to false,
|
||||||
"scrapperBaseUrl" to host,
|
"scrapperBaseUrl" to loginData.baseUrl,
|
||||||
"error" to it.message.ifNullOrBlank { "No message" }
|
"error" to it.message.ifNullOrBlank { "No message" }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -199,7 +211,14 @@ class LoginFormPresenter @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun onEmailClick() {
|
fun onEmailClick() {
|
||||||
view?.openEmail(lastError?.message.ifNullOrBlank { "none" })
|
view?.openEmail(
|
||||||
|
LoginSupportInfo(
|
||||||
|
loginData = getLoginData(),
|
||||||
|
lastErrorMessage = lastError?.message,
|
||||||
|
registerUser = null,
|
||||||
|
enteredSymbol = null,
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onRecoverClick() {
|
fun onRecoverClick() {
|
||||||
|
@ -4,6 +4,7 @@ import io.github.wulkanowy.data.db.entities.AdminMessage
|
|||||||
import io.github.wulkanowy.data.pojos.RegisterUser
|
import io.github.wulkanowy.data.pojos.RegisterUser
|
||||||
import io.github.wulkanowy.ui.base.BaseView
|
import io.github.wulkanowy.ui.base.BaseView
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginData
|
import io.github.wulkanowy.ui.modules.login.LoginData
|
||||||
|
import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo
|
||||||
|
|
||||||
interface LoginFormView : BaseView {
|
interface LoginFormView : BaseView {
|
||||||
|
|
||||||
@ -79,7 +80,7 @@ interface LoginFormView : BaseView {
|
|||||||
|
|
||||||
fun openFaqPage()
|
fun openFaqPage()
|
||||||
|
|
||||||
fun openEmail(lastError: String)
|
fun openEmail(supportInfo: LoginSupportInfo)
|
||||||
|
|
||||||
fun openAdvancedLogin()
|
fun openAdvancedLogin()
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ class LoginRecoverPresenter @Inject constructor(
|
|||||||
|
|
||||||
fun updateFields() {
|
fun updateFields() {
|
||||||
view?.run {
|
view?.run {
|
||||||
setUsernameHint(if ("standard" in recoverHostValue) emailHintString else loginPeselEmailHintString)
|
setUsernameHint(if ("email" in recoverHostValue) emailHintString else loginPeselEmailHintString)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,7 +92,7 @@ class LoginRecoverPresenter @Inject constructor(
|
|||||||
isCorrect = false
|
isCorrect = false
|
||||||
}
|
}
|
||||||
|
|
||||||
if ("standard" in host && "@" !in username) {
|
if ("email" in host && "@" !in username) {
|
||||||
view?.setUsernameError(view?.invalidEmailString.orEmpty())
|
view?.setUsernameError(view?.invalidEmailString.orEmpty())
|
||||||
isCorrect = false
|
isCorrect = false
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,11 @@ import io.github.wulkanowy.data.pojos.RegisterUser
|
|||||||
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
||||||
import io.github.wulkanowy.databinding.FragmentLoginStudentSelectBinding
|
import io.github.wulkanowy.databinding.FragmentLoginStudentSelectBinding
|
||||||
import io.github.wulkanowy.ui.base.BaseFragment
|
import io.github.wulkanowy.ui.base.BaseFragment
|
||||||
|
import io.github.wulkanowy.ui.modules.auth.AuthDialog
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginActivity
|
import io.github.wulkanowy.ui.modules.login.LoginActivity
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginData
|
import io.github.wulkanowy.ui.modules.login.LoginData
|
||||||
|
import io.github.wulkanowy.ui.modules.login.support.LoginSupportDialog
|
||||||
|
import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo
|
||||||
import io.github.wulkanowy.utils.AppInfo
|
import io.github.wulkanowy.utils.AppInfo
|
||||||
import io.github.wulkanowy.utils.openEmailClient
|
import io.github.wulkanowy.utils.openEmailClient
|
||||||
import io.github.wulkanowy.utils.openInternetBrowser
|
import io.github.wulkanowy.utils.openInternetBrowser
|
||||||
@ -106,21 +109,8 @@ class LoginStudentSelectFragment :
|
|||||||
context?.openInternetBrowser("https://discord.gg/vccAQBr", ::showMessage)
|
context?.openInternetBrowser("https://discord.gg/vccAQBr", ::showMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun openEmail(lastError: String) {
|
override fun openEmail(supportInfo: LoginSupportInfo) {
|
||||||
context?.openEmailClient(
|
LoginSupportDialog.newInstance(supportInfo).show(childFragmentManager, "support_dialog")
|
||||||
chooserTitle = requireContext().getString(R.string.login_email_intent_title),
|
|
||||||
email = "wulkanowyinc@gmail.com",
|
|
||||||
subject = requireContext().getString(R.string.login_email_subject),
|
|
||||||
body = requireContext().getString(
|
|
||||||
R.string.login_email_text,
|
|
||||||
"${appInfo.systemManufacturer} ${appInfo.systemModel}",
|
|
||||||
appInfo.systemVersion.toString(),
|
|
||||||
"${appInfo.versionName}-${appInfo.buildFlavor}",
|
|
||||||
"Select users to log in",
|
|
||||||
preferencesRepository.installationId,
|
|
||||||
lastError
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
|
@ -9,23 +9,25 @@ import io.github.wulkanowy.data.pojos.RegisterStudent
|
|||||||
import io.github.wulkanowy.data.pojos.RegisterSymbol
|
import io.github.wulkanowy.data.pojos.RegisterSymbol
|
||||||
import io.github.wulkanowy.data.pojos.RegisterUnit
|
import io.github.wulkanowy.data.pojos.RegisterUnit
|
||||||
import io.github.wulkanowy.data.pojos.RegisterUser
|
import io.github.wulkanowy.data.pojos.RegisterUser
|
||||||
|
import io.github.wulkanowy.data.repositories.SchoolsRepository
|
||||||
import io.github.wulkanowy.data.repositories.StudentRepository
|
import io.github.wulkanowy.data.repositories.StudentRepository
|
||||||
import io.github.wulkanowy.data.resourceFlow
|
import io.github.wulkanowy.data.resourceFlow
|
||||||
import io.github.wulkanowy.sdk.scrapper.login.AccountPermissionException
|
|
||||||
import io.github.wulkanowy.sdk.scrapper.login.InvalidSymbolException
|
import io.github.wulkanowy.sdk.scrapper.login.InvalidSymbolException
|
||||||
import io.github.wulkanowy.services.sync.SyncManager
|
import io.github.wulkanowy.services.sync.SyncManager
|
||||||
import io.github.wulkanowy.ui.base.BasePresenter
|
import io.github.wulkanowy.ui.base.BasePresenter
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginData
|
import io.github.wulkanowy.ui.modules.login.LoginData
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginErrorHandler
|
import io.github.wulkanowy.ui.modules.login.LoginErrorHandler
|
||||||
|
import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo
|
||||||
import io.github.wulkanowy.utils.AnalyticsHelper
|
import io.github.wulkanowy.utils.AnalyticsHelper
|
||||||
import io.github.wulkanowy.utils.AppInfo
|
import io.github.wulkanowy.utils.AppInfo
|
||||||
import io.github.wulkanowy.utils.ifNullOrBlank
|
import io.github.wulkanowy.utils.isCurrent
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class LoginStudentSelectPresenter @Inject constructor(
|
class LoginStudentSelectPresenter @Inject constructor(
|
||||||
studentRepository: StudentRepository,
|
studentRepository: StudentRepository,
|
||||||
|
private val schoolsRepository: SchoolsRepository,
|
||||||
private val loginErrorHandler: LoginErrorHandler,
|
private val loginErrorHandler: LoginErrorHandler,
|
||||||
private val syncManager: SyncManager,
|
private val syncManager: SyncManager,
|
||||||
private val analytics: AnalyticsHelper,
|
private val analytics: AnalyticsHelper,
|
||||||
@ -71,7 +73,14 @@ class LoginStudentSelectPresenter @Inject constructor(
|
|||||||
students = it.dataOrNull.orEmpty()
|
students = it.dataOrNull.orEmpty()
|
||||||
when (it) {
|
when (it) {
|
||||||
is Resource.Loading -> Timber.d("Login student select students load started")
|
is Resource.Loading -> Timber.d("Login student select students load started")
|
||||||
is Resource.Success -> refreshItems()
|
is Resource.Success -> {
|
||||||
|
getStudentsWithCurrentlyActiveSemesters()
|
||||||
|
selectedStudents.clear()
|
||||||
|
selectedStudents.addAll(getStudentsWithCurrentlyActiveSemesters())
|
||||||
|
view?.enableSignIn(selectedStudents.isNotEmpty())
|
||||||
|
refreshItems()
|
||||||
|
}
|
||||||
|
|
||||||
is Resource.Error -> {
|
is Resource.Error -> {
|
||||||
errorHandler.dispatch(it.error)
|
errorHandler.dispatch(it.error)
|
||||||
lastError = it.error
|
lastError = it.error
|
||||||
@ -81,6 +90,23 @@ class LoginStudentSelectPresenter @Inject constructor(
|
|||||||
}.launch()
|
}.launch()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getStudentsWithCurrentlyActiveSemesters(): List<LoginStudentSelectItem.Student> {
|
||||||
|
val students = registerUser.symbols.flatMap { symbol ->
|
||||||
|
symbol.schools.flatMap { unit ->
|
||||||
|
unit.students.map {
|
||||||
|
createStudentItem(it, symbol, unit, students)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return students
|
||||||
|
.filter { it.isEnabled }
|
||||||
|
.filter { student ->
|
||||||
|
student.student.semesters.any { semester ->
|
||||||
|
semester.isCurrent()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun createItems(): List<LoginStudentSelectItem> = buildList {
|
private fun createItems(): List<LoginStudentSelectItem> = buildList {
|
||||||
val notEmptySymbols = registerUser.symbols.filter { it.schools.isNotEmpty() }
|
val notEmptySymbols = registerUser.symbols.filter { it.schools.isNotEmpty() }
|
||||||
val emptySymbols = registerUser.symbols.filter { it.schools.isEmpty() }
|
val emptySymbols = registerUser.symbols.filter { it.schools.isEmpty() }
|
||||||
@ -236,17 +262,20 @@ class LoginStudentSelectPresenter @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun registerStudents(students: List<LoginStudentSelectItem>) {
|
private fun registerStudents(students: List<LoginStudentSelectItem>) {
|
||||||
val studentsWithSemesters = students
|
val filteredStudents = students.filterIsInstance<LoginStudentSelectItem.Student>()
|
||||||
.filterIsInstance<LoginStudentSelectItem.Student>().map { item ->
|
val studentsWithSemesters = filteredStudents.map { item ->
|
||||||
item.student.mapToStudentWithSemesters(
|
item.student.mapToStudentWithSemesters(
|
||||||
user = registerUser,
|
user = registerUser,
|
||||||
symbol = item.symbol,
|
symbol = item.symbol,
|
||||||
scrapperDomainSuffix = loginData.domainSuffix,
|
scrapperDomainSuffix = loginData.domainSuffix,
|
||||||
unit = item.unit,
|
unit = item.unit,
|
||||||
colors = appInfo.defaultColorsForAvatar,
|
colors = appInfo.defaultColorsForAvatar,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
resourceFlow { studentRepository.saveStudents(studentsWithSemesters) }
|
resourceFlow {
|
||||||
|
studentRepository.saveStudents(studentsWithSemesters)
|
||||||
|
schoolsRepository.logSchoolLogin(loginData, studentsWithSemesters)
|
||||||
|
}
|
||||||
.logResourceStatus("registration")
|
.logResourceStatus("registration")
|
||||||
.onEach {
|
.onEach {
|
||||||
when (it) {
|
when (it) {
|
||||||
@ -254,11 +283,13 @@ class LoginStudentSelectPresenter @Inject constructor(
|
|||||||
showProgress(true)
|
showProgress(true)
|
||||||
showContent(false)
|
showContent(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
is Resource.Success -> {
|
is Resource.Success -> {
|
||||||
syncManager.startOneTimeSyncWorker(quiet = true)
|
syncManager.startOneTimeSyncWorker(quiet = true)
|
||||||
view?.navigateToNext()
|
view?.navigateToNext()
|
||||||
logRegisterEvent(studentsWithSemesters)
|
logRegisterEvent(studentsWithSemesters)
|
||||||
}
|
}
|
||||||
|
|
||||||
is Resource.Error -> {
|
is Resource.Error -> {
|
||||||
view?.apply {
|
view?.apply {
|
||||||
showProgress(false)
|
showProgress(false)
|
||||||
@ -281,28 +312,14 @@ class LoginStudentSelectPresenter @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun onEmailClick() {
|
private fun onEmailClick() {
|
||||||
view?.openEmail(lastError?.message.ifNullOrBlank {
|
view?.openEmail(
|
||||||
loginData.baseUrl + "/" + loginData.symbol + "\n" + registerUser.symbols.filterNot {
|
LoginSupportInfo(
|
||||||
(it.error is AccountPermissionException || it.error is InvalidSymbolException) && it.symbol != loginData.symbol
|
loginData = loginData,
|
||||||
}.joinToString(";\n") { symbol ->
|
registerUser = registerUser,
|
||||||
buildString {
|
lastErrorMessage = lastError?.message,
|
||||||
append(" -")
|
enteredSymbol = loginData.symbol,
|
||||||
append(symbol.symbol)
|
)
|
||||||
append("(${symbol.error?.message?.let { it.take(46) + "..." } ?: symbol.schools.size})")
|
)
|
||||||
if (symbol.schools.isNotEmpty()) {
|
|
||||||
append(": ")
|
|
||||||
}
|
|
||||||
append(symbol.schools.joinToString(", ") { unit ->
|
|
||||||
buildString {
|
|
||||||
append(unit.schoolShortName)
|
|
||||||
append("(${unit.error?.message?.let { it.take(46) + "..." } ?: unit.students.size})")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} + "\nPozostałe: " + registerUser.symbols.filter {
|
|
||||||
it.error is AccountPermissionException || it.error is InvalidSymbolException
|
|
||||||
}.joinToString(", ") { it.symbol }
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun logRegisterEvent(
|
private fun logRegisterEvent(
|
||||||
|
@ -2,6 +2,7 @@ package io.github.wulkanowy.ui.modules.login.studentselect
|
|||||||
|
|
||||||
import io.github.wulkanowy.ui.base.BaseView
|
import io.github.wulkanowy.ui.base.BaseView
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginData
|
import io.github.wulkanowy.ui.modules.login.LoginData
|
||||||
|
import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo
|
||||||
|
|
||||||
interface LoginStudentSelectView : BaseView {
|
interface LoginStudentSelectView : BaseView {
|
||||||
|
|
||||||
@ -23,5 +24,5 @@ interface LoginStudentSelectView : BaseView {
|
|||||||
|
|
||||||
fun openDiscordInvite()
|
fun openDiscordInvite()
|
||||||
|
|
||||||
fun openEmail(lastError: String)
|
fun openEmail(supportInfo: LoginSupportInfo)
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,149 @@
|
|||||||
|
package io.github.wulkanowy.ui.modules.login.support
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.util.Patterns
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.core.os.bundleOf
|
||||||
|
import androidx.core.widget.doOnTextChanged
|
||||||
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
import io.github.wulkanowy.R
|
||||||
|
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
||||||
|
import io.github.wulkanowy.databinding.DialogLoginSupportBinding
|
||||||
|
import io.github.wulkanowy.sdk.scrapper.login.AccountPermissionException
|
||||||
|
import io.github.wulkanowy.sdk.scrapper.login.InvalidSymbolException
|
||||||
|
import io.github.wulkanowy.ui.base.BaseDialogFragment
|
||||||
|
import io.github.wulkanowy.utils.AppInfo
|
||||||
|
import io.github.wulkanowy.utils.openEmailClient
|
||||||
|
import io.github.wulkanowy.utils.serializable
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
@AndroidEntryPoint
|
||||||
|
class LoginSupportDialog : BaseDialogFragment<DialogLoginSupportBinding>() {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var appInfo: AppInfo
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var preferencesRepository: PreferencesRepository
|
||||||
|
|
||||||
|
private lateinit var supportInfo: LoginSupportInfo
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val ARGUMENT_KEY = "info"
|
||||||
|
|
||||||
|
fun newInstance(info: LoginSupportInfo) = LoginSupportDialog().apply {
|
||||||
|
arguments = bundleOf(ARGUMENT_KEY to info)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setStyle(STYLE_NO_FRAME, R.style.WulkanowyTheme_NoActionBar)
|
||||||
|
supportInfo = requireArguments().serializable(ARGUMENT_KEY)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateView(
|
||||||
|
inflater: LayoutInflater,
|
||||||
|
container: ViewGroup?,
|
||||||
|
savedInstanceState: Bundle?
|
||||||
|
): View {
|
||||||
|
val binding = DialogLoginSupportBinding.inflate(inflater)
|
||||||
|
.apply { binding = this }
|
||||||
|
binding.dialogLoginSupportToolbar.setNavigationOnClickListener { dismiss() }
|
||||||
|
return binding.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
with(binding) {
|
||||||
|
dialogLoginSupportSchoolInput.doOnTextChanged { _, _, _, _ ->
|
||||||
|
with(dialogLoginSupportSchoolLayout) {
|
||||||
|
isErrorEnabled = false
|
||||||
|
error = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dialogLoginSupportSubmit.setOnClickListener { onSubmitClick() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun onSubmitClick() {
|
||||||
|
when {
|
||||||
|
binding.dialogLoginSupportSchoolInput.text.isNullOrBlank() -> {
|
||||||
|
with(binding.dialogLoginSupportSchoolLayout) {
|
||||||
|
isErrorEnabled = true
|
||||||
|
error = getString(R.string.error_field_required)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Patterns.EMAIL_ADDRESS.matcher(
|
||||||
|
binding.dialogLoginSupportSchoolInput.text.toString()
|
||||||
|
).matches() -> {
|
||||||
|
with(binding.dialogLoginSupportSchoolLayout) {
|
||||||
|
isErrorEnabled = true
|
||||||
|
error = getString(R.string.login_support_school_invalid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> {
|
||||||
|
openEmailClientWithFilledTemplate()
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun openEmailClientWithFilledTemplate() {
|
||||||
|
with(binding) {
|
||||||
|
context?.openEmailClient(
|
||||||
|
chooserTitle = requireContext().getString(R.string.login_email_intent_title),
|
||||||
|
email = "wulkanowyinc@gmail.com",
|
||||||
|
subject = requireContext().getString(R.string.login_email_subject),
|
||||||
|
body = requireContext().getString(
|
||||||
|
R.string.login_email_text,
|
||||||
|
"${appInfo.systemManufacturer} ${appInfo.systemModel}",
|
||||||
|
appInfo.systemVersion.toString(),
|
||||||
|
"${appInfo.versionName}-${appInfo.buildFlavor}",
|
||||||
|
supportInfo.loginData.baseUrl + "/" + supportInfo.loginData.symbol,
|
||||||
|
preferencesRepository.installationId,
|
||||||
|
getLastErrorFromStudentSelectScreen(),
|
||||||
|
dialogLoginSupportSchoolInput.text.takeIf { !it.isNullOrBlank() }
|
||||||
|
?: return@with,
|
||||||
|
dialogLoginSupportAdditionalInput.text,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getLastErrorFromStudentSelectScreen(): String {
|
||||||
|
if (!supportInfo.lastErrorMessage.isNullOrBlank()) {
|
||||||
|
return supportInfo.lastErrorMessage!!
|
||||||
|
}
|
||||||
|
if (supportInfo.registerUser?.symbols.isNullOrEmpty()) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return "\n" + supportInfo.registerUser?.symbols?.filterNot {
|
||||||
|
(it.error is AccountPermissionException || it.error is InvalidSymbolException) &&
|
||||||
|
it.symbol != supportInfo.enteredSymbol
|
||||||
|
}?.joinToString(";\n") { symbol ->
|
||||||
|
buildString {
|
||||||
|
append(" -")
|
||||||
|
append(symbol.symbol)
|
||||||
|
append("(${symbol.error?.message?.let { it.take(46) + "..." } ?: symbol.schools.size})")
|
||||||
|
if (symbol.schools.isNotEmpty()) {
|
||||||
|
append(": ")
|
||||||
|
}
|
||||||
|
append(symbol.schools.joinToString(", ") { unit ->
|
||||||
|
buildString {
|
||||||
|
append(unit.schoolShortName)
|
||||||
|
append("(${unit.error?.message?.let { it.take(46) + "..." } ?: unit.students.size})")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} + "\nPozostałe: " + supportInfo.registerUser?.symbols?.filter {
|
||||||
|
it.error is AccountPermissionException || it.error is InvalidSymbolException
|
||||||
|
}?.joinToString(", ") { it.symbol }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package io.github.wulkanowy.ui.modules.login.support
|
||||||
|
|
||||||
|
import io.github.wulkanowy.data.pojos.RegisterUser
|
||||||
|
import io.github.wulkanowy.ui.modules.login.LoginData
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
data class LoginSupportInfo(
|
||||||
|
val loginData: LoginData,
|
||||||
|
val registerUser: RegisterUser?,
|
||||||
|
val lastErrorMessage: String?,
|
||||||
|
val enteredSymbol: String?,
|
||||||
|
) : Serializable
|
@ -18,7 +18,13 @@ import io.github.wulkanowy.databinding.FragmentLoginSymbolBinding
|
|||||||
import io.github.wulkanowy.ui.base.BaseFragment
|
import io.github.wulkanowy.ui.base.BaseFragment
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginActivity
|
import io.github.wulkanowy.ui.modules.login.LoginActivity
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginData
|
import io.github.wulkanowy.ui.modules.login.LoginData
|
||||||
import io.github.wulkanowy.utils.*
|
import io.github.wulkanowy.ui.modules.login.support.LoginSupportDialog
|
||||||
|
import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo
|
||||||
|
import io.github.wulkanowy.utils.AppInfo
|
||||||
|
import io.github.wulkanowy.utils.hideSoftInput
|
||||||
|
import io.github.wulkanowy.utils.openInternetBrowser
|
||||||
|
import io.github.wulkanowy.utils.serializable
|
||||||
|
import io.github.wulkanowy.utils.showSoftInput
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
@ -100,6 +106,13 @@ class LoginSymbolFragment :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun setErrorSymbolDefinitelyInvalid() {
|
||||||
|
with(binding.loginSymbolNameLayout) {
|
||||||
|
requestFocus()
|
||||||
|
error = getString(R.string.login_invalid_symbol_definitely)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun setErrorSymbolRequire() {
|
override fun setErrorSymbolRequire() {
|
||||||
setErrorSymbol(getString(R.string.error_field_required))
|
setErrorSymbol(getString(R.string.error_field_required))
|
||||||
}
|
}
|
||||||
@ -163,20 +176,7 @@ class LoginSymbolFragment :
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun openEmail(host: String, lastError: String) {
|
override fun openSupportDialog(supportInfo: LoginSupportInfo) {
|
||||||
context?.openEmailClient(
|
LoginSupportDialog.newInstance(supportInfo).show(childFragmentManager, "support_dialog")
|
||||||
chooserTitle = requireContext().getString(R.string.login_email_intent_title),
|
|
||||||
email = "wulkanowyinc@gmail.com",
|
|
||||||
subject = requireContext().getString(R.string.login_email_subject),
|
|
||||||
body = requireContext().getString(
|
|
||||||
R.string.login_email_text,
|
|
||||||
"${appInfo.systemManufacturer} ${appInfo.systemModel}",
|
|
||||||
appInfo.systemVersion.toString(),
|
|
||||||
"${appInfo.versionName}-${appInfo.buildFlavor}",
|
|
||||||
"$host/${binding.loginSymbolName.text}",
|
|
||||||
preferencesRepository.installationId,
|
|
||||||
lastError
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import io.github.wulkanowy.sdk.scrapper.login.InvalidSymbolException
|
|||||||
import io.github.wulkanowy.ui.base.BasePresenter
|
import io.github.wulkanowy.ui.base.BasePresenter
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginData
|
import io.github.wulkanowy.ui.modules.login.LoginData
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginErrorHandler
|
import io.github.wulkanowy.ui.modules.login.LoginErrorHandler
|
||||||
|
import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo
|
||||||
import io.github.wulkanowy.utils.AnalyticsHelper
|
import io.github.wulkanowy.utils.AnalyticsHelper
|
||||||
import io.github.wulkanowy.utils.ifNullOrBlank
|
import io.github.wulkanowy.utils.ifNullOrBlank
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
@ -53,6 +54,10 @@ class LoginSymbolPresenter @Inject constructor(
|
|||||||
view?.setErrorSymbolRequire()
|
view?.setErrorSymbolRequire()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if (isFormDefinitelyInvalid()) {
|
||||||
|
view?.setErrorSymbolDefinitelyInvalid()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
loginData = loginData.copy(
|
loginData = loginData.copy(
|
||||||
symbol = view?.symbolValue?.getNormalizedSymbol(),
|
symbol = view?.symbolValue?.getNormalizedSymbol(),
|
||||||
@ -74,6 +79,7 @@ class LoginSymbolPresenter @Inject constructor(
|
|||||||
showProgress(true)
|
showProgress(true)
|
||||||
showContent(false)
|
showContent(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
is Resource.Success -> {
|
is Resource.Success -> {
|
||||||
when (user.data.symbols.size) {
|
when (user.data.symbols.size) {
|
||||||
0 -> {
|
0 -> {
|
||||||
@ -83,6 +89,7 @@ class LoginSymbolPresenter @Inject constructor(
|
|||||||
showContact(true)
|
showContact(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
val enteredSymbolDetails = user.data.symbols
|
val enteredSymbolDetails = user.data.symbols
|
||||||
.firstOrNull()
|
.firstOrNull()
|
||||||
@ -107,6 +114,7 @@ class LoginSymbolPresenter @Inject constructor(
|
|||||||
"error" to "No error"
|
"error" to "No error"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
is Resource.Error -> {
|
is Resource.Error -> {
|
||||||
Timber.i("Login with symbol result: An exception occurred")
|
Timber.i("Login with symbol result: An exception occurred")
|
||||||
analytics.logEvent(
|
analytics.logEvent(
|
||||||
@ -130,17 +138,25 @@ class LoginSymbolPresenter @Inject constructor(
|
|||||||
}.launch("login")
|
}.launch("login")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun isFormDefinitelyInvalid(): Boolean {
|
||||||
|
val definitelyInvalidSymbols = listOf("vulcan", "uonet", "wulkanowy", "standardowa")
|
||||||
|
val normalizedSymbol = view?.symbolValue.orEmpty().getNormalizedSymbol()
|
||||||
|
|
||||||
|
return normalizedSymbol in definitelyInvalidSymbols
|
||||||
|
}
|
||||||
|
|
||||||
fun onFaqClick() {
|
fun onFaqClick() {
|
||||||
view?.openFaqPage()
|
view?.openFaqPage()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onEmailClick() {
|
fun onEmailClick() {
|
||||||
view?.openEmail(loginData.baseUrl, lastError?.message.ifNullOrBlank {
|
view?.openSupportDialog(
|
||||||
registerUser?.symbols?.flatMap { symbol ->
|
LoginSupportInfo(
|
||||||
symbol.schools.map { it.error?.message } + symbol.error?.message
|
loginData = loginData,
|
||||||
}?.filterNotNull()?.distinct()?.joinToString(";") {
|
registerUser = registerUser,
|
||||||
it.take(46) + "..."
|
lastErrorMessage = lastError?.message,
|
||||||
} ?: "blank"
|
enteredSymbol = view?.symbolValue,
|
||||||
})
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package io.github.wulkanowy.ui.modules.login.symbol
|
|||||||
import io.github.wulkanowy.data.pojos.RegisterUser
|
import io.github.wulkanowy.data.pojos.RegisterUser
|
||||||
import io.github.wulkanowy.ui.base.BaseView
|
import io.github.wulkanowy.ui.base.BaseView
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginData
|
import io.github.wulkanowy.ui.modules.login.LoginData
|
||||||
|
import io.github.wulkanowy.ui.modules.login.support.LoginSupportInfo
|
||||||
|
|
||||||
interface LoginSymbolView : BaseView {
|
interface LoginSymbolView : BaseView {
|
||||||
|
|
||||||
@ -18,6 +19,8 @@ interface LoginSymbolView : BaseView {
|
|||||||
|
|
||||||
fun setErrorSymbolInvalid()
|
fun setErrorSymbolInvalid()
|
||||||
|
|
||||||
|
fun setErrorSymbolDefinitelyInvalid()
|
||||||
|
|
||||||
fun setErrorSymbolRequire()
|
fun setErrorSymbolRequire()
|
||||||
|
|
||||||
fun setErrorSymbol(message: String)
|
fun setErrorSymbol(message: String)
|
||||||
@ -40,5 +43,5 @@ interface LoginSymbolView : BaseView {
|
|||||||
|
|
||||||
fun openFaqPage()
|
fun openFaqPage()
|
||||||
|
|
||||||
fun openEmail(host: String, lastError: String)
|
fun openSupportDialog(supportInfo: LoginSupportInfo)
|
||||||
}
|
}
|
||||||
|
@ -119,7 +119,6 @@ class MainActivity : BaseActivity<MainPresenter, ActivityMainBinding>(), MainVie
|
|||||||
|
|
||||||
//https://developer.android.com/guide/playcore/in-app-updates#status_callback
|
//https://developer.android.com/guide/playcore/in-app-updates#status_callback
|
||||||
@Deprecated("Deprecated in Java")
|
@Deprecated("Deprecated in Java")
|
||||||
@Suppress("DEPRECATION")
|
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
super.onActivityResult(requestCode, resultCode, data)
|
super.onActivityResult(requestCode, resultCode, data)
|
||||||
updateHelper.onActivityResult(requestCode, resultCode)
|
updateHelper.onActivityResult(requestCode, resultCode)
|
||||||
|
@ -58,7 +58,10 @@ class TeacherPresenter @Inject constructor(
|
|||||||
.logResourceStatus("load teachers data")
|
.logResourceStatus("load teachers data")
|
||||||
.onResourceData {
|
.onResourceData {
|
||||||
view?.run {
|
view?.run {
|
||||||
updateData(it.filter { item -> item.name.isNotBlank() })
|
updateData(it
|
||||||
|
.filter { item -> item.name.isNotBlank() }
|
||||||
|
.sortedBy { it.name }
|
||||||
|
)
|
||||||
showContent(it.isNotEmpty())
|
showContent(it.isNotEmpty())
|
||||||
showEmpty(it.isEmpty())
|
showEmpty(it.isEmpty())
|
||||||
showErrorView(false)
|
showErrorView(false)
|
||||||
|
@ -35,7 +35,7 @@ class AdvancedFragment : PreferenceFragmentCompat(),
|
|||||||
setPreferencesFromResource(R.xml.scheme_preferences_advanced, rootKey)
|
setPreferencesFromResource(R.xml.scheme_preferences_advanced, rootKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
|
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
|
||||||
presenter.onSharedPreferenceChanged(key)
|
presenter.onSharedPreferenceChanged(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,7 +18,8 @@ class AdvancedPresenter @Inject constructor(
|
|||||||
Timber.i("Settings advanced view was initialized")
|
Timber.i("Settings advanced view was initialized")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onSharedPreferenceChanged(key: String) {
|
fun onSharedPreferenceChanged(key: String?) {
|
||||||
|
key ?: return
|
||||||
Timber.i("Change settings $key")
|
Timber.i("Change settings $key")
|
||||||
analytics.logEvent("setting_changed", "name" to key)
|
analytics.logEvent("setting_changed", "name" to key)
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,7 @@ class AppearanceFragment : PreferenceFragmentCompat(),
|
|||||||
setPreferencesFromResource(R.xml.scheme_preferences_appearance, rootKey)
|
setPreferencesFromResource(R.xml.scheme_preferences_appearance, rootKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
|
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
|
||||||
presenter.onSharedPreferenceChanged(key)
|
presenter.onSharedPreferenceChanged(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,8 @@ class AppearancePresenter @Inject constructor(
|
|||||||
Timber.i("Settings appearance view was initialized")
|
Timber.i("Settings appearance view was initialized")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onSharedPreferenceChanged(key: String) {
|
fun onSharedPreferenceChanged(key: String?) {
|
||||||
|
key ?: return
|
||||||
Timber.i("Change settings $key")
|
Timber.i("Change settings $key")
|
||||||
|
|
||||||
preferencesRepository.apply {
|
preferencesRepository.apply {
|
||||||
|
@ -114,7 +114,7 @@ class NotificationsFragment : PreferenceFragmentCompat(),
|
|||||||
setPreferencesFromResource(R.xml.scheme_preferences_notifications, rootKey)
|
setPreferencesFromResource(R.xml.scheme_preferences_notifications, rootKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
|
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
|
||||||
presenter.onSharedPreferenceChanged(key)
|
presenter.onSharedPreferenceChanged(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,7 +38,8 @@ class NotificationsPresenter @Inject constructor(
|
|||||||
Timber.i("Settings notifications view was initialized")
|
Timber.i("Settings notifications view was initialized")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onSharedPreferenceChanged(key: String) {
|
fun onSharedPreferenceChanged(key: String?) {
|
||||||
|
key ?: return
|
||||||
Timber.i("Change settings $key")
|
Timber.i("Change settings $key")
|
||||||
|
|
||||||
preferencesRepository.apply {
|
preferencesRepository.apply {
|
||||||
|
@ -52,7 +52,7 @@ class SyncFragment : PreferenceFragmentCompat(),
|
|||||||
setPreferencesFromResource(R.xml.scheme_preferences_sync, rootKey)
|
setPreferencesFromResource(R.xml.scheme_preferences_sync, rootKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
|
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
|
||||||
presenter.onSharedPreferenceChanged(key)
|
presenter.onSharedPreferenceChanged(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +31,8 @@ class SyncPresenter @Inject constructor(
|
|||||||
setSyncDateInView()
|
setSyncDateInView()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onSharedPreferenceChanged(key: String) {
|
fun onSharedPreferenceChanged(key: String?) {
|
||||||
|
key ?: return
|
||||||
Timber.i("Change settings $key")
|
Timber.i("Change settings $key")
|
||||||
|
|
||||||
preferencesRepository.apply {
|
preferencesRepository.apply {
|
||||||
@ -52,10 +53,12 @@ class SyncPresenter @Inject constructor(
|
|||||||
Timber.i("Setting sync now started")
|
Timber.i("Setting sync now started")
|
||||||
analytics.logEvent("sync_now", "status" to "started")
|
analytics.logEvent("sync_now", "status" to "started")
|
||||||
}
|
}
|
||||||
|
|
||||||
WorkInfo.State.SUCCEEDED -> {
|
WorkInfo.State.SUCCEEDED -> {
|
||||||
showMessage(syncSuccessString)
|
showMessage(syncSuccessString)
|
||||||
analytics.logEvent("sync_now", "status" to "success")
|
analytics.logEvent("sync_now", "status" to "success")
|
||||||
}
|
}
|
||||||
|
|
||||||
WorkInfo.State.FAILED -> {
|
WorkInfo.State.FAILED -> {
|
||||||
showError(
|
showError(
|
||||||
syncFailedString,
|
syncFailedString,
|
||||||
@ -66,6 +69,7 @@ class SyncPresenter @Inject constructor(
|
|||||||
)
|
)
|
||||||
analytics.logEvent("sync_now", "status" to "failed")
|
analytics.logEvent("sync_now", "status" to "failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> Timber.d("Sync now state: ${workInfo?.state}")
|
else -> Timber.d("Sync now state: ${workInfo?.state}")
|
||||||
}
|
}
|
||||||
if (workInfo?.state?.isFinished == true) {
|
if (workInfo?.state?.isFinished == true) {
|
||||||
|
@ -325,7 +325,7 @@ class TimetableAdapter @Inject constructor() :
|
|||||||
|
|
||||||
override fun getChangePayload(oldItem: TimetableItem, newItem: TimetableItem): Any? {
|
override fun getChangePayload(oldItem: TimetableItem, newItem: TimetableItem): Any? {
|
||||||
return if (oldItem is TimetableItem.Normal && newItem is TimetableItem.Normal) {
|
return if (oldItem is TimetableItem.Normal && newItem is TimetableItem.Normal) {
|
||||||
if (oldItem.lesson == newItem.lesson && oldItem.timeLeft != newItem.timeLeft) {
|
if (oldItem.lesson == newItem.lesson && oldItem.showGroupsInPlan == newItem.showGroupsInPlan && oldItem.timeLeft != newItem.timeLeft) {
|
||||||
"time_left"
|
"time_left"
|
||||||
} else super.getChangePayload(oldItem, newItem)
|
} else super.getChangePayload(oldItem, newItem)
|
||||||
} else super.getChangePayload(oldItem, newItem)
|
} else super.getChangePayload(oldItem, newItem)
|
||||||
|
@ -9,6 +9,7 @@ import android.view.View.GONE
|
|||||||
import android.view.View.VISIBLE
|
import android.view.View.VISIBLE
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.core.text.parseAsHtml
|
import androidx.core.text.parseAsHtml
|
||||||
|
import androidx.core.view.isVisible
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import io.github.wulkanowy.R
|
import io.github.wulkanowy.R
|
||||||
@ -160,6 +161,10 @@ class TimetableFragment : BaseFragment<FragmentTimetableBinding>(R.layout.fragme
|
|||||||
binding.timetableRecycler.visibility = if (show) VISIBLE else GONE
|
binding.timetableRecycler.visibility = if (show) VISIBLE else GONE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun showNavigation(show: Boolean) {
|
||||||
|
binding.timetableNavContainer.isVisible = true
|
||||||
|
}
|
||||||
|
|
||||||
override fun showPreButton(show: Boolean) {
|
override fun showPreButton(show: Boolean) {
|
||||||
binding.timetablePreviousButton.visibility = if (show) VISIBLE else View.INVISIBLE
|
binding.timetablePreviousButton.visibility = if (show) VISIBLE else View.INVISIBLE
|
||||||
}
|
}
|
||||||
@ -193,7 +198,9 @@ class TimetableFragment : BaseFragment<FragmentTimetableBinding>(R.layout.fragme
|
|||||||
|
|
||||||
override fun onSaveInstanceState(outState: Bundle) {
|
override fun onSaveInstanceState(outState: Bundle) {
|
||||||
super.onSaveInstanceState(outState)
|
super.onSaveInstanceState(outState)
|
||||||
outState.putLong(SAVED_DATE_KEY, presenter.currentDate.toEpochDay())
|
presenter.currentDate?.toEpochDay()?.let {
|
||||||
|
outState.putLong(SAVED_DATE_KEY, it)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
package io.github.wulkanowy.ui.modules.timetable
|
package io.github.wulkanowy.ui.modules.timetable
|
||||||
|
|
||||||
|
import android.os.Handler
|
||||||
|
import android.os.Looper
|
||||||
|
import io.github.wulkanowy.data.dataOrNull
|
||||||
|
import io.github.wulkanowy.data.db.entities.Semester
|
||||||
|
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.enums.TimetableGapsMode.BETWEEN_AND_BEFORE_LESSONS
|
import io.github.wulkanowy.data.enums.TimetableGapsMode.BETWEEN_AND_BEFORE_LESSONS
|
||||||
import io.github.wulkanowy.data.enums.TimetableGapsMode.NO_GAPS
|
import io.github.wulkanowy.data.enums.TimetableGapsMode.NO_GAPS
|
||||||
@ -15,6 +20,8 @@ import io.github.wulkanowy.data.repositories.PreferencesRepository
|
|||||||
import io.github.wulkanowy.data.repositories.SemesterRepository
|
import io.github.wulkanowy.data.repositories.SemesterRepository
|
||||||
import io.github.wulkanowy.data.repositories.StudentRepository
|
import io.github.wulkanowy.data.repositories.StudentRepository
|
||||||
import io.github.wulkanowy.data.repositories.TimetableRepository
|
import io.github.wulkanowy.data.repositories.TimetableRepository
|
||||||
|
import io.github.wulkanowy.data.toFirstResult
|
||||||
|
import io.github.wulkanowy.data.waitForResult
|
||||||
import io.github.wulkanowy.ui.base.BasePresenter
|
import io.github.wulkanowy.ui.base.BasePresenter
|
||||||
import io.github.wulkanowy.ui.base.ErrorHandler
|
import io.github.wulkanowy.ui.base.ErrorHandler
|
||||||
import io.github.wulkanowy.utils.AnalyticsHelper
|
import io.github.wulkanowy.utils.AnalyticsHelper
|
||||||
@ -24,15 +31,16 @@ import io.github.wulkanowy.utils.isHolidays
|
|||||||
import io.github.wulkanowy.utils.isJustFinished
|
import io.github.wulkanowy.utils.isJustFinished
|
||||||
import io.github.wulkanowy.utils.isShowTimeUntil
|
import io.github.wulkanowy.utils.isShowTimeUntil
|
||||||
import io.github.wulkanowy.utils.left
|
import io.github.wulkanowy.utils.left
|
||||||
|
import io.github.wulkanowy.utils.monday
|
||||||
import io.github.wulkanowy.utils.nextOrSameSchoolDay
|
import io.github.wulkanowy.utils.nextOrSameSchoolDay
|
||||||
import io.github.wulkanowy.utils.nextSchoolDay
|
import io.github.wulkanowy.utils.nextSchoolDay
|
||||||
import io.github.wulkanowy.utils.previousSchoolDay
|
import io.github.wulkanowy.utils.previousSchoolDay
|
||||||
|
import io.github.wulkanowy.utils.sunday
|
||||||
import io.github.wulkanowy.utils.toFormattedString
|
import io.github.wulkanowy.utils.toFormattedString
|
||||||
import io.github.wulkanowy.utils.until
|
import io.github.wulkanowy.utils.until
|
||||||
import kotlinx.coroutines.flow.catch
|
import kotlinx.coroutines.flow.firstOrNull
|
||||||
import kotlinx.coroutines.flow.flow
|
|
||||||
import kotlinx.coroutines.flow.onEach
|
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
import java.time.DayOfWeek
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
import java.time.LocalDate.now
|
import java.time.LocalDate.now
|
||||||
@ -51,9 +59,10 @@ class TimetablePresenter @Inject constructor(
|
|||||||
private val analytics: AnalyticsHelper,
|
private val analytics: AnalyticsHelper,
|
||||||
) : BasePresenter<TimetableView>(errorHandler, studentRepository) {
|
) : BasePresenter<TimetableView>(errorHandler, studentRepository) {
|
||||||
|
|
||||||
private var baseDate: LocalDate = now().nextOrSameSchoolDay
|
private var initialDate: LocalDate? = null
|
||||||
|
private var isWeekendHasLessons: Boolean = false
|
||||||
|
|
||||||
lateinit var currentDate: LocalDate
|
var currentDate: LocalDate? = null
|
||||||
private set
|
private set
|
||||||
|
|
||||||
private lateinit var lastError: Throwable
|
private lateinit var lastError: Throwable
|
||||||
@ -65,23 +74,30 @@ class TimetablePresenter @Inject constructor(
|
|||||||
view.initView()
|
view.initView()
|
||||||
Timber.i("Timetable was initialized")
|
Timber.i("Timetable was initialized")
|
||||||
errorHandler.showErrorMessage = ::showErrorViewOnError
|
errorHandler.showErrorMessage = ::showErrorViewOnError
|
||||||
reloadView(ofEpochDay(date ?: baseDate.toEpochDay()))
|
currentDate = date?.let(::ofEpochDay)
|
||||||
loadData()
|
loadData()
|
||||||
if (currentDate.isHolidays) setBaseDateOnHolidays()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onPreviousDay() {
|
fun onPreviousDay() {
|
||||||
reloadView(currentDate.previousSchoolDay)
|
val date = if (isWeekendHasLessons) {
|
||||||
|
currentDate?.minusDays(1)
|
||||||
|
} else currentDate?.previousSchoolDay
|
||||||
|
|
||||||
|
reloadView(date ?: return)
|
||||||
loadData()
|
loadData()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onNextDay() {
|
fun onNextDay() {
|
||||||
reloadView(currentDate.nextSchoolDay)
|
val date = if (isWeekendHasLessons) {
|
||||||
|
currentDate?.plusDays(1)
|
||||||
|
} else currentDate?.nextSchoolDay
|
||||||
|
|
||||||
|
reloadView(date ?: return)
|
||||||
loadData()
|
loadData()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onPickDate() {
|
fun onPickDate() {
|
||||||
view?.showDatePickerDialog(currentDate)
|
view?.showDatePickerDialog(currentDate ?: return)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onDateSet(year: Int, month: Int, day: Int) {
|
fun onDateSet(year: Int, month: Int, day: Int) {
|
||||||
@ -110,10 +126,8 @@ class TimetablePresenter @Inject constructor(
|
|||||||
Timber.i("Timetable view is reselected")
|
Timber.i("Timetable view is reselected")
|
||||||
view?.let { view ->
|
view?.let { view ->
|
||||||
if (view.currentStackSize == 1) {
|
if (view.currentStackSize == 1) {
|
||||||
baseDate = now().nextOrSameSchoolDay
|
if (currentDate != initialDate) {
|
||||||
|
reloadView(initialDate ?: return)
|
||||||
if (currentDate != baseDate) {
|
|
||||||
reloadView(baseDate)
|
|
||||||
loadData()
|
loadData()
|
||||||
} else if (!view.isViewEmpty) {
|
} else if (!view.isViewEmpty) {
|
||||||
view.resetView()
|
view.resetView()
|
||||||
@ -134,34 +148,25 @@ class TimetablePresenter @Inject constructor(
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setBaseDateOnHolidays() {
|
|
||||||
flow {
|
|
||||||
val student = studentRepository.getCurrentStudent()
|
|
||||||
emit(semesterRepository.getCurrentSemester(student))
|
|
||||||
}.catch {
|
|
||||||
Timber.i("Loading semester result: An exception occurred")
|
|
||||||
}.onEach {
|
|
||||||
baseDate = baseDate.getLastSchoolDayIfHoliday(it.schoolYear)
|
|
||||||
currentDate = baseDate
|
|
||||||
reloadNavigation()
|
|
||||||
}.launch("holidays")
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun loadData(forceRefresh: Boolean = false) {
|
private fun loadData(forceRefresh: Boolean = false) {
|
||||||
flatResourceFlow {
|
flatResourceFlow {
|
||||||
val student = studentRepository.getCurrentStudent()
|
val student = studentRepository.getCurrentStudent()
|
||||||
val semester = semesterRepository.getCurrentSemester(student)
|
val semester = semesterRepository.getCurrentSemester(student)
|
||||||
|
|
||||||
|
checkInitialAndCurrentDate(student, semester)
|
||||||
timetableRepository.getTimetable(
|
timetableRepository.getTimetable(
|
||||||
student = student,
|
student = student,
|
||||||
semester = semester,
|
semester = semester,
|
||||||
start = currentDate,
|
start = currentDate ?: now(),
|
||||||
end = currentDate,
|
end = currentDate ?: now(),
|
||||||
forceRefresh = forceRefresh,
|
forceRefresh = forceRefresh,
|
||||||
timetableType = TimetableRepository.TimetableType.NORMAL
|
timetableType = TimetableRepository.TimetableType.NORMAL
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
.logResourceStatus("load timetable data")
|
.logResourceStatus("load timetable data")
|
||||||
.onResourceData {
|
.onResourceData {
|
||||||
|
isWeekendHasLessons = isWeekendHasLessons || isWeekendHasLessons(it.lessons)
|
||||||
|
|
||||||
view?.run {
|
view?.run {
|
||||||
enableSwipe(true)
|
enableSwipe(true)
|
||||||
showProgress(false)
|
showProgress(false)
|
||||||
@ -169,7 +174,8 @@ class TimetablePresenter @Inject constructor(
|
|||||||
showContent(it.lessons.isNotEmpty())
|
showContent(it.lessons.isNotEmpty())
|
||||||
showEmpty(it.lessons.isEmpty())
|
showEmpty(it.lessons.isEmpty())
|
||||||
updateData(it.lessons)
|
updateData(it.lessons)
|
||||||
setDayHeaderMessage(it.headers.singleOrNull { header -> header.date == currentDate }?.content)
|
setDayHeaderMessage(it.headers.find { header -> header.date == currentDate }?.content)
|
||||||
|
reloadNavigation()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onResourceIntermediate { view?.showRefresh(true) }
|
.onResourceIntermediate { view?.showRefresh(true) }
|
||||||
@ -191,14 +197,54 @@ class TimetablePresenter @Inject constructor(
|
|||||||
.launch()
|
.launch()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private suspend fun checkInitialAndCurrentDate(student: Student, semester: Semester) {
|
||||||
|
if (initialDate == null) {
|
||||||
|
val lessons = timetableRepository.getTimetable(
|
||||||
|
student = student,
|
||||||
|
semester = semester,
|
||||||
|
start = now().monday,
|
||||||
|
end = now().sunday,
|
||||||
|
forceRefresh = false,
|
||||||
|
timetableType = TimetableRepository.TimetableType.NORMAL
|
||||||
|
).toFirstResult().dataOrNull?.lessons.orEmpty()
|
||||||
|
isWeekendHasLessons = isWeekendHasLessons(lessons)
|
||||||
|
initialDate = getInitialDate(semester)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentDate == null) {
|
||||||
|
currentDate = initialDate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isWeekendHasLessons(
|
||||||
|
lessons: List<Timetable>,
|
||||||
|
): Boolean = lessons.any {
|
||||||
|
it.date.dayOfWeek in listOf(
|
||||||
|
DayOfWeek.SATURDAY,
|
||||||
|
DayOfWeek.SUNDAY,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getInitialDate(semester: Semester): LocalDate {
|
||||||
|
val now = now()
|
||||||
|
|
||||||
|
return when {
|
||||||
|
now.isHolidays -> now.getLastSchoolDayIfHoliday(semester.schoolYear)
|
||||||
|
isWeekendHasLessons -> now
|
||||||
|
else -> now.nextOrSameSchoolDay
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun updateData(lessons: List<Timetable>) {
|
private fun updateData(lessons: List<Timetable>) {
|
||||||
tickTimer?.cancel()
|
tickTimer?.cancel()
|
||||||
|
|
||||||
if (!prefRepository.showTimetableTimers) {
|
if (currentDate != now()) {
|
||||||
view?.updateData(createItems(lessons))
|
view?.updateData(createItems(lessons))
|
||||||
} else {
|
} else {
|
||||||
tickTimer = timer(period = 2_000) {
|
tickTimer = timer(period = 2_000) {
|
||||||
view?.updateData(createItems(lessons))
|
Handler(Looper.getMainLooper()).post {
|
||||||
|
view?.updateData(createItems(lessons))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -285,7 +331,7 @@ class TimetablePresenter @Inject constructor(
|
|||||||
private fun reloadView(date: LocalDate) {
|
private fun reloadView(date: LocalDate) {
|
||||||
currentDate = date
|
currentDate = date
|
||||||
|
|
||||||
Timber.i("Reload timetable view with the date ${currentDate.toFormattedString()}")
|
Timber.i("Reload timetable view with the date ${currentDate?.toFormattedString()}")
|
||||||
view?.apply {
|
view?.apply {
|
||||||
showProgress(true)
|
showProgress(true)
|
||||||
enableSwipe(false)
|
enableSwipe(false)
|
||||||
@ -298,10 +344,13 @@ class TimetablePresenter @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun reloadNavigation() {
|
private fun reloadNavigation() {
|
||||||
|
val currentDate = currentDate ?: return
|
||||||
|
|
||||||
view?.apply {
|
view?.apply {
|
||||||
showPreButton(!currentDate.minusDays(1).isHolidays)
|
showPreButton(!currentDate.minusDays(1).isHolidays)
|
||||||
showNextButton(!currentDate.plusDays(1).isHolidays)
|
showNextButton(!currentDate.plusDays(1).isHolidays)
|
||||||
updateNavigationDay(currentDate.toFormattedString("EEEE, dd.MM").capitalise())
|
updateNavigationDay(currentDate.toFormattedString("EEEE, dd.MM").capitalise())
|
||||||
|
showNavigation(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,6 +36,8 @@ interface TimetableView : BaseView {
|
|||||||
|
|
||||||
fun showContent(show: Boolean)
|
fun showContent(show: Boolean)
|
||||||
|
|
||||||
|
fun showNavigation(show: Boolean)
|
||||||
|
|
||||||
fun showPreButton(show: Boolean)
|
fun showPreButton(show: Boolean)
|
||||||
|
|
||||||
fun showNextButton(show: Boolean)
|
fun showNextButton(show: Boolean)
|
||||||
|
@ -25,7 +25,8 @@ open class AppInfo @Inject constructor() {
|
|||||||
|
|
||||||
open val systemModel: String get() = Build.MODEL
|
open val systemModel: String get() = Build.MODEL
|
||||||
|
|
||||||
open val messagesBaseUrl = BuildConfig.MESSAGES_BASE_URL
|
open val messagesBaseUrl: String = BuildConfig.MESSAGES_BASE_URL
|
||||||
|
open val schoolsBaseUrl: String = BuildConfig.SCHOOLS_BASE_URL
|
||||||
|
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
open val systemLanguage: String
|
open val systemLanguage: String
|
||||||
|
@ -7,7 +7,7 @@ import android.os.Bundle
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.FragmentManager
|
import androidx.fragment.app.FragmentManager
|
||||||
import fr.bipi.tressence.common.filters.Filter
|
import fr.bipi.treessence.common.filters.Filter
|
||||||
import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException
|
import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException
|
||||||
import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException
|
import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
Wersja 2.1.0
|
Wersja 2.2.3
|
||||||
|
|
||||||
— dodaliśmy tryb incognito w wiadomościach
|
— ułatwiliśmy przełączenie dnia na weekend w planie lekcji przy użyciu strzałek
|
||||||
— dodaliśmy wyświetlanie pustych lekcji (okienek) w planie lekcji
|
— poprawiliśmy wsparcie dla statystyk ocen z systemem punktowym
|
||||||
— poprawiliśmy widżet planu lekcji (będzie teraz trochę bardziej kompaktowy)
|
— poprawiliśmy sortowanie nauczycieli w widoku Szkoła i nauczyciele
|
||||||
— zmieniliśmy datę rozpoczęcia roku szkolnego na 3 dni przed 1 września (sorry)
|
|
||||||
|
|
||||||
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases
|
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases
|
||||||
|
5
app/src/main/res/drawable/ic_login.xml
Normal file
5
app/src/main/res/drawable/ic_login.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<vector android:autoMirrored="true" android:height="24dp"
|
||||||
|
android:tint="#000000" android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M11,7L9.6,8.4l2.6,2.6H2v2h10.2l-2.6,2.6L11,17l5,-5L11,7zM20,19h-8v2h8c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2h-8v2h8V19z"/>
|
||||||
|
</vector>
|
92
app/src/main/res/layout/dialog_login_support.xml
Normal file
92
app/src/main/res/layout/dialog_login_support.xml
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="?android:windowBackground"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
android:id="@+id/dialog_login_support_toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
app:navigationIcon="?attr/homeAsUpIndicator"
|
||||||
|
app:navigationIconTint="?attr/colorOnSurfaceVariant"
|
||||||
|
app:title="@string/login_support_title" />
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/dialog_login_support_school_container"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="20dp"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/login_support_school_hint" />
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/dialog_login_support_school_layout"
|
||||||
|
style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:placeholderText="@string/login_support_school_placeholder"
|
||||||
|
app:placeholderTextColor="?colorTertiary">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/dialog_login_support_school_input"
|
||||||
|
style="@style/Widget.Material3.TextInputEditText.OutlinedBox"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="top" />
|
||||||
|
|
||||||
|
<requestFocus />
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
|
android:text="@string/login_support_additional_hint" />
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="top"
|
||||||
|
app:placeholderText="@string/login_support_additional_placeholder"
|
||||||
|
app:placeholderTextColor="?colorTertiary">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/dialog_login_support_additional_input"
|
||||||
|
style="@style/Widget.Material3.TextInputEditText.OutlinedBox"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="top"
|
||||||
|
android:minLines="3" />
|
||||||
|
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/dialog_login_support_submit"
|
||||||
|
style="@style/Widget.Material3.Button.TextButton.Dialog"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="end"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
|
android:insetLeft="0dp"
|
||||||
|
android:insetTop="0dp"
|
||||||
|
android:insetRight="0dp"
|
||||||
|
android:insetBottom="0dp"
|
||||||
|
android:text="@string/login_support_submit" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
</LinearLayout>
|
@ -128,7 +128,9 @@
|
|||||||
android:layout_gravity="bottom"
|
android:layout_gravity="bottom"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
tools:ignore="UnusedAttribute">
|
android:visibility="gone"
|
||||||
|
tools:ignore="UnusedAttribute"
|
||||||
|
tools:visibility="visible">
|
||||||
|
|
||||||
<ImageButton
|
<ImageButton
|
||||||
android:id="@+id/attendancePreviousButton"
|
android:id="@+id/attendancePreviousButton"
|
||||||
|
@ -26,7 +26,8 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:paddingTop="6dp"
|
android:paddingTop="6dp"
|
||||||
android:paddingBottom="6dp" />
|
android:paddingBottom="6dp"
|
||||||
|
tools:listitem="@layout/item_dashboard_grades" />
|
||||||
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
@ -79,4 +80,4 @@
|
|||||||
android:text="@string/all_retry" />
|
android:text="@string/all_retry" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
@ -56,6 +56,8 @@
|
|||||||
android:layout_marginBottom="32dp"
|
android:layout_marginBottom="32dp"
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
android:text="@string/login_sign_in"
|
android:text="@string/login_sign_in"
|
||||||
|
app:icon="@drawable/ic_login"
|
||||||
|
app:iconGravity="end"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/loginStudentSelectRecycler" />
|
app:layout_constraintTop_toBottomOf="@id/loginStudentSelectRecycler" />
|
||||||
|
@ -141,7 +141,9 @@
|
|||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
app:layout_constraintHorizontal_bias="0.5"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/loginSymbolHelper">
|
app:layout_constraintTop_toBottomOf="@+id/loginSymbolHelper"
|
||||||
|
app:placeholderText="@string/login_symbol_placeholder"
|
||||||
|
app:placeholderTextColor="?colorTertiary">
|
||||||
|
|
||||||
<AutoCompleteTextView
|
<AutoCompleteTextView
|
||||||
android:id="@+id/loginSymbolName"
|
android:id="@+id/loginSymbolName"
|
||||||
|
@ -128,7 +128,9 @@
|
|||||||
android:layout_gravity="bottom"
|
android:layout_gravity="bottom"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
tools:ignore="UnusedAttribute">
|
android:visibility="gone"
|
||||||
|
tools:ignore="UnusedAttribute"
|
||||||
|
tools:visibility="visible">
|
||||||
|
|
||||||
<ImageButton
|
<ImageButton
|
||||||
android:id="@+id/timetablePreviousButton"
|
android:id="@+id/timetablePreviousButton"
|
||||||
|
@ -52,9 +52,9 @@
|
|||||||
<item>Průměr známek z celého roku</item>
|
<item>Průměr známek z celého roku</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="timetable_show_gaps_entries">
|
<string-array name="timetable_show_gaps_entries">
|
||||||
<item>Don\'t show</item>
|
<item>Nezobrazovat</item>
|
||||||
<item>Only between lessons</item>
|
<item>Pouze mezi lekcemi</item>
|
||||||
<item>Before and between lessons</item>
|
<item>Před a mezi lekcemi</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="dashboard_tile_entries">
|
<string-array name="dashboard_tile_entries">
|
||||||
<item>Šťastné číslo</item>
|
<item>Šťastné číslo</item>
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
<string name="login_token_hint">Token</string>
|
<string name="login_token_hint">Token</string>
|
||||||
<string name="login_pin_hint">PIN</string>
|
<string name="login_pin_hint">PIN</string>
|
||||||
<string name="login_symbol_hint">Symbol</string>
|
<string name="login_symbol_hint">Symbol</string>
|
||||||
|
<string name="login_symbol_placeholder">Např. „lodz“ nebo „powiatjaroslawski“</string>
|
||||||
<string name="login_sign_in">Přihlásit</string>
|
<string name="login_sign_in">Přihlásit</string>
|
||||||
<string name="login_invalid_password">Toto heslo je příliš krátké</string>
|
<string name="login_invalid_password">Toto heslo je příliš krátké</string>
|
||||||
<string name="login_incorrect_password_default">Přihlašovací údaje jsou nesprávné</string>
|
<string name="login_incorrect_password_default">Přihlašovací údaje jsou nesprávné</string>
|
||||||
@ -54,7 +55,8 @@
|
|||||||
<string name="login_invalid_email">Neplatný e-mail</string>
|
<string name="login_invalid_email">Neplatný e-mail</string>
|
||||||
<string name="login_invalid_login">Místo e-mailu použijte přiřazené přihlašovací údaje</string>
|
<string name="login_invalid_login">Místo e-mailu použijte přiřazené přihlašovací údaje</string>
|
||||||
<string name="login_invalid_custom_email">Použijte přiřazené přihlašovací nebo e-mail v @%1$s</string>
|
<string name="login_invalid_custom_email">Použijte přiřazené přihlašovací nebo e-mail v @%1$s</string>
|
||||||
<string name="login_invalid_symbol">Neplatný symbol</string>
|
<string name="login_invalid_symbol">Neplatný symbol. Pokud jej nemůžete najít, kontaktujte školu</string>
|
||||||
|
<string name="login_invalid_symbol_definitely">Nevymýšlejte si! Pokud symbol nemůžete najít, kontaktujte školu</string>
|
||||||
<string name="login_incorrect_symbol">Žák nebyl nalezen. Zkontrolujte správnost symbolu a vybrané varianty deníku UONET+</string>
|
<string name="login_incorrect_symbol">Žák nebyl nalezen. Zkontrolujte správnost symbolu a vybrané varianty deníku UONET+</string>
|
||||||
<string name="login_duplicate_student">Vybraný žák je už přihlášen</string>
|
<string name="login_duplicate_student">Vybraný žák je už přihlášen</string>
|
||||||
<string name="login_symbol_helper">Symbol najdete na stránce deníku v  <b>Uczeń</b>→ <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nUjistěte se, že jste nastavili správnou variantu deníku v poli <b>Variace deníku UONET+</b> na první přihlašovací obrazovce</string>
|
<string name="login_symbol_helper">Symbol najdete na stránce deníku v  <b>Uczeń</b>→ <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nUjistěte se, že jste nastavili správnou variantu deníku v poli <b>Variace deníku UONET+</b> na první přihlašovací obrazovce</string>
|
||||||
@ -69,7 +71,7 @@
|
|||||||
<string name="login_contact_discord">Discord</string>
|
<string name="login_contact_discord">Discord</string>
|
||||||
<string name="login_email_intent_title">Poslat e-mail</string>
|
<string name="login_email_intent_title">Poslat e-mail</string>
|
||||||
<string name="login_recover_warning">Ujistěte se, že jste vybrali správnou variantu deníku UONET+!</string>
|
<string name="login_recover_warning">Ujistěte se, že jste vybrali správnou variantu deníku UONET+!</string>
|
||||||
<string name="login_recover_button">Zapomněl jsem své heslo</string>
|
<string name="login_recover_button">Obnovit heslo</string>
|
||||||
<string name="login_recover_title">Obnovte svůj účet</string>
|
<string name="login_recover_title">Obnovte svůj účet</string>
|
||||||
<string name="login_recover">Obnovit</string>
|
<string name="login_recover">Obnovit</string>
|
||||||
<string name="login_signed_in">Žák je už přihlášen</string>
|
<string name="login_signed_in">Žák je už přihlášen</string>
|
||||||
@ -77,6 +79,13 @@
|
|||||||
<string name="login_other_search_locations">Jiná místa vyhledávání</string>
|
<string name="login_other_search_locations">Jiná místa vyhledávání</string>
|
||||||
<string name="login_no_active_student">Nebyli nalezeni žádní aktivní žáci</string>
|
<string name="login_no_active_student">Nebyli nalezeni žádní aktivní žáci</string>
|
||||||
<string name="login_symbol_enter">Zadejte jiný symbol</string>
|
<string name="login_symbol_enter">Zadejte jiný symbol</string>
|
||||||
|
<string name="login_support_title">Získat pomoc</string>
|
||||||
|
<string name="login_support_school_hint">Celý název školy s městem (povinný)</string>
|
||||||
|
<string name="login_support_school_placeholder">Např. ZSTiO Jarosław nebo SP nr 99 w Łodzi</string>
|
||||||
|
<string name="login_support_school_invalid">Zadejte správný název školy</string>
|
||||||
|
<string name="login_support_additional_hint">Dodatečné informace v polštině (volitelné)</string>
|
||||||
|
<string name="login_support_additional_placeholder">Např. „Ostatnio zmieniłem szkołę i…“ (Nedávno jsem změnil školu a…) nebo „Jestem rodzicem i nie widzę drugiego dziecka…“ (Jsem rodič a nevidím žádné další dítě…)</string>
|
||||||
|
<string name="login_support_submit">Odeslat</string>
|
||||||
<!--Notifications-->
|
<!--Notifications-->
|
||||||
<string name="notifications_header_title">Povolit oznámení</string>
|
<string name="notifications_header_title">Povolit oznámení</string>
|
||||||
<string name="notifications_header_description">Povolit upozornění, abyste nezmeškali zprávu od učitele nebo o nové známce</string>
|
<string name="notifications_header_description">Povolit upozornění, abyste nezmeškali zprávu od učitele nebo o nové známce</string>
|
||||||
@ -186,10 +195,10 @@
|
|||||||
<string name="timetable_notify_change_teacher">Změna učitele z %1$s na %2$s</string>
|
<string name="timetable_notify_change_teacher">Změna učitele z %1$s na %2$s</string>
|
||||||
<string name="timetable_notify_change_subject">Změna předmětu z %1$s na %2$s</string>
|
<string name="timetable_notify_change_subject">Změna předmětu z %1$s na %2$s</string>
|
||||||
<plurals name="timetable_no_lesson">
|
<plurals name="timetable_no_lesson">
|
||||||
<item quantity="one">No lesson</item>
|
<item quantity="one">Žádné lekce</item>
|
||||||
<item quantity="few">No lessons</item>
|
<item quantity="few">Žádné lekce</item>
|
||||||
<item quantity="many">No lessons</item>
|
<item quantity="many">Žádné lekce</item>
|
||||||
<item quantity="other">No lessons</item>
|
<item quantity="other">Žádné lekce</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<plurals name="timetable_notify_new_items_title">
|
<plurals name="timetable_notify_new_items_title">
|
||||||
<item quantity="one">Změna plánu lekcí</item>
|
<item quantity="one">Změna plánu lekcí</item>
|
||||||
@ -704,9 +713,8 @@
|
|||||||
<string name="pref_view_present">Zobrazit přítomnost</string>
|
<string name="pref_view_present">Zobrazit přítomnost</string>
|
||||||
<string name="pref_view_app_theme">Motiv</string>
|
<string name="pref_view_app_theme">Motiv</string>
|
||||||
<string name="pref_view_expand_grade">Rozvíjení známek</string>
|
<string name="pref_view_expand_grade">Rozvíjení známek</string>
|
||||||
<string name="pref_view_timetable_show_timers">Označit aktuální lekci</string>
|
|
||||||
<string name="pref_view_timetable_show_groups">Zobrazit skupiny vedle předmětů</string>
|
<string name="pref_view_timetable_show_groups">Zobrazit skupiny vedle předmětů</string>
|
||||||
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
<string name="pref_view_timetable_show_gaps">Zobrazit prázdné dlaždice, kde není žádná lekce</string>
|
||||||
<string name="pref_view_grade_statistics_list">Zobrazit seznam grafů v známkách třídy</string>
|
<string name="pref_view_grade_statistics_list">Zobrazit seznam grafů v známkách třídy</string>
|
||||||
<string name="pref_view_subjects_without_grades">Zobrazit předměty bez známek</string>
|
<string name="pref_view_subjects_without_grades">Zobrazit předměty bez známek</string>
|
||||||
<string name="pref_view_grade_color_scheme">Známky barevné schéma</string>
|
<string name="pref_view_grade_color_scheme">Známky barevné schéma</string>
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
<string name="login_token_hint">Token</string>
|
<string name="login_token_hint">Token</string>
|
||||||
<string name="login_pin_hint">PIN</string>
|
<string name="login_pin_hint">PIN</string>
|
||||||
<string name="login_symbol_hint">Symbol</string>
|
<string name="login_symbol_hint">Symbol</string>
|
||||||
|
<string name="login_symbol_placeholder">E.g. \"lodz\" or \"powiatjaroslawski\"</string>
|
||||||
<string name="login_sign_in">Sign in</string>
|
<string name="login_sign_in">Sign in</string>
|
||||||
<string name="login_invalid_password">Password too short</string>
|
<string name="login_invalid_password">Password too short</string>
|
||||||
<string name="login_incorrect_password_default">Login details are incorrect</string>
|
<string name="login_incorrect_password_default">Login details are incorrect</string>
|
||||||
@ -54,7 +55,8 @@
|
|||||||
<string name="login_invalid_email">Invalid email</string>
|
<string name="login_invalid_email">Invalid email</string>
|
||||||
<string name="login_invalid_login">Use the assigned login instead of email</string>
|
<string name="login_invalid_login">Use the assigned login instead of email</string>
|
||||||
<string name="login_invalid_custom_email">Use the assigned login or email in @%1$s</string>
|
<string name="login_invalid_custom_email">Use the assigned login or email in @%1$s</string>
|
||||||
<string name="login_invalid_symbol">Invalid symbol</string>
|
<string name="login_invalid_symbol">Invalid symbol. If you cannot find it, please contact the school</string>
|
||||||
|
<string name="login_invalid_symbol_definitely">Don\'t make this up! If you cannot find it, please contact the school</string>
|
||||||
<string name="login_incorrect_symbol">Student not found. Validate the symbol and the chosen variation of the UONET+ register</string>
|
<string name="login_incorrect_symbol">Student not found. Validate the symbol and the chosen variation of the UONET+ register</string>
|
||||||
<string name="login_duplicate_student">Selected student is already logged in</string>
|
<string name="login_duplicate_student">Selected student is already logged in</string>
|
||||||
<string name="login_symbol_helper">The symbol can be found on the register page in <b>Uczeń</b> → <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nMake sure that you have set the appropriate register variant in the <b>UONET+ register variant</b> field on the first login screen</string>
|
<string name="login_symbol_helper">The symbol can be found on the register page in <b>Uczeń</b> → <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nMake sure that you have set the appropriate register variant in the <b>UONET+ register variant</b> field on the first login screen</string>
|
||||||
@ -69,7 +71,7 @@
|
|||||||
<string name="login_contact_discord">Discord</string>
|
<string name="login_contact_discord">Discord</string>
|
||||||
<string name="login_email_intent_title">Send email</string>
|
<string name="login_email_intent_title">Send email</string>
|
||||||
<string name="login_recover_warning">Make sure you select the correct UONET+ register variation!</string>
|
<string name="login_recover_warning">Make sure you select the correct UONET+ register variation!</string>
|
||||||
<string name="login_recover_button">I forgot my password</string>
|
<string name="login_recover_button">Reset password</string>
|
||||||
<string name="login_recover_title">Recover your account</string>
|
<string name="login_recover_title">Recover your account</string>
|
||||||
<string name="login_recover">Recover</string>
|
<string name="login_recover">Recover</string>
|
||||||
<string name="login_signed_in">Student is already signed in</string>
|
<string name="login_signed_in">Student is already signed in</string>
|
||||||
@ -77,6 +79,13 @@
|
|||||||
<string name="login_other_search_locations">Other search locations</string>
|
<string name="login_other_search_locations">Other search locations</string>
|
||||||
<string name="login_no_active_student">No active students found</string>
|
<string name="login_no_active_student">No active students found</string>
|
||||||
<string name="login_symbol_enter">Enter a different symbol</string>
|
<string name="login_symbol_enter">Enter a different symbol</string>
|
||||||
|
<string name="login_support_title">Get help</string>
|
||||||
|
<string name="login_support_school_hint">Full school name with the town (required)</string>
|
||||||
|
<string name="login_support_school_placeholder">Np. ZSTiO Jarosław lub SP nr 99 w Łodzi</string>
|
||||||
|
<string name="login_support_school_invalid">Enter correct name of the school</string>
|
||||||
|
<string name="login_support_additional_hint">Additional information in Polish (optional)</string>
|
||||||
|
<string name="login_support_additional_placeholder">Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\"</string>
|
||||||
|
<string name="login_support_submit">Submit</string>
|
||||||
<!--Notifications-->
|
<!--Notifications-->
|
||||||
<string name="notifications_header_title">Enable notifications</string>
|
<string name="notifications_header_title">Enable notifications</string>
|
||||||
<string name="notifications_header_description">Enable notifications so you don\'t miss message from teacher or new grade</string>
|
<string name="notifications_header_description">Enable notifications so you don\'t miss message from teacher or new grade</string>
|
||||||
@ -614,7 +623,6 @@
|
|||||||
<string name="pref_view_present">Show presence</string>
|
<string name="pref_view_present">Show presence</string>
|
||||||
<string name="pref_view_app_theme">Theme</string>
|
<string name="pref_view_app_theme">Theme</string>
|
||||||
<string name="pref_view_expand_grade">Grades expanding</string>
|
<string name="pref_view_expand_grade">Grades expanding</string>
|
||||||
<string name="pref_view_timetable_show_timers">Mark current lesson</string>
|
|
||||||
<string name="pref_view_timetable_show_groups">Show groups next to subjects</string>
|
<string name="pref_view_timetable_show_groups">Show groups next to subjects</string>
|
||||||
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
||||||
<string name="pref_view_grade_statistics_list">Show chart list in class grades</string>
|
<string name="pref_view_grade_statistics_list">Show chart list in class grades</string>
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
<string name="login_token_hint">Token</string>
|
<string name="login_token_hint">Token</string>
|
||||||
<string name="login_pin_hint">PIN</string>
|
<string name="login_pin_hint">PIN</string>
|
||||||
<string name="login_symbol_hint">Symbol</string>
|
<string name="login_symbol_hint">Symbol</string>
|
||||||
|
<string name="login_symbol_placeholder">E.g. \"lodz\" or \"powiatjaroslawski\"</string>
|
||||||
<string name="login_sign_in">Anmelden</string>
|
<string name="login_sign_in">Anmelden</string>
|
||||||
<string name="login_invalid_password">Passwort ist zu kurz</string>
|
<string name="login_invalid_password">Passwort ist zu kurz</string>
|
||||||
<string name="login_incorrect_password_default">Anmeldedaten sind falsch</string>
|
<string name="login_incorrect_password_default">Anmeldedaten sind falsch</string>
|
||||||
@ -54,7 +55,8 @@
|
|||||||
<string name="login_invalid_email">Ungültige email</string>
|
<string name="login_invalid_email">Ungültige email</string>
|
||||||
<string name="login_invalid_login">Den zugewiesenen Login anstelle von email verwenden</string>
|
<string name="login_invalid_login">Den zugewiesenen Login anstelle von email verwenden</string>
|
||||||
<string name="login_invalid_custom_email">Benutze den zugewiesenen Login oder E-Mail in @%1$s</string>
|
<string name="login_invalid_custom_email">Benutze den zugewiesenen Login oder E-Mail in @%1$s</string>
|
||||||
<string name="login_invalid_symbol">Ungültige symbol</string>
|
<string name="login_invalid_symbol">Invalid symbol. If you cannot find it, please contact the school</string>
|
||||||
|
<string name="login_invalid_symbol_definitely">Don\'t make this up! If you cannot find it, please contact the school</string>
|
||||||
<string name="login_incorrect_symbol">Schüler nicht gefunden. Überprüfen Sie das Symbol und die gewählte Variation des UONET+ Registers</string>
|
<string name="login_incorrect_symbol">Schüler nicht gefunden. Überprüfen Sie das Symbol und die gewählte Variation des UONET+ Registers</string>
|
||||||
<string name="login_duplicate_student">Ausgewählter Student ist bereits angemeldet.</string>
|
<string name="login_duplicate_student">Ausgewählter Student ist bereits angemeldet.</string>
|
||||||
<string name="login_symbol_helper">Das Symbol kann auf der Registerseite in <b>Student </b>→ <b>Tost Möbeln</b> → <b>Registrieren Sie Ihr Mobilgerät</b>gefunden werden.\n\nStellen Sie sicher, dass Sie die entsprechende Registervariante im Feld <b>UONET+ Registervariante</b> auf dem vorherigen Bildschirm festgelegt haben</string>
|
<string name="login_symbol_helper">Das Symbol kann auf der Registerseite in <b>Student </b>→ <b>Tost Möbeln</b> → <b>Registrieren Sie Ihr Mobilgerät</b>gefunden werden.\n\nStellen Sie sicher, dass Sie die entsprechende Registervariante im Feld <b>UONET+ Registervariante</b> auf dem vorherigen Bildschirm festgelegt haben</string>
|
||||||
@ -69,7 +71,7 @@
|
|||||||
<string name="login_contact_discord">Discord</string>
|
<string name="login_contact_discord">Discord</string>
|
||||||
<string name="login_email_intent_title">email senden</string>
|
<string name="login_email_intent_title">email senden</string>
|
||||||
<string name="login_recover_warning">Stellen Sie sicher, dass Sie die richtige UONET+ Registervariation wählen!</string>
|
<string name="login_recover_warning">Stellen Sie sicher, dass Sie die richtige UONET+ Registervariation wählen!</string>
|
||||||
<string name="login_recover_button">Ich habe mein Passwort vergessen.</string>
|
<string name="login_recover_button">Reset password</string>
|
||||||
<string name="login_recover_title">Ihr Konto wiederherstellen</string>
|
<string name="login_recover_title">Ihr Konto wiederherstellen</string>
|
||||||
<string name="login_recover">Wiederherstellen</string>
|
<string name="login_recover">Wiederherstellen</string>
|
||||||
<string name="login_signed_in">Student ist bereits angemeldet</string>
|
<string name="login_signed_in">Student ist bereits angemeldet</string>
|
||||||
@ -77,6 +79,13 @@
|
|||||||
<string name="login_other_search_locations">Andere Suchorte</string>
|
<string name="login_other_search_locations">Andere Suchorte</string>
|
||||||
<string name="login_no_active_student">Keine aktiven Schüler gefunden</string>
|
<string name="login_no_active_student">Keine aktiven Schüler gefunden</string>
|
||||||
<string name="login_symbol_enter">Geben Sie ein anderes Symbol ein</string>
|
<string name="login_symbol_enter">Geben Sie ein anderes Symbol ein</string>
|
||||||
|
<string name="login_support_title">Get help</string>
|
||||||
|
<string name="login_support_school_hint">Full school name with the town (required)</string>
|
||||||
|
<string name="login_support_school_placeholder">Np. ZSTiO Jarosław lub SP nr 99 w Łodzi</string>
|
||||||
|
<string name="login_support_school_invalid">Enter correct name of the school</string>
|
||||||
|
<string name="login_support_additional_hint">Additional information in Polish (optional)</string>
|
||||||
|
<string name="login_support_additional_placeholder">Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\"</string>
|
||||||
|
<string name="login_support_submit">Submit</string>
|
||||||
<!--Notifications-->
|
<!--Notifications-->
|
||||||
<string name="notifications_header_title">Benachrichtigungen aktivieren</string>
|
<string name="notifications_header_title">Benachrichtigungen aktivieren</string>
|
||||||
<string name="notifications_header_description">Aktivieren Sie Benachrichtigungen, damit Sie keine Nachricht vom Lehrer oder eine neue Klasse verpassen</string>
|
<string name="notifications_header_description">Aktivieren Sie Benachrichtigungen, damit Sie keine Nachricht vom Lehrer oder eine neue Klasse verpassen</string>
|
||||||
@ -614,7 +623,6 @@
|
|||||||
<string name="pref_view_present">Anwesendheit zeigen</string>
|
<string name="pref_view_present">Anwesendheit zeigen</string>
|
||||||
<string name="pref_view_app_theme">Thema</string>
|
<string name="pref_view_app_theme">Thema</string>
|
||||||
<string name="pref_view_expand_grade">Steigende Sorten</string>
|
<string name="pref_view_expand_grade">Steigende Sorten</string>
|
||||||
<string name="pref_view_timetable_show_timers">Aktuelle Lektion markieren</string>
|
|
||||||
<string name="pref_view_timetable_show_groups">Gruppen neben Schulfächen anzeigen</string>
|
<string name="pref_view_timetable_show_groups">Gruppen neben Schulfächen anzeigen</string>
|
||||||
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
||||||
<string name="pref_view_grade_statistics_list">Liste der Diagramme in Klassenbewertungen anzeigen</string>
|
<string name="pref_view_grade_statistics_list">Liste der Diagramme in Klassenbewertungen anzeigen</string>
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
<string name="login_token_hint">Token</string>
|
<string name="login_token_hint">Token</string>
|
||||||
<string name="login_pin_hint">PIN</string>
|
<string name="login_pin_hint">PIN</string>
|
||||||
<string name="login_symbol_hint">Symbol</string>
|
<string name="login_symbol_hint">Symbol</string>
|
||||||
|
<string name="login_symbol_placeholder">E.g. \"lodz\" or \"powiatjaroslawski\"</string>
|
||||||
<string name="login_sign_in">Sign in</string>
|
<string name="login_sign_in">Sign in</string>
|
||||||
<string name="login_invalid_password">Password too short</string>
|
<string name="login_invalid_password">Password too short</string>
|
||||||
<string name="login_incorrect_password_default">Login details are incorrect</string>
|
<string name="login_incorrect_password_default">Login details are incorrect</string>
|
||||||
@ -54,7 +55,8 @@
|
|||||||
<string name="login_invalid_email">Invalid email</string>
|
<string name="login_invalid_email">Invalid email</string>
|
||||||
<string name="login_invalid_login">Use the assigned login instead of email</string>
|
<string name="login_invalid_login">Use the assigned login instead of email</string>
|
||||||
<string name="login_invalid_custom_email">Use the assigned login or email in @%1$s</string>
|
<string name="login_invalid_custom_email">Use the assigned login or email in @%1$s</string>
|
||||||
<string name="login_invalid_symbol">Invalid symbol</string>
|
<string name="login_invalid_symbol">Invalid symbol. If you cannot find it, please contact the school</string>
|
||||||
|
<string name="login_invalid_symbol_definitely">Don\'t make this up! If you cannot find it, please contact the school</string>
|
||||||
<string name="login_incorrect_symbol">Student not found. Validate the symbol and the chosen variation of the UONET+ register</string>
|
<string name="login_incorrect_symbol">Student not found. Validate the symbol and the chosen variation of the UONET+ register</string>
|
||||||
<string name="login_duplicate_student">Selected student is already logged in</string>
|
<string name="login_duplicate_student">Selected student is already logged in</string>
|
||||||
<string name="login_symbol_helper">The symbol can be found on the register page in <b>Uczeń</b> → <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nMake sure that you have set the appropriate register variant in the <b>UONET+ register variant</b> field on the first login screen</string>
|
<string name="login_symbol_helper">The symbol can be found on the register page in <b>Uczeń</b> → <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nMake sure that you have set the appropriate register variant in the <b>UONET+ register variant</b> field on the first login screen</string>
|
||||||
@ -69,7 +71,7 @@
|
|||||||
<string name="login_contact_discord">Discord</string>
|
<string name="login_contact_discord">Discord</string>
|
||||||
<string name="login_email_intent_title">Send email</string>
|
<string name="login_email_intent_title">Send email</string>
|
||||||
<string name="login_recover_warning">Make sure you select the correct UONET+ register variation!</string>
|
<string name="login_recover_warning">Make sure you select the correct UONET+ register variation!</string>
|
||||||
<string name="login_recover_button">I forgot my password</string>
|
<string name="login_recover_button">Reset password</string>
|
||||||
<string name="login_recover_title">Recover your account</string>
|
<string name="login_recover_title">Recover your account</string>
|
||||||
<string name="login_recover">Recover</string>
|
<string name="login_recover">Recover</string>
|
||||||
<string name="login_signed_in">Student is already signed in</string>
|
<string name="login_signed_in">Student is already signed in</string>
|
||||||
@ -77,6 +79,13 @@
|
|||||||
<string name="login_other_search_locations">Other search locations</string>
|
<string name="login_other_search_locations">Other search locations</string>
|
||||||
<string name="login_no_active_student">No active students found</string>
|
<string name="login_no_active_student">No active students found</string>
|
||||||
<string name="login_symbol_enter">Enter a different symbol</string>
|
<string name="login_symbol_enter">Enter a different symbol</string>
|
||||||
|
<string name="login_support_title">Get help</string>
|
||||||
|
<string name="login_support_school_hint">Full school name with the town (required)</string>
|
||||||
|
<string name="login_support_school_placeholder">Np. ZSTiO Jarosław lub SP nr 99 w Łodzi</string>
|
||||||
|
<string name="login_support_school_invalid">Enter correct name of the school</string>
|
||||||
|
<string name="login_support_additional_hint">Additional information in Polish (optional)</string>
|
||||||
|
<string name="login_support_additional_placeholder">Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\"</string>
|
||||||
|
<string name="login_support_submit">Submit</string>
|
||||||
<!--Notifications-->
|
<!--Notifications-->
|
||||||
<string name="notifications_header_title">Enable notifications</string>
|
<string name="notifications_header_title">Enable notifications</string>
|
||||||
<string name="notifications_header_description">Enable notifications so you don\'t miss message from teacher or new grade</string>
|
<string name="notifications_header_description">Enable notifications so you don\'t miss message from teacher or new grade</string>
|
||||||
@ -614,7 +623,6 @@
|
|||||||
<string name="pref_view_present">Show presence</string>
|
<string name="pref_view_present">Show presence</string>
|
||||||
<string name="pref_view_app_theme">Theme</string>
|
<string name="pref_view_app_theme">Theme</string>
|
||||||
<string name="pref_view_expand_grade">Grades expanding</string>
|
<string name="pref_view_expand_grade">Grades expanding</string>
|
||||||
<string name="pref_view_timetable_show_timers">Mark current lesson</string>
|
|
||||||
<string name="pref_view_timetable_show_groups">Show groups next to subjects</string>
|
<string name="pref_view_timetable_show_groups">Show groups next to subjects</string>
|
||||||
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
||||||
<string name="pref_view_grade_statistics_list">Show chart list in class grades</string>
|
<string name="pref_view_grade_statistics_list">Show chart list in class grades</string>
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
<string name="login_token_hint">Token</string>
|
<string name="login_token_hint">Token</string>
|
||||||
<string name="login_pin_hint">PIN</string>
|
<string name="login_pin_hint">PIN</string>
|
||||||
<string name="login_symbol_hint">Symbol</string>
|
<string name="login_symbol_hint">Symbol</string>
|
||||||
|
<string name="login_symbol_placeholder">E.g. \"lodz\" or \"powiatjaroslawski\"</string>
|
||||||
<string name="login_sign_in">Sign in</string>
|
<string name="login_sign_in">Sign in</string>
|
||||||
<string name="login_invalid_password">Password too short</string>
|
<string name="login_invalid_password">Password too short</string>
|
||||||
<string name="login_incorrect_password_default">Login details are incorrect</string>
|
<string name="login_incorrect_password_default">Login details are incorrect</string>
|
||||||
@ -54,7 +55,8 @@
|
|||||||
<string name="login_invalid_email">Invalid email</string>
|
<string name="login_invalid_email">Invalid email</string>
|
||||||
<string name="login_invalid_login">Use the assigned login instead of email</string>
|
<string name="login_invalid_login">Use the assigned login instead of email</string>
|
||||||
<string name="login_invalid_custom_email">Use the assigned login or email in @%1$s</string>
|
<string name="login_invalid_custom_email">Use the assigned login or email in @%1$s</string>
|
||||||
<string name="login_invalid_symbol">Invalid symbol</string>
|
<string name="login_invalid_symbol">Invalid symbol. If you cannot find it, please contact the school</string>
|
||||||
|
<string name="login_invalid_symbol_definitely">Don\'t make this up! If you cannot find it, please contact the school</string>
|
||||||
<string name="login_incorrect_symbol">Student not found. Validate the symbol and the chosen variation of the UONET+ register</string>
|
<string name="login_incorrect_symbol">Student not found. Validate the symbol and the chosen variation of the UONET+ register</string>
|
||||||
<string name="login_duplicate_student">Selected student is already logged in</string>
|
<string name="login_duplicate_student">Selected student is already logged in</string>
|
||||||
<string name="login_symbol_helper">The symbol can be found on the register page in <b>Uczeń</b> → <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nMake sure that you have set the appropriate register variant in the <b>UONET+ register variant</b> field on the first login screen</string>
|
<string name="login_symbol_helper">The symbol can be found on the register page in <b>Uczeń</b> → <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nMake sure that you have set the appropriate register variant in the <b>UONET+ register variant</b> field on the first login screen</string>
|
||||||
@ -69,7 +71,7 @@
|
|||||||
<string name="login_contact_discord">Discord</string>
|
<string name="login_contact_discord">Discord</string>
|
||||||
<string name="login_email_intent_title">Send email</string>
|
<string name="login_email_intent_title">Send email</string>
|
||||||
<string name="login_recover_warning">Make sure you select the correct UONET+ register variation!</string>
|
<string name="login_recover_warning">Make sure you select the correct UONET+ register variation!</string>
|
||||||
<string name="login_recover_button">I forgot my password</string>
|
<string name="login_recover_button">Reset password</string>
|
||||||
<string name="login_recover_title">Recover your account</string>
|
<string name="login_recover_title">Recover your account</string>
|
||||||
<string name="login_recover">Recover</string>
|
<string name="login_recover">Recover</string>
|
||||||
<string name="login_signed_in">Student is already signed in</string>
|
<string name="login_signed_in">Student is already signed in</string>
|
||||||
@ -77,6 +79,13 @@
|
|||||||
<string name="login_other_search_locations">Other search locations</string>
|
<string name="login_other_search_locations">Other search locations</string>
|
||||||
<string name="login_no_active_student">No active students found</string>
|
<string name="login_no_active_student">No active students found</string>
|
||||||
<string name="login_symbol_enter">Enter a different symbol</string>
|
<string name="login_symbol_enter">Enter a different symbol</string>
|
||||||
|
<string name="login_support_title">Get help</string>
|
||||||
|
<string name="login_support_school_hint">Full school name with the town (required)</string>
|
||||||
|
<string name="login_support_school_placeholder">Np. ZSTiO Jarosław lub SP nr 99 w Łodzi</string>
|
||||||
|
<string name="login_support_school_invalid">Enter correct name of the school</string>
|
||||||
|
<string name="login_support_additional_hint">Additional information in Polish (optional)</string>
|
||||||
|
<string name="login_support_additional_placeholder">Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\"</string>
|
||||||
|
<string name="login_support_submit">Submit</string>
|
||||||
<!--Notifications-->
|
<!--Notifications-->
|
||||||
<string name="notifications_header_title">Enable notifications</string>
|
<string name="notifications_header_title">Enable notifications</string>
|
||||||
<string name="notifications_header_description">Enable notifications so you don\'t miss message from teacher or new grade</string>
|
<string name="notifications_header_description">Enable notifications so you don\'t miss message from teacher or new grade</string>
|
||||||
@ -614,7 +623,6 @@
|
|||||||
<string name="pref_view_present">Show presence</string>
|
<string name="pref_view_present">Show presence</string>
|
||||||
<string name="pref_view_app_theme">Theme</string>
|
<string name="pref_view_app_theme">Theme</string>
|
||||||
<string name="pref_view_expand_grade">Grades expanding</string>
|
<string name="pref_view_expand_grade">Grades expanding</string>
|
||||||
<string name="pref_view_timetable_show_timers">Mark current lesson</string>
|
|
||||||
<string name="pref_view_timetable_show_groups">Show groups next to subjects</string>
|
<string name="pref_view_timetable_show_groups">Show groups next to subjects</string>
|
||||||
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
||||||
<string name="pref_view_grade_statistics_list">Show chart list in class grades</string>
|
<string name="pref_view_grade_statistics_list">Show chart list in class grades</string>
|
||||||
|
@ -52,7 +52,7 @@
|
|||||||
<item>Średnia wszystkich ocen z całego roku</item>
|
<item>Średnia wszystkich ocen z całego roku</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="timetable_show_gaps_entries">
|
<string-array name="timetable_show_gaps_entries">
|
||||||
<item>Nie pokauj</item>
|
<item>Nie pokazuj</item>
|
||||||
<item>Tylko między lekcjami</item>
|
<item>Tylko między lekcjami</item>
|
||||||
<item>Przed i między lekcjami</item>
|
<item>Przed i między lekcjami</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
<string name="login_token_hint">Token</string>
|
<string name="login_token_hint">Token</string>
|
||||||
<string name="login_pin_hint">PIN</string>
|
<string name="login_pin_hint">PIN</string>
|
||||||
<string name="login_symbol_hint">Symbol</string>
|
<string name="login_symbol_hint">Symbol</string>
|
||||||
|
<string name="login_symbol_placeholder">Np. \"lodz\" czy \"powiatjaroslawski\"</string>
|
||||||
<string name="login_sign_in">Zaloguj</string>
|
<string name="login_sign_in">Zaloguj</string>
|
||||||
<string name="login_invalid_password">To hasło jest za krótkie</string>
|
<string name="login_invalid_password">To hasło jest za krótkie</string>
|
||||||
<string name="login_incorrect_password_default">Dane logowania są niepoprawne</string>
|
<string name="login_incorrect_password_default">Dane logowania są niepoprawne</string>
|
||||||
@ -54,7 +55,8 @@
|
|||||||
<string name="login_invalid_email">Nieprawidłowy adres e-mail</string>
|
<string name="login_invalid_email">Nieprawidłowy adres e-mail</string>
|
||||||
<string name="login_invalid_login">Użyj loginu zamiast adresu e-mail</string>
|
<string name="login_invalid_login">Użyj loginu zamiast adresu e-mail</string>
|
||||||
<string name="login_invalid_custom_email">Użyj loginu lub adresu e-mail w @%1$s</string>
|
<string name="login_invalid_custom_email">Użyj loginu lub adresu e-mail w @%1$s</string>
|
||||||
<string name="login_invalid_symbol">Nieprawidłowy symbol</string>
|
<string name="login_invalid_symbol">Nieprawidłowy symbol. Jeśli nie możesz go znaleźć, skontaktuj się ze szkołą</string>
|
||||||
|
<string name="login_invalid_symbol_definitely">Nie zmyślaj! Jeśli nie możesz znaleźć symbolu, skontaktuj się ze szkołą</string>
|
||||||
<string name="login_incorrect_symbol">Nie znaleziono ucznia. Sprawdź poprawność symbolu i wybranej odmiany dziennika UONET+</string>
|
<string name="login_incorrect_symbol">Nie znaleziono ucznia. Sprawdź poprawność symbolu i wybranej odmiany dziennika UONET+</string>
|
||||||
<string name="login_duplicate_student">Wybrany uczeń jest już zalogowany</string>
|
<string name="login_duplicate_student">Wybrany uczeń jest już zalogowany</string>
|
||||||
<string name="login_symbol_helper">Symbol można znaleźć na stronie dziennika w <b>Uczeń</b>→ <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nUpewnij się, że ustawiłeś odpowiednią odmianę dziennika w polu <b>Odmiana dziennika UONET+</b> na pierwszym ekranie logowania</string>
|
<string name="login_symbol_helper">Symbol można znaleźć na stronie dziennika w <b>Uczeń</b>→ <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nUpewnij się, że ustawiłeś odpowiednią odmianę dziennika w polu <b>Odmiana dziennika UONET+</b> na pierwszym ekranie logowania</string>
|
||||||
@ -69,7 +71,7 @@
|
|||||||
<string name="login_contact_discord">Discord</string>
|
<string name="login_contact_discord">Discord</string>
|
||||||
<string name="login_email_intent_title">Wyślij wiadomość e-mail</string>
|
<string name="login_email_intent_title">Wyślij wiadomość e-mail</string>
|
||||||
<string name="login_recover_warning">Upewnij się, że została wybrana odpowiednia odmiana dziennika UONET+!</string>
|
<string name="login_recover_warning">Upewnij się, że została wybrana odpowiednia odmiana dziennika UONET+!</string>
|
||||||
<string name="login_recover_button">Nie pamiętam hasła</string>
|
<string name="login_recover_button">Zresetuj hasło</string>
|
||||||
<string name="login_recover_title">Przywróć swoje konto</string>
|
<string name="login_recover_title">Przywróć swoje konto</string>
|
||||||
<string name="login_recover">Przywróć</string>
|
<string name="login_recover">Przywróć</string>
|
||||||
<string name="login_signed_in">Uczeń jest już zalogowany</string>
|
<string name="login_signed_in">Uczeń jest już zalogowany</string>
|
||||||
@ -77,6 +79,13 @@
|
|||||||
<string name="login_other_search_locations">Inne lokalizacje wyszukiwania</string>
|
<string name="login_other_search_locations">Inne lokalizacje wyszukiwania</string>
|
||||||
<string name="login_no_active_student">Nie znaleziono aktywnych uczniów</string>
|
<string name="login_no_active_student">Nie znaleziono aktywnych uczniów</string>
|
||||||
<string name="login_symbol_enter">Wprowadź inny symbol</string>
|
<string name="login_symbol_enter">Wprowadź inny symbol</string>
|
||||||
|
<string name="login_support_title">Uzyskaj pomoc</string>
|
||||||
|
<string name="login_support_school_hint">Pełna nazwa szkoły z miastem (wymagana)</string>
|
||||||
|
<string name="login_support_school_placeholder">Np. ZSTiO Jarosław lub SP nr 99 w Łodzi</string>
|
||||||
|
<string name="login_support_school_invalid">Wprowadź poprawną nazwę szkoły</string>
|
||||||
|
<string name="login_support_additional_hint">Dodatkowe informacje (po polsku) (nieobowiązkowo)</string>
|
||||||
|
<string name="login_support_additional_placeholder">Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\"</string>
|
||||||
|
<string name="login_support_submit">Wyślij</string>
|
||||||
<!--Notifications-->
|
<!--Notifications-->
|
||||||
<string name="notifications_header_title">Włącz powiadomienia</string>
|
<string name="notifications_header_title">Włącz powiadomienia</string>
|
||||||
<string name="notifications_header_description">Włącz powiadomienia, aby nie przegapić wiadomości od nauczyciela lub nowej oceny</string>
|
<string name="notifications_header_description">Włącz powiadomienia, aby nie przegapić wiadomości od nauczyciela lub nowej oceny</string>
|
||||||
@ -704,7 +713,6 @@
|
|||||||
<string name="pref_view_present">Pokazuj obecność</string>
|
<string name="pref_view_present">Pokazuj obecność</string>
|
||||||
<string name="pref_view_app_theme">Motyw</string>
|
<string name="pref_view_app_theme">Motyw</string>
|
||||||
<string name="pref_view_expand_grade">Rozwijanie ocen</string>
|
<string name="pref_view_expand_grade">Rozwijanie ocen</string>
|
||||||
<string name="pref_view_timetable_show_timers">Oznaczaj bieżącą lekcję</string>
|
|
||||||
<string name="pref_view_timetable_show_groups">Pokazuj grupę obok przedmiotu</string>
|
<string name="pref_view_timetable_show_groups">Pokazuj grupę obok przedmiotu</string>
|
||||||
<string name="pref_view_timetable_show_gaps">Pokazuj puste kafelki gdzie nie ma lekcji</string>
|
<string name="pref_view_timetable_show_gaps">Pokazuj puste kafelki gdzie nie ma lekcji</string>
|
||||||
<string name="pref_view_grade_statistics_list">Pokazuj listę wykresów w ocenach klasy</string>
|
<string name="pref_view_grade_statistics_list">Pokazuj listę wykresów w ocenach klasy</string>
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
<string name="login_token_hint">Token</string>
|
<string name="login_token_hint">Token</string>
|
||||||
<string name="login_pin_hint">PIN</string>
|
<string name="login_pin_hint">PIN</string>
|
||||||
<string name="login_symbol_hint">Symbol</string>
|
<string name="login_symbol_hint">Symbol</string>
|
||||||
|
<string name="login_symbol_placeholder">E.g. \"lodz\" or \"powiatjaroslawski\"</string>
|
||||||
<string name="login_sign_in">Войти</string>
|
<string name="login_sign_in">Войти</string>
|
||||||
<string name="login_invalid_password">Пароль слишком короткий</string>
|
<string name="login_invalid_password">Пароль слишком короткий</string>
|
||||||
<string name="login_incorrect_password_default">Данные для входа указаны неверно</string>
|
<string name="login_incorrect_password_default">Данные для входа указаны неверно</string>
|
||||||
@ -54,7 +55,8 @@
|
|||||||
<string name="login_invalid_email">Неверный e-mail</string>
|
<string name="login_invalid_email">Неверный e-mail</string>
|
||||||
<string name="login_invalid_login">Используйте назначенный логин вместо e-mail</string>
|
<string name="login_invalid_login">Используйте назначенный логин вместо e-mail</string>
|
||||||
<string name="login_invalid_custom_email">Используйте назначенный логин или email в @%1$s</string>
|
<string name="login_invalid_custom_email">Используйте назначенный логин или email в @%1$s</string>
|
||||||
<string name="login_invalid_symbol">Неверный symbol</string>
|
<string name="login_invalid_symbol">Invalid symbol. If you cannot find it, please contact the school</string>
|
||||||
|
<string name="login_invalid_symbol_definitely">Don\'t make this up! If you cannot find it, please contact the school</string>
|
||||||
<string name="login_incorrect_symbol">Ученик не найден. Проверьте symbol и выбранный тип дненика UONET+</string>
|
<string name="login_incorrect_symbol">Ученик не найден. Проверьте symbol и выбранный тип дненика UONET+</string>
|
||||||
<string name="login_duplicate_student">Данный ученик уже авторизован</string>
|
<string name="login_duplicate_student">Данный ученик уже авторизован</string>
|
||||||
<string name="login_symbol_helper">Symbol можно найти на странице регистрации в  <b>Uczeń</b> → <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nУбедитесь, что вы выбрали соответствующий тип дневника в поле <b>Тип дневника UONET+</b> на первом экране входа</string>
|
<string name="login_symbol_helper">Symbol можно найти на странице регистрации в  <b>Uczeń</b> → <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nУбедитесь, что вы выбрали соответствующий тип дневника в поле <b>Тип дневника UONET+</b> на первом экране входа</string>
|
||||||
@ -69,7 +71,7 @@
|
|||||||
<string name="login_contact_discord">Discord</string>
|
<string name="login_contact_discord">Discord</string>
|
||||||
<string name="login_email_intent_title">Отправить письмо</string>
|
<string name="login_email_intent_title">Отправить письмо</string>
|
||||||
<string name="login_recover_warning">Убедитесь, что вы выбрали правильный тип дневника UONET+</string>
|
<string name="login_recover_warning">Убедитесь, что вы выбрали правильный тип дневника UONET+</string>
|
||||||
<string name="login_recover_button">Забыли пароль?</string>
|
<string name="login_recover_button">Reset password</string>
|
||||||
<string name="login_recover_title">Восстановите свой аккаунт</string>
|
<string name="login_recover_title">Восстановите свой аккаунт</string>
|
||||||
<string name="login_recover">Восстановить</string>
|
<string name="login_recover">Восстановить</string>
|
||||||
<string name="login_signed_in">Ученик уже авторизован</string>
|
<string name="login_signed_in">Ученик уже авторизован</string>
|
||||||
@ -77,6 +79,13 @@
|
|||||||
<string name="login_other_search_locations">Другие места поиска</string>
|
<string name="login_other_search_locations">Другие места поиска</string>
|
||||||
<string name="login_no_active_student">Не найдено активных учеников</string>
|
<string name="login_no_active_student">Не найдено активных учеников</string>
|
||||||
<string name="login_symbol_enter">Введите другой symbol</string>
|
<string name="login_symbol_enter">Введите другой symbol</string>
|
||||||
|
<string name="login_support_title">Get help</string>
|
||||||
|
<string name="login_support_school_hint">Full school name with the town (required)</string>
|
||||||
|
<string name="login_support_school_placeholder">Np. ZSTiO Jarosław lub SP nr 99 w Łodzi</string>
|
||||||
|
<string name="login_support_school_invalid">Enter correct name of the school</string>
|
||||||
|
<string name="login_support_additional_hint">Additional information in Polish (optional)</string>
|
||||||
|
<string name="login_support_additional_placeholder">Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\"</string>
|
||||||
|
<string name="login_support_submit">Submit</string>
|
||||||
<!--Notifications-->
|
<!--Notifications-->
|
||||||
<string name="notifications_header_title">Включить уведомления</string>
|
<string name="notifications_header_title">Включить уведомления</string>
|
||||||
<string name="notifications_header_description">Включить уведомления, чтобы вы не пропустили сообщение от учителя или новую оценку</string>
|
<string name="notifications_header_description">Включить уведомления, чтобы вы не пропустили сообщение от учителя или новую оценку</string>
|
||||||
@ -704,7 +713,6 @@
|
|||||||
<string name="pref_view_present">Показывать присутствия</string>
|
<string name="pref_view_present">Показывать присутствия</string>
|
||||||
<string name="pref_view_app_theme">Тема</string>
|
<string name="pref_view_app_theme">Тема</string>
|
||||||
<string name="pref_view_expand_grade">Разворачивание оценок</string>
|
<string name="pref_view_expand_grade">Разворачивание оценок</string>
|
||||||
<string name="pref_view_timetable_show_timers">Отметить текущий урок</string>
|
|
||||||
<string name="pref_view_timetable_show_groups">Показать группы рядом с темами</string>
|
<string name="pref_view_timetable_show_groups">Показать группы рядом с темами</string>
|
||||||
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
||||||
<string name="pref_view_grade_statistics_list">Показывать диаграммы в оценках класса</string>
|
<string name="pref_view_grade_statistics_list">Показывать диаграммы в оценках класса</string>
|
||||||
|
@ -52,9 +52,9 @@
|
|||||||
<item>Priemer známok z celého roka</item>
|
<item>Priemer známok z celého roka</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="timetable_show_gaps_entries">
|
<string-array name="timetable_show_gaps_entries">
|
||||||
<item>Don\'t show</item>
|
<item>Nezobrazovať</item>
|
||||||
<item>Only between lessons</item>
|
<item>Iba medzi lekciami</item>
|
||||||
<item>Before and between lessons</item>
|
<item>Pred a medzi lekciami</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="dashboard_tile_entries">
|
<string-array name="dashboard_tile_entries">
|
||||||
<item>Šťastné číslo</item>
|
<item>Šťastné číslo</item>
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
<string name="login_token_hint">Token</string>
|
<string name="login_token_hint">Token</string>
|
||||||
<string name="login_pin_hint">PIN</string>
|
<string name="login_pin_hint">PIN</string>
|
||||||
<string name="login_symbol_hint">Symbol</string>
|
<string name="login_symbol_hint">Symbol</string>
|
||||||
|
<string name="login_symbol_placeholder">Napr. „lodz“ alebo „powiatjaroslawski“</string>
|
||||||
<string name="login_sign_in">Prihlásiť</string>
|
<string name="login_sign_in">Prihlásiť</string>
|
||||||
<string name="login_invalid_password">Toto heslo je príliš krátke</string>
|
<string name="login_invalid_password">Toto heslo je príliš krátke</string>
|
||||||
<string name="login_incorrect_password_default">Prihlasovacie údaje sú nesprávne</string>
|
<string name="login_incorrect_password_default">Prihlasovacie údaje sú nesprávne</string>
|
||||||
@ -54,7 +55,8 @@
|
|||||||
<string name="login_invalid_email">Neplatný e-mail</string>
|
<string name="login_invalid_email">Neplatný e-mail</string>
|
||||||
<string name="login_invalid_login">Namiesto e-mailu použite priradené prihlasovacie údaje</string>
|
<string name="login_invalid_login">Namiesto e-mailu použite priradené prihlasovacie údaje</string>
|
||||||
<string name="login_invalid_custom_email">Použite priradené prihlasovacie alebo e-mail v @%1$s</string>
|
<string name="login_invalid_custom_email">Použite priradené prihlasovacie alebo e-mail v @%1$s</string>
|
||||||
<string name="login_invalid_symbol">Neplatný symbol</string>
|
<string name="login_invalid_symbol">Neplatný symbol. Pokiaľ ho nemôžete nájsť, kontaktujte školu</string>
|
||||||
|
<string name="login_invalid_symbol_definitely">Nevymýšľajte si! Pokiaľ symbol nemôžete nájsť, kontaktujte školu</string>
|
||||||
<string name="login_incorrect_symbol">Žiak nebol nájdený. Skontrolujte správnosť symbolu a vybrané varianty denníka UONET+</string>
|
<string name="login_incorrect_symbol">Žiak nebol nájdený. Skontrolujte správnosť symbolu a vybrané varianty denníka UONET+</string>
|
||||||
<string name="login_duplicate_student">Vybraný žiak už je prihlásený</string>
|
<string name="login_duplicate_student">Vybraný žiak už je prihlásený</string>
|
||||||
<string name="login_symbol_helper">Symbol nájdete na stránke denníka v  <b>Uczeń</b>→ <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nUistite sa, že ste nastavili správny variant denníka v poli <b>Variácia denníka UONET+</b> na prvej prihlasovacej obrazovke</string>
|
<string name="login_symbol_helper">Symbol nájdete na stránke denníka v  <b>Uczeń</b>→ <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nUistite sa, že ste nastavili správny variant denníka v poli <b>Variácia denníka UONET+</b> na prvej prihlasovacej obrazovke</string>
|
||||||
@ -69,7 +71,7 @@
|
|||||||
<string name="login_contact_discord">Discord</string>
|
<string name="login_contact_discord">Discord</string>
|
||||||
<string name="login_email_intent_title">Poslať e-mail</string>
|
<string name="login_email_intent_title">Poslať e-mail</string>
|
||||||
<string name="login_recover_warning">Uistite sa, že ste vybrali správny variant denníka UONET+!</string>
|
<string name="login_recover_warning">Uistite sa, že ste vybrali správny variant denníka UONET+!</string>
|
||||||
<string name="login_recover_button">Zabudol som heslo</string>
|
<string name="login_recover_button">Obnoviť heslo</string>
|
||||||
<string name="login_recover_title">Obnovte svoj účet</string>
|
<string name="login_recover_title">Obnovte svoj účet</string>
|
||||||
<string name="login_recover">Obnoviť</string>
|
<string name="login_recover">Obnoviť</string>
|
||||||
<string name="login_signed_in">Žiak je už prihlásený</string>
|
<string name="login_signed_in">Žiak je už prihlásený</string>
|
||||||
@ -77,6 +79,13 @@
|
|||||||
<string name="login_other_search_locations">Iné miesta vyhľadávania</string>
|
<string name="login_other_search_locations">Iné miesta vyhľadávania</string>
|
||||||
<string name="login_no_active_student">Neboli nájdení žiadni aktívni žiaci</string>
|
<string name="login_no_active_student">Neboli nájdení žiadni aktívni žiaci</string>
|
||||||
<string name="login_symbol_enter">Zadajte iný symbol</string>
|
<string name="login_symbol_enter">Zadajte iný symbol</string>
|
||||||
|
<string name="login_support_title">Získať pomoc</string>
|
||||||
|
<string name="login_support_school_hint">Celý názov školy s mestom (povinný)</string>
|
||||||
|
<string name="login_support_school_placeholder">Napr. ZSTiO Jarosław alebo SP nr 99 w Łodzi</string>
|
||||||
|
<string name="login_support_school_invalid">Zadajte správny názov školy</string>
|
||||||
|
<string name="login_support_additional_hint">Dodatočné informácie v poľštine (voliteľné)</string>
|
||||||
|
<string name="login_support_additional_placeholder">Napr. „Ostatnio zmieniłem szkołę i…“ (Nedávno som zmenil školu a…) alebo „Jestem rodzicem i nie widzę drugiego dziecka…“ (Som rodič a nevidím žiadne ďalšie dieťa…)</string>
|
||||||
|
<string name="login_support_submit">Odoslať</string>
|
||||||
<!--Notifications-->
|
<!--Notifications-->
|
||||||
<string name="notifications_header_title">Povoliť oznámenia</string>
|
<string name="notifications_header_title">Povoliť oznámenia</string>
|
||||||
<string name="notifications_header_description">Povoliť oznámenia, aby ste nezmeškali správu od učiteľa alebo o novej známke</string>
|
<string name="notifications_header_description">Povoliť oznámenia, aby ste nezmeškali správu od učiteľa alebo o novej známke</string>
|
||||||
@ -186,10 +195,10 @@
|
|||||||
<string name="timetable_notify_change_teacher">Zmena učiteľa z %1$s na %2$s</string>
|
<string name="timetable_notify_change_teacher">Zmena učiteľa z %1$s na %2$s</string>
|
||||||
<string name="timetable_notify_change_subject">Zmena predmetu z %1$s na %2$s</string>
|
<string name="timetable_notify_change_subject">Zmena predmetu z %1$s na %2$s</string>
|
||||||
<plurals name="timetable_no_lesson">
|
<plurals name="timetable_no_lesson">
|
||||||
<item quantity="one">No lesson</item>
|
<item quantity="one">Žiadne lekcie</item>
|
||||||
<item quantity="few">No lessons</item>
|
<item quantity="few">Žiadne lekcie</item>
|
||||||
<item quantity="many">No lessons</item>
|
<item quantity="many">Žiadne lekcie</item>
|
||||||
<item quantity="other">No lessons</item>
|
<item quantity="other">Žiadne lekcie</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<plurals name="timetable_notify_new_items_title">
|
<plurals name="timetable_notify_new_items_title">
|
||||||
<item quantity="one">Zmena plánu lekcií</item>
|
<item quantity="one">Zmena plánu lekcií</item>
|
||||||
@ -704,9 +713,8 @@
|
|||||||
<string name="pref_view_present">Zobraziť prítomnosť</string>
|
<string name="pref_view_present">Zobraziť prítomnosť</string>
|
||||||
<string name="pref_view_app_theme">Motív</string>
|
<string name="pref_view_app_theme">Motív</string>
|
||||||
<string name="pref_view_expand_grade">Rozvijanie známok</string>
|
<string name="pref_view_expand_grade">Rozvijanie známok</string>
|
||||||
<string name="pref_view_timetable_show_timers">Označiť aktuálne lekciu</string>
|
|
||||||
<string name="pref_view_timetable_show_groups">Zobraziť skupiny vedľa predmetov</string>
|
<string name="pref_view_timetable_show_groups">Zobraziť skupiny vedľa predmetov</string>
|
||||||
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
<string name="pref_view_timetable_show_gaps">Zobraziť prázdne dlaždice, kde nie je žiadne lekcie</string>
|
||||||
<string name="pref_view_grade_statistics_list">Zobraziť zoznam grafov v známkach triedy</string>
|
<string name="pref_view_grade_statistics_list">Zobraziť zoznam grafov v známkach triedy</string>
|
||||||
<string name="pref_view_subjects_without_grades">Zobraziť predmety bez známok</string>
|
<string name="pref_view_subjects_without_grades">Zobraziť predmety bez známok</string>
|
||||||
<string name="pref_view_grade_color_scheme">Známky farebnú schému</string>
|
<string name="pref_view_grade_color_scheme">Známky farebnú schému</string>
|
||||||
|
@ -52,9 +52,9 @@
|
|||||||
<item>Середня оцінка з цілого року</item>
|
<item>Середня оцінка з цілого року</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="timetable_show_gaps_entries">
|
<string-array name="timetable_show_gaps_entries">
|
||||||
<item>Don\'t show</item>
|
<item>Не показувати</item>
|
||||||
<item>Only between lessons</item>
|
<item>Тільки між уроками</item>
|
||||||
<item>Before and between lessons</item>
|
<item>Перед і між уроками</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="dashboard_tile_entries">
|
<string-array name="dashboard_tile_entries">
|
||||||
<item>Щасливий номер</item>
|
<item>Щасливий номер</item>
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
<string name="login_token_hint">Token</string>
|
<string name="login_token_hint">Token</string>
|
||||||
<string name="login_pin_hint">PIN</string>
|
<string name="login_pin_hint">PIN</string>
|
||||||
<string name="login_symbol_hint">Symbol</string>
|
<string name="login_symbol_hint">Symbol</string>
|
||||||
|
<string name="login_symbol_placeholder">Напр. \"lodz\" чи \"powiatjaroslawski\"</string>
|
||||||
<string name="login_sign_in">Увійти</string>
|
<string name="login_sign_in">Увійти</string>
|
||||||
<string name="login_invalid_password">Занадто короткий пароль</string>
|
<string name="login_invalid_password">Занадто короткий пароль</string>
|
||||||
<string name="login_incorrect_password_default">Вказані невірні дані</string>
|
<string name="login_incorrect_password_default">Вказані невірні дані</string>
|
||||||
@ -54,8 +55,9 @@
|
|||||||
<string name="login_invalid_email">Недійсна адреса e-mail</string>
|
<string name="login_invalid_email">Недійсна адреса e-mail</string>
|
||||||
<string name="login_invalid_login">Використовуйте призначений логін замість адреси e-mail</string>
|
<string name="login_invalid_login">Використовуйте призначений логін замість адреси e-mail</string>
|
||||||
<string name="login_invalid_custom_email">Використовуйте призначений логін або адресу e-mail в @%1$s</string>
|
<string name="login_invalid_custom_email">Використовуйте призначений логін або адресу e-mail в @%1$s</string>
|
||||||
<string name="login_invalid_symbol">Неправильний symbol</string>
|
<string name="login_invalid_symbol">Некоректний символ. Якщо ви не можете знайти його, будь ласка, зв\'яжіться зі школою</string>
|
||||||
<string name="login_incorrect_symbol">Студента не знайдено. Перевірте symbol та обранний тип щоденника UONET+</string>
|
<string name="login_invalid_symbol_definitely">Не вигадуйте! Якщо ви не можете знайти його, будь ласка, зв\'яжіться зі школою</string>
|
||||||
|
<string name="login_incorrect_symbol">Студента не знайдено. Перевірте symbol та обраний тип щоденника UONET+</string>
|
||||||
<string name="login_duplicate_student">Цього учня вже авторизовано</string>
|
<string name="login_duplicate_student">Цього учня вже авторизовано</string>
|
||||||
<string name="login_symbol_helper">Symbol можно знайти на сторінці щоденника у <b>Uczeń</b> → <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nПереконайтеся, що ви вказали відповідний щоденник у полі <b>Тип щоденника UONET+</b> на першому екрані логування</string>
|
<string name="login_symbol_helper">Symbol можно знайти на сторінці щоденника у <b>Uczeń</b> → <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nПереконайтеся, що ви вказали відповідний щоденник у полі <b>Тип щоденника UONET+</b> на першому екрані логування</string>
|
||||||
<string name="login_select_student">Виберіть учнів для авторизації в додатку</string>
|
<string name="login_select_student">Виберіть учнів для авторизації в додатку</string>
|
||||||
@ -69,7 +71,7 @@
|
|||||||
<string name="login_contact_discord">Discord</string>
|
<string name="login_contact_discord">Discord</string>
|
||||||
<string name="login_email_intent_title">Надіслати електронний лист</string>
|
<string name="login_email_intent_title">Надіслати електронний лист</string>
|
||||||
<string name="login_recover_warning">Переконайтеся, що ви вибрали правильний тип щоденника UONET+!</string>
|
<string name="login_recover_warning">Переконайтеся, що ви вибрали правильний тип щоденника UONET+!</string>
|
||||||
<string name="login_recover_button">Забули пароль?</string>
|
<string name="login_recover_button">Скинути пароль</string>
|
||||||
<string name="login_recover_title">Відновіть свій обліковий запис</string>
|
<string name="login_recover_title">Відновіть свій обліковий запис</string>
|
||||||
<string name="login_recover">Відновити</string>
|
<string name="login_recover">Відновити</string>
|
||||||
<string name="login_signed_in">Учня вже авторизовано</string>
|
<string name="login_signed_in">Учня вже авторизовано</string>
|
||||||
@ -77,6 +79,13 @@
|
|||||||
<string name="login_other_search_locations">Інші розташування пошуку</string>
|
<string name="login_other_search_locations">Інші розташування пошуку</string>
|
||||||
<string name="login_no_active_student">Активних учнів не знайдено</string>
|
<string name="login_no_active_student">Активних учнів не знайдено</string>
|
||||||
<string name="login_symbol_enter">Введіть інший symbol</string>
|
<string name="login_symbol_enter">Введіть інший symbol</string>
|
||||||
|
<string name="login_support_title">Отримати допомогу</string>
|
||||||
|
<string name="login_support_school_hint">Повна назва школи з містом (обов\'язково)</string>
|
||||||
|
<string name="login_support_school_placeholder">Напр. ZSTiO Jarosław lub SP nr 99 w Łodzi</string>
|
||||||
|
<string name="login_support_school_invalid">Введіть правильну назву школи</string>
|
||||||
|
<string name="login_support_additional_hint">Додаткова інформація польською мовою (за бажанням)</string>
|
||||||
|
<string name="login_support_additional_placeholder">Напр. \"Я нещодавно змінив школу і...\" або \"Я батько і не бачу другу дитину...\"</string>
|
||||||
|
<string name="login_support_submit">Надіслати</string>
|
||||||
<!--Notifications-->
|
<!--Notifications-->
|
||||||
<string name="notifications_header_title">Увімкнути сповіщення</string>
|
<string name="notifications_header_title">Увімкнути сповіщення</string>
|
||||||
<string name="notifications_header_description">Увімкнути сповіщення, щоб не пропустити лист від вчителя або нову оцінку</string>
|
<string name="notifications_header_description">Увімкнути сповіщення, щоб не пропустити лист від вчителя або нову оцінку</string>
|
||||||
@ -186,10 +195,10 @@
|
|||||||
<string name="timetable_notify_change_teacher">Зміна вчителя з %1$s на %2$s</string>
|
<string name="timetable_notify_change_teacher">Зміна вчителя з %1$s на %2$s</string>
|
||||||
<string name="timetable_notify_change_subject">Зміна теми з %1$s на %2$s</string>
|
<string name="timetable_notify_change_subject">Зміна теми з %1$s на %2$s</string>
|
||||||
<plurals name="timetable_no_lesson">
|
<plurals name="timetable_no_lesson">
|
||||||
<item quantity="one">No lesson</item>
|
<item quantity="one">Немає уроку</item>
|
||||||
<item quantity="few">No lessons</item>
|
<item quantity="few">Немає уроків</item>
|
||||||
<item quantity="many">No lessons</item>
|
<item quantity="many">Немає уроків</item>
|
||||||
<item quantity="other">No lessons</item>
|
<item quantity="other">Немає уроків</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<plurals name="timetable_notify_new_items_title">
|
<plurals name="timetable_notify_new_items_title">
|
||||||
<item quantity="one">Зміна у розкладі</item>
|
<item quantity="one">Зміна у розкладі</item>
|
||||||
@ -704,9 +713,8 @@
|
|||||||
<string name="pref_view_present">Показувати присутність</string>
|
<string name="pref_view_present">Показувати присутність</string>
|
||||||
<string name="pref_view_app_theme">Тема</string>
|
<string name="pref_view_app_theme">Тема</string>
|
||||||
<string name="pref_view_expand_grade">Розгортання оцінок</string>
|
<string name="pref_view_expand_grade">Розгортання оцінок</string>
|
||||||
<string name="pref_view_timetable_show_timers">Позначити поточний урок</string>
|
|
||||||
<string name="pref_view_timetable_show_groups">Показувати групи поруч з темами</string>
|
<string name="pref_view_timetable_show_groups">Показувати групи поруч з темами</string>
|
||||||
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
<string name="pref_view_timetable_show_gaps">Показувати порожні плитки там, де немає уроків</string>
|
||||||
<string name="pref_view_grade_statistics_list">Показувати діаграми в оцінках класу</string>
|
<string name="pref_view_grade_statistics_list">Показувати діаграми в оцінках класу</string>
|
||||||
<string name="pref_view_subjects_without_grades">Показати предмети без оцінок</string>
|
<string name="pref_view_subjects_without_grades">Показати предмети без оцінок</string>
|
||||||
<string name="pref_view_grade_color_scheme">Схема кольорів оцінок</string>
|
<string name="pref_view_grade_color_scheme">Схема кольорів оцінок</string>
|
||||||
|
@ -22,7 +22,6 @@
|
|||||||
<bool name="pref_default_timetable_show_groups">false</bool>
|
<bool name="pref_default_timetable_show_groups">false</bool>
|
||||||
<string name="pref_default_timetable_show_whole_class">no</string>
|
<string name="pref_default_timetable_show_whole_class">no</string>
|
||||||
<string name="pref_default_grade_sorting_mode">alphabetic</string>
|
<string name="pref_default_grade_sorting_mode">alphabetic</string>
|
||||||
<bool name="pref_default_timetable_show_timers">false</bool>
|
|
||||||
<string name="pref_default_timetable_show_gaps">between</string>
|
<string name="pref_default_timetable_show_gaps">between</string>
|
||||||
<bool name="pref_default_subjects_without_grades">false</bool>
|
<bool name="pref_default_subjects_without_grades">false</bool>
|
||||||
<bool name="pref_default_optional_arithmetic_average">false</bool>
|
<bool name="pref_default_optional_arithmetic_average">false</bool>
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
<string name="pref_key_grade_sorting_mode">grade_sorting_mode</string>
|
<string name="pref_key_grade_sorting_mode">grade_sorting_mode</string>
|
||||||
<string name="pref_key_timetable_show_whole_class">show_whole_class_plan</string>
|
<string name="pref_key_timetable_show_whole_class">show_whole_class_plan</string>
|
||||||
<string name="pref_key_timetable_show_groups">show_groups_in_plan</string>
|
<string name="pref_key_timetable_show_groups">show_groups_in_plan</string>
|
||||||
<string name="pref_key_timetable_show_timers">timetable_show_timers</string>
|
|
||||||
<string name="pref_key_timetable_show_gaps">timetable_show_gaps</string>
|
<string name="pref_key_timetable_show_gaps">timetable_show_gaps</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>
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
<string name="login_token_hint">Token</string>
|
<string name="login_token_hint">Token</string>
|
||||||
<string name="login_pin_hint">PIN</string>
|
<string name="login_pin_hint">PIN</string>
|
||||||
<string name="login_symbol_hint">Symbol</string>
|
<string name="login_symbol_hint">Symbol</string>
|
||||||
|
<string name="login_symbol_placeholder">E.g. \"lodz\" or \"powiatjaroslawski\"</string>
|
||||||
<string name="login_sign_in">Sign in</string>
|
<string name="login_sign_in">Sign in</string>
|
||||||
<string name="login_invalid_password">Password too short</string>
|
<string name="login_invalid_password">Password too short</string>
|
||||||
<string name="login_incorrect_password_default">Login details are incorrect</string>
|
<string name="login_incorrect_password_default">Login details are incorrect</string>
|
||||||
@ -59,7 +60,8 @@
|
|||||||
<string name="login_invalid_email">Invalid email</string>
|
<string name="login_invalid_email">Invalid email</string>
|
||||||
<string name="login_invalid_login">Use the assigned login instead of email</string>
|
<string name="login_invalid_login">Use the assigned login instead of email</string>
|
||||||
<string name="login_invalid_custom_email">Use the assigned login or email in @%1$s</string>
|
<string name="login_invalid_custom_email">Use the assigned login or email in @%1$s</string>
|
||||||
<string name="login_invalid_symbol">Invalid symbol</string>
|
<string name="login_invalid_symbol">Invalid symbol. If you cannot find it, please contact the school</string>
|
||||||
|
<string name="login_invalid_symbol_definitely">Don\'t make this up! If you cannot find it, please contact the school</string>
|
||||||
<string name="login_incorrect_symbol">Student not found. Validate the symbol and the chosen variation of the UONET+ register</string>
|
<string name="login_incorrect_symbol">Student not found. Validate the symbol and the chosen variation of the UONET+ register</string>
|
||||||
<string name="login_duplicate_student">Selected student is already logged in</string>
|
<string name="login_duplicate_student">Selected student is already logged in</string>
|
||||||
<string name="login_symbol_helper">The symbol can be found on the register page in <b>Uczeń</b> → <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nMake sure that you have set the appropriate register variant in the <b>UONET+ register variant</b> field on the first login screen</string>
|
<string name="login_symbol_helper">The symbol can be found on the register page in <b>Uczeń</b> → <b>Dostęp Mobilny</b> → <b>Wygeneruj kod dostępu</b>.\n\nMake sure that you have set the appropriate register variant in the <b>UONET+ register variant</b> field on the first login screen</string>
|
||||||
@ -74,9 +76,9 @@
|
|||||||
<string name="login_contact_discord">Discord</string>
|
<string name="login_contact_discord">Discord</string>
|
||||||
<string name="login_email_intent_title">Send email</string>
|
<string name="login_email_intent_title">Send email</string>
|
||||||
<string name="login_email_subject" translatable="false">Zgłoszenie: Problemy z logowaniem</string>
|
<string name="login_email_subject" translatable="false">Zgłoszenie: Problemy z logowaniem</string>
|
||||||
<string name="login_email_text" translatable="false">Informacje o aplikacji:\n\nUrządzenie: %1$s\nWersja SDK: %2$s\nWersja aplikacji: %3$s\nDodatkowe informacje: %4$s\nIdentyfikator instalacji: %5$s\nOstatni błąd: %6$s\n\nNazwa szkoły i miejscowość: </string>
|
<string name="login_email_text" translatable="false">Informacje o aplikacji:\n\nUrządzenie: %1$s\nWersja SDK: %2$s\nWersja aplikacji: %3$s\nDodatkowe informacje: %4$s\nIdentyfikator instalacji: %5$s\nOstatni błąd: %6$s\n\nNazwa szkoły i miejscowość: %7$s\nDodatkowe informacje: %8$s</string>
|
||||||
<string name="login_recover_warning">Make sure you select the correct UONET+ register variation!</string>
|
<string name="login_recover_warning">Make sure you select the correct UONET+ register variation!</string>
|
||||||
<string name="login_recover_button">I forgot my password</string>
|
<string name="login_recover_button">Reset password</string>
|
||||||
<string name="login_recover_title">Recover your account</string>
|
<string name="login_recover_title">Recover your account</string>
|
||||||
<string name="login_recover">Recover</string>
|
<string name="login_recover">Recover</string>
|
||||||
<string name="login_signed_in">Student is already signed in</string>
|
<string name="login_signed_in">Student is already signed in</string>
|
||||||
@ -84,6 +86,13 @@
|
|||||||
<string name="login_other_search_locations">Other search locations</string>
|
<string name="login_other_search_locations">Other search locations</string>
|
||||||
<string name="login_no_active_student">No active students found</string>
|
<string name="login_no_active_student">No active students found</string>
|
||||||
<string name="login_symbol_enter">Enter a different symbol</string>
|
<string name="login_symbol_enter">Enter a different symbol</string>
|
||||||
|
<string name="login_support_title">Get help</string>
|
||||||
|
<string name="login_support_school_hint">Full school name with the town (required)</string>
|
||||||
|
<string name="login_support_school_placeholder">Np. ZSTiO Jarosław lub SP nr 99 w Łodzi</string>
|
||||||
|
<string name="login_support_school_invalid">Enter correct name of the school</string>
|
||||||
|
<string name="login_support_additional_hint">Additional information in Polish (optional)</string>
|
||||||
|
<string name="login_support_additional_placeholder">Np. \"Ostatnio zmieniłem szkołę i…\" albo \"Jestem rodzicem i nie widzę drugiego dziecka…\"</string>
|
||||||
|
<string name="login_support_submit">Submit</string>
|
||||||
|
|
||||||
|
|
||||||
<!--Notifications-->
|
<!--Notifications-->
|
||||||
@ -692,7 +701,6 @@
|
|||||||
<string name="pref_view_present">Show presence</string>
|
<string name="pref_view_present">Show presence</string>
|
||||||
<string name="pref_view_app_theme">Theme</string>
|
<string name="pref_view_app_theme">Theme</string>
|
||||||
<string name="pref_view_expand_grade">Grades expanding</string>
|
<string name="pref_view_expand_grade">Grades expanding</string>
|
||||||
<string name="pref_view_timetable_show_timers">Mark current lesson</string>
|
|
||||||
<string name="pref_view_timetable_show_groups">Show groups next to subjects</string>
|
<string name="pref_view_timetable_show_groups">Show groups next to subjects</string>
|
||||||
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
<string name="pref_view_timetable_show_gaps">Show empty tiles where there\'s no lesson</string>
|
||||||
<string name="pref_view_grade_statistics_list">Show chart list in class grades</string>
|
<string name="pref_view_grade_statistics_list">Show chart list in class grades</string>
|
||||||
|
@ -82,7 +82,6 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="FullScreenDialogStyle" parent="WulkanowyTheme">
|
<style name="FullScreenDialogStyle" parent="WulkanowyTheme">
|
||||||
<item name="android:windowFullscreen">true</item>
|
|
||||||
<item name="android:windowIsFloating">false</item>
|
<item name="android:windowIsFloating">false</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -90,11 +90,6 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
app:title="@string/pref_timetable_appearance_view">
|
app:title="@string/pref_timetable_appearance_view">
|
||||||
<SwitchPreferenceCompat
|
|
||||||
app:defaultValue="@bool/pref_default_timetable_show_timers"
|
|
||||||
app:iconSpaceReserved="false"
|
|
||||||
app:key="@string/pref_key_timetable_show_timers"
|
|
||||||
app:title="@string/pref_view_timetable_show_timers" />
|
|
||||||
<SwitchPreferenceCompat
|
<SwitchPreferenceCompat
|
||||||
app:defaultValue="@bool/pref_default_timetable_show_groups"
|
app:defaultValue="@bool/pref_default_timetable_show_groups"
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
|
@ -2,8 +2,8 @@ package io.github.wulkanowy.utils
|
|||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
||||||
import fr.bipi.tressence.base.FormatterPriorityTree
|
import fr.bipi.treessence.base.FormatterPriorityTree
|
||||||
import fr.bipi.tressence.common.StackTraceRecorder
|
import fr.bipi.treessence.common.StackTraceRecorder
|
||||||
|
|
||||||
class CrashLogTree : FormatterPriorityTree(Log.VERBOSE) {
|
class CrashLogTree : FormatterPriorityTree(Log.VERBOSE) {
|
||||||
|
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
package io.github.wulkanowy.utils
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import com.google.android.play.core.integrity.IntegrityManagerFactory
|
||||||
|
import com.google.android.play.core.integrity.IntegrityTokenRequest
|
||||||
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
|
import kotlinx.coroutines.tasks.await
|
||||||
|
import java.util.UUID
|
||||||
|
import javax.inject.Inject
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
class IntegrityHelper @Inject constructor(
|
||||||
|
@ApplicationContext private val context: Context,
|
||||||
|
) {
|
||||||
|
|
||||||
|
suspend fun getIntegrityToken(nonce: String): String? {
|
||||||
|
val integrityManager = IntegrityManagerFactory.create(context)
|
||||||
|
|
||||||
|
val integrityTokenResponse = integrityManager.requestIntegrityToken(
|
||||||
|
IntegrityTokenRequest.builder()
|
||||||
|
.setNonce(nonce)
|
||||||
|
.build()
|
||||||
|
)
|
||||||
|
return integrityTokenResponse.await().token()
|
||||||
|
}
|
||||||
|
}
|
@ -5,6 +5,7 @@ import io.github.wulkanowy.data.pojos.RegisterStudent
|
|||||||
import io.github.wulkanowy.data.pojos.RegisterSymbol
|
import io.github.wulkanowy.data.pojos.RegisterSymbol
|
||||||
import io.github.wulkanowy.data.pojos.RegisterUnit
|
import io.github.wulkanowy.data.pojos.RegisterUnit
|
||||||
import io.github.wulkanowy.data.pojos.RegisterUser
|
import io.github.wulkanowy.data.pojos.RegisterUser
|
||||||
|
import io.github.wulkanowy.data.repositories.SchoolsRepository
|
||||||
import io.github.wulkanowy.data.repositories.StudentRepository
|
import io.github.wulkanowy.data.repositories.StudentRepository
|
||||||
import io.github.wulkanowy.sdk.Sdk
|
import io.github.wulkanowy.sdk.Sdk
|
||||||
import io.github.wulkanowy.sdk.scrapper.Scrapper
|
import io.github.wulkanowy.sdk.scrapper.Scrapper
|
||||||
@ -40,6 +41,9 @@ class LoginStudentSelectPresenterTest {
|
|||||||
@MockK
|
@MockK
|
||||||
lateinit var studentRepository: StudentRepository
|
lateinit var studentRepository: StudentRepository
|
||||||
|
|
||||||
|
@MockK
|
||||||
|
lateinit var schoolsRepository: SchoolsRepository
|
||||||
|
|
||||||
@MockK(relaxed = true)
|
@MockK(relaxed = true)
|
||||||
lateinit var analytics: AnalyticsHelper
|
lateinit var analytics: AnalyticsHelper
|
||||||
|
|
||||||
@ -110,6 +114,7 @@ class LoginStudentSelectPresenterTest {
|
|||||||
clearMocks(studentRepository, loginStudentSelectView)
|
clearMocks(studentRepository, loginStudentSelectView)
|
||||||
|
|
||||||
coEvery { studentRepository.getSavedStudents(false) } returns emptyList()
|
coEvery { studentRepository.getSavedStudents(false) } returns emptyList()
|
||||||
|
coEvery { schoolsRepository.logSchoolLogin(any(), any()) } just Runs
|
||||||
|
|
||||||
every { loginStudentSelectView.initView() } just Runs
|
every { loginStudentSelectView.initView() } just Runs
|
||||||
every { loginStudentSelectView.symbols } returns emptyMap()
|
every { loginStudentSelectView.symbols } returns emptyMap()
|
||||||
@ -120,6 +125,7 @@ class LoginStudentSelectPresenterTest {
|
|||||||
|
|
||||||
presenter = LoginStudentSelectPresenter(
|
presenter = LoginStudentSelectPresenter(
|
||||||
studentRepository = studentRepository,
|
studentRepository = studentRepository,
|
||||||
|
schoolsRepository = schoolsRepository,
|
||||||
loginErrorHandler = errorHandler,
|
loginErrorHandler = errorHandler,
|
||||||
syncManager = syncManager,
|
syncManager = syncManager,
|
||||||
analytics = analytics,
|
analytics = analytics,
|
||||||
|
18
build.gradle
18
build.gradle
@ -1,8 +1,8 @@
|
|||||||
buildscript {
|
buildscript {
|
||||||
ext {
|
ext {
|
||||||
kotlin_version = '1.9.0'
|
kotlin_version = '1.9.10'
|
||||||
about_libraries = '10.8.3'
|
about_libraries = '10.9.1'
|
||||||
hilt_version = "2.47"
|
hilt_version = '2.48.1'
|
||||||
}
|
}
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
@ -13,15 +13,15 @@ buildscript {
|
|||||||
dependencies {
|
dependencies {
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
|
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
|
||||||
classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.11"
|
classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.13"
|
||||||
classpath 'com.android.tools.build:gradle:8.1.0'
|
classpath 'com.android.tools.build:gradle:8.1.2'
|
||||||
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
|
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
|
||||||
classpath 'com.google.gms:google-services:4.3.15'
|
classpath 'com.google.gms:google-services:4.4.0'
|
||||||
classpath 'com.huawei.agconnect:agcp:1.9.1.300'
|
classpath 'com.huawei.agconnect:agcp:1.9.1.301'
|
||||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.8'
|
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9'
|
||||||
classpath "com.github.triplet.gradle:play-publisher:3.8.4"
|
classpath "com.github.triplet.gradle:play-publisher:3.8.4"
|
||||||
classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0"
|
classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0"
|
||||||
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.3.0.3225"
|
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.4.1.3373"
|
||||||
classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0"
|
classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0"
|
||||||
classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries"
|
classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries"
|
||||||
}
|
}
|
||||||
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
3
gradle/wrapper/gradle-wrapper.properties
vendored
3
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,7 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
5
gradlew
vendored
5
gradlew
vendored
@ -130,10 +130,13 @@ location of your Java installation."
|
|||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
JAVACMD=java
|
JAVACMD=java
|
||||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
if ! command -v java >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
|
||||||
Please set the JAVA_HOME variable in your environment to match the
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
location of your Java installation."
|
location of your Java installation."
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Increase the maximum file descriptors if we can.
|
# Increase the maximum file descriptors if we can.
|
||||||
|
@ -1,4 +1 @@
|
|||||||
plugins {
|
|
||||||
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0'
|
|
||||||
}
|
|
||||||
include ':app'
|
include ':app'
|
||||||
|
Reference in New Issue
Block a user