A fork of Simple Time Tracker with WearOS support. (Now integrated upstream)
0

Configure Feed

Select the types of activity you want to include in your feed.

add icon selector images

razeeman (Apr 18, 2021, 1:35 PM +0300) e4f60520 53a4945b

+697 -325
+1 -1
app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTest.kt
··· 36 36 fun addRecord() { 37 37 val name = "Name" 38 38 val color = ColorMapper.getAvailableColors().first() 39 - val icon = iconMapper.availableIconsNames.values.first() 39 + val icon = iconImageMapper.availableIconsNames.values.first() 40 40 val comment = "Comment" 41 41 42 42 // Add activity
+3 -3
app/src/androidTest/java/com/example/util/simpletimetracker/AddRecordTypeTest.kt
··· 40 40 val firstColor = ColorMapper.getAvailableColors().first() 41 41 val lastColor = ColorMapper.getAvailableColors().last() 42 42 val lastColorPosition = ColorMapper.getAvailableColors().size - 1 43 - val firstIcon = iconMapper.availableIconsNames.values.first() 44 - val lastIcon = iconMapper.availableIconsNames.values.last() 45 - val lastIconPosition = iconMapper.availableIconsNames.size - 1 43 + val firstIcon = iconImageMapper.availableIconsNames.values.first() 44 + val lastIcon = iconImageMapper.availableIconsNames.values.last() 45 + val lastIconPosition = iconImageMapper.availableIconsNames.size - 1 46 46 47 47 NavUtils.openSettingsScreen() 48 48 NavUtils.openCategoriesScreen()
+2 -2
app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTest.kt
··· 41 41 val newName = "Test2" 42 42 val firstColor = ColorMapper.getAvailableColors().first() 43 43 val lastColor = ColorMapper.getAvailableColors().last() 44 - val firstIcon = iconMapper.availableIconsNames.values.first() 45 - val lastIcon = iconMapper.availableIconsNames.values.last() 44 + val firstIcon = iconImageMapper.availableIconsNames.values.first() 45 + val lastIcon = iconImageMapper.availableIconsNames.values.last() 46 46 val comment = "comment" 47 47 val newComment = "new comment" 48 48
+4 -4
app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRecordTypeTest.kt
··· 35 35 val newName = "Updated" 36 36 val firstColor = ColorMapper.getAvailableColors().first() 37 37 val lastColor = ColorMapper.getAvailableColors().last() 38 - val firstIcon = iconMapper.availableIconsNames.values.first() 39 - val lastIcon = iconMapper.availableIconsNames.values.last() 38 + val firstIcon = iconImageMapper.availableIconsNames.values.first() 39 + val lastIcon = iconImageMapper.availableIconsNames.values.last() 40 40 41 41 // Add item 42 42 NavUtils.addActivity(name, firstColor, firstIcon) ··· 82 82 val newName = "new name" 83 83 val firstColor = ColorMapper.getAvailableColors().first() 84 84 val lastColor = ColorMapper.getAvailableColors().last() 85 - val firstIcon = iconMapper.availableIconsNames.values.first() 86 - val lastIcon = iconMapper.availableIconsNames.values.last() 85 + val firstIcon = iconImageMapper.availableIconsNames.values.first() 86 + val lastIcon = iconImageMapper.availableIconsNames.values.last() 87 87 88 88 // Add activity 89 89 NavUtils.addActivity(name, firstColor, firstIcon)
+2 -2
app/src/androidTest/java/com/example/util/simpletimetracker/ChangeRunningRecordTest.kt
··· 42 42 val newName = "Test2" 43 43 val firstColor = ColorMapper.getAvailableColors().first() 44 44 val lastColor = ColorMapper.getAvailableColors().last() 45 - val firstIcon = iconMapper.availableIconsNames.values.first() 46 - val lastIcon = iconMapper.availableIconsNames.values.last() 45 + val firstIcon = iconImageMapper.availableIconsNames.values.first() 46 + val lastIcon = iconImageMapper.availableIconsNames.values.last() 47 47 val firstGoalTime = TimeUnit.MINUTES.toSeconds(10) 48 48 val comment = "comment" 49 49
+1 -1
app/src/androidTest/java/com/example/util/simpletimetracker/ChangeUntrackedTest.kt
··· 30 30 fun changeUntracked() { 31 31 val name = "Test" 32 32 val color = ColorMapper.getAvailableColors().first() 33 - val icon = iconMapper.availableIconsNames.values.first() 33 + val icon = iconImageMapper.availableIconsNames.values.first() 34 34 35 35 // Add activity 36 36 testUtils.addActivity(name, color, icon)
+1 -1
app/src/androidTest/java/com/example/util/simpletimetracker/DeleteRecordTest.kt
··· 27 27 fun deleteRecord() { 28 28 val name = "Name" 29 29 val color = ColorMapper.getAvailableColors().first() 30 - val icon = iconMapper.availableIconsNames.values.first() 30 + val icon = iconImageMapper.availableIconsNames.values.first() 31 31 32 32 // Add activity 33 33 testUtils.addActivity(name, color, icon)
+1 -1
app/src/androidTest/java/com/example/util/simpletimetracker/DeleteRecordTypeTest.kt
··· 29 29 fun deleteRecordType() { 30 30 val name = "Test" 31 31 val color = ColorMapper.getAvailableColors().first() 32 - val icon = iconMapper.availableIconsNames.values.first() 32 + val icon = iconImageMapper.availableIconsNames.values.first() 33 33 34 34 tryAction { clickOnViewWithText(R.string.running_records_add_type) } 35 35 checkViewIsNotDisplayed(withId(R.id.btnChangeRecordTypeDelete))
+1 -1
app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTest.kt
··· 40 40 fun showUntrackedSetting() { 41 41 val name = "Test" 42 42 val color = ColorMapper.getAvailableColors().first() 43 - val icon = iconMapper.availableIconsNames.values.first() 43 + val icon = iconImageMapper.availableIconsNames.values.first() 44 44 45 45 // Add activity 46 46 testUtils.addActivity(name, color, icon)
+2 -2
app/src/androidTest/java/com/example/util/simpletimetracker/StartRecordTest.kt
··· 33 33 val newName = "Test2" 34 34 val firstColor = ColorMapper.getAvailableColors().first() 35 35 val lastColor = ColorMapper.getAvailableColors().last() 36 - val firstIcon = iconMapper.availableIconsNames.values.first() 37 - val lastIcon = iconMapper.availableIconsNames.values.last() 36 + val firstIcon = iconImageMapper.availableIconsNames.values.first() 37 + val lastIcon = iconImageMapper.availableIconsNames.values.last() 38 38 val firstGoalTime = TimeUnit.MINUTES.toSeconds(10) 39 39 40 40 // Add activities
+5 -5
app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsDetailTest.kt
··· 36 36 fun statisticsDetailOverall() { 37 37 val name = "Test" 38 38 val color = ColorMapper.getAvailableColors().first() 39 - val icon = iconMapper.availableIconsNames.values.first() 39 + val icon = iconImageMapper.availableIconsNames.values.first() 40 40 41 41 // Add activity 42 42 testUtils.addActivity(name, color, icon) ··· 105 105 fun statisticsDetailDay() { 106 106 val name = "Test" 107 107 val color = ColorMapper.getAvailableColors().first() 108 - val icon = iconMapper.availableIconsNames.values.first() 108 + val icon = iconImageMapper.availableIconsNames.values.first() 109 109 110 110 // Add activity 111 111 testUtils.addActivity(name, color, icon) ··· 176 176 fun statisticsDetailWeek() { 177 177 val name = "Test" 178 178 val color = ColorMapper.getAvailableColors().first() 179 - val icon = iconMapper.availableIconsNames.values.first() 179 + val icon = iconImageMapper.availableIconsNames.values.first() 180 180 181 181 // Add activity 182 182 testUtils.addActivity(name, color, icon) ··· 247 247 fun statisticsDetailMonth() { 248 248 val name = "Test" 249 249 val color = ColorMapper.getAvailableColors().first() 250 - val icon = iconMapper.availableIconsNames.values.first() 250 + val icon = iconImageMapper.availableIconsNames.values.first() 251 251 252 252 // Add activity 253 253 testUtils.addActivity(name, color, icon) ··· 318 318 fun statisticsDetailYear() { 319 319 val name = "Test" 320 320 val color = ColorMapper.getAvailableColors().first() 321 - val icon = iconMapper.availableIconsNames.values.first() 321 + val icon = iconImageMapper.availableIconsNames.values.first() 322 322 323 323 // Add activity 324 324 testUtils.addActivity(name, color, icon)
+2 -2
app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsFilterTest.kt
··· 26 26 val newName = "Test2" 27 27 val firstColor = ColorMapper.getAvailableColors().first() 28 28 val lastColor = ColorMapper.getAvailableColors().last() 29 - val firstIcon = iconMapper.availableIconsNames.values.first() 30 - val lastIcon = iconMapper.availableIconsNames.values.last() 29 + val firstIcon = iconImageMapper.availableIconsNames.values.first() 30 + val lastIcon = iconImageMapper.availableIconsNames.values.last() 31 31 32 32 // Add activities 33 33 testUtils.addActivity(name, firstColor, firstIcon)
+2 -2
app/src/androidTest/java/com/example/util/simpletimetracker/StatisticsTest.kt
··· 31 31 val newName = "Test2" 32 32 val firstColor = ColorMapper.getAvailableColors().first() 33 33 val lastColor = ColorMapper.getAvailableColors().last() 34 - val firstIcon = iconMapper.availableIconsNames.values.first() 35 - val lastIcon = iconMapper.availableIconsNames.values.last() 34 + val firstIcon = iconImageMapper.availableIconsNames.values.first() 35 + val lastIcon = iconImageMapper.availableIconsNames.values.last() 36 36 37 37 // Add activities 38 38 testUtils.addActivity(name, firstColor, firstIcon)
+2 -2
app/src/androidTest/java/com/example/util/simpletimetracker/utils/BaseUiTest.kt
··· 4 4 import androidx.test.espresso.IdlingRegistry 5 5 import androidx.test.ext.junit.rules.ActivityScenarioRule 6 6 import com.example.util.simpletimetracker.TimeTrackerApp 7 - import com.example.util.simpletimetracker.core.mapper.IconMapper 7 + import com.example.util.simpletimetracker.core.mapper.IconImageMapper 8 8 import com.example.util.simpletimetracker.core.mapper.TimeMapper 9 9 import com.example.util.simpletimetracker.core.utils.CountingIdlingResourceProvider 10 10 import com.example.util.simpletimetracker.core.utils.TestUtils ··· 24 24 lateinit var testUtils: TestUtils 25 25 26 26 @Inject 27 - lateinit var iconMapper: IconMapper 27 + lateinit var iconImageMapper: IconImageMapper 28 28 29 29 @Inject 30 30 lateinit var timeMapper: TimeMapper
-110
core/src/main/java/com/example/util/simpletimetracker/core/mapper/EmojiMapper.kt
··· 1 - package com.example.util.simpletimetracker.core.mapper 2 - 3 - import com.example.util.simpletimetracker.core.R 4 - import com.example.util.simpletimetracker.core.repo.EmojiRepo 5 - import com.example.util.simpletimetracker.core.repo.ResourceRepo 6 - import com.example.util.simpletimetracker.domain.model.EmojiCategory 7 - import com.example.util.simpletimetracker.domain.model.EmojiType 8 - import javax.inject.Inject 9 - import javax.inject.Singleton 10 - 11 - @Singleton 12 - class EmojiMapper @Inject constructor( 13 - private val repo: EmojiRepo, 14 - private val resourceRepo: ResourceRepo 15 - ) { 16 - 17 - fun getAvailableEmojiCategories(): List<EmojiCategory> = listOf( 18 - EmojiCategory( 19 - EmojiType.SMILEYS, resourceRepo.getString(R.string.emojiGroupSmileys), "\uD83D\uDE00" 20 - ), 21 - EmojiCategory( 22 - EmojiType.PEOPLE, resourceRepo.getString(R.string.emojiGroupPeople), "\uD83D\uDC4B" 23 - ), 24 - EmojiCategory( 25 - EmojiType.ANIMALS, resourceRepo.getString(R.string.emojiGroupAnimals), "\uD83D\uDC35" 26 - ), 27 - EmojiCategory( 28 - EmojiType.FOOD, resourceRepo.getString(R.string.emojiGroupFood), "\uD83C\uDF47" 29 - ), 30 - EmojiCategory( 31 - EmojiType.TRAVEL, resourceRepo.getString(R.string.emojiGroupTravel), "\uD83C\uDF0D" 32 - ), 33 - EmojiCategory( 34 - EmojiType.ACTIVITIES, resourceRepo.getString(R.string.emojiGroupActivities), "\uD83C\uDF83" 35 - ), 36 - EmojiCategory( 37 - EmojiType.OBJECTS, resourceRepo.getString(R.string.emojiGroupObjects), "\uD83D\uDC53" 38 - ), 39 - EmojiCategory( 40 - EmojiType.SYMBOLS, resourceRepo.getString(R.string.emojiGroupSymbols), "\uD83C\uDFE7" 41 - ), 42 - EmojiCategory( 43 - EmojiType.FLAGS, resourceRepo.getString(R.string.emojiGroupFlags), "\uD83C\uDFC1" 44 - ) 45 - ) 46 - 47 - fun getAvailableEmojis(): Map<EmojiCategory, List<String>> = 48 - getAvailableEmojiCategories().map { it to mapTypeToCodes(it.type) }.toMap() 49 - 50 - fun hasSkinToneVariations(codes: String): Boolean = 51 - codes.contains(EmojiRepo.SKIN_TONE) 52 - 53 - fun toEmojiString(codes: String): String = 54 - if (hasSkinToneVariations(codes)) { 55 - replaceSameSkinTone(codes).replace(EmojiRepo.SKIN_TONE, "") 56 - } else { 57 - codes 58 - } 59 - 60 - fun toSkinToneVariations(codes: String): List<String> { 61 - if (!hasSkinToneVariations(codes)) return listOf(codes) 62 - 63 - // Split to skin tone variants. 64 - return EmojiRepo.skinTones.map { skinToneCode -> 65 - val newCodes = codes.replaceFirst(EmojiRepo.SKIN_TONE, skinToneCode) 66 - 67 - // If has seconds skin tone - split again. 68 - if (hasSkinToneVariations(newCodes)) { 69 - EmojiRepo.skinTones.map { secondSkinToneCode -> 70 - // If has replacement and has same first skin and second skin tone - replace whole thing. 71 - if (newCodes.contains(EmojiRepo.SAME_TONE_REPLACEMENT)) { 72 - if (skinToneCode == secondSkinToneCode) { 73 - replaceSameSkinTone(newCodes) 74 - } else { 75 - removeSameSkinToneReplacement(newCodes) 76 - } 77 - } else { 78 - newCodes 79 - }.replaceFirst(EmojiRepo.SKIN_TONE, secondSkinToneCode) 80 - } 81 - } else { 82 - listOf(newCodes) 83 - } 84 - }.flatten() 85 - } 86 - 87 - private fun replaceSameSkinTone(codes: String): String { 88 - // if there is a replacement - return string after marker, 89 - // if no replacement - return original string 90 - return codes.replaceBefore(EmojiRepo.SAME_TONE_REPLACEMENT, "") 91 - .replace(EmojiRepo.SAME_TONE_REPLACEMENT, "") 92 - } 93 - 94 - private fun removeSameSkinToneReplacement(codes: String): String { 95 - return codes.replaceAfter(EmojiRepo.SAME_TONE_REPLACEMENT, "") 96 - .replace(EmojiRepo.SAME_TONE_REPLACEMENT, "") 97 - } 98 - 99 - private fun mapTypeToCodes(type: EmojiType): List<String> = when (type) { 100 - EmojiType.SMILEYS -> repo.getGroupSmileys() 101 - EmojiType.PEOPLE -> repo.getGroupPeople() 102 - EmojiType.ANIMALS -> repo.getGroupAnimals() 103 - EmojiType.FOOD -> repo.getGroupFood() 104 - EmojiType.TRAVEL -> repo.getGroupTravel() 105 - EmojiType.ACTIVITIES -> repo.getGroupActivities() 106 - EmojiType.OBJECTS -> repo.getGroupObjects() 107 - EmojiType.SYMBOLS -> repo.getGroupSymbols() 108 - EmojiType.FLAGS -> repo.getGroupFlags() 109 - } 110 - }
+130
core/src/main/java/com/example/util/simpletimetracker/core/mapper/IconEmojiMapper.kt
··· 1 + package com.example.util.simpletimetracker.core.mapper 2 + 3 + import com.example.util.simpletimetracker.core.R 4 + import com.example.util.simpletimetracker.core.repo.IconEmojiRepo 5 + import com.example.util.simpletimetracker.core.repo.ResourceRepo 6 + import com.example.util.simpletimetracker.domain.model.IconEmojiCategory 7 + import com.example.util.simpletimetracker.domain.model.IconEmojiType 8 + import javax.inject.Inject 9 + import javax.inject.Singleton 10 + 11 + @Singleton 12 + class IconEmojiMapper @Inject constructor( 13 + private val repo: IconEmojiRepo, 14 + private val resourceRepo: ResourceRepo 15 + ) { 16 + 17 + fun getAvailableEmojiCategories(): List<IconEmojiCategory> = listOf( 18 + IconEmojiCategory( 19 + type = IconEmojiType.SMILEYS, 20 + name = resourceRepo.getString(R.string.emojiGroupSmileys), 21 + categoryIcon = R.drawable.icon_category_emoji_emotions 22 + ), 23 + IconEmojiCategory( 24 + type = IconEmojiType.PEOPLE, 25 + name = resourceRepo.getString(R.string.emojiGroupPeople), 26 + categoryIcon = R.drawable.icon_category_emoji_people 27 + ), 28 + IconEmojiCategory( 29 + type = IconEmojiType.ANIMALS, 30 + name = resourceRepo.getString(R.string.emojiGroupAnimals), 31 + categoryIcon = R.drawable.icon_category_emoji_nature 32 + ), 33 + IconEmojiCategory( 34 + type = IconEmojiType.FOOD, 35 + name = resourceRepo.getString(R.string.emojiGroupFood), 36 + categoryIcon = R.drawable.icon_category_emoji_food_beverage 37 + ), 38 + IconEmojiCategory( 39 + type = IconEmojiType.TRAVEL, 40 + name = resourceRepo.getString(R.string.emojiGroupTravel), 41 + categoryIcon = R.drawable.icon_category_emoji_transportation 42 + ), 43 + IconEmojiCategory( 44 + type = IconEmojiType.ACTIVITIES, 45 + name = resourceRepo.getString(R.string.emojiGroupActivities), 46 + categoryIcon = R.drawable.icon_category_emoji_events 47 + ), 48 + IconEmojiCategory( 49 + type = IconEmojiType.OBJECTS, 50 + name = resourceRepo.getString(R.string.emojiGroupObjects), 51 + categoryIcon = R.drawable.icon_category_emoji_objects 52 + ), 53 + IconEmojiCategory( 54 + type = IconEmojiType.SYMBOLS, 55 + name = resourceRepo.getString(R.string.emojiGroupSymbols), 56 + categoryIcon = R.drawable.icon_category_emoji_symbols 57 + ), 58 + IconEmojiCategory( 59 + type = IconEmojiType.FLAGS, 60 + name = resourceRepo.getString(R.string.emojiGroupFlags), 61 + categoryIcon = R.drawable.icon_category_emoji_flags 62 + ) 63 + ) 64 + 65 + fun getAvailableEmojis(): Map<IconEmojiCategory, List<String>> = 66 + getAvailableEmojiCategories() 67 + .map() { it to mapTypeToCodes(it.type) } 68 + .toMap() 69 + 70 + fun hasSkinToneVariations(codes: String): Boolean = 71 + codes.contains(IconEmojiRepo.SKIN_TONE) 72 + 73 + fun toEmojiString(codes: String): String = 74 + if (hasSkinToneVariations(codes)) { 75 + replaceSameSkinTone(codes).replace(IconEmojiRepo.SKIN_TONE, "") 76 + } else { 77 + codes 78 + } 79 + 80 + fun toSkinToneVariations(codes: String): List<String> { 81 + if (!hasSkinToneVariations(codes)) return listOf(codes) 82 + 83 + // Split to skin tone variants. 84 + return IconEmojiRepo.skinTones.map { skinToneCode -> 85 + val newCodes = codes.replaceFirst(IconEmojiRepo.SKIN_TONE, skinToneCode) 86 + 87 + // If has seconds skin tone - split again. 88 + if (hasSkinToneVariations(newCodes)) { 89 + IconEmojiRepo.skinTones.map { secondSkinToneCode -> 90 + // If has replacement and has same first skin and second skin tone - replace whole thing. 91 + if (newCodes.contains(IconEmojiRepo.SAME_TONE_REPLACEMENT)) { 92 + if (skinToneCode == secondSkinToneCode) { 93 + replaceSameSkinTone(newCodes) 94 + } else { 95 + removeSameSkinToneReplacement(newCodes) 96 + } 97 + } else { 98 + newCodes 99 + }.replaceFirst(IconEmojiRepo.SKIN_TONE, secondSkinToneCode) 100 + } 101 + } else { 102 + listOf(newCodes) 103 + } 104 + }.flatten() 105 + } 106 + 107 + private fun replaceSameSkinTone(codes: String): String { 108 + // if there is a replacement - return string after marker, 109 + // if no replacement - return original string 110 + return codes.replaceBefore(IconEmojiRepo.SAME_TONE_REPLACEMENT, "") 111 + .replace(IconEmojiRepo.SAME_TONE_REPLACEMENT, "") 112 + } 113 + 114 + private fun removeSameSkinToneReplacement(codes: String): String { 115 + return codes.replaceAfter(IconEmojiRepo.SAME_TONE_REPLACEMENT, "") 116 + .replace(IconEmojiRepo.SAME_TONE_REPLACEMENT, "") 117 + } 118 + 119 + private fun mapTypeToCodes(type: IconEmojiType): List<String> = when (type) { 120 + IconEmojiType.SMILEYS -> repo.getGroupSmileys() 121 + IconEmojiType.PEOPLE -> repo.getGroupPeople() 122 + IconEmojiType.ANIMALS -> repo.getGroupAnimals() 123 + IconEmojiType.FOOD -> repo.getGroupFood() 124 + IconEmojiType.TRAVEL -> repo.getGroupTravel() 125 + IconEmojiType.ACTIVITIES -> repo.getGroupActivities() 126 + IconEmojiType.OBJECTS -> repo.getGroupObjects() 127 + IconEmojiType.SYMBOLS -> repo.getGroupSymbols() 128 + IconEmojiType.FLAGS -> repo.getGroupFlags() 129 + } 130 + }
+150
core/src/main/java/com/example/util/simpletimetracker/core/mapper/IconImageMapper.kt
··· 1 + package com.example.util.simpletimetracker.core.mapper 2 + 3 + import android.content.Context 4 + import com.example.util.simpletimetracker.core.R 5 + import com.example.util.simpletimetracker.core.repo.IconImageRepo 6 + import com.example.util.simpletimetracker.core.repo.ResourceRepo 7 + import com.example.util.simpletimetracker.domain.di.AppContext 8 + import com.example.util.simpletimetracker.domain.model.IconImageCategory 9 + import com.example.util.simpletimetracker.domain.model.IconImageType 10 + import javax.inject.Inject 11 + import javax.inject.Singleton 12 + 13 + @Singleton 14 + class IconImageMapper @Inject constructor( 15 + @AppContext private val context: Context, 16 + private val repo: IconImageRepo, 17 + private val resourceRepo: ResourceRepo 18 + ) { 19 + 20 + // TODO remove 21 + val availableIconsNames: Map<String, Int> by lazy { 22 + val res: MutableMap<String, Int> = mutableMapOf() 23 + 24 + getAvailableCategories() 25 + .map(IconImageCategory::type) 26 + .map(::mapTypeToArray) 27 + .map(repo::getImages) 28 + .forEach { 29 + it.forEach { (key, value) -> 30 + res[key] = value 31 + } 32 + } 33 + 34 + res 35 + } 36 + 37 + fun getAvailableCategories(): List<IconImageCategory> = listOf( 38 + IconImageCategory( 39 + type = IconImageType.MAPS, 40 + name = resourceRepo.getString(R.string.imageGroupMaps), 41 + categoryIcon = R.drawable.unknown 42 + ), 43 + IconImageCategory( 44 + type = IconImageType.PLACES, 45 + name = resourceRepo.getString(R.string.imageGroupPlaces), 46 + categoryIcon = R.drawable.unknown 47 + ), 48 + IconImageCategory( 49 + type = IconImageType.SOCIAL, 50 + name = resourceRepo.getString(R.string.imageGroupSocial), 51 + categoryIcon = R.drawable.unknown 52 + ), 53 + IconImageCategory( 54 + type = IconImageType.ACTION, 55 + name = resourceRepo.getString(R.string.imageGroupAction), 56 + categoryIcon = R.drawable.unknown 57 + ), 58 + IconImageCategory( 59 + type = IconImageType.HARDWARE, 60 + name = resourceRepo.getString(R.string.imageGroupHardware), 61 + categoryIcon = R.drawable.unknown 62 + ), 63 + IconImageCategory( 64 + type = IconImageType.ALERT, 65 + name = resourceRepo.getString(R.string.imageGroupAlert), 66 + categoryIcon = R.drawable.unknown 67 + ), 68 + IconImageCategory( 69 + type = IconImageType.AV, 70 + name = resourceRepo.getString(R.string.imageGroupAv), 71 + categoryIcon = R.drawable.unknown 72 + ), 73 + IconImageCategory( 74 + type = IconImageType.COMMUNICATION, 75 + name = resourceRepo.getString(R.string.imageGroupCommunication), 76 + categoryIcon = R.drawable.unknown 77 + ), 78 + IconImageCategory( 79 + type = IconImageType.CONTENT, 80 + name = resourceRepo.getString(R.string.imageGroupContent), 81 + categoryIcon = R.drawable.unknown 82 + ), 83 + IconImageCategory( 84 + type = IconImageType.DEVICE, 85 + name = resourceRepo.getString(R.string.imageGroupDevice), 86 + categoryIcon = R.drawable.unknown 87 + ), 88 + IconImageCategory( 89 + type = IconImageType.EDITOR, 90 + name = resourceRepo.getString(R.string.imageGroupEditor), 91 + categoryIcon = R.drawable.unknown 92 + ), 93 + IconImageCategory( 94 + type = IconImageType.FILE, 95 + name = resourceRepo.getString(R.string.imageGroupFile), 96 + categoryIcon = R.drawable.unknown 97 + ), 98 + IconImageCategory( 99 + type = IconImageType.IMAGE, 100 + name = resourceRepo.getString(R.string.imageGroupImage), 101 + categoryIcon = R.drawable.unknown 102 + ), 103 + IconImageCategory( 104 + type = IconImageType.NAVIGATION, 105 + name = resourceRepo.getString(R.string.imageGroupNavigation), 106 + categoryIcon = R.drawable.unknown 107 + ), 108 + IconImageCategory( 109 + type = IconImageType.NOTIFICATION, 110 + name = resourceRepo.getString(R.string.imageGroupNotification), 111 + categoryIcon = R.drawable.unknown 112 + ), 113 + IconImageCategory( 114 + type = IconImageType.TOGGLE, 115 + name = resourceRepo.getString(R.string.imageGroupToggle), 116 + categoryIcon = R.drawable.unknown 117 + ) 118 + ) 119 + 120 + fun getAvailableImages(): Map<IconImageCategory, Map<String, Int>> = 121 + getAvailableCategories() 122 + .map { it to mapTypeToArray(it.type).let(repo::getImages) } 123 + .toMap() 124 + 125 + fun mapToDrawableResId(iconName: String): Int { 126 + return context.resources 127 + .getIdentifier(iconName, "drawable", context.packageName) 128 + .takeIf { it != 0 } 129 + ?: R.drawable.unknown 130 + } 131 + 132 + private fun mapTypeToArray(type: IconImageType): Int = when (type) { 133 + IconImageType.MAPS -> R.array.icon_maps 134 + IconImageType.PLACES -> R.array.icon_places 135 + IconImageType.SOCIAL -> R.array.icon_social 136 + IconImageType.ACTION -> R.array.icon_action 137 + IconImageType.HARDWARE -> R.array.icon_hardware 138 + IconImageType.ALERT -> R.array.icon_alert 139 + IconImageType.AV -> R.array.icon_av 140 + IconImageType.COMMUNICATION -> R.array.icon_communication 141 + IconImageType.CONTENT -> R.array.icon_content 142 + IconImageType.DEVICE -> R.array.icon_device 143 + IconImageType.EDITOR -> R.array.icon_editor 144 + IconImageType.FILE -> R.array.icon_file 145 + IconImageType.IMAGE -> R.array.icon_image 146 + IconImageType.NAVIGATION -> R.array.icon_navigation 147 + IconImageType.NOTIFICATION -> R.array.icon_notification 148 + IconImageType.TOGGLE -> R.array.icon_toggle 149 + } 150 + }
-59
core/src/main/java/com/example/util/simpletimetracker/core/mapper/IconMapper.kt
··· 1 - package com.example.util.simpletimetracker.core.mapper 2 - 3 - import android.content.Context 4 - import com.example.util.simpletimetracker.core.R 5 - import com.example.util.simpletimetracker.domain.di.AppContext 6 - import javax.inject.Inject 7 - import javax.inject.Singleton 8 - 9 - @Singleton 10 - class IconMapper @Inject constructor( 11 - @AppContext private val context: Context 12 - ) { 13 - 14 - val availableIconsNames: Map<String, Int> by lazy { 15 - getIcons( 16 - listOf( 17 - R.array.icon_maps, 18 - R.array.icon_places, 19 - R.array.icon_social, 20 - R.array.icon_action, 21 - R.array.icon_hardware, 22 - R.array.icon_alert, 23 - R.array.icon_av, 24 - R.array.icon_communication, 25 - R.array.icon_content, 26 - R.array.icon_device, 27 - R.array.icon_editor, 28 - R.array.icon_file, 29 - R.array.icon_image, 30 - R.array.icon_navigation, 31 - R.array.icon_notification, 32 - R.array.icon_toggle 33 - ) 34 - ) 35 - } 36 - 37 - fun mapToDrawableResId(iconName: String): Int { 38 - return context.resources 39 - .getIdentifier(iconName, "drawable", context.packageName) 40 - .takeIf { it in availableIconsNames.values } 41 - ?: R.drawable.unknown 42 - } 43 - 44 - private fun getIcons(arrayResIds: List<Int>): Map<String, Int> { 45 - val res = mutableMapOf<String, Int>() 46 - 47 - arrayResIds.forEach { arrayResId -> 48 - val ta = context.resources.obtainTypedArray(arrayResId) 49 - (0 until ta.length()).forEach { 50 - ta.getResourceId(it, R.drawable.unknown).let { resId -> 51 - res[context.resources.getResourceEntryName(resId)] = resId 52 - } 53 - } 54 - ta.recycle() 55 - } 56 - 57 - return res 58 - } 59 - }
+2 -2
core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordTypeViewDataMapper.kt
··· 7 7 import javax.inject.Inject 8 8 9 9 class RecordTypeViewDataMapper @Inject constructor( 10 - private val iconMapper: IconMapper, 10 + private val iconImageMapper: IconImageMapper, 11 11 private val colorMapper: ColorMapper, 12 12 private val resourceRepo: ResourceRepo, 13 13 private val recordTypeCardSizeMapper: RecordTypeCardSizeMapper ··· 63 63 64 64 fun mapIcon(icon: String): RecordTypeIcon { 65 65 return if (icon.startsWith("ic_") || icon.isEmpty()) { 66 - icon.let(iconMapper::mapToDrawableResId).let(RecordTypeIcon::Image) 66 + icon.let(iconImageMapper::mapToDrawableResId).let(RecordTypeIcon::Image) 67 67 } else { 68 68 RecordTypeIcon.Emoji(icon) 69 69 }
+1 -1
core/src/main/java/com/example/util/simpletimetracker/core/repo/EmojiRepo.kt core/src/main/java/com/example/util/simpletimetracker/core/repo/IconEmojiRepo.kt
··· 5 5 import com.example.util.simpletimetracker.domain.di.AppContext 6 6 import javax.inject.Inject 7 7 8 - class EmojiRepo @Inject constructor( 8 + class IconEmojiRepo @Inject constructor( 9 9 @AppContext private val context: Context 10 10 ) { 11 11
+25
core/src/main/java/com/example/util/simpletimetracker/core/repo/IconImageRepo.kt
··· 1 + package com.example.util.simpletimetracker.core.repo 2 + 3 + import android.content.Context 4 + import com.example.util.simpletimetracker.core.R 5 + import com.example.util.simpletimetracker.domain.di.AppContext 6 + import javax.inject.Inject 7 + 8 + class IconImageRepo @Inject constructor( 9 + @AppContext private val context: Context 10 + ) { 11 + 12 + fun getImages(arrayResId: Int): Map<String, Int> { 13 + val res = mutableMapOf<String, Int>() 14 + 15 + val ta = context.resources.obtainTypedArray(arrayResId) 16 + (0 until ta.length()).forEach { 17 + ta.getResourceId(it, R.drawable.unknown).let { resId -> 18 + res[context.resources.getResourceEntryName(resId)] = resId 19 + } 20 + } 21 + ta.recycle() 22 + 23 + return res 24 + } 25 + }
+3 -3
core/src/main/java/com/example/util/simpletimetracker/core/utils/TestUtils.kt
··· 1 1 package com.example.util.simpletimetracker.core.utils 2 2 3 3 import com.example.util.simpletimetracker.core.mapper.ColorMapper 4 - import com.example.util.simpletimetracker.core.mapper.IconMapper 4 + import com.example.util.simpletimetracker.core.mapper.IconImageMapper 5 5 import com.example.util.simpletimetracker.domain.extension.orZero 6 6 import com.example.util.simpletimetracker.domain.interactor.CategoryInteractor 7 7 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor ··· 22 22 private val categoryInteractor: CategoryInteractor, 23 23 private val recordTypeCategoryInteractor: RecordTypeCategoryInteractor, 24 24 private val prefsInteractor: PrefsInteractor, 25 - private val iconMapper: IconMapper 25 + private val iconImageMapper: IconImageMapper 26 26 ) { 27 27 28 28 fun clearDatabase() = runBlocking { ··· 44 44 goalTime: Long? = null, 45 45 categories: List<String> = emptyList() 46 46 ) = runBlocking { 47 - val icons = iconMapper.availableIconsNames 47 + val icons = iconImageMapper.availableIconsNames 48 48 val iconId = icons.filterValues { it == icon }.keys.firstOrNull() 49 49 ?: icons.keys.first() 50 50
+9
core/src/main/res/drawable/icon_category_emoji_emotions.xml
··· 1 + <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 + android:width="24dp" 3 + android:height="24dp" 4 + android:viewportWidth="24" 5 + android:viewportHeight="24"> 6 + <path 7 + android:fillColor="#FF000000" 8 + android:pathData="M11.99,2C6.47,2 2,6.48 2,12c0,5.52 4.47,10 9.99,10C17.52,22 22,17.52 22,12C22,6.48 17.52,2 11.99,2zM8.5,8C9.33,8 10,8.67 10,9.5S9.33,11 8.5,11S7,10.33 7,9.5S7.67,8 8.5,8zM12,18c-2.28,0 -4.22,-1.66 -5,-4h10C16.22,16.34 14.28,18 12,18zM15.5,11c-0.83,0 -1.5,-0.67 -1.5,-1.5S14.67,8 15.5,8S17,8.67 17,9.5S16.33,11 15.5,11z"/> 9 + </vector>
+9
core/src/main/res/drawable/icon_category_emoji_events.xml
··· 1 + <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 + android:width="24dp" 3 + android:height="24dp" 4 + android:viewportWidth="24" 5 + android:viewportHeight="24"> 6 + <path 7 + android:fillColor="#FF000000" 8 + android:pathData="M19,5h-2V3H7v2H5C3.9,5 3,5.9 3,7v1c0,2.55 1.92,4.63 4.39,4.94c0.63,1.5 1.98,2.63 3.61,2.96V19H7v2h10v-2h-4v-3.1c1.63,-0.33 2.98,-1.46 3.61,-2.96C19.08,12.63 21,10.55 21,8V7C21,5.9 20.1,5 19,5zM5,8V7h2v3.82C5.84,10.4 5,9.3 5,8zM19,8c0,1.3 -0.84,2.4 -2,2.82V7h2V8z"/> 9 + </vector>
+9
core/src/main/res/drawable/icon_category_emoji_flags.xml
··· 1 + <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 + android:width="24dp" 3 + android:height="24dp" 4 + android:viewportWidth="24" 5 + android:viewportHeight="24"> 6 + <path 7 + android:fillColor="#FF000000" 8 + android:pathData="M14,9l-1,-2H7V5.72C7.6,5.38 8,4.74 8,4c0,-1.1 -0.9,-2 -2,-2S4,2.9 4,4c0,0.74 0.4,1.38 1,1.72V21h2v-4h5l1,2h7V9H14zM18,17h-4l-1,-2H7V9h5l1,2h5V17z"/> 9 + </vector>
+12
core/src/main/res/drawable/icon_category_emoji_food_beverage.xml
··· 1 + <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 + android:width="24dp" 3 + android:height="24dp" 4 + android:viewportWidth="24" 5 + android:viewportHeight="24"> 6 + <path 7 + android:fillColor="#FF000000" 8 + android:pathData="M20,3H9v2.4l1.81,1.45C10.93,6.94 11,7.09 11,7.24v4.26c0,0.28 -0.22,0.5 -0.5,0.5h-4C6.22,12 6,11.78 6,11.5V7.24c0,-0.15 0.07,-0.3 0.19,-0.39L8,5.4V3H4v10c0,2.21 1.79,4 4,4h6c2.21,0 4,-1.79 4,-4v-3h2c1.11,0 2,-0.9 2,-2V5C22,3.89 21.11,3 20,3zM20,8h-2V5h2V8z"/> 9 + <path 10 + android:fillColor="#FF000000" 11 + android:pathData="M4,19h16v2h-16z"/> 12 + </vector>
+12
core/src/main/res/drawable/icon_category_emoji_nature.xml
··· 1 + <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 + android:width="24dp" 3 + android:height="24dp" 4 + android:viewportWidth="24" 5 + android:viewportHeight="24"> 6 + <path 7 + android:fillColor="#FF000000" 8 + android:pathData="M21.94,4.88C21.76,4.35 21.25,4 20.68,4c-0.03,0 -0.06,0 -0.09,0H19.6l-0.31,-0.97C19.15,2.43 18.61,2 18,2h0c-0.61,0 -1.15,0.43 -1.29,1.04L16.4,4h-0.98c-0.03,0 -0.06,0 -0.09,0c-0.57,0 -1.08,0.35 -1.26,0.88c-0.19,0.56 0.04,1.17 0.56,1.48l0.87,0.52L15.1,8.12c-0.23,0.58 -0.04,1.25 0.45,1.62C15.78,9.91 16.06,10 16.33,10c0.31,0 0.61,-0.11 0.86,-0.32L18,8.98l0.81,0.7C19.06,9.89 19.36,10 19.67,10c0.27,0 0.55,-0.09 0.78,-0.26c0.5,-0.37 0.68,-1.04 0.45,-1.62l-0.39,-1.24l0.87,-0.52C21.89,6.05 22.12,5.44 21.94,4.88zM18,7c-0.55,0 -1,-0.45 -1,-1c0,-0.55 0.45,-1 1,-1s1,0.45 1,1C19,6.55 18.55,7 18,7z"/> 9 + <path 10 + android:fillColor="#FF000000" 11 + android:pathData="M13.49,10.51c-0.43,-0.43 -0.94,-0.73 -1.49,-0.93V8h-1v1.38c-0.11,-0.01 -0.23,-0.03 -0.34,-0.03c-1.02,0 -2.05,0.39 -2.83,1.17c-0.16,0.16 -0.3,0.34 -0.43,0.53L6,10.52c-1.56,-0.55 -3.28,0.27 -3.83,1.82c0,0 0,0 0,0c-0.27,0.75 -0.23,1.57 0.12,2.29c0.23,0.48 0.58,0.87 1,1.16c-0.38,1.35 -0.06,2.85 1,3.91c1.06,1.06 2.57,1.38 3.91,1c0.29,0.42 0.68,0.77 1.16,1C9.78,21.9 10.21,22 10.65,22c0.34,0 0.68,-0.06 1.01,-0.17c0,0 0,0 0,0c1.56,-0.55 2.38,-2.27 1.82,-3.85l-0.52,-1.37c0.18,-0.13 0.36,-0.27 0.53,-0.43c0.87,-0.87 1.24,-2.04 1.14,-3.17H16v-1h-1.59C14.22,11.46 13.92,10.95 13.49,10.51zM4.67,14.29c-0.25,-0.09 -0.45,-0.27 -0.57,-0.51s-0.13,-0.51 -0.04,-0.76c0.19,-0.52 0.76,-0.79 1.26,-0.61l3.16,1.19C7.33,14.2 5.85,14.71 4.67,14.29zM10.99,19.94c-0.25,0.09 -0.52,0.08 -0.76,-0.04c-0.24,-0.11 -0.42,-0.32 -0.51,-0.57c-0.42,-1.18 0.09,-2.65 0.7,-3.8l1.18,3.13C11.78,19.18 11.51,19.76 10.99,19.94zM12.2,14.6l-0.61,-1.61c0,-0.01 -0.01,-0.02 -0.02,-0.03c-0.02,-0.04 -0.04,-0.08 -0.06,-0.12c-0.02,-0.04 -0.04,-0.07 -0.07,-0.11c-0.03,-0.03 -0.06,-0.06 -0.09,-0.09c-0.03,-0.03 -0.06,-0.06 -0.09,-0.09c-0.03,-0.03 -0.07,-0.05 -0.11,-0.07c-0.04,-0.02 -0.07,-0.05 -0.12,-0.06c-0.01,0 -0.02,-0.01 -0.03,-0.02L9.4,11.8c0.36,-0.29 0.79,-0.46 1.26,-0.46c0.53,0 1.04,0.21 1.41,0.59C12.8,12.66 12.84,13.81 12.2,14.6z"/> 12 + </vector>
+9
core/src/main/res/drawable/icon_category_emoji_objects.xml
··· 1 + <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 + android:width="24dp" 3 + android:height="24dp" 4 + android:viewportWidth="24" 5 + android:viewportHeight="24"> 6 + <path 7 + android:fillColor="#FF000000" 8 + android:pathData="M12,3c-0.46,0 -0.93,0.04 -1.4,0.14C7.84,3.67 5.64,5.9 5.12,8.66c-0.48,2.61 0.48,5.01 2.22,6.56C7.77,15.6 8,16.13 8,16.69V19c0,1.1 0.9,2 2,2h0.28c0.35,0.6 0.98,1 1.72,1s1.38,-0.4 1.72,-1H14c1.1,0 2,-0.9 2,-2v-2.31c0,-0.55 0.22,-1.09 0.64,-1.46C18.09,13.95 19,12.08 19,10C19,6.13 15.87,3 12,3zM14,19h-4v-1h4V19zM14,17h-4v-1h4V17zM12.5,11.41V14h-1v-2.59L9.67,9.59l0.71,-0.71L12,10.5l1.62,-1.62l0.71,0.71L12.5,11.41z"/> 9 + </vector>
+12
core/src/main/res/drawable/icon_category_emoji_people.xml
··· 1 + <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 + android:width="24dp" 3 + android:height="24dp" 4 + android:viewportWidth="24" 5 + android:viewportHeight="24"> 6 + <path 7 + android:fillColor="#FF000000" 8 + android:pathData="M12,4m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"/> 9 + <path 10 + android:fillColor="#FF000000" 11 + android:pathData="M15.89,8.11C15.5,7.72 14.83,7 13.53,7c-0.21,0 -1.42,0 -2.54,0C8.24,6.99 6,4.75 6,2H4c0,3.16 2.11,5.84 5,6.71V22h2v-6h2v6h2V10.05L18.95,14l1.41,-1.41L15.89,8.11z"/> 12 + </vector>
+27
core/src/main/res/drawable/icon_category_emoji_symbols.xml
··· 1 + <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 + android:width="24dp" 3 + android:height="24dp" 4 + android:viewportWidth="24" 5 + android:viewportHeight="24"> 6 + <path 7 + android:fillColor="#FF000000" 8 + android:pathData="M3,2h8v2h-8z"/> 9 + <path 10 + android:fillColor="#FF000000" 11 + android:pathData="M6,11l2,0l0,-4l3,0l0,-2l-8,0l0,2l3,0z"/> 12 + <path 13 + android:fillColor="#FF000000" 14 + android:pathData="M12.4036,20.1819l7.7781,-7.7781l1.4142,1.4142l-7.7781,7.7781z"/> 15 + <path 16 + android:fillColor="#FF000000" 17 + android:pathData="M14.5,14.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/> 18 + <path 19 + android:fillColor="#FF000000" 20 + android:pathData="M19.5,19.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/> 21 + <path 22 + android:fillColor="#FF000000" 23 + android:pathData="M15.5,11c1.38,0 2.5,-1.12 2.5,-2.5V4h3V2h-4v4.51C16.58,6.19 16.07,6 15.5,6C14.12,6 13,7.12 13,8.5C13,9.88 14.12,11 15.5,11z"/> 24 + <path 25 + android:fillColor="#FF000000" 26 + android:pathData="M9.74,15.96l-1.41,1.41l-0.71,-0.71l0.35,-0.35c0.98,-0.98 0.98,-2.56 0,-3.54c-0.49,-0.49 -1.13,-0.73 -1.77,-0.73c-0.64,0 -1.28,0.24 -1.77,0.73c-0.98,0.98 -0.98,2.56 0,3.54l0.35,0.35l-1.06,1.06c-0.98,0.98 -0.98,2.56 0,3.54C4.22,21.76 4.86,22 5.5,22s1.28,-0.24 1.77,-0.73l1.06,-1.06l1.41,1.41l1.41,-1.41l-1.41,-1.41l1.41,-1.41L9.74,15.96zM5.85,14.2c0.12,-0.12 0.26,-0.15 0.35,-0.15s0.23,0.03 0.35,0.15c0.19,0.2 0.19,0.51 0,0.71l-0.35,0.35L5.85,14.9C5.66,14.71 5.66,14.39 5.85,14.2zM5.85,19.85C5.73,19.97 5.59,20 5.5,20s-0.23,-0.03 -0.35,-0.15c-0.19,-0.19 -0.19,-0.51 0,-0.71l1.06,-1.06l0.71,0.71L5.85,19.85z"/> 27 + </vector>
+24
core/src/main/res/drawable/icon_category_emoji_transportation.xml
··· 1 + <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 + android:width="24dp" 3 + android:height="24dp" 4 + android:viewportWidth="24" 5 + android:viewportHeight="24"> 6 + <path 7 + android:fillColor="#FF000000" 8 + android:pathData="M20.57,10.66C20.43,10.26 20.05,10 19.6,10h-7.19c-0.46,0 -0.83,0.26 -0.98,0.66L10,14.77l0.01,5.51c0,0.38 0.31,0.72 0.69,0.72h0.62C11.7,21 12,20.62 12,20.24V19h8v1.24c0,0.38 0.31,0.76 0.69,0.76h0.61c0.38,0 0.69,-0.34 0.69,-0.72L22,18.91v-4.14L20.57,10.66zM12.41,11h7.19l1.03,3h-9.25L12.41,11zM12,17c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S12.55,17 12,17zM20,17c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1s1,0.45 1,1S20.55,17 20,17z"/> 9 + <path 10 + android:fillColor="#FF000000" 11 + android:pathData="M14,9l1,0l0,-6l-8,0l0,5l-5,0l0,13l1,0l0,-12l5,0l0,-5l6,0z"/> 12 + <path 13 + android:fillColor="#FF000000" 14 + android:pathData="M5,11h2v2h-2z"/> 15 + <path 16 + android:fillColor="#FF000000" 17 + android:pathData="M10,5h2v2h-2z"/> 18 + <path 19 + android:fillColor="#FF000000" 20 + android:pathData="M5,15h2v2h-2z"/> 21 + <path 22 + android:fillColor="#FF000000" 23 + android:pathData="M5,19h2v2h-2z"/> 24 + </vector>
+19 -1
core/src/main/res/values-ru/strings.xml
··· 206 206 <string name="notification_time_started">Начато в %s</string> 207 207 <string name="notification_record_type_goal_time">цель %s</string> 208 208 209 - <!-- Emoji category --> 209 + <!-- Icon emoji category --> 210 210 <string name="emojiGroupSmileys">Смайлы и эмоции</string> 211 211 <string name="emojiGroupPeople">Люди и тело</string> 212 212 <string name="emojiGroupAnimals">Животные и природа</string> ··· 216 216 <string name="emojiGroupObjects">Предметы</string> 217 217 <string name="emojiGroupSymbols">Символы</string> 218 218 <string name="emojiGroupFlags">Флаги</string> 219 + 220 + <!-- Icon image category --> 221 + <string name="imageGroupMaps">Карты</string> 222 + <string name="imageGroupPlaces">Места</string> 223 + <string name="imageGroupSocial">Активности</string> 224 + <string name="imageGroupAction">Действия</string> 225 + <string name="imageGroupHardware">Оборудование</string> 226 + <string name="imageGroupAlert">Предупреждение</string> 227 + <string name="imageGroupAv">Аудио видео</string> 228 + <string name="imageGroupCommunication">Коммуникация</string> 229 + <string name="imageGroupContent">Контент</string> 230 + <string name="imageGroupDevice">Устройство</string> 231 + <string name="imageGroupEditor">Редактор</string> 232 + <string name="imageGroupFile">Файл</string> 233 + <string name="imageGroupImage">Картинка</string> 234 + <string name="imageGroupNavigation">Навигация</string> 235 + <string name="imageGroupNotification">Оповещение</string> 236 + <string name="imageGroupToggle">Переключатель</string> 219 237 220 238 </resources>
+19 -1
core/src/main/res/values/strings.xml
··· 216 216 <string name="notification_time_started">Started at %s</string> 217 217 <string name="notification_record_type_goal_time">goal %s</string> 218 218 219 - <!-- Emoji category --> 219 + <!-- Icon emoji category --> 220 220 <string name="emojiGroupSmileys">Smileys &amp; Emotion</string> 221 221 <string name="emojiGroupPeople">People &amp; Body</string> 222 222 <string name="emojiGroupAnimals">Animals &amp; Nature</string> ··· 226 226 <string name="emojiGroupObjects">Objects</string> 227 227 <string name="emojiGroupSymbols">Symbols</string> 228 228 <string name="emojiGroupFlags">Flags</string> 229 + 230 + <!-- Icon image category --> 231 + <string name="imageGroupMaps">Maps</string> 232 + <string name="imageGroupPlaces">Places</string> 233 + <string name="imageGroupSocial">Social</string> 234 + <string name="imageGroupAction">Action</string> 235 + <string name="imageGroupHardware">Hardware</string> 236 + <string name="imageGroupAlert">Alert</string> 237 + <string name="imageGroupAv">Audio video</string> 238 + <string name="imageGroupCommunication">Communication</string> 239 + <string name="imageGroupContent">Content</string> 240 + <string name="imageGroupDevice">Device</string> 241 + <string name="imageGroupEditor">Editor</string> 242 + <string name="imageGroupFile">File</string> 243 + <string name="imageGroupImage">Image</string> 244 + <string name="imageGroupNavigation">Navigation</string> 245 + <string name="imageGroupNotification">Notification</string> 246 + <string name="imageGroupToggle">Toggle</string> 229 247 230 248 </resources>
-7
domain/src/main/java/com/example/util/simpletimetracker/domain/model/EmojiCategory.kt
··· 1 - package com.example.util.simpletimetracker.domain.model 2 - 3 - data class EmojiCategory( 4 - val type: EmojiType, 5 - val name: String, 6 - val emojiCode: String 7 - )
+1 -1
domain/src/main/java/com/example/util/simpletimetracker/domain/model/EmojiType.kt domain/src/main/java/com/example/util/simpletimetracker/domain/model/IconEmojiType.kt
··· 1 1 package com.example.util.simpletimetracker.domain.model 2 2 3 - enum class EmojiType { 3 + enum class IconEmojiType { 4 4 SMILEYS, 5 5 PEOPLE, 6 6 ANIMALS,
+7
domain/src/main/java/com/example/util/simpletimetracker/domain/model/IconEmojiCategory.kt
··· 1 + package com.example.util.simpletimetracker.domain.model 2 + 3 + data class IconEmojiCategory( 4 + val type: IconEmojiType, 5 + val name: String, 6 + val categoryIcon: Int 7 + )
+7
domain/src/main/java/com/example/util/simpletimetracker/domain/model/IconImageCategory.kt
··· 1 + package com.example.util.simpletimetracker.domain.model 2 + 3 + data class IconImageCategory( 4 + val type: IconImageType, 5 + val name: String, 6 + val categoryIcon: Int 7 + )
+20
domain/src/main/java/com/example/util/simpletimetracker/domain/model/IconImageType.kt
··· 1 + package com.example.util.simpletimetracker.domain.model 2 + 3 + enum class IconImageType { 4 + MAPS, 5 + PLACES, 6 + SOCIAL, 7 + ACTION, 8 + HARDWARE, 9 + ALERT, 10 + AV, 11 + COMMUNICATION, 12 + CONTENT, 13 + DEVICE, 14 + EDITOR, 15 + FILE, 16 + IMAGE, 17 + NAVIGATION, 18 + NOTIFICATION, 19 + TOGGLE 20 + }
+3 -3
feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/mapper/ChangeRecordViewDataMapper.kt
··· 1 1 package com.example.util.simpletimetracker.feature_change_record.mapper 2 2 3 3 import com.example.util.simpletimetracker.core.mapper.ColorMapper 4 - import com.example.util.simpletimetracker.core.mapper.IconMapper 4 + import com.example.util.simpletimetracker.core.mapper.IconImageMapper 5 5 import com.example.util.simpletimetracker.core.mapper.TimeMapper 6 6 import com.example.util.simpletimetracker.core.repo.ResourceRepo 7 7 import com.example.util.simpletimetracker.domain.model.Record ··· 11 11 import javax.inject.Inject 12 12 13 13 class ChangeRecordViewDataMapper @Inject constructor( 14 - private val iconMapper: IconMapper, 14 + private val iconImageMapper: IconImageMapper, 15 15 private val colorMapper: ColorMapper, 16 16 private val timeMapper: TimeMapper, 17 17 private val resourceRepo: ResourceRepo ··· 42 42 ?.let(timeMapper::formatInterval) 43 43 .orEmpty(), 44 44 iconId = recordType?.icon 45 - ?.let(iconMapper::mapToDrawableResId) 45 + ?.let(iconImageMapper::mapToDrawableResId) 46 46 ?: R.drawable.unknown, 47 47 color = recordType?.color 48 48 ?.let { colorMapper.mapToColorResId(it, isDarkTheme) }
+6 -6
feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/adapter/ChangeRecordTypeIconCategoryAdapterDelegate.kt
··· 3 3 import com.example.util.simpletimetracker.core.adapter.createRecyclerAdapterDelegate 4 4 import com.example.util.simpletimetracker.core.extension.setOnClickWith 5 5 import com.example.util.simpletimetracker.feature_change_record_type.R 6 - import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeEmojiCategoryViewData 7 - import kotlinx.android.synthetic.main.change_record_type_item_icon_category_layout.view.tvChangeRecordTypeEmojiCategoryItem 6 + import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconCategoryViewData 7 + import kotlinx.android.synthetic.main.change_record_type_item_icon_category_layout.view.tvChangeRecordTypeIconCategoryItem 8 8 9 9 fun createChangeRecordTypeIconCategoryAdapterDelegate( 10 - onItemClick: ((ChangeRecordTypeEmojiCategoryViewData) -> Unit) 11 - ) = createRecyclerAdapterDelegate<ChangeRecordTypeEmojiCategoryViewData>( 10 + onItemClick: ((ChangeRecordTypeIconCategoryViewData) -> Unit) 11 + ) = createRecyclerAdapterDelegate<ChangeRecordTypeIconCategoryViewData>( 12 12 R.layout.change_record_type_item_icon_category_layout 13 13 ) { itemView, item, _ -> 14 14 15 15 with(itemView) { 16 - item as ChangeRecordTypeEmojiCategoryViewData 17 - tvChangeRecordTypeEmojiCategoryItem.text = item.emoji 16 + item as ChangeRecordTypeIconCategoryViewData 17 + tvChangeRecordTypeIconCategoryItem.setImageResource(item.categoryIcon) 18 18 setOnClickWith(item, onItemClick) 19 19 } 20 20 }
+1 -1
feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/interactor/ChangeRecordTypeViewDataInteractor.kt
··· 90 90 91 91 fun getIconCategoriesViewData(iconType: IconType): List<ViewHolderType> { 92 92 return when (iconType) { 93 - IconType.IMAGE -> emptyList() 93 + IconType.IMAGE -> mapper.mapIconImageCategories() 94 94 IconType.EMOJI -> mapper.mapIconEmojiCategories() 95 95 } 96 96 }
+63 -28
feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/mapper/ChangeRecordTypeMapper.kt
··· 4 4 import com.example.util.simpletimetracker.core.adapter.empty.EmptyViewData 5 5 import com.example.util.simpletimetracker.core.adapter.info.InfoViewData 6 6 import com.example.util.simpletimetracker.core.mapper.ColorMapper 7 - import com.example.util.simpletimetracker.core.mapper.EmojiMapper 8 - import com.example.util.simpletimetracker.core.mapper.IconMapper 7 + import com.example.util.simpletimetracker.core.mapper.IconEmojiMapper 8 + import com.example.util.simpletimetracker.core.mapper.IconImageMapper 9 9 import com.example.util.simpletimetracker.core.mapper.TimeMapper 10 10 import com.example.util.simpletimetracker.core.repo.ResourceRepo 11 11 import com.example.util.simpletimetracker.core.viewData.EmojiViewData 12 - import com.example.util.simpletimetracker.domain.model.EmojiCategory 12 + import com.example.util.simpletimetracker.domain.model.IconEmojiCategory 13 + import com.example.util.simpletimetracker.domain.model.IconImageCategory 13 14 import com.example.util.simpletimetracker.domain.model.IconType 14 15 import com.example.util.simpletimetracker.feature_change_record_type.R 15 - import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeEmojiCategoryViewData 16 16 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconCategoryInfoViewData 17 + import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconCategoryViewData 18 + import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconSwitchViewData 17 19 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconTypeViewData 18 20 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconViewData 19 21 import com.example.util.simpletimetracker.navigation.params.EmojiSelectionDialogParams ··· 22 24 class ChangeRecordTypeMapper @Inject constructor( 23 25 private val resourceRepo: ResourceRepo, 24 26 private val timeMapper: TimeMapper, 25 - private val iconMapper: IconMapper, 26 - private val emojiMapper: EmojiMapper, 27 + private val iconImageMapper: IconImageMapper, 28 + private val iconEmojiMapper: IconEmojiMapper, 27 29 private val colorMapper: ColorMapper 28 30 ) { 29 31 ··· 55 57 newColorId: Int, 56 58 isDarkTheme: Boolean 57 59 ): List<ViewHolderType> { 58 - return iconMapper.availableIconsNames.map { (iconName, iconResId) -> 59 - ChangeRecordTypeIconViewData( 60 - iconName = iconName, 61 - iconResId = iconResId, 62 - colorInt = newColorId 63 - .let { colorMapper.mapToColorResId(it, isDarkTheme) } 64 - .let(resourceRepo::getColor) 65 - ) 66 - } 60 + return iconImageMapper.getAvailableImages().map { (category, images) -> 61 + listOf(mapImageCategoryHintViewData(category)) + 62 + images.map { (iconName, iconResId) -> 63 + mapImageViewData(iconName, iconResId, newColorId, isDarkTheme) 64 + } 65 + }.flatten() 67 66 } 68 67 69 68 fun mapIconEmojiData( 70 69 newColorId: Int, 71 70 isDarkTheme: Boolean 72 71 ): List<ViewHolderType> { 73 - return emojiMapper.getAvailableEmojis().map { (category, codes) -> 74 - listOf(mapEmojiCategoryHintViewData(category)) + codes.map { code -> 75 - mapEmojiViewData(code, newColorId, isDarkTheme) 76 - } 72 + return iconEmojiMapper.getAvailableEmojis().map { (category, codes) -> 73 + listOf(mapEmojiCategoryHintViewData(category)) + 74 + codes.map { code -> 75 + mapEmojiViewData(code, newColorId, isDarkTheme) 76 + } 77 77 }.flatten() 78 78 } 79 79 80 + fun mapIconImageCategories(): List<ViewHolderType> { 81 + return iconImageMapper.getAvailableCategories().map { 82 + ChangeRecordTypeIconCategoryViewData( 83 + type = ChangeRecordTypeIconTypeViewData.Image(it.type), 84 + categoryIcon = it.categoryIcon 85 + ) 86 + } 87 + } 88 + 80 89 fun mapIconEmojiCategories(): List<ViewHolderType> { 81 - return emojiMapper.getAvailableEmojiCategories().map { 82 - ChangeRecordTypeEmojiCategoryViewData( 83 - type = it.type, 84 - emoji = it.emojiCode 90 + return iconEmojiMapper.getAvailableEmojiCategories().map { 91 + ChangeRecordTypeIconCategoryViewData( 92 + type = ChangeRecordTypeIconTypeViewData.Emoji(it.type), 93 + categoryIcon = it.categoryIcon 85 94 ) 86 95 } 87 96 } ··· 91 100 IconType.IMAGE, 92 101 IconType.EMOJI 93 102 ).map { 94 - ChangeRecordTypeIconTypeViewData( 103 + ChangeRecordTypeIconSwitchViewData( 95 104 iconType = it, 96 105 name = mapToFilterTypeName(it), 97 106 isSelected = it == iconType ··· 105 114 ): EmojiSelectionDialogParams { 106 115 return EmojiSelectionDialogParams( 107 116 color = colorId, 108 - emojiCodes = listOf(emojiCodes) + emojiMapper.toSkinToneVariations(emojiCodes) 117 + emojiCodes = listOf(emojiCodes) + iconEmojiMapper.toSkinToneVariations(emojiCodes) 109 118 ) 110 119 } 111 120 ··· 116 125 }.let(resourceRepo::getString) 117 126 } 118 127 128 + private fun mapImageViewData( 129 + iconName: String, 130 + iconResId: Int, 131 + newColorId: Int, 132 + isDarkTheme: Boolean 133 + ): ViewHolderType { 134 + return ChangeRecordTypeIconViewData( 135 + iconName = iconName, 136 + iconResId = iconResId, 137 + colorInt = newColorId 138 + .let { colorMapper.mapToColorResId(it, isDarkTheme) } 139 + .let(resourceRepo::getColor) 140 + ) 141 + } 142 + 119 143 private fun mapEmojiViewData( 120 144 codes: String, 121 145 newColorId: Int, 122 146 isDarkTheme: Boolean 123 147 ): ViewHolderType { 124 148 return EmojiViewData( 125 - emojiText = emojiMapper.toEmojiString(codes), 149 + emojiText = iconEmojiMapper.toEmojiString(codes), 126 150 emojiCodes = codes, 127 151 colorInt = newColorId 128 152 .let { colorMapper.mapToColorResId(it, isDarkTheme) } ··· 130 154 ) 131 155 } 132 156 133 - private fun mapEmojiCategoryHintViewData(category: EmojiCategory): ChangeRecordTypeIconCategoryInfoViewData { 157 + private fun mapImageCategoryHintViewData( 158 + category: IconImageCategory 159 + ): ChangeRecordTypeIconCategoryInfoViewData { 134 160 return ChangeRecordTypeIconCategoryInfoViewData( 135 - type = category.type, 161 + type = ChangeRecordTypeIconTypeViewData.Image(category.type), 162 + text = category.name 163 + ) 164 + } 165 + 166 + private fun mapEmojiCategoryHintViewData( 167 + category: IconEmojiCategory 168 + ): ChangeRecordTypeIconCategoryInfoViewData { 169 + return ChangeRecordTypeIconCategoryInfoViewData( 170 + type = ChangeRecordTypeIconTypeViewData.Emoji(category.type), 136 171 text = category.name 137 172 ) 138 173 }
+1 -1
feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/view/ChangeRecordTypeFragment.kt
··· 178 178 recordType.observe(viewLifecycleOwner, ::updatePreview) 179 179 colors.observe(viewLifecycleOwner, colorsAdapter::replace) 180 180 icons.observe(viewLifecycleOwner, iconsAdapter::replace) 181 - iconCategories.observe(viewLifecycleOwner, iconCategoriesAdapter::replace) 181 + iconCategories.observe(viewLifecycleOwner, iconCategoriesAdapter::replaceAsNew) 182 182 iconsTypeViewData.observe(viewLifecycleOwner, btnChangeRecordTypeIconSwitch.adapter::replace) 183 183 categories.observe(viewLifecycleOwner, categoriesAdapter::replace) 184 184 goalTimeViewData.observe(viewLifecycleOwner, tvChangeRecordTypeGoalTimeTime::setText)
-14
feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewData/ChangeRecordTypeEmojiCategoryViewData.kt
··· 1 - package com.example.util.simpletimetracker.feature_change_record_type.viewData 2 - 3 - import com.example.util.simpletimetracker.core.adapter.ViewHolderType 4 - import com.example.util.simpletimetracker.domain.model.EmojiType 5 - 6 - data class ChangeRecordTypeEmojiCategoryViewData( 7 - val type: EmojiType, 8 - val emoji: String 9 - ): ViewHolderType { 10 - 11 - override fun getUniqueId(): Long = type.ordinal.toLong() 12 - 13 - override fun isValidType(other: ViewHolderType): Boolean = other is ChangeRecordTypeEmojiCategoryViewData 14 - }
+4 -4
feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewData/ChangeRecordTypeIconCategoryInfoViewData.kt
··· 1 1 package com.example.util.simpletimetracker.feature_change_record_type.viewData 2 2 3 3 import com.example.util.simpletimetracker.core.adapter.ViewHolderType 4 - import com.example.util.simpletimetracker.domain.model.EmojiType 5 4 6 5 data class ChangeRecordTypeIconCategoryInfoViewData( 7 - val type: EmojiType, 6 + val type: ChangeRecordTypeIconTypeViewData, 8 7 val text: String 9 8 ) : ViewHolderType { 10 9 11 - override fun getUniqueId(): Long = type.ordinal.toLong() 10 + override fun getUniqueId(): Long = type.id 12 11 13 - override fun isValidType(other: ViewHolderType): Boolean = other is ChangeRecordTypeIconCategoryInfoViewData 12 + override fun isValidType(other: ViewHolderType): Boolean = 13 + other is ChangeRecordTypeIconCategoryInfoViewData 14 14 }
+13
feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewData/ChangeRecordTypeIconCategoryViewData.kt
··· 1 + package com.example.util.simpletimetracker.feature_change_record_type.viewData 2 + 3 + import com.example.util.simpletimetracker.core.adapter.ViewHolderType 4 + 5 + data class ChangeRecordTypeIconCategoryViewData( 6 + val type: ChangeRecordTypeIconTypeViewData, 7 + val categoryIcon: Int 8 + ): ViewHolderType { 9 + 10 + override fun getUniqueId(): Long = type.id 11 + 12 + override fun isValidType(other: ViewHolderType): Boolean = other is ChangeRecordTypeIconCategoryViewData 13 + }
+13
feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewData/ChangeRecordTypeIconSwitchViewData.kt
··· 1 + package com.example.util.simpletimetracker.feature_change_record_type.viewData 2 + 3 + import com.example.util.simpletimetracker.core.view.buttonsRowView.ButtonsRowViewData 4 + import com.example.util.simpletimetracker.domain.model.IconType 5 + 6 + data class ChangeRecordTypeIconSwitchViewData( 7 + val iconType: IconType, 8 + override val name: String, 9 + override val isSelected: Boolean 10 + ) : ButtonsRowViewData() { 11 + 12 + override val id: Long = iconType.ordinal.toLong() 13 + }
+13 -8
feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewData/ChangeRecordTypeIconTypeViewData.kt
··· 1 1 package com.example.util.simpletimetracker.feature_change_record_type.viewData 2 2 3 - import com.example.util.simpletimetracker.core.view.buttonsRowView.ButtonsRowViewData 4 - import com.example.util.simpletimetracker.domain.model.IconType 3 + import com.example.util.simpletimetracker.domain.model.IconEmojiType 4 + import com.example.util.simpletimetracker.domain.model.IconImageType 5 + 6 + sealed class ChangeRecordTypeIconTypeViewData { 7 + abstract val id: Long 5 8 6 - data class ChangeRecordTypeIconTypeViewData( 7 - val iconType: IconType, 8 - override val name: String, 9 - override val isSelected: Boolean 10 - ) : ButtonsRowViewData() { 9 + data class Image( 10 + val type: IconImageType, 11 + override val id: Long = type.ordinal.toLong() 12 + ) : ChangeRecordTypeIconTypeViewData() 11 13 12 - override val id: Long = iconType.ordinal.toLong() 14 + data class Emoji( 15 + val type: IconEmojiType, 16 + override val id: Long = type.ordinal.toLong() 17 + ) : ChangeRecordTypeIconTypeViewData() 13 18 }
+7 -7
feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewModel/ChangeRecordTypeViewModel.kt
··· 11 11 import com.example.util.simpletimetracker.core.interactor.RemoveRunningRecordMediator 12 12 import com.example.util.simpletimetracker.core.interactor.WidgetInteractor 13 13 import com.example.util.simpletimetracker.core.mapper.ColorMapper 14 - import com.example.util.simpletimetracker.core.mapper.EmojiMapper 14 + import com.example.util.simpletimetracker.core.mapper.IconEmojiMapper 15 15 import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper 16 16 import com.example.util.simpletimetracker.core.repo.ResourceRepo 17 17 import com.example.util.simpletimetracker.core.view.buttonsRowView.ButtonsRowViewData ··· 31 31 import com.example.util.simpletimetracker.feature_change_record_type.R 32 32 import com.example.util.simpletimetracker.feature_change_record_type.interactor.ChangeRecordTypeViewDataInteractor 33 33 import com.example.util.simpletimetracker.feature_change_record_type.mapper.ChangeRecordTypeMapper 34 - import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeEmojiCategoryViewData 35 34 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconCategoryInfoViewData 36 - import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconTypeViewData 35 + import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconCategoryViewData 36 + import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconSwitchViewData 37 37 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconViewData 38 38 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeScrollViewData 39 39 import com.example.util.simpletimetracker.navigation.Notification ··· 60 60 private val recordTypeViewDataMapper: RecordTypeViewDataMapper, 61 61 private val changeRecordTypeMapper: ChangeRecordTypeMapper, 62 62 private val resourceRepo: ResourceRepo, 63 - private val emojiMapper: EmojiMapper 63 + private val iconEmojiMapper: IconEmojiMapper 64 64 ) : ViewModel() { 65 65 66 66 lateinit var extra: ChangeRecordTypeParams ··· 188 188 } 189 189 190 190 fun onIconTypeClick(viewData: ButtonsRowViewData) { 191 - if (viewData !is ChangeRecordTypeIconTypeViewData) return 191 + if (viewData !is ChangeRecordTypeIconSwitchViewData) return 192 192 viewModelScope.launch { 193 193 iconType = viewData.iconType 194 194 updateIconsTypeViewData() ··· 197 197 } 198 198 } 199 199 200 - fun onIconCategoryClick(viewData: ChangeRecordTypeEmojiCategoryViewData) { 200 + fun onIconCategoryClick(viewData: ChangeRecordTypeIconCategoryViewData) { 201 201 icons.value 202 202 ?.indexOfFirst { (it as? ChangeRecordTypeIconCategoryInfoViewData)?.type == viewData.type } 203 203 ?.let { ChangeRecordTypeScrollViewData.ScrollTo(it) } ··· 214 214 } 215 215 216 216 fun onEmojiClick(item: EmojiViewData) { 217 - if (emojiMapper.hasSkinToneVariations(item.emojiCodes)) { 217 + if (iconEmojiMapper.hasSkinToneVariations(item.emojiCodes)) { 218 218 openEmojiSelectionDialog(item) 219 219 } else { 220 220 viewModelScope.launch {
+3 -5
feature_change_record_type/src/main/res/layout/change_record_type_item_icon_category_layout.xml
··· 1 1 <?xml version="1.0" encoding="utf-8"?> 2 - <androidx.emoji.widget.EmojiAppCompatTextView xmlns:android="http://schemas.android.com/apk/res/android" 3 - xmlns:app="http://schemas.android.com/apk/res-auto" 2 + <androidx.appcompat.widget.AppCompatImageView xmlns:android="http://schemas.android.com/apk/res/android" 4 3 xmlns:tools="http://schemas.android.com/tools" 5 - android:id="@+id/tvChangeRecordTypeEmojiCategoryItem" 4 + android:id="@+id/tvChangeRecordTypeIconCategoryItem" 6 5 android:layout_width="match_parent" 7 6 android:layout_height="24dp" 8 7 android:layout_marginVertical="4dp" 9 8 android:background="?selectableItemBackgroundBorderless" 10 9 android:gravity="center" 11 10 android:textColor="?appLightTextColor" 12 - app:autoSizeTextType="uniform" 13 - tools:text="😀" /> 11 + tools:src="@drawable/unknown" />
+3 -3
feature_change_running_record/src/main/java/com/example/util/simpletimetracker/feature_change_running_record/mapper/ChangeRunningRecordViewDataMapper.kt
··· 1 1 package com.example.util.simpletimetracker.feature_change_running_record.mapper 2 2 3 3 import com.example.util.simpletimetracker.core.mapper.ColorMapper 4 - import com.example.util.simpletimetracker.core.mapper.IconMapper 4 + import com.example.util.simpletimetracker.core.mapper.IconImageMapper 5 5 import com.example.util.simpletimetracker.core.mapper.TimeMapper 6 6 import com.example.util.simpletimetracker.core.repo.ResourceRepo 7 7 import com.example.util.simpletimetracker.domain.model.RecordType ··· 11 11 import javax.inject.Inject 12 12 13 13 class ChangeRunningRecordViewDataMapper @Inject constructor( 14 - private val iconMapper: IconMapper, 14 + private val iconImageMapper: IconImageMapper, 15 15 private val colorMapper: ColorMapper, 16 16 private val timeMapper: TimeMapper, 17 17 private val resourceRepo: ResourceRepo ··· 38 38 ?.let { resourceRepo.getString(R.string.running_record_goal_time, it) } 39 39 .orEmpty(), 40 40 iconId = recordType?.icon 41 - ?.let(iconMapper::mapToDrawableResId) 41 + ?.let(iconImageMapper::mapToDrawableResId) 42 42 ?: R.drawable.unknown, 43 43 color = (recordType?.color 44 44 ?.let { colorMapper.mapToColorResId(it, isDarkTheme) }
+3 -3
feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/emojiSelection/mapper/EmojiSelectionMapper.kt
··· 2 2 3 3 import com.example.util.simpletimetracker.core.adapter.ViewHolderType 4 4 import com.example.util.simpletimetracker.core.mapper.ColorMapper 5 - import com.example.util.simpletimetracker.core.mapper.EmojiMapper 5 + import com.example.util.simpletimetracker.core.mapper.IconEmojiMapper 6 6 import com.example.util.simpletimetracker.core.repo.ResourceRepo 7 7 import com.example.util.simpletimetracker.core.viewData.EmojiViewData 8 8 import javax.inject.Inject ··· 10 10 class EmojiSelectionMapper @Inject constructor( 11 11 private val resourceRepo: ResourceRepo, 12 12 private val colorMapper: ColorMapper, 13 - private val emojiMapper: EmojiMapper 13 + private val iconEmojiMapper: IconEmojiMapper 14 14 ) { 15 15 16 16 fun mapIconEmojiData( ··· 20 20 ): List<ViewHolderType> { 21 21 return emojiCodes.map { codes -> 22 22 EmojiViewData( 23 - emojiText = emojiMapper.toEmojiString(codes), 23 + emojiText = iconEmojiMapper.toEmojiString(codes), 24 24 emojiCodes = codes, 25 25 colorInt = colorId 26 26 .let { colorMapper.mapToColorResId(it, isDarkTheme) }
+3 -3
feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/goalTime/interactor/NotificationGoalTimeInteractorImpl.kt
··· 2 2 3 3 import com.example.util.simpletimetracker.core.interactor.NotificationGoalTimeInteractor 4 4 import com.example.util.simpletimetracker.core.mapper.ColorMapper 5 - import com.example.util.simpletimetracker.core.mapper.IconMapper 5 + import com.example.util.simpletimetracker.core.mapper.IconImageMapper 6 6 import com.example.util.simpletimetracker.core.mapper.TimeMapper 7 7 import com.example.util.simpletimetracker.core.repo.ResourceRepo 8 8 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor ··· 25 25 private val scheduler: NotificationGoalTimeScheduler, 26 26 private val timeMapper: TimeMapper, 27 27 private val colorMapper: ColorMapper, 28 - private val iconMapper: IconMapper 28 + private val iconImageMapper: IconImageMapper 29 29 ) : NotificationGoalTimeInteractor { 30 30 31 31 override suspend fun checkAndReschedule(typeId: Long) { ··· 57 57 NotificationGoalTimeParams( 58 58 typeId = recordType.id, 59 59 icon = recordType.icon 60 - .let(iconMapper::mapToDrawableResId), 60 + .let(iconImageMapper::mapToDrawableResId), 61 61 color = recordType.color 62 62 .let { colorMapper.mapToColorResId(it, isDarkTheme) } 63 63 .let(resourceRepo::getColor),
+3 -3
feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/interactor/NotificationTypeInteractorImpl.kt
··· 2 2 3 3 import com.example.util.simpletimetracker.core.interactor.NotificationTypeInteractor 4 4 import com.example.util.simpletimetracker.core.mapper.ColorMapper 5 - import com.example.util.simpletimetracker.core.mapper.IconMapper 5 + import com.example.util.simpletimetracker.core.mapper.IconImageMapper 6 6 import com.example.util.simpletimetracker.core.mapper.TimeMapper 7 7 import com.example.util.simpletimetracker.core.repo.ResourceRepo 8 8 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor ··· 20 20 private val recordTypeInteractor: RecordTypeInteractor, 21 21 private val runningRecordInteractor: RunningRecordInteractor, 22 22 private val prefsInteractor: PrefsInteractor, 23 - private val iconMapper: IconMapper, 23 + private val iconImageMapper: IconImageMapper, 24 24 private val colorMapper: ColorMapper, 25 25 private val timeMapper: TimeMapper, 26 26 private val resourceRepo: ResourceRepo ··· 97 97 NotificationTypeParams( 98 98 id = recordType.id.toInt(), 99 99 icon = recordType.icon 100 - .let(iconMapper::mapToDrawableResId), 100 + .let(iconImageMapper::mapToDrawableResId), 101 101 color = recordType.color 102 102 .let { colorMapper.mapToColorResId(it, isDarkTheme) } 103 103 .let(resourceRepo::getColor),
+3 -3
feature_records/src/main/java/com/example/util/simpletimetracker/feature_records/mapper/RecordViewDataMapper.kt
··· 4 4 import com.example.util.simpletimetracker.core.adapter.empty.EmptyViewData 5 5 import com.example.util.simpletimetracker.core.adapter.hint.HintViewData 6 6 import com.example.util.simpletimetracker.core.mapper.ColorMapper 7 - import com.example.util.simpletimetracker.core.mapper.IconMapper 7 + import com.example.util.simpletimetracker.core.mapper.IconImageMapper 8 8 import com.example.util.simpletimetracker.core.mapper.TimeMapper 9 9 import com.example.util.simpletimetracker.core.repo.ResourceRepo 10 10 import com.example.util.simpletimetracker.core.viewData.RecordViewData ··· 16 16 import kotlin.math.min 17 17 18 18 class RecordViewDataMapper @Inject constructor( 19 - private val iconMapper: IconMapper, 19 + private val iconImageMapper: IconImageMapper, 20 20 private val colorMapper: ColorMapper, 21 21 private val resourceRepo: ResourceRepo, 22 22 private val timeMapper: TimeMapper ··· 42 42 duration = (timeEnded - timeStarted) 43 43 .let(timeMapper::formatInterval), 44 44 iconId = recordType.icon 45 - .let(iconMapper::mapToDrawableResId), 45 + .let(iconImageMapper::mapToDrawableResId), 46 46 color = recordType.color 47 47 .let { colorMapper.mapToColorResId(it, isDarkTheme) } 48 48 .let(resourceRepo::getColor),
+3 -3
feature_records_all/src/main/java/com/example/util/simpletimetracker/feature_records_all/mapper/RecordsAllViewDataMapper.kt
··· 3 3 import com.example.util.simpletimetracker.core.adapter.ViewHolderType 4 4 import com.example.util.simpletimetracker.core.adapter.empty.EmptyViewData 5 5 import com.example.util.simpletimetracker.core.mapper.ColorMapper 6 - import com.example.util.simpletimetracker.core.mapper.IconMapper 6 + import com.example.util.simpletimetracker.core.mapper.IconImageMapper 7 7 import com.example.util.simpletimetracker.core.mapper.TimeMapper 8 8 import com.example.util.simpletimetracker.core.repo.ResourceRepo 9 9 import com.example.util.simpletimetracker.core.view.spinner.CustomSpinner ··· 17 17 import javax.inject.Inject 18 18 19 19 class RecordsAllViewDataMapper @Inject constructor( 20 - private val iconMapper: IconMapper, 20 + private val iconImageMapper: IconImageMapper, 21 21 private val colorMapper: ColorMapper, 22 22 private val resourceRepo: ResourceRepo, 23 23 private val timeMapper: TimeMapper ··· 46 46 duration = (timeEnded - timeStarted) 47 47 .let(timeMapper::formatInterval), 48 48 iconId = recordType.icon 49 - .let(iconMapper::mapToDrawableResId), 49 + .let(iconImageMapper::mapToDrawableResId), 50 50 color = recordType.color 51 51 .let { colorMapper.mapToColorResId(it, isDarkTheme) } 52 52 .let(resourceRepo::getColor),
+3 -3
feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/mapper/RunningRecordViewDataMapper.kt
··· 3 3 import com.example.util.simpletimetracker.core.adapter.ViewHolderType 4 4 import com.example.util.simpletimetracker.core.adapter.empty.EmptyViewData 5 5 import com.example.util.simpletimetracker.core.mapper.ColorMapper 6 - import com.example.util.simpletimetracker.core.mapper.IconMapper 6 + import com.example.util.simpletimetracker.core.mapper.IconImageMapper 7 7 import com.example.util.simpletimetracker.core.mapper.RecordTypeCardSizeMapper 8 8 import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper 9 9 import com.example.util.simpletimetracker.core.mapper.TimeMapper ··· 18 18 import javax.inject.Inject 19 19 20 20 class RunningRecordViewDataMapper @Inject constructor( 21 - private val iconMapper: IconMapper, 21 + private val iconImageMapper: IconImageMapper, 22 22 private val colorMapper: ColorMapper, 23 23 private val resourceRepo: ResourceRepo, 24 24 private val timeMapper: TimeMapper, ··· 45 45 ?.let { resourceRepo.getString(R.string.running_record_goal_time, it) } 46 46 .orEmpty(), 47 47 iconId = recordType.icon 48 - .let(iconMapper::mapToDrawableResId), 48 + .let(iconImageMapper::mapToDrawableResId), 49 49 color = recordType.color 50 50 .let { colorMapper.mapToColorResId(it, isDarkTheme) } 51 51 .let(resourceRepo::getColor),
+5 -5
feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/mapper/StatisticsViewDataMapper.kt
··· 3 3 import com.example.util.simpletimetracker.core.adapter.ViewHolderType 4 4 import com.example.util.simpletimetracker.core.adapter.empty.EmptyViewData 5 5 import com.example.util.simpletimetracker.core.mapper.ColorMapper 6 - import com.example.util.simpletimetracker.core.mapper.IconMapper 6 + import com.example.util.simpletimetracker.core.mapper.IconImageMapper 7 7 import com.example.util.simpletimetracker.core.mapper.TimeMapper 8 8 import com.example.util.simpletimetracker.core.repo.ResourceRepo 9 9 import com.example.util.simpletimetracker.domain.model.Category ··· 20 20 import javax.inject.Inject 21 21 22 22 class StatisticsViewDataMapper @Inject constructor( 23 - private val iconMapper: IconMapper, 23 + private val iconImageMapper: IconImageMapper, 24 24 private val colorMapper: ColorMapper, 25 25 private val resourceRepo: ResourceRepo, 26 26 private val timeMapper: TimeMapper ··· 207 207 }, 208 208 percent = "$durationPercent%", 209 209 iconId = recordType.icon 210 - .let(iconMapper::mapToDrawableResId), 210 + .let(iconImageMapper::mapToDrawableResId), 211 211 color = recordType.color 212 212 .let { colorMapper.mapToColorResId(it, isDarkTheme) } 213 213 .let(resourceRepo::getColor) ··· 272 272 .let { colorMapper.mapToColorResId(it, isDarkTheme) } 273 273 .let(resourceRepo::getColor), 274 274 iconId = recordType.icon 275 - .let(iconMapper::mapToDrawableResId) 275 + .let(iconImageMapper::mapToDrawableResId) 276 276 ) 277 277 } 278 278 else -> { ··· 294 294 .let { colorMapper.mapToColorResId(it, isDarkTheme) } 295 295 .let(resourceRepo::getColor), 296 296 iconId = recordType?.icon 297 - ?.let(iconMapper::mapToDrawableResId) 297 + ?.let(iconImageMapper::mapToDrawableResId) 298 298 ) 299 299 } else { 300 300 null
+3 -3
feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/mapper/StatisticsDetailViewDataMapper.kt
··· 2 2 3 3 import com.example.util.simpletimetracker.core.adapter.ViewHolderType 4 4 import com.example.util.simpletimetracker.core.mapper.ColorMapper 5 - import com.example.util.simpletimetracker.core.mapper.IconMapper 5 + import com.example.util.simpletimetracker.core.mapper.IconImageMapper 6 6 import com.example.util.simpletimetracker.core.mapper.TimeMapper 7 7 import com.example.util.simpletimetracker.core.repo.ResourceRepo 8 8 import com.example.util.simpletimetracker.domain.extension.orZero ··· 26 26 import javax.inject.Inject 27 27 28 28 class StatisticsDetailViewDataMapper @Inject constructor( 29 - private val iconMapper: IconMapper, 29 + private val iconImageMapper: IconImageMapper, 30 30 private val colorMapper: ColorMapper, 31 31 private val timeMapper: TimeMapper, 32 32 private val resourceRepo: ResourceRepo ··· 103 103 name = name 104 104 .orEmpty(), 105 105 iconId = iconName 106 - ?.let(iconMapper::mapToDrawableResId), 106 + ?.let(iconImageMapper::mapToDrawableResId), 107 107 color = colorId 108 108 ?.let { colorMapper.mapToColorResId(it, isDarkTheme) } 109 109 ?.let(resourceRepo::getColor)
+3 -3
feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/mapper/WidgetUniversalViewDataMapper.kt
··· 4 4 import com.example.util.simpletimetracker.core.adapter.ViewHolderType 5 5 import com.example.util.simpletimetracker.core.adapter.empty.EmptyViewData 6 6 import com.example.util.simpletimetracker.core.mapper.ColorMapper 7 - import com.example.util.simpletimetracker.core.mapper.IconMapper 7 + import com.example.util.simpletimetracker.core.mapper.IconImageMapper 8 8 import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper 9 9 import com.example.util.simpletimetracker.core.repo.ResourceRepo 10 10 import com.example.util.simpletimetracker.core.viewData.RecordTypeViewData ··· 16 16 17 17 class WidgetUniversalViewDataMapper @Inject constructor( 18 18 private val colorMapper: ColorMapper, 19 - private val iconMapper: IconMapper, 19 + private val iconImageMapper: IconImageMapper, 20 20 private val resourceRepo: ResourceRepo, 21 21 private val recordTypeViewDataMapper: RecordTypeViewDataMapper 22 22 ) { ··· 50 50 val recordType = recordTypes[runningRecord.id] 51 51 52 52 val icon = recordType?.icon 53 - ?.let(iconMapper::mapToDrawableResId) 53 + ?.let(iconImageMapper::mapToDrawableResId) 54 54 ?: R.drawable.unknown 55 55 val color = recordType?.color 56 56 ?.let { colorMapper.mapToColorResId(it, isDarkTheme) }
+2 -2
feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/widget/WidgetProvider.kt
··· 17 17 import com.example.util.simpletimetracker.core.interactor.RemoveRunningRecordMediator 18 18 import com.example.util.simpletimetracker.core.interactor.WidgetInteractor 19 19 import com.example.util.simpletimetracker.core.mapper.ColorMapper 20 - import com.example.util.simpletimetracker.core.mapper.IconMapper 20 + import com.example.util.simpletimetracker.core.mapper.IconImageMapper 21 21 import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper 22 22 import com.example.util.simpletimetracker.core.repo.ResourceRepo 23 23 import com.example.util.simpletimetracker.core.view.RecordTypeView ··· 62 62 lateinit var colorMapper: ColorMapper 63 63 64 64 @Inject 65 - lateinit var iconMapper: IconMapper 65 + lateinit var iconImageMapper: IconImageMapper 66 66 67 67 @Inject 68 68 lateinit var resourceRepo: ResourceRepo