[Agenda] Add e-learning event type and DB migration.

This commit is contained in:
Kuba Szczodrzyński 2021-04-19 14:18:28 +02:00
parent 99021f6b3a
commit a31c68e87a
No known key found for this signature in database
GPG Key ID: 70CB8A85BA1633CB
8 changed files with 169 additions and 74 deletions

View File

@ -5,6 +5,7 @@
<w>ciasteczko</w> <w>ciasteczko</w>
<w>csrf</w> <w>csrf</w>
<w>edziennik</w> <w>edziennik</w>
<w>elearning</w>
<w>gson</w> <w>gson</w>
<w>hebe</w> <w>hebe</w>
<w>idziennik</w> <w>idziennik</w>

View File

@ -43,7 +43,7 @@ import pl.szczodrzynski.edziennik.data.db.migration.*
LibrusLesson::class, LibrusLesson::class,
TimetableManual::class, TimetableManual::class,
Metadata::class Metadata::class
], version = 91) ], version = 92)
@TypeConverters( @TypeConverters(
ConverterTime::class, ConverterTime::class,
ConverterDate::class, ConverterDate::class,
@ -176,7 +176,8 @@ abstract class AppDb : RoomDatabase() {
Migration88(), Migration88(),
Migration89(), Migration89(),
Migration90(), Migration90(),
Migration91() Migration91(),
Migration92()
).allowMainThreadQueries().build() ).allowMainThreadQueries().build()
} }
} }

View File

@ -9,30 +9,9 @@ import androidx.room.Dao
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy import androidx.room.OnConflictStrategy
import androidx.room.Query import androidx.room.Query
import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_CLASS_EVENT
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_DEFAULT import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_DEFAULT
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_ESSAY
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_EXAM
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_EXCURSION
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_HOMEWORK
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_INFORMATION
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_PROJECT
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_PT_MEETING
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_READING
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_SHORT_QUIZ
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_CLASS_EVENT
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_DEFAULT
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_ESSAY
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_EXAM
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_EXCURSION
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_HOMEWORK
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_INFORMATION
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_PROJECT
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_PT_MEETING
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_READING
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_SHORT_QUIZ
import pl.szczodrzynski.edziennik.data.db.entity.EventType import pl.szczodrzynski.edziennik.data.db.entity.EventType
import pl.szczodrzynski.edziennik.data.db.entity.EventType.Companion.SOURCE_DEFAULT
@Dao @Dao
abstract class EventTypeDao { abstract class EventTypeDao {
@ -58,19 +37,18 @@ abstract class EventTypeDao {
abstract val allNow: List<EventType> abstract val allNow: List<EventType>
fun addDefaultTypes(context: Context, profileId: Int): List<EventType> { fun addDefaultTypes(context: Context, profileId: Int): List<EventType> {
val typeList = listOf( var order = 100
EventType(profileId, TYPE_HOMEWORK, context.getString(R.string.event_type_homework), COLOR_HOMEWORK), val colorMap = EventType.getTypeColorMap()
EventType(profileId, TYPE_DEFAULT, context.getString(R.string.event_other), COLOR_DEFAULT), val typeList = EventType.getTypeNameMap().map { (id, name) ->
EventType(profileId, TYPE_EXAM, context.getString(R.string.event_exam), COLOR_EXAM), EventType(
EventType(profileId, TYPE_SHORT_QUIZ, context.getString(R.string.event_short_quiz), COLOR_SHORT_QUIZ), profileId = profileId,
EventType(profileId, TYPE_ESSAY, context.getString(R.string.event_essay), COLOR_ESSAY), id = id,
EventType(profileId, TYPE_PROJECT, context.getString(R.string.event_project), COLOR_PROJECT), name = context.getString(name),
EventType(profileId, TYPE_PT_MEETING, context.getString(R.string.event_pt_meeting), COLOR_PT_MEETING), color = colorMap[id] ?: COLOR_DEFAULT,
EventType(profileId, TYPE_EXCURSION, context.getString(R.string.event_excursion), COLOR_EXCURSION), order = order++,
EventType(profileId, TYPE_READING, context.getString(R.string.event_reading), COLOR_READING), source = SOURCE_DEFAULT
EventType(profileId, TYPE_CLASS_EVENT, context.getString(R.string.event_class_event), COLOR_CLASS_EVENT), )
EventType(profileId, TYPE_INFORMATION, context.getString(R.string.event_information), COLOR_INFORMATION) }
)
addAll(typeList) addAll(typeList)
return typeList return typeList
} }

View File

@ -45,6 +45,7 @@ open class Event(
var addedDate: Long = System.currentTimeMillis() var addedDate: Long = System.currentTimeMillis()
) : Keepable() { ) : Keepable() {
companion object { companion object {
const val TYPE_ELEARNING = -5L
const val TYPE_UNDEFINED = -2L const val TYPE_UNDEFINED = -2L
const val TYPE_HOMEWORK = -1L const val TYPE_HOMEWORK = -1L
const val TYPE_DEFAULT = 0L const val TYPE_DEFAULT = 0L
@ -57,7 +58,7 @@ open class Event(
const val TYPE_READING = 7L const val TYPE_READING = 7L
const val TYPE_CLASS_EVENT = 8L const val TYPE_CLASS_EVENT = 8L
const val TYPE_INFORMATION = 9L const val TYPE_INFORMATION = 9L
const val TYPE_TEACHER_ABSENCE = 10L const val COLOR_ELEARNING = 0xfff57f17.toInt()
const val COLOR_HOMEWORK = 0xff795548.toInt() const val COLOR_HOMEWORK = 0xff795548.toInt()
const val COLOR_DEFAULT = 0xffffc107.toInt() const val COLOR_DEFAULT = 0xffffc107.toInt()
const val COLOR_EXAM = 0xfff44336.toInt() const val COLOR_EXAM = 0xfff44336.toInt()
@ -69,7 +70,6 @@ open class Event(
const val COLOR_READING = 0xFFFFEB3B.toInt() const val COLOR_READING = 0xFFFFEB3B.toInt()
const val COLOR_CLASS_EVENT = 0xff388e3c.toInt() const val COLOR_CLASS_EVENT = 0xff388e3c.toInt()
const val COLOR_INFORMATION = 0xff039be5.toInt() const val COLOR_INFORMATION = 0xff039be5.toInt()
const val COLOR_TEACHER_ABSENCE = 0xff039be5.toInt()
} }
@ColumnInfo(name = "eventAddedManually") @ColumnInfo(name = "eventAddedManually")

View File

@ -1,35 +0,0 @@
/*
* Copyright (c) Kacper Ziubryniewicz 2020-1-6
*/
package pl.szczodrzynski.edziennik.data.db.entity;
import android.graphics.Color;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
@Entity(tableName = "eventTypes",
primaryKeys = {"profileId", "eventType"})
public class EventType {
public int profileId;
@ColumnInfo(name = "eventType")
public long id;
@ColumnInfo(name = "eventTypeName")
public String name;
@ColumnInfo(name = "eventTypeColor")
public int color;
public EventType(int profileId, long id, String name, int color) {
this.profileId = profileId;
this.id = id;
this.name = name;
this.color = color;
}
public EventType(int profileId, int id, String name, String color) {
this(profileId, id, name, Color.parseColor(color));
}
}

View File

@ -0,0 +1,89 @@
/*
* Copyright (c) Kuba Szczodrzyński 2021-4-19.
*/
package pl.szczodrzynski.edziennik.data.db.entity
import androidx.room.ColumnInfo
import androidx.room.Entity
import pl.szczodrzynski.edziennik.R
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_CLASS_EVENT
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_DEFAULT
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_ELEARNING
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_ESSAY
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_EXAM
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_EXCURSION
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_HOMEWORK
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_INFORMATION
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_PROJECT
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_PT_MEETING
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_READING
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_SHORT_QUIZ
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_CLASS_EVENT
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_DEFAULT
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_ELEARNING
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_ESSAY
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_EXAM
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_EXCURSION
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_HOMEWORK
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_INFORMATION
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_PROJECT
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_PT_MEETING
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_READING
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_SHORT_QUIZ
@Entity(
tableName = "eventTypes",
primaryKeys = ["profileId", "eventType"]
)
class EventType(
val profileId: Int,
@ColumnInfo(name = "eventType")
val id: Long,
@ColumnInfo(name = "eventTypeName")
val name: String,
@ColumnInfo(name = "eventTypeColor")
val color: Int,
@ColumnInfo(name = "eventTypeOrder")
var order: Int = id.toInt(),
@ColumnInfo(name = "eventTypeSource")
val source: Int = SOURCE_REGISTER
) {
companion object {
const val SOURCE_DEFAULT = 0
const val SOURCE_REGISTER = 1
const val SOURCE_CUSTOM = 2
const val SOURCE_SHARED = 3
fun getTypeColorMap() = mapOf(
TYPE_ELEARNING to COLOR_ELEARNING,
TYPE_HOMEWORK to COLOR_HOMEWORK,
TYPE_DEFAULT to COLOR_DEFAULT,
TYPE_EXAM to COLOR_EXAM,
TYPE_SHORT_QUIZ to COLOR_SHORT_QUIZ,
TYPE_ESSAY to COLOR_ESSAY,
TYPE_PROJECT to COLOR_PROJECT,
TYPE_PT_MEETING to COLOR_PT_MEETING,
TYPE_EXCURSION to COLOR_EXCURSION,
TYPE_READING to COLOR_READING,
TYPE_CLASS_EVENT to COLOR_CLASS_EVENT,
TYPE_INFORMATION to COLOR_INFORMATION
)
fun getTypeNameMap() = mapOf(
TYPE_ELEARNING to R.string.event_type_elearning,
TYPE_HOMEWORK to R.string.event_type_homework,
TYPE_DEFAULT to R.string.event_other,
TYPE_EXAM to R.string.event_exam,
TYPE_SHORT_QUIZ to R.string.event_short_quiz,
TYPE_ESSAY to R.string.event_essay,
TYPE_PROJECT to R.string.event_project,
TYPE_PT_MEETING to R.string.event_pt_meeting,
TYPE_EXCURSION to R.string.event_excursion,
TYPE_READING to R.string.event_reading,
TYPE_CLASS_EVENT to R.string.event_class_event,
TYPE_INFORMATION to R.string.event_information
)
}
}

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) Kuba Szczodrzyński 2021-4-15.
*/
package pl.szczodrzynski.edziennik.data.db.migration
import android.content.ContentValues
import android.database.sqlite.SQLiteDatabase
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.COLOR_ELEARNING
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_ELEARNING
import pl.szczodrzynski.edziennik.data.db.entity.Event.Companion.TYPE_INFORMATION
import pl.szczodrzynski.edziennik.data.db.entity.EventType.Companion.SOURCE_DEFAULT
import pl.szczodrzynski.edziennik.data.db.entity.EventType.Companion.SOURCE_REGISTER
import pl.szczodrzynski.edziennik.getInt
class Migration92 : Migration(91, 92) {
override fun migrate(database: SupportSQLiteDatabase) {
// make eventTypeName not nullable
database.execSQL("ALTER TABLE eventTypes RENAME TO _eventTypes;")
database.execSQL("CREATE TABLE eventTypes (" +
"profileId INTEGER NOT NULL, " +
"eventType INTEGER NOT NULL, " +
"eventTypeName TEXT NOT NULL, " +
"eventTypeColor INTEGER NOT NULL, " +
"PRIMARY KEY(profileId,eventType)" +
");")
database.execSQL("INSERT INTO eventTypes " +
"(profileId, eventType, eventTypeName, eventTypeColor) " +
"SELECT profileId, eventType, eventTypeName, eventTypeColor " +
"FROM _eventTypes;")
database.execSQL("DROP TABLE _eventTypes;")
// add columns for order and source
database.execSQL("ALTER TABLE eventTypes ADD COLUMN eventTypeOrder INTEGER NOT NULL DEFAULT 0;")
database.execSQL("ALTER TABLE eventTypes ADD COLUMN eventTypeSource INTEGER NOT NULL DEFAULT 0;")
// migrate existing types to show correct order and source
database.execSQL("UPDATE eventTypes SET eventTypeOrder = eventType + 102;")
database.execSQL("UPDATE eventTypes SET eventTypeSource = $SOURCE_REGISTER WHERE eventType > $TYPE_INFORMATION;")
// add new e-learning type
val cursor = database.query("SELECT profileId FROM profiles;")
cursor.use {
while (it.moveToNext()) {
val values = ContentValues().apply {
put("profileId", it.getInt("profileId"))
put("eventType", TYPE_ELEARNING)
put("eventTypeName", "lekcja online")
put("eventTypeColor", COLOR_ELEARNING)
put("eventTypeOrder", 100)
put("eventTypeSource", SOURCE_DEFAULT)
}
database.insert("eventTypes", SQLiteDatabase.CONFLICT_REPLACE, values)
}
}
}
}

View File

@ -1450,4 +1450,5 @@
<string name="messages_config_greeting_on_forward">Dodaj podpis przy przekazywaniu wiadomości</string> <string name="messages_config_greeting_on_forward">Dodaj podpis przy przekazywaniu wiadomości</string>
<string name="messages_config_greeting_text">Treść podpisu</string> <string name="messages_config_greeting_text">Treść podpisu</string>
<string name="menu_messages_config">Ustawienia wiadomości</string> <string name="menu_messages_config">Ustawienia wiadomości</string>
<string name="event_type_elearning">lekcja online</string>
</resources> </resources>