From f59f58933b70fce93bdbba8c90b4c5f6cd2abcff Mon Sep 17 00:00:00 2001 From: razeeman Date: Sun, 19 Dec 2021 09:22:08 +0300 Subject: [PATCH] fixing types color sort --- .../simpletimetracker/di/AppModuleBinds.kt | 18 ++++++++++ .../core/mapper/AppColorMapperImpl.kt | 21 ++++++++++++ .../core/mapper/ColorMapper.kt | 9 +++-- .../domain/interactor/RecordTypeInteractor.kt | 34 ++++++++++++++++--- .../domain/mapper/AppColorMapper.kt | 8 +++++ 5 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/example/util/simpletimetracker/di/AppModuleBinds.kt create mode 100644 core/src/main/java/com/example/util/simpletimetracker/core/mapper/AppColorMapperImpl.kt create mode 100644 domain/src/main/java/com/example/util/simpletimetracker/domain/mapper/AppColorMapper.kt diff --git a/app/src/main/java/com/example/util/simpletimetracker/di/AppModuleBinds.kt b/app/src/main/java/com/example/util/simpletimetracker/di/AppModuleBinds.kt new file mode 100644 index 00000000..93ed222f --- /dev/null +++ b/app/src/main/java/com/example/util/simpletimetracker/di/AppModuleBinds.kt @@ -0,0 +1,18 @@ +package com.example.util.simpletimetracker.di + +import com.example.util.simpletimetracker.core.mapper.AppColorMapperImpl +import com.example.util.simpletimetracker.domain.mapper.AppColorMapper +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +interface AppModuleBinds { + + @Binds + @Singleton + fun AppColorMapperImpl.bindAppColorMapper(): AppColorMapper +} \ No newline at end of file diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/AppColorMapperImpl.kt b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/AppColorMapperImpl.kt new file mode 100644 index 00000000..2d366252 --- /dev/null +++ b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/AppColorMapperImpl.kt @@ -0,0 +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.mapper.AppColorMapper +import com.example.util.simpletimetracker.domain.model.AppColor +import javax.inject.Inject + +class AppColorMapperImpl @Inject constructor( + private val resourceRepo: ResourceRepo, +) : AppColorMapper { + + @ColorInt override fun mapToColorInt(color: AppColor, isDarkTheme: Boolean): Int { + return if (color.colorInt.isNotEmpty()) { + color.colorInt.toIntOrNull() + } else { + ColorMapper.getAvailableColors(isDarkTheme).getOrNull(color.colorId)?.let(resourceRepo::getColor) + } ?: resourceRepo.getColor(R.color.black) + } +} \ No newline at end of file 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 2bf95dd2..483d60cd 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 @@ -3,19 +3,17 @@ 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.mapper.AppColorMapper import com.example.util.simpletimetracker.domain.model.AppColor import javax.inject.Inject class ColorMapper @Inject constructor( private val resourceRepo: ResourceRepo, + private val appColorMapper: AppColorMapper, ) { @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) + return appColorMapper.mapToColorInt(color = color, isDarkTheme = isDarkTheme) } fun toUntrackedColor(isDarkTheme: Boolean): Int { @@ -71,6 +69,7 @@ class ColorMapper @Inject constructor( return if (isDarkTheme) availableColorsDark else availableColors } + // Don't change color positions as they are saved in DB by it. private val availableColors: List = listOf( R.color.black, R.color.red_500, 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 fe41bac0..2d43cc10 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 @@ -1,5 +1,7 @@ package com.example.util.simpletimetracker.domain.interactor +import android.graphics.Color +import com.example.util.simpletimetracker.domain.mapper.AppColorMapper import com.example.util.simpletimetracker.domain.model.CardOrder import com.example.util.simpletimetracker.domain.model.RecordType import com.example.util.simpletimetracker.domain.repo.RecordRepo @@ -18,7 +20,8 @@ class RecordTypeInteractor @Inject constructor( private val recordTypeCategoryRepo: RecordTypeCategoryRepo, private val recordTagRepo: RecordTagRepo, private val recordTypeCacheRepo: RecordTypeCacheRepo, - private val prefsInteractor: PrefsInteractor + private val prefsInteractor: PrefsInteractor, + private val appColorMapper: AppColorMapper, ) { suspend fun getAll(cardOrder: CardOrder? = null): List { @@ -82,7 +85,7 @@ class RecordTypeInteractor @Inject constructor( private suspend fun sort( cardOrder: CardOrder?, - records: List + records: List, ): List { return records .let(::sortByName) @@ -99,8 +102,31 @@ class RecordTypeInteractor @Inject constructor( return records.sortedBy { it.name.lowercase(Locale.getDefault()) } } - private fun sortByColor(records: List): List { - return records.sortedBy { it.color.colorId } // TODO fix sort with custom colors + private suspend fun sortByColor(types: List): List { + val isDarkMode = prefsInteractor.getDarkMode() + + return types + .map { type -> + type to appColorMapper.mapToColorInt( + color = type.color, + isDarkTheme = isDarkMode + ) + } + .map { (type, colorInt) -> + val hsv = FloatArray(3) + Color.colorToHSV(colorInt, hsv) + type to hsv + } + .sortedWith( + compareBy( + { -it.second[0] }, + { it.second[1] }, + { it.second[2] }, + ) + ) + .map { (type, _) -> + type + } } private suspend fun sortByManualOrder(records: List): List { diff --git a/domain/src/main/java/com/example/util/simpletimetracker/domain/mapper/AppColorMapper.kt b/domain/src/main/java/com/example/util/simpletimetracker/domain/mapper/AppColorMapper.kt new file mode 100644 index 00000000..f93e7f02 --- /dev/null +++ b/domain/src/main/java/com/example/util/simpletimetracker/domain/mapper/AppColorMapper.kt @@ -0,0 +1,8 @@ +package com.example.util.simpletimetracker.domain.mapper + +import com.example.util.simpletimetracker.domain.model.AppColor + +interface AppColorMapper { + + fun mapToColorInt(color: AppColor, isDarkTheme: Boolean): Int +} \ No newline at end of file -- 2.51.2