mirror of
https://github.com/szkolny-eu/szkolny-android.git
synced 2025-06-14 06:30:18 +02:00
Compare commits
19 Commits
v4.0-beta.
...
v4.0-beta.
Author | SHA1 | Date | |
---|---|---|---|
4763033f24 | |||
3b0570d21c | |||
16bf478d1a | |||
5bf181b6d1 | |||
21b2e5d194 | |||
759afcf3ca | |||
d48c7844a4 | |||
7d8caa8df7 | |||
62f53930da | |||
9a45cbb679 | |||
8e5a10f6d8 | |||
10c57d2272 | |||
67d4d0f898 | |||
97e0d04842 | |||
3ba30ede92 | |||
1035e411ab | |||
d5ae4b7ec9 | |||
111d040cf9 | |||
8cc594d170 |
@ -188,6 +188,8 @@ dependencies {
|
||||
implementation "com.squareup.retrofit2:converter-gson:${versions.retrofit}"
|
||||
|
||||
implementation 'com.github.jetradarmobile:android-snowfall:1.2.0'
|
||||
|
||||
implementation "io.coil-kt:coil:0.9.2"
|
||||
}
|
||||
repositories {
|
||||
mavenCentral()
|
||||
|
@ -1,4 +1,4 @@
|
||||
<h3>Wersja 4.0-beta.4, 2020-01-19</h3>
|
||||
<h3>Wersja 4.0-beta.6, 2020-01-28</h3>
|
||||
<ul>
|
||||
<li><b>Przebudowaliśmy cały moduł synchronizacji</b>, co oznacza większą stabilność aplikacji, szybkosć oraz poprawność pobieranych danych.</li>
|
||||
<li><b><u>Wysyłanie wiadomości</u></b> - funkcja, na którą czekał każdy. Od teraz w Szkolnym można wysyłać oraz odpowiadać na wiadomości do nauczycieli 👏</li>
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
/*secret password - removed for source code publication*/
|
||||
static toys AES_IV[16] = {
|
||||
0x90, 0xad, 0xe8, 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||
0x4a, 0x83, 0xba, 0x71, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
unsigned char *agony(unsigned int laugh, unsigned char *box, unsigned char *heat);
|
||||
|
||||
|
@ -25,6 +25,7 @@ import android.util.Base64.encodeToString
|
||||
import android.view.View
|
||||
import android.widget.CheckBox
|
||||
import android.widget.CompoundButton
|
||||
import android.widget.RadioButton
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.*
|
||||
import androidx.core.app.ActivityCompat
|
||||
@ -1032,3 +1033,6 @@ fun CharSequence.containsAll(list: List<CharSequence>, ignoreCase: Boolean = fal
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
fun RadioButton.setOnSelectedListener(listener: (buttonView: CompoundButton) -> Unit)
|
||||
= setOnCheckedChangeListener { buttonView, isChecked -> if (isChecked) listener(buttonView) }
|
||||
|
@ -696,6 +696,9 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||
}
|
||||
d(TAG, "}")
|
||||
|
||||
var intentProfileId = -1
|
||||
var intentTargetId = -1
|
||||
|
||||
if (extras?.containsKey("action") == true) {
|
||||
val handled = when (extras.getString("action")) {
|
||||
"serverMessage" -> {
|
||||
@ -706,6 +709,10 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||
)
|
||||
true
|
||||
}
|
||||
"feedbackMessage" -> {
|
||||
intentTargetId = TARGET_FEEDBACK
|
||||
false
|
||||
}
|
||||
else -> false
|
||||
}
|
||||
if (handled)
|
||||
@ -721,17 +728,14 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
|
||||
}
|
||||
}
|
||||
|
||||
var intentProfileId = -1
|
||||
var intentTargetId = -1
|
||||
|
||||
if (extras?.containsKey("profileId") == true) {
|
||||
if (extras?.getInt("profileId", -1) != -1) {
|
||||
intentProfileId = extras.getInt("profileId", -1)
|
||||
extras.remove("profileId")
|
||||
extras?.remove("profileId")
|
||||
}
|
||||
|
||||
if (extras?.containsKey("fragmentId") == true) {
|
||||
if (extras?.getInt("fragmentId", -1) != -1) {
|
||||
intentTargetId = extras.getInt("fragmentId", -1)
|
||||
extras.remove("fragmentId")
|
||||
extras?.remove("fragmentId")
|
||||
}
|
||||
|
||||
/*if (intentTargetId == -1 && navController.currentDestination?.id == R.id.loadingFragment) {
|
||||
|
@ -29,7 +29,7 @@ import kotlin.math.roundToInt
|
||||
class ApiService : Service() {
|
||||
companion object {
|
||||
const val TAG = "ApiService"
|
||||
const val NOTIFICATION_API_CHANNEL_ID = "pl.szczodrzynski.edziennik.GET_DATA"
|
||||
const val NOTIFICATION_API_CHANNEL_ID = "pl.szczodrzynski.edziennik.SYNC"
|
||||
fun start(context: Context) {
|
||||
context.startService(Intent(context, ApiService::class.java))
|
||||
}
|
||||
@ -60,7 +60,7 @@ class ApiService : Service() {
|
||||
private var taskProgress = -1f
|
||||
private var taskProgressText: String? = null
|
||||
|
||||
private val notification by lazy { EdziennikNotification(this) }
|
||||
private val notification by lazy { EdziennikNotification(app) }
|
||||
|
||||
private var lastEventTime = System.currentTimeMillis()
|
||||
private var taskCancelTries = 0
|
||||
@ -301,7 +301,7 @@ class ApiService : Service() {
|
||||
|
||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||
d(TAG, "Foreground service onStartCommand")
|
||||
startForeground(EdziennikNotification.NOTIFICATION_ID, notification.notification)
|
||||
startForeground(app.notifications.syncId, notification.notification)
|
||||
return START_NOT_STICKY
|
||||
}
|
||||
|
||||
|
@ -11,19 +11,16 @@ import android.content.Context
|
||||
import android.content.Intent
|
||||
import androidx.core.app.NotificationCompat
|
||||
import androidx.core.app.NotificationCompat.PRIORITY_MIN
|
||||
import pl.szczodrzynski.edziennik.App
|
||||
import pl.szczodrzynski.edziennik.R
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
|
||||
class EdziennikNotification(val context: Context) {
|
||||
companion object {
|
||||
const val NOTIFICATION_ID = 20191001
|
||||
}
|
||||
|
||||
private val notificationManager by lazy { context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager }
|
||||
class EdziennikNotification(val app: App) {
|
||||
private val notificationManager by lazy { app.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager }
|
||||
|
||||
private val notificationBuilder: NotificationCompat.Builder by lazy {
|
||||
NotificationCompat.Builder(context, ApiService.NOTIFICATION_API_CHANNEL_ID)
|
||||
NotificationCompat.Builder(app, ApiService.NOTIFICATION_API_CHANNEL_ID)
|
||||
.setSmallIcon(R.drawable.ic_notification)
|
||||
.setPriority(PRIORITY_MIN)
|
||||
.setOngoing(true)
|
||||
@ -41,34 +38,34 @@ class EdziennikNotification(val context: Context) {
|
||||
val intent = Intent("pl.szczodrzynski.edziennik.SZKOLNY_MAIN")
|
||||
intent.putExtra("task", "TaskCancelRequest")
|
||||
intent.putExtra("taskId", taskId)
|
||||
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT) as PendingIntent
|
||||
return PendingIntent.getBroadcast(app, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT) as PendingIntent
|
||||
}
|
||||
private val closePendingIntent: PendingIntent
|
||||
get() {
|
||||
val intent = Intent("pl.szczodrzynski.edziennik.SZKOLNY_MAIN")
|
||||
intent.putExtra("task", "ServiceCloseRequest")
|
||||
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT) as PendingIntent
|
||||
return PendingIntent.getBroadcast(app, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT) as PendingIntent
|
||||
}
|
||||
|
||||
private fun errorCountText(): String? {
|
||||
var result = ""
|
||||
if (criticalErrorCount > 0) {
|
||||
result += context.resources.getQuantityString(R.plurals.critical_errors_format, criticalErrorCount, criticalErrorCount)
|
||||
result += app.resources.getQuantityString(R.plurals.critical_errors_format, criticalErrorCount, criticalErrorCount)
|
||||
}
|
||||
if (criticalErrorCount > 0 && errorCount > 0) {
|
||||
result += ", "
|
||||
}
|
||||
if (errorCount > 0) {
|
||||
result += context.resources.getQuantityString(R.plurals.normal_errors_format, errorCount, errorCount)
|
||||
result += app.resources.getQuantityString(R.plurals.normal_errors_format, errorCount, errorCount)
|
||||
}
|
||||
return if (result.isEmpty()) null else result
|
||||
}
|
||||
|
||||
fun setIdle(): EdziennikNotification {
|
||||
notificationBuilder.setContentTitle(context.getString(R.string.edziennik_notification_api_title))
|
||||
notificationBuilder.setContentTitle(app.getString(R.string.edziennik_notification_api_title))
|
||||
notificationBuilder.setProgress(0, 0, false)
|
||||
notificationBuilder.apply {
|
||||
val str = context.getString(R.string.edziennik_notification_api_text)
|
||||
val str = app.getString(R.string.edziennik_notification_api_text)
|
||||
setStyle(NotificationCompat.BigTextStyle().bigText(str))
|
||||
setContentText(str)
|
||||
}
|
||||
@ -82,7 +79,7 @@ class EdziennikNotification(val context: Context) {
|
||||
}
|
||||
fun setCriticalError(): EdziennikNotification {
|
||||
criticalErrorCount++
|
||||
notificationBuilder.setContentTitle(context.getString(R.string.edziennik_notification_api_error_title))
|
||||
notificationBuilder.setContentTitle(app.getString(R.string.edziennik_notification_api_error_title))
|
||||
notificationBuilder.setProgress(0, 0, false)
|
||||
notificationBuilder.apply {
|
||||
val str = errorCountText()
|
||||
@ -119,7 +116,7 @@ class EdziennikNotification(val context: Context) {
|
||||
notificationBuilder.addAction(
|
||||
NotificationCompat.Action(
|
||||
R.drawable.ic_notification,
|
||||
context.getString(R.string.edziennik_notification_api_close),
|
||||
app.getString(R.string.edziennik_notification_api_close),
|
||||
closePendingIntent
|
||||
))
|
||||
return this
|
||||
@ -129,7 +126,7 @@ class EdziennikNotification(val context: Context) {
|
||||
notificationBuilder.addAction(
|
||||
NotificationCompat.Action(
|
||||
R.drawable.ic_notification,
|
||||
context.getString(R.string.edziennik_notification_api_cancel),
|
||||
app.getString(R.string.edziennik_notification_api_cancel),
|
||||
cancelPendingIntent(taskId)
|
||||
))
|
||||
}
|
||||
@ -137,7 +134,7 @@ class EdziennikNotification(val context: Context) {
|
||||
fun post() {
|
||||
if (serviceClosed)
|
||||
return
|
||||
notificationManager.notify(NOTIFICATION_ID, notification)
|
||||
notificationManager.notify(app.notifications.syncId, notification)
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ val mobidziennikLoginMethods = listOf(
|
||||
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED },
|
||||
|
||||
LoginMethod(LOGIN_TYPE_MOBIDZIENNIK, LOGIN_METHOD_MOBIDZIENNIK_API2, MobidziennikLoginApi2::class.java)
|
||||
.withIsPossible { profile, _ -> profile?.hasStudentData("email") == true }
|
||||
.withIsPossible { profile, _ -> profile?.getStudentData("email", null) != null }
|
||||
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED }
|
||||
)
|
||||
|
||||
|
@ -56,7 +56,11 @@ object Regexes {
|
||||
}
|
||||
|
||||
val MOBIDZIENNIK_MESSAGE_RECIPIENTS_JSON by lazy {
|
||||
"""odbiorcy: (\[.+?\]),${'$'}""".toRegex(RegexOption.MULTILINE)
|
||||
"""odbiorcy: (\[.+?]),${'$'}""".toRegex(RegexOption.MULTILINE)
|
||||
}
|
||||
|
||||
val MOBIDZIENNIK_ACCOUNT_EMAIL by lazy {
|
||||
"""name="email" value="(.+?@.+?\..+?)"""".toRegex(DOT_MATCHES_ALL)
|
||||
}
|
||||
|
||||
|
||||
|
@ -9,10 +9,9 @@ import pl.szczodrzynski.edziennik.*
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.DataLibrus
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.ENDPOINT_LIBRUS_API_ATTENDANCES
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.data.LibrusApi
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Attendance
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||
import pl.szczodrzynski.edziennik.utils.Utils
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.SYNC_ALWAYS
|
||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||
|
||||
class LibrusApiAttendances(override val data: DataLibrus,
|
||||
@ -33,11 +32,12 @@ class LibrusApiAttendances(override val data: DataLibrus,
|
||||
val attendances = json.getJsonArray("Attendances")?.asJsonObjectList()
|
||||
|
||||
attendances?.forEach { attendance ->
|
||||
val id = Utils.strToInt((attendance.getString("Id") ?: return@forEach)
|
||||
val id = ((attendance.getString("Id") ?: return@forEach)
|
||||
.replace("[^\\d.]".toRegex(), "")).toLong()
|
||||
val lessonId = attendance.getJsonObject("Lesson")?.getLong("Id") ?: -1
|
||||
val lessonNo = attendance.getInt("LessonNo") ?: return@forEach
|
||||
val lessonDate = Date.fromY_m_d(attendance.getString("Date"))
|
||||
val teacherId = attendance.getJsonObject("AddedBy")?.getLong("Id")
|
||||
val semester = attendance.getInt("Semester") ?: return@forEach
|
||||
val type = attendance.getJsonObject("Type")?.getLong("Id") ?: return@forEach
|
||||
val typeObject = data.attendanceTypes.get(type)
|
||||
@ -52,7 +52,7 @@ class LibrusApiAttendances(override val data: DataLibrus,
|
||||
val attendanceObject = Attendance(
|
||||
profileId,
|
||||
id,
|
||||
lesson?.teacherId ?: -1,
|
||||
teacherId ?: lesson?.teacherId ?: -1,
|
||||
lesson?.subjectId ?: -1,
|
||||
semester,
|
||||
topic,
|
||||
|
@ -22,14 +22,14 @@ const val ENDPOINT_MOBIDZIENNIK_API2_MAIN = 3000
|
||||
val MobidziennikFeatures = listOf(
|
||||
// always synced
|
||||
Feature(LOGIN_TYPE_MOBIDZIENNIK, FEATURE_ALWAYS_NEEDED, listOf(
|
||||
ENDPOINT_MOBIDZIENNIK_API_MAIN to LOGIN_METHOD_MOBIDZIENNIK_WEB
|
||||
ENDPOINT_MOBIDZIENNIK_API_MAIN to LOGIN_METHOD_MOBIDZIENNIK_WEB,
|
||||
ENDPOINT_MOBIDZIENNIK_WEB_ACCOUNT_EMAIL to LOGIN_METHOD_MOBIDZIENNIK_WEB
|
||||
), listOf(LOGIN_METHOD_MOBIDZIENNIK_WEB)), // TODO divide features into separate view IDs (all with API_MAIN)
|
||||
|
||||
// push config
|
||||
Feature(LOGIN_TYPE_MOBIDZIENNIK, FEATURE_PUSH_CONFIG, listOf(
|
||||
ENDPOINT_MOBIDZIENNIK_WEB_ACCOUNT_EMAIL to LOGIN_METHOD_MOBIDZIENNIK_WEB,
|
||||
ENDPOINT_MOBIDZIENNIK_API2_MAIN to LOGIN_METHOD_MOBIDZIENNIK_API2
|
||||
), listOf(LOGIN_METHOD_MOBIDZIENNIK_WEB, LOGIN_METHOD_MOBIDZIENNIK_API2)).withShouldSync { data ->
|
||||
), listOf(LOGIN_METHOD_MOBIDZIENNIK_API2)).withShouldSync { data ->
|
||||
!data.app.config.sync.tokenMobidziennikList.contains(data.profileId)
|
||||
},
|
||||
|
||||
|
@ -8,10 +8,7 @@ import pl.szczodrzynski.edziennik.R
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.*
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.api.MobidziennikApi
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.api2.MobidziennikApi2Main
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web.MobidziennikWebCalendar
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web.MobidziennikWebGrades
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web.MobidziennikWebMessagesAll
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web.MobidziennikWebMessagesInbox
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web.*
|
||||
import pl.szczodrzynski.edziennik.utils.Utils
|
||||
|
||||
class MobidziennikData(val data: DataMobidziennik, val onSuccess: () -> Unit) {
|
||||
@ -64,6 +61,10 @@ class MobidziennikData(val data: DataMobidziennik, val onSuccess: () -> Unit) {
|
||||
ENDPOINT_MOBIDZIENNIK_WEB_GRADES -> {
|
||||
data.startProgress(R.string.edziennik_progress_endpoint_grades)
|
||||
MobidziennikWebGrades(data) { onSuccess() }
|
||||
}
|
||||
ENDPOINT_MOBIDZIENNIK_WEB_ACCOUNT_EMAIL -> {
|
||||
data.startProgress(R.string.edziennik_progress_endpoint_account_details)
|
||||
MobidziennikWebAccountEmail(data) { onSuccess() }
|
||||
}/*
|
||||
ENDPOINT_MOBIDZIENNIK_WEB_NOTICES -> {
|
||||
data.startProgress(R.string.edziennik_progress_endpoint_behaviour)
|
||||
|
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (c) Kuba Szczodrzyński 2020-1-21.
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.web
|
||||
|
||||
import pl.szczodrzynski.edziennik.DAY
|
||||
import pl.szczodrzynski.edziennik.data.api.Regexes
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.DataMobidziennik
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.ENDPOINT_MOBIDZIENNIK_WEB_ACCOUNT_EMAIL
|
||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.data.MobidziennikWeb
|
||||
import pl.szczodrzynski.edziennik.get
|
||||
|
||||
class MobidziennikWebAccountEmail(override val data: DataMobidziennik,
|
||||
val onSuccess: () -> Unit) : MobidziennikWeb(data) {
|
||||
companion object {
|
||||
private const val TAG = "MobidziennikWebAccountEmail"
|
||||
}
|
||||
|
||||
init {
|
||||
webGet(TAG, "/dziennik/edytujprofil") { text ->
|
||||
MobidziennikLuckyNumberExtractor(data, text)
|
||||
|
||||
val email = Regexes.MOBIDZIENNIK_ACCOUNT_EMAIL.find(text)?.let { it[1] }
|
||||
data.loginEmail = email
|
||||
|
||||
data.setSyncNext(ENDPOINT_MOBIDZIENNIK_WEB_ACCOUNT_EMAIL, if (email == null) 3*DAY else 7*DAY)
|
||||
onSuccess()
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
/*
|
||||
* Copyright (c) Kuba Szczodrzyński 2020-1-21.
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.api.events
|
||||
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.FeedbackMessage
|
||||
|
||||
data class FeedbackMessageEvent(val message: FeedbackMessage)
|
@ -17,6 +17,7 @@ import pl.szczodrzynski.edziennik.data.api.szkolny.response.ApiResponse
|
||||
import pl.szczodrzynski.edziennik.data.api.szkolny.response.Update
|
||||
import pl.szczodrzynski.edziennik.data.api.szkolny.response.WebPushResponse
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Event
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.FeedbackMessage
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Notification
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
||||
import pl.szczodrzynski.edziennik.data.db.full.EventFull
|
||||
@ -55,32 +56,34 @@ class SzkolnyApi(val app: App) {
|
||||
api = retrofit.create()
|
||||
}
|
||||
|
||||
private fun getDevice() = run {
|
||||
val config = app.config
|
||||
val device = Device(
|
||||
osType = "Android",
|
||||
osVersion = Build.VERSION.RELEASE,
|
||||
hardware = "${Build.MANUFACTURER} ${Build.MODEL}",
|
||||
pushToken = app.config.sync.tokenApp,
|
||||
appVersion = BuildConfig.VERSION_NAME,
|
||||
appType = BuildConfig.BUILD_TYPE,
|
||||
appVersionCode = BuildConfig.VERSION_CODE,
|
||||
syncInterval = app.config.sync.interval
|
||||
)
|
||||
device.toString().md5().let {
|
||||
if (it == config.hash)
|
||||
null
|
||||
else {
|
||||
config.hash = it
|
||||
device
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getEvents(profiles: List<Profile>, notifications: List<Notification>, blacklistedIds: List<Long>): List<EventFull> {
|
||||
val teams = app.db.teamDao().allNow
|
||||
|
||||
val response = api.serverSync(ServerSyncRequest(
|
||||
deviceId = app.deviceId,
|
||||
device = run {
|
||||
val config = app.config
|
||||
val device = ServerSyncRequest.Device(
|
||||
osType = "Android",
|
||||
osVersion = Build.VERSION.RELEASE,
|
||||
hardware = "${Build.MANUFACTURER} ${Build.MODEL}",
|
||||
pushToken = app.config.sync.tokenApp,
|
||||
appVersion = BuildConfig.VERSION_NAME,
|
||||
appType = BuildConfig.BUILD_TYPE,
|
||||
appVersionCode = BuildConfig.VERSION_CODE,
|
||||
syncInterval = app.config.sync.interval
|
||||
)
|
||||
device.toString().md5().let {
|
||||
if (it == config.hash)
|
||||
null
|
||||
else {
|
||||
config.hash = it
|
||||
device
|
||||
}
|
||||
}
|
||||
},
|
||||
device = getDevice(),
|
||||
userCodes = profiles.map { it.userCode },
|
||||
users = profiles.mapNotNull { profile ->
|
||||
val config = app.config.getFor(profile.id)
|
||||
@ -131,6 +134,7 @@ class SzkolnyApi(val app: App) {
|
||||
|
||||
return api.shareEvent(EventShareRequest(
|
||||
deviceId = app.deviceId,
|
||||
device = getDevice(),
|
||||
sharedByName = event.sharedByName,
|
||||
shareTeamCode = team.code,
|
||||
event = event
|
||||
@ -142,6 +146,7 @@ class SzkolnyApi(val app: App) {
|
||||
|
||||
return api.shareEvent(EventShareRequest(
|
||||
deviceId = app.deviceId,
|
||||
device = getDevice(),
|
||||
sharedByName = event.sharedByName,
|
||||
unshareTeamCode = team.code,
|
||||
eventId = event.id
|
||||
@ -154,8 +159,9 @@ class SzkolnyApi(val app: App) {
|
||||
|
||||
fun pairBrowser(browserId: String?, pairToken: String?, onError: ((List<ApiResponse.Error>) -> Unit)? = null): List<WebPushResponse.Browser> {
|
||||
val response = api.webPush(WebPushRequest(
|
||||
action = "pairBrowser",
|
||||
deviceId = app.deviceId,
|
||||
device = getDevice(),
|
||||
action = "pairBrowser",
|
||||
browserId = browserId,
|
||||
pairToken = pairToken
|
||||
)).execute().body()
|
||||
@ -170,8 +176,9 @@ class SzkolnyApi(val app: App) {
|
||||
|
||||
fun listBrowsers(onError: ((List<ApiResponse.Error>) -> Unit)? = null): List<WebPushResponse.Browser> {
|
||||
val response = api.webPush(WebPushRequest(
|
||||
action = "listBrowsers",
|
||||
deviceId = app.deviceId
|
||||
deviceId = app.deviceId,
|
||||
device = getDevice(),
|
||||
action = "listBrowsers"
|
||||
)).execute().body()
|
||||
|
||||
return response?.data?.browsers ?: emptyList()
|
||||
@ -179,8 +186,9 @@ class SzkolnyApi(val app: App) {
|
||||
|
||||
fun unpairBrowser(browserId: String): List<WebPushResponse.Browser> {
|
||||
val response = api.webPush(WebPushRequest(
|
||||
action = "unpairBrowser",
|
||||
deviceId = app.deviceId,
|
||||
device = getDevice(),
|
||||
action = "unpairBrowser",
|
||||
browserId = browserId
|
||||
)).execute().body()
|
||||
|
||||
@ -190,6 +198,7 @@ class SzkolnyApi(val app: App) {
|
||||
fun errorReport(errors: List<ErrorReportRequest.Error>): ApiResponse<Nothing>? {
|
||||
return api.errorReport(ErrorReportRequest(
|
||||
deviceId = app.deviceId,
|
||||
device = getDevice(),
|
||||
appVersion = BuildConfig.VERSION_NAME,
|
||||
errors = errors
|
||||
)).execute().body()
|
||||
@ -198,6 +207,7 @@ class SzkolnyApi(val app: App) {
|
||||
fun unregisterAppUser(userCode: String): ApiResponse<Nothing>? {
|
||||
return api.appUser(AppUserRequest(
|
||||
deviceId = app.deviceId,
|
||||
device = getDevice(),
|
||||
userCode = userCode
|
||||
)).execute().body()
|
||||
}
|
||||
@ -205,4 +215,14 @@ class SzkolnyApi(val app: App) {
|
||||
fun getUpdate(channel: String): ApiResponse<List<Update>>? {
|
||||
return api.updates(channel).execute().body()
|
||||
}
|
||||
|
||||
fun sendFeedbackMessage(senderName: String?, targetDeviceId: String?, text: String): FeedbackMessage? {
|
||||
return api.feedbackMessage(FeedbackMessageRequest(
|
||||
deviceId = app.deviceId,
|
||||
device = getDevice(),
|
||||
senderName = senderName,
|
||||
targetDeviceId = targetDeviceId,
|
||||
text = text
|
||||
)).execute().body()?.data?.message
|
||||
}
|
||||
}
|
||||
|
@ -5,10 +5,7 @@
|
||||
package pl.szczodrzynski.edziennik.data.api.szkolny
|
||||
|
||||
import pl.szczodrzynski.edziennik.data.api.szkolny.request.*
|
||||
import pl.szczodrzynski.edziennik.data.api.szkolny.response.ApiResponse
|
||||
import pl.szczodrzynski.edziennik.data.api.szkolny.response.ServerSyncResponse
|
||||
import pl.szczodrzynski.edziennik.data.api.szkolny.response.Update
|
||||
import pl.szczodrzynski.edziennik.data.api.szkolny.response.WebPushResponse
|
||||
import pl.szczodrzynski.edziennik.data.api.szkolny.response.*
|
||||
import retrofit2.Call
|
||||
import retrofit2.http.Body
|
||||
import retrofit2.http.GET
|
||||
@ -34,4 +31,7 @@ interface SzkolnyService {
|
||||
|
||||
@GET("updates/app")
|
||||
fun updates(@Query("channel") channel: String = "release"): Call<ApiResponse<List<Update>>>
|
||||
|
||||
@POST("feedbackMessage")
|
||||
fun feedbackMessage(@Body request: FeedbackMessageRequest): Call<ApiResponse<FeedbackMessageResponse>>
|
||||
}
|
||||
|
@ -46,6 +46,6 @@ object Signing {
|
||||
|
||||
/*fun provideKey(param1: String, param2: Long): ByteArray {*/
|
||||
fun pleaseStopRightNow(param1: String, param2: Long): ByteArray {
|
||||
return "$param1.MTIzNDU2Nzg5MDzsOS3K08===.$param2".sha256()
|
||||
return "$param1.MTIzNDU2Nzg5MDHOhFUjfn===.$param2".sha256()
|
||||
}
|
||||
}
|
||||
|
@ -5,8 +5,9 @@
|
||||
package pl.szczodrzynski.edziennik.data.api.szkolny.request
|
||||
|
||||
data class AppUserRequest(
|
||||
val action: String = "unregister",
|
||||
|
||||
val deviceId: String,
|
||||
val device: Device? = null,
|
||||
|
||||
val action: String = "unregister",
|
||||
val userCode: String
|
||||
)
|
||||
|
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright (c) Kuba Szczodrzyński 2020-1-20.
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.api.szkolny.request
|
||||
|
||||
data class Device(
|
||||
val osType: String,
|
||||
val osVersion: String,
|
||||
val hardware: String,
|
||||
val pushToken: String?,
|
||||
val appVersion: String,
|
||||
val appType: String,
|
||||
val appVersionCode: Int,
|
||||
val syncInterval: Int
|
||||
)
|
@ -6,6 +6,8 @@ package pl.szczodrzynski.edziennik.data.api.szkolny.request
|
||||
|
||||
data class ErrorReportRequest(
|
||||
val deviceId: String,
|
||||
val device: Device? = null,
|
||||
|
||||
val appVersion: String,
|
||||
val errors: List<Error>
|
||||
) {
|
||||
@ -21,4 +23,4 @@ data class ErrorReportRequest(
|
||||
val apiResponse: String?,
|
||||
val isCritical: Boolean
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -7,9 +7,10 @@ package pl.szczodrzynski.edziennik.data.api.szkolny.request
|
||||
import pl.szczodrzynski.edziennik.data.db.full.EventFull
|
||||
|
||||
data class EventShareRequest (
|
||||
val deviceId: String,
|
||||
val device: Device? = null,
|
||||
|
||||
val action: String = "event",
|
||||
val deviceId: String,
|
||||
|
||||
val sharedByName: String,
|
||||
val shareTeamCode: String? = null,
|
||||
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kuba Szczodrzyński 2020-1-21.
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.api.szkolny.request
|
||||
|
||||
data class FeedbackMessageRequest(
|
||||
val deviceId: String,
|
||||
val device: Device? = null,
|
||||
|
||||
val senderName: String?,
|
||||
val targetDeviceId: String?,
|
||||
val text: String
|
||||
)
|
@ -5,7 +5,6 @@
|
||||
package pl.szczodrzynski.edziennik.data.api.szkolny.request
|
||||
|
||||
data class ServerSyncRequest(
|
||||
|
||||
val deviceId: String,
|
||||
val device: Device? = null,
|
||||
|
||||
@ -14,17 +13,6 @@ data class ServerSyncRequest(
|
||||
|
||||
val notifications: List<Notification>? = null
|
||||
) {
|
||||
data class Device(
|
||||
val osType: String,
|
||||
val osVersion: String,
|
||||
val hardware: String,
|
||||
val pushToken: String?,
|
||||
val appVersion: String,
|
||||
val appType: String,
|
||||
val appVersionCode: Int,
|
||||
val syncInterval: Int
|
||||
)
|
||||
|
||||
data class User(
|
||||
val userCode: String,
|
||||
val studentName: String,
|
||||
|
@ -5,10 +5,11 @@
|
||||
package pl.szczodrzynski.edziennik.data.api.szkolny.request
|
||||
|
||||
data class WebPushRequest(
|
||||
val deviceId: String,
|
||||
val device: Device? = null,
|
||||
|
||||
val action: String,
|
||||
val deviceId: String,
|
||||
|
||||
val browserId: String? = null,
|
||||
val pairToken: String? = null
|
||||
)
|
||||
)
|
||||
|
@ -0,0 +1,9 @@
|
||||
/*
|
||||
* Copyright (c) Kuba Szczodrzyński 2020-1-21.
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.api.szkolny.response
|
||||
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.FeedbackMessage
|
||||
|
||||
data class FeedbackMessageResponse(val message: FeedbackMessage)
|
@ -5,15 +5,12 @@ import androidx.room.Database
|
||||
import androidx.room.Room
|
||||
import androidx.room.RoomDatabase
|
||||
import androidx.room.TypeConverters
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
import pl.szczodrzynski.edziennik.config.db.ConfigDao
|
||||
import pl.szczodrzynski.edziennik.config.db.ConfigEntry
|
||||
import pl.szczodrzynski.edziennik.crc32
|
||||
import pl.szczodrzynski.edziennik.data.db.converter.*
|
||||
import pl.szczodrzynski.edziennik.data.db.dao.*
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.*
|
||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||
import pl.szczodrzynski.edziennik.data.db.migration.*
|
||||
|
||||
@Database(entities = [
|
||||
Grade::class,
|
||||
@ -45,7 +42,7 @@ import pl.szczodrzynski.edziennik.utils.models.Date
|
||||
ConfigEntry::class,
|
||||
LibrusLesson::class,
|
||||
Metadata::class
|
||||
], version = 75)
|
||||
], version = 76)
|
||||
@TypeConverters(
|
||||
ConverterTime::class,
|
||||
ConverterDate::class,
|
||||
@ -89,769 +86,6 @@ abstract class AppDb : RoomDatabase() {
|
||||
@Volatile private var instance: AppDb? = null
|
||||
private val LOCK = Any()
|
||||
|
||||
private val MIGRATION_11_12: Migration = object : Migration(11, 12) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("PRAGMA foreign_keys=off;")
|
||||
database.execSQL("ALTER TABLE teams RENAME TO _teams_old;")
|
||||
database.execSQL("CREATE TABLE teams (profileId INTEGER NOT NULL, teamId INTEGER NOT NULL, teamType INTEGER NOT NULL, teamName TEXT, teamTeacherId INTEGER NOT NULL, PRIMARY KEY(profileId, teamId));")
|
||||
database.execSQL("INSERT INTO teams (profileId, teamId, teamType, teamName, teamTeacherId) SELECT profileId, teamId, teamType, teamName, teacherId FROM _teams_old;")
|
||||
database.execSQL("DROP TABLE _teams_old;")
|
||||
database.execSQL("PRAGMA foreign_keys=on;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_12_13: Migration = object : Migration(12, 13) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE lessonChanges ADD lessonChangeWeekDay INTEGER NOT NULL DEFAULT -1;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_13_14: Migration = object : Migration(13, 14) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE loginStores (loginStoreId INTEGER NOT NULL, loginStoreType INTEGER NOT NULL, loginStoreData TEXT, PRIMARY KEY(loginStoreId));")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_14_15: Migration = object : Migration(14, 15) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades RENAME TO _grades_old;")
|
||||
database.execSQL("CREATE TABLE `grades` (\n" +
|
||||
"\t`profileId`\tINTEGER NOT NULL,\n" +
|
||||
"\t`gradeId`\tINTEGER NOT NULL,\n" +
|
||||
"\t`gradeDescription`\tTEXT,\n" +
|
||||
"\t`gradeName`\tTEXT,\n" +
|
||||
"\t`gradeValue`\tREAL NOT NULL,\n" +
|
||||
"\t`gradeWeight`\tREAL NOT NULL,\n" +
|
||||
"\t`gradeSemester`\tINTEGER NOT NULL,\n" +
|
||||
"\t`gradeType`\tINTEGER NOT NULL,\n" +
|
||||
"\t`teacherId`\tINTEGER NOT NULL,\n" +
|
||||
"\t`categoryId`\tINTEGER NOT NULL,\n" +
|
||||
"\t`subjectId`\tINTEGER NOT NULL,\n" +
|
||||
"\tPRIMARY KEY(`profileId`,`gradeId`)\n" +
|
||||
");")
|
||||
database.execSQL("INSERT INTO grades\n" +
|
||||
" SELECT *\n" +
|
||||
" FROM _grades_old;")
|
||||
database.execSQL("DROP TABLE _grades_old;")
|
||||
database.execSQL("CREATE INDEX index_grades_profileId ON grades (profileId);")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_15_16: Migration = object : Migration(15, 16) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE profiles (" +
|
||||
"profileId INTEGER NOT NULL, " +
|
||||
"name TEXT, " +
|
||||
"subname TEXT, " +
|
||||
"image TEXT, " +
|
||||
"syncEnabled INTEGER NOT NULL, " +
|
||||
"syncNotifications INTEGER NOT NULL, " +
|
||||
"enableSharedEvents INTEGER NOT NULL, " +
|
||||
"countInSeconds INTEGER NOT NULL, " +
|
||||
"loggedIn INTEGER NOT NULL, " +
|
||||
"empty INTEGER NOT NULL, " +
|
||||
"studentNameLong TEXT, " +
|
||||
"studentNameShort TEXT, " +
|
||||
"studentNumber INTEGER NOT NULL, " +
|
||||
"studentData TEXT, " +
|
||||
"registration INTEGER NOT NULL, " +
|
||||
"gradeColorMode INTEGER NOT NULL, " +
|
||||
"agendaViewType INTEGER NOT NULL, " +
|
||||
"currentSemester INTEGER NOT NULL, " +
|
||||
"attendancePercentage REAL NOT NULL, " +
|
||||
"dateSemester1Start TEXT, " +
|
||||
"dateSemester2Start TEXT, " +
|
||||
"dateYearEnd TEXT, " +
|
||||
"luckyNumberEnabled INTEGER NOT NULL, " +
|
||||
"luckyNumber INTEGER NOT NULL, " +
|
||||
"luckyNumberDate TEXT, " +
|
||||
"loginStoreId INTEGER NOT NULL, " +
|
||||
"PRIMARY KEY(profileId));")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_16_17: Migration = object : Migration(16, 17) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE profiles ADD archived INTEGER NOT NULL DEFAULT 0;")
|
||||
database.execSQL("ALTER TABLE teams ADD teamCode TEXT;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_17_18: Migration = object : Migration(17, 18) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE events ADD eventBlacklisted INTEGER NOT NULL DEFAULT 0;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_18_19: Migration = object : Migration(18, 19) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades ADD gradeClassAverage REAL NOT NULL DEFAULT -1;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_19_20: Migration = object : Migration(19, 20) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE luckyNumbers (" +
|
||||
"profileId INTEGER NOT NULL, " +
|
||||
"luckyNumberDate TEXT NOT NULL, " +
|
||||
"luckyNumber INTEGER NOT NULL, " +
|
||||
"PRIMARY KEY(profileId, luckyNumberDate));")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_20_21: Migration = object : Migration(20, 21) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades ADD gradeCategory TEXT")
|
||||
database.execSQL("ALTER TABLE grades ADD gradeColor INTEGER NOT NULL DEFAULT -1")
|
||||
database.execSQL("DROP TABLE gradeCategories")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_21_22: Migration = object : Migration(21, 22) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE eventTypes (" +
|
||||
"profileId INTEGER NOT NULL, " +
|
||||
"eventType INTEGER NOT NULL, " +
|
||||
"eventTypeName TEXT, " +
|
||||
"eventTypeColor INTEGER NOT NULL, " +
|
||||
"PRIMARY KEY(profileId, eventType));")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_22_23: Migration = object : Migration(22, 23) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades RENAME TO _grades_old;")
|
||||
database.execSQL("CREATE TABLE `grades` (\n" +
|
||||
"\t`profileId`\tINTEGER NOT NULL,\n" +
|
||||
"\t`gradeId`\tINTEGER NOT NULL,\n" +
|
||||
"\t`gradeCategory`\tTEXT,\n" +
|
||||
"\t`gradeColor`\tINTEGER NOT NULL DEFAULT -1,\n" +
|
||||
"\t`gradeDescription`\tTEXT,\n" +
|
||||
"\t`gradeName`\tTEXT,\n" +
|
||||
"\t`gradeValue`\tREAL NOT NULL,\n" +
|
||||
"\t`gradeWeight`\tREAL NOT NULL,\n" +
|
||||
"\t`gradeSemester`\tINTEGER NOT NULL,\n" +
|
||||
"\t`gradeClassAverage`\tREAL NOT NULL DEFAULT -1,\n" +
|
||||
"\t`gradeType`\tINTEGER NOT NULL,\n" +
|
||||
"\t`teacherId`\tINTEGER NOT NULL,\n" +
|
||||
"\t`subjectId`\tINTEGER NOT NULL,\n" +
|
||||
"\tPRIMARY KEY(`profileId`,`gradeId`)\n" +
|
||||
");")
|
||||
database.execSQL("DROP INDEX index_grades_profileId")
|
||||
database.execSQL("CREATE INDEX `index_grades_profileId` ON `grades` (\n" +
|
||||
"\t`profileId`\n" +
|
||||
");")
|
||||
database.execSQL("INSERT INTO grades (profileId, gradeId, gradeDescription, gradeName, gradeValue, gradeWeight, gradeSemester, gradeType, teacherId, subjectId, gradeClassAverage, gradeCategory, gradeColor) SELECT profileId, gradeId, gradeDescription, gradeName, gradeValue, gradeWeight, gradeSemester, gradeType, teacherId, subjectId, gradeClassAverage, gradeCategory, gradeColor FROM _grades_old;")
|
||||
database.execSQL("DROP TABLE _grades_old;")
|
||||
database.execSQL("ALTER TABLE attendances RENAME TO _attendances_old;")
|
||||
database.execSQL("CREATE TABLE `attendances` (\n" +
|
||||
"\t`profileId`\tINTEGER NOT NULL,\n" +
|
||||
"\t`attendanceId`\tINTEGER NOT NULL,\n" +
|
||||
"\t`attendanceLessonDate`\tTEXT NOT NULL,\n" +
|
||||
"\t`attendanceStartTime`\tTEXT NOT NULL,\n" +
|
||||
"\t`attendanceLessonTopic`\tTEXT,\n" +
|
||||
"\t`attendanceSemester`\tINTEGER NOT NULL,\n" +
|
||||
"\t`attendanceType`\tINTEGER NOT NULL,\n" +
|
||||
"\t`teacherId`\tINTEGER NOT NULL,\n" +
|
||||
"\t`subjectId`\tINTEGER NOT NULL,\n" +
|
||||
"\tPRIMARY KEY(`profileId`,`attendanceId`,`attendanceLessonDate`,`attendanceStartTime`)\n" +
|
||||
");")
|
||||
database.execSQL("DROP INDEX index_attendances_profileId")
|
||||
database.execSQL("CREATE INDEX `index_attendances_profileId` ON `attendances` (\n" +
|
||||
"\t`profileId`\n" +
|
||||
");")
|
||||
database.execSQL("INSERT INTO attendances SELECT * FROM _attendances_old;")
|
||||
database.execSQL("DROP TABLE _attendances_old;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_23_24: Migration = object : Migration(23, 24) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE profiles ADD yearAverageMode INTEGER NOT NULL DEFAULT 0")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_24_25: Migration = object : Migration(24, 25) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE announcements (" +
|
||||
"profileId INTEGER NOT NULL, " +
|
||||
"announcementId INTEGER NOT NULL, " +
|
||||
"announcementSubject TEXT, " +
|
||||
"announcementText TEXT, " +
|
||||
"announcementStartDate TEXT, " +
|
||||
"announcementEndDate TEXT, " +
|
||||
"teacherId INTEGER NOT NULL, " +
|
||||
"PRIMARY KEY(profileId, announcementId));")
|
||||
//database.execSQL("DROP INDEX index_announcements_profileId");
|
||||
database.execSQL("CREATE INDEX index_announcements_profileId ON announcements (" +
|
||||
"profileId" +
|
||||
");")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_25_26: Migration = object : Migration(25, 26) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades ADD gradePointGrade INTEGER NOT NULL DEFAULT 0;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_26_27: Migration = object : Migration(26, 27) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades ADD gradeValueMax REAL NOT NULL DEFAULT 0;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_27_28: Migration = object : Migration(27, 28) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE gradeCategories (profileId INTEGER NOT NULL, categoryId INTEGER NOT NULL, weight REAL NOT NULL, color INTEGER NOT NULL, `text` TEXT, columns TEXT, valueFrom REAL NOT NULL, valueTo REAL NOT NULL, PRIMARY KEY(profileId, categoryId));")
|
||||
database.execSQL("ALTER TABLE grades ADD gradeComment TEXT;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_28_29: Migration = object : Migration(28, 29) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE feedbackMessages (messageId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, received INTEGER NOT NULL DEFAULT 0, sentTime INTEGER NOT NULL, `text` TEXT)")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_29_30: Migration = object : Migration(29, 30) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE feedbackMessages ADD fromUser TEXT DEFAULT NULL")
|
||||
database.execSQL("ALTER TABLE feedbackMessages ADD fromUserName TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_30_31: Migration = object : Migration(30, 31) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE messages (" +
|
||||
"profileId INTEGER NOT NULL, " +
|
||||
"messageId INTEGER NOT NULL, " +
|
||||
"messageSubject TEXT, " +
|
||||
"messageBody TEXT DEFAULT NULL, " +
|
||||
"messageType INTEGER NOT NULL DEFAULT 0, " +
|
||||
"senderId INTEGER NOT NULL DEFAULT -1, " +
|
||||
"senderReplyId INTEGER NOT NULL DEFAULT -1, " +
|
||||
"recipientIds TEXT DEFAULT NULL, " +
|
||||
"recipientReplyIds TEXT DEFAULT NULL, " +
|
||||
"readByRecipientDates TEXT DEFAULT NULL, " +
|
||||
"overrideHasAttachments INTEGER NOT NULL DEFAULT 0, " +
|
||||
"attachmentIds TEXT DEFAULT NULL, " +
|
||||
"attachmentNames TEXT DEFAULT NULL, " +
|
||||
"PRIMARY KEY(profileId, messageId));")
|
||||
//database.execSQL("DROP INDEX index_announcements_profileId");
|
||||
database.execSQL("CREATE INDEX index_messages_profileId ON messages (" +
|
||||
"profileId" +
|
||||
");")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_31_32: Migration = object : Migration(31, 32) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE messages ADD attachmentSizes TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_32_33: Migration = object : Migration(32, 33) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DROP TABLE messages")
|
||||
database.execSQL("CREATE TABLE messages (" +
|
||||
"profileId INTEGER NOT NULL, " +
|
||||
"messageId INTEGER NOT NULL, " +
|
||||
"messageSubject TEXT, " +
|
||||
"messageBody TEXT DEFAULT NULL, " +
|
||||
"messageType INTEGER NOT NULL DEFAULT 0, " +
|
||||
"senderId INTEGER NOT NULL DEFAULT -1, " +
|
||||
"senderReplyId INTEGER NOT NULL DEFAULT -1, " +
|
||||
"overrideHasAttachments INTEGER NOT NULL DEFAULT 0, " +
|
||||
"attachmentIds TEXT DEFAULT NULL, " +
|
||||
"attachmentNames TEXT DEFAULT NULL, " +
|
||||
"attachmentSizes TEXT DEFAULT NULL, " +
|
||||
"PRIMARY KEY(profileId, messageId));")
|
||||
//database.execSQL("DROP INDEX index_announcements_profileId");
|
||||
database.execSQL("CREATE INDEX index_messages_profileId ON messages (" +
|
||||
"profileId" +
|
||||
");")
|
||||
database.execSQL("CREATE TABLE messageRecipients (" +
|
||||
"profileId INTEGER NOT NULL, " +
|
||||
"messageRecipientId INTEGER NOT NULL DEFAULT -1, " +
|
||||
"messageRecipientReplyId INTEGER NOT NULL DEFAULT -1, " +
|
||||
"messageRecipientReadDate INTEGER NOT NULL DEFAULT -1, " +
|
||||
"messageId INTEGER NOT NULL, " +
|
||||
"PRIMARY KEY(profileId, messageRecipientId));")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_33_34: Migration = object : Migration(33, 34) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DROP TABLE messageRecipients")
|
||||
database.execSQL("CREATE TABLE messageRecipients (" +
|
||||
"profileId INTEGER NOT NULL, " +
|
||||
"messageRecipientId INTEGER NOT NULL DEFAULT -1, " +
|
||||
"messageRecipientReplyId INTEGER NOT NULL DEFAULT -1, " +
|
||||
"messageRecipientReadDate INTEGER NOT NULL DEFAULT -1, " +
|
||||
"messageId INTEGER NOT NULL, " +
|
||||
"PRIMARY KEY(profileId, messageRecipientId, messageId));")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_34_35: Migration = object : Migration(34, 35) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE teachers ADD teacherLoginId TEXT DEFAULT NULL;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_35_36: Migration = object : Migration(35, 36) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE profiles SET yearAverageMode = 4 WHERE yearAverageMode = 0")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_36_37: Migration = object : Migration(36, 37) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {}
|
||||
}
|
||||
private val MIGRATION_37_38: Migration = object : Migration(37, 38) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
val today = Date.getToday()
|
||||
val schoolYearStart = if (today.month < 9) today.year - 1 else today.year
|
||||
database.execSQL("UPDATE profiles SET dateSemester1Start = '$schoolYearStart-09-01' WHERE dateSemester1Start IS NULL;")
|
||||
database.execSQL("UPDATE profiles SET dateSemester2Start = '" + (schoolYearStart + 1) + "-02-01' WHERE dateSemester2Start IS NULL;")
|
||||
database.execSQL("UPDATE profiles SET dateYearEnd = '" + (schoolYearStart + 1) + "-06-30' WHERE dateYearEnd IS NULL;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_38_39: Migration = object : Migration(38, 39) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE debugLogs (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `text` TEXT);")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_39_40: Migration = object : Migration(39, 40) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE profiles ADD changedEndpoints TEXT DEFAULT NULL;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_40_41: Migration = object : Migration(40, 41) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE profiles SET empty = 1;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_41_42: Migration = object : Migration(41, 42) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE profiles SET empty = 1;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_42_43: Migration = object : Migration(42, 43) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE profiles ADD lastFullSync INTEGER NOT NULL DEFAULT 0;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_43_44: Migration = object : Migration(43, 44) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE profiles SET empty = 1;")
|
||||
database.execSQL("UPDATE profiles SET currentSemester = 1;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_44_45: Migration = object : Migration(44, 45) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE profiles SET empty = 1;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_45_46: Migration = object : Migration(45, 46) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE profiles SET lastFullSync = 0")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_46_47: Migration = object : Migration(46, 47) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE profiles SET lastFullSync = 0")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_47_48: Migration = object : Migration(47, 48) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE notices ADD points REAL NOT NULL DEFAULT 0")
|
||||
database.execSQL("ALTER TABLE notices ADD category TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_48_49: Migration = object : Migration(48, 49) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades ADD gradeParentId INTEGER NOT NULL DEFAULT -1")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_49_50: Migration = object : Migration(49, 50) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades ADD gradeIsImprovement INTEGER NOT NULL DEFAULT 0")
|
||||
database.execSQL("DELETE FROM attendances WHERE attendances.profileId IN (SELECT profiles.profileId FROM profiles JOIN loginStores USING(loginStoreId) WHERE loginStores.loginStoreType = 1)")
|
||||
database.execSQL("UPDATE profiles SET empty = 1 WHERE profileId IN (SELECT profiles.profileId FROM profiles JOIN loginStores USING(loginStoreId) WHERE loginStores.loginStoreType = 4)")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_50_51: Migration = object : Migration(50, 51) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE profiles ADD lastReceiversSync INTEGER NOT NULL DEFAULT 0")
|
||||
database.execSQL("ALTER TABLE teachers ADD teacherType INTEGER NOT NULL DEFAULT 0")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_51_52: Migration = object : Migration(51, 52) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE teachers ADD teacherTypeDescription TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_52_53: Migration = object : Migration(52, 53) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE IF NOT EXISTS teacherAbsence (" +
|
||||
"profileId INTEGER NOT NULL," +
|
||||
"teacherAbsenceId INTEGER NOT NULL," +
|
||||
"teacherId INTEGER NOT NULL," +
|
||||
"teacherAbsenceType INTEGER NOT NULL," +
|
||||
"teacherAbsenceDateFrom TEXT NOT NULL," +
|
||||
"teacherAbsenceDateTo TEXT NOT NULL," +
|
||||
"PRIMARY KEY(profileId, teacherAbsenceId)" +
|
||||
")")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_53_54: Migration = object : Migration(53, 54) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE teacherAbsence ADD teacherAbsenceTimeFrom TEXT DEFAULT NULL")
|
||||
database.execSQL("ALTER TABLE teacherAbsence ADD teacherAbsenceTimeTo TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_54_55: Migration = object : Migration(54, 55) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
// 2019-10-21 for merge compatibility between 3.1.1 and api-v2
|
||||
// moved to Migration 55->56
|
||||
}
|
||||
}
|
||||
private val MIGRATION_55_56: Migration = object : Migration(55, 56) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE IF NOT EXISTS endpointTimers (" +
|
||||
"profileId INTEGER NOT NULL," +
|
||||
"endpointId INTEGER NOT NULL," +
|
||||
"endpointLastSync INTEGER DEFAULT NULL," +
|
||||
"endpointNextSync INTEGER NOT NULL DEFAULT 1," +
|
||||
"endpointViewId INTEGER DEFAULT NULL," +
|
||||
"PRIMARY KEY(profileId, endpointId)" +
|
||||
")")
|
||||
database.execSQL("CREATE TABLE IF NOT EXISTS lessonRanges (" +
|
||||
"profileId INTEGER NOT NULL," +
|
||||
"lessonRangeNumber INTEGER NOT NULL," +
|
||||
"lessonRangeStart TEXT NOT NULL," +
|
||||
"lessonRangeEnd TEXT NOT NULL," +
|
||||
"PRIMARY KEY(profileId, lessonRangeNumber)" +
|
||||
")")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_56_57: Migration = object : Migration(56, 57) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE gradeCategories ADD type INTEGER NOT NULL DEFAULT 0")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_57_58: Migration = object : Migration(57, 58) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE metadata RENAME TO _metadata_old;")
|
||||
database.execSQL("DROP INDEX index_metadata_profileId_thingType_thingId;")
|
||||
database.execSQL("UPDATE _metadata_old SET thingType = " + Metadata.TYPE_HOMEWORK + " WHERE thingType = " + Metadata.TYPE_EVENT + " AND thingId IN (SELECT eventId FROM events WHERE eventType = -1);")
|
||||
database.execSQL("CREATE TABLE metadata (\n" +
|
||||
"profileId INTEGER NOT NULL,\n" +
|
||||
"metadataId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" +
|
||||
"thingType INTEGER NOT NULL,\n" +
|
||||
"thingId INTEGER NOT NULL,\n" +
|
||||
"seen INTEGER NOT NULL,\n" +
|
||||
"notified INTEGER NOT NULL,\n" +
|
||||
"addedDate INTEGER NOT NULL);")
|
||||
database.execSQL("INSERT INTO metadata SELECT * FROM (SELECT * FROM _metadata_old ORDER BY addedDate DESC) GROUP BY thingId;")
|
||||
database.execSQL("DROP TABLE _metadata_old;")
|
||||
database.execSQL("CREATE UNIQUE INDEX index_metadata_profileId_thingType_thingId ON metadata (profileId, thingType, thingId);")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_58_59: Migration = object : Migration(58, 59) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE metadata SET addedDate = addedDate*1000 WHERE addedDate < 10000000000;")
|
||||
database.execSQL("INSERT INTO metadata (profileId, thingType, thingId, seen, notified, addedDate)\n" +
|
||||
"SELECT profileId,\n" +
|
||||
"10 AS thingType,\n" +
|
||||
"luckyNumberDate*10000+substr(luckyNumberDate, 6)*100+substr(luckyNumberDate, 9) AS thingId,\n" +
|
||||
"1 AS seen,\n" +
|
||||
"1 AS notified,\n" +
|
||||
"CAST(strftime('%s', luckyNumberDate) AS INT)*1000 AS addedDate\n" +
|
||||
"FROM luckyNumbers;")
|
||||
database.execSQL("ALTER TABLE luckyNumbers RENAME TO _old_luckyNumbers;")
|
||||
database.execSQL("CREATE TABLE luckyNumbers (\n" +
|
||||
"profileId INTEGER NOT NULL,\n" +
|
||||
"luckyNumberDate INTEGER NOT NULL, \n" +
|
||||
"luckyNumber INTEGER NOT NULL, \n" +
|
||||
"PRIMARY KEY(profileId, luckyNumberDate))")
|
||||
database.execSQL("INSERT INTO luckyNumbers (profileId, luckyNumberDate, luckyNumber)\n" +
|
||||
"SELECT profileId,\n" +
|
||||
"luckyNumberDate*10000+substr(luckyNumberDate, 6)*100+substr(luckyNumberDate, 9) AS luckyNumberDate,\n" +
|
||||
"luckyNumber\n" +
|
||||
"FROM _old_luckyNumbers;")
|
||||
database.execSQL("DROP TABLE _old_luckyNumbers;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_59_60: Migration = object : Migration(59, 60) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE notifications (\n" +
|
||||
" id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n" +
|
||||
" title TEXT NOT NULL,\n" +
|
||||
" `text` TEXT NOT NULL,\n" +
|
||||
" `type` INTEGER NOT NULL,\n" +
|
||||
" profileId INTEGER DEFAULT NULL,\n" +
|
||||
" profileName TEXT DEFAULT NULL,\n" +
|
||||
" posted INTEGER NOT NULL DEFAULT 0,\n" +
|
||||
" viewId INTEGER DEFAULT NULL,\n" +
|
||||
" extras TEXT DEFAULT NULL,\n" +
|
||||
" addedDate INTEGER NOT NULL\n" +
|
||||
");")
|
||||
database.execSQL("ALTER TABLE profiles ADD COLUMN disabledNotifications TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_60_61: Migration = object : Migration(60, 61) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE IF NOT EXISTS teacherAbsenceTypes (" +
|
||||
"profileId INTEGER NOT NULL," +
|
||||
"teacherAbsenceTypeId INTEGER NOT NULL," +
|
||||
"teacherAbsenceTypeName TEXT NOT NULL," +
|
||||
"PRIMARY KEY(profileId, teacherAbsenceTypeId))")
|
||||
database.execSQL("ALTER TABLE teacherAbsence ADD COLUMN teacherAbsenceName TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_61_62: Migration = object : Migration(61, 62) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE IF NOT EXISTS classrooms (\n" +
|
||||
" profileId INTEGER NOT NULL,\n" +
|
||||
" id INTEGER NOT NULL,\n" +
|
||||
" name TEXT NOT NULL,\n" +
|
||||
" PRIMARY KEY(profileId, id)\n" +
|
||||
")")
|
||||
database.execSQL("CREATE TABLE IF NOT EXISTS noticeTypes (\n" +
|
||||
" profileId INTEGER NOT NULL,\n" +
|
||||
" id INTEGER NOT NULL,\n" +
|
||||
" name TEXT NOT NULL,\n" +
|
||||
" PRIMARY KEY(profileId, id)\n" +
|
||||
")")
|
||||
database.execSQL("CREATE TABLE IF NOT EXISTS attendanceTypes (\n" +
|
||||
" profileId INTEGER NOT NULL,\n" +
|
||||
" id INTEGER NOT NULL,\n" +
|
||||
" name TEXT NOT NULL,\n" +
|
||||
" type INTEGER NOT NULL,\n" +
|
||||
" color INTEGER NOT NULL,\n" +
|
||||
" PRIMARY KEY(profileId, id)\n" +
|
||||
")")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_62_63: Migration = object : Migration(62, 63) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE profiles ADD COLUMN accountNameLong TEXT DEFAULT NULL")
|
||||
database.execSQL("ALTER TABLE profiles ADD COLUMN studentClassName TEXT DEFAULT NULL")
|
||||
database.execSQL("ALTER TABLE profiles ADD COLUMN studentSchoolYear TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_63_64: Migration = object : Migration(63, 64) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
//database.execSQL("ALTER TABLE lessons RENAME TO lessonsOld;");
|
||||
database.execSQL("CREATE TABLE timetable (" +
|
||||
"profileId INTEGER NOT NULL," +
|
||||
"id INTEGER NOT NULL," +
|
||||
"type INTEGER NOT NULL," +
|
||||
"date TEXT DEFAULT NULL," +
|
||||
"lessonNumber INTEGER DEFAULT NULL," +
|
||||
"startTime TEXT DEFAULT NULL," +
|
||||
"endTime TEXT DEFAULT NULL," +
|
||||
"subjectId INTEGER DEFAULT NULL," +
|
||||
"teacherId INTEGER DEFAULT NULL," +
|
||||
"teamId INTEGER DEFAULT NULL," +
|
||||
"classroom TEXT DEFAULT NULL," +
|
||||
"oldDate TEXT DEFAULT NULL," +
|
||||
"oldLessonNumber INTEGER DEFAULT NULL," +
|
||||
"oldStartTime TEXT DEFAULT NULL," +
|
||||
"oldEndTime TEXT DEFAULT NULL," +
|
||||
"oldSubjectId INTEGER DEFAULT NULL," +
|
||||
"oldTeacherId INTEGER DEFAULT NULL," +
|
||||
"oldTeamId INTEGER DEFAULT NULL," +
|
||||
"oldClassroom TEXT DEFAULT NULL," +
|
||||
"PRIMARY KEY(id));")
|
||||
database.execSQL("CREATE INDEX index_lessons_profileId_type_date ON timetable (profileId, type, date);")
|
||||
database.execSQL("CREATE INDEX index_lessons_profileId_type_oldDate ON timetable (profileId, type, oldDate);")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_64_65: Migration = object : Migration(64, 65) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE config (" +
|
||||
"profileId INTEGER NOT NULL DEFAULT -1," +
|
||||
"`key` TEXT NOT NULL," +
|
||||
"value TEXT NOT NULL," +
|
||||
"PRIMARY KEY(profileId, `key`));")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_65_66: Migration = object : Migration(65, 66) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DROP TABLE config;")
|
||||
database.execSQL("CREATE TABLE config (" +
|
||||
"profileId INTEGER NOT NULL DEFAULT -1," +
|
||||
"`key` TEXT NOT NULL," +
|
||||
"value TEXT," +
|
||||
"PRIMARY KEY(profileId, `key`));")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_66_67: Migration = object : Migration(66, 67) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DELETE FROM grades WHERE (gradeId=-1 OR gradeId=-2) AND gradeType=20")
|
||||
database.execSQL("DELETE FROM metadata WHERE (thingId=-1 OR thingId=-2) AND thingType=1")
|
||||
database.execSQL("ALTER TABLE gradeCategories RENAME TO _gradeCategories")
|
||||
database.execSQL("CREATE TABLE gradeCategories (" +
|
||||
"profileId INTEGER NOT NULL," +
|
||||
"categoryId INTEGER NOT NULL," +
|
||||
"weight REAL NOT NULL," +
|
||||
"color INTEGER NOT NULL," +
|
||||
"`text` TEXT," +
|
||||
"columns TEXT," +
|
||||
"valueFrom REAL NOT NULL," +
|
||||
"valueTo REAL NOT NULL," +
|
||||
"type INTEGER NOT NULL," +
|
||||
"PRIMARY KEY(profileId, categoryId, type))")
|
||||
database.execSQL("INSERT INTO gradeCategories (profileId, categoryId, weight, color," +
|
||||
"`text`, columns, valueFrom, valueTo, type) " +
|
||||
"SELECT profileId, categoryId, weight, color, `text`, columns, valueFrom," +
|
||||
"valueTo, type FROM _gradeCategories")
|
||||
database.execSQL("DROP TABLE _gradeCategories")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_67_68: Migration = object : Migration(67, 68) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
/* Migration from crc16 to crc32 id */
|
||||
database.execSQL("DELETE FROM announcements")
|
||||
database.execSQL("DELETE FROM metadata WHERE thingType=7")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_68_69: Migration = object : Migration(68, 69) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE loginStores ADD COLUMN loginStoreMode INTEGER NOT NULL DEFAULT 0")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_69_70: Migration = object : Migration(69, 70) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE announcements ADD COLUMN announcementIdString TEXT DEFAULT NULL")
|
||||
database.execSQL("DELETE FROM announcements")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_70_71: Migration = object : Migration(70, 71) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DELETE FROM messages WHERE profileId IN (SELECT profileId FROM profiles WHERE archived = 0);")
|
||||
database.execSQL("DELETE FROM messageRecipients WHERE profileId IN (SELECT profileId FROM profiles WHERE archived = 0);")
|
||||
database.execSQL("DELETE FROM teachers WHERE profileId IN (SELECT profileId FROM profiles WHERE archived = 0);")
|
||||
database.execSQL("DELETE FROM endpointTimers WHERE profileId IN (SELECT profileId FROM profiles WHERE archived = 0);")
|
||||
database.execSQL("DELETE FROM metadata WHERE profileId IN (SELECT profileId FROM profiles WHERE archived = 0) AND thingType = 8;")
|
||||
database.execSQL("UPDATE profiles SET empty = 1 WHERE archived = 0;")
|
||||
database.execSQL("UPDATE profiles SET lastReceiversSync = 0 WHERE archived = 0;")
|
||||
database.execSQL("INSERT INTO config (profileId, `key`, value) VALUES (-1, \"runSync\", \"true\");")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_71_72: Migration = object : Migration(71, 72) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE loginStores RENAME to _loginStores;")
|
||||
database.execSQL("CREATE TABLE loginStores(" +
|
||||
"loginStoreId INTEGER NOT NULL," +
|
||||
"loginStoreType INTEGER NOT NULL," +
|
||||
"loginStoreMode INTEGER NOT NULL," +
|
||||
"loginStoreData TEXT NOT NULL," +
|
||||
"PRIMARY KEY(loginStoreId));")
|
||||
database.execSQL("INSERT INTO loginStores " +
|
||||
"(loginStoreId, loginStoreType, loginStoreMode, loginStoreData) " +
|
||||
"SELECT loginStoreId, loginStoreType, loginStoreMode, loginStoreData " +
|
||||
"FROM _loginStores;")
|
||||
database.execSQL("DROP TABLE _loginStores;")
|
||||
database.execSQL("ALTER TABLE profiles RENAME TO _profiles_old;")
|
||||
database.execSQL("CREATE TABLE profiles (\n" +
|
||||
"profileId INTEGER NOT NULL, name TEXT NOT NULL, subname TEXT, image TEXT DEFAULT NULL, \n" +
|
||||
"studentNameLong TEXT NOT NULL, studentNameShort TEXT NOT NULL, accountName TEXT, \n" +
|
||||
"studentData TEXT NOT NULL, empty INTEGER NOT NULL DEFAULT 1, archived INTEGER NOT NULL DEFAULT 0, \n" +
|
||||
"syncEnabled INTEGER NOT NULL DEFAULT 1, enableSharedEvents INTEGER NOT NULL DEFAULT 1, registration INTEGER NOT NULL DEFAULT 0, \n" +
|
||||
"userCode TEXT NOT NULL DEFAULT \"\", studentNumber INTEGER NOT NULL DEFAULT -1, studentClassName TEXT DEFAULT NULL, \n" +
|
||||
"studentSchoolYearStart INTEGER NOT NULL, dateSemester1Start TEXT NOT NULL, dateSemester2Start TEXT NOT NULL, \n" +
|
||||
"dateYearEnd TEXT NOT NULL, disabledNotifications TEXT DEFAULT NULL, lastReceiversSync INTEGER NOT NULL DEFAULT 0, \n" +
|
||||
"loginStoreId INTEGER NOT NULL, loginStoreType INTEGER NOT NULL, PRIMARY KEY(profileId));")
|
||||
database.execSQL("INSERT INTO profiles (profileId, name, subname, image, studentNameLong, studentNameShort, accountName, \n" +
|
||||
"userCode, studentData, empty, archived, syncEnabled, enableSharedEvents, registration, studentNumber, studentSchoolYearStart, \n" +
|
||||
"dateSemester1Start, dateSemester2Start, dateYearEnd, lastReceiversSync, loginStoreId, loginStoreType \n" +
|
||||
") SELECT profileId, name, subname, image, studentNameLong, studentNameShort, accountNameLong, \"\" AS userCode, studentData, \n" +
|
||||
"empty, archived, syncEnabled, enableSharedEvents, registration, studentNumber, SUBSTR(dateSemester1Start, 0, 5) AS studentSchoolYearStart, \n" +
|
||||
"dateSemester1Start, dateSemester2Start, dateYearEnd, lastReceiversSync, _profiles_old.loginStoreId, loginStoreType FROM _profiles_old \n" +
|
||||
"JOIN loginStores ON loginStores.loginStoreId = _profiles_old.loginStoreId \n" +
|
||||
"WHERE profileId >= 0;")
|
||||
database.execSQL("DROP TABLE _profiles_old;")
|
||||
// MIGRACJA userCode - mobidziennik
|
||||
database.execSQL("DROP TABLE IF EXISTS _userCodes;")
|
||||
database.execSQL("CREATE TABLE _userCodes (profileId INTEGER, loginData TEXT, studentData TEXT, userCode TEXT, serverName TEXT, username TEXT, studentId TEXT);")
|
||||
database.execSQL("DELETE FROM _userCodes;")
|
||||
database.execSQL("INSERT INTO _userCodes SELECT profileId, loginStores.loginStoreData, studentData, \"\", \"\", \"\", \"\" FROM profiles JOIN loginStores ON loginStores.loginStoreId = profiles.loginStoreId WHERE profiles.loginStoreType = 1;")
|
||||
database.execSQL("UPDATE _userCodes SET serverName = SUBSTR(loginData, instr(loginData, '\"serverName\":\"')+14);")
|
||||
database.execSQL("UPDATE _userCodes SET serverName = SUBSTR(serverName, 0, instr(serverName, '\",')+instr(serverName, '\"}')-(instr(serverName, '\"}')*min(instr(serverName, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET username = SUBSTR(loginData, instr(loginData, '\"username\":\"')+12);")
|
||||
database.execSQL("UPDATE _userCodes SET username = SUBSTR(username, 0, instr(username, '\",')+instr(username, '\"}')-(instr(username, '\"}')*min(instr(username, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET studentId = SUBSTR(studentData, instr(studentData, '\"studentId\":')+12);")
|
||||
database.execSQL("UPDATE _userCodes SET studentId = SUBSTR(studentId, 0, instr(studentId, ',')+instr(studentId, '}')-(instr(studentId, '}')*min(instr(studentId, ','), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET userCode = serverName||\":\"||username||\":\"||studentId;")
|
||||
database.execSQL("UPDATE profiles SET userCode = (SELECT userCode FROM _userCodes WHERE profileId = profiles.profileId) WHERE profileId IN (SELECT profileId FROM _userCodes);")
|
||||
// MIGRACJA userCode - librus
|
||||
database.execSQL("DROP TABLE IF EXISTS _userCodes;")
|
||||
database.execSQL("CREATE TABLE _userCodes (profileId INTEGER, loginData TEXT, studentData TEXT, userCode TEXT, schoolName TEXT, accountLogin TEXT);")
|
||||
database.execSQL("DELETE FROM _userCodes;")
|
||||
database.execSQL("INSERT INTO _userCodes SELECT profileId, loginStores.loginStoreData, studentData, \"\", \"\", \"\" FROM profiles JOIN loginStores ON loginStores.loginStoreId = profiles.loginStoreId WHERE profiles.loginStoreType = 2;")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(studentData, instr(studentData, '\"schoolName\":\"')+14);")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(schoolName, 0, instr(schoolName, '\",')+instr(schoolName, '\"}')-(instr(schoolName, '\"}')*min(instr(schoolName, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET accountLogin = SUBSTR(studentData, instr(studentData, '\"accountLogin\":\"')+16);")
|
||||
database.execSQL("UPDATE _userCodes SET accountLogin = SUBSTR(accountLogin, 0, instr(accountLogin, '\",')+instr(accountLogin, '\"}')-(instr(accountLogin, '\"}')*min(instr(accountLogin, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET userCode = schoolName||\":\"||accountLogin;")
|
||||
database.execSQL("UPDATE profiles SET userCode = (SELECT userCode FROM _userCodes WHERE profileId = profiles.profileId) WHERE profileId IN (SELECT profileId FROM _userCodes);")
|
||||
// MIGRACJA userCode - iuczniowie
|
||||
database.execSQL("DROP TABLE IF EXISTS _userCodes;")
|
||||
database.execSQL("CREATE TABLE _userCodes (profileId INTEGER, loginData TEXT, studentData TEXT, userCode TEXT, schoolName TEXT, username TEXT, registerId TEXT);")
|
||||
database.execSQL("DELETE FROM _userCodes;")
|
||||
database.execSQL("INSERT INTO _userCodes SELECT profileId, loginStores.loginStoreData, studentData, \"\", \"\", \"\", \"\" FROM profiles JOIN loginStores ON loginStores.loginStoreId = profiles.loginStoreId WHERE profiles.loginStoreType = 3;")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(loginData, instr(loginData, '\"schoolName\":\"')+14);")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(schoolName, 0, instr(schoolName, '\",')+instr(schoolName, '\"}')-(instr(schoolName, '\"}')*min(instr(schoolName, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET username = SUBSTR(loginData, instr(loginData, '\"username\":\"')+12);")
|
||||
database.execSQL("UPDATE _userCodes SET username = SUBSTR(username, 0, instr(username, '\",')+instr(username, '\"}')-(instr(username, '\"}')*min(instr(username, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET registerId = SUBSTR(studentData, instr(studentData, '\"registerId\":')+13);")
|
||||
database.execSQL("UPDATE _userCodes SET registerId = SUBSTR(registerId, 0, instr(registerId, ',')+instr(registerId, '}')-(instr(registerId, '}')*min(instr(registerId, ','), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET userCode = schoolName||\":\"||username||\":\"||registerId;")
|
||||
database.execSQL("UPDATE profiles SET userCode = (SELECT userCode FROM _userCodes WHERE profileId = profiles.profileId) WHERE profileId IN (SELECT profileId FROM _userCodes);")
|
||||
// MIGRACJA userCode - vulcan
|
||||
database.execSQL("DROP TABLE IF EXISTS _userCodes;")
|
||||
database.execSQL("CREATE TABLE _userCodes (profileId INTEGER, loginData TEXT, studentData TEXT, userCode TEXT, schoolName TEXT, studentId TEXT);")
|
||||
database.execSQL("DELETE FROM _userCodes;")
|
||||
database.execSQL("INSERT INTO _userCodes SELECT profileId, loginStores.loginStoreData, studentData, \"\", \"\", \"\" FROM profiles JOIN loginStores ON loginStores.loginStoreId = profiles.loginStoreId WHERE profiles.loginStoreType = 4;")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(studentData, instr(studentData, '\"schoolName\":\"')+14);")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(schoolName, 0, instr(schoolName, '\",')+instr(schoolName, '\"}')-(instr(schoolName, '\"}')*min(instr(schoolName, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET studentId = SUBSTR(studentData, instr(studentData, '\"studentId\":')+12);")
|
||||
database.execSQL("UPDATE _userCodes SET studentId = SUBSTR(studentId, 0, instr(studentId, ',')+instr(studentId, '}')-(instr(studentId, '}')*min(instr(studentId, ','), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET userCode = schoolName||\":\"||studentId;")
|
||||
database.execSQL("UPDATE profiles SET userCode = (SELECT userCode FROM _userCodes WHERE profileId = profiles.profileId) WHERE profileId IN (SELECT profileId FROM _userCodes);")
|
||||
// MIGRACJA userCode - edudziennik
|
||||
database.execSQL("DROP TABLE IF EXISTS _userCodes;")
|
||||
database.execSQL("CREATE TABLE _userCodes (profileId INTEGER, loginData TEXT, studentData TEXT, userCode TEXT, schoolName TEXT, email TEXT, studentId TEXT);")
|
||||
database.execSQL("DELETE FROM _userCodes;")
|
||||
database.execSQL("INSERT INTO _userCodes SELECT profileId, loginStores.loginStoreData, studentData, \"\", \"\", \"\", \"\" FROM profiles JOIN loginStores ON loginStores.loginStoreId = profiles.loginStoreId WHERE profiles.loginStoreType = 5;")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(studentData, instr(studentData, '\"schoolName\":\"')+14);")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(schoolName, 0, instr(schoolName, '\",')+instr(schoolName, '\"}')-(instr(schoolName, '\"}')*min(instr(schoolName, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET email = SUBSTR(loginData, instr(loginData, '\"email\":\"')+9);")
|
||||
database.execSQL("UPDATE _userCodes SET email = SUBSTR(email, 0, instr(email, '\",')+instr(email, '\"}')-(instr(email, '\"}')*min(instr(email, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET studentId = SUBSTR(studentData, instr(studentData, '\"studentId\":\"')+13);")
|
||||
database.execSQL("UPDATE _userCodes SET studentId = SUBSTR(studentId, 0, instr(studentId, '\",')+instr(studentId, '\"}')-(instr(studentId, '\"}')*min(instr(studentId, '\",'), 1)));")
|
||||
database.query("SELECT profileId, studentId FROM _userCodes;").use { cursor ->
|
||||
while (cursor.moveToNext()) {
|
||||
val profileId = cursor.getInt(0)
|
||||
val crc = cursor.getString(1).crc32()
|
||||
database.execSQL("UPDATE _userCodes SET studentId = $crc WHERE profileId = $profileId")
|
||||
}
|
||||
}
|
||||
database.execSQL("UPDATE _userCodes SET userCode = schoolName||\":\"||email||\":\"||studentId;")
|
||||
database.execSQL("UPDATE profiles SET userCode = (SELECT userCode FROM _userCodes WHERE profileId = profiles.profileId) WHERE profileId IN (SELECT profileId FROM _userCodes);")
|
||||
database.execSQL("DROP TABLE _userCodes;")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_72_73: Migration = object : Migration(72, 73) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) { // Mark as seen all lucky number metadata.
|
||||
database.execSQL("UPDATE metadata SET seen=1 WHERE thingType=10")
|
||||
database.execSQL("DROP TABLE lessons")
|
||||
database.execSQL("DROP TABLE lessonChanges")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_73_74: Migration = object : Migration(73, 74) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE librusLessons (" +
|
||||
"profileId INTEGER NOT NULL," +
|
||||
"lessonId INTEGER NOT NULL," +
|
||||
"teacherId INTEGER NOT NULL," +
|
||||
"subjectId INTEGER NOT NULL," +
|
||||
"teamId INTEGER," +
|
||||
"PRIMARY KEY(profileId, lessonId));")
|
||||
database.execSQL("CREATE INDEX index_librusLessons_profileId ON librusLessons (profileId);")
|
||||
}
|
||||
}
|
||||
private val MIGRATION_74_75: Migration = object : Migration(74, 75) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE timetable RENAME TO _timetable;")
|
||||
database.execSQL("CREATE TABLE timetable (profileId INTEGER NOT NULL,id INTEGER NOT NULL,type INTEGER NOT NULL,date TEXT DEFAULT NULL,lessonNumber INTEGER DEFAULT NULL,startTime TEXT DEFAULT NULL,endTime TEXT DEFAULT NULL,subjectId INTEGER DEFAULT NULL,teacherId INTEGER DEFAULT NULL,teamId INTEGER DEFAULT NULL,classroom TEXT DEFAULT NULL,oldDate TEXT DEFAULT NULL,oldLessonNumber INTEGER DEFAULT NULL,oldStartTime TEXT DEFAULT NULL,oldEndTime TEXT DEFAULT NULL,oldSubjectId INTEGER DEFAULT NULL,oldTeacherId INTEGER DEFAULT NULL,oldTeamId INTEGER DEFAULT NULL,oldClassroom TEXT DEFAULT NULL,PRIMARY KEY(profileId, id));")
|
||||
database.execSQL("INSERT INTO timetable (profileId, id, type, date, lessonNumber, startTime, endTime, subjectId, teacherId, teamId, classroom, oldDate, oldLessonNumber, oldStartTime, oldEndTime, oldSubjectId, oldTeacherId, oldTeamId, oldClassroom) SELECT profileId, id, type, date, lessonNumber, startTime, endTime, subjectId, teacherId, teamId, classroom, oldDate, oldLessonNumber, oldStartTime, oldEndTime, oldSubjectId, oldTeacherId, oldTeamId, oldClassroom FROM _timetable;")
|
||||
database.execSQL("DROP TABLE _timetable;")
|
||||
database.execSQL("CREATE INDEX index_lessons_profileId_type_date ON timetable (profileId, type, date);")
|
||||
database.execSQL("CREATE INDEX index_lessons_profileId_type_oldDate ON timetable (profileId, type, oldDate);")
|
||||
}
|
||||
}
|
||||
|
||||
operator fun invoke(context: Context) = instance ?: synchronized(LOCK) {
|
||||
instance ?: buildDatabase(context).also { instance = it }
|
||||
}
|
||||
@ -861,70 +95,71 @@ abstract class AppDb : RoomDatabase() {
|
||||
AppDb::class.java,
|
||||
"edziennik.db"
|
||||
).addMigrations(
|
||||
MIGRATION_11_12,
|
||||
MIGRATION_12_13,
|
||||
MIGRATION_13_14,
|
||||
MIGRATION_14_15,
|
||||
MIGRATION_15_16,
|
||||
MIGRATION_16_17,
|
||||
MIGRATION_17_18,
|
||||
MIGRATION_18_19,
|
||||
MIGRATION_19_20,
|
||||
MIGRATION_20_21,
|
||||
MIGRATION_21_22,
|
||||
MIGRATION_22_23,
|
||||
MIGRATION_23_24,
|
||||
MIGRATION_24_25,
|
||||
MIGRATION_25_26,
|
||||
MIGRATION_26_27,
|
||||
MIGRATION_27_28,
|
||||
MIGRATION_28_29,
|
||||
MIGRATION_29_30,
|
||||
MIGRATION_30_31,
|
||||
MIGRATION_31_32,
|
||||
MIGRATION_32_33,
|
||||
MIGRATION_33_34,
|
||||
MIGRATION_34_35,
|
||||
MIGRATION_35_36,
|
||||
MIGRATION_36_37,
|
||||
MIGRATION_37_38,
|
||||
MIGRATION_38_39,
|
||||
MIGRATION_39_40,
|
||||
MIGRATION_40_41,
|
||||
MIGRATION_41_42,
|
||||
MIGRATION_42_43,
|
||||
MIGRATION_43_44,
|
||||
MIGRATION_44_45,
|
||||
MIGRATION_45_46,
|
||||
MIGRATION_46_47,
|
||||
MIGRATION_47_48,
|
||||
MIGRATION_48_49,
|
||||
MIGRATION_49_50,
|
||||
MIGRATION_50_51,
|
||||
MIGRATION_51_52,
|
||||
MIGRATION_52_53,
|
||||
MIGRATION_53_54,
|
||||
MIGRATION_54_55,
|
||||
MIGRATION_55_56,
|
||||
MIGRATION_56_57,
|
||||
MIGRATION_57_58,
|
||||
MIGRATION_58_59,
|
||||
MIGRATION_59_60,
|
||||
MIGRATION_60_61,
|
||||
MIGRATION_61_62,
|
||||
MIGRATION_62_63,
|
||||
MIGRATION_63_64,
|
||||
MIGRATION_64_65,
|
||||
MIGRATION_65_66,
|
||||
MIGRATION_66_67,
|
||||
MIGRATION_67_68,
|
||||
MIGRATION_68_69,
|
||||
MIGRATION_69_70,
|
||||
MIGRATION_70_71,
|
||||
MIGRATION_71_72,
|
||||
MIGRATION_72_73,
|
||||
MIGRATION_73_74,
|
||||
MIGRATION_74_75
|
||||
Migration12(),
|
||||
Migration13(),
|
||||
Migration14(),
|
||||
Migration15(),
|
||||
Migration16(),
|
||||
Migration17(),
|
||||
Migration18(),
|
||||
Migration19(),
|
||||
Migration20(),
|
||||
Migration21(),
|
||||
Migration22(),
|
||||
Migration23(),
|
||||
Migration24(),
|
||||
Migration25(),
|
||||
Migration26(),
|
||||
Migration27(),
|
||||
Migration28(),
|
||||
Migration29(),
|
||||
Migration30(),
|
||||
Migration31(),
|
||||
Migration32(),
|
||||
Migration33(),
|
||||
Migration34(),
|
||||
Migration35(),
|
||||
Migration36(),
|
||||
Migration37(),
|
||||
Migration38(),
|
||||
Migration39(),
|
||||
Migration40(),
|
||||
Migration41(),
|
||||
Migration42(),
|
||||
Migration43(),
|
||||
Migration44(),
|
||||
Migration45(),
|
||||
Migration46(),
|
||||
Migration47(),
|
||||
Migration48(),
|
||||
Migration49(),
|
||||
Migration50(),
|
||||
Migration51(),
|
||||
Migration52(),
|
||||
Migration53(),
|
||||
Migration54(),
|
||||
Migration55(),
|
||||
Migration56(),
|
||||
Migration57(),
|
||||
Migration58(),
|
||||
Migration59(),
|
||||
Migration60(),
|
||||
Migration61(),
|
||||
Migration62(),
|
||||
Migration63(),
|
||||
Migration64(),
|
||||
Migration65(),
|
||||
Migration66(),
|
||||
Migration67(),
|
||||
Migration68(),
|
||||
Migration69(),
|
||||
Migration70(),
|
||||
Migration71(),
|
||||
Migration72(),
|
||||
Migration73(),
|
||||
Migration74(),
|
||||
Migration75(),
|
||||
Migration76()
|
||||
).allowMainThreadQueries().build()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-6
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.dao;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.room.Dao;
|
||||
import androidx.room.Insert;
|
||||
import androidx.room.OnConflictStrategy;
|
||||
import androidx.room.Query;
|
||||
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.FeedbackMessage;
|
||||
import pl.szczodrzynski.edziennik.data.db.full.FeedbackMessageWithCount;
|
||||
|
||||
@Dao
|
||||
public interface FeedbackMessageDao {
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
void add(FeedbackMessage feedbackMessage);
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
void addAll(List<FeedbackMessage> feedbackMessageList);
|
||||
|
||||
@Query("DELETE FROM feedbackMessages")
|
||||
void clear();
|
||||
|
||||
@Query("SELECT * FROM feedbackMessages")
|
||||
List<FeedbackMessage> getAllNow();
|
||||
|
||||
@Query("SELECT * FROM feedbackMessages WHERE fromUser = :fromUser")
|
||||
List<FeedbackMessage> getAllByUserNow(String fromUser);
|
||||
|
||||
@Query("SELECT * FROM feedbackMessages")
|
||||
LiveData<List<FeedbackMessage>> getAll();
|
||||
|
||||
@Query("SELECT *, COUNT(*) AS messageCount FROM feedbackMessages GROUP BY fromUser ORDER BY sentTime DESC")
|
||||
List<FeedbackMessageWithCount> getAllWithCountNow();
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-6
|
||||
*/
|
||||
package pl.szczodrzynski.edziennik.data.db.dao
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Insert
|
||||
import androidx.room.OnConflictStrategy
|
||||
import androidx.room.Query
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.FeedbackMessage
|
||||
|
||||
@Dao
|
||||
interface FeedbackMessageDao {
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
fun add(feedbackMessage: FeedbackMessage)
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
fun addAll(feedbackMessageList: List<FeedbackMessage>)
|
||||
|
||||
@Query("DELETE FROM feedbackMessages")
|
||||
fun clear()
|
||||
|
||||
@get:Query("SELECT * FROM feedbackMessages ORDER BY sentTime DESC LIMIT 50")
|
||||
val allNow: List<FeedbackMessage>
|
||||
|
||||
@Query("SELECT * FROM feedbackMessages WHERE deviceId = :deviceId ORDER BY sentTime DESC LIMIT 50")
|
||||
fun getByDeviceIdNow(deviceId: String): List<FeedbackMessage>
|
||||
|
||||
@get:Query("SELECT * FROM feedbackMessages")
|
||||
val all: LiveData<List<FeedbackMessage>>
|
||||
|
||||
@get:Query("SELECT *, COUNT(*) AS count FROM feedbackMessages WHERE received = 1 AND devId IS NULL AND deviceId != 'szkolny.eu' GROUP BY deviceId ORDER BY sentTime DESC")
|
||||
val allWithCountNow: List<FeedbackMessage.WithCount>
|
||||
}
|
@ -152,7 +152,7 @@ public abstract class GradeDao {
|
||||
}
|
||||
}
|
||||
|
||||
public LiveData<List<GradeFull>> getAllFromDate(int profileId, int semester, long date) {
|
||||
return getAllWhere(profileId, "gradeSemester = " + semester + " AND addedDate > " + date);
|
||||
public LiveData<List<GradeFull>> getAllFromDate(int profileId, long date) {
|
||||
return getAllWhere(profileId, "addedDate > " + date);
|
||||
}
|
||||
}
|
||||
|
@ -46,24 +46,33 @@ interface TimetableDao {
|
||||
|
||||
@Query("DELETE FROM timetable WHERE profileId = :profileId AND type != -1 AND ((type != 3 AND date >= :dateFrom) OR ((type = 3 OR type = 1) AND oldDate >= :dateFrom))")
|
||||
fun clearFromDate(profileId: Int, dateFrom: Date)
|
||||
|
||||
@Query("DELETE FROM timetable WHERE profileId = :profileId AND type != -1 AND ((type != 3 AND date <= :dateTo) OR ((type = 3 OR type = 1) AND oldDate <= :dateTo))")
|
||||
fun clearToDate(profileId: Int, dateTo: Date)
|
||||
|
||||
@Query("DELETE FROM timetable WHERE profileId = :profileId AND type != -1 AND ((type != 3 AND date >= :dateFrom AND date <= :dateTo) OR ((type = 3 OR type = 1) AND oldDate >= :dateFrom AND oldDate <= :dateTo))")
|
||||
fun clearBetweenDates(profileId: Int, dateFrom: Date, dateTo: Date)
|
||||
|
||||
@Query("""
|
||||
$QUERY
|
||||
WHERE timetable.profileId = :profileId AND ((type != 3 AND date = :date) OR ((type = 3 OR type = 1) AND oldDate = :date))
|
||||
WHERE timetable.profileId = :profileId AND type != -1 AND type != 0
|
||||
ORDER BY id, type
|
||||
""")
|
||||
fun getForDate(profileId: Int, date: Date) : LiveData<List<LessonFull>>
|
||||
fun getAllChangesNow(profileId: Int): List<Lesson>
|
||||
|
||||
@Query("""
|
||||
$QUERY
|
||||
WHERE timetable.profileId = :profileId AND ((type != 3 AND date = :date) OR ((type = 3 OR type = 1) AND oldDate = :date))
|
||||
ORDER BY id, type
|
||||
""")
|
||||
fun getForDateNow(profileId: Int, date: Date) : List<LessonFull>
|
||||
fun getForDate(profileId: Int, date: Date): LiveData<List<LessonFull>>
|
||||
|
||||
@Query("""
|
||||
$QUERY
|
||||
WHERE timetable.profileId = :profileId AND ((type != 3 AND date = :date) OR ((type = 3 OR type = 1) AND oldDate = :date))
|
||||
ORDER BY id, type
|
||||
""")
|
||||
fun getForDateNow(profileId: Int, date: Date): List<LessonFull>
|
||||
|
||||
@Query("""
|
||||
$QUERY
|
||||
@ -71,7 +80,7 @@ interface TimetableDao {
|
||||
ORDER BY id, type
|
||||
LIMIT 1
|
||||
""")
|
||||
fun getNextWithSubject(profileId: Int, today: Date, subjectId: Long) : LiveData<LessonFull?>
|
||||
fun getNextWithSubject(profileId: Int, today: Date, subjectId: Long): LiveData<LessonFull?>
|
||||
|
||||
@Query("""
|
||||
$QUERY
|
||||
@ -86,21 +95,21 @@ interface TimetableDao {
|
||||
WHERE (type != 3 AND date >= :dateFrom AND date <= :dateTo) OR ((type = 3 OR type = 1) AND oldDate >= :dateFrom AND oldDate <= :dateTo)
|
||||
ORDER BY profileId, id, type
|
||||
""")
|
||||
fun getBetweenDatesNow(dateFrom: Date, dateTo: Date) : List<LessonFull>
|
||||
fun getBetweenDatesNow(dateFrom: Date, dateTo: Date): List<LessonFull>
|
||||
|
||||
@Query("""
|
||||
$QUERY
|
||||
WHERE (type != 3 AND date >= :dateFrom AND date <= :dateTo) OR ((type = 3 OR type = 1) AND oldDate >= :dateFrom AND oldDate <= :dateTo)
|
||||
ORDER BY profileId, id, type
|
||||
""")
|
||||
fun getBetweenDates(dateFrom: Date, dateTo: Date) : LiveData<List<LessonFull>>
|
||||
fun getBetweenDates(dateFrom: Date, dateTo: Date): LiveData<List<LessonFull>>
|
||||
|
||||
@Query("""
|
||||
$QUERY
|
||||
WHERE timetable.profileId = :profileId AND timetable.id = :lessonId
|
||||
ORDER BY id, type
|
||||
""")
|
||||
fun getByIdNow(profileId: Int, lessonId: Long) : LessonFull?
|
||||
fun getByIdNow(profileId: Int, lessonId: Long): LessonFull?
|
||||
|
||||
@Query("""
|
||||
$QUERY
|
||||
|
@ -10,6 +10,8 @@ import androidx.room.Entity;
|
||||
import androidx.room.Ignore;
|
||||
import androidx.room.Index;
|
||||
|
||||
import java.util.Calendar;
|
||||
|
||||
import pl.szczodrzynski.edziennik.data.db.full.EventFull;
|
||||
import pl.szczodrzynski.edziennik.utils.models.Date;
|
||||
import pl.szczodrzynski.edziennik.utils.models.Time;
|
||||
@ -96,6 +98,27 @@ public class Event {
|
||||
return new EventFull(this, metadata);
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public Calendar getStartTimeCalendar() {
|
||||
Calendar c = Calendar.getInstance();
|
||||
c.set(
|
||||
eventDate.year,
|
||||
eventDate.month - 1,
|
||||
eventDate.day,
|
||||
(startTime == null) ? 0 : startTime.hour,
|
||||
(startTime == null) ? 0 : startTime.minute,
|
||||
(startTime == null) ? 0 : startTime.second
|
||||
);
|
||||
return c;
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public Calendar getEndTimeCalendar() {
|
||||
Calendar c = Calendar.getInstance();
|
||||
c.setTimeInMillis(getStartTimeCalendar().getTimeInMillis() + (45 * 60 * 1000));
|
||||
return c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Event clone() {
|
||||
Event event = new Event(
|
||||
|
@ -1,32 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-6
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.entity;
|
||||
|
||||
import androidx.room.Entity;
|
||||
import androidx.room.Ignore;
|
||||
import androidx.room.PrimaryKey;
|
||||
|
||||
@Entity(tableName = "feedbackMessages")
|
||||
public class FeedbackMessage {
|
||||
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
public int messageId;
|
||||
|
||||
public boolean received = false;
|
||||
public String fromUser = null;
|
||||
public String fromUserName = null;
|
||||
public long sentTime = System.currentTimeMillis();
|
||||
public String text;
|
||||
|
||||
public FeedbackMessage(boolean received, String text) {
|
||||
this.received = received;
|
||||
this.sentTime = System.currentTimeMillis();
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
@Ignore
|
||||
public FeedbackMessage() {
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright (c) Kuba Szczodrzyński 2020-1-21.
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.entity
|
||||
|
||||
import androidx.room.Entity
|
||||
import androidx.room.PrimaryKey
|
||||
|
||||
@Entity(tableName = "feedbackMessages")
|
||||
open class FeedbackMessage(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
val messageId: Int = 0,
|
||||
|
||||
val received: Boolean,
|
||||
val text: String,
|
||||
|
||||
// used always - contains the sender name
|
||||
val senderName: String,
|
||||
|
||||
// used in DEV apps - contains device ID and model
|
||||
var deviceId: String? = null,
|
||||
var deviceName: String? = null,
|
||||
|
||||
val devId: Int? = null,
|
||||
val devImage: String? = null,
|
||||
|
||||
val sentTime: Long = System.currentTimeMillis()
|
||||
) {
|
||||
class WithCount(messageId: Int, received: Boolean, text: String, senderName: String, deviceId: String?, deviceName: String?, devId: Int?, devImage: String?, sentTime: Long) : FeedbackMessage(messageId, received, text, senderName, deviceId, deviceName, devId, devImage, sentTime) {
|
||||
var count = 0
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-6
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.full;
|
||||
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.FeedbackMessage;
|
||||
|
||||
public class FeedbackMessageWithCount extends FeedbackMessage {
|
||||
public int messageCount = 0;
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration12 : Migration(11, 12) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("PRAGMA foreign_keys=off;")
|
||||
database.execSQL("ALTER TABLE teams RENAME TO _teams_old;")
|
||||
database.execSQL("CREATE TABLE teams (profileId INTEGER NOT NULL, teamId INTEGER NOT NULL, teamType INTEGER NOT NULL, teamName TEXT, teamTeacherId INTEGER NOT NULL, PRIMARY KEY(profileId, teamId));")
|
||||
database.execSQL("INSERT INTO teams (profileId, teamId, teamType, teamName, teamTeacherId) SELECT profileId, teamId, teamType, teamName, teacherId FROM _teams_old;")
|
||||
database.execSQL("DROP TABLE _teams_old;")
|
||||
database.execSQL("PRAGMA foreign_keys=on;")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration13 : Migration(12, 13) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE lessonChanges ADD lessonChangeWeekDay INTEGER NOT NULL DEFAULT -1;")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration14 : Migration(13, 14) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE loginStores (loginStoreId INTEGER NOT NULL, loginStoreType INTEGER NOT NULL, loginStoreData TEXT, PRIMARY KEY(loginStoreId));")
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration15 : Migration(14, 15) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades RENAME TO _grades_old;")
|
||||
database.execSQL("CREATE TABLE `grades` (\n" +
|
||||
"\t`profileId`\tINTEGER NOT NULL,\n" +
|
||||
"\t`gradeId`\tINTEGER NOT NULL,\n" +
|
||||
"\t`gradeDescription`\tTEXT,\n" +
|
||||
"\t`gradeName`\tTEXT,\n" +
|
||||
"\t`gradeValue`\tREAL NOT NULL,\n" +
|
||||
"\t`gradeWeight`\tREAL NOT NULL,\n" +
|
||||
"\t`gradeSemester`\tINTEGER NOT NULL,\n" +
|
||||
"\t`gradeType`\tINTEGER NOT NULL,\n" +
|
||||
"\t`teacherId`\tINTEGER NOT NULL,\n" +
|
||||
"\t`categoryId`\tINTEGER NOT NULL,\n" +
|
||||
"\t`subjectId`\tINTEGER NOT NULL,\n" +
|
||||
"\tPRIMARY KEY(`profileId`,`gradeId`)\n" +
|
||||
");")
|
||||
database.execSQL("INSERT INTO grades\n" +
|
||||
" SELECT *\n" +
|
||||
" FROM _grades_old;")
|
||||
database.execSQL("DROP TABLE _grades_old;")
|
||||
database.execSQL("CREATE INDEX index_grades_profileId ON grades (profileId);")
|
||||
}
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration16 : Migration(15, 16) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("""CREATE TABLE profiles (
|
||||
profileId INTEGER NOT NULL,
|
||||
name TEXT,
|
||||
subname TEXT,
|
||||
image TEXT,
|
||||
syncEnabled INTEGER NOT NULL,
|
||||
syncNotifications INTEGER NOT NULL,
|
||||
enableSharedEvents INTEGER NOT NULL,
|
||||
countInSeconds INTEGER NOT NULL,
|
||||
loggedIn INTEGER NOT NULL,
|
||||
empty INTEGER NOT NULL,
|
||||
studentNameLong TEXT,
|
||||
studentNameShort TEXT,
|
||||
studentNumber INTEGER NOT NULL,
|
||||
studentData TEXT,
|
||||
registration INTEGER NOT NULL,
|
||||
gradeColorMode INTEGER NOT NULL,
|
||||
agendaViewType INTEGER NOT NULL,
|
||||
currentSemester INTEGER NOT NULL,
|
||||
attendancePercentage REAL NOT NULL,
|
||||
dateSemester1Start TEXT,
|
||||
dateSemester2Start TEXT,
|
||||
dateYearEnd TEXT,
|
||||
luckyNumberEnabled INTEGER NOT NULL,
|
||||
luckyNumber INTEGER NOT NULL,
|
||||
luckyNumberDate TEXT,
|
||||
loginStoreId INTEGER NOT NULL,
|
||||
PRIMARY KEY(profileId));""")
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration17 : Migration(16, 17) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE profiles ADD archived INTEGER NOT NULL DEFAULT 0;")
|
||||
database.execSQL("ALTER TABLE teams ADD teamCode TEXT;")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration18 : Migration(17, 18) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE events ADD eventBlacklisted INTEGER NOT NULL DEFAULT 0;")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration19 : Migration(18, 19) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades ADD gradeClassAverage REAL NOT NULL DEFAULT -1;")
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration20 : Migration(19, 20) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("""CREATE TABLE luckyNumbers (
|
||||
profileId INTEGER NOT NULL,
|
||||
luckyNumberDate TEXT NOT NULL,
|
||||
luckyNumber INTEGER NOT NULL,
|
||||
PRIMARY KEY(profileId, luckyNumberDate));""")
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration21 : Migration(20, 21) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades ADD gradeCategory TEXT")
|
||||
database.execSQL("ALTER TABLE grades ADD gradeColor INTEGER NOT NULL DEFAULT -1")
|
||||
database.execSQL("DROP TABLE gradeCategories")
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration22 : Migration(21, 22) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("""CREATE TABLE eventTypes (
|
||||
profileId INTEGER NOT NULL,
|
||||
eventType INTEGER NOT NULL,
|
||||
eventTypeName TEXT,
|
||||
eventTypeColor INTEGER NOT NULL,
|
||||
PRIMARY KEY(profileId, eventType));""")
|
||||
}
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration23 : Migration(22, 23) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades RENAME TO _grades_old;")
|
||||
database.execSQL("""CREATE TABLE `grades` (
|
||||
`profileId` INTEGER NOT NULL,
|
||||
`gradeId` INTEGER NOT NULL,
|
||||
`gradeCategory` TEXT,
|
||||
`gradeColor` INTEGER NOT NULL DEFAULT -1,
|
||||
`gradeDescription` TEXT,
|
||||
`gradeName` TEXT,
|
||||
`gradeValue` REAL NOT NULL,
|
||||
`gradeWeight` REAL NOT NULL,
|
||||
`gradeSemester` INTEGER NOT NULL,
|
||||
`gradeClassAverage` REAL NOT NULL DEFAULT -1,
|
||||
`gradeType` INTEGER NOT NULL,
|
||||
`teacherId` INTEGER NOT NULL,
|
||||
`subjectId` INTEGER NOT NULL,
|
||||
PRIMARY KEY(`profileId`,`gradeId`))""")
|
||||
|
||||
database.execSQL("DROP INDEX index_grades_profileId")
|
||||
database.execSQL("CREATE INDEX `index_grades_profileId` ON `grades` (`profileId`)")
|
||||
|
||||
database.execSQL("INSERT INTO grades (profileId, gradeId, gradeDescription, gradeName, gradeValue, gradeWeight, gradeSemester, gradeType, teacherId, subjectId, gradeClassAverage, gradeCategory, gradeColor) SELECT profileId, gradeId, gradeDescription, gradeName, gradeValue, gradeWeight, gradeSemester, gradeType, teacherId, subjectId, gradeClassAverage, gradeCategory, gradeColor FROM _grades_old;")
|
||||
database.execSQL("DROP TABLE _grades_old;")
|
||||
database.execSQL("ALTER TABLE attendances RENAME TO _attendances_old;")
|
||||
|
||||
database.execSQL("""CREATE TABLE `attendances` (
|
||||
`profileId` INTEGER NOT NULL,
|
||||
`attendanceId` INTEGER NOT NULL,
|
||||
`attendanceLessonDate` TEXT NOT NULL,
|
||||
`attendanceStartTime` TEXT NOT NULL,
|
||||
`attendanceLessonTopic` TEXT,
|
||||
`attendanceSemester` INTEGER NOT NULL,
|
||||
`attendanceType` INTEGER NOT NULL,
|
||||
`teacherId` INTEGER NOT NULL,
|
||||
`subjectId` INTEGER NOT NULL,
|
||||
PRIMARY KEY(`profileId`,`attendanceId`,`attendanceLessonDate`,`attendanceStartTime`))""")
|
||||
|
||||
database.execSQL("DROP INDEX index_attendances_profileId")
|
||||
database.execSQL("CREATE INDEX `index_attendances_profileId` ON `attendances` (`profileId`);")
|
||||
database.execSQL("INSERT INTO attendances SELECT * FROM _attendances_old;")
|
||||
database.execSQL("DROP TABLE _attendances_old;")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration24 : Migration(23, 24) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE profiles ADD yearAverageMode INTEGER NOT NULL DEFAULT 0")
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration25 : Migration(24, 25) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("""CREATE TABLE announcements (
|
||||
profileId INTEGER NOT NULL,
|
||||
announcementId INTEGER NOT NULL,
|
||||
announcementSubject TEXT,
|
||||
announcementText TEXT,
|
||||
announcementStartDate TEXT,
|
||||
announcementEndDate TEXT,
|
||||
teacherId INTEGER NOT NULL,
|
||||
PRIMARY KEY(profileId, announcementId))""")
|
||||
database.execSQL("CREATE INDEX index_announcements_profileId ON announcements (profileId)")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration26 : Migration(25, 26) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades ADD gradePointGrade INTEGER NOT NULL DEFAULT 0;")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration27 : Migration(26, 27) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades ADD gradeValueMax REAL NOT NULL DEFAULT 0;")
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration28 : Migration(27, 28) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE gradeCategories (profileId INTEGER NOT NULL, categoryId INTEGER NOT NULL, weight REAL NOT NULL, color INTEGER NOT NULL, `text` TEXT, columns TEXT, valueFrom REAL NOT NULL, valueTo REAL NOT NULL, PRIMARY KEY(profileId, categoryId));")
|
||||
database.execSQL("ALTER TABLE grades ADD gradeComment TEXT;")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration29 : Migration(28, 29) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE feedbackMessages (messageId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, received INTEGER NOT NULL DEFAULT 0, sentTime INTEGER NOT NULL, `text` TEXT)")
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration30 : Migration(29, 30) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE feedbackMessages ADD fromUser TEXT DEFAULT NULL")
|
||||
database.execSQL("ALTER TABLE feedbackMessages ADD fromUserName TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration31 : Migration(30, 31) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("""CREATE TABLE messages (
|
||||
profileId INTEGER NOT NULL,
|
||||
messageId INTEGER NOT NULL,
|
||||
messageSubject TEXT,
|
||||
messageBody TEXT DEFAULT NULL,
|
||||
messageType INTEGER NOT NULL DEFAULT 0,
|
||||
senderId INTEGER NOT NULL DEFAULT -1,
|
||||
senderReplyId INTEGER NOT NULL DEFAULT -1,
|
||||
recipientIds TEXT DEFAULT NULL,
|
||||
recipientReplyIds TEXT DEFAULT NULL,
|
||||
readByRecipientDates TEXT DEFAULT NULL,
|
||||
overrideHasAttachments INTEGER NOT NULL DEFAULT 0,
|
||||
attachmentIds TEXT DEFAULT NULL,
|
||||
attachmentNames TEXT DEFAULT NULL,
|
||||
PRIMARY KEY(profileId, messageId))""")
|
||||
database.execSQL("CREATE INDEX index_messages_profileId ON messages (profileId)")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration32 : Migration(31, 32) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE messages ADD attachmentSizes TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration33 : Migration(32, 33) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DROP TABLE messages")
|
||||
database.execSQL("""CREATE TABLE messages (
|
||||
profileId INTEGER NOT NULL,
|
||||
messageId INTEGER NOT NULL,
|
||||
messageSubject TEXT,
|
||||
messageBody TEXT DEFAULT NULL,
|
||||
messageType INTEGER NOT NULL DEFAULT 0,
|
||||
senderId INTEGER NOT NULL DEFAULT -1,
|
||||
senderReplyId INTEGER NOT NULL DEFAULT -1,
|
||||
overrideHasAttachments INTEGER NOT NULL DEFAULT 0,
|
||||
attachmentIds TEXT DEFAULT NULL,
|
||||
attachmentNames TEXT DEFAULT NULL,
|
||||
attachmentSizes TEXT DEFAULT NULL,
|
||||
PRIMARY KEY(profileId, messageId))""")
|
||||
database.execSQL("CREATE INDEX index_messages_profileId ON messages (profileId)")
|
||||
|
||||
database.execSQL("""CREATE TABLE messageRecipients (
|
||||
profileId INTEGER NOT NULL,
|
||||
messageRecipientId INTEGER NOT NULL DEFAULT -1,
|
||||
messageRecipientReplyId INTEGER NOT NULL DEFAULT -1,
|
||||
messageRecipientReadDate INTEGER NOT NULL DEFAULT -1,
|
||||
messageId INTEGER NOT NULL,
|
||||
PRIMARY KEY(profileId, messageRecipientId))""")
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration34 : Migration(33, 34) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DROP TABLE messageRecipients")
|
||||
database.execSQL("""CREATE TABLE messageRecipients (
|
||||
profileId INTEGER NOT NULL,
|
||||
messageRecipientId INTEGER NOT NULL DEFAULT -1,
|
||||
messageRecipientReplyId INTEGER NOT NULL DEFAULT -1,
|
||||
messageRecipientReadDate INTEGER NOT NULL DEFAULT -1,
|
||||
messageId INTEGER NOT NULL,
|
||||
PRIMARY KEY(profileId, messageRecipientId, messageId))""")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration35 : Migration(34, 35) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE teachers ADD teacherLoginId TEXT DEFAULT NULL;")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration36 : Migration(35, 36) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE profiles SET yearAverageMode = 4 WHERE yearAverageMode = 0")
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration37 : Migration(36, 37) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||
|
||||
class Migration38 : Migration(37, 38) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
val today = Date.getToday()
|
||||
val schoolYearStart = if (today.month < 9) today.year - 1 else today.year
|
||||
database.execSQL("UPDATE profiles SET dateSemester1Start = '$schoolYearStart-09-01' WHERE dateSemester1Start IS NULL")
|
||||
database.execSQL("UPDATE profiles SET dateSemester2Start = '${schoolYearStart + 1}-02-01' WHERE dateSemester2Start IS NULL")
|
||||
database.execSQL("UPDATE profiles SET dateYearEnd = '${schoolYearStart + 1}-06-30' WHERE dateYearEnd IS NULL")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration39 : Migration(38, 39) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("CREATE TABLE debugLogs (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `text` TEXT)")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration40 : Migration(39, 40) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE profiles ADD changedEndpoints TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration41 : Migration(40, 41) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE profiles SET empty = 1")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration42 : Migration(41, 42) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE profiles SET empty = 1")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration43 : Migration(42, 43) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE profiles ADD lastFullSync INTEGER NOT NULL DEFAULT 0")
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration44 : Migration(43, 44) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE profiles SET empty = 1")
|
||||
database.execSQL("UPDATE profiles SET currentSemester = 1")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration45 : Migration(44, 45) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE profiles SET empty = 1")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration46 : Migration(45, 46) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE profiles SET lastFullSync = 0")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration47 : Migration(46, 47) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE profiles SET lastFullSync = 0")
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration48 : Migration(47, 48) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE notices ADD points REAL NOT NULL DEFAULT 0")
|
||||
database.execSQL("ALTER TABLE notices ADD category TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration49 : Migration(48, 49) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades ADD gradeParentId INTEGER NOT NULL DEFAULT -1")
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration50 : Migration(49, 50) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE grades ADD gradeIsImprovement INTEGER NOT NULL DEFAULT 0")
|
||||
database.execSQL("DELETE FROM attendances WHERE attendances.profileId IN (SELECT profiles.profileId FROM profiles JOIN loginStores USING(loginStoreId) WHERE loginStores.loginStoreType = 1)")
|
||||
database.execSQL("UPDATE profiles SET empty = 1 WHERE profileId IN (SELECT profiles.profileId FROM profiles JOIN loginStores USING(loginStoreId) WHERE loginStores.loginStoreType = 4)")
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration51 : Migration(50, 51) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE profiles ADD lastReceiversSync INTEGER NOT NULL DEFAULT 0")
|
||||
database.execSQL("ALTER TABLE teachers ADD teacherType INTEGER NOT NULL DEFAULT 0")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration52 : Migration(51, 52) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE teachers ADD teacherTypeDescription TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration53 : Migration(52, 53) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("""CREATE TABLE IF NOT EXISTS teacherAbsence (
|
||||
profileId INTEGER NOT NULL,
|
||||
teacherAbsenceId INTEGER NOT NULL,
|
||||
teacherId INTEGER NOT NULL,
|
||||
teacherAbsenceType INTEGER NOT NULL,
|
||||
teacherAbsenceDateFrom TEXT NOT NULL,
|
||||
teacherAbsenceDateTo TEXT NOT NULL,
|
||||
PRIMARY KEY(profileId, teacherAbsenceId))""")
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration54 : Migration(53, 54) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE teacherAbsence ADD teacherAbsenceTimeFrom TEXT DEFAULT NULL")
|
||||
database.execSQL("ALTER TABLE teacherAbsence ADD teacherAbsenceTimeTo TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration55 : Migration(54, 55) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
// 2019-10-21 for merge compatibility between 3.1.1 and api-v2
|
||||
// moved to Migration 55->56
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration56 : Migration(55, 56) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("""CREATE TABLE IF NOT EXISTS endpointTimers (
|
||||
profileId INTEGER NOT NULL,
|
||||
endpointId INTEGER NOT NULL,
|
||||
endpointLastSync INTEGER DEFAULT NULL,
|
||||
endpointNextSync INTEGER NOT NULL DEFAULT 1,
|
||||
endpointViewId INTEGER DEFAULT NULL,
|
||||
PRIMARY KEY(profileId, endpointId))""")
|
||||
|
||||
database.execSQL("""CREATE TABLE IF NOT EXISTS lessonRanges (
|
||||
profileId INTEGER NOT NULL,
|
||||
lessonRangeNumber INTEGER NOT NULL,
|
||||
lessonRangeStart TEXT NOT NULL,
|
||||
LessonRangeEnd TEXT NOT NULL,
|
||||
PRIMARY KEY(profileId, lessonRangeNumber))""")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration57 : Migration(56, 57) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE gradeCategories ADD type INTEGER NOT NULL DEFAULT 0")
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata.TYPE_EVENT
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata.TYPE_HOMEWORK
|
||||
|
||||
class Migration58 : Migration(57, 58) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE metadata RENAME TO _metadata_old;")
|
||||
database.execSQL("DROP INDEX index_metadata_profileId_thingType_thingId;")
|
||||
database.execSQL("UPDATE _metadata_old SET thingType = $TYPE_HOMEWORK WHERE thingType = $TYPE_EVENT AND thingId IN (SELECT eventId FROM events WHERE eventType = -1)")
|
||||
database.execSQL("""CREATE TABLE metadata (
|
||||
profileId INTEGER NOT NULL,
|
||||
metadataId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||
thingType INTEGER NOT NULL,
|
||||
thingId INTEGER NOT NULL,
|
||||
seen INTEGER NOT NULL,
|
||||
notified INTEGER NOT NULL,
|
||||
addedDate INTEGER NOT NULL)""")
|
||||
database.execSQL("INSERT INTO metadata SELECT * FROM (SELECT * FROM _metadata_old ORDER BY addedDate DESC) GROUP BY thingId;")
|
||||
database.execSQL("DROP TABLE _metadata_old;")
|
||||
database.execSQL("CREATE UNIQUE INDEX index_metadata_profileId_thingType_thingId ON metadata (profileId, thingType, thingId);")
|
||||
}
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration59 : Migration(58, 59) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("UPDATE metadata SET addedDate = addedDate*1000 WHERE addedDate < 10000000000;")
|
||||
database.execSQL("""INSERT INTO metadata (profileId, thingType, thingId, seen, notified, addedDate)
|
||||
SELECT profileId,
|
||||
10 AS thingType,
|
||||
luckyNumberDate*10000+substr(luckyNumberDate, 6)*100+substr(luckyNumberDate, 9) AS thingId,
|
||||
1 AS seen,
|
||||
1 AS notified,
|
||||
CAST(strftime('%s', luckyNumberDate) AS INT)*1000 AS addedDate
|
||||
FROM luckyNumbers""")
|
||||
|
||||
database.execSQL("ALTER TABLE luckyNumbers RENAME TO _old_luckyNumbers;")
|
||||
database.execSQL("""CREATE TABLE luckyNumbers (
|
||||
profileId INTEGER NOT NULL,
|
||||
luckyNumberDate INTEGER NOT NULL,
|
||||
luckyNumber INTEGER NOT NULL,
|
||||
PRIMARY KEY(profileId, luckyNumberDate))""")
|
||||
|
||||
database.execSQL("""INSERT INTO luckyNumbers (profileId, luckyNumberDate, luckyNumber)
|
||||
SELECT profileId,
|
||||
luckyNumberDate * 10000 + substr(luckyNumberDate, 6) * 100 + substr(luckyNumberDate, 9) AS luckyNumberDate,
|
||||
luckyNumber FROM _old_luckyNumbers;""")
|
||||
database.execSQL("DROP TABLE _old_luckyNumbers;")
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration60 : Migration(59, 60) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("""CREATE TABLE notifications (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||
title TEXT NOT NULL,
|
||||
`text` TEXT NOT NULL,
|
||||
`type` INTEGER NOT NULL,
|
||||
profileId INTEGER DEFAULT NULL,
|
||||
profileName TEXT DEFAULT NULL,
|
||||
posted INTEGER NOT NULL DEFAULT 0,
|
||||
viewId INTEGER DEFAULT NULL,
|
||||
extras TEXT DEFAULT NULL,
|
||||
addedDate INTEGER NOT NULL)""")
|
||||
database.execSQL("ALTER TABLE profiles ADD COLUMN disabledNotifications TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration61 : Migration(60, 61) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("""CREATE TABLE IF NOT EXISTS teacherAbsenceTypes (
|
||||
profileId INTEGER NOT NULL,
|
||||
teacherAbsenceTypeId INTEGER NOT NULL,
|
||||
teacherAbsenceTypeName TEXT NOT NULL,
|
||||
PRIMARY KEY(profileId, teacherAbsenceTypeId))""")
|
||||
database.execSQL("ALTER TABLE teacherAbsence ADD COLUMN teacherAbsenceName TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration62 : Migration(61, 62) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("""CREATE TABLE IF NOT EXISTS classrooms (
|
||||
profileId INTEGER NOT NULL,
|
||||
id INTEGER NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
PRIMARY KEY(profileId, id))""")
|
||||
|
||||
database.execSQL("""CREATE TABLE IF NOT EXISTS noticeTypes (
|
||||
profileId INTEGER NOT NULL,
|
||||
id INTEGER NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
PRIMARY KEY(profileId, id))""")
|
||||
|
||||
database.execSQL("""CREATE TABLE IF NOT EXISTS attendanceTypes (
|
||||
profileId INTEGER NOT NULL,
|
||||
id INTEGER NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
type INTEGER NOT NULL,
|
||||
color INTEGER NOT NULL,
|
||||
PRIMARY KEY(profileId, id))""")
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration63 : Migration(62, 63) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE profiles ADD COLUMN accountNameLong TEXT DEFAULT NULL")
|
||||
database.execSQL("ALTER TABLE profiles ADD COLUMN studentClassName TEXT DEFAULT NULL")
|
||||
database.execSQL("ALTER TABLE profiles ADD COLUMN studentSchoolYear TEXT DEFAULT NULL")
|
||||
}
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration64 : Migration(63, 64) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("""CREATE TABLE timetable (
|
||||
profileId INTEGER NOT NULL,
|
||||
id INTEGER NOT NULL,
|
||||
type INTEGER NOT NULL,
|
||||
date TEXT DEFAULT NULL,
|
||||
lessonNumber INTEGER DEFAULT NULL,
|
||||
startTime TEXT DEFAULT NULL,
|
||||
endTime TEXT DEFAULT NULL,
|
||||
subjectId INTEGER DEFAULT NULL,
|
||||
teacherId INTEGER DEFAULT NULL,
|
||||
teamId INTEGER DEFAULT NULL,
|
||||
classroom TEXT DEFAULT NULL,
|
||||
oldDate TEXT DEFAULT NULL,
|
||||
oldLessonNumber INTEGER DEFAULT NULL,
|
||||
oldStartTime TEXT DEFAULT NULL,
|
||||
oldEndTime TEXT DEFAULT NULL,
|
||||
oldSubjectId INTEGER DEFAULT NULL,
|
||||
oldTeacherId INTEGER DEFAULT NULL,
|
||||
oldTeamId INTEGER DEFAULT NULL,
|
||||
oldClassroom TEXT DEFAULT NULL,
|
||||
PRIMARY KEY(id))""")
|
||||
|
||||
database.execSQL("CREATE INDEX index_lessons_profileId_type_date ON timetable (profileId, type, date)")
|
||||
database.execSQL("CREATE INDEX index_lessons_profileId_type_oldDate ON timetable (profileId, type, oldDate)")
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration65 : Migration(64, 65) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("""CREATE TABLE config (
|
||||
profileId INTEGER NOT NULL DEFAULT -1,
|
||||
`key` TEXT NOT NULL,
|
||||
value TEXT NOT NULL,
|
||||
PRIMARY KEY(profileId, `key`))""")
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration66 : Migration(65, 66) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DROP TABLE config;")
|
||||
database.execSQL("""CREATE TABLE config (
|
||||
profileId INTEGER NOT NULL DEFAULT -1,
|
||||
`key` TEXT NOT NULL,
|
||||
value TEXT,
|
||||
PRIMARY KEY(profileId, `key`))""")
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration67 : Migration(66, 67) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DELETE FROM grades WHERE (gradeId=-1 OR gradeId=-2) AND gradeType=20")
|
||||
database.execSQL("DELETE FROM metadata WHERE (thingId=-1 OR thingId=-2) AND thingType=1")
|
||||
database.execSQL("ALTER TABLE gradeCategories RENAME TO _gradeCategories")
|
||||
|
||||
database.execSQL("""CREATE TABLE gradeCategories (
|
||||
profileId INTEGER NOT NULL,
|
||||
categoryId INTEGER NOT NULL,
|
||||
weight REAL NOT NULL,
|
||||
color INTEGER NOT NULL,
|
||||
`text` TEXT,
|
||||
columns TEXT,
|
||||
valueFrom REAL NOT NULL,
|
||||
valueTo REAL NOT NULL,
|
||||
type INTEGER NOT NULL,
|
||||
PRIMARY KEY(profileId, categoryId, type))""")
|
||||
|
||||
database.execSQL("""INSERT INTO gradeCategories (profileId, categoryId, weight, color,
|
||||
`text`, columns, valueFrom, valueTo, type)
|
||||
SELECT profileId, categoryId, weight, color, `text`, columns, valueFrom,
|
||||
valueTo, type FROM _gradeCategories""")
|
||||
database.execSQL("DROP TABLE _gradeCategories")
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata.TYPE_ANNOUNCEMENT
|
||||
|
||||
class Migration68 : Migration(67, 68) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
/* Migration from crc16 to crc32 id */
|
||||
database.execSQL("DELETE FROM announcements")
|
||||
database.execSQL("DELETE FROM metadata WHERE thingType=$TYPE_ANNOUNCEMENT")
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration69 : Migration(68, 69) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE loginStores ADD COLUMN loginStoreMode INTEGER NOT NULL DEFAULT 0")
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration70 : Migration(69, 70) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE announcements ADD COLUMN announcementIdString TEXT DEFAULT NULL")
|
||||
database.execSQL("DELETE FROM announcements")
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata.TYPE_MESSAGE
|
||||
|
||||
class Migration71 : Migration(70, 71) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DELETE FROM messages WHERE profileId IN (SELECT profileId FROM profiles WHERE archived = 0)")
|
||||
database.execSQL("DELETE FROM messageRecipients WHERE profileId IN (SELECT profileId FROM profiles WHERE archived = 0)")
|
||||
database.execSQL("DELETE FROM teachers WHERE profileId IN (SELECT profileId FROM profiles WHERE archived = 0)")
|
||||
database.execSQL("DELETE FROM endpointTimers WHERE profileId IN (SELECT profileId FROM profiles WHERE archived = 0)")
|
||||
database.execSQL("DELETE FROM metadata WHERE profileId IN (SELECT profileId FROM profiles WHERE archived = 0) AND thingType = $TYPE_MESSAGE")
|
||||
database.execSQL("UPDATE profiles SET empty = 1 WHERE archived = 0")
|
||||
database.execSQL("UPDATE profiles SET lastReceiversSync = 0 WHERE archived = 0")
|
||||
database.execSQL("INSERT INTO config (profileId, `key`, value) VALUES (-1, 'runSync', 'true')")
|
||||
}
|
||||
}
|
@ -0,0 +1,138 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
import pl.szczodrzynski.edziennik.crc32
|
||||
|
||||
class Migration72 : Migration(71, 72) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE loginStores RENAME to _loginStores;")
|
||||
database.execSQL("""CREATE TABLE loginStores(
|
||||
loginStoreId INTEGER NOT NULL,
|
||||
loginStoreType INTEGER NOT NULL,
|
||||
loginStoreMode INTEGER NOT NULL,
|
||||
loginStoreData TEXT NOT NULL,
|
||||
PRIMARY KEY(loginStoreId))""")
|
||||
|
||||
database.execSQL("""INSERT INTO loginStores
|
||||
(loginStoreId, loginStoreType, loginStoreMode, loginStoreData)
|
||||
SELECT loginStoreId, loginStoreType, loginStoreMode, loginStoreData
|
||||
FROM _loginStores""")
|
||||
|
||||
database.execSQL("DROP TABLE _loginStores;")
|
||||
database.execSQL("ALTER TABLE profiles RENAME TO _profiles_old;")
|
||||
|
||||
database.execSQL("""CREATE TABLE profiles (
|
||||
profileId INTEGER NOT NULL, name TEXT NOT NULL, subname TEXT, image TEXT DEFAULT NULL,
|
||||
studentNameLong TEXT NOT NULL, studentNameShort TEXT NOT NULL, accountName TEXT,
|
||||
studentData TEXT NOT NULL, empty INTEGER NOT NULL DEFAULT 1, archived INTEGER NOT NULL DEFAULT 0,
|
||||
syncEnabled INTEGER NOT NULL DEFAULT 1, enableSharedEvents INTEGER NOT NULL DEFAULT 1, registration INTEGER NOT NULL DEFAULT 0,
|
||||
userCode TEXT NOT NULL DEFAULT '', studentNumber INTEGER NOT NULL DEFAULT -1, studentClassName TEXT DEFAULT NULL,
|
||||
studentSchoolYearStart INTEGER NOT NULL, dateSemester1Start TEXT NOT NULL, dateSemester2Start TEXT NOT NULL,
|
||||
dateYearEnd TEXT NOT NULL, disabledNotifications TEXT DEFAULT NULL, lastReceiversSync INTEGER NOT NULL DEFAULT 0,
|
||||
loginStoreId INTEGER NOT NULL, loginStoreType INTEGER NOT NULL, PRIMARY KEY(profileId))""")
|
||||
|
||||
database.execSQL("""INSERT INTO profiles (profileId, name, subname, image, studentNameLong, studentNameShort, accountName,
|
||||
userCode, studentData, empty, archived, syncEnabled, enableSharedEvents, registration, studentNumber, studentSchoolYearStart,
|
||||
dateSemester1Start, dateSemester2Start, dateYearEnd, lastReceiversSync, loginStoreId, loginStoreType)
|
||||
SELECT profileId, name, subname, image, studentNameLong, studentNameShort, accountNameLong, '' AS userCode, studentData,
|
||||
empty, archived, syncEnabled, enableSharedEvents, registration, studentNumber, SUBSTR(dateSemester1Start, 0, 5) AS studentSchoolYearStart,
|
||||
dateSemester1Start, dateSemester2Start, dateYearEnd, lastReceiversSync, _profiles_old.loginStoreId, loginStoreType FROM _profiles_old
|
||||
JOIN loginStores ON loginStores.loginStoreId = _profiles_old.loginStoreId WHERE profileId >= 0""")
|
||||
|
||||
database.execSQL("DROP TABLE _profiles_old;")
|
||||
|
||||
migrateUserCodes(database)
|
||||
}
|
||||
|
||||
private fun migrateMobidziennik(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DROP TABLE IF EXISTS _userCodes;")
|
||||
database.execSQL("CREATE TABLE _userCodes (profileId INTEGER, loginData TEXT, studentData TEXT, userCode TEXT, serverName TEXT, username TEXT, studentId TEXT);")
|
||||
database.execSQL("DELETE FROM _userCodes;")
|
||||
database.execSQL("INSERT INTO _userCodes SELECT profileId, loginStores.loginStoreData, studentData, \"\", \"\", \"\", \"\" FROM profiles JOIN loginStores ON loginStores.loginStoreId = profiles.loginStoreId WHERE profiles.loginStoreType = 1;")
|
||||
database.execSQL("UPDATE _userCodes SET serverName = SUBSTR(loginData, instr(loginData, '\"serverName\":\"')+14);")
|
||||
database.execSQL("UPDATE _userCodes SET serverName = SUBSTR(serverName, 0, instr(serverName, '\",')+instr(serverName, '\"}')-(instr(serverName, '\"}')*min(instr(serverName, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET username = SUBSTR(loginData, instr(loginData, '\"username\":\"')+12);")
|
||||
database.execSQL("UPDATE _userCodes SET username = SUBSTR(username, 0, instr(username, '\",')+instr(username, '\"}')-(instr(username, '\"}')*min(instr(username, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET studentId = SUBSTR(studentData, instr(studentData, '\"studentId\":')+12);")
|
||||
database.execSQL("UPDATE _userCodes SET studentId = SUBSTR(studentId, 0, instr(studentId, ',')+instr(studentId, '}')-(instr(studentId, '}')*min(instr(studentId, ','), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET userCode = serverName||\":\"||username||\":\"||studentId;")
|
||||
database.execSQL("UPDATE profiles SET userCode = (SELECT userCode FROM _userCodes WHERE profileId = profiles.profileId) WHERE profileId IN (SELECT profileId FROM _userCodes);")
|
||||
}
|
||||
|
||||
private fun migrateLibrus(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DROP TABLE IF EXISTS _userCodes;")
|
||||
database.execSQL("CREATE TABLE _userCodes (profileId INTEGER, loginData TEXT, studentData TEXT, userCode TEXT, schoolName TEXT, accountLogin TEXT);")
|
||||
database.execSQL("DELETE FROM _userCodes;")
|
||||
database.execSQL("INSERT INTO _userCodes SELECT profileId, loginStores.loginStoreData, studentData, \"\", \"\", \"\" FROM profiles JOIN loginStores ON loginStores.loginStoreId = profiles.loginStoreId WHERE profiles.loginStoreType = 2;")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(studentData, instr(studentData, '\"schoolName\":\"')+14);")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(schoolName, 0, instr(schoolName, '\",')+instr(schoolName, '\"}')-(instr(schoolName, '\"}')*min(instr(schoolName, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET accountLogin = SUBSTR(studentData, instr(studentData, '\"accountLogin\":\"')+16);")
|
||||
database.execSQL("UPDATE _userCodes SET accountLogin = SUBSTR(accountLogin, 0, instr(accountLogin, '\",')+instr(accountLogin, '\"}')-(instr(accountLogin, '\"}')*min(instr(accountLogin, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET userCode = schoolName||\":\"||accountLogin;")
|
||||
database.execSQL("UPDATE profiles SET userCode = (SELECT userCode FROM _userCodes WHERE profileId = profiles.profileId) WHERE profileId IN (SELECT profileId FROM _userCodes);")
|
||||
}
|
||||
|
||||
private fun migrateIUczniowie(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DROP TABLE IF EXISTS _userCodes;")
|
||||
database.execSQL("CREATE TABLE _userCodes (profileId INTEGER, loginData TEXT, studentData TEXT, userCode TEXT, schoolName TEXT, username TEXT, registerId TEXT);")
|
||||
database.execSQL("DELETE FROM _userCodes;")
|
||||
database.execSQL("INSERT INTO _userCodes SELECT profileId, loginStores.loginStoreData, studentData, \"\", \"\", \"\", \"\" FROM profiles JOIN loginStores ON loginStores.loginStoreId = profiles.loginStoreId WHERE profiles.loginStoreType = 3;")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(loginData, instr(loginData, '\"schoolName\":\"')+14);")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(schoolName, 0, instr(schoolName, '\",')+instr(schoolName, '\"}')-(instr(schoolName, '\"}')*min(instr(schoolName, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET username = SUBSTR(loginData, instr(loginData, '\"username\":\"')+12);")
|
||||
database.execSQL("UPDATE _userCodes SET username = SUBSTR(username, 0, instr(username, '\",')+instr(username, '\"}')-(instr(username, '\"}')*min(instr(username, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET registerId = SUBSTR(studentData, instr(studentData, '\"registerId\":')+13);")
|
||||
database.execSQL("UPDATE _userCodes SET registerId = SUBSTR(registerId, 0, instr(registerId, ',')+instr(registerId, '}')-(instr(registerId, '}')*min(instr(registerId, ','), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET userCode = schoolName||\":\"||username||\":\"||registerId;")
|
||||
database.execSQL("UPDATE profiles SET userCode = (SELECT userCode FROM _userCodes WHERE profileId = profiles.profileId) WHERE profileId IN (SELECT profileId FROM _userCodes);")
|
||||
}
|
||||
|
||||
private fun migrateVulcan(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DROP TABLE IF EXISTS _userCodes;")
|
||||
database.execSQL("CREATE TABLE _userCodes (profileId INTEGER, loginData TEXT, studentData TEXT, userCode TEXT, schoolName TEXT, studentId TEXT);")
|
||||
database.execSQL("DELETE FROM _userCodes;")
|
||||
database.execSQL("INSERT INTO _userCodes SELECT profileId, loginStores.loginStoreData, studentData, \"\", \"\", \"\" FROM profiles JOIN loginStores ON loginStores.loginStoreId = profiles.loginStoreId WHERE profiles.loginStoreType = 4;")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(studentData, instr(studentData, '\"schoolName\":\"')+14);")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(schoolName, 0, instr(schoolName, '\",')+instr(schoolName, '\"}')-(instr(schoolName, '\"}')*min(instr(schoolName, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET studentId = SUBSTR(studentData, instr(studentData, '\"studentId\":')+12);")
|
||||
database.execSQL("UPDATE _userCodes SET studentId = SUBSTR(studentId, 0, instr(studentId, ',')+instr(studentId, '}')-(instr(studentId, '}')*min(instr(studentId, ','), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET userCode = schoolName||\":\"||studentId;")
|
||||
database.execSQL("UPDATE profiles SET userCode = (SELECT userCode FROM _userCodes WHERE profileId = profiles.profileId) WHERE profileId IN (SELECT profileId FROM _userCodes);")
|
||||
}
|
||||
|
||||
private fun migrateEdudziennik(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("DROP TABLE IF EXISTS _userCodes;")
|
||||
database.execSQL("CREATE TABLE _userCodes (profileId INTEGER, loginData TEXT, studentData TEXT, userCode TEXT, schoolName TEXT, email TEXT, studentId TEXT);")
|
||||
database.execSQL("DELETE FROM _userCodes;")
|
||||
database.execSQL("INSERT INTO _userCodes SELECT profileId, loginStores.loginStoreData, studentData, \"\", \"\", \"\", \"\" FROM profiles JOIN loginStores ON loginStores.loginStoreId = profiles.loginStoreId WHERE profiles.loginStoreType = 5;")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(studentData, instr(studentData, '\"schoolName\":\"')+14);")
|
||||
database.execSQL("UPDATE _userCodes SET schoolName = SUBSTR(schoolName, 0, instr(schoolName, '\",')+instr(schoolName, '\"}')-(instr(schoolName, '\"}')*min(instr(schoolName, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET email = SUBSTR(loginData, instr(loginData, '\"email\":\"')+9);")
|
||||
database.execSQL("UPDATE _userCodes SET email = SUBSTR(email, 0, instr(email, '\",')+instr(email, '\"}')-(instr(email, '\"}')*min(instr(email, '\",'), 1)));")
|
||||
database.execSQL("UPDATE _userCodes SET studentId = SUBSTR(studentData, instr(studentData, '\"studentId\":\"')+13);")
|
||||
database.execSQL("UPDATE _userCodes SET studentId = SUBSTR(studentId, 0, instr(studentId, '\",')+instr(studentId, '\"}')-(instr(studentId, '\"}')*min(instr(studentId, '\",'), 1)));")
|
||||
database.query("SELECT profileId, studentId FROM _userCodes;").use { cursor ->
|
||||
while (cursor.moveToNext()) {
|
||||
val profileId = cursor.getInt(0)
|
||||
val crc = cursor.getString(1).crc32()
|
||||
database.execSQL("UPDATE _userCodes SET studentId = $crc WHERE profileId = $profileId")
|
||||
}
|
||||
}
|
||||
database.execSQL("UPDATE _userCodes SET userCode = schoolName||\":\"||email||\":\"||studentId;")
|
||||
database.execSQL("UPDATE profiles SET userCode = (SELECT userCode FROM _userCodes WHERE profileId = profiles.profileId) WHERE profileId IN (SELECT profileId FROM _userCodes);")
|
||||
database.execSQL("DROP TABLE _userCodes;")
|
||||
}
|
||||
|
||||
private fun migrateUserCodes(database: SupportSQLiteDatabase) {
|
||||
migrateMobidziennik(database)
|
||||
migrateLibrus(database)
|
||||
migrateVulcan(database)
|
||||
migrateIUczniowie(database)
|
||||
migrateEdudziennik(database)
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration73 : Migration(72, 73) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) { // Mark as seen all lucky number metadata.
|
||||
database.execSQL("UPDATE metadata SET seen=1 WHERE thingType=10")
|
||||
database.execSQL("DROP TABLE lessons")
|
||||
database.execSQL("DROP TABLE lessonChanges")
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration74 : Migration(73, 74) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("""CREATE TABLE librusLessons (
|
||||
profileId INTEGER NOT NULL,
|
||||
lessonId INTEGER NOT NULL,
|
||||
teacherId INTEGER NOT NULL,
|
||||
subjectId INTEGER NOT NULL,
|
||||
teamId INTEGER,
|
||||
PRIMARY KEY(profileId, lessonId))""")
|
||||
|
||||
database.execSQL("CREATE INDEX index_librusLessons_profileId ON librusLessons (profileId)")
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration75 : Migration(74, 75) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE timetable RENAME TO _timetable")
|
||||
database.execSQL("CREATE TABLE timetable (profileId INTEGER NOT NULL,id INTEGER NOT NULL,type INTEGER NOT NULL,date TEXT DEFAULT NULL,lessonNumber INTEGER DEFAULT NULL,startTime TEXT DEFAULT NULL,endTime TEXT DEFAULT NULL,subjectId INTEGER DEFAULT NULL,teacherId INTEGER DEFAULT NULL,teamId INTEGER DEFAULT NULL,classroom TEXT DEFAULT NULL,oldDate TEXT DEFAULT NULL,oldLessonNumber INTEGER DEFAULT NULL,oldStartTime TEXT DEFAULT NULL,oldEndTime TEXT DEFAULT NULL,oldSubjectId INTEGER DEFAULT NULL,oldTeacherId INTEGER DEFAULT NULL,oldTeamId INTEGER DEFAULT NULL,oldClassroom TEXT DEFAULT NULL,PRIMARY KEY(profileId, id))")
|
||||
database.execSQL("INSERT INTO timetable (profileId, id, type, date, lessonNumber, startTime, endTime, subjectId, teacherId, teamId, classroom, oldDate, oldLessonNumber, oldStartTime, oldEndTime, oldSubjectId, oldTeacherId, oldTeamId, oldClassroom) SELECT profileId, id, type, date, lessonNumber, startTime, endTime, subjectId, teacherId, teamId, classroom, oldDate, oldLessonNumber, oldStartTime, oldEndTime, oldSubjectId, oldTeacherId, oldTeamId, oldClassroom FROM _timetable")
|
||||
database.execSQL("DROP TABLE _timetable")
|
||||
database.execSQL("CREATE INDEX index_lessons_profileId_type_date ON timetable (profileId, type, date)")
|
||||
database.execSQL("CREATE INDEX index_lessons_profileId_type_oldDate ON timetable (profileId, type, oldDate)")
|
||||
}
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (c) Kacper Ziubryniewicz 2020-1-25
|
||||
*/
|
||||
|
||||
package pl.szczodrzynski.edziennik.data.db.migration
|
||||
|
||||
import androidx.room.migration.Migration
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
|
||||
class Migration76 : Migration(75, 76) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("ALTER TABLE feedbackMessages RENAME TO _feedbackMessages;")
|
||||
database.execSQL("CREATE TABLE feedbackMessages (\n" +
|
||||
"\tmessageId INTEGER NOT NULL PRIMARY KEY,\n" +
|
||||
"\treceived INTEGER NOT NULL,\n" +
|
||||
"\ttext TEXT NOT NULL,\n" +
|
||||
"\tsenderName TEXT NOT NULL,\n" +
|
||||
"\tdeviceId TEXT DEFAULT NULL,\n" +
|
||||
"\tdeviceName TEXT DEFAULT NULL,\n" +
|
||||
"\tdevId INTEGER DEFAULT NULL,\n" +
|
||||
"\tdevImage TEXT DEFAULT NULL,\n" +
|
||||
"\tsentTime INTEGER NOT NULL\n" +
|
||||
");")
|
||||
database.execSQL("INSERT INTO feedbackMessages (messageId, received, text, senderName, deviceId, deviceName, devId, devImage, sentTime)\n" +
|
||||
"SELECT messageId, received, text,\n" +
|
||||
"CASE fromUser IS NOT NULL WHEN 1 THEN CASE fromUserName IS NULL WHEN 1 THEN \"\" ELSE fromUserName END ELSE \"\" END AS senderName,\n" +
|
||||
"fromUser AS deviceId,\n" +
|
||||
"NULL AS deviceName,\n" +
|
||||
"CASE received AND fromUser IS NULL WHEN 1 THEN 100 ELSE NULL END AS devId,\n" +
|
||||
"NULL AS devImage,\n" +
|
||||
"sentTime\n" +
|
||||
"FROM _feedbackMessages;")
|
||||
database.execSQL("DROP TABLE _feedbackMessages;")
|
||||
}
|
||||
}
|
@ -5,18 +5,27 @@
|
||||
package pl.szczodrzynski.edziennik.data.firebase
|
||||
|
||||
import com.google.gson.JsonParser
|
||||
import kotlinx.coroutines.*
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import pl.szczodrzynski.edziennik.*
|
||||
import pl.szczodrzynski.edziennik.data.api.events.FeedbackMessageEvent
|
||||
import pl.szczodrzynski.edziennik.data.api.szkolny.response.Update
|
||||
import pl.szczodrzynski.edziennik.data.api.task.PostNotifications
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Event
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Metadata
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Notification
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.Profile
|
||||
import pl.szczodrzynski.edziennik.data.db.entity.*
|
||||
import pl.szczodrzynski.edziennik.sync.UpdateWorker
|
||||
import pl.szczodrzynski.edziennik.utils.models.Date
|
||||
import pl.szczodrzynski.edziennik.utils.models.Time
|
||||
import kotlin.coroutines.CoroutineContext
|
||||
|
||||
class SzkolnyAppFirebase(val app: App, val profiles: List<Profile>, val message: FirebaseService.Message) : CoroutineScope {
|
||||
companion object {
|
||||
private const val TAG = "SzkolnyAppFirebase"
|
||||
}
|
||||
|
||||
private val job = Job()
|
||||
override val coroutineContext: CoroutineContext
|
||||
get() = job + Dispatchers.Main
|
||||
|
||||
class SzkolnyAppFirebase(val app: App, val profiles: List<Profile>, val message: FirebaseService.Message) {
|
||||
init {
|
||||
run {
|
||||
val type = message.data.getString("type") ?: return@run
|
||||
@ -36,7 +45,11 @@ class SzkolnyAppFirebase(val app: App, val profiles: List<Profile>, val message:
|
||||
message.data.getString("title") ?: "",
|
||||
message.data.getString("message") ?: ""
|
||||
)
|
||||
"appUpdate" -> UpdateWorker.runNow(app, app.gson.fromJson(message.data.get("update"), Update::class.java))
|
||||
"appUpdate" -> launch { UpdateWorker.runNow(app, app.gson.fromJson(message.data.getString("update"), Update::class.java)) }
|
||||
"feedbackMessage" -> launch {
|
||||
val message = app.gson.fromJson(message.data.getString("message"), FeedbackMessage::class.java)
|
||||
feedbackMessage(message)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -54,6 +67,27 @@ class SzkolnyAppFirebase(val app: App, val profiles: List<Profile>, val message:
|
||||
PostNotifications(app, listOf(notification))
|
||||
}
|
||||
|
||||
private suspend fun feedbackMessage(message: FeedbackMessage) {
|
||||
if (message.deviceId == app.deviceId) {
|
||||
message.deviceId = null
|
||||
message.deviceName = null
|
||||
}
|
||||
withContext(Dispatchers.Default) {
|
||||
app.db.feedbackMessageDao().add(message)
|
||||
val notification = Notification(
|
||||
id = System.currentTimeMillis(),
|
||||
title = "Wiadomość od ${message.senderName}",
|
||||
text = message.text,
|
||||
type = Notification.TYPE_FEEDBACK_MESSAGE,
|
||||
profileId = null,
|
||||
profileName = "Wiadomość od ${message.senderName}"
|
||||
).addExtra("action", "feedbackMessage").addExtra("feedbackMessageDeviceId", message.deviceId)
|
||||
app.db.notificationDao().add(notification)
|
||||
PostNotifications(app, listOf(notification))
|
||||
}
|
||||
EventBus.getDefault().postSticky(FeedbackMessageEvent(message))
|
||||
}
|
||||
|
||||
private fun sharedEvent(teamCode: String, jsonStr: String, message: String) {
|
||||
val json = JsonParser().parse(jsonStr).asJsonObject
|
||||
val teams = app.db.teamDao().allNow
|
||||
@ -151,4 +185,4 @@ class SzkolnyAppFirebase(val app: App, val profiles: List<Profile>, val message:
|
||||
app.db.notificationDao().addAll(notificationList)
|
||||
PostNotifications(app, notificationList)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user