diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/interactor/StatisticsChartViewDataInteractor.kt b/core/src/main/java/com/example/util/simpletimetracker/core/interactor/StatisticsChartViewDataInteractor.kt index d15a7590..a9e9e48d 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/interactor/StatisticsChartViewDataInteractor.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/interactor/StatisticsChartViewDataInteractor.kt @@ -3,7 +3,6 @@ package com.example.util.simpletimetracker.core.interactor import com.example.util.simpletimetracker.core.R import com.example.util.simpletimetracker.core.mapper.ColorMapper import com.example.util.simpletimetracker.core.mapper.IconMapper -import com.example.util.simpletimetracker.core.repo.ResourceRepo import com.example.util.simpletimetracker.core.utils.UNTRACKED_ITEM_ID import com.example.util.simpletimetracker.core.viewData.StatisticsDataHolder import com.example.util.simpletimetracker.domain.interactor.RecordTypeCategoryInteractor @@ -17,7 +16,6 @@ import javax.inject.Inject class StatisticsChartViewDataInteractor @Inject constructor( private val iconMapper: IconMapper, private val colorMapper: ColorMapper, - private val resourceRepo: ResourceRepo, private val recordTypeCategoryInteractor: RecordTypeCategoryInteractor, ) { @@ -93,8 +91,7 @@ class StatisticsChartViewDataInteractor @Inject constructor( PiePortion( value = statistics.duration, colorInt = dataHolder.color - .let { colorMapper.mapToColorResId(it, isDarkTheme) } - .let(resourceRepo::getColor), + .let { colorMapper.mapToColorInt(it, isDarkTheme) }, iconId = dataHolder.icon ?.let(iconMapper::mapIcon) ) diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/CategoryViewDataMapper.kt b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/CategoryViewDataMapper.kt index 025cde08..788526d2 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/CategoryViewDataMapper.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/CategoryViewDataMapper.kt @@ -2,6 +2,7 @@ package com.example.util.simpletimetracker.core.mapper import com.example.util.simpletimetracker.core.R import com.example.util.simpletimetracker.core.repo.ResourceRepo +import com.example.util.simpletimetracker.domain.model.AppColor import com.example.util.simpletimetracker.domain.model.Category import com.example.util.simpletimetracker.domain.model.RecordTag import com.example.util.simpletimetracker.domain.model.RecordType @@ -15,13 +16,13 @@ import javax.inject.Inject class CategoryViewDataMapper @Inject constructor( private val colorMapper: ColorMapper, private val iconMapper: IconMapper, - private val resourceRepo: ResourceRepo + private val resourceRepo: ResourceRepo, ) { fun mapActivityTag( category: Category, isDarkTheme: Boolean, - isFiltered: Boolean = false + isFiltered: Boolean = false, ): CategoryViewData.Activity { return CategoryViewData.Activity( id = category.id, @@ -36,7 +37,7 @@ class CategoryViewDataMapper @Inject constructor( type: RecordType?, isDarkTheme: Boolean, isFiltered: Boolean = false, - showIcon: Boolean = true + showIcon: Boolean = true, ): CategoryViewData.Record { val isTyped = tag.typeId != 0L val icon = type?.icon?.let(iconMapper::mapIcon).takeIf { isTyped } @@ -77,7 +78,7 @@ class CategoryViewDataMapper @Inject constructor( fun getTextColor( isDarkTheme: Boolean, - isFiltered: Boolean + isFiltered: Boolean, ): Int { return if (isFiltered) { colorMapper.toFilteredIconColor(isDarkTheme) @@ -95,16 +96,14 @@ class CategoryViewDataMapper @Inject constructor( } private fun getColor( - colorId: Int, + color: AppColor, isDarkTheme: Boolean, - isFiltered: Boolean + isFiltered: Boolean, ): Int { return if (isFiltered) { colorMapper.toFilteredColor(isDarkTheme) } else { - colorId - .let { colorMapper.mapToColorResId(it, isDarkTheme) } - .let(resourceRepo::getColor) + color.let { colorMapper.mapToColorInt(it, isDarkTheme) } } } diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/ColorMapper.kt b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/ColorMapper.kt index 59156d8c..2bf95dd2 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/ColorMapper.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/ColorMapper.kt @@ -1,15 +1,21 @@ package com.example.util.simpletimetracker.core.mapper +import androidx.annotation.ColorInt import com.example.util.simpletimetracker.core.R import com.example.util.simpletimetracker.core.repo.ResourceRepo +import com.example.util.simpletimetracker.domain.model.AppColor import javax.inject.Inject class ColorMapper @Inject constructor( private val resourceRepo: ResourceRepo, ) { - fun mapToColorResId(colorId: Int, isDarkTheme: Boolean): Int { - return getAvailableColors(isDarkTheme).getOrNull(colorId) ?: R.color.black + @ColorInt fun mapToColorInt(color: AppColor, isDarkTheme: Boolean): Int { + return if (color.colorInt.isNotEmpty()) { + color.colorInt.toIntOrNull() + } else { + getAvailableColors(isDarkTheme).getOrNull(color.colorId)?.let(resourceRepo::getColor) + } ?: resourceRepo.getColor(R.color.black) } fun toUntrackedColor(isDarkTheme: Boolean): Int { diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordTypeViewDataMapper.kt b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordTypeViewDataMapper.kt index 1ff28f80..01b6893a 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordTypeViewDataMapper.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordTypeViewDataMapper.kt @@ -1,9 +1,11 @@ package com.example.util.simpletimetracker.core.mapper +import androidx.annotation.ColorInt import com.example.util.simpletimetracker.core.R import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType import com.example.util.simpletimetracker.feature_base_adapter.empty.EmptyViewData import com.example.util.simpletimetracker.core.repo.ResourceRepo +import com.example.util.simpletimetracker.domain.model.AppColor import com.example.util.simpletimetracker.feature_views.viewData.RecordTypeIcon import com.example.util.simpletimetracker.feature_base_adapter.recordType.RecordTypeViewData import com.example.util.simpletimetracker.domain.model.RecordType @@ -75,10 +77,8 @@ class RecordTypeViewDataMapper @Inject constructor( } } - private fun mapColor(color: Int, isDarkTheme: Boolean): Int { - return color - .let { colorMapper.mapToColorResId(it, isDarkTheme) } - .let(resourceRepo::getColor) + @ColorInt private fun mapColor(color: AppColor, isDarkTheme: Boolean): Int { + return colorMapper.mapToColorInt(color, isDarkTheme) } companion object { diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordViewDataMapper.kt b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordViewDataMapper.kt index 657d22ab..e6519461 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordViewDataMapper.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordViewDataMapper.kt @@ -41,8 +41,7 @@ class RecordViewDataMapper @Inject constructor( iconId = recordType.icon .let(iconMapper::mapIcon), color = recordType.color - .let { colorMapper.mapToColorResId(it, isDarkTheme) } - .let(resourceRepo::getColor), + .let { colorMapper.mapToColorInt(it, isDarkTheme) }, comment = record.comment ) } diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/utils/TestUtils.kt b/core/src/main/java/com/example/util/simpletimetracker/core/utils/TestUtils.kt index 384d96ed..38ef7514 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/utils/TestUtils.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/utils/TestUtils.kt @@ -11,6 +11,7 @@ import com.example.util.simpletimetracker.domain.interactor.RecordToRecordTagInt import com.example.util.simpletimetracker.domain.interactor.RecordTypeCategoryInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor import com.example.util.simpletimetracker.domain.interactor.RunningRecordInteractor +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.Record @@ -56,6 +57,7 @@ class TestUtils @Inject constructor( fun addActivity( name: String, color: Int? = null, + colorInt: Int? = null, icon: Int? = null, emoji: String? = null, goalTime: Long? = null, @@ -76,7 +78,7 @@ class TestUtils @Inject constructor( val data = RecordType( name = name, - color = colorId, + color = AppColor(colorId = colorId, colorInt = colorInt.toString()), icon = iconId, goalTime = goalTime.orZero(), hidden = archived @@ -125,7 +127,7 @@ class TestUtils @Inject constructor( ) = runBlocking { val data = Category( name = tagName, - color = 0 + color = AppColor(colorId = 0, colorInt = ""), ) categoryInteractor.add(data) @@ -141,8 +143,8 @@ class TestUtils @Inject constructor( val data = RecordTag( typeId = type?.id.orZero(), name = tagName, - color = 0, - archived = archived + color = AppColor(colorId = 0, colorInt = ""), + archived = archived, ) recordTagInteractor.add(data) diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/viewData/StatisticsDataHolder.kt b/core/src/main/java/com/example/util/simpletimetracker/core/viewData/StatisticsDataHolder.kt index 5698b5fa..78625d9b 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/viewData/StatisticsDataHolder.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/viewData/StatisticsDataHolder.kt @@ -1,7 +1,9 @@ package com.example.util.simpletimetracker.core.viewData +import com.example.util.simpletimetracker.domain.model.AppColor + data class StatisticsDataHolder( val name: String, - val color: Int, + val color: AppColor, val icon: String?, ) \ No newline at end of file diff --git a/data_local/schemas/com.example.util.simpletimetracker.data_local.database.AppDatabase/8.json b/data_local/schemas/com.example.util.simpletimetracker.data_local.database.AppDatabase/8.json new file mode 100644 index 00000000..9fc82160 --- /dev/null +++ b/data_local/schemas/com.example.util.simpletimetracker.data_local.database.AppDatabase/8.json @@ -0,0 +1,327 @@ +{ + "formatVersion": 1, + "database": { + "version": 8, + "identityHash": "e4c6049ddc40789e32f510f960593b52", + "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, `goal_time` 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 + }, + { + "fieldPath": "goalTime", + "columnName": "goal_time", + "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": [] + } + ], + "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, 'e4c6049ddc40789e32f510f960593b52')" + ] + } +} \ 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 44ecdc82..0e020c00 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 @@ -22,7 +22,7 @@ import com.example.util.simpletimetracker.data_local.model.RunningRecordToRecord RecordToRecordTagDBO::class, RunningRecordToRecordTagDBO::class, ], - version = 7, + version = 8, 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 2103fad5..43615348 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 @@ -86,5 +86,19 @@ class AppDatabaseMigrations { ) } } + + val migration_7_8 = object : Migration(7, 8) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL( + "ALTER TABLE recordTypes ADD COLUMN color_int TEXT NOT NULL DEFAULT ''" + ) + database.execSQL( + "ALTER TABLE categories ADD COLUMN color_int TEXT NOT NULL DEFAULT ''" + ) + database.execSQL( + "ALTER TABLE recordTags ADD COLUMN color_int TEXT NOT NULL DEFAULT ''" + ) + } + } } } \ No newline at end of file diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/di/DataLocalModule.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/di/DataLocalModule.kt index 8faae34a..3c6e9eaa 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/di/DataLocalModule.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/di/DataLocalModule.kt @@ -44,6 +44,7 @@ class DataLocalModule { AppDatabaseMigrations.migration_4_5, AppDatabaseMigrations.migration_5_6, AppDatabaseMigrations.migration_6_7, + AppDatabaseMigrations.migration_7_8, ) .build() } diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/CategoryDataLocalMapper.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/CategoryDataLocalMapper.kt index a7da703d..8e76da05 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/CategoryDataLocalMapper.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/CategoryDataLocalMapper.kt @@ -1,6 +1,7 @@ package com.example.util.simpletimetracker.data_local.mapper import com.example.util.simpletimetracker.data_local.model.CategoryDBO +import com.example.util.simpletimetracker.domain.model.AppColor import com.example.util.simpletimetracker.domain.model.Category import javax.inject.Inject @@ -10,7 +11,10 @@ class CategoryDataLocalMapper @Inject constructor() { return Category( id = dbo.id, name = dbo.name, - color = dbo.color + color = AppColor( + colorId = dbo.color, + colorInt = dbo.colorInt, + ) ) } @@ -18,7 +22,8 @@ class CategoryDataLocalMapper @Inject constructor() { return CategoryDBO( id = domain.id, name = domain.name, - color = domain.color + color = domain.color.colorId, + colorInt = domain.color.colorInt, ) } } \ No newline at end of file diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/RecordTagDataLocalMapper.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/RecordTagDataLocalMapper.kt index db7160ec..3f8291b2 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/RecordTagDataLocalMapper.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/RecordTagDataLocalMapper.kt @@ -1,6 +1,7 @@ package com.example.util.simpletimetracker.data_local.mapper import com.example.util.simpletimetracker.data_local.model.RecordTagDBO +import com.example.util.simpletimetracker.domain.model.AppColor import com.example.util.simpletimetracker.domain.model.RecordTag import javax.inject.Inject @@ -11,7 +12,10 @@ class RecordTagDataLocalMapper @Inject constructor() { id = dbo.id, typeId = dbo.typeId, name = dbo.name, - color = dbo.color, + color = AppColor( + colorId = dbo.color, + colorInt = dbo.colorInt, + ), archived = dbo.archived ) } @@ -21,7 +25,8 @@ class RecordTagDataLocalMapper @Inject constructor() { id = domain.id, typeId = domain.typeId, name = domain.name, - color = domain.color, + color = domain.color.colorId, + colorInt = domain.color.colorInt, archived = domain.archived ) } diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/RecordTypeDataLocalMapper.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/RecordTypeDataLocalMapper.kt index 14d41755..3b50be5d 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/RecordTypeDataLocalMapper.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/mapper/RecordTypeDataLocalMapper.kt @@ -1,6 +1,7 @@ package com.example.util.simpletimetracker.data_local.mapper import com.example.util.simpletimetracker.data_local.model.RecordTypeDBO +import com.example.util.simpletimetracker.domain.model.AppColor import com.example.util.simpletimetracker.domain.model.RecordType import javax.inject.Inject @@ -11,7 +12,10 @@ class RecordTypeDataLocalMapper @Inject constructor() { id = dbo.id, name = dbo.name, icon = dbo.icon, - color = dbo.color, + color = AppColor( + colorId = dbo.color, + colorInt = dbo.colorInt + ), hidden = dbo.hidden, goalTime = dbo.goalTime ) @@ -22,7 +26,8 @@ class RecordTypeDataLocalMapper @Inject constructor() { id = domain.id, name = domain.name, icon = domain.icon, - color = domain.color, + color = domain.color.colorId, + colorInt = domain.color.colorInt, hidden = domain.hidden, goalTime = domain.goalTime ) diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/CategoryDBO.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/CategoryDBO.kt index 6789283a..86033931 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/CategoryDBO.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/CategoryDBO.kt @@ -14,5 +14,9 @@ data class CategoryDBO( val name: String, @ColumnInfo(name = "color") - val color: Int + val color: Int, + + // If not empty - take color from here, custom colorInt stored as text. + @ColumnInfo(name = "color_int") + val colorInt: String, ) \ No newline at end of file diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/RecordTagDBO.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/RecordTagDBO.kt index c29d371c..80c1e8e6 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/RecordTagDBO.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/RecordTagDBO.kt @@ -19,6 +19,10 @@ data class RecordTagDBO( @ColumnInfo(name = "color") val color: Int, + // If not empty - take color from here, custom colorInt stored as text. + @ColumnInfo(name = "color_int") + val colorInt: String, + @ColumnInfo(name = "archived") val archived: Boolean ) \ No newline at end of file diff --git a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/RecordTypeDBO.kt b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/RecordTypeDBO.kt index b6a93126..990546a5 100644 --- a/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/RecordTypeDBO.kt +++ b/data_local/src/main/java/com/example/util/simpletimetracker/data_local/model/RecordTypeDBO.kt @@ -19,6 +19,10 @@ data class RecordTypeDBO( @ColumnInfo(name = "color") val color: Int, + // If not empty - take color from here, custom colorInt stored as text. + @ColumnInfo(name = "color_int") + val colorInt: String, + @ColumnInfo(name = "hidden") val hidden: Boolean, 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 f6a874b8..e83c1279 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 @@ -4,6 +4,7 @@ import android.content.ContentResolver import android.net.Uri import android.os.ParcelFileDescriptor import com.example.util.simpletimetracker.domain.extension.orZero +import com.example.util.simpletimetracker.domain.model.AppColor import com.example.util.simpletimetracker.domain.model.Category import com.example.util.simpletimetracker.domain.model.Record import com.example.util.simpletimetracker.domain.model.RecordTag @@ -190,13 +191,14 @@ class BackupRepoImpl @Inject constructor( private fun toBackupString(recordType: RecordType): String { return String.format( - "$ROW_RECORD_TYPE\t%s\t%s\t%s\t%s\t%s\t%s\n", + "$ROW_RECORD_TYPE\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", recordType.id.toString(), recordType.name.clean(), recordType.icon, - recordType.color.toString(), + recordType.color.colorId.toString(), (if (recordType.hidden) 1 else 0).toString(), - recordType.goalTime.toString() + recordType.goalTime.toString(), + recordType.color.colorInt ) } @@ -214,10 +216,11 @@ class BackupRepoImpl @Inject constructor( private fun toBackupString(category: Category): String { return String.format( - "$ROW_CATEGORY\t%s\t%s\t%s\n", + "$ROW_CATEGORY\t%s\t%s\t%s\t%s\n", category.id.toString(), category.name.clean(), - category.color.toString() + category.color.colorId.toString(), + category.color.colorInt, ) } @@ -231,12 +234,13 @@ class BackupRepoImpl @Inject constructor( private fun toBackupString(recordTag: RecordTag): String { return String.format( - "$ROW_RECORD_TAG\t%s\t%s\t%s\t%s\t%s\n", + "$ROW_RECORD_TAG\t%s\t%s\t%s\t%s\t%s\t%s\n", recordTag.id.toString(), recordTag.typeId.toString(), recordTag.name.clean(), (if (recordTag.archived) 1 else 0).toString(), - recordTag.color.toString(), + recordTag.color.colorId.toString(), + recordTag.color.colorInt, ) } @@ -253,7 +257,10 @@ class BackupRepoImpl @Inject constructor( id = parts.getOrNull(1)?.toLongOrNull().orZero(), name = parts.getOrNull(2).orEmpty(), icon = parts.getOrNull(3).orEmpty(), - color = parts.getOrNull(4)?.toIntOrNull().orZero(), + color = AppColor( + colorId = parts.getOrNull(4)?.toIntOrNull().orZero(), + colorInt = parts.getOrNull(7).orEmpty(), + ), hidden = parts.getOrNull(5)?.toIntOrNull() == 1, goalTime = parts.getOrNull(6)?.toLongOrNull().orZero() ) @@ -281,7 +288,10 @@ class BackupRepoImpl @Inject constructor( return Category( id = parts.getOrNull(1)?.toLongOrNull().orZero(), name = parts.getOrNull(2).orEmpty(), - color = parts.getOrNull(3)?.toIntOrNull().orZero() + color = AppColor( + colorId = parts.getOrNull(3)?.toIntOrNull().orZero(), + colorInt = parts.getOrNull(4).orEmpty(), + ) ) } @@ -298,7 +308,10 @@ class BackupRepoImpl @Inject constructor( typeId = parts.getOrNull(2)?.toLongOrNull().orZero(), name = parts.getOrNull(3).orEmpty(), archived = parts.getOrNull(4)?.toIntOrNull() == 1, - color = parts.getOrNull(5)?.toIntOrNull().orZero(), + color = AppColor( + colorId = parts.getOrNull(5)?.toIntOrNull().orZero(), + colorInt = parts.getOrNull(6).orEmpty(), + ) ) } diff --git a/domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/RecordTypeInteractor.kt b/domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/RecordTypeInteractor.kt index e608f3b8..fe41bac0 100644 --- a/domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/RecordTypeInteractor.kt +++ b/domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/RecordTypeInteractor.kt @@ -100,7 +100,7 @@ class RecordTypeInteractor @Inject constructor( } private fun sortByColor(records: List): List { - return records.sortedBy(RecordType::color) + return records.sortedBy { it.color.colorId } // TODO fix sort with custom colors } private suspend fun sortByManualOrder(records: List): List { diff --git a/domain/src/main/java/com/example/util/simpletimetracker/domain/model/AppColor.kt b/domain/src/main/java/com/example/util/simpletimetracker/domain/model/AppColor.kt index c92a40c2..4fa9a718 100644 --- a/domain/src/main/java/com/example/util/simpletimetracker/domain/model/AppColor.kt +++ b/domain/src/main/java/com/example/util/simpletimetracker/domain/model/AppColor.kt @@ -1,7 +1,6 @@ package com.example.util.simpletimetracker.domain.model -sealed class AppColor { - - data class Id(val colorId: Int) : AppColor() - data class Hex(val colorHex: String) : AppColor() -} \ No newline at end of file +data class AppColor( + val colorId: Int, + val colorInt: String, +) \ No newline at end of file diff --git a/domain/src/main/java/com/example/util/simpletimetracker/domain/model/Category.kt b/domain/src/main/java/com/example/util/simpletimetracker/domain/model/Category.kt index faf2ffaa..d4f5c85a 100644 --- a/domain/src/main/java/com/example/util/simpletimetracker/domain/model/Category.kt +++ b/domain/src/main/java/com/example/util/simpletimetracker/domain/model/Category.kt @@ -3,5 +3,5 @@ package com.example.util.simpletimetracker.domain.model data class Category( val id: Long = 0, val name: String, - val color: Int + val color: AppColor, ) \ No newline at end of file diff --git a/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordTag.kt b/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordTag.kt index 3dbe22a7..bf0709e3 100644 --- a/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordTag.kt +++ b/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordTag.kt @@ -10,6 +10,6 @@ data class RecordTag( val id: Long = 0, val typeId: Long, val name: String, - val color: Int, + val color: AppColor, val archived: Boolean = false ) \ No newline at end of file diff --git a/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordType.kt b/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordType.kt index e06b1426..3f4f3e87 100644 --- a/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordType.kt +++ b/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordType.kt @@ -4,7 +4,7 @@ data class RecordType( val id: Long = 0, val name: String, val icon: String, - val color: Int, + val color: AppColor, val hidden: Boolean = false, val goalTime: Long ) \ No newline at end of file diff --git a/features/feature_change_category/src/main/java/com/example/util/simpletimetracker/feature_change_category/viewModel/ChangeCategoryViewModel.kt b/features/feature_change_category/src/main/java/com/example/util/simpletimetracker/feature_change_category/viewModel/ChangeCategoryViewModel.kt index 9915b3c5..44fecd74 100644 --- a/features/feature_change_category/src/main/java/com/example/util/simpletimetracker/feature_change_category/viewModel/ChangeCategoryViewModel.kt +++ b/features/feature_change_category/src/main/java/com/example/util/simpletimetracker/feature_change_category/viewModel/ChangeCategoryViewModel.kt @@ -17,6 +17,7 @@ import com.example.util.simpletimetracker.domain.extension.orZero import com.example.util.simpletimetracker.domain.interactor.CategoryInteractor import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTypeCategoryInteractor +import com.example.util.simpletimetracker.domain.model.AppColor import com.example.util.simpletimetracker.domain.model.Category import com.example.util.simpletimetracker.feature_change_category.R import com.example.util.simpletimetracker.feature_change_category.interactor.ChangeCategoryViewDataInteractor @@ -69,7 +70,7 @@ class ChangeCategoryViewModel @Inject constructor( private val categoryId: Long get() = (extra as? ChangeTagData.Change)?.id.orZero() private var initialTypes: List = emptyList() private var newName: String = "" - private var newColorId: Int = (0..ColorMapper.colorsNumber).random() + private var newColor: AppColor = AppColor(colorId = (0..ColorMapper.colorsNumber).random(), colorInt = "") private var newTypes: MutableList = mutableListOf() fun onNameChange(name: String) { @@ -101,10 +102,11 @@ class ChangeCategoryViewModel @Inject constructor( } } + // TODO add color palette fun onColorClick(item: ColorViewData) { viewModelScope.launch { - if (item.colorId != newColorId) { - newColorId = item.colorId + if (item.colorId != newColor.colorId || newColor.colorInt.isNotEmpty()) { + newColor = AppColor(colorId = item.colorId, colorInt = "") updateCategoryPreview() } } @@ -143,7 +145,7 @@ class ChangeCategoryViewModel @Inject constructor( Category( id = categoryId, name = newName, - color = newColorId + color = newColor ).let { val addedId = saveCategory() saveTypes(addedId) @@ -157,7 +159,7 @@ class ChangeCategoryViewModel @Inject constructor( val category = Category( id = categoryId, name = newName, - color = newColorId + color = newColor ) return categoryInteractor.add(category) @@ -187,13 +189,13 @@ class ChangeCategoryViewModel @Inject constructor( categoryInteractor.get(categoryId) ?.let { newName = it.name - newColorId = it.color + newColor = it.color } val isDarkTheme = prefsInteractor.getDarkMode() return Category( name = newName, - color = newColorId + color = newColor ).let { categoryViewDataMapper.mapActivityTag(it, isDarkTheme) } } @@ -202,7 +204,7 @@ class ChangeCategoryViewModel @Inject constructor( return Category( name = newName, - color = newColorId + color = newColor ).let { categoryViewDataMapper.mapActivityTag(it, isDarkTheme) } } diff --git a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/mapper/ChangeRecordViewDataMapper.kt b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/mapper/ChangeRecordViewDataMapper.kt index eba474e7..078f6913 100644 --- a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/mapper/ChangeRecordViewDataMapper.kt +++ b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/mapper/ChangeRecordViewDataMapper.kt @@ -3,7 +3,6 @@ package com.example.util.simpletimetracker.feature_change_record.mapper import com.example.util.simpletimetracker.core.mapper.ColorMapper import com.example.util.simpletimetracker.core.mapper.IconMapper import com.example.util.simpletimetracker.core.mapper.TimeMapper -import com.example.util.simpletimetracker.core.repo.ResourceRepo import com.example.util.simpletimetracker.domain.extension.getFullName import com.example.util.simpletimetracker.domain.model.Record import com.example.util.simpletimetracker.domain.model.RecordTag @@ -15,7 +14,6 @@ class ChangeRecordViewDataMapper @Inject constructor( private val iconMapper: IconMapper, private val colorMapper: ColorMapper, private val timeMapper: TimeMapper, - private val resourceRepo: ResourceRepo ) { fun map( @@ -24,7 +22,7 @@ class ChangeRecordViewDataMapper @Inject constructor( recordTags: List, isDarkTheme: Boolean, useMilitaryTime: Boolean, - useProportionalMinutes: Boolean + useProportionalMinutes: Boolean, ): ChangeRecordViewData { return ChangeRecordViewData( name = recordType?.name.orEmpty(), @@ -49,8 +47,7 @@ class ChangeRecordViewDataMapper @Inject constructor( iconId = recordType?.icon.orEmpty() .let(iconMapper::mapIcon), color = recordType?.color - ?.let { colorMapper.mapToColorResId(it, isDarkTheme) } - ?.let(resourceRepo::getColor) + ?.let { colorMapper.mapToColorInt(it, isDarkTheme) } ?: colorMapper.toUntrackedColor(isDarkTheme), comment = record?.comment .orEmpty() diff --git a/features/feature_change_record_tag/src/main/java/com/example/util/simpletimetracker/feature_change_record_tag/viewModel/ChangeRecordTagViewModel.kt b/features/feature_change_record_tag/src/main/java/com/example/util/simpletimetracker/feature_change_record_tag/viewModel/ChangeRecordTagViewModel.kt index 318fa346..8a50f2ab 100644 --- a/features/feature_change_record_tag/src/main/java/com/example/util/simpletimetracker/feature_change_record_tag/viewModel/ChangeRecordTagViewModel.kt +++ b/features/feature_change_record_tag/src/main/java/com/example/util/simpletimetracker/feature_change_record_tag/viewModel/ChangeRecordTagViewModel.kt @@ -20,6 +20,7 @@ import com.example.util.simpletimetracker.domain.extension.orZero import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTagInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor +import com.example.util.simpletimetracker.domain.model.AppColor import com.example.util.simpletimetracker.domain.model.RecordTag import com.example.util.simpletimetracker.feature_base_adapter.color.ColorViewData import com.example.util.simpletimetracker.feature_change_record_tag.R @@ -85,7 +86,7 @@ class ChangeRecordTagViewModel @Inject constructor( private val recordTagId: Long get() = (extra as? ChangeTagData.Change)?.id.orZero() private var tagType: RecordTagType = RecordTagType.GENERAL private var newName: String = "" - private var newColorId: Int = (0..ColorMapper.colorsNumber).random() + private var newColor: AppColor = AppColor(colorId = (0..ColorMapper.colorsNumber).random(), colorInt = "") private var newTypeId: Long = 0L fun onNameChange(name: String) { @@ -125,10 +126,11 @@ class ChangeRecordTagViewModel @Inject constructor( ?.flip().orTrue() } + // TODO add color palette fun onColorClick(item: ColorViewData) { viewModelScope.launch { - if (item.colorId != newColorId) { - newColorId = item.colorId + if (item.colorId != newColor.colorId || newColor.colorInt.isNotEmpty()) { + newColor = AppColor(colorId = item.colorId, colorInt = "") newTypeId = 0 updatePreview() } @@ -168,7 +170,7 @@ class ChangeRecordTagViewModel @Inject constructor( id = recordTagId, typeId = newTypeId, name = newName, - color = newColorId, + color = newColor, ).let { recordTagInteractor.add(it) notificationTypeInteractor.checkAndShow(newTypeId) @@ -182,7 +184,7 @@ class ChangeRecordTagViewModel @Inject constructor( recordTagInteractor.get(recordTagId)?.let { newTypeId = it.typeId newName = it.name - newColorId = it.color + newColor = it.color } updateTagTypeSetupViewData() } @@ -194,7 +196,7 @@ class ChangeRecordTagViewModel @Inject constructor( private suspend fun loadPreviewViewData(): CategoryViewData.Record { val tag = RecordTag( name = newName, - color = newColorId, + color = newColor, typeId = newTypeId ) val type = recordTypeInteractor.get(newTypeId) diff --git a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/interactor/ChangeRecordTypeViewDataInteractor.kt b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/interactor/ChangeRecordTypeViewDataInteractor.kt index e2d3012f..5502cfa2 100644 --- a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/interactor/ChangeRecordTypeViewDataInteractor.kt +++ b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/interactor/ChangeRecordTypeViewDataInteractor.kt @@ -8,6 +8,7 @@ import com.example.util.simpletimetracker.core.repo.ResourceRepo import com.example.util.simpletimetracker.feature_base_adapter.color.ColorViewData import com.example.util.simpletimetracker.domain.interactor.CategoryInteractor import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor +import com.example.util.simpletimetracker.domain.model.AppColor import com.example.util.simpletimetracker.domain.model.Category import com.example.util.simpletimetracker.domain.model.IconType import com.example.util.simpletimetracker.feature_base_adapter.color.ColorPaletteViewData @@ -81,14 +82,14 @@ class ChangeRecordTypeViewDataInteractor @Inject constructor( } suspend fun getIconsViewData( - newColorId: Int, + newColor: AppColor, iconType: IconType, ): List = withContext(Dispatchers.IO) { val isDarkTheme = prefsInteractor.getDarkMode() when (iconType) { - IconType.IMAGE -> mapper.mapIconImageData(newColorId, isDarkTheme) - IconType.EMOJI -> mapper.mapIconEmojiData(newColorId, isDarkTheme) + IconType.IMAGE -> mapper.mapIconImageData(newColor, isDarkTheme) + IconType.EMOJI -> mapper.mapIconEmojiData(newColor, isDarkTheme) } } diff --git a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/mapper/ChangeRecordTypeMapper.kt b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/mapper/ChangeRecordTypeMapper.kt index 89aebf21..9778e228 100644 --- a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/mapper/ChangeRecordTypeMapper.kt +++ b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/mapper/ChangeRecordTypeMapper.kt @@ -7,6 +7,7 @@ import com.example.util.simpletimetracker.core.mapper.IconEmojiMapper import com.example.util.simpletimetracker.core.mapper.IconImageMapper import com.example.util.simpletimetracker.core.mapper.TimeMapper import com.example.util.simpletimetracker.core.repo.ResourceRepo +import com.example.util.simpletimetracker.domain.model.AppColor import com.example.util.simpletimetracker.feature_base_adapter.emoji.EmojiViewData import com.example.util.simpletimetracker.domain.model.IconEmojiCategory import com.example.util.simpletimetracker.domain.model.IconImageCategory @@ -25,7 +26,7 @@ class ChangeRecordTypeMapper @Inject constructor( private val timeMapper: TimeMapper, private val iconImageMapper: IconImageMapper, private val iconEmojiMapper: IconEmojiMapper, - private val colorMapper: ColorMapper + private val colorMapper: ColorMapper, ) { fun mapToEmpty(): List { @@ -43,25 +44,25 @@ class ChangeRecordTypeMapper @Inject constructor( } fun mapIconImageData( - newColorId: Int, - isDarkTheme: Boolean + newColor: AppColor, + isDarkTheme: Boolean, ): List { return iconImageMapper.getAvailableImages().map { (category, images) -> listOf(mapImageCategoryHintViewData(category)) + images.map { (iconName, iconResId) -> - mapImageViewData(iconName, iconResId, newColorId, isDarkTheme) + mapImageViewData(iconName, iconResId, newColor, isDarkTheme) } }.flatten() } fun mapIconEmojiData( - newColorId: Int, - isDarkTheme: Boolean + newColor: AppColor, + isDarkTheme: Boolean, ): List { return iconEmojiMapper.getAvailableEmojis().map { (category, codes) -> listOf(mapEmojiCategoryHintViewData(category)) + codes.map { code -> - mapEmojiViewData(code, newColorId, isDarkTheme) + mapEmojiViewData(code, newColor, isDarkTheme) } }.flatten() } @@ -98,11 +99,14 @@ class ChangeRecordTypeMapper @Inject constructor( } fun mapEmojiSelectionParams( - colorId: Int, - emojiCodes: String + color: AppColor, + emojiCodes: String, ): EmojiSelectionDialogParams { return EmojiSelectionDialogParams( - color = colorId, + color = EmojiSelectionDialogParams.Color( + colorId = color.colorId, + colorInt = color.colorInt, + ), emojiCodes = listOf(emojiCodes) + iconEmojiMapper.toSkinToneVariations(emojiCodes) ) } @@ -117,34 +121,32 @@ class ChangeRecordTypeMapper @Inject constructor( private fun mapImageViewData( iconName: String, iconResId: Int, - newColorId: Int, - isDarkTheme: Boolean + newColor: AppColor, + isDarkTheme: Boolean, ): ViewHolderType { return ChangeRecordTypeIconViewData( iconName = iconName, iconResId = iconResId, - colorInt = newColorId - .let { colorMapper.mapToColorResId(it, isDarkTheme) } - .let(resourceRepo::getColor) + colorInt = newColor + .let { colorMapper.mapToColorInt(it, isDarkTheme) } ) } private fun mapEmojiViewData( codes: String, - newColorId: Int, - isDarkTheme: Boolean + newColor: AppColor, + isDarkTheme: Boolean, ): ViewHolderType { return EmojiViewData( emojiText = iconEmojiMapper.toEmojiString(codes), emojiCodes = codes, - colorInt = newColorId - .let { colorMapper.mapToColorResId(it, isDarkTheme) } - .let(resourceRepo::getColor) + colorInt = newColor + .let { colorMapper.mapToColorInt(it, isDarkTheme) } ) } private fun mapImageCategoryHintViewData( - category: IconImageCategory + category: IconImageCategory, ): ChangeRecordTypeIconCategoryInfoViewData { return ChangeRecordTypeIconCategoryInfoViewData( type = ChangeRecordTypeIconTypeViewData.Image(category.type), @@ -153,7 +155,7 @@ class ChangeRecordTypeMapper @Inject constructor( } private fun mapEmojiCategoryHintViewData( - category: IconEmojiCategory + category: IconEmojiCategory, ): ChangeRecordTypeIconCategoryInfoViewData { return ChangeRecordTypeIconCategoryInfoViewData( type = ChangeRecordTypeIconTypeViewData.Emoji(category.type), diff --git a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewModel/ChangeRecordTypeViewModel.kt b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewModel/ChangeRecordTypeViewModel.kt index 05ab2fe0..577473e1 100644 --- a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewModel/ChangeRecordTypeViewModel.kt +++ b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewModel/ChangeRecordTypeViewModel.kt @@ -22,6 +22,7 @@ import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTypeCategoryInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor import com.example.util.simpletimetracker.domain.interactor.RunningRecordInteractor +import com.example.util.simpletimetracker.domain.model.AppColor import com.example.util.simpletimetracker.domain.model.IconType import com.example.util.simpletimetracker.domain.model.RecordType import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType @@ -60,6 +61,7 @@ class ChangeRecordTypeViewModel @Inject constructor( private val changeRecordTypeMapper: ChangeRecordTypeMapper, private val resourceRepo: ResourceRepo, private val iconEmojiMapper: IconEmojiMapper, + private val colorMapper: ColorMapper, ) : ViewModel() { lateinit var extra: ChangeRecordTypeParams @@ -126,8 +128,7 @@ class ChangeRecordTypeViewModel @Inject constructor( private var newName: String = "" private var newIconName: String = "" private var newCategories: MutableList = mutableListOf() - private var newColorId: Int = (0..ColorMapper.colorsNumber).random() - private var lastSelectedCustomColor: Int = 0xFF0000 + private var newColor: AppColor = AppColor(colorId = (0..ColorMapper.colorsNumber).random(), colorInt = "") private var newGoalTime: Long = 0L fun onNameChange(name: String) { @@ -180,8 +181,8 @@ class ChangeRecordTypeViewModel @Inject constructor( fun onColorClick(item: ColorViewData) { viewModelScope.launch { - if (item.colorId != newColorId) { - newColorId = item.colorId + if (item.colorId != newColor.colorId || newColor.colorInt.isNotEmpty()) { + newColor = AppColor(colorId = item.colorId, colorInt = "") updateRecordPreviewViewData() updateIcons() } @@ -189,9 +190,14 @@ class ChangeRecordTypeViewModel @Inject constructor( } fun onColorPaletteClick() { - ColorSelectionDialogParams( - preselectedColor = lastSelectedCustomColor - ).let(router::navigate) + viewModelScope.launch { + ColorSelectionDialogParams( + preselectedColor = colorMapper.mapToColorInt( + color = newColor, + isDarkTheme = prefsInteractor.getDarkMode() + ) + ).let(router::navigate) + } } fun onIconTypeClick(viewData: ButtonsRowViewData) { @@ -243,7 +249,13 @@ class ChangeRecordTypeViewModel @Inject constructor( } fun onCustomColorSelected(colorInt: Int) { - lastSelectedCustomColor = colorInt + viewModelScope.launch { + if (colorInt.toString() != newColor.colorInt) { + newColor = AppColor(colorId = 0, colorInt = colorInt.toString()) + updateRecordPreviewViewData() + updateIcons() + } + } } fun onGoalTimeClick() { @@ -318,7 +330,7 @@ class ChangeRecordTypeViewModel @Inject constructor( private fun openEmojiSelectionDialog(item: EmojiViewData) { val params = changeRecordTypeMapper.mapEmojiSelectionParams( - colorId = newColorId, + color = newColor, emojiCodes = item.emojiCodes ) @@ -330,7 +342,7 @@ class ChangeRecordTypeViewModel @Inject constructor( id = recordTypeId, name = newName, icon = newIconName, - color = newColorId, + color = newColor, goalTime = newGoalTime ) @@ -350,7 +362,7 @@ class ChangeRecordTypeViewModel @Inject constructor( ?.let { newName = it.name newIconName = it.icon - newColorId = it.color + newColor = it.color newGoalTime = it.goalTime updateIcons() updateGoalTimeViewData() @@ -375,7 +387,7 @@ class ChangeRecordTypeViewModel @Inject constructor( return RecordType( name = newName, icon = newIconName, - color = newColorId, + color = newColor, goalTime = 0 ).let { recordTypeViewDataMapper.map(it, isDarkTheme) } } @@ -390,7 +402,7 @@ class ChangeRecordTypeViewModel @Inject constructor( } private suspend fun loadIconsViewData(): List { - return viewDataInteractor.getIconsViewData(newColorId, iconType) + return viewDataInteractor.getIconsViewData(newColor, iconType) } private fun updateIconCategories() = viewModelScope.launch { diff --git a/features/feature_change_running_record/src/main/java/com/example/util/simpletimetracker/feature_change_running_record/mapper/ChangeRunningRecordViewDataMapper.kt b/features/feature_change_running_record/src/main/java/com/example/util/simpletimetracker/feature_change_running_record/mapper/ChangeRunningRecordViewDataMapper.kt index 586a55aa..b8cf3202 100644 --- a/features/feature_change_running_record/src/main/java/com/example/util/simpletimetracker/feature_change_running_record/mapper/ChangeRunningRecordViewDataMapper.kt +++ b/features/feature_change_running_record/src/main/java/com/example/util/simpletimetracker/feature_change_running_record/mapper/ChangeRunningRecordViewDataMapper.kt @@ -44,11 +44,9 @@ class ChangeRunningRecordViewDataMapper @Inject constructor( .orEmpty(), iconId = recordType?.icon.orEmpty() .let(iconMapper::mapIcon), - color = ( - recordType?.color - ?.let { colorMapper.mapToColorResId(it, isDarkTheme) } - ?: ColorMapper.getAvailableColors(isDarkTheme).random() - ).let(resourceRepo::getColor), + color = recordType?.color + ?.let { colorMapper.mapToColorInt(it, isDarkTheme) } + ?: ColorMapper.getAvailableColors(isDarkTheme).random().let(resourceRepo::getColor), comment = runningRecord.comment ) } diff --git a/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/emojiSelection/mapper/EmojiSelectionMapper.kt b/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/emojiSelection/mapper/EmojiSelectionMapper.kt index ba143797..7f62da12 100644 --- a/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/emojiSelection/mapper/EmojiSelectionMapper.kt +++ b/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/emojiSelection/mapper/EmojiSelectionMapper.kt @@ -1,30 +1,27 @@ package com.example.util.simpletimetracker.feature_dialogs.emojiSelection.mapper -import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType import com.example.util.simpletimetracker.core.mapper.ColorMapper import com.example.util.simpletimetracker.core.mapper.IconEmojiMapper -import com.example.util.simpletimetracker.core.repo.ResourceRepo +import com.example.util.simpletimetracker.domain.model.AppColor +import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType import com.example.util.simpletimetracker.feature_base_adapter.emoji.EmojiViewData import javax.inject.Inject class EmojiSelectionMapper @Inject constructor( - private val resourceRepo: ResourceRepo, private val colorMapper: ColorMapper, - private val iconEmojiMapper: IconEmojiMapper + private val iconEmojiMapper: IconEmojiMapper, ) { fun mapIconEmojiData( - colorId: Int, + color: AppColor, isDarkTheme: Boolean, - emojiCodes: List + emojiCodes: List, ): List { return emojiCodes.map { codes -> EmojiViewData( emojiText = iconEmojiMapper.toEmojiString(codes), emojiCodes = codes, - colorInt = colorId - .let { colorMapper.mapToColorResId(it, isDarkTheme) } - .let(resourceRepo::getColor) + colorInt = colorMapper.mapToColorInt(color, isDarkTheme) ) } } diff --git a/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/emojiSelection/viewModel/EmojiSelectionViewModel.kt b/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/emojiSelection/viewModel/EmojiSelectionViewModel.kt index 945c2634..12913b8d 100644 --- a/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/emojiSelection/viewModel/EmojiSelectionViewModel.kt +++ b/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/emojiSelection/viewModel/EmojiSelectionViewModel.kt @@ -9,6 +9,7 @@ import com.example.util.simpletimetracker.feature_base_adapter.loader.LoaderView import com.example.util.simpletimetracker.core.extension.set import com.example.util.simpletimetracker.feature_base_adapter.emoji.EmojiViewData import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor +import com.example.util.simpletimetracker.domain.model.AppColor import com.example.util.simpletimetracker.feature_dialogs.emojiSelection.mapper.EmojiSelectionMapper import com.example.util.simpletimetracker.navigation.params.screen.EmojiSelectionDialogParams import kotlinx.coroutines.launch @@ -40,7 +41,7 @@ class EmojiSelectionViewModel @Inject constructor( val isDarkTheme = prefsInteractor.getDarkMode() return mapper.mapIconEmojiData( - colorId = extra.color, + color = AppColor(colorId = extra.color.colorId, colorInt = extra.color.colorInt), isDarkTheme = isDarkTheme, emojiCodes = extra.emojiCodes ) diff --git a/features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/goalTime/interactor/NotificationGoalTimeInteractorImpl.kt b/features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/goalTime/interactor/NotificationGoalTimeInteractorImpl.kt index 85c17396..20ae922e 100644 --- a/features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/goalTime/interactor/NotificationGoalTimeInteractorImpl.kt +++ b/features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/goalTime/interactor/NotificationGoalTimeInteractorImpl.kt @@ -59,8 +59,7 @@ class NotificationGoalTimeInteractorImpl @Inject constructor( icon = recordType.icon .let(iconMapper::mapIcon), color = recordType.color - .let { colorMapper.mapToColorResId(it, isDarkTheme) } - .let(resourceRepo::getColor), + .let { colorMapper.mapToColorInt(it, isDarkTheme) }, text = recordType.name, description = resourceRepo.getString( R.string.notification_goal_time_description, diff --git a/features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/interactor/NotificationTypeInteractorImpl.kt b/features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/interactor/NotificationTypeInteractorImpl.kt index 22fceddb..67e6508b 100644 --- a/features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/interactor/NotificationTypeInteractorImpl.kt +++ b/features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/interactor/NotificationTypeInteractorImpl.kt @@ -102,8 +102,7 @@ class NotificationTypeInteractorImpl @Inject constructor( icon = recordType.icon .let(iconMapper::mapIcon), color = recordType.color - .let { colorMapper.mapToColorResId(it, isDarkTheme) } - .let(resourceRepo::getColor), + .let { colorMapper.mapToColorInt(it, isDarkTheme) }, text = getNotificationText(recordType, recordTags), timeStarted = runningRecord.timeStarted .let { timeMapper.formatTime(it, useMilitaryTime) } diff --git a/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/mapper/RunningRecordViewDataMapper.kt b/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/mapper/RunningRecordViewDataMapper.kt index 12a2169a..57aeb551 100644 --- a/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/mapper/RunningRecordViewDataMapper.kt +++ b/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/mapper/RunningRecordViewDataMapper.kt @@ -52,8 +52,7 @@ class RunningRecordViewDataMapper @Inject constructor( iconId = recordType.icon .let(iconMapper::mapIcon), color = recordType.color - .let { colorMapper.mapToColorResId(it, isDarkTheme) } - .let(resourceRepo::getColor), + .let { colorMapper.mapToColorInt(it, isDarkTheme) }, comment = runningRecord.comment ) } diff --git a/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/mapper/StatisticsViewDataMapper.kt b/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/mapper/StatisticsViewDataMapper.kt index 3e95e964..bc7c6ab0 100644 --- a/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/mapper/StatisticsViewDataMapper.kt +++ b/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/mapper/StatisticsViewDataMapper.kt @@ -115,8 +115,7 @@ class StatisticsViewDataMapper @Inject constructor( icon = dataHolder.icon ?.let(iconMapper::mapIcon), color = dataHolder.color - .let { colorMapper.mapToColorResId(it, isDarkTheme) } - .let(resourceRepo::getColor) + .let { colorMapper.mapToColorInt(it, isDarkTheme) }, ) } else -> { diff --git a/features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/mapper/StatisticsDetailViewDataMapper.kt b/features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/mapper/StatisticsDetailViewDataMapper.kt index 4cf21b49..f95a477a 100644 --- a/features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/mapper/StatisticsDetailViewDataMapper.kt +++ b/features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/mapper/StatisticsDetailViewDataMapper.kt @@ -126,8 +126,7 @@ class StatisticsDetailViewDataMapper @Inject constructor( iconId = recordType.icon .let(iconMapper::mapIcon), color = recordType.color - .let { colorMapper.mapToColorResId(it, isDarkTheme) } - .let(resourceRepo::getColor) + .let { colorMapper.mapToColorInt(it, isDarkTheme) }, ) } @@ -140,8 +139,7 @@ class StatisticsDetailViewDataMapper @Inject constructor( name = category.name, iconId = null, color = category.color - .let { colorMapper.mapToColorResId(it, isDarkTheme) } - .let(resourceRepo::getColor) + .let { colorMapper.mapToColorInt(it, isDarkTheme) }, ) } @@ -541,12 +539,8 @@ class StatisticsDetailViewDataMapper @Inject constructor( ?.let(iconMapper::mapIcon) ?: tag?.run { RecordTypeIcon.Image(0) } ?: RecordTypeIcon.Image(R.drawable.unknown), - color = recordType?.color - ?.let { colorMapper.mapToColorResId(it, isDarkTheme) } - ?.let(resourceRepo::getColor) - ?: tag?.color - ?.let { colorMapper.mapToColorResId(it, isDarkTheme) } - ?.let(resourceRepo::getColor) + color = recordType?.color?.let { colorMapper.mapToColorInt(it, isDarkTheme) } + ?: tag?.color?.let { colorMapper.mapToColorInt(it, isDarkTheme) } ?: colorMapper.toUntrackedColor(isDarkTheme) ) } diff --git a/features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/mapper/WidgetUniversalViewDataMapper.kt b/features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/mapper/WidgetUniversalViewDataMapper.kt index e10dfb8c..41b4c6ec 100644 --- a/features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/mapper/WidgetUniversalViewDataMapper.kt +++ b/features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/mapper/WidgetUniversalViewDataMapper.kt @@ -47,8 +47,7 @@ class WidgetUniversalViewDataMapper @Inject constructor( ?.let(iconMapper::mapIcon) ?: RecordTypeIcon.Image(R.drawable.unknown) val color = recordType?.color - ?.let { colorMapper.mapToColorResId(it, isDarkTheme) } - ?.let(resourceRepo::getColor) + ?.let { colorMapper.mapToColorInt(it, isDarkTheme) } ?: Color.BLACK IconStackData(icon = icon, iconBackgroundColor = color) diff --git a/features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/widget/WidgetProvider.kt b/features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/widget/WidgetProvider.kt index d62847ac..7a78437d 100644 --- a/features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/widget/WidgetProvider.kt +++ b/features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/widget/WidgetProvider.kt @@ -152,9 +152,7 @@ class WidgetProvider : AppWidgetProvider() { ?: R.string.widget_load_error.let(resourceRepo::getString) val color = if (runningRecord != null && recordType != null) { - recordType.color - .let { colorMapper.mapToColorResId(it, isDarkTheme) } - .let(resourceRepo::getColor) + colorMapper.mapToColorInt(recordType.color, isDarkTheme) } else { Color.BLACK } diff --git a/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/EmojiSelectionDialogParams.kt b/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/EmojiSelectionDialogParams.kt index 2b84b34a..babc1939 100644 --- a/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/EmojiSelectionDialogParams.kt +++ b/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/EmojiSelectionDialogParams.kt @@ -1,12 +1,17 @@ package com.example.util.simpletimetracker.navigation.params.screen -import android.graphics.Color import android.os.Parcelable -import androidx.annotation.ColorInt import kotlinx.parcelize.Parcelize @Parcelize data class EmojiSelectionDialogParams( - @ColorInt val color: Int = Color.BLACK, - val emojiCodes: List = emptyList() -) : Parcelable, ScreenParams \ No newline at end of file + val color: Color = Color(colorId = 0, colorInt = ""), + val emojiCodes: List = emptyList(), +) : Parcelable, ScreenParams { + + @Parcelize + data class Color( + val colorId: Int = 0, + val colorInt: String = "", + ) : Parcelable +} \ No newline at end of file