diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRunningRecordTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRunningRecordTest.kt index 938cf476..c4eb04bb 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRunningRecordTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRunningRecordTest.kt @@ -65,6 +65,7 @@ class ChangeRunningRecordTest : BaseUiTest() { idData = RecordTypeGoal.IdData.Type(0), range = RecordTypeGoal.Range.Session, type = RecordTypeGoal.Type.Duration(firstGoalTime), + daysOfWeek = emptyList(), ), ), ) diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/GoalsTestUtils.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/GoalsTestUtils.kt index c4af1882..c0cc53f3 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/GoalsTestUtils.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/GoalsTestUtils.kt @@ -153,6 +153,7 @@ object GoalsTestUtils { idData = RecordTypeGoal.IdData.Type(0), range = range, type = RecordTypeGoal.Type.Duration(duration), + daysOfWeek = emptyList(), ) } @@ -172,6 +173,7 @@ object GoalsTestUtils { idData = RecordTypeGoal.IdData.Type(0), range = range, type = RecordTypeGoal.Type.Count(count), + daysOfWeek = emptyList(), ) } diff --git a/app/src/androidTest/java/com/example/util/simpletimetracker/StartRecordTest.kt b/app/src/androidTest/java/com/example/util/simpletimetracker/StartRecordTest.kt index 4a4ae9bd..7703f7e7 100644 --- a/app/src/androidTest/java/com/example/util/simpletimetracker/StartRecordTest.kt +++ b/app/src/androidTest/java/com/example/util/simpletimetracker/StartRecordTest.kt @@ -49,6 +49,7 @@ class StartRecordTest : BaseUiTest() { idData = RecordTypeGoal.IdData.Type(0), range = RecordTypeGoal.Range.Session, type = RecordTypeGoal.Type.Duration(firstGoalTime), + daysOfWeek = emptyList(), ), ), ) diff --git a/data_local/schemas/com.example.util.simpletimetracker.data_local.database.AppDatabase/14.json b/data_local/schemas/com.example.util.simpletimetracker.data_local.database.AppDatabase/14.json index fd0a5e6c..e3816b44 100644 --- a/data_local/schemas/com.example.util.simpletimetracker.data_local.database.AppDatabase/14.json +++ b/data_local/schemas/com.example.util.simpletimetracker.data_local.database.AppDatabase/14.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 14, - "identityHash": "95f9a9f086685a7de20f81ec89b22152", + "identityHash": "e76a83355164c99ed34b5e958b5c90a6", "entities": [ { "tableName": "records", @@ -395,7 +395,7 @@ }, { "tableName": "recordTypeGoals", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type_id` INTEGER NOT NULL, `range` INTEGER NOT NULL, `type` INTEGER NOT NULL, `value` INTEGER NOT NULL, `category_id` INTEGER NOT NULL)", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type_id` INTEGER NOT NULL, `range` INTEGER NOT NULL, `type` INTEGER NOT NULL, `value` INTEGER NOT NULL, `category_id` INTEGER NOT NULL, `days_of_week` TEXT NOT NULL)", "fields": [ { "fieldPath": "id", @@ -432,6 +432,12 @@ "columnName": "category_id", "affinity": "INTEGER", "notNull": true + }, + { + "fieldPath": "daysOfWeek", + "columnName": "days_of_week", + "affinity": "TEXT", + "notNull": true } ], "primaryKey": { @@ -447,7 +453,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '95f9a9f086685a7de20f81ec89b22152')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e76a83355164c99ed34b5e958b5c90a6')" ] } } \ No newline at end of file diff --git a/data_local/schemas/com.example.util.simpletimetracker.data_local.database.AppDatabase/15.json b/data_local/schemas/com.example.util.simpletimetracker.data_local.database.AppDatabase/15.json new file mode 100644 index 00000000..0223235d --- /dev/null +++ b/data_local/schemas/com.example.util.simpletimetracker.data_local.database.AppDatabase/15.json @@ -0,0 +1,459 @@ +{ + "formatVersion": 1, + "database": { + "version": 15, + "identityHash": "e76a83355164c99ed34b5e958b5c90a6", + "entities": [ + { + "tableName": "records", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type_id` INTEGER NOT NULL, `time_started` INTEGER NOT NULL, `time_ended` INTEGER NOT NULL, `comment` TEXT NOT NULL, `tag_id` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "typeId", + "columnName": "type_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeStarted", + "columnName": "time_started", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeEnded", + "columnName": "time_ended", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "tagId", + "columnName": "tag_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "recordTypes", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `icon` TEXT NOT NULL, `color` INTEGER NOT NULL, `color_int` TEXT NOT NULL, `hidden` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "icon", + "columnName": "icon", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "colorInt", + "columnName": "color_int", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "hidden", + "columnName": "hidden", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "runningRecords", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `time_started` INTEGER NOT NULL, `comment` TEXT NOT NULL, `tag_id` INTEGER NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timeStarted", + "columnName": "time_started", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "tagId", + "columnName": "tag_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "categories", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `color` INTEGER NOT NULL, `color_int` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "colorInt", + "columnName": "color_int", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "recordTypeCategory", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`record_type_id` INTEGER NOT NULL, `category_id` INTEGER NOT NULL, PRIMARY KEY(`record_type_id`, `category_id`))", + "fields": [ + { + "fieldPath": "recordTypeId", + "columnName": "record_type_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "categoryId", + "columnName": "category_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "record_type_id", + "category_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "recordTags", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type_id` INTEGER NOT NULL, `name` TEXT NOT NULL, `color` INTEGER NOT NULL, `color_int` TEXT NOT NULL, `archived` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "typeId", + "columnName": "type_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "colorInt", + "columnName": "color_int", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "archived", + "columnName": "archived", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "recordToRecordTag", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`record_id` INTEGER NOT NULL, `record_tag_id` INTEGER NOT NULL, PRIMARY KEY(`record_id`, `record_tag_id`))", + "fields": [ + { + "fieldPath": "recordId", + "columnName": "record_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "recordTagId", + "columnName": "record_tag_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "record_id", + "record_tag_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "runningRecordToRecordTag", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`running_record_id` INTEGER NOT NULL, `record_tag_id` INTEGER NOT NULL, PRIMARY KEY(`running_record_id`, `record_tag_id`))", + "fields": [ + { + "fieldPath": "runningRecordId", + "columnName": "running_record_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "recordTagId", + "columnName": "record_tag_id", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "running_record_id", + "record_tag_id" + ], + "autoGenerate": false + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "activityFilters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `selectedIds` TEXT NOT NULL, `type` INTEGER NOT NULL, `name` TEXT NOT NULL, `color` INTEGER NOT NULL, `color_int` TEXT NOT NULL, `selected` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "selectedIds", + "columnName": "selectedIds", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "colorInt", + "columnName": "color_int", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "selected", + "columnName": "selected", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "favouriteComments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `comment` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "recordTypeGoals", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type_id` INTEGER NOT NULL, `range` INTEGER NOT NULL, `type` INTEGER NOT NULL, `value` INTEGER NOT NULL, `category_id` INTEGER NOT NULL, `days_of_week` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "typeId", + "columnName": "type_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "range", + "columnName": "range", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "categoryId", + "columnName": "category_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "daysOfWeek", + "columnName": "days_of_week", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e76a83355164c99ed34b5e958b5c90a6')" + ] + } +} \ No newline at end of file diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/database/AppDatabase.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/database/AppDatabase.kt index 320e8f86..ff24c5ec 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/database/AppDatabase.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/database/AppDatabase.kt @@ -28,7 +28,7 @@ import com.example.util.simpletimetracker.data_local.model.RunningRecordToRecord FavouriteCommentDBO::class, RecordTypeGoalDBO::class, ], - version = 14, + version = 15, exportSchema = true, ) abstract class AppDatabase : RoomDatabase() { diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/database/AppDatabaseMigrations.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/database/AppDatabaseMigrations.kt index 6a7d412e..fc9093a3 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/database/AppDatabaseMigrations.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/database/AppDatabaseMigrations.kt @@ -21,6 +21,7 @@ class AppDatabaseMigrations { migration_11_12, migration_12_13, migration_13_14, + migration_14_15, ) private val migration_1_2 = object : Migration(1, 2) { @@ -192,5 +193,13 @@ class AppDatabaseMigrations { ) } } + + private val migration_14_15 = object : Migration(14, 15) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL( + "ALTER TABLE recordTypeGoals ADD COLUMN days_of_week TEXT NOT NULL DEFAULT ''", + ) + } + } } } \ No newline at end of file diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/RecordTypeGoalDataLocalMapper.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/RecordTypeGoalDataLocalMapper.kt index 5c53a15c..8d983461 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/RecordTypeGoalDataLocalMapper.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/RecordTypeGoalDataLocalMapper.kt @@ -2,6 +2,7 @@ package com.example.util.simpletimetracker.data_local.mapper import com.example.util.simpletimetracker.data_local.model.RecordTypeGoalDBO import com.example.util.simpletimetracker.domain.extension.orZero +import com.example.util.simpletimetracker.domain.model.DayOfWeek import com.example.util.simpletimetracker.domain.model.RecordTypeGoal import javax.inject.Inject @@ -27,6 +28,7 @@ class RecordTypeGoalDataLocalMapper @Inject constructor() { 1L -> RecordTypeGoal.Type.Count(dbo.value) else -> RecordTypeGoal.Type.Duration(dbo.value) }, + daysOfWeek = mapDaysOfWeek(dbo.daysOfWeek), ) } @@ -46,6 +48,39 @@ class RecordTypeGoalDataLocalMapper @Inject constructor() { }, value = domain.type.value, categoryId = (domain.idData as? RecordTypeGoal.IdData.Category)?.value.orZero(), + daysOfWeek = mapDaysOfWeek(domain.daysOfWeek), + ) + } + + fun mapDaysOfWeek(dbo: String): List { + return daysOfWeek.mapIndexedNotNull { index, dayOfWeek -> + when (dbo.getOrNull(index)) { + // Selected days are marked with 1, days that are not selected - with 0, + // if string is empty - assume day is selected to support old app versions. + '1' -> dayOfWeek + null -> dayOfWeek + '0' -> null + else -> null + } + } + } + + fun mapDaysOfWeek(domain: List): String { + return daysOfWeek.map { dayOfWeek -> + if (dayOfWeek in domain) '1' else '0' + }.joinToString(separator = "") + } + + companion object { + // Do not change order, this values saved in database accordingly. + private val daysOfWeek = listOf( + DayOfWeek.SUNDAY, + DayOfWeek.MONDAY, + DayOfWeek.TUESDAY, + DayOfWeek.WEDNESDAY, + DayOfWeek.THURSDAY, + DayOfWeek.FRIDAY, + DayOfWeek.SATURDAY, ) } } \ No newline at end of file diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/RecordTypeGoalDBO.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/RecordTypeGoalDBO.kt index 9f8fca8f..5fe54fa7 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/RecordTypeGoalDBO.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/RecordTypeGoalDBO.kt @@ -33,4 +33,11 @@ data class RecordTypeGoalDBO( // Only one of typeId or categoryId should be present, other should be 0. @ColumnInfo(name = "category_id") val categoryId: Long, + + // Stored as "0000000" string, where each number is a day, + // 0 - not selected, 1 - selected, + // starting from sunday. + // For example, "1111100" - only work days selected. + @ColumnInfo(name = "days_of_week") + val daysOfWeek: String, ) \ No newline at end of file diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/resolver/BackupRepoImpl.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/resolver/BackupRepoImpl.kt index b96b019a..f5bae8e2 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/resolver/BackupRepoImpl.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/resolver/BackupRepoImpl.kt @@ -5,11 +5,13 @@ import android.net.Uri import android.os.ParcelFileDescriptor import com.example.util.simpletimetracker.core.R import com.example.util.simpletimetracker.core.repo.ResourceRepo +import com.example.util.simpletimetracker.data_local.mapper.RecordTypeGoalDataLocalMapper import com.example.util.simpletimetracker.domain.extension.orZero import com.example.util.simpletimetracker.domain.interactor.ClearDataInteractor import com.example.util.simpletimetracker.domain.model.ActivityFilter import com.example.util.simpletimetracker.domain.model.AppColor import com.example.util.simpletimetracker.domain.model.Category +import com.example.util.simpletimetracker.domain.model.DayOfWeek import com.example.util.simpletimetracker.domain.model.FavouriteComment import com.example.util.simpletimetracker.domain.model.Record import com.example.util.simpletimetracker.domain.model.RecordTag @@ -57,6 +59,7 @@ class BackupRepoImpl @Inject constructor( private val recordTypeGoalRepo: RecordTypeGoalRepo, private val clearDataInteractor: ClearDataInteractor, private val resourceRepo: ResourceRepo, + private val recordTypeGoalDataLocalMapper: RecordTypeGoalDataLocalMapper, ) : BackupRepo { override suspend fun saveBackupFile( @@ -340,15 +343,18 @@ class BackupRepoImpl @Inject constructor( is RecordTypeGoal.Type.Duration -> 0L is RecordTypeGoal.Type.Count -> 1L }.toString() + val daysOfWeekString = recordTypeGoalDataLocalMapper + .mapDaysOfWeek(recordTypeGoal.daysOfWeek) return String.format( - "$ROW_RECORD_TYPE_GOAL\t%s\t%s\t%s\t%s\t%s\t%s\n", + "$ROW_RECORD_TYPE_GOAL\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", recordTypeGoal.id.toString(), (recordTypeGoal.idData as? RecordTypeGoal.IdData.Type)?.value.orZero(), rangeString, typeString, recordTypeGoal.type.value.toString(), (recordTypeGoal.idData as? RecordTypeGoal.IdData.Category)?.value.orZero(), + daysOfWeekString, ) } @@ -360,6 +366,8 @@ class BackupRepoImpl @Inject constructor( val dailyGoalTime = parts.getOrNull(8)?.toLongOrNull().orZero() val weeklyGoalTime = parts.getOrNull(9)?.toLongOrNull().orZero() val monthlyGoalTime = parts.getOrNull(10)?.toLongOrNull().orZero() + // Didn't exist when goal time was in type db, no need to migrate. + val daysOfWeek = emptyList() val goalTimes = mutableListOf().apply { if (goalTime != 0L) { @@ -368,6 +376,7 @@ class BackupRepoImpl @Inject constructor( idData = RecordTypeGoal.IdData.Type(typeId), range = RecordTypeGoal.Range.Session, type = RecordTypeGoal.Type.Duration(goalTime), + daysOfWeek = daysOfWeek, ).let(::add) } if (dailyGoalTime != 0L) { @@ -375,6 +384,7 @@ class BackupRepoImpl @Inject constructor( idData = RecordTypeGoal.IdData.Type(typeId), range = RecordTypeGoal.Range.Daily, type = RecordTypeGoal.Type.Duration(dailyGoalTime), + daysOfWeek = daysOfWeek, ).let(::add) } if (weeklyGoalTime != 0L) { @@ -382,6 +392,7 @@ class BackupRepoImpl @Inject constructor( idData = RecordTypeGoal.IdData.Type(typeId), range = RecordTypeGoal.Range.Weekly, type = RecordTypeGoal.Type.Duration(weeklyGoalTime), + daysOfWeek = daysOfWeek, ).let(::add) } if (monthlyGoalTime != 0L) { @@ -389,6 +400,7 @@ class BackupRepoImpl @Inject constructor( idData = RecordTypeGoal.IdData.Type(typeId), range = RecordTypeGoal.Range.Monthly, type = RecordTypeGoal.Type.Duration(monthlyGoalTime), + daysOfWeek = daysOfWeek, ).let(::add) } } @@ -502,6 +514,7 @@ class BackupRepoImpl @Inject constructor( private fun recordTypeGoalFromBackupString(parts: List): RecordTypeGoal { val typeId = parts.getOrNull(2)?.toLongOrNull().orZero() val categoryId = parts.getOrNull(6)?.toLongOrNull().orZero() + val daysOfWeekString = parts.getOrNull(7).orEmpty() return RecordTypeGoal( id = parts.getOrNull(1)?.toLongOrNull().orZero(), @@ -525,6 +538,7 @@ class BackupRepoImpl @Inject constructor( else -> RecordTypeGoal.Type.Duration(value) } }, + daysOfWeek = recordTypeGoalDataLocalMapper.mapDaysOfWeek(daysOfWeekString), ) } diff --git a/domain/src/main/java/com/example/util/simpletimetracker/domain/model/DayOfWeek.kt b/domain/src/main/java/com/example/util/simpletimetracker/domain/model/DayOfWeek.kt index 8e277052..05c9668b 100644 --- a/domain/src/main/java/com/example/util/simpletimetracker/domain/model/DayOfWeek.kt +++ b/domain/src/main/java/com/example/util/simpletimetracker/domain/model/DayOfWeek.kt @@ -7,5 +7,5 @@ enum class DayOfWeek { WEDNESDAY, THURSDAY, FRIDAY, - SATURDAY + SATURDAY, } \ No newline at end of file diff --git a/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordTypeGoal.kt b/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordTypeGoal.kt index 452bf076..af02f7f2 100644 --- a/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordTypeGoal.kt +++ b/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordTypeGoal.kt @@ -5,6 +5,7 @@ data class RecordTypeGoal( val idData: IdData, val range: Range, val type: Type, + val daysOfWeek: List, ) { sealed interface IdData { diff --git a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewDataMapper.kt b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewDataMapper.kt index bbc3a373..c17e5d36 100644 --- a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewDataMapper.kt +++ b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewDataMapper.kt @@ -71,7 +71,7 @@ class GoalsViewDataMapper @Inject constructor( daily = getDefaultGoal(), weekly = getDefaultGoal(), monthly = getDefaultGoal(), - daysOfWeek = emptyList(), + daysOfWeek = DayOfWeek.values().toList(), ) } diff --git a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewModelDelegate.kt b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewModelDelegate.kt index 9a08569f..4a5f127f 100644 --- a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewModelDelegate.kt +++ b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewModelDelegate.kt @@ -153,6 +153,7 @@ class GoalsViewModelDelegateImpl @Inject constructor( goalId: Long, goalType: RecordTypeGoal.Type, goalRange: RecordTypeGoal.Range, + daysOfWeek: List, ) { if (goalType.value == 0L) { recordTypeGoalInteractor.remove(goalId) @@ -162,6 +163,7 @@ class GoalsViewModelDelegateImpl @Inject constructor( idData = id, range = goalRange, type = goalType, + daysOfWeek = daysOfWeek, ).let { recordTypeGoalInteractor.add(it) } @@ -172,21 +174,25 @@ class GoalsViewModelDelegateImpl @Inject constructor( goalId = goals.getSession()?.id.orZero(), goalType = newGoalsState.session, goalRange = RecordTypeGoal.Range.Session, + daysOfWeek = emptyList(), ) processGoal( goalId = goals.getDaily()?.id.orZero(), goalType = newGoalsState.daily, goalRange = RecordTypeGoal.Range.Daily, + daysOfWeek = newGoalsState.daysOfWeek, ) processGoal( goalId = goals.getWeekly()?.id.orZero(), goalType = newGoalsState.weekly, goalRange = RecordTypeGoal.Range.Weekly, + daysOfWeek = emptyList(), ) processGoal( goalId = goals.getMonthly()?.id.orZero(), goalType = newGoalsState.monthly, goalRange = RecordTypeGoal.Range.Monthly, + daysOfWeek = emptyList(), ) } @@ -201,7 +207,7 @@ class GoalsViewModelDelegateImpl @Inject constructor( daily = goals.getDaily()?.type ?: defaultGoal, weekly = goals.getWeekly()?.type ?: defaultGoal, monthly = goals.getMonthly()?.type ?: defaultGoal, - daysOfWeek = listOf(DayOfWeek.MONDAY) // TODO, + daysOfWeek = goals.getDaily()?.daysOfWeek ?: DayOfWeek.values().toList(), ) updateGoalsViewData()