From 6113ab55b88f1ceeb3f15da70fabf1dc0b8bc7f5 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 20 Feb 2022 19:16:22 +0100 Subject: [PATCH] adding some initial task related code --- .../calendar/pro/databases/EventsDatabase.kt | 16 ++++++- .../calendar/pro/extensions/Context.kt | 2 + .../calendar/pro/helpers/Constants.kt | 2 +- .../calendar/pro/interfaces/TasksDao.kt | 16 +++++++ .../calendar/pro/models/Event.kt | 9 ++-- .../calendar/pro/models/Task.kt | 47 +++++++++++++++++++ 6 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/calendar/pro/interfaces/TasksDao.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/Task.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/databases/EventsDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/databases/EventsDatabase.kt index cce6564c5..0f29d761c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/databases/EventsDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/databases/EventsDatabase.kt @@ -13,13 +13,15 @@ import com.simplemobiletools.calendar.pro.helpers.Converters import com.simplemobiletools.calendar.pro.helpers.REGULAR_EVENT_TYPE_ID import com.simplemobiletools.calendar.pro.interfaces.EventTypesDao import com.simplemobiletools.calendar.pro.interfaces.EventsDao +import com.simplemobiletools.calendar.pro.interfaces.TasksDao import com.simplemobiletools.calendar.pro.interfaces.WidgetsDao import com.simplemobiletools.calendar.pro.models.Event import com.simplemobiletools.calendar.pro.models.EventType +import com.simplemobiletools.calendar.pro.models.Task import com.simplemobiletools.calendar.pro.models.Widget import java.util.concurrent.Executors -@Database(entities = [Event::class, EventType::class, Widget::class], version = 5) +@Database(entities = [Event::class, EventType::class, Widget::class, Task::class], version = 6) @TypeConverters(Converters::class) abstract class EventsDatabase : RoomDatabase() { @@ -29,6 +31,8 @@ abstract class EventsDatabase : RoomDatabase() { abstract fun WidgetsDao(): WidgetsDao + abstract fun TasksDao(): TasksDao + companion object { private var db: EventsDatabase? = null @@ -47,6 +51,7 @@ abstract class EventsDatabase : RoomDatabase() { .addMigrations(MIGRATION_2_3) .addMigrations(MIGRATION_3_4) .addMigrations(MIGRATION_4_5) + .addMigrations(MIGRATION_5_6) .build() db!!.openHelper.setWriteAheadLoggingEnabled(true) } @@ -103,5 +108,14 @@ abstract class EventsDatabase : RoomDatabase() { } } } + + private val MIGRATION_5_6 = object : Migration(5, 6) { + override fun migrate(database: SupportSQLiteDatabase) { + database.apply { + execSQL("CREATE TABLE IF NOT EXISTS `tasks` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `start_ts` INTEGER NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `import_id` TEXT NOT NULL, `time_zone` TEXT NOT NULL, `flags` INTEGER NOT NULL, `event_type` INTEGER NOT NULL, `last_updated` INTEGER NOT NULL, `source` TEXT NOT NULL, `color` INTEGER NOT NULL)") + execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `index_tasks_id` ON `tasks` (`id`)") + } + } + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt index 9f5d9d5f7..d26210a18 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/extensions/Context.kt @@ -32,6 +32,7 @@ import com.simplemobiletools.calendar.pro.helpers.* import com.simplemobiletools.calendar.pro.helpers.Formatter import com.simplemobiletools.calendar.pro.interfaces.EventTypesDao import com.simplemobiletools.calendar.pro.interfaces.EventsDao +import com.simplemobiletools.calendar.pro.interfaces.TasksDao import com.simplemobiletools.calendar.pro.interfaces.WidgetsDao import com.simplemobiletools.calendar.pro.models.* import com.simplemobiletools.calendar.pro.receivers.CalDAVSyncReceiver @@ -48,6 +49,7 @@ val Context.config: Config get() = Config.newInstance(applicationContext) val Context.eventsDB: EventsDao get() = EventsDatabase.getInstance(applicationContext).EventsDao() val Context.eventTypesDB: EventTypesDao get() = EventsDatabase.getInstance(applicationContext).EventTypesDao() val Context.widgetsDB: WidgetsDao get() = EventsDatabase.getInstance(applicationContext).WidgetsDao() +val Context.tasksDB: TasksDao get() = EventsDatabase.getInstance(applicationContext).TasksDao() val Context.eventsHelper: EventsHelper get() = EventsHelper(this) val Context.calDAVHelper: CalDAVHelper get() = CalDAVHelper(this) diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt index 6e8991ec8..df491551f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/helpers/Constants.kt @@ -113,7 +113,7 @@ const val REPEAT_ORDER_WEEKDAY = 4 // i.e. every 4th sunday // special event flags const val FLAG_ALL_DAY = 1 -const val FLAG_IS_PAST_EVENT = 2 +const val FLAG_IS_IN_PAST = 2 const val FLAG_MISSING_YEAR = 4 // constants related to ICS file exporting / importing diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/interfaces/TasksDao.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/interfaces/TasksDao.kt new file mode 100644 index 000000000..94a4dc179 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/interfaces/TasksDao.kt @@ -0,0 +1,16 @@ +package com.simplemobiletools.calendar.pro.interfaces + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.simplemobiletools.calendar.pro.models.Task + +@Dao +interface TasksDao { + @Query("SELECT * FROM tasks") + fun getAllTasks(): List + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertOrUpdate(task: Task): Long +} diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/Event.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/Event.kt index 374e459e8..c28ca42f1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/Event.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/Event.kt @@ -39,7 +39,7 @@ data class Event( @ColumnInfo(name = "last_updated") var lastUpdated: Long = 0L, @ColumnInfo(name = "source") var source: String = SOURCE_SIMPLE_CALENDAR, @ColumnInfo(name = "availability") var availability: Int = 0, - var color: Int = 0, + @ColumnInfo(name = "color") var color: Int = 0 ) : Serializable { companion object { @@ -48,8 +48,7 @@ data class Event( fun addIntervalTime(original: Event) { val oldStart = Formatter.getDateTimeFromTS(startTS) - val newStart: DateTime - newStart = when (repeatInterval) { + val newStart = when (repeatInterval) { DAY -> oldStart.plusDays(1) else -> { when { @@ -192,9 +191,9 @@ data class Event( } var isPastEvent: Boolean - get() = flags and FLAG_IS_PAST_EVENT != 0 + get() = flags and FLAG_IS_IN_PAST != 0 set(isPastEvent) { - flags = flags.addBitIf(isPastEvent, FLAG_IS_PAST_EVENT) + flags = flags.addBitIf(isPastEvent, FLAG_IS_IN_PAST) } fun getTimeZoneString(): String { diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/Task.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/Task.kt new file mode 100644 index 000000000..6cf96f265 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/pro/models/Task.kt @@ -0,0 +1,47 @@ +package com.simplemobiletools.calendar.pro.models + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Index +import androidx.room.PrimaryKey +import com.simplemobiletools.calendar.pro.extensions.seconds +import com.simplemobiletools.calendar.pro.helpers.* +import com.simplemobiletools.commons.extensions.addBitIf +import java.io.Serializable + +@Entity(tableName = "tasks", indices = [(Index(value = ["id"], unique = true))]) +data class Task( + @PrimaryKey(autoGenerate = true) var id: Long?, + @ColumnInfo(name = "start_ts") var startTS: Long = 0L, + @ColumnInfo(name = "title") var title: String = "", + @ColumnInfo(name = "description") var description: String = "", + @ColumnInfo(name = "import_id") var importId: String = "", + @ColumnInfo(name = "time_zone") var timeZone: String = "", + @ColumnInfo(name = "flags") var flags: Int = 0, + @ColumnInfo(name = "event_type") var eventType: Long = REGULAR_EVENT_TYPE_ID, + @ColumnInfo(name = "last_updated") var lastUpdated: Long = 0L, + @ColumnInfo(name = "source") var source: String = SOURCE_SIMPLE_CALENDAR, + @ColumnInfo(name = "color") var color: Int = 0 +) : Serializable { + + companion object { + private const val serialVersionUID = -32456795132345616L + } + + fun getIsAllDay() = flags and FLAG_ALL_DAY != 0 + + // properly return the start time of all-day tasks as midnight + fun getTaskStartTS(): Long { + return if (getIsAllDay()) { + Formatter.getDateTimeFromTS(startTS).withTime(0, 0, 0, 0).seconds() + } else { + startTS + } + } + + var isPastTask: Boolean + get() = flags and FLAG_IS_IN_PAST != 0 + set(isPastTask) { + flags = flags.addBitIf(isPastTask, FLAG_IS_IN_PAST) + } +}