Compare commits
49 Commits
Author | SHA1 | Date | |
---|---|---|---|
770749e158 | |||
0aa83b020e | |||
4d1218d1d3 | |||
0ea6cbc8ed | |||
eb31f9578f | |||
f69d50d2c1 | |||
8a424ee6a4 | |||
7dfa48bbe3 | |||
d811cdb919 | |||
e2f2e21081 | |||
c812310497 | |||
7f6475cf35 | |||
a2a7d2ebb2 | |||
a5bc45c5da | |||
5646befbd7 | |||
75f496b5d2 | |||
23d989d22a | |||
9e013f7cd9 | |||
c63a7c03f1 | |||
5ceee84f0e | |||
7f4539fd27 | |||
71ebf1260b | |||
784ee58384 | |||
eceef3f582 | |||
0d950fbd86 | |||
003d63b516 | |||
b4c0440a8e | |||
137c305295 | |||
2c40c221c3 | |||
e82ac78d4a | |||
59d46ce956 | |||
17caa8ecbd | |||
e9540b4012 | |||
643ad60455 | |||
01f892ce5c | |||
f61b6a5e78 | |||
650cf7484e | |||
037cbb0b19 | |||
e49835e89e | |||
c64be2fab0 | |||
ce9cb35172 | |||
7fa9219c7b | |||
1fe1618220 | |||
d9bab2af78 | |||
06b6d88dd1 | |||
3bf27baed5 | |||
6802d74002 | |||
3fd2683df7 | |||
b708c70ea2 |
10
.idea/migrations.xml
generated
Normal file
10
.idea/migrations.xml
generated
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectMigrations">
|
||||||
|
<option name="MigrateToGradleLocalJavaHome">
|
||||||
|
<set>
|
||||||
|
<option value="$PROJECT_DIR$" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -27,8 +27,8 @@ android {
|
|||||||
testApplicationId "io.github.tests.wulkanowy"
|
testApplicationId "io.github.tests.wulkanowy"
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 34
|
targetSdkVersion 34
|
||||||
versionCode 136
|
versionCode 141
|
||||||
versionName "2.2.4"
|
versionName "2.3.1"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
resValue "string", "app_name", "Wulkanowy"
|
resValue "string", "app_name", "Wulkanowy"
|
||||||
@ -113,6 +113,7 @@ android {
|
|||||||
|
|
||||||
buildFeatures {
|
buildFeatures {
|
||||||
viewBinding true
|
viewBinding true
|
||||||
|
buildConfig true
|
||||||
}
|
}
|
||||||
|
|
||||||
bundle {
|
bundle {
|
||||||
@ -161,8 +162,8 @@ play {
|
|||||||
defaultToAppBundles = false
|
defaultToAppBundles = false
|
||||||
track = 'production'
|
track = 'production'
|
||||||
releaseStatus = ReleaseStatus.IN_PROGRESS
|
releaseStatus = ReleaseStatus.IN_PROGRESS
|
||||||
userFraction = 0.01d
|
userFraction = 0.99d
|
||||||
updatePriority = 0
|
updatePriority = 3
|
||||||
enabled.set(false)
|
enabled.set(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -183,28 +184,28 @@ huaweiPublish {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
work_manager = "2.8.1"
|
work_manager = "2.9.0"
|
||||||
android_hilt = "1.0.0"
|
android_hilt = "1.1.0"
|
||||||
room = "2.6.0"
|
room = "2.6.1"
|
||||||
chucker = "3.5.2"
|
chucker = "4.0.0"
|
||||||
mockk = "1.13.8"
|
mockk = "1.13.8"
|
||||||
coroutines = "1.7.3"
|
coroutines = "1.7.3"
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'io.github.wulkanowy:sdk:2.2.4'
|
implementation 'com.github.wulkanowy:sdk:2.3.3'
|
||||||
|
|
||||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
|
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
|
||||||
|
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0"
|
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2"
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines"
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines"
|
||||||
|
|
||||||
implementation 'androidx.core:core-ktx:1.12.0'
|
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.8.0"
|
implementation "androidx.activity:activity-ktx:1.8.2"
|
||||||
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.2"
|
||||||
implementation "androidx.annotation:annotation:1.7.0"
|
implementation "androidx.annotation:annotation:1.7.1"
|
||||||
|
|
||||||
implementation "androidx.preference:preference-ktx:1.2.1"
|
implementation "androidx.preference:preference-ktx:1.2.1"
|
||||||
implementation "androidx.recyclerview:recyclerview:1.3.2"
|
implementation "androidx.recyclerview:recyclerview:1.3.2"
|
||||||
@ -217,7 +218,7 @@ dependencies {
|
|||||||
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'
|
||||||
|
|
||||||
implementation "androidx.work:work-runtime-ktx:$work_manager"
|
implementation "androidx.work:work-runtime:$work_manager"
|
||||||
playImplementation "androidx.work:work-gcm:$work_manager"
|
playImplementation "androidx.work:work-gcm:$work_manager"
|
||||||
|
|
||||||
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2"
|
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2"
|
||||||
@ -242,28 +243,30 @@ dependencies {
|
|||||||
implementation "at.favre.lib:slf4j-timber:1.0.1"
|
implementation "at.favre.lib:slf4j-timber:1.0.1"
|
||||||
implementation 'com.github.bastienpaulfr:Treessence:1.1.2'
|
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.5.0'
|
||||||
implementation "io.github.wulkanowy:AppKillerManager:3.0.1"
|
implementation "io.github.wulkanowy:AppKillerManager:3.0.1"
|
||||||
implementation 'me.xdrop:fuzzywuzzy:1.4.0'
|
implementation 'me.xdrop:fuzzywuzzy:1.4.0'
|
||||||
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.11.0'
|
||||||
|
|
||||||
playImplementation platform('com.google.firebase:firebase-bom:32.4.0')
|
playImplementation platform('com.google.firebase:firebase-bom:32.7.0')
|
||||||
playImplementation 'com.google.firebase:firebase-analytics-ktx'
|
playImplementation 'com.google.firebase:firebase-analytics'
|
||||||
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'
|
||||||
playImplementation 'com.google.android.gms:play-services-ads:22.4.0'
|
|
||||||
playImplementation "com.google.android.play:integrity:1.2.0"
|
playImplementation 'com.google.android.gms:play-services-ads:22.6.0'
|
||||||
|
playImplementation "com.google.android.play:integrity:1.3.0"
|
||||||
playImplementation 'com.google.android.play:app-update-ktx:2.1.0'
|
playImplementation 'com.google.android.play:app-update-ktx:2.1.0'
|
||||||
playImplementation 'com.google.android.play:review-ktx:2.0.1'
|
playImplementation 'com.google.android.play:review-ktx:2.0.1'
|
||||||
|
playImplementation "com.google.android.ump:user-messaging-platform:2.1.0"
|
||||||
|
|
||||||
hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.300'
|
hmsImplementation 'com.huawei.hms:hianalytics:6.12.0.300'
|
||||||
hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.301'
|
hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.1.303'
|
||||||
|
|
||||||
releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker"
|
releaseImplementation "com.github.chuckerteam.chucker:library-no-op:$chucker"
|
||||||
|
|
||||||
debugImplementation "com.github.ChuckerTeam.Chucker:library:$chucker"
|
debugImplementation "com.github.chuckerteam.chucker:library:$chucker"
|
||||||
debugImplementation 'com.github.amitshekhariitbhu.Android-Debug-Database:debug-db:1.0.6'
|
debugImplementation 'com.github.amitshekhariitbhu.Android-Debug-Database:debug-db:1.0.6'
|
||||||
debugImplementation 'com.github.haroldadmin:WhatTheStack:1.0.0-alpha04'
|
debugImplementation 'com.github.haroldadmin:WhatTheStack:1.0.0-alpha04'
|
||||||
|
|
||||||
@ -272,7 +275,7 @@ dependencies {
|
|||||||
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines"
|
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines"
|
||||||
testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
|
testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
|
||||||
|
|
||||||
testImplementation 'org.robolectric:robolectric:4.10.3'
|
testImplementation 'org.robolectric:robolectric:4.11.1'
|
||||||
testImplementation "androidx.test:runner:1.5.2"
|
testImplementation "androidx.test:runner:1.5.2"
|
||||||
testImplementation "androidx.test.ext:junit:1.1.5"
|
testImplementation "androidx.test.ext:junit:1.1.5"
|
||||||
testImplementation "androidx.test:core:1.5.0"
|
testImplementation "androidx.test:core:1.5.0"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
apply plugin: "jacoco"
|
apply plugin: "jacoco"
|
||||||
|
|
||||||
jacoco {
|
jacoco {
|
||||||
toolVersion "0.8.10"
|
toolVersion "0.8.11"
|
||||||
reportsDirectory.set(file("$buildDir/reports"))
|
reportsDirectory.set(file("$buildDir/reports"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ import android.view.View
|
|||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
||||||
import io.github.wulkanowy.ui.modules.dashboard.DashboardItem
|
import io.github.wulkanowy.ui.modules.dashboard.DashboardItem
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
@ -13,9 +14,11 @@ class AdsHelper @Inject constructor(
|
|||||||
private val preferencesRepository: PreferencesRepository
|
private val preferencesRepository: PreferencesRepository
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
val isMobileAdsSdkInitialized = MutableStateFlow(false)
|
||||||
|
val canShowAd = false
|
||||||
|
|
||||||
fun initialize() {
|
fun initialize() {
|
||||||
preferencesRepository.isAdsEnabled = false
|
preferencesRepository.isAdsEnabled = false
|
||||||
preferencesRepository.isAgreeToProcessData = false
|
|
||||||
preferencesRepository.selectedDashboardTiles -= DashboardItem.Tile.ADS
|
preferencesRepository.selectedDashboardTiles -= DashboardItem.Tile.ADS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ import android.view.View
|
|||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
||||||
import io.github.wulkanowy.ui.modules.dashboard.DashboardItem
|
import io.github.wulkanowy.ui.modules.dashboard.DashboardItem
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
@ -12,10 +13,11 @@ class AdsHelper @Inject constructor(
|
|||||||
@ApplicationContext private val context: Context,
|
@ApplicationContext private val context: Context,
|
||||||
private val preferencesRepository: PreferencesRepository
|
private val preferencesRepository: PreferencesRepository
|
||||||
) {
|
) {
|
||||||
|
val isMobileAdsSdkInitialized = MutableStateFlow(false)
|
||||||
|
val canShowAd = false
|
||||||
|
|
||||||
fun initialize() {
|
fun initialize() {
|
||||||
preferencesRepository.isAdsEnabled = false
|
preferencesRepository.isAdsEnabled = false
|
||||||
preferencesRepository.isAgreeToProcessData = false
|
|
||||||
preferencesRepository.selectedDashboardTiles -= DashboardItem.Tile.ADS
|
preferencesRepository.selectedDashboardTiles -= DashboardItem.Tile.ADS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
package io.github.wulkanowy
|
package io.github.wulkanowy
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.util.Log.*
|
import android.util.Log.DEBUG
|
||||||
|
import android.util.Log.INFO
|
||||||
|
import android.util.Log.VERBOSE
|
||||||
import androidx.hilt.work.HiltWorkerFactory
|
import androidx.hilt.work.HiltWorkerFactory
|
||||||
import androidx.work.Configuration
|
import androidx.work.Configuration
|
||||||
import com.yariksoffice.lingver.Lingver
|
import com.yariksoffice.lingver.Lingver
|
||||||
@ -9,16 +11,19 @@ import dagger.hilt.android.HiltAndroidApp
|
|||||||
import fr.bipi.treessence.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.ActivityLifecycleLogger
|
||||||
|
import io.github.wulkanowy.utils.AnalyticsHelper
|
||||||
|
import io.github.wulkanowy.utils.AppInfo
|
||||||
|
import io.github.wulkanowy.utils.CrashLogExceptionTree
|
||||||
|
import io.github.wulkanowy.utils.CrashLogTree
|
||||||
|
import io.github.wulkanowy.utils.DebugLogTree
|
||||||
|
import io.github.wulkanowy.utils.RemoteConfigHelper
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltAndroidApp
|
@HiltAndroidApp
|
||||||
class WulkanowyApp : Application(), Configuration.Provider {
|
class WulkanowyApp : Application(), Configuration.Provider {
|
||||||
|
|
||||||
@Inject
|
|
||||||
lateinit var workerFactory: HiltWorkerFactory
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var themeManager: ThemeManager
|
lateinit var themeManager: ThemeManager
|
||||||
|
|
||||||
@ -32,16 +37,21 @@ class WulkanowyApp : Application(), Configuration.Provider {
|
|||||||
lateinit var analyticsHelper: AnalyticsHelper
|
lateinit var analyticsHelper: AnalyticsHelper
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var adsHelper: AdsHelper
|
lateinit var remoteConfigHelper: RemoteConfigHelper
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var remoteConfigHelper: RemoteConfigHelper
|
lateinit var workerFactory: HiltWorkerFactory
|
||||||
|
|
||||||
|
override val workManagerConfiguration: Configuration
|
||||||
|
get() = Configuration.Builder()
|
||||||
|
.setWorkerFactory(workerFactory)
|
||||||
|
.setMinimumLoggingLevel(if (appInfo.isDebug) VERBOSE else INFO)
|
||||||
|
.build()
|
||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
initializeAppLanguage()
|
initializeAppLanguage()
|
||||||
themeManager.applyDefaultTheme()
|
themeManager.applyDefaultTheme()
|
||||||
adsHelper.initialize()
|
|
||||||
remoteConfigHelper.initialize()
|
remoteConfigHelper.initialize()
|
||||||
initLogging()
|
initLogging()
|
||||||
}
|
}
|
||||||
@ -74,9 +84,4 @@ class WulkanowyApp : Application(), Configuration.Provider {
|
|||||||
analyticsHelper.logEvent("language", "startup" to preferencesRepository.appLanguage)
|
analyticsHelper.logEvent("language", "startup" to preferencesRepository.appLanguage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getWorkManagerConfiguration() = Configuration.Builder()
|
|
||||||
.setWorkerFactory(workerFactory)
|
|
||||||
.setMinimumLoggingLevel(if (appInfo.isDebug) VERBOSE else INFO)
|
|
||||||
.build()
|
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration10 : Migration(9, 10) {
|
class Migration10 : Migration(9, 10) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Grades_Summary RENAME TO GradesSummary")
|
db.execSQL("ALTER TABLE Grades_Summary RENAME TO GradesSummary")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration11 : Migration(10, 11) {
|
class Migration11 : Migration(10, 11) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS Grades_temp (
|
CREATE TABLE IF NOT EXISTS Grades_temp (
|
||||||
id INTEGER PRIMARY KEY NOT NULL,
|
id INTEGER PRIMARY KEY NOT NULL,
|
||||||
is_read INTEGER NOT NULL,
|
is_read INTEGER NOT NULL,
|
||||||
@ -26,9 +27,10 @@ class Migration11 : Migration(10, 11) {
|
|||||||
date INTEGER NOT NULL,
|
date INTEGER NOT NULL,
|
||||||
teacher TEXT NOT NULL
|
teacher TEXT NOT NULL
|
||||||
)
|
)
|
||||||
""")
|
"""
|
||||||
database.execSQL("INSERT INTO Grades_temp SELECT * FROM Grades")
|
)
|
||||||
database.execSQL("DROP TABLE Grades")
|
db.execSQL("INSERT INTO Grades_temp SELECT * FROM Grades")
|
||||||
database.execSQL("ALTER TABLE Grades_temp RENAME TO Grades")
|
db.execSQL("DROP TABLE Grades")
|
||||||
|
db.execSQL("ALTER TABLE Grades_temp RENAME TO Grades")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,16 +5,17 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration12 : Migration(11, 12) {
|
class Migration12 : Migration(11, 12) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
createTempStudentsTable(database)
|
createTempStudentsTable(db)
|
||||||
replaceStudentTable(database)
|
replaceStudentTable(db)
|
||||||
updateStudentsWithClassId(database, getStudentsIds(database))
|
updateStudentsWithClassId(db, getStudentsIds(db))
|
||||||
removeStudentsWithNoClassId(database)
|
removeStudentsWithNoClassId(db)
|
||||||
ensureThereIsOnlyOneCurrentStudent(database)
|
ensureThereIsOnlyOneCurrentStudent(db)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createTempStudentsTable(database: SupportSQLiteDatabase) {
|
private fun createTempStudentsTable(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS Students_tmp (
|
CREATE TABLE IF NOT EXISTS Students_tmp (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
endpoint TEXT NOT NULL,
|
endpoint TEXT NOT NULL,
|
||||||
@ -30,15 +31,16 @@ class Migration12 : Migration(11, 12) {
|
|||||||
registration_date INTEGER NOT NULL,
|
registration_date INTEGER NOT NULL,
|
||||||
class_id INTEGER NOT NULL
|
class_id INTEGER NOT NULL
|
||||||
)
|
)
|
||||||
""")
|
"""
|
||||||
database.execSQL("CREATE UNIQUE INDEX index_Students_email_symbol_student_id_school_id_class_id ON Students_tmp (email, symbol, student_id, school_id, class_id)")
|
)
|
||||||
|
db.execSQL("CREATE UNIQUE INDEX index_Students_email_symbol_student_id_school_id_class_id ON Students_tmp (email, symbol, student_id, school_id, class_id)")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun replaceStudentTable(database: SupportSQLiteDatabase) {
|
private fun replaceStudentTable(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Students ADD COLUMN class_id INTEGER DEFAULT 0 NOT NULL")
|
db.execSQL("ALTER TABLE Students ADD COLUMN class_id INTEGER DEFAULT 0 NOT NULL")
|
||||||
database.execSQL("INSERT INTO Students_tmp SELECT * FROM Students")
|
db.execSQL("INSERT INTO Students_tmp SELECT * FROM Students")
|
||||||
database.execSQL("DROP TABLE Students")
|
db.execSQL("DROP TABLE Students")
|
||||||
database.execSQL("ALTER TABLE Students_tmp RENAME TO Students")
|
db.execSQL("ALTER TABLE Students_tmp RENAME TO Students")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getStudentsIds(database: SupportSQLiteDatabase): List<Int> {
|
private fun getStudentsIds(database: SupportSQLiteDatabase): List<Int> {
|
||||||
@ -54,18 +56,18 @@ class Migration12 : Migration(11, 12) {
|
|||||||
return students
|
return students
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateStudentsWithClassId(database: SupportSQLiteDatabase, students: List<Int>) {
|
private fun updateStudentsWithClassId(db: SupportSQLiteDatabase, students: List<Int>) {
|
||||||
students.forEach {
|
students.forEach {
|
||||||
database.execSQL("UPDATE Students SET class_id = IFNULL((SELECT class_id FROM Semesters WHERE student_id = $it), 0) WHERE student_id = $it")
|
db.execSQL("UPDATE Students SET class_id = IFNULL((SELECT class_id FROM Semesters WHERE student_id = $it), 0) WHERE student_id = $it")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun removeStudentsWithNoClassId(database: SupportSQLiteDatabase) {
|
private fun removeStudentsWithNoClassId(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DELETE FROM Students WHERE class_id = 0")
|
db.execSQL("DELETE FROM Students WHERE class_id = 0")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun ensureThereIsOnlyOneCurrentStudent(database: SupportSQLiteDatabase) {
|
private fun ensureThereIsOnlyOneCurrentStudent(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("UPDATE Students SET is_current = 0")
|
db.execSQL("UPDATE Students SET is_current = 0")
|
||||||
database.execSQL("UPDATE Students SET is_current = 1 WHERE id = (SELECT MAX(id) FROM Students)")
|
db.execSQL("UPDATE Students SET is_current = 1 WHERE id = (SELECT MAX(id) FROM Students)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,27 +5,30 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration13 : Migration(12, 13) {
|
class Migration13 : Migration(12, 13) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
addClassNameToStudents(database, getStudentsIds(database))
|
addClassNameToStudents(db, getStudentsIds(db))
|
||||||
updateSemestersTable(database)
|
updateSemestersTable(db)
|
||||||
markAtLeastAndOnlyOneSemesterAtCurrent(database, getStudentsAndClassIds(database))
|
markAtLeastAndOnlyOneSemesterAtCurrent(db, getStudentsAndClassIds(db))
|
||||||
clearMessagesTable(database)
|
clearMessagesTable(db)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addClassNameToStudents(database: SupportSQLiteDatabase, students: List<Pair<Int, String>>) {
|
private fun addClassNameToStudents(
|
||||||
database.execSQL("ALTER TABLE Students ADD COLUMN class_name TEXT DEFAULT \"\" NOT NULL")
|
db: SupportSQLiteDatabase,
|
||||||
|
students: List<Pair<Int, String>>
|
||||||
|
) {
|
||||||
|
db.execSQL("ALTER TABLE Students ADD COLUMN class_name TEXT DEFAULT \"\" NOT NULL")
|
||||||
|
|
||||||
students.forEach { (id, name) ->
|
students.forEach { (id, name) ->
|
||||||
val schoolName = name.substringAfter(" - ")
|
val schoolName = name.substringAfter(" - ")
|
||||||
val className = name.substringBefore(" - ", "").replace("Klasa ", "")
|
val className = name.substringBefore(" - ", "").replace("Klasa ", "")
|
||||||
database.execSQL("UPDATE Students SET class_name = '$className' WHERE id = '$id'")
|
db.execSQL("UPDATE Students SET class_name = '$className' WHERE id = '$id'")
|
||||||
database.execSQL("UPDATE Students SET school_name = '$schoolName' WHERE id = '$id'")
|
db.execSQL("UPDATE Students SET school_name = '$schoolName' WHERE id = '$id'")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getStudentsIds(database: SupportSQLiteDatabase): MutableList<Pair<Int, String>> {
|
private fun getStudentsIds(db: SupportSQLiteDatabase): MutableList<Pair<Int, String>> {
|
||||||
val students = mutableListOf<Pair<Int, String>>()
|
val students = mutableListOf<Pair<Int, String>>()
|
||||||
database.query("SELECT id, school_name FROM Students").use {
|
db.query("SELECT id, school_name FROM Students").use {
|
||||||
if (it.moveToFirst()) {
|
if (it.moveToFirst()) {
|
||||||
do {
|
do {
|
||||||
students.add(it.getInt(0) to it.getString(1))
|
students.add(it.getInt(0) to it.getString(1))
|
||||||
@ -36,15 +39,15 @@ class Migration13 : Migration(12, 13) {
|
|||||||
return students
|
return students
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateSemestersTable(database: SupportSQLiteDatabase) {
|
private fun updateSemestersTable(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Semesters ADD COLUMN school_year INTEGER DEFAULT 1970 NOT NULL")
|
db.execSQL("ALTER TABLE Semesters ADD COLUMN school_year INTEGER DEFAULT 1970 NOT NULL")
|
||||||
database.execSQL("ALTER TABLE Semesters ADD COLUMN start INTEGER DEFAULT 0 NOT NULL")
|
db.execSQL("ALTER TABLE Semesters ADD COLUMN start INTEGER DEFAULT 0 NOT NULL")
|
||||||
database.execSQL("ALTER TABLE Semesters ADD COLUMN `end` INTEGER DEFAULT 0 NOT NULL")
|
db.execSQL("ALTER TABLE Semesters ADD COLUMN `end` INTEGER DEFAULT 0 NOT NULL")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getStudentsAndClassIds(database: SupportSQLiteDatabase): List<Pair<Int, Int>> {
|
private fun getStudentsAndClassIds(db: SupportSQLiteDatabase): List<Pair<Int, Int>> {
|
||||||
val students = mutableListOf<Pair<Int, Int>>()
|
val students = mutableListOf<Pair<Int, Int>>()
|
||||||
database.query("SELECT student_id, class_id FROM Students").use {
|
db.query("SELECT student_id, class_id FROM Students").use {
|
||||||
if (it.moveToFirst()) {
|
if (it.moveToFirst()) {
|
||||||
do {
|
do {
|
||||||
students.add(it.getInt(0) to it.getInt(1))
|
students.add(it.getInt(0) to it.getInt(1))
|
||||||
@ -55,14 +58,17 @@ class Migration13 : Migration(12, 13) {
|
|||||||
return students
|
return students
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun markAtLeastAndOnlyOneSemesterAtCurrent(database: SupportSQLiteDatabase, students: List<Pair<Int, Int>>) {
|
private fun markAtLeastAndOnlyOneSemesterAtCurrent(
|
||||||
|
db: SupportSQLiteDatabase,
|
||||||
|
students: List<Pair<Int, Int>>
|
||||||
|
) {
|
||||||
students.forEach { (studentId, classId) ->
|
students.forEach { (studentId, classId) ->
|
||||||
database.execSQL("UPDATE Semesters SET is_current = 0 WHERE student_id = '$studentId' AND class_id = '$classId'")
|
db.execSQL("UPDATE Semesters SET is_current = 0 WHERE student_id = '$studentId' AND class_id = '$classId'")
|
||||||
database.execSQL("UPDATE Semesters SET is_current = 1 WHERE id = (SELECT id FROM Semesters WHERE student_id = '$studentId' AND class_id = '$classId' ORDER BY semester_id DESC)")
|
db.execSQL("UPDATE Semesters SET is_current = 1 WHERE id = (SELECT id FROM Semesters WHERE student_id = '$studentId' AND class_id = '$classId' ORDER BY semester_id DESC)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun clearMessagesTable(database: SupportSQLiteDatabase) {
|
private fun clearMessagesTable(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DELETE FROM Messages")
|
db.execSQL("DELETE FROM Messages")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,9 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration14 : Migration(13, 14) {
|
class Migration14 : Migration(13, 14) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE IF EXISTS GradesSummary")
|
db.execSQL("DROP TABLE IF EXISTS GradesSummary")
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS GradesSummary (
|
CREATE TABLE IF NOT EXISTS GradesSummary (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
semester_id INTEGER NOT NULL,
|
semester_id INTEGER NOT NULL,
|
||||||
|
@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration15 : Migration(14, 15) {
|
class Migration15 : Migration(14, 15) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS MobileDevices (
|
CREATE TABLE IF NOT EXISTS MobileDevices (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
@ -14,6 +15,7 @@ class Migration15 : Migration(14, 15) {
|
|||||||
name TEXT NOT NULL,
|
name TEXT NOT NULL,
|
||||||
date INTEGER NOT NULL
|
date INTEGER NOT NULL
|
||||||
)
|
)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration16 : Migration(15, 16) {
|
class Migration16 : Migration(15, 16) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS Teachers (
|
CREATE TABLE IF NOT EXISTS Teachers (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
@ -15,6 +16,7 @@ class Migration16 : Migration(15, 16) {
|
|||||||
name TEXT NOT NULL,
|
name TEXT NOT NULL,
|
||||||
short_name TEXT NOT NULL
|
short_name TEXT NOT NULL
|
||||||
)
|
)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,13 +5,14 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration17 : Migration(16, 17) {
|
class Migration17 : Migration(16, 17) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
createGradesPointsStatisticsTable(database)
|
createGradesPointsStatisticsTable(db)
|
||||||
truncateSemestersTable(database)
|
truncateSemestersTable(db)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createGradesPointsStatisticsTable(database: SupportSQLiteDatabase) {
|
private fun createGradesPointsStatisticsTable(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS GradesPointsStatistics(
|
CREATE TABLE IF NOT EXISTS GradesPointsStatistics(
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
@ -20,10 +21,11 @@ class Migration17 : Migration(16, 17) {
|
|||||||
others REAL NOT NULL,
|
others REAL NOT NULL,
|
||||||
student REAL NOT NULL
|
student REAL NOT NULL
|
||||||
)
|
)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun truncateSemestersTable(database: SupportSQLiteDatabase) {
|
private fun truncateSemestersTable(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DELETE FROM Semesters")
|
db.execSQL("DELETE FROM Semesters")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration18 : Migration(17, 18) {
|
class Migration18 : Migration(17, 18) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS School (
|
CREATE TABLE IF NOT EXISTS School (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
|
@ -6,16 +6,17 @@ import io.github.wulkanowy.data.db.SharedPrefProvider
|
|||||||
|
|
||||||
class Migration19(private val sharedPrefProvider: SharedPrefProvider) : Migration(18, 19) {
|
class Migration19(private val sharedPrefProvider: SharedPrefProvider) : Migration(18, 19) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
migrateMessages(database)
|
migrateMessages(db)
|
||||||
migrateGrades(database)
|
migrateGrades(db)
|
||||||
migrateStudents(database)
|
migrateStudents(db)
|
||||||
migrateSharedPreferences()
|
migrateSharedPreferences()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateMessages(database: SupportSQLiteDatabase) {
|
private fun migrateMessages(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE Messages")
|
db.execSQL("DROP TABLE Messages")
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS Messages (
|
CREATE TABLE IF NOT EXISTS Messages (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
is_notified INTEGER NOT NULL,
|
is_notified INTEGER NOT NULL,
|
||||||
@ -34,12 +35,14 @@ class Migration19(private val sharedPrefProvider: SharedPrefProvider) : Migratio
|
|||||||
read_by INTEGER NOT NULL,
|
read_by INTEGER NOT NULL,
|
||||||
removed INTEGER NOT NULL
|
removed INTEGER NOT NULL
|
||||||
)
|
)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateGrades(database: SupportSQLiteDatabase) {
|
private fun migrateGrades(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE Grades")
|
db.execSQL("DROP TABLE Grades")
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS Grades (
|
CREATE TABLE IF NOT EXISTS Grades (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
is_read INTEGER NOT NULL,
|
is_read INTEGER NOT NULL,
|
||||||
@ -59,11 +62,13 @@ class Migration19(private val sharedPrefProvider: SharedPrefProvider) : Migratio
|
|||||||
date INTEGER NOT NULL,
|
date INTEGER NOT NULL,
|
||||||
teacher TEXT NOT NULL
|
teacher TEXT NOT NULL
|
||||||
)
|
)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateStudents(database: SupportSQLiteDatabase) {
|
private fun migrateStudents(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS Students_tmp (
|
CREATE TABLE IF NOT EXISTS Students_tmp (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
scrapper_base_url TEXT NOT NULL,
|
scrapper_base_url TEXT NOT NULL,
|
||||||
@ -86,26 +91,29 @@ class Migration19(private val sharedPrefProvider: SharedPrefProvider) : Migratio
|
|||||||
is_current INTEGER NOT NULL,
|
is_current INTEGER NOT NULL,
|
||||||
registration_date INTEGER NOT NULL
|
registration_date INTEGER NOT NULL
|
||||||
)
|
)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
database.execSQL("ALTER TABLE Students ADD COLUMN scrapperBaseUrl TEXT NOT NULL DEFAULT \"\";")
|
db.execSQL("ALTER TABLE Students ADD COLUMN scrapperBaseUrl TEXT NOT NULL DEFAULT \"\";")
|
||||||
database.execSQL("ALTER TABLE Students ADD COLUMN apiBaseUrl TEXT NOT NULL DEFAULT \"\";")
|
db.execSQL("ALTER TABLE Students ADD COLUMN apiBaseUrl TEXT NOT NULL DEFAULT \"\";")
|
||||||
database.execSQL("ALTER TABLE Students ADD COLUMN is_parent INT NOT NULL DEFAULT 0;")
|
db.execSQL("ALTER TABLE Students ADD COLUMN is_parent INT NOT NULL DEFAULT 0;")
|
||||||
database.execSQL("ALTER TABLE Students ADD COLUMN loginMode TEXT NOT NULL DEFAULT \"\";")
|
db.execSQL("ALTER TABLE Students ADD COLUMN loginMode TEXT NOT NULL DEFAULT \"\";")
|
||||||
database.execSQL("ALTER TABLE Students ADD COLUMN certificateKey TEXT NOT NULL DEFAULT \"\";")
|
db.execSQL("ALTER TABLE Students ADD COLUMN certificateKey TEXT NOT NULL DEFAULT \"\";")
|
||||||
database.execSQL("ALTER TABLE Students ADD COLUMN privateKey TEXT NOT NULL DEFAULT \"\";")
|
db.execSQL("ALTER TABLE Students ADD COLUMN privateKey TEXT NOT NULL DEFAULT \"\";")
|
||||||
database.execSQL("ALTER TABLE Students ADD COLUMN user_login_id INTEGER NOT NULL DEFAULT 0;")
|
db.execSQL("ALTER TABLE Students ADD COLUMN user_login_id INTEGER NOT NULL DEFAULT 0;")
|
||||||
|
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
INSERT INTO Students_tmp(
|
INSERT INTO Students_tmp(
|
||||||
id, scrapper_base_url, mobile_base_url, is_parent, login_type, login_mode, certificate_key, private_key, email, password, symbol, student_id, user_login_id, student_name, school_id, school_name, school_id, school_name, class_name, class_id, is_current, registration_date)
|
id, scrapper_base_url, mobile_base_url, is_parent, login_type, login_mode, certificate_key, private_key, email, password, symbol, student_id, user_login_id, student_name, school_id, school_name, school_id, school_name, class_name, class_id, is_current, registration_date)
|
||||||
SELECT
|
SELECT
|
||||||
id, endpoint, apiBaseUrl, is_parent, loginType, "SCRAPPER", certificateKey, privateKey, email, password, symbol, student_id, user_login_id, student_name, school_id, school_name, school_id, school_name, class_name, class_id, is_current, registration_date
|
id, endpoint, apiBaseUrl, is_parent, loginType, "SCRAPPER", certificateKey, privateKey, email, password, symbol, student_id, user_login_id, student_name, school_id, school_name, school_id, school_name, class_name, class_id, is_current, registration_date
|
||||||
FROM Students
|
FROM Students
|
||||||
""")
|
"""
|
||||||
database.execSQL("DROP TABLE Students")
|
)
|
||||||
database.execSQL("ALTER TABLE Students_tmp RENAME TO Students")
|
db.execSQL("DROP TABLE Students")
|
||||||
database.execSQL("CREATE UNIQUE INDEX index_Students_email_symbol_student_id_school_id_class_id ON Students (email, symbol, student_id, school_id, class_id)")
|
db.execSQL("ALTER TABLE Students_tmp RENAME TO Students")
|
||||||
|
db.execSQL("CREATE UNIQUE INDEX index_Students_email_symbol_student_id_school_id_class_id ON Students (email, symbol, student_id, school_id, class_id)")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateSharedPreferences() {
|
private fun migrateSharedPreferences() {
|
||||||
|
@ -5,14 +5,16 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration2 : Migration(1, 2) {
|
class Migration2 : Migration(1, 2) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS LuckyNumbers (
|
CREATE TABLE IF NOT EXISTS LuckyNumbers (
|
||||||
id INTEGER PRIMARY KEY NOT NULL,
|
id INTEGER PRIMARY KEY NOT NULL,
|
||||||
is_notified INTEGER NOT NULL,
|
is_notified INTEGER NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
date INTEGER NOT NULL,
|
date INTEGER NOT NULL,
|
||||||
lucky_number INTEGER NOT NULL)
|
lucky_number INTEGER NOT NULL)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,14 +5,15 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration20 : Migration(19, 20) {
|
class Migration20 : Migration(19, 20) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
migrateTimetable(database)
|
migrateTimetable(db)
|
||||||
truncateSubjects(database)
|
truncateSubjects(db)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateTimetable(database: SupportSQLiteDatabase) {
|
private fun migrateTimetable(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE Timetable")
|
db.execSQL("DROP TABLE Timetable")
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS `Timetable` (
|
CREATE TABLE IF NOT EXISTS `Timetable` (
|
||||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
`student_id` INTEGER NOT NULL,
|
`student_id` INTEGER NOT NULL,
|
||||||
@ -33,10 +34,11 @@ class Migration20 : Migration(19, 20) {
|
|||||||
`changes` INTEGER NOT NULL,
|
`changes` INTEGER NOT NULL,
|
||||||
`canceled` INTEGER NOT NULL
|
`canceled` INTEGER NOT NULL
|
||||||
)
|
)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun truncateSubjects(database: SupportSQLiteDatabase) {
|
private fun truncateSubjects(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DELETE FROM Subjects")
|
db.execSQL("DELETE FROM Subjects")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,11 +5,11 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration21 : Migration(20, 21) {
|
class Migration21 : Migration(20, 21) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Attendance ADD COLUMN excusable INTEGER NOT NULL DEFAULT 0")
|
db.execSQL("ALTER TABLE Attendance ADD COLUMN excusable INTEGER NOT NULL DEFAULT 0")
|
||||||
database.execSQL("ALTER TABLE Attendance ADD COLUMN time_id INTEGER NOT NULL DEFAULT 0")
|
db.execSQL("ALTER TABLE Attendance ADD COLUMN time_id INTEGER NOT NULL DEFAULT 0")
|
||||||
database.execSQL("ALTER TABLE Attendance ADD COLUMN excuse_status TEXT DEFAULT NULL")
|
db.execSQL("ALTER TABLE Attendance ADD COLUMN excuse_status TEXT DEFAULT NULL")
|
||||||
|
|
||||||
database.execSQL("DELETE FROM Semesters")
|
db.execSQL("DELETE FROM Semesters")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration22 : Migration(21, 22) {
|
class Migration22 : Migration(21, 22) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Students ADD COLUMN school_short TEXT NOT NULL DEFAULT ''")
|
db.execSQL("ALTER TABLE Students ADD COLUMN school_short TEXT NOT NULL DEFAULT ''")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration23 : Migration(22, 23) {
|
class Migration23 : Migration(22, 23) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Notes ADD COLUMN teacher_symbol TEXT NOT NULL DEFAULT ''")
|
db.execSQL("ALTER TABLE Notes ADD COLUMN teacher_symbol TEXT NOT NULL DEFAULT ''")
|
||||||
database.execSQL("ALTER TABLE Notes ADD COLUMN category_type INTEGER NOT NULL DEFAULT 0")
|
db.execSQL("ALTER TABLE Notes ADD COLUMN category_type INTEGER NOT NULL DEFAULT 0")
|
||||||
database.execSQL("ALTER TABLE Notes ADD COLUMN is_points_show INTEGER NOT NULL DEFAULT 0")
|
db.execSQL("ALTER TABLE Notes ADD COLUMN is_points_show INTEGER NOT NULL DEFAULT 0")
|
||||||
database.execSQL("ALTER TABLE Notes ADD COLUMN points INTEGER NOT NULL DEFAULT 0")
|
db.execSQL("ALTER TABLE Notes ADD COLUMN points INTEGER NOT NULL DEFAULT 0")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,9 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration24 : Migration(23, 24) {
|
class Migration24 : Migration(23, 24) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Messages ADD COLUMN has_attachments INTEGER NOT NULL DEFAULT 0")
|
db.execSQL("ALTER TABLE Messages ADD COLUMN has_attachments INTEGER NOT NULL DEFAULT 0")
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS MessageAttachments (
|
CREATE TABLE IF NOT EXISTS MessageAttachments (
|
||||||
real_id INTEGER NOT NULL,
|
real_id INTEGER NOT NULL,
|
||||||
message_id INTEGER NOT NULL,
|
message_id INTEGER NOT NULL,
|
||||||
@ -16,6 +17,7 @@ class Migration24 : Migration(23, 24) {
|
|||||||
filename TEXT NOT NULL,
|
filename TEXT NOT NULL,
|
||||||
PRIMARY KEY(real_id)
|
PRIMARY KEY(real_id)
|
||||||
)
|
)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration25 : Migration(24, 25) {
|
class Migration25 : Migration(24, 25) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Homework ADD COLUMN is_done INTEGER NOT NULL DEFAULT 0")
|
db.execSQL("ALTER TABLE Homework ADD COLUMN is_done INTEGER NOT NULL DEFAULT 0")
|
||||||
database.execSQL("ALTER TABLE Homework ADD COLUMN attachments TEXT NOT NULL DEFAULT \"[]\"")
|
db.execSQL("ALTER TABLE Homework ADD COLUMN attachments TEXT NOT NULL DEFAULT \"[]\"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration26 : Migration(25, 26) {
|
class Migration26 : Migration(25, 26) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE GradesSummary ADD COLUMN is_predicted_grade_notified INTEGER NOT NULL DEFAULT 1")
|
db.execSQL("ALTER TABLE GradesSummary ADD COLUMN is_predicted_grade_notified INTEGER NOT NULL DEFAULT 1")
|
||||||
database.execSQL("ALTER TABLE GradesSummary ADD COLUMN is_final_grade_notified INTEGER NOT NULL DEFAULT 1")
|
db.execSQL("ALTER TABLE GradesSummary ADD COLUMN is_final_grade_notified INTEGER NOT NULL DEFAULT 1")
|
||||||
database.execSQL("ALTER TABLE GradesSummary ADD COLUMN predicted_grade_last_change INTEGER NOT NULL DEFAULT 0")
|
db.execSQL("ALTER TABLE GradesSummary ADD COLUMN predicted_grade_last_change INTEGER NOT NULL DEFAULT 0")
|
||||||
database.execSQL("ALTER TABLE GradesSummary ADD COLUMN final_grade_last_change INTEGER NOT NULL DEFAULT 0")
|
db.execSQL("ALTER TABLE GradesSummary ADD COLUMN final_grade_last_change INTEGER NOT NULL DEFAULT 0")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,24 +5,25 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration27 : Migration(26, 27) {
|
class Migration27 : Migration(26, 27) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Students ADD COLUMN user_name TEXT NOT NULL DEFAULT \"\"")
|
db.execSQL("ALTER TABLE Students ADD COLUMN user_name TEXT NOT NULL DEFAULT \"\"")
|
||||||
|
|
||||||
val students = getStudentsIdsAndNames(database)
|
val students = getStudentsIdsAndNames(db)
|
||||||
val units = getReportingUnits(database)
|
val units = getReportingUnits(db)
|
||||||
|
|
||||||
students.forEach { (id, userLoginId, studentName) ->
|
students.forEach { (id, userLoginId, studentName) ->
|
||||||
val userNameFromUnits = units.singleOrNull { (senderId, _) -> senderId == userLoginId }?.second
|
val userNameFromUnits =
|
||||||
|
units.singleOrNull { (senderId, _) -> senderId == userLoginId }?.second
|
||||||
val normalizedStudentName = studentName.split(" ").asReversed().joinToString(" ")
|
val normalizedStudentName = studentName.split(" ").asReversed().joinToString(" ")
|
||||||
|
|
||||||
val userName = userNameFromUnits ?: normalizedStudentName
|
val userName = userNameFromUnits ?: normalizedStudentName
|
||||||
database.execSQL("UPDATE Students SET user_name = '$userName' WHERE id = '$id'")
|
db.execSQL("UPDATE Students SET user_name = '$userName' WHERE id = '$id'")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getStudentsIdsAndNames(database: SupportSQLiteDatabase): MutableList<Triple<Long, Int, String>> {
|
private fun getStudentsIdsAndNames(db: SupportSQLiteDatabase): MutableList<Triple<Long, Int, String>> {
|
||||||
val students = mutableListOf<Triple<Long, Int, String>>()
|
val students = mutableListOf<Triple<Long, Int, String>>()
|
||||||
database.query("SELECT id, user_login_id, student_name FROM Students").use {
|
db.query("SELECT id, user_login_id, student_name FROM Students").use {
|
||||||
if (it.moveToFirst()) {
|
if (it.moveToFirst()) {
|
||||||
do {
|
do {
|
||||||
students.add(Triple(it.getLong(0), it.getInt(1), it.getString(2)))
|
students.add(Triple(it.getLong(0), it.getInt(1), it.getString(2)))
|
||||||
@ -33,9 +34,9 @@ class Migration27 : Migration(26, 27) {
|
|||||||
return students
|
return students
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getReportingUnits(database: SupportSQLiteDatabase): MutableList<Pair<Int, String>> {
|
private fun getReportingUnits(db: SupportSQLiteDatabase): MutableList<Pair<Int, String>> {
|
||||||
val units = mutableListOf<Pair<Int, String>>()
|
val units = mutableListOf<Pair<Int, String>>()
|
||||||
database.query("SELECT sender_id, sender_name FROM ReportingUnits").use {
|
db.query("SELECT sender_id, sender_name FROM ReportingUnits").use {
|
||||||
if (it.moveToFirst()) {
|
if (it.moveToFirst()) {
|
||||||
do {
|
do {
|
||||||
units.add(it.getInt(0) to it.getString(1))
|
units.add(it.getInt(0) to it.getString(1))
|
||||||
|
@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration28 : Migration(27, 28) {
|
class Migration28 : Migration(27, 28) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS Conferences (
|
CREATE TABLE IF NOT EXISTS Conferences (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
|
@ -5,9 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration29 : Migration(28, 29) {
|
class Migration29 : Migration(28, 29) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE IF EXISTS GradesStatistics")
|
db.execSQL("DROP TABLE IF EXISTS GradesStatistics")
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS GradeSemesterStatistics (
|
CREATE TABLE IF NOT EXISTS GradeSemesterStatistics (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
@ -16,8 +17,10 @@ class Migration29 : Migration(28, 29) {
|
|||||||
amounts TEXT NOT NULL,
|
amounts TEXT NOT NULL,
|
||||||
student_grade INTEGER NOT NULL
|
student_grade INTEGER NOT NULL
|
||||||
)
|
)
|
||||||
""")
|
"""
|
||||||
database.execSQL("""
|
)
|
||||||
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS GradePartialStatistics (
|
CREATE TABLE IF NOT EXISTS GradePartialStatistics (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
|
@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration3 : Migration(2, 3) {
|
class Migration3 : Migration(2, 3) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS CompletedLesson (
|
CREATE TABLE IF NOT EXISTS CompletedLesson (
|
||||||
id INTEGER PRIMARY KEY NOT NULL,
|
id INTEGER PRIMARY KEY NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
|
@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration30 : Migration(29, 30) {
|
class Migration30 : Migration(29, 30) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE TimetableAdditional (
|
CREATE TABLE TimetableAdditional (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
@ -16,6 +17,7 @@ class Migration30 : Migration(29, 30) {
|
|||||||
date INTEGER NOT NULL,
|
date INTEGER NOT NULL,
|
||||||
subject TEXT NOT NULL
|
subject TEXT NOT NULL
|
||||||
)
|
)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration31 : Migration(30, 31) {
|
class Migration31 : Migration(30, 31) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL(
|
db.execSQL(
|
||||||
"""CREATE TABLE IF NOT EXISTS StudentInfo (
|
"""CREATE TABLE IF NOT EXISTS StudentInfo (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
|
@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration32 : Migration(31, 32) {
|
class Migration32 : Migration(31, 32) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Students ADD COLUMN nick TEXT NOT NULL DEFAULT \"\"")
|
db.execSQL("ALTER TABLE Students ADD COLUMN nick TEXT NOT NULL DEFAULT \"\"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,10 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration33 : Migration(32, 33) {
|
class Migration33 : Migration(32, 33) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE IF EXISTS StudentInfo")
|
db.execSQL("DROP TABLE IF EXISTS StudentInfo")
|
||||||
|
|
||||||
database.execSQL(
|
db.execSQL(
|
||||||
"""CREATE TABLE IF NOT EXISTS StudentInfo (
|
"""CREATE TABLE IF NOT EXISTS StudentInfo (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
|
@ -5,9 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration34 : Migration(33, 34) {
|
class Migration34 : Migration(33, 34) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DELETE FROM ReportingUnits")
|
db.execSQL("DELETE FROM ReportingUnits")
|
||||||
database.execSQL("DELETE FROM Recipients")
|
db.execSQL("DELETE FROM Recipients")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,13 +7,13 @@ import io.github.wulkanowy.utils.AppInfo
|
|||||||
|
|
||||||
class Migration35(private val appInfo: AppInfo) : Migration(34, 35) {
|
class Migration35(private val appInfo: AppInfo) : Migration(34, 35) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Students ADD COLUMN `avatar_color` INTEGER NOT NULL DEFAULT 0")
|
db.execSQL("ALTER TABLE Students ADD COLUMN `avatar_color` INTEGER NOT NULL DEFAULT 0")
|
||||||
|
|
||||||
database.query("SELECT * FROM Students").use {
|
db.query("SELECT * FROM Students").use {
|
||||||
while (it.moveToNext()) {
|
while (it.moveToNext()) {
|
||||||
val studentId = it.getLongOrNull(0)
|
val studentId = it.getLongOrNull(0)
|
||||||
database.execSQL(
|
db.execSQL(
|
||||||
"""
|
"""
|
||||||
UPDATE Students
|
UPDATE Students
|
||||||
SET avatar_color = ${appInfo.defaultColorsForAvatar.random()}
|
SET avatar_color = ${appInfo.defaultColorsForAvatar.random()}
|
||||||
|
@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration36 : Migration(35, 36) {
|
class Migration36 : Migration(35, 36) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Exams ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1")
|
db.execSQL("ALTER TABLE Exams ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1")
|
||||||
database.execSQL("ALTER TABLE Homework ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1")
|
db.execSQL("ALTER TABLE Homework ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration37 : Migration(36, 37) {
|
class Migration37 : Migration(36, 37) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL(
|
db.execSQL(
|
||||||
"""
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS TimetableHeaders (
|
CREATE TABLE IF NOT EXISTS TimetableHeaders (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
|
@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration38 : Migration(37, 38) {
|
class Migration38 : Migration(37, 38) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS `SchoolAnnouncements` (
|
CREATE TABLE IF NOT EXISTS `SchoolAnnouncements` (
|
||||||
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||||
`student_id` INTEGER NOT NULL,
|
`student_id` INTEGER NOT NULL,
|
||||||
@ -14,6 +15,7 @@ class Migration38 : Migration(37, 38) {
|
|||||||
`subject` TEXT NOT NULL,
|
`subject` TEXT NOT NULL,
|
||||||
`content` TEXT NOT NULL
|
`content` TEXT NOT NULL
|
||||||
)
|
)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration39 : Migration(38, 39) {
|
class Migration39 : Migration(38, 39) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Conferences ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1")
|
db.execSQL("ALTER TABLE Conferences ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1")
|
||||||
database.execSQL("ALTER TABLE SchoolAnnouncements ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1")
|
db.execSQL("ALTER TABLE SchoolAnnouncements ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,9 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration4 : Migration(3, 4) {
|
class Migration4 : Migration(3, 4) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE IF EXISTS Messages")
|
db.execSQL("DROP TABLE IF EXISTS Messages")
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS Messages (
|
CREATE TABLE IF NOT EXISTS Messages (
|
||||||
id INTEGER PRIMARY KEY NOT NULL,
|
id INTEGER PRIMARY KEY NOT NULL,
|
||||||
is_notified INTEGER NOT NULL,
|
is_notified INTEGER NOT NULL,
|
||||||
|
@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration40 : Migration(39, 40) {
|
class Migration40 : Migration(39, 40) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL(
|
db.execSQL(
|
||||||
"""
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS `Notifications` (
|
CREATE TABLE IF NOT EXISTS `Notifications` (
|
||||||
`student_id` INTEGER NOT NULL,
|
`student_id` INTEGER NOT NULL,
|
||||||
@ -20,4 +20,4 @@ class Migration40 : Migration(39, 40) {
|
|||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,9 @@ import io.github.wulkanowy.data.enums.GradeExpandMode
|
|||||||
|
|
||||||
class Migration41(private val sharedPrefProvider: SharedPrefProvider) : Migration(40, 41) {
|
class Migration41(private val sharedPrefProvider: SharedPrefProvider) : Migration(40, 41) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
migrateSharedPreferences()
|
migrateSharedPreferences()
|
||||||
database.execSQL("ALTER TABLE Homework ADD COLUMN is_added_by_user INTEGER NOT NULL DEFAULT 0")
|
db.execSQL("ALTER TABLE Homework ADD COLUMN is_added_by_user INTEGER NOT NULL DEFAULT 0")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateSharedPreferences() {
|
private fun migrateSharedPreferences() {
|
||||||
@ -18,4 +18,4 @@ class Migration41(private val sharedPrefProvider: SharedPrefProvider) : Migratio
|
|||||||
}
|
}
|
||||||
sharedPrefProvider.delete("pref_key_expand_grade")
|
sharedPrefProvider.delete("pref_key_expand_grade")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration42 : Migration(41, 42) {
|
class Migration42 : Migration(41, 42) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL(
|
db.execSQL(
|
||||||
"""CREATE TABLE IF NOT EXISTS `AdminMessages` (
|
"""CREATE TABLE IF NOT EXISTS `AdminMessages` (
|
||||||
`id` INTEGER NOT NULL,
|
`id` INTEGER NOT NULL,
|
||||||
`title` TEXT NOT NULL,
|
`title` TEXT NOT NULL,
|
||||||
@ -21,4 +21,4 @@ class Migration42 : Migration(41, 42) {
|
|||||||
PRIMARY KEY(`id`))"""
|
PRIMARY KEY(`id`))"""
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,8 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration43 : Migration(42, 43) {
|
class Migration43 : Migration(42, 43) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Timetable ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1")
|
db.execSQL("ALTER TABLE Timetable ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1")
|
||||||
database.execSQL("ALTER TABLE Attendance ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1")
|
db.execSQL("ALTER TABLE Attendance ADD COLUMN is_notified INTEGER NOT NULL DEFAULT 1")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration44 : Migration(43, 44) {
|
class Migration44 : Migration(43, 44) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE AdminMessages ADD COLUMN is_dismissible INTEGER NOT NULL DEFAULT 0")
|
db.execSQL("ALTER TABLE AdminMessages ADD COLUMN is_dismissible INTEGER NOT NULL DEFAULT 0")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,65 +8,65 @@ import java.time.ZoneOffset
|
|||||||
|
|
||||||
class Migration46 : Migration(45, 46) {
|
class Migration46 : Migration(45, 46) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
migrateConferences(database)
|
migrateConferences(db)
|
||||||
migrateMessages(database)
|
migrateMessages(db)
|
||||||
migrateMobileDevices(database)
|
migrateMobileDevices(db)
|
||||||
migrateNotifications(database)
|
migrateNotifications(db)
|
||||||
migrateTimetable(database)
|
migrateTimetable(db)
|
||||||
migrateTimetableAdditional(database)
|
migrateTimetableAdditional(db)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateConferences(database: SupportSQLiteDatabase) {
|
private fun migrateConferences(db: SupportSQLiteDatabase) {
|
||||||
database.query("SELECT * FROM Conferences").use {
|
db.query("SELECT * FROM Conferences").use {
|
||||||
while (it.moveToNext()) {
|
while (it.moveToNext()) {
|
||||||
val id = it.getLong(it.getColumnIndexOrThrow("id"))
|
val id = it.getLong(it.getColumnIndexOrThrow("id"))
|
||||||
val timestampLocal = it.getLong(it.getColumnIndexOrThrow("date"))
|
val timestampLocal = it.getLong(it.getColumnIndexOrThrow("date"))
|
||||||
val timestampUtc = timestampLocal.timestampLocalToUTC()
|
val timestampUtc = timestampLocal.timestampLocalToUTC()
|
||||||
|
|
||||||
database.execSQL("UPDATE Conferences SET date = $timestampUtc WHERE id = $id")
|
db.execSQL("UPDATE Conferences SET date = $timestampUtc WHERE id = $id")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateMessages(database: SupportSQLiteDatabase) {
|
private fun migrateMessages(db: SupportSQLiteDatabase) {
|
||||||
database.query("SELECT * FROM Messages").use {
|
db.query("SELECT * FROM Messages").use {
|
||||||
while (it.moveToNext()) {
|
while (it.moveToNext()) {
|
||||||
val id = it.getLong(it.getColumnIndexOrThrow("id"))
|
val id = it.getLong(it.getColumnIndexOrThrow("id"))
|
||||||
val timestampLocal = it.getLong(it.getColumnIndexOrThrow("date"))
|
val timestampLocal = it.getLong(it.getColumnIndexOrThrow("date"))
|
||||||
val timestampUtc = timestampLocal.timestampLocalToUTC()
|
val timestampUtc = timestampLocal.timestampLocalToUTC()
|
||||||
|
|
||||||
database.execSQL("UPDATE Messages SET date = $timestampUtc WHERE id = $id")
|
db.execSQL("UPDATE Messages SET date = $timestampUtc WHERE id = $id")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateMobileDevices(database: SupportSQLiteDatabase) {
|
private fun migrateMobileDevices(db: SupportSQLiteDatabase) {
|
||||||
database.query("SELECT * FROM MobileDevices").use {
|
db.query("SELECT * FROM MobileDevices").use {
|
||||||
while (it.moveToNext()) {
|
while (it.moveToNext()) {
|
||||||
val id = it.getLong(it.getColumnIndexOrThrow("id"))
|
val id = it.getLong(it.getColumnIndexOrThrow("id"))
|
||||||
val timestampLocal = it.getLong(it.getColumnIndexOrThrow("date"))
|
val timestampLocal = it.getLong(it.getColumnIndexOrThrow("date"))
|
||||||
val timestampUtc = timestampLocal.timestampLocalToUTC()
|
val timestampUtc = timestampLocal.timestampLocalToUTC()
|
||||||
|
|
||||||
database.execSQL("UPDATE MobileDevices SET date = $timestampUtc WHERE id = $id")
|
db.execSQL("UPDATE MobileDevices SET date = $timestampUtc WHERE id = $id")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateNotifications(database: SupportSQLiteDatabase) {
|
private fun migrateNotifications(db: SupportSQLiteDatabase) {
|
||||||
database.query("SELECT * FROM Notifications").use {
|
db.query("SELECT * FROM Notifications").use {
|
||||||
while (it.moveToNext()) {
|
while (it.moveToNext()) {
|
||||||
val id = it.getLong(it.getColumnIndexOrThrow("id"))
|
val id = it.getLong(it.getColumnIndexOrThrow("id"))
|
||||||
val timestampLocal = it.getLong(it.getColumnIndexOrThrow("date"))
|
val timestampLocal = it.getLong(it.getColumnIndexOrThrow("date"))
|
||||||
val timestampUtc = timestampLocal.timestampLocalToUTC()
|
val timestampUtc = timestampLocal.timestampLocalToUTC()
|
||||||
|
|
||||||
database.execSQL("UPDATE Notifications SET date = $timestampUtc WHERE id = $id")
|
db.execSQL("UPDATE Notifications SET date = $timestampUtc WHERE id = $id")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateTimetable(database: SupportSQLiteDatabase) {
|
private fun migrateTimetable(db: SupportSQLiteDatabase) {
|
||||||
database.query("SELECT * FROM Timetable").use {
|
db.query("SELECT * FROM Timetable").use {
|
||||||
while (it.moveToNext()) {
|
while (it.moveToNext()) {
|
||||||
val id = it.getLong(it.getColumnIndexOrThrow("id"))
|
val id = it.getLong(it.getColumnIndexOrThrow("id"))
|
||||||
val timestampLocalStart = it.getLong(it.getColumnIndexOrThrow("start"))
|
val timestampLocalStart = it.getLong(it.getColumnIndexOrThrow("start"))
|
||||||
@ -74,13 +74,13 @@ class Migration46 : Migration(45, 46) {
|
|||||||
val timestampUtcStart = timestampLocalStart.timestampLocalToUTC()
|
val timestampUtcStart = timestampLocalStart.timestampLocalToUTC()
|
||||||
val timestampUtcEnd = timestampLocalEnd.timestampLocalToUTC()
|
val timestampUtcEnd = timestampLocalEnd.timestampLocalToUTC()
|
||||||
|
|
||||||
database.execSQL("UPDATE Timetable SET start = $timestampUtcStart, end = $timestampUtcEnd WHERE id = $id")
|
db.execSQL("UPDATE Timetable SET start = $timestampUtcStart, end = $timestampUtcEnd WHERE id = $id")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateTimetableAdditional(database: SupportSQLiteDatabase) {
|
private fun migrateTimetableAdditional(db: SupportSQLiteDatabase) {
|
||||||
database.query("SELECT * FROM TimetableAdditional").use {
|
db.query("SELECT * FROM TimetableAdditional").use {
|
||||||
while (it.moveToNext()) {
|
while (it.moveToNext()) {
|
||||||
val id = it.getLong(it.getColumnIndexOrThrow("id"))
|
val id = it.getLong(it.getColumnIndexOrThrow("id"))
|
||||||
val timestampLocalStart = it.getLong(it.getColumnIndexOrThrow("start"))
|
val timestampLocalStart = it.getLong(it.getColumnIndexOrThrow("start"))
|
||||||
@ -88,7 +88,7 @@ class Migration46 : Migration(45, 46) {
|
|||||||
val timestampUtcStart = timestampLocalStart.timestampLocalToUTC()
|
val timestampUtcStart = timestampLocalStart.timestampLocalToUTC()
|
||||||
val timestampUtcEnd = timestampLocalEnd.timestampLocalToUTC()
|
val timestampUtcEnd = timestampLocalEnd.timestampLocalToUTC()
|
||||||
|
|
||||||
database.execSQL("UPDATE TimetableAdditional SET start = $timestampUtcStart, end = $timestampUtcEnd WHERE id = $id")
|
db.execSQL("UPDATE TimetableAdditional SET start = $timestampUtcStart, end = $timestampUtcEnd WHERE id = $id")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration49 : Migration(48, 49) {
|
class Migration49 : Migration(48, 49) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE IF EXISTS SchoolAnnouncements")
|
db.execSQL("DROP TABLE IF EXISTS SchoolAnnouncements")
|
||||||
|
|
||||||
database.execSQL(
|
db.execSQL(
|
||||||
"""
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS `SchoolAnnouncements` (
|
CREATE TABLE IF NOT EXISTS `SchoolAnnouncements` (
|
||||||
`user_login_id` INTEGER NOT NULL,
|
`user_login_id` INTEGER NOT NULL,
|
||||||
|
@ -7,11 +7,16 @@ import java.time.ZoneOffset
|
|||||||
|
|
||||||
class Migration5 : Migration(4, 5) {
|
class Migration5 : Migration(4, 5) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Students ADD COLUMN registration_date INTEGER DEFAULT 0 NOT NULL")
|
db.execSQL("ALTER TABLE Students ADD COLUMN registration_date INTEGER DEFAULT 0 NOT NULL")
|
||||||
database.execSQL("UPDATE Students SET registration_date = '${now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli()}'")
|
db.execSQL(
|
||||||
database.execSQL("DROP TABLE IF EXISTS Notes")
|
"UPDATE Students SET registration_date = '${
|
||||||
database.execSQL("""
|
now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli()
|
||||||
|
}'"
|
||||||
|
)
|
||||||
|
db.execSQL("DROP TABLE IF EXISTS Notes")
|
||||||
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS Notes (
|
CREATE TABLE IF NOT EXISTS Notes (
|
||||||
id INTEGER PRIMARY KEY NOT NULL,
|
id INTEGER PRIMARY KEY NOT NULL,
|
||||||
is_read INTEGER NOT NULL,
|
is_read INTEGER NOT NULL,
|
||||||
@ -21,6 +26,7 @@ class Migration5 : Migration(4, 5) {
|
|||||||
teacher TEXT NOT NULL,
|
teacher TEXT NOT NULL,
|
||||||
category TEXT NOT NULL,
|
category TEXT NOT NULL,
|
||||||
content TEXT NOT NULL)
|
content TEXT NOT NULL)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,9 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration50 : Migration(49, 50) {
|
class Migration50 : Migration(49, 50) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE IF EXISTS MobileDevices")
|
db.execSQL("DROP TABLE IF EXISTS MobileDevices")
|
||||||
database.execSQL(
|
db.execSQL(
|
||||||
"""
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS `MobileDevices` (
|
CREATE TABLE IF NOT EXISTS `MobileDevices` (
|
||||||
`user_login_id` INTEGER NOT NULL,
|
`user_login_id` INTEGER NOT NULL,
|
||||||
|
@ -5,17 +5,17 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration51 : Migration(50, 51) {
|
class Migration51 : Migration(50, 51) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
createMailboxTable(database)
|
createMailboxTable(db)
|
||||||
recreateMessagesTable(database)
|
recreateMessagesTable(db)
|
||||||
recreateMessageAttachmentsTable(database)
|
recreateMessageAttachmentsTable(db)
|
||||||
recreateRecipientsTable(database)
|
recreateRecipientsTable(db)
|
||||||
deleteReportingUnitTable(database)
|
deleteReportingUnitTable(db)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createMailboxTable(database: SupportSQLiteDatabase) {
|
private fun createMailboxTable(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE IF EXISTS Mailboxes")
|
db.execSQL("DROP TABLE IF EXISTS Mailboxes")
|
||||||
database.execSQL(
|
db.execSQL(
|
||||||
"""
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS `Mailboxes` (
|
CREATE TABLE IF NOT EXISTS `Mailboxes` (
|
||||||
`globalKey` TEXT NOT NULL,
|
`globalKey` TEXT NOT NULL,
|
||||||
@ -30,9 +30,9 @@ class Migration51 : Migration(50, 51) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun recreateMessagesTable(database: SupportSQLiteDatabase) {
|
private fun recreateMessagesTable(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE IF EXISTS Messages")
|
db.execSQL("DROP TABLE IF EXISTS Messages")
|
||||||
database.execSQL(
|
db.execSQL(
|
||||||
"""
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS `Messages` (
|
CREATE TABLE IF NOT EXISTS `Messages` (
|
||||||
`message_global_key` TEXT NOT NULL,
|
`message_global_key` TEXT NOT NULL,
|
||||||
@ -52,9 +52,9 @@ class Migration51 : Migration(50, 51) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun recreateMessageAttachmentsTable(database: SupportSQLiteDatabase) {
|
private fun recreateMessageAttachmentsTable(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE IF EXISTS MessageAttachments")
|
db.execSQL("DROP TABLE IF EXISTS MessageAttachments")
|
||||||
database.execSQL(
|
db.execSQL(
|
||||||
"""
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS `MessageAttachments` (
|
CREATE TABLE IF NOT EXISTS `MessageAttachments` (
|
||||||
`real_id` INTEGER NOT NULL,
|
`real_id` INTEGER NOT NULL,
|
||||||
@ -66,9 +66,9 @@ class Migration51 : Migration(50, 51) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun recreateRecipientsTable(database: SupportSQLiteDatabase) {
|
private fun recreateRecipientsTable(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE IF EXISTS Recipients")
|
db.execSQL("DROP TABLE IF EXISTS Recipients")
|
||||||
database.execSQL(
|
db.execSQL(
|
||||||
"""
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS `Recipients` (
|
CREATE TABLE IF NOT EXISTS `Recipients` (
|
||||||
`mailboxGlobalKey` TEXT NOT NULL,
|
`mailboxGlobalKey` TEXT NOT NULL,
|
||||||
@ -82,7 +82,7 @@ class Migration51 : Migration(50, 51) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun deleteReportingUnitTable(database: SupportSQLiteDatabase) {
|
private fun deleteReportingUnitTable(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE IF EXISTS ReportingUnits")
|
db.execSQL("DROP TABLE IF EXISTS ReportingUnits")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,14 +5,14 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration53 : Migration(52, 53) {
|
class Migration53 : Migration(52, 53) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
createMailboxTable(database)
|
createMailboxTable(db)
|
||||||
recreateMessagesTable(database)
|
recreateMessagesTable(db)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createMailboxTable(database: SupportSQLiteDatabase) {
|
private fun createMailboxTable(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE IF EXISTS Mailboxes")
|
db.execSQL("DROP TABLE IF EXISTS Mailboxes")
|
||||||
database.execSQL(
|
db.execSQL(
|
||||||
"""
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS `Mailboxes` (
|
CREATE TABLE IF NOT EXISTS `Mailboxes` (
|
||||||
`globalKey` TEXT NOT NULL,
|
`globalKey` TEXT NOT NULL,
|
||||||
@ -29,9 +29,9 @@ class Migration53 : Migration(52, 53) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun recreateMessagesTable(database: SupportSQLiteDatabase) {
|
private fun recreateMessagesTable(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE IF EXISTS Messages")
|
db.execSQL("DROP TABLE IF EXISTS Messages")
|
||||||
database.execSQL(
|
db.execSQL(
|
||||||
"""
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS `Messages` (
|
CREATE TABLE IF NOT EXISTS `Messages` (
|
||||||
`email` TEXT NOT NULL,
|
`email` TEXT NOT NULL,
|
||||||
|
@ -5,22 +5,24 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration54 : Migration(53, 54) {
|
class Migration54 : Migration(53, 54) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
migrateResman(database)
|
migrateResman(db)
|
||||||
removeTomaszowMazowieckiStudents(database)
|
removeTomaszowMazowieckiStudents(db)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun migrateResman(database: SupportSQLiteDatabase) {
|
private fun migrateResman(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
UPDATE Students SET
|
UPDATE Students SET
|
||||||
scrapper_base_url = 'https://vulcan.net.pl',
|
scrapper_base_url = 'https://vulcan.net.pl',
|
||||||
login_type = 'ADFSLightScoped',
|
login_type = 'ADFSLightScoped',
|
||||||
symbol = 'rzeszowprojekt'
|
symbol = 'rzeszowprojekt'
|
||||||
WHERE scrapper_base_url = 'https://resman.pl'
|
WHERE scrapper_base_url = 'https://resman.pl'
|
||||||
""".trimIndent())
|
""".trimIndent()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun removeTomaszowMazowieckiStudents(database: SupportSQLiteDatabase) {
|
private fun removeTomaszowMazowieckiStudents(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DELETE FROM Students WHERE symbol = 'tomaszowmazowiecki'")
|
db.execSQL("DELETE FROM Students WHERE symbol = 'tomaszowmazowiecki'")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration6 : Migration(5, 6) {
|
class Migration6 : Migration(5, 6) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS ReportingUnits (
|
CREATE TABLE IF NOT EXISTS ReportingUnits (
|
||||||
id INTEGER PRIMARY KEY NOT NULL,
|
id INTEGER PRIMARY KEY NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
@ -15,9 +16,11 @@ class Migration6 : Migration(5, 6) {
|
|||||||
sender_id INTEGER NOT NULL,
|
sender_id INTEGER NOT NULL,
|
||||||
sender_name TEXT NOT NULL,
|
sender_name TEXT NOT NULL,
|
||||||
roles TEXT NOT NULL)
|
roles TEXT NOT NULL)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS Recipients (
|
CREATE TABLE IF NOT EXISTS Recipients (
|
||||||
id INTEGER PRIMARY KEY NOT NULL,
|
id INTEGER PRIMARY KEY NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
@ -28,10 +31,11 @@ class Migration6 : Migration(5, 6) {
|
|||||||
unit_id INTEGER NOT NULL,
|
unit_id INTEGER NOT NULL,
|
||||||
role INTEGER NOT NULL,
|
role INTEGER NOT NULL,
|
||||||
hash TEXT NOT NULL)
|
hash TEXT NOT NULL)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
database.execSQL("DELETE FROM Semesters WHERE 1")
|
db.execSQL("DELETE FROM Semesters WHERE 1")
|
||||||
database.execSQL("ALTER TABLE Semesters ADD COLUMN class_id INTEGER DEFAULT 0 NOT NULL")
|
db.execSQL("ALTER TABLE Semesters ADD COLUMN class_id INTEGER DEFAULT 0 NOT NULL")
|
||||||
database.execSQL("ALTER TABLE Semesters ADD COLUMN unit_id INTEGER DEFAULT 0 NOT NULL")
|
db.execSQL("ALTER TABLE Semesters ADD COLUMN unit_id INTEGER DEFAULT 0 NOT NULL")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration7 : Migration(6, 7) {
|
class Migration7 : Migration(6, 7) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS GradesStatistics (
|
CREATE TABLE IF NOT EXISTS GradesStatistics (
|
||||||
id INTEGER PRIMARY KEY NOT NULL,
|
id INTEGER PRIMARY KEY NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
@ -15,6 +16,7 @@ class Migration7 : Migration(6, 7) {
|
|||||||
grade INTEGER NOT NULL,
|
grade INTEGER NOT NULL,
|
||||||
amount INTEGER NOT NULL,
|
amount INTEGER NOT NULL,
|
||||||
is_semester INTEGER NOT NULL)
|
is_semester INTEGER NOT NULL)
|
||||||
""")
|
"""
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,9 +5,9 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration8 : Migration(7, 8) {
|
class Migration8 : Migration(7, 8) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("ALTER TABLE Timetable ADD COLUMN subjectOld TEXT DEFAULT \"\" NOT NULL")
|
db.execSQL("ALTER TABLE Timetable ADD COLUMN subjectOld TEXT DEFAULT \"\" NOT NULL")
|
||||||
database.execSQL("ALTER TABLE Timetable ADD COLUMN roomOld TEXT DEFAULT \"\" NOT NULL")
|
db.execSQL("ALTER TABLE Timetable ADD COLUMN roomOld TEXT DEFAULT \"\" NOT NULL")
|
||||||
database.execSQL("ALTER TABLE Timetable ADD COLUMN teacherOld TEXT DEFAULT \"\" NOT NULL")
|
db.execSQL("ALTER TABLE Timetable ADD COLUMN teacherOld TEXT DEFAULT \"\" NOT NULL")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,9 +5,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase
|
|||||||
|
|
||||||
class Migration9 : Migration(8, 9) {
|
class Migration9 : Migration(8, 9) {
|
||||||
|
|
||||||
override fun migrate(database: SupportSQLiteDatabase) {
|
override fun migrate(db: SupportSQLiteDatabase) {
|
||||||
database.execSQL("DROP TABLE IF EXISTS Messages")
|
db.execSQL("DROP TABLE IF EXISTS Messages")
|
||||||
database.execSQL("""
|
db.execSQL(
|
||||||
|
"""
|
||||||
CREATE TABLE IF NOT EXISTS Messages (
|
CREATE TABLE IF NOT EXISTS Messages (
|
||||||
id INTEGER PRIMARY KEY NOT NULL,
|
id INTEGER PRIMARY KEY NOT NULL,
|
||||||
student_id INTEGER NOT NULL,
|
student_id INTEGER NOT NULL,
|
||||||
|
@ -9,7 +9,12 @@ import com.fredporciuncula.flow.preferences.Preference
|
|||||||
import com.fredporciuncula.flow.preferences.Serializer
|
import com.fredporciuncula.flow.preferences.Serializer
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
import io.github.wulkanowy.R
|
import io.github.wulkanowy.R
|
||||||
import io.github.wulkanowy.data.enums.*
|
import io.github.wulkanowy.data.enums.AppTheme
|
||||||
|
import io.github.wulkanowy.data.enums.GradeColorTheme
|
||||||
|
import io.github.wulkanowy.data.enums.GradeExpandMode
|
||||||
|
import io.github.wulkanowy.data.enums.GradeSortingMode
|
||||||
|
import io.github.wulkanowy.data.enums.TimetableGapsMode
|
||||||
|
import io.github.wulkanowy.data.enums.TimetableMode
|
||||||
import io.github.wulkanowy.ui.modules.dashboard.DashboardItem
|
import io.github.wulkanowy.ui.modules.dashboard.DashboardItem
|
||||||
import io.github.wulkanowy.ui.modules.grade.GradeAverageMode
|
import io.github.wulkanowy.ui.modules.grade.GradeAverageMode
|
||||||
import io.github.wulkanowy.ui.modules.settings.appearance.menuorder.AppMenuItem
|
import io.github.wulkanowy.ui.modules.settings.appearance.menuorder.AppMenuItem
|
||||||
@ -18,7 +23,7 @@ import kotlinx.coroutines.flow.map
|
|||||||
import kotlinx.serialization.encodeToString
|
import kotlinx.serialization.encodeToString
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
import java.util.*
|
import java.util.UUID
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@ -303,19 +308,6 @@ class PreferencesRepository @Inject constructor(
|
|||||||
get() = sharedPref.getBoolean(PREF_KEY_APP_SUPPORT_SHOWN, false)
|
get() = sharedPref.getBoolean(PREF_KEY_APP_SUPPORT_SHOWN, false)
|
||||||
set(value) = sharedPref.edit { putBoolean(PREF_KEY_APP_SUPPORT_SHOWN, value) }
|
set(value) = sharedPref.edit { putBoolean(PREF_KEY_APP_SUPPORT_SHOWN, value) }
|
||||||
|
|
||||||
var isAgreeToProcessData: Boolean
|
|
||||||
get() = getBoolean(
|
|
||||||
R.string.pref_key_ads_consent_data_processing,
|
|
||||||
R.bool.pref_default_ads_consent_data_processing
|
|
||||||
)
|
|
||||||
set(value) = sharedPref.edit {
|
|
||||||
putBoolean(context.getString(R.string.pref_key_ads_consent_data_processing), value)
|
|
||||||
}
|
|
||||||
|
|
||||||
var isPersonalizedAdsEnabled: Boolean
|
|
||||||
get() = sharedPref.getBoolean(PREF_KEY_PERSONALIZED_ADS_ENABLED, false)
|
|
||||||
set(value) = sharedPref.edit { putBoolean(PREF_KEY_PERSONALIZED_ADS_ENABLED, value) }
|
|
||||||
|
|
||||||
val isAdsEnabledFlow = flowSharedPref.getBoolean(
|
val isAdsEnabledFlow = flowSharedPref.getBoolean(
|
||||||
context.getString(R.string.pref_key_ads_enabled),
|
context.getString(R.string.pref_key_ads_enabled),
|
||||||
context.resources.getBoolean(R.bool.pref_default_ads_enabled)
|
context.resources.getBoolean(R.bool.pref_default_ads_enabled)
|
||||||
@ -398,7 +390,6 @@ class PreferencesRepository @Inject constructor(
|
|||||||
private const val PREF_KEY_IN_APP_REVIEW_DATE = "in_app_review_date"
|
private const val PREF_KEY_IN_APP_REVIEW_DATE = "in_app_review_date"
|
||||||
private const val PREF_KEY_IN_APP_REVIEW_DONE = "in_app_review_done"
|
private const val PREF_KEY_IN_APP_REVIEW_DONE = "in_app_review_done"
|
||||||
private const val PREF_KEY_APP_SUPPORT_SHOWN = "app_support_shown"
|
private const val PREF_KEY_APP_SUPPORT_SHOWN = "app_support_shown"
|
||||||
private const val PREF_KEY_PERSONALIZED_ADS_ENABLED = "personalized_ads_enabled"
|
|
||||||
private const val PREF_KEY_ADMIN_DISMISSED_MESSAGE_IDS = "admin_message_dismissed_ids"
|
private const val PREF_KEY_ADMIN_DISMISSED_MESSAGE_IDS = "admin_message_dismissed_ids"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,19 +1,46 @@
|
|||||||
package io.github.wulkanowy.ui.modules.dashboard
|
package io.github.wulkanowy.ui.modules.dashboard
|
||||||
|
|
||||||
import io.github.wulkanowy.data.*
|
import io.github.wulkanowy.data.Resource
|
||||||
|
import io.github.wulkanowy.data.dataOrNull
|
||||||
import io.github.wulkanowy.data.db.entities.AdminMessage
|
import io.github.wulkanowy.data.db.entities.AdminMessage
|
||||||
import io.github.wulkanowy.data.db.entities.LuckyNumber
|
import io.github.wulkanowy.data.db.entities.LuckyNumber
|
||||||
import io.github.wulkanowy.data.db.entities.Student
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
import io.github.wulkanowy.data.enums.MessageFolder
|
import io.github.wulkanowy.data.enums.MessageFolder
|
||||||
import io.github.wulkanowy.data.enums.MessageType
|
import io.github.wulkanowy.data.enums.MessageType
|
||||||
import io.github.wulkanowy.data.repositories.*
|
import io.github.wulkanowy.data.errorOrNull
|
||||||
|
import io.github.wulkanowy.data.flatResourceFlow
|
||||||
|
import io.github.wulkanowy.data.mapResourceData
|
||||||
|
import io.github.wulkanowy.data.onResourceError
|
||||||
|
import io.github.wulkanowy.data.repositories.AttendanceSummaryRepository
|
||||||
|
import io.github.wulkanowy.data.repositories.ConferenceRepository
|
||||||
|
import io.github.wulkanowy.data.repositories.ExamRepository
|
||||||
|
import io.github.wulkanowy.data.repositories.GradeRepository
|
||||||
|
import io.github.wulkanowy.data.repositories.HomeworkRepository
|
||||||
|
import io.github.wulkanowy.data.repositories.LuckyNumberRepository
|
||||||
|
import io.github.wulkanowy.data.repositories.MessageRepository
|
||||||
|
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
||||||
|
import io.github.wulkanowy.data.repositories.SchoolAnnouncementRepository
|
||||||
|
import io.github.wulkanowy.data.repositories.SemesterRepository
|
||||||
|
import io.github.wulkanowy.data.repositories.StudentRepository
|
||||||
|
import io.github.wulkanowy.data.repositories.TimetableRepository
|
||||||
import io.github.wulkanowy.domain.adminmessage.GetAppropriateAdminMessageUseCase
|
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.base.ErrorHandler
|
import io.github.wulkanowy.ui.base.ErrorHandler
|
||||||
import io.github.wulkanowy.utils.AdsHelper
|
import io.github.wulkanowy.utils.AdsHelper
|
||||||
import io.github.wulkanowy.utils.calculatePercentage
|
import io.github.wulkanowy.utils.calculatePercentage
|
||||||
import io.github.wulkanowy.utils.nextOrSameSchoolDay
|
import io.github.wulkanowy.utils.nextOrSameSchoolDay
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import kotlinx.coroutines.flow.catch
|
||||||
|
import kotlinx.coroutines.flow.combine
|
||||||
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
|
import kotlinx.coroutines.flow.emitAll
|
||||||
|
import kotlinx.coroutines.flow.filter
|
||||||
|
import kotlinx.coroutines.flow.filterNot
|
||||||
|
import kotlinx.coroutines.flow.flow
|
||||||
|
import kotlinx.coroutines.flow.flowOf
|
||||||
|
import kotlinx.coroutines.flow.map
|
||||||
|
import kotlinx.coroutines.flow.merge
|
||||||
|
import kotlinx.coroutines.flow.onEach
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
@ -48,6 +75,11 @@ class DashboardPresenter @Inject constructor(
|
|||||||
|
|
||||||
private val firstLoadedItemList = mutableListOf<DashboardItem.Type>()
|
private val firstLoadedItemList = mutableListOf<DashboardItem.Type>()
|
||||||
|
|
||||||
|
private val selectedDashboardTiles
|
||||||
|
get() = preferencesRepository.selectedDashboardTiles
|
||||||
|
.filterNot { it == DashboardItem.Tile.ADS && !adsHelper.canShowAd }
|
||||||
|
.toSet()
|
||||||
|
|
||||||
private lateinit var lastError: Throwable
|
private lateinit var lastError: Throwable
|
||||||
|
|
||||||
override fun onAttachView(view: DashboardView) {
|
override fun onAttachView(view: DashboardView) {
|
||||||
@ -59,10 +91,19 @@ class DashboardPresenter @Inject constructor(
|
|||||||
showContent(false)
|
showContent(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val selectedDashboardTilesFlow = preferencesRepository.selectedDashboardTilesFlow
|
||||||
|
.map { selectedDashboardTiles }
|
||||||
|
val isAdsEnabledFlow = preferencesRepository.isAdsEnabledFlow
|
||||||
|
.filter { (adsHelper.canShowAd && it) || !it }
|
||||||
|
.map { selectedDashboardTiles }
|
||||||
|
val isMobileAdsSdkInitializedFlow = adsHelper.isMobileAdsSdkInitialized
|
||||||
|
.filter { it }
|
||||||
|
.map { selectedDashboardTiles }
|
||||||
|
|
||||||
merge(
|
merge(
|
||||||
preferencesRepository.selectedDashboardTilesFlow,
|
selectedDashboardTilesFlow,
|
||||||
preferencesRepository.isAdsEnabledFlow
|
isAdsEnabledFlow,
|
||||||
.map { preferencesRepository.selectedDashboardTiles }
|
isMobileAdsSdkInitializedFlow
|
||||||
)
|
)
|
||||||
.onEach { loadData(tilesToLoad = it) }
|
.onEach { loadData(tilesToLoad = it) }
|
||||||
.launch("dashboard_pref")
|
.launch("dashboard_pref")
|
||||||
@ -71,7 +112,7 @@ class DashboardPresenter @Inject constructor(
|
|||||||
fun onAdminMessageDismissed(adminMessage: AdminMessage) {
|
fun onAdminMessageDismissed(adminMessage: AdminMessage) {
|
||||||
preferencesRepository.dismissedAdminMessageIds += adminMessage.id
|
preferencesRepository.dismissedAdminMessageIds += adminMessage.id
|
||||||
|
|
||||||
loadData(preferencesRepository.selectedDashboardTiles)
|
loadData(selectedDashboardTiles)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onDragAndDropEnd(list: List<DashboardItem>) {
|
fun onDragAndDropEnd(list: List<DashboardItem>) {
|
||||||
@ -187,7 +228,7 @@ class DashboardPresenter @Inject constructor(
|
|||||||
|
|
||||||
fun onSwipeRefresh() {
|
fun onSwipeRefresh() {
|
||||||
Timber.i("Force refreshing the dashboard")
|
Timber.i("Force refreshing the dashboard")
|
||||||
loadData(preferencesRepository.selectedDashboardTiles, forceRefresh = true)
|
loadData(selectedDashboardTiles, forceRefresh = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onRetry() {
|
fun onRetry() {
|
||||||
@ -195,7 +236,7 @@ class DashboardPresenter @Inject constructor(
|
|||||||
showErrorView(false)
|
showErrorView(false)
|
||||||
showProgress(true)
|
showProgress(true)
|
||||||
}
|
}
|
||||||
loadData(preferencesRepository.selectedDashboardTiles, forceRefresh = true)
|
loadData(selectedDashboardTiles, forceRefresh = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onViewReselected() {
|
fun onViewReselected() {
|
||||||
@ -216,7 +257,7 @@ class DashboardPresenter @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun onDashboardTileSettingsSelected(): Boolean {
|
fun onDashboardTileSettingsSelected(): Boolean {
|
||||||
view?.showDashboardTileSettings(preferencesRepository.selectedDashboardTiles.toList())
|
view?.showDashboardTileSettings(selectedDashboardTiles.toList())
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -232,7 +273,7 @@ class DashboardPresenter @Inject constructor(
|
|||||||
|
|
||||||
private fun loadHorizontalGroup(student: Student, forceRefresh: Boolean) {
|
private fun loadHorizontalGroup(student: Student, forceRefresh: Boolean) {
|
||||||
flow {
|
flow {
|
||||||
val selectedTiles = preferencesRepository.selectedDashboardTiles
|
val selectedTiles = selectedDashboardTiles
|
||||||
val flowSuccess = flowOf(Resource.Success(null))
|
val flowSuccess = flowOf(Resource.Success(null))
|
||||||
|
|
||||||
val luckyNumberFlow = luckyNumberRepository.getLuckyNumber(student, forceRefresh)
|
val luckyNumberFlow = luckyNumberRepository.getLuckyNumber(student, forceRefresh)
|
||||||
|
@ -42,7 +42,7 @@ class GradeSummaryPresenter @Inject constructor(
|
|||||||
val student = studentRepository.getCurrentStudent()
|
val student = studentRepository.getCurrentStudent()
|
||||||
averageProvider.getGradesDetailsWithAverage(student, semesterId, forceRefresh)
|
averageProvider.getGradesDetailsWithAverage(student, semesterId, forceRefresh)
|
||||||
}
|
}
|
||||||
.logResourceStatus("load grade summary", showData = true)
|
.logResourceStatus("load grade summary")
|
||||||
.mapResourceData { createGradeSummaryItems(it) }
|
.mapResourceData { createGradeSummaryItems(it) }
|
||||||
.onResourceData {
|
.onResourceData {
|
||||||
view?.run {
|
view?.run {
|
||||||
|
@ -9,7 +9,11 @@ import android.view.MenuItem
|
|||||||
import android.view.ViewGroup.MarginLayoutParams
|
import android.view.ViewGroup.MarginLayoutParams
|
||||||
import androidx.activity.OnBackPressedCallback
|
import androidx.activity.OnBackPressedCallback
|
||||||
import androidx.activity.addCallback
|
import androidx.activity.addCallback
|
||||||
import androidx.core.view.*
|
import androidx.core.view.ViewCompat
|
||||||
|
import androidx.core.view.WindowCompat
|
||||||
|
import androidx.core.view.WindowInsetsCompat
|
||||||
|
import androidx.core.view.isVisible
|
||||||
|
import androidx.core.view.updateLayoutParams
|
||||||
import androidx.fragment.app.DialogFragment
|
import androidx.fragment.app.DialogFragment
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.preference.Preference
|
import androidx.preference.Preference
|
||||||
@ -23,12 +27,19 @@ import io.github.wulkanowy.R
|
|||||||
import io.github.wulkanowy.data.db.entities.Student
|
import io.github.wulkanowy.data.db.entities.Student
|
||||||
import io.github.wulkanowy.data.db.entities.StudentWithSemesters
|
import io.github.wulkanowy.data.db.entities.StudentWithSemesters
|
||||||
import io.github.wulkanowy.databinding.ActivityMainBinding
|
import io.github.wulkanowy.databinding.ActivityMainBinding
|
||||||
import io.github.wulkanowy.databinding.DialogAdsConsentBinding
|
|
||||||
import io.github.wulkanowy.ui.base.BaseActivity
|
import io.github.wulkanowy.ui.base.BaseActivity
|
||||||
import io.github.wulkanowy.ui.modules.Destination
|
import io.github.wulkanowy.ui.modules.Destination
|
||||||
import io.github.wulkanowy.ui.modules.account.accountquick.AccountQuickDialog
|
import io.github.wulkanowy.ui.modules.account.accountquick.AccountQuickDialog
|
||||||
import io.github.wulkanowy.ui.modules.settings.appearance.menuorder.AppMenuItem
|
import io.github.wulkanowy.ui.modules.settings.appearance.menuorder.AppMenuItem
|
||||||
import io.github.wulkanowy.utils.*
|
import io.github.wulkanowy.utils.AnalyticsHelper
|
||||||
|
import io.github.wulkanowy.utils.AppInfo
|
||||||
|
import io.github.wulkanowy.utils.InAppReviewHelper
|
||||||
|
import io.github.wulkanowy.utils.InAppUpdateHelper
|
||||||
|
import io.github.wulkanowy.utils.createNameInitialsDrawable
|
||||||
|
import io.github.wulkanowy.utils.dpToPx
|
||||||
|
import io.github.wulkanowy.utils.nickOrName
|
||||||
|
import io.github.wulkanowy.utils.safelyPopFragments
|
||||||
|
import io.github.wulkanowy.utils.setOnViewChangeListener
|
||||||
import kotlinx.serialization.encodeToString
|
import kotlinx.serialization.encodeToString
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
@ -312,40 +323,6 @@ class MainActivity : BaseActivity<MainPresenter, ActivityMainBinding>(), MainVie
|
|||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun showPrivacyPolicyDialog() {
|
|
||||||
val dialogAdsConsentBinding = DialogAdsConsentBinding.inflate(layoutInflater)
|
|
||||||
|
|
||||||
val dialog = MaterialAlertDialogBuilder(this)
|
|
||||||
.setTitle(R.string.pref_ads_consent_title)
|
|
||||||
.setMessage(R.string.pref_ads_consent_description)
|
|
||||||
.setView(dialogAdsConsentBinding.root)
|
|
||||||
.show()
|
|
||||||
|
|
||||||
dialogAdsConsentBinding.adsConsentOver.setOnCheckedChangeListener { _, isChecked ->
|
|
||||||
dialogAdsConsentBinding.adsConsentPersonalised.isEnabled = isChecked
|
|
||||||
}
|
|
||||||
|
|
||||||
dialogAdsConsentBinding.adsConsentPersonalised.setOnClickListener {
|
|
||||||
presenter.onPrivacyAgree(true)
|
|
||||||
dialog.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
dialogAdsConsentBinding.adsConsentNonPersonalised.setOnClickListener {
|
|
||||||
presenter.onPrivacyAgree(false)
|
|
||||||
dialog.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
dialogAdsConsentBinding.adsConsentPrivacy.setOnClickListener { presenter.onPrivacySelected() }
|
|
||||||
dialogAdsConsentBinding.adsConsentCancel.setOnClickListener { dialog.cancel() }
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun openPrivacyPolicy() {
|
|
||||||
openInternetBrowser(
|
|
||||||
"https://wulkanowy.github.io/polityka-prywatnosci.html",
|
|
||||||
::showMessage
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onSaveInstanceState(outState: Bundle) {
|
override fun onSaveInstanceState(outState: Bundle) {
|
||||||
super.onSaveInstanceState(outState)
|
super.onSaveInstanceState(outState)
|
||||||
navController.onSaveInstanceState(outState)
|
navController.onSaveInstanceState(outState)
|
||||||
|
@ -19,7 +19,6 @@ import io.github.wulkanowy.utils.AdsHelper
|
|||||||
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 kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.serialization.decodeFromString
|
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.time.Duration
|
import java.time.Duration
|
||||||
@ -52,6 +51,7 @@ class MainPresenter @Inject constructor(
|
|||||||
destinationType in rootDestinationTypeList -> {
|
destinationType in rootDestinationTypeList -> {
|
||||||
rootDestinationTypeList.indexOf(destinationType)
|
rootDestinationTypeList.indexOf(destinationType)
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> 4
|
else -> 4
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,6 +110,7 @@ class MainPresenter @Inject constructor(
|
|||||||
is AccountView,
|
is AccountView,
|
||||||
is StudentInfoView,
|
is StudentInfoView,
|
||||||
is AccountDetailsView -> false
|
is AccountDetailsView -> false
|
||||||
|
|
||||||
else -> true
|
else -> true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,20 +149,8 @@ class MainPresenter @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun onEnableAdsSelected() {
|
fun onEnableAdsSelected() {
|
||||||
view?.showPrivacyPolicyDialog()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun onPrivacyAgree(isPersonalizedAds: Boolean) {
|
|
||||||
preferencesRepository.isAgreeToProcessData = true
|
|
||||||
preferencesRepository.isPersonalizedAdsEnabled = isPersonalizedAds
|
|
||||||
|
|
||||||
adsHelper.initialize()
|
|
||||||
|
|
||||||
preferencesRepository.isAdsEnabled = true
|
preferencesRepository.isAdsEnabled = true
|
||||||
}
|
adsHelper.initialize()
|
||||||
|
|
||||||
fun onPrivacySelected() {
|
|
||||||
view?.openPrivacyPolicy()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkInAppReview() {
|
private fun checkInAppReview() {
|
||||||
@ -189,8 +178,8 @@ class MainPresenter @Inject constructor(
|
|||||||
.getOrElse { return@launch }
|
.getOrElse { return@launch }
|
||||||
|
|
||||||
if (Instant.now().minus(Duration.ofDays(28)).isAfter(student.registrationDate)) {
|
if (Instant.now().minus(Duration.ofDays(28)).isAfter(student.registrationDate)) {
|
||||||
view?.showAppSupport()
|
|
||||||
preferencesRepository.isAppSupportShown = true
|
preferencesRepository.isAppSupportShown = true
|
||||||
|
view?.showAppSupport()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,10 +46,6 @@ interface MainView : BaseView {
|
|||||||
|
|
||||||
fun showAppSupport()
|
fun showAppSupport()
|
||||||
|
|
||||||
fun showPrivacyPolicyDialog()
|
|
||||||
|
|
||||||
fun openPrivacyPolicy()
|
|
||||||
|
|
||||||
fun openMoreDestination(destination: Destination)
|
fun openMoreDestination(destination: Destination)
|
||||||
|
|
||||||
interface MainChildView {
|
interface MainChildView {
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
Wersja 2.2.4
|
Wersja 2.3.1
|
||||||
|
|
||||||
— ułatwiliśmy przełączenie dnia na weekend w planie lekcji przy użyciu strzałek
|
— poprawiliśmy kilka usterek przy odświeżaniu danych (ale pewnie nie wszystkie)
|
||||||
— poprawiliśmy wsparcie dla statystyk ocen z systemem punktowym
|
|
||||||
— poprawiliśmy sortowanie nauczycieli w widoku Szkoła i nauczyciele
|
|
||||||
|
|
||||||
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases
|
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases
|
||||||
|
@ -1,79 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout 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="wrap_content">
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/ads_consent_privacy"
|
|
||||||
style="@style/Widget.MaterialComponents.Button.TextButton"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="24dp"
|
|
||||||
android:layout_marginHorizontal="24dp"
|
|
||||||
android:insetLeft="0dp"
|
|
||||||
android:insetTop="0dp"
|
|
||||||
android:insetRight="0dp"
|
|
||||||
android:insetBottom="0dp"
|
|
||||||
android:padding="0dp"
|
|
||||||
android:text="@string/pref_ads_privacy_policy"
|
|
||||||
android:textAllCaps="false"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
|
||||||
|
|
||||||
<com.google.android.material.checkbox.MaterialCheckBox
|
|
||||||
android:id="@+id/ads_consent_over"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginHorizontal="17dp"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:text="@string/pref_ads_over_18_years_old"
|
|
||||||
android:textColor="?android:textColorSecondary"
|
|
||||||
android:textSize="14sp"
|
|
||||||
app:layout_constraintTop_toBottomOf="@id/ads_consent_privacy" />
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/ads_consent_personalised"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginHorizontal="24dp"
|
|
||||||
android:layout_marginTop="24dp"
|
|
||||||
android:enabled="false"
|
|
||||||
android:insetLeft="0dp"
|
|
||||||
android:insetTop="0dp"
|
|
||||||
android:insetRight="0dp"
|
|
||||||
android:insetBottom="0dp"
|
|
||||||
android:text="@string/pref_ads_option_personalized"
|
|
||||||
app:layout_constraintTop_toBottomOf="@id/ads_consent_over" />
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/ads_consent_non_personalised"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginHorizontal="24dp"
|
|
||||||
android:layout_marginTop="24dp"
|
|
||||||
android:layout_marginBottom="24dp"
|
|
||||||
android:insetLeft="0dp"
|
|
||||||
android:insetTop="0dp"
|
|
||||||
android:insetRight="0dp"
|
|
||||||
android:insetBottom="0dp"
|
|
||||||
android:text="@string/pref_ads_option_non_personalized"
|
|
||||||
app:layout_constraintBottom_toTopOf="@id/ads_consent_cancel"
|
|
||||||
app:layout_constraintTop_toBottomOf="@id/ads_consent_personalised"
|
|
||||||
app:layout_constraintVertical_bias="0" />
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/ads_consent_cancel"
|
|
||||||
style="@style/Widget.Material3.Button.OutlinedButton"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginHorizontal="24dp"
|
|
||||||
android:layout_marginTop="24dp"
|
|
||||||
android:layout_marginBottom="24dp"
|
|
||||||
android:insetLeft="0dp"
|
|
||||||
android:insetTop="0dp"
|
|
||||||
android:insetRight="0dp"
|
|
||||||
android:insetBottom="0dp"
|
|
||||||
android:text="@android:string/cancel"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintVertical_bias="0" />
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -760,7 +760,7 @@
|
|||||||
<string name="pref_ads_support_category_name">Podpora</string>
|
<string name="pref_ads_support_category_name">Podpora</string>
|
||||||
<string name="pref_ads_privacy_policy">Ochrana osobních údajů</string>
|
<string name="pref_ads_privacy_policy">Ochrana osobních údajů</string>
|
||||||
<string name="pref_ads_agreements">Souhlasy</string>
|
<string name="pref_ads_agreements">Souhlasy</string>
|
||||||
<string name="pref_ads_consent">Souhlas se zpracováním údajů souvisejících s reklamami</string>
|
<string name="pref_ads_consent">Show consent to data processing</string>
|
||||||
<string name="pref_ads_show_in_app">Zobrazit reklamy v aplikaci</string>
|
<string name="pref_ads_show_in_app">Zobrazit reklamy v aplikaci</string>
|
||||||
<string name="pref_ads_support">Podívejte se na jednu reklamu pro podporu projektu</string>
|
<string name="pref_ads_support">Podívejte se na jednu reklamu pro podporu projektu</string>
|
||||||
<string name="pref_ads_privacy_title">Souhlas se zpracováním dat</string>
|
<string name="pref_ads_privacy_title">Souhlas se zpracováním dat</string>
|
||||||
@ -769,13 +769,6 @@
|
|||||||
<string name="pref_ads_privacy_link">Ochrana osobních údajů</string>
|
<string name="pref_ads_privacy_link">Ochrana osobních údajů</string>
|
||||||
<string name="pref_ads_loading">Reklama se načítá</string>
|
<string name="pref_ads_loading">Reklama se načítá</string>
|
||||||
<string name="pref_ads_once_per_visit">Děkujeme za vaši podporu, vraťte se později pro více reklam</string>
|
<string name="pref_ads_once_per_visit">Děkujeme za vaši podporu, vraťte se později pro více reklam</string>
|
||||||
<string name="pref_ads_consent_title">Můžeme použít Vaše data k zobrazení reklam?</string>
|
|
||||||
<string name="pref_ads_consent_description">Volbu můžete kdykoliv změnit v nastavení aplikace. Můžeme použít Vaše data k zobrazení reklam šitých pro vás nebo pomocí méně vašich dat zobrazovat nepřizpůsobené reklamy. Podrobnosti naleznete v našich Zásadách ochrany osobních údajů</string>
|
|
||||||
<string name="pref_ads_summary_personalized">Přizpůsobené reklamy</string>
|
|
||||||
<string name="pref_ads_summary_non_personalized">Nepřizpůsobené reklamy</string>
|
|
||||||
<string name="pref_ads_over_18_years_old">Je mi více než 18 let</string>
|
|
||||||
<string name="pref_ads_option_personalized">Ano, přizpůsobené reklamy</string>
|
|
||||||
<string name="pref_ads_option_non_personalized">Ano, nepřizpůsobené reklamy</string>
|
|
||||||
<string name="pref_settings_advanced_title">Pokročilé</string>
|
<string name="pref_settings_advanced_title">Pokročilé</string>
|
||||||
<string name="pref_settings_appearance_title">Vzhled a chování</string>
|
<string name="pref_settings_appearance_title">Vzhled a chování</string>
|
||||||
<string name="pref_settings_notifications_title">Oznámení</string>
|
<string name="pref_settings_notifications_title">Oznámení</string>
|
||||||
|
@ -670,7 +670,7 @@
|
|||||||
<string name="pref_ads_support_category_name">Support</string>
|
<string name="pref_ads_support_category_name">Support</string>
|
||||||
<string name="pref_ads_privacy_policy">Privacy Policy</string>
|
<string name="pref_ads_privacy_policy">Privacy Policy</string>
|
||||||
<string name="pref_ads_agreements">Agreements</string>
|
<string name="pref_ads_agreements">Agreements</string>
|
||||||
<string name="pref_ads_consent">Consent to processing of data related to ads</string>
|
<string name="pref_ads_consent">Show consent to data processing</string>
|
||||||
<string name="pref_ads_show_in_app">Show ads in app</string>
|
<string name="pref_ads_show_in_app">Show ads in app</string>
|
||||||
<string name="pref_ads_support">Watch single ad to support project</string>
|
<string name="pref_ads_support">Watch single ad to support project</string>
|
||||||
<string name="pref_ads_privacy_title">Consent to data processing</string>
|
<string name="pref_ads_privacy_title">Consent to data processing</string>
|
||||||
@ -679,13 +679,6 @@
|
|||||||
<string name="pref_ads_privacy_link">Privacy policy</string>
|
<string name="pref_ads_privacy_link">Privacy policy</string>
|
||||||
<string name="pref_ads_loading">Ad is loading</string>
|
<string name="pref_ads_loading">Ad is loading</string>
|
||||||
<string name="pref_ads_once_per_visit">Thank you for your support, come back later for more ads</string>
|
<string name="pref_ads_once_per_visit">Thank you for your support, come back later for more ads</string>
|
||||||
<string name="pref_ads_consent_title">Can we use your data to display ads?</string>
|
|
||||||
<string name="pref_ads_consent_description">You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details</string>
|
|
||||||
<string name="pref_ads_summary_personalized">Personalized ads</string>
|
|
||||||
<string name="pref_ads_summary_non_personalized">Non-personalized ads</string>
|
|
||||||
<string name="pref_ads_over_18_years_old">I am over 18 years old</string>
|
|
||||||
<string name="pref_ads_option_personalized">Yes, personalized ads</string>
|
|
||||||
<string name="pref_ads_option_non_personalized">Yes, non-personalized ads</string>
|
|
||||||
<string name="pref_settings_advanced_title">Advanced</string>
|
<string name="pref_settings_advanced_title">Advanced</string>
|
||||||
<string name="pref_settings_appearance_title">Appearance & Behavior</string>
|
<string name="pref_settings_appearance_title">Appearance & Behavior</string>
|
||||||
<string name="pref_settings_notifications_title">Notifications</string>
|
<string name="pref_settings_notifications_title">Notifications</string>
|
||||||
|
@ -670,7 +670,7 @@
|
|||||||
<string name="pref_ads_support_category_name">Unterstützung</string>
|
<string name="pref_ads_support_category_name">Unterstützung</string>
|
||||||
<string name="pref_ads_privacy_policy">Datenschutz-Bestimmungen</string>
|
<string name="pref_ads_privacy_policy">Datenschutz-Bestimmungen</string>
|
||||||
<string name="pref_ads_agreements">Vereinbarungen</string>
|
<string name="pref_ads_agreements">Vereinbarungen</string>
|
||||||
<string name="pref_ads_consent">Zustimmung zur Verarbeitung von Daten im Zusammenhang mit Anzeigen</string>
|
<string name="pref_ads_consent">Show consent to data processing</string>
|
||||||
<string name="pref_ads_show_in_app">Anzeigen in der App anzeigen</string>
|
<string name="pref_ads_show_in_app">Anzeigen in der App anzeigen</string>
|
||||||
<string name="pref_ads_support">Einzelanzeige ansehen, um Projekt zu unterstützen</string>
|
<string name="pref_ads_support">Einzelanzeige ansehen, um Projekt zu unterstützen</string>
|
||||||
<string name="pref_ads_privacy_title">Einwilligung in die Datenverarbeitung</string>
|
<string name="pref_ads_privacy_title">Einwilligung in die Datenverarbeitung</string>
|
||||||
@ -679,13 +679,6 @@
|
|||||||
<string name="pref_ads_privacy_link">Datenschutzerklärung</string>
|
<string name="pref_ads_privacy_link">Datenschutzerklärung</string>
|
||||||
<string name="pref_ads_loading">Anzeige wird geladen</string>
|
<string name="pref_ads_loading">Anzeige wird geladen</string>
|
||||||
<string name="pref_ads_once_per_visit">Vielen Dank für Ihre Unterstützung, kommen Sie später wieder für weitere Anzeigen</string>
|
<string name="pref_ads_once_per_visit">Vielen Dank für Ihre Unterstützung, kommen Sie später wieder für weitere Anzeigen</string>
|
||||||
<string name="pref_ads_consent_title">Können wir Ihre Daten zur Anzeige von Werbung verwenden?</string>
|
|
||||||
<string name="pref_ads_consent_description">Sie können Ihre Wahl jederzeit in den App-Einstellungen ändern. Wir verwenden Ihre Daten, um auf Sie zugeschnittene Anzeigen anzuzeigen oder unter Verwendung weniger Ihrer Daten nicht personalisierte Werbung anzuzeigen. Bitte lesen Sie unsere Datenschutzerklärung für Details</string>
|
|
||||||
<string name="pref_ads_summary_personalized">Personalisierte Werbung</string>
|
|
||||||
<string name="pref_ads_summary_non_personalized">keine personalisierte Werbung</string>
|
|
||||||
<string name="pref_ads_over_18_years_old">Ich bin über 18 Jahre alt</string>
|
|
||||||
<string name="pref_ads_option_personalized">Ja, personalisierte Werbung</string>
|
|
||||||
<string name="pref_ads_option_non_personalized">Ja, nicht personalisierte Werbung</string>
|
|
||||||
<string name="pref_settings_advanced_title">Erweitert</string>
|
<string name="pref_settings_advanced_title">Erweitert</string>
|
||||||
<string name="pref_settings_appearance_title">Aussehen & Verhalten</string>
|
<string name="pref_settings_appearance_title">Aussehen & Verhalten</string>
|
||||||
<string name="pref_settings_notifications_title">Benachrichtigungen</string>
|
<string name="pref_settings_notifications_title">Benachrichtigungen</string>
|
||||||
|
@ -670,7 +670,7 @@
|
|||||||
<string name="pref_ads_support_category_name">Support</string>
|
<string name="pref_ads_support_category_name">Support</string>
|
||||||
<string name="pref_ads_privacy_policy">Privacy Policy</string>
|
<string name="pref_ads_privacy_policy">Privacy Policy</string>
|
||||||
<string name="pref_ads_agreements">Agreements</string>
|
<string name="pref_ads_agreements">Agreements</string>
|
||||||
<string name="pref_ads_consent">Consent to processing of data related to ads</string>
|
<string name="pref_ads_consent">Show consent to data processing</string>
|
||||||
<string name="pref_ads_show_in_app">Show ads in app</string>
|
<string name="pref_ads_show_in_app">Show ads in app</string>
|
||||||
<string name="pref_ads_support">Watch single ad to support project</string>
|
<string name="pref_ads_support">Watch single ad to support project</string>
|
||||||
<string name="pref_ads_privacy_title">Consent to data processing</string>
|
<string name="pref_ads_privacy_title">Consent to data processing</string>
|
||||||
@ -679,13 +679,6 @@
|
|||||||
<string name="pref_ads_privacy_link">Privacy policy</string>
|
<string name="pref_ads_privacy_link">Privacy policy</string>
|
||||||
<string name="pref_ads_loading">Ad is loading</string>
|
<string name="pref_ads_loading">Ad is loading</string>
|
||||||
<string name="pref_ads_once_per_visit">Thank you for your support, come back later for more ads</string>
|
<string name="pref_ads_once_per_visit">Thank you for your support, come back later for more ads</string>
|
||||||
<string name="pref_ads_consent_title">Can we use your data to display ads?</string>
|
|
||||||
<string name="pref_ads_consent_description">You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details</string>
|
|
||||||
<string name="pref_ads_summary_personalized">Personalized ads</string>
|
|
||||||
<string name="pref_ads_summary_non_personalized">Non-personalized ads</string>
|
|
||||||
<string name="pref_ads_over_18_years_old">I am over 18 years old</string>
|
|
||||||
<string name="pref_ads_option_personalized">Yes, personalized ads</string>
|
|
||||||
<string name="pref_ads_option_non_personalized">Yes, non-personalized ads</string>
|
|
||||||
<string name="pref_settings_advanced_title">Advanced</string>
|
<string name="pref_settings_advanced_title">Advanced</string>
|
||||||
<string name="pref_settings_appearance_title">Appearance & Behavior</string>
|
<string name="pref_settings_appearance_title">Appearance & Behavior</string>
|
||||||
<string name="pref_settings_notifications_title">Notifications</string>
|
<string name="pref_settings_notifications_title">Notifications</string>
|
||||||
|
@ -670,7 +670,7 @@
|
|||||||
<string name="pref_ads_support_category_name">Support</string>
|
<string name="pref_ads_support_category_name">Support</string>
|
||||||
<string name="pref_ads_privacy_policy">Privacy Policy</string>
|
<string name="pref_ads_privacy_policy">Privacy Policy</string>
|
||||||
<string name="pref_ads_agreements">Agreements</string>
|
<string name="pref_ads_agreements">Agreements</string>
|
||||||
<string name="pref_ads_consent">Consent to processing of data related to ads</string>
|
<string name="pref_ads_consent">Show consent to data processing</string>
|
||||||
<string name="pref_ads_show_in_app">Show ads in app</string>
|
<string name="pref_ads_show_in_app">Show ads in app</string>
|
||||||
<string name="pref_ads_support">Watch single ad to support project</string>
|
<string name="pref_ads_support">Watch single ad to support project</string>
|
||||||
<string name="pref_ads_privacy_title">Consent to data processing</string>
|
<string name="pref_ads_privacy_title">Consent to data processing</string>
|
||||||
@ -679,13 +679,6 @@
|
|||||||
<string name="pref_ads_privacy_link">Privacy policy</string>
|
<string name="pref_ads_privacy_link">Privacy policy</string>
|
||||||
<string name="pref_ads_loading">Ad is loading</string>
|
<string name="pref_ads_loading">Ad is loading</string>
|
||||||
<string name="pref_ads_once_per_visit">Thank you for your support, come back later for more ads</string>
|
<string name="pref_ads_once_per_visit">Thank you for your support, come back later for more ads</string>
|
||||||
<string name="pref_ads_consent_title">Can we use your data to display ads?</string>
|
|
||||||
<string name="pref_ads_consent_description">You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details</string>
|
|
||||||
<string name="pref_ads_summary_personalized">Personalized ads</string>
|
|
||||||
<string name="pref_ads_summary_non_personalized">Non-personalized ads</string>
|
|
||||||
<string name="pref_ads_over_18_years_old">I am over 18 years old</string>
|
|
||||||
<string name="pref_ads_option_personalized">Yes, personalized ads</string>
|
|
||||||
<string name="pref_ads_option_non_personalized">Yes, non-personalized ads</string>
|
|
||||||
<string name="pref_settings_advanced_title">Advanced</string>
|
<string name="pref_settings_advanced_title">Advanced</string>
|
||||||
<string name="pref_settings_appearance_title">Appearance & Behavior</string>
|
<string name="pref_settings_appearance_title">Appearance & Behavior</string>
|
||||||
<string name="pref_settings_notifications_title">Notifications</string>
|
<string name="pref_settings_notifications_title">Notifications</string>
|
||||||
|
@ -760,7 +760,7 @@
|
|||||||
<string name="pref_ads_support_category_name">Wsparcie</string>
|
<string name="pref_ads_support_category_name">Wsparcie</string>
|
||||||
<string name="pref_ads_privacy_policy">Polityka prywatności</string>
|
<string name="pref_ads_privacy_policy">Polityka prywatności</string>
|
||||||
<string name="pref_ads_agreements">Zgody</string>
|
<string name="pref_ads_agreements">Zgody</string>
|
||||||
<string name="pref_ads_consent">Zgoda na przetwarzanie danych związanych z reklamami</string>
|
<string name="pref_ads_consent">Pokaż zgodę na przetwarzanie danych</string>
|
||||||
<string name="pref_ads_show_in_app">Pokazuj reklamy w aplikacji</string>
|
<string name="pref_ads_show_in_app">Pokazuj reklamy w aplikacji</string>
|
||||||
<string name="pref_ads_support">Obejrzyj pojedynczą reklamę, aby wesprzeć projekt</string>
|
<string name="pref_ads_support">Obejrzyj pojedynczą reklamę, aby wesprzeć projekt</string>
|
||||||
<string name="pref_ads_privacy_title">Zgoda na przetwarzanie danych</string>
|
<string name="pref_ads_privacy_title">Zgoda na przetwarzanie danych</string>
|
||||||
@ -769,13 +769,6 @@
|
|||||||
<string name="pref_ads_privacy_link">Polityka prywatności</string>
|
<string name="pref_ads_privacy_link">Polityka prywatności</string>
|
||||||
<string name="pref_ads_loading">Ładowanie reklamy</string>
|
<string name="pref_ads_loading">Ładowanie reklamy</string>
|
||||||
<string name="pref_ads_once_per_visit">Dziękujemy za wsparcie, wróć później po więcej reklam</string>
|
<string name="pref_ads_once_per_visit">Dziękujemy za wsparcie, wróć później po więcej reklam</string>
|
||||||
<string name="pref_ads_consent_title">Czy możemy używać Twoich danych do wyświetlania reklam?</string>
|
|
||||||
<string name="pref_ads_consent_description">Możesz zmienić swój wybór w dowolnym momencie w ustawieniach aplikacji. Możemy wykorzystać Twoje dane do wyświetlania reklam dostosowanych do Ciebie lub, przy użyciu mniejszej ilości danych, wyświetlić niepersonalizowane reklamy. Zobacz naszą Politykę Prywatności, aby uzyskać więcej informacji</string>
|
|
||||||
<string name="pref_ads_summary_personalized">Spersonalizowane reklamy</string>
|
|
||||||
<string name="pref_ads_summary_non_personalized">Niespersonalizowane reklamy</string>
|
|
||||||
<string name="pref_ads_over_18_years_old">Mam ukończone 18 lat</string>
|
|
||||||
<string name="pref_ads_option_personalized">Tak, spersonalizowane reklamy</string>
|
|
||||||
<string name="pref_ads_option_non_personalized">Tak, niespersonalizowane reklamy</string>
|
|
||||||
<string name="pref_settings_advanced_title">Zaawansowane</string>
|
<string name="pref_settings_advanced_title">Zaawansowane</string>
|
||||||
<string name="pref_settings_appearance_title">Wygląd i zachowanie</string>
|
<string name="pref_settings_appearance_title">Wygląd i zachowanie</string>
|
||||||
<string name="pref_settings_notifications_title">Powiadomienia</string>
|
<string name="pref_settings_notifications_title">Powiadomienia</string>
|
||||||
|
@ -760,7 +760,7 @@
|
|||||||
<string name="pref_ads_support_category_name">Поддержка</string>
|
<string name="pref_ads_support_category_name">Поддержка</string>
|
||||||
<string name="pref_ads_privacy_policy">Политика приватности</string>
|
<string name="pref_ads_privacy_policy">Политика приватности</string>
|
||||||
<string name="pref_ads_agreements">Соглашения</string>
|
<string name="pref_ads_agreements">Соглашения</string>
|
||||||
<string name="pref_ads_consent">Согласие на обработку данных, связанных с объявлениями</string>
|
<string name="pref_ads_consent">Show consent to data processing</string>
|
||||||
<string name="pref_ads_show_in_app">Показать рекламу в приложении</string>
|
<string name="pref_ads_show_in_app">Показать рекламу в приложении</string>
|
||||||
<string name="pref_ads_support">Посмотреть рекламу для поддержки проекта</string>
|
<string name="pref_ads_support">Посмотреть рекламу для поддержки проекта</string>
|
||||||
<string name="pref_ads_privacy_title">Согласие на обработку данных</string>
|
<string name="pref_ads_privacy_title">Согласие на обработку данных</string>
|
||||||
@ -769,13 +769,6 @@
|
|||||||
<string name="pref_ads_privacy_link">Политика конфиденциальности</string>
|
<string name="pref_ads_privacy_link">Политика конфиденциальности</string>
|
||||||
<string name="pref_ads_loading">Реклама загружается</string>
|
<string name="pref_ads_loading">Реклама загружается</string>
|
||||||
<string name="pref_ads_once_per_visit">Спасибо за вашу поддержку, возвращайтесь позже для дополнительной рекламы</string>
|
<string name="pref_ads_once_per_visit">Спасибо за вашу поддержку, возвращайтесь позже для дополнительной рекламы</string>
|
||||||
<string name="pref_ads_consent_title">Можем ли мы использовать ваши данные для показа рекламы?</string>
|
|
||||||
<string name="pref_ads_consent_description">Вы можете изменить свой выбор в любое время в настройках приложения. Мы можем использовать ваши данные для показа объявлений в соответствии с вашими пожеланиями или, используя меньше данных, отображать неперсональную рекламу. Пожалуйста, ознакомьтесь с нашей политикой конфиденциальности для подробностей</string>
|
|
||||||
<string name="pref_ads_summary_personalized">Персонализированная реклама</string>
|
|
||||||
<string name="pref_ads_summary_non_personalized">Неперсонализированная реклама</string>
|
|
||||||
<string name="pref_ads_over_18_years_old">Я старше 18 лет</string>
|
|
||||||
<string name="pref_ads_option_personalized">Да, персонализировать рекламу</string>
|
|
||||||
<string name="pref_ads_option_non_personalized">Да, не персонализировать рекламу</string>
|
|
||||||
<string name="pref_settings_advanced_title">Расширенные</string>
|
<string name="pref_settings_advanced_title">Расширенные</string>
|
||||||
<string name="pref_settings_appearance_title">Внешний вид и поведение</string>
|
<string name="pref_settings_appearance_title">Внешний вид и поведение</string>
|
||||||
<string name="pref_settings_notifications_title">Уведомления</string>
|
<string name="pref_settings_notifications_title">Уведомления</string>
|
||||||
|
@ -760,7 +760,7 @@
|
|||||||
<string name="pref_ads_support_category_name">Podpora</string>
|
<string name="pref_ads_support_category_name">Podpora</string>
|
||||||
<string name="pref_ads_privacy_policy">Ochrana osobných údajov</string>
|
<string name="pref_ads_privacy_policy">Ochrana osobných údajov</string>
|
||||||
<string name="pref_ads_agreements">Súhlasy</string>
|
<string name="pref_ads_agreements">Súhlasy</string>
|
||||||
<string name="pref_ads_consent">Súhlas so spracovaním údajov súvisiacich s reklamami</string>
|
<string name="pref_ads_consent">Show consent to data processing</string>
|
||||||
<string name="pref_ads_show_in_app">Zobraziť reklamy v aplikácii</string>
|
<string name="pref_ads_show_in_app">Zobraziť reklamy v aplikácii</string>
|
||||||
<string name="pref_ads_support">Pozrite sa na jednu reklamu pre podporu projektu</string>
|
<string name="pref_ads_support">Pozrite sa na jednu reklamu pre podporu projektu</string>
|
||||||
<string name="pref_ads_privacy_title">Súhlas so spracovaním dát</string>
|
<string name="pref_ads_privacy_title">Súhlas so spracovaním dát</string>
|
||||||
@ -769,13 +769,6 @@
|
|||||||
<string name="pref_ads_privacy_link">Ochrana osobných údajov</string>
|
<string name="pref_ads_privacy_link">Ochrana osobných údajov</string>
|
||||||
<string name="pref_ads_loading">Reklama sa načítava</string>
|
<string name="pref_ads_loading">Reklama sa načítava</string>
|
||||||
<string name="pref_ads_once_per_visit">Ďakujeme za vašu podporu, vráťte sa neskôr pre viac reklám</string>
|
<string name="pref_ads_once_per_visit">Ďakujeme za vašu podporu, vráťte sa neskôr pre viac reklám</string>
|
||||||
<string name="pref_ads_consent_title">Môžeme použiť Vaše údaje na zobrazenie reklám?</string>
|
|
||||||
<string name="pref_ads_consent_description">Voľbu môžete kedykoľvek zmeniť v nastavení aplikácie. Môžeme použiť vaše údaje na zobrazenie reklám šitých pre vás alebo pomocou menej vašich dát zobrazovať neprispôsobené reklamy. Podrobnosti nájdete v našich Zásadách ochrany osobných údajov</string>
|
|
||||||
<string name="pref_ads_summary_personalized">Prispôsobené reklamy</string>
|
|
||||||
<string name="pref_ads_summary_non_personalized">Neprispôsobené reklamy</string>
|
|
||||||
<string name="pref_ads_over_18_years_old">Mám viac ako 18 rokov</string>
|
|
||||||
<string name="pref_ads_option_personalized">Áno, prispôsobené reklamy</string>
|
|
||||||
<string name="pref_ads_option_non_personalized">Áno, neprispôsobené reklamy</string>
|
|
||||||
<string name="pref_settings_advanced_title">Pokročilé</string>
|
<string name="pref_settings_advanced_title">Pokročilé</string>
|
||||||
<string name="pref_settings_appearance_title">Vzhľad a správanie</string>
|
<string name="pref_settings_appearance_title">Vzhľad a správanie</string>
|
||||||
<string name="pref_settings_notifications_title">Oznámenia</string>
|
<string name="pref_settings_notifications_title">Oznámenia</string>
|
||||||
|
@ -760,7 +760,7 @@
|
|||||||
<string name="pref_ads_support_category_name">Підтримка</string>
|
<string name="pref_ads_support_category_name">Підтримка</string>
|
||||||
<string name="pref_ads_privacy_policy">Політика конфіденційності</string>
|
<string name="pref_ads_privacy_policy">Політика конфіденційності</string>
|
||||||
<string name="pref_ads_agreements">Угоди</string>
|
<string name="pref_ads_agreements">Угоди</string>
|
||||||
<string name="pref_ads_consent">Згода на обробку даних, пов\'язаних з рекламою</string>
|
<string name="pref_ads_consent">Показати згоду на обробку даних</string>
|
||||||
<string name="pref_ads_show_in_app">Показувати рекламу в додатку</string>
|
<string name="pref_ads_show_in_app">Показувати рекламу в додатку</string>
|
||||||
<string name="pref_ads_support">Подивіться одну рекламу для підтримки проєкту</string>
|
<string name="pref_ads_support">Подивіться одну рекламу для підтримки проєкту</string>
|
||||||
<string name="pref_ads_privacy_title">Згода в обробці даних</string>
|
<string name="pref_ads_privacy_title">Згода в обробці даних</string>
|
||||||
@ -769,13 +769,6 @@
|
|||||||
<string name="pref_ads_privacy_link">Політика конфіденційності</string>
|
<string name="pref_ads_privacy_link">Політика конфіденційності</string>
|
||||||
<string name="pref_ads_loading">Реклама завантажується</string>
|
<string name="pref_ads_loading">Реклама завантажується</string>
|
||||||
<string name="pref_ads_once_per_visit">Дякуємо за вашу підтримку, повертайтеся пізніше для більшої кількості реклам</string>
|
<string name="pref_ads_once_per_visit">Дякуємо за вашу підтримку, повертайтеся пізніше для більшої кількості реклам</string>
|
||||||
<string name="pref_ads_consent_title">Чи можемо ми використовувати ваші дані для висвітлювання реклами?</string>
|
|
||||||
<string name="pref_ads_consent_description">Ви можете змінити свій вибір в будь-який час в налаштуваннях додатку. Ми можемо використовувати ваші дані для висвітлювання реклами, адаптованої до вас або, використовуючи менше ваших даних, висвітлювати неперсоналізовану рекламу. Перегляньте нашу Політику конфіденційності для подробиць</string>
|
|
||||||
<string name="pref_ads_summary_personalized">Персоналізована реклама</string>
|
|
||||||
<string name="pref_ads_summary_non_personalized">Неперсоналізована реклама</string>
|
|
||||||
<string name="pref_ads_over_18_years_old">Мені більше 18 років</string>
|
|
||||||
<string name="pref_ads_option_personalized">Так, персоналізована реклама</string>
|
|
||||||
<string name="pref_ads_option_non_personalized">Так, неперсоналізована реклама</string>
|
|
||||||
<string name="pref_settings_advanced_title">Додатково</string>
|
<string name="pref_settings_advanced_title">Додатково</string>
|
||||||
<string name="pref_settings_appearance_title">Вигляд та поведінка</string>
|
<string name="pref_settings_appearance_title">Вигляд та поведінка</string>
|
||||||
<string name="pref_settings_notifications_title">Сповіщення</string>
|
<string name="pref_settings_notifications_title">Сповіщення</string>
|
||||||
|
@ -37,8 +37,7 @@
|
|||||||
<string name="pref_key_ads_single_support">single_ad_support</string>
|
<string name="pref_key_ads_single_support">single_ad_support</string>
|
||||||
<string name="pref_key_ads_enabled">ads_enabled</string>
|
<string name="pref_key_ads_enabled">ads_enabled</string>
|
||||||
<string name="pref_key_ads_privacy_policy">ads_privacy_policy</string>
|
<string name="pref_key_ads_privacy_policy">ads_privacy_policy</string>
|
||||||
<string name="pref_key_ads_consent_data_processing">ads_consent_data_processing</string>
|
<string name="pref_key_ads_ump_agreements">ads_ump_agreements</string>
|
||||||
<string name="pref_key_ads_over_eighteen">ads_over_eighteen</string>
|
|
||||||
<string name="pref_key_incognito_moge">incognito_mode</string>
|
<string name="pref_key_incognito_moge">incognito_mode</string>
|
||||||
<string name="pref_key_menu_order">appearance_menu_order</string>
|
<string name="pref_key_menu_order">appearance_menu_order</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -749,7 +749,7 @@
|
|||||||
<string name="pref_ads_support_category_name">Support</string>
|
<string name="pref_ads_support_category_name">Support</string>
|
||||||
<string name="pref_ads_privacy_policy">Privacy Policy</string>
|
<string name="pref_ads_privacy_policy">Privacy Policy</string>
|
||||||
<string name="pref_ads_agreements">Agreements</string>
|
<string name="pref_ads_agreements">Agreements</string>
|
||||||
<string name="pref_ads_consent">Consent to processing of data related to ads</string>
|
<string name="pref_ads_consent">Show consent to data processing</string>
|
||||||
<string name="pref_ads_show_in_app">Show ads in app</string>
|
<string name="pref_ads_show_in_app">Show ads in app</string>
|
||||||
<string name="pref_ads_support">Watch single ad to support project</string>
|
<string name="pref_ads_support">Watch single ad to support project</string>
|
||||||
<string name="pref_ads_privacy_title">Consent to data processing</string>
|
<string name="pref_ads_privacy_title">Consent to data processing</string>
|
||||||
@ -758,13 +758,6 @@
|
|||||||
<string name="pref_ads_privacy_link">Privacy policy</string>
|
<string name="pref_ads_privacy_link">Privacy policy</string>
|
||||||
<string name="pref_ads_loading">Ad is loading</string>
|
<string name="pref_ads_loading">Ad is loading</string>
|
||||||
<string name="pref_ads_once_per_visit">Thank you for your support, come back later for more ads</string>
|
<string name="pref_ads_once_per_visit">Thank you for your support, come back later for more ads</string>
|
||||||
<string name="pref_ads_consent_title">Can we use your data to display ads?</string>
|
|
||||||
<string name="pref_ads_consent_description">You can change your choice anytime in the app settings. We may use your data to display ads tailored to you or, using less of your data, display non-personalized ads. Please see our Privacy Policy for details</string>
|
|
||||||
<string name="pref_ads_summary_personalized">Personalized ads</string>
|
|
||||||
<string name="pref_ads_summary_non_personalized">Non-personalized ads</string>
|
|
||||||
<string name="pref_ads_over_18_years_old">I am over 18 years old</string>
|
|
||||||
<string name="pref_ads_option_personalized">Yes, personalized ads</string>
|
|
||||||
<string name="pref_ads_option_non_personalized">Yes, non-personalized ads</string>
|
|
||||||
<string name="pref_settings_advanced_title">Advanced</string>
|
<string name="pref_settings_advanced_title">Advanced</string>
|
||||||
<string name="pref_settings_appearance_title">Appearance & Behavior</string>
|
<string name="pref_settings_appearance_title">Appearance & Behavior</string>
|
||||||
<string name="pref_settings_notifications_title">Notifications</string>
|
<string name="pref_settings_notifications_title">Notifications</string>
|
||||||
|
@ -2,19 +2,17 @@ package io.github.wulkanowy.ui.modules.settings.ads
|
|||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.preference.CheckBoxPreference
|
|
||||||
import androidx.preference.Preference
|
import androidx.preference.Preference
|
||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import androidx.preference.SwitchPreferenceCompat
|
import androidx.preference.SwitchPreferenceCompat
|
||||||
import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd
|
import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import io.github.wulkanowy.R
|
import io.github.wulkanowy.R
|
||||||
import io.github.wulkanowy.databinding.DialogAdsConsentBinding
|
|
||||||
import io.github.wulkanowy.ui.base.BaseActivity
|
import io.github.wulkanowy.ui.base.BaseActivity
|
||||||
import io.github.wulkanowy.ui.base.ErrorDialog
|
import io.github.wulkanowy.ui.base.ErrorDialog
|
||||||
import io.github.wulkanowy.ui.modules.auth.AuthDialog
|
import io.github.wulkanowy.ui.modules.auth.AuthDialog
|
||||||
import io.github.wulkanowy.ui.modules.main.MainView
|
import io.github.wulkanowy.ui.modules.main.MainView
|
||||||
|
import io.github.wulkanowy.utils.AdsHelper
|
||||||
import io.github.wulkanowy.utils.openInternetBrowser
|
import io.github.wulkanowy.utils.openInternetBrowser
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@ -24,6 +22,9 @@ class AdsFragment : PreferenceFragmentCompat(), MainView.TitledView, AdsView {
|
|||||||
@Inject
|
@Inject
|
||||||
lateinit var presenter: AdsPresenter
|
lateinit var presenter: AdsPresenter
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var adsHelper: AdsHelper
|
||||||
|
|
||||||
override val titleStringId = R.string.pref_settings_ads_title
|
override val titleStringId = R.string.pref_settings_ads_title
|
||||||
|
|
||||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
@ -46,11 +47,18 @@ class AdsFragment : PreferenceFragmentCompat(), MainView.TitledView, AdsView {
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
findPreference<CheckBoxPreference>(getString(R.string.pref_key_ads_consent_data_processing))
|
findPreference<Preference>(getString(R.string.pref_key_ads_ump_agreements))?.setOnPreferenceClickListener {
|
||||||
?.setOnPreferenceChangeListener { _, newValue ->
|
presenter.onUmpAgreementsSelected()
|
||||||
presenter.onConsentSelected(newValue as Boolean)
|
true
|
||||||
true
|
}
|
||||||
}
|
|
||||||
|
findPreference<Preference>(getString(R.string.pref_key_ads_single_support))
|
||||||
|
?.isEnabled = adsHelper.canShowAd
|
||||||
|
|
||||||
|
findPreference<SwitchPreferenceCompat>(getString(R.string.pref_key_ads_enabled))?.setOnPreferenceChangeListener { _, newValue ->
|
||||||
|
presenter.onAdsEnabledSelected(newValue as Boolean)
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun showAd(ad: RewardedInterstitialAd) {
|
override fun showAd(ad: RewardedInterstitialAd) {
|
||||||
@ -59,48 +67,6 @@ class AdsFragment : PreferenceFragmentCompat(), MainView.TitledView, AdsView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun showPrivacyPolicyDialog() {
|
|
||||||
val dialogAdsConsentBinding = DialogAdsConsentBinding.inflate(layoutInflater)
|
|
||||||
|
|
||||||
val dialog = MaterialAlertDialogBuilder(requireContext())
|
|
||||||
.setTitle(R.string.pref_ads_consent_title)
|
|
||||||
.setMessage(R.string.pref_ads_consent_description)
|
|
||||||
.setView(dialogAdsConsentBinding.root)
|
|
||||||
.setOnCancelListener { presenter.onPrivacyDialogCanceled() }
|
|
||||||
.show()
|
|
||||||
|
|
||||||
dialogAdsConsentBinding.adsConsentOver.setOnCheckedChangeListener { _, isChecked ->
|
|
||||||
dialogAdsConsentBinding.adsConsentPersonalised.isEnabled = isChecked
|
|
||||||
}
|
|
||||||
|
|
||||||
dialogAdsConsentBinding.adsConsentPersonalised.setOnClickListener {
|
|
||||||
presenter.onPersonalizedAgree()
|
|
||||||
dialog.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
dialogAdsConsentBinding.adsConsentNonPersonalised.setOnClickListener {
|
|
||||||
presenter.onNonPersonalizedAgree()
|
|
||||||
dialog.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
dialogAdsConsentBinding.adsConsentPrivacy.setOnClickListener { presenter.onPrivacySelected() }
|
|
||||||
dialogAdsConsentBinding.adsConsentCancel.setOnClickListener { dialog.cancel() }
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun showProcessingDataSummary(isPersonalized: Boolean?) {
|
|
||||||
val summaryText = isPersonalized?.let {
|
|
||||||
getString(if (it) R.string.pref_ads_summary_personalized else R.string.pref_ads_summary_non_personalized)
|
|
||||||
}
|
|
||||||
|
|
||||||
findPreference<CheckBoxPreference>(getString(R.string.pref_key_ads_consent_data_processing))
|
|
||||||
?.summary = summaryText
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun setCheckedProcessingData(checked: Boolean) {
|
|
||||||
findPreference<CheckBoxPreference>(getString(R.string.pref_key_ads_consent_data_processing))
|
|
||||||
?.isChecked = checked
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun setCheckedAdsEnabled(checked: Boolean) {
|
override fun setCheckedAdsEnabled(checked: Boolean) {
|
||||||
findPreference<SwitchPreferenceCompat>(getString(R.string.pref_key_ads_enabled))
|
findPreference<SwitchPreferenceCompat>(getString(R.string.pref_key_ads_enabled))
|
||||||
?.isChecked = checked
|
?.isChecked = checked
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package io.github.wulkanowy.ui.modules.settings.ads
|
package io.github.wulkanowy.ui.modules.settings.ads
|
||||||
|
|
||||||
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
|
||||||
import io.github.wulkanowy.data.repositories.StudentRepository
|
import io.github.wulkanowy.data.repositories.StudentRepository
|
||||||
import io.github.wulkanowy.ui.base.BasePresenter
|
import io.github.wulkanowy.ui.base.BasePresenter
|
||||||
import io.github.wulkanowy.ui.base.ErrorHandler
|
import io.github.wulkanowy.ui.base.ErrorHandler
|
||||||
@ -13,18 +12,12 @@ class AdsPresenter @Inject constructor(
|
|||||||
errorHandler: ErrorHandler,
|
errorHandler: ErrorHandler,
|
||||||
studentRepository: StudentRepository,
|
studentRepository: StudentRepository,
|
||||||
private val adsHelper: AdsHelper,
|
private val adsHelper: AdsHelper,
|
||||||
private val preferencesRepository: PreferencesRepository
|
|
||||||
) : BasePresenter<AdsView>(errorHandler, studentRepository) {
|
) : BasePresenter<AdsView>(errorHandler, studentRepository) {
|
||||||
|
|
||||||
override fun onAttachView(view: AdsView) {
|
override fun onAttachView(view: AdsView) {
|
||||||
super.onAttachView(view)
|
super.onAttachView(view)
|
||||||
view.initView()
|
view.initView()
|
||||||
Timber.i("Settings ads view was initialized")
|
Timber.i("Settings ads view was initialized")
|
||||||
|
|
||||||
view.showProcessingDataSummary(
|
|
||||||
preferencesRepository.isPersonalizedAdsEnabled.takeIf {
|
|
||||||
preferencesRepository.isAgreeToProcessData
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onWatchSingleAdSelected() {
|
fun onWatchSingleAdSelected() {
|
||||||
@ -50,38 +43,17 @@ class AdsPresenter @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onConsentSelected(isChecked: Boolean) {
|
|
||||||
if (isChecked) {
|
|
||||||
view?.showPrivacyPolicyDialog()
|
|
||||||
} else {
|
|
||||||
view?.showProcessingDataSummary(null)
|
|
||||||
view?.setCheckedAdsEnabled(false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun onPrivacySelected() {
|
fun onPrivacySelected() {
|
||||||
view?.openPrivacyPolicy()
|
view?.openPrivacyPolicy()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onPrivacyDialogCanceled() {
|
fun onAdsEnabledSelected(newValue: Boolean) {
|
||||||
view?.setCheckedProcessingData(false)
|
if (newValue) {
|
||||||
|
adsHelper.initialize()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onNonPersonalizedAgree() {
|
fun onUmpAgreementsSelected() {
|
||||||
preferencesRepository.isPersonalizedAdsEnabled = false
|
adsHelper.openAdsUmpAgreements()
|
||||||
|
|
||||||
adsHelper.initialize()
|
|
||||||
|
|
||||||
view?.setCheckedProcessingData(true)
|
|
||||||
view?.showProcessingDataSummary(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun onPersonalizedAgree() {
|
|
||||||
preferencesRepository.isPersonalizedAdsEnabled = true
|
|
||||||
|
|
||||||
adsHelper.initialize()
|
|
||||||
|
|
||||||
view?.setCheckedProcessingData(true)
|
|
||||||
view?.showProcessingDataSummary(true)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,6 @@ interface AdsView : BaseView {
|
|||||||
|
|
||||||
fun showAd(ad: RewardedInterstitialAd)
|
fun showAd(ad: RewardedInterstitialAd)
|
||||||
|
|
||||||
fun showPrivacyPolicyDialog()
|
|
||||||
|
|
||||||
fun openPrivacyPolicy()
|
fun openPrivacyPolicy()
|
||||||
|
|
||||||
fun showLoadingSupportAd(show: Boolean)
|
fun showLoadingSupportAd(show: Boolean)
|
||||||
@ -18,8 +16,4 @@ interface AdsView : BaseView {
|
|||||||
fun showWatchAdOncePerVisit(show: Boolean)
|
fun showWatchAdOncePerVisit(show: Boolean)
|
||||||
|
|
||||||
fun setCheckedAdsEnabled(checked: Boolean)
|
fun setCheckedAdsEnabled(checked: Boolean)
|
||||||
|
|
||||||
fun setCheckedProcessingData(checked: Boolean)
|
|
||||||
|
|
||||||
fun showProcessingDataSummary(isPersonalized: Boolean?)
|
|
||||||
}
|
}
|
||||||
|
@ -1,49 +1,110 @@
|
|||||||
package io.github.wulkanowy.utils
|
package io.github.wulkanowy.utils
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.net.ConnectivityManager
|
import android.net.ConnectivityManager
|
||||||
import android.net.NetworkCapabilities
|
import android.net.NetworkCapabilities
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.core.content.getSystemService
|
import androidx.core.content.getSystemService
|
||||||
import com.google.ads.mediation.admob.AdMobAdapter
|
import com.google.android.gms.ads.AdListener
|
||||||
import com.google.android.gms.ads.*
|
import com.google.android.gms.ads.AdRequest
|
||||||
|
import com.google.android.gms.ads.AdSize
|
||||||
|
import com.google.android.gms.ads.AdView
|
||||||
|
import com.google.android.gms.ads.LoadAdError
|
||||||
|
import com.google.android.gms.ads.MobileAds
|
||||||
import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd
|
import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd
|
||||||
import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAdLoadCallback
|
import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAdLoadCallback
|
||||||
|
import com.google.android.ump.ConsentInformation
|
||||||
|
import com.google.android.ump.ConsentRequestParameters
|
||||||
|
import com.google.android.ump.UserMessagingPlatform
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
|
import dagger.hilt.android.scopes.ActivityScoped
|
||||||
import io.github.wulkanowy.BuildConfig
|
import io.github.wulkanowy.BuildConfig
|
||||||
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import timber.log.Timber
|
||||||
import java.net.UnknownHostException
|
import java.net.UnknownHostException
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlin.coroutines.resume
|
import kotlin.coroutines.resume
|
||||||
import kotlin.coroutines.resumeWithException
|
import kotlin.coroutines.resumeWithException
|
||||||
import kotlin.coroutines.suspendCoroutine
|
import kotlin.coroutines.suspendCoroutine
|
||||||
|
|
||||||
|
@ActivityScoped
|
||||||
class AdsHelper @Inject constructor(
|
class AdsHelper @Inject constructor(
|
||||||
|
private val activity: Activity,
|
||||||
@ApplicationContext private val context: Context,
|
@ApplicationContext private val context: Context,
|
||||||
private val preferencesRepository: PreferencesRepository
|
preferencesRepository: PreferencesRepository
|
||||||
) {
|
) {
|
||||||
|
|
||||||
|
private var isMobileAdsInitializeCalled = AtomicBoolean(false)
|
||||||
|
private var consentInformation: ConsentInformation? = null
|
||||||
|
|
||||||
|
private val canRequestAd get() = consentInformation?.canRequestAds() == true
|
||||||
|
val isMobileAdsSdkInitialized = MutableStateFlow(false)
|
||||||
|
val canShowAd get() = isMobileAdsSdkInitialized.value && canRequestAd
|
||||||
|
|
||||||
|
init {
|
||||||
|
if (preferencesRepository.isAdsEnabled) {
|
||||||
|
initialize()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun initialize() {
|
fun initialize() {
|
||||||
if (preferencesRepository.isAgreeToProcessData) {
|
val consentRequestParameters = ConsentRequestParameters.Builder()
|
||||||
MobileAds.initialize(context)
|
.build()
|
||||||
|
|
||||||
|
consentInformation = UserMessagingPlatform.getConsentInformation(context)
|
||||||
|
consentInformation?.requestConsentInfoUpdate(
|
||||||
|
activity,
|
||||||
|
consentRequestParameters,
|
||||||
|
{
|
||||||
|
UserMessagingPlatform.loadAndShowConsentFormIfRequired(
|
||||||
|
activity
|
||||||
|
) { loadAndShowError ->
|
||||||
|
|
||||||
|
if (loadAndShowError != null) {
|
||||||
|
Timber.e(IllegalStateException("${loadAndShowError.errorCode}: ${loadAndShowError.message}"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (canRequestAd) {
|
||||||
|
initializeMobileAds()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ requestConsentError ->
|
||||||
|
Timber.e(IllegalStateException("${requestConsentError.errorCode}: ${requestConsentError.message}"))
|
||||||
|
})
|
||||||
|
|
||||||
|
if (canRequestAd) {
|
||||||
|
initializeMobileAds()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun openAdsUmpAgreements() {
|
||||||
|
UserMessagingPlatform.showPrivacyOptionsForm(activity) {
|
||||||
|
if (it != null) {
|
||||||
|
Timber.e(IllegalStateException("${it.errorCode}: ${it.message}"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initializeMobileAds() {
|
||||||
|
if (isMobileAdsInitializeCalled.getAndSet(true)) return
|
||||||
|
|
||||||
|
MobileAds.initialize(context) {
|
||||||
|
isMobileAdsSdkInitialized.value = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun getSupportAd(): RewardedInterstitialAd? {
|
suspend fun getSupportAd(): RewardedInterstitialAd? {
|
||||||
|
if (!canRequestAd) return null
|
||||||
if (!context.isInternetConnected()) {
|
if (!context.isInternetConnected()) {
|
||||||
throw UnknownHostException()
|
throw UnknownHostException()
|
||||||
}
|
}
|
||||||
|
|
||||||
val extra = Bundle().apply { putString("npa", "1") }
|
|
||||||
val adRequest = AdRequest.Builder()
|
val adRequest = AdRequest.Builder()
|
||||||
.apply {
|
|
||||||
if (!preferencesRepository.isPersonalizedAdsEnabled) {
|
|
||||||
addNetworkExtrasBundle(AdMobAdapter::class.java, extra)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
return suspendCoroutine {
|
return suspendCoroutine {
|
||||||
@ -64,13 +125,8 @@ class AdsHelper @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
suspend fun getDashboardTileAdBanner(width: Int): AdBanner {
|
suspend fun getDashboardTileAdBanner(width: Int): AdBanner {
|
||||||
val extra = Bundle().apply { putString("npa", "1") }
|
if (!canShowAd) throw IllegalStateException("Cannot show ad")
|
||||||
val adRequest = AdRequest.Builder()
|
val adRequest = AdRequest.Builder()
|
||||||
.apply {
|
|
||||||
if (!preferencesRepository.isPersonalizedAdsEnabled) {
|
|
||||||
addNetworkExtrasBundle(AdMobAdapter::class.java, extra)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
return suspendCoroutine {
|
return suspendCoroutine {
|
||||||
|
@ -1,25 +1,24 @@
|
|||||||
package io.github.wulkanowy.utils
|
package io.github.wulkanowy.utils
|
||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.Context
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import com.google.firebase.Firebase
|
||||||
import com.google.firebase.analytics.FirebaseAnalytics
|
import com.google.firebase.analytics.FirebaseAnalytics
|
||||||
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
import com.google.firebase.analytics.analytics
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import com.google.firebase.crashlytics.crashlytics
|
||||||
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
import io.github.wulkanowy.data.repositories.PreferencesRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
class AnalyticsHelper @Inject constructor(
|
class AnalyticsHelper @Inject constructor(
|
||||||
@ApplicationContext private val context: Context,
|
|
||||||
preferencesRepository: PreferencesRepository,
|
preferencesRepository: PreferencesRepository,
|
||||||
appInfo: AppInfo,
|
appInfo: AppInfo,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
private val analytics by lazy { FirebaseAnalytics.getInstance(context) }
|
private val analytics by lazy { Firebase.analytics }
|
||||||
|
|
||||||
private val crashlytics by lazy { FirebaseCrashlytics.getInstance() }
|
private val crashlytics by lazy { Firebase.crashlytics }
|
||||||
|
|
||||||
init {
|
init {
|
||||||
if (!appInfo.isDebug) {
|
if (!appInfo.isDebug) {
|
||||||
|
@ -1,5 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
|
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
<SwitchPreferenceCompat
|
||||||
|
app:defaultValue="@string/pref_key_ads_enabled"
|
||||||
|
app:iconSpaceReserved="false"
|
||||||
|
app:key="@string/pref_key_ads_enabled"
|
||||||
|
app:singleLineTitle="false"
|
||||||
|
app:title="@string/pref_ads_show_in_app" />
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
app:title="@string/pref_ads_agreements">
|
app:title="@string/pref_ads_agreements">
|
||||||
@ -8,25 +14,17 @@
|
|||||||
app:key="@string/pref_key_ads_privacy_policy"
|
app:key="@string/pref_key_ads_privacy_policy"
|
||||||
app:singleLineTitle="false"
|
app:singleLineTitle="false"
|
||||||
app:title="@string/pref_ads_privacy_policy" />
|
app:title="@string/pref_ads_privacy_policy" />
|
||||||
<CheckBoxPreference
|
<Preference
|
||||||
app:defaultValue="@bool/pref_default_ads_consent_data_processing"
|
app:dependency="@string/pref_key_ads_enabled"
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
app:key="@string/pref_key_ads_consent_data_processing"
|
app:key="@string/pref_key_ads_ump_agreements"
|
||||||
app:singleLineTitle="false"
|
app:singleLineTitle="false"
|
||||||
app:title="@string/pref_ads_consent" />
|
app:title="@string/pref_ads_consent" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
app:title="@string/pref_ads_support_category_name">
|
app:title="@string/pref_ads_support_category_name">
|
||||||
<SwitchPreferenceCompat
|
|
||||||
app:defaultValue="@string/pref_key_ads_enabled"
|
|
||||||
app:dependency="@string/pref_key_ads_consent_data_processing"
|
|
||||||
app:iconSpaceReserved="false"
|
|
||||||
app:key="@string/pref_key_ads_enabled"
|
|
||||||
app:singleLineTitle="false"
|
|
||||||
app:title="@string/pref_ads_show_in_app" />
|
|
||||||
<Preference
|
<Preference
|
||||||
app:dependency="@string/pref_key_ads_consent_data_processing"
|
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
app:key="@string/pref_key_ads_single_support"
|
app:key="@string/pref_key_ads_single_support"
|
||||||
app:singleLineTitle="false"
|
app:singleLineTitle="false"
|
||||||
|
19
build.gradle
19
build.gradle
@ -1,8 +1,8 @@
|
|||||||
buildscript {
|
buildscript {
|
||||||
ext {
|
ext {
|
||||||
kotlin_version = '1.9.10'
|
kotlin_version = '1.9.22'
|
||||||
about_libraries = '10.9.1'
|
about_libraries = '10.10.0'
|
||||||
hilt_version = '2.48.1'
|
hilt_version = '2.50'
|
||||||
}
|
}
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
@ -13,14 +13,14 @@ 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.13"
|
classpath "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:$kotlin_version-1.0.16"
|
||||||
classpath 'com.android.tools.build:gradle:8.1.2'
|
classpath 'com.android.tools.build:gradle:8.2.0'
|
||||||
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.4.0'
|
classpath 'com.google.gms:google-services:4.4.0'
|
||||||
classpath 'com.huawei.agconnect:agcp:1.9.1.301'
|
classpath 'com.huawei.agconnect:agcp:1.9.1.303'
|
||||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.9'
|
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.2"
|
||||||
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.4.1.3373"
|
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"
|
||||||
@ -29,6 +29,7 @@ buildscript {
|
|||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
google()
|
google()
|
||||||
maven { url "https://jitpack.io" }
|
maven { url "https://jitpack.io" }
|
||||||
@ -36,7 +37,3 @@ allprojects {
|
|||||||
maven { url "https://developer.huawei.com/repo/" }
|
maven { url "https://developer.huawei.com/repo/" }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.register('clean', Delete) {
|
|
||||||
delete rootProject.buildDir
|
|
||||||
}
|
|
||||||
|
@ -6,8 +6,9 @@ kotlin.code.style=official
|
|||||||
android.useAndroidX=true
|
android.useAndroidX=true
|
||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
android.nonTransitiveRClass=false
|
android.nonTransitiveRClass=false
|
||||||
android.defaults.buildfeatures.buildconfig=true
|
|
||||||
#
|
#
|
||||||
# https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-Guides/agc-common-faq-0000001063210244#section17273113244910
|
# https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-Guides/agc-common-faq-0000001063210244#section17273113244910
|
||||||
apmsInstrumentationEnabled=false
|
apmsInstrumentationEnabled=false
|
||||||
|
|
||||||
|
# https://community.sonarsource.com/t/sonarscanner-for-gradle-you-can-now-decide-when-to-compile/102069/2
|
||||||
|
systemProp.sonar.gradle.skipCompile=true
|
||||||
|
Reference in New Issue
Block a user