11package com.example.util.simpletimetracker.feature_complex_rules.mapper
22
33import com.example.util.simpletimetracker.core.mapper.ColorMapper
4+ import com.example.util.simpletimetracker.core.mapper.IconMapper
5+ import com.example.util.simpletimetracker.core.mapper.RecordTagViewDataMapper
46import com.example.util.simpletimetracker.core.mapper.TimeMapper
57import com.example.util.simpletimetracker.core.repo.ResourceRepo
68import com.example.util.simpletimetracker.domain.model.ComplexRule
79import com.example.util.simpletimetracker.domain.model.RecordTag
810import com.example.util.simpletimetracker.domain.model.RecordType
11+ import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
912import com.example.util.simpletimetracker.feature_complex_rules.R
1013import com.example.util.simpletimetracker.feature_complex_rules.adapter.ComplexRuleAddViewData
14+ import com.example.util.simpletimetracker.feature_complex_rules.adapter.ComplexRuleElementContentViewData
15+ import com.example.util.simpletimetracker.feature_complex_rules.adapter.ComplexRuleElementTitleViewData
1116import com.example.util.simpletimetracker.feature_complex_rules.adapter.ComplexRuleViewData
1217import javax.inject.Inject
1318
1419class ComplexRulesViewDataMapper @Inject constructor(
1520 private val timeMapper : TimeMapper ,
21+ private val iconMapper : IconMapper ,
1622 private val colorMapper : ColorMapper ,
1723 private val resourceRepo : ResourceRepo ,
24+ private val recordTagViewDataMapper : RecordTagViewDataMapper ,
1825) {
1926
2027 fun mapAddItem (
@@ -34,24 +41,24 @@ class ComplexRulesViewDataMapper @Inject constructor(
3441 typesOrder : List <Long >,
3542 tagsOrder : List <Long >,
3643 ): ComplexRuleViewData {
44+ val actionItems = mapActions(
45+ rule = rule,
46+ isDarkTheme = isDarkTheme,
47+ typesMap = typesMap,
48+ tagsMap = tagsMap,
49+ tagsOrder = tagsOrder,
50+ )
51+ val conditionItems = mapConditions(
52+ rule = rule,
53+ isDarkTheme = isDarkTheme,
54+ typesMap = typesMap,
55+ typesOrder = typesOrder,
56+ )
57+
3758 return ComplexRuleViewData (
3859 id = rule.id,
39- actionTitle = mapActionTitle(
40- rule = rule,
41- tagsMap = tagsMap,
42- tagsOrder = tagsOrder,
43- ),
44- startingTypes = mapStartingTypes(
45- rule = rule,
46- typesMap = typesMap,
47- typesOrder = typesOrder,
48- ),
49- currentTypes = mapCurrentTypes(
50- rule = rule,
51- typesMap = typesMap,
52- typesOrder = typesOrder,
53- ),
54- daysOfWeek = mapDaysOfWeek(rule),
60+ actionItems = actionItems,
61+ conditionItems = conditionItems,
5562 color = if (rule.disabled) {
5663 colorMapper.toInactiveColor(isDarkTheme)
5764 } else {
@@ -70,29 +77,68 @@ class ComplexRulesViewDataMapper @Inject constructor(
7077 )
7178 }
7279
73- private fun mapActionTitle (
80+ private fun mapActions (
7481 rule : ComplexRule ,
82+ isDarkTheme : Boolean ,
83+ typesMap : Map <Long , RecordType >,
7584 tagsMap : Map <Long , RecordTag >,
7685 tagsOrder : List <Long >,
77- ): String {
86+ ): List < ViewHolderType > {
7887 val action = rule.action
79- val baseTitle = mapBaseTitle(action)
80- return when (action) {
88+ val data = when (action) {
8189 is ComplexRule .Action .AllowMultitasking ,
8290 is ComplexRule .Action .DisallowMultitasking ,
83- -> baseTitle
84- is ComplexRule .Action .AssignTag -> getFinalText(
85- baseTitle = baseTitle,
86- data = rule.actionAssignTagIds
87- .sortedBy { tagsOrder.indexOf(it) }
88- .mapNotNull { tagsMap[it]?.name }
89- // Just in case where is a deleted id.
90- .ifEmpty { listOf (" " ) },
91+ -> emptyList()
92+ is ComplexRule .Action .AssignTag -> rule.actionAssignTagIds
93+ .sortedBy { tagsOrder.indexOf(it) }
94+ .mapNotNull { tagsMap[it] }
95+ }
96+ val result = mutableListOf<ViewHolderType >()
97+ result + = ComplexRuleElementTitleViewData (
98+ text = mapActionTitle(action),
99+ )
100+ result + = data.map {
101+ ComplexRuleElementContentViewData (
102+ text = it.name,
103+ icon = recordTagViewDataMapper.mapIcon(
104+ tag = it,
105+ type = typesMap[it.iconColorSource],
106+ )?.let (iconMapper::mapIcon),
107+ color = colorMapper.mapToColorInt(
108+ color = it.color,
109+ isDarkTheme = isDarkTheme,
110+ ),
91111 )
92112 }
113+ return result
93114 }
94115
95- fun mapBaseTitle (
116+ private fun mapConditions (
117+ rule : ComplexRule ,
118+ isDarkTheme : Boolean ,
119+ typesMap : Map <Long , RecordType >,
120+ typesOrder : List <Long >,
121+ ): List <ViewHolderType > {
122+ val conditionItems = mutableListOf<ViewHolderType >()
123+ conditionItems + = mapTypes(
124+ typeIds = rule.conditionStartingTypeIds,
125+ title = resourceRepo.getString(R .string.change_complex_starting_activity),
126+ isDarkTheme = isDarkTheme,
127+ typesMap = typesMap,
128+ typesOrder = typesOrder,
129+ )
130+ conditionItems + = mapTypes(
131+ typeIds = rule.conditionCurrentTypeIds,
132+ title = resourceRepo.getString(R .string.change_complex_previous_activity),
133+ isDarkTheme = isDarkTheme,
134+ typesMap = typesMap,
135+ typesOrder = typesOrder,
136+ )
137+ conditionItems + = mapDaysOfWeek(rule)
138+ return conditionItems
139+ }
140+
141+ fun mapActionTitle (
96142 action : ComplexRule .Action ,
97143 ): String {
98144 return when (action) {
@@ -105,49 +151,51 @@ class ComplexRulesViewDataMapper @Inject constructor(
105151 }.let (resourceRepo::getString)
106152 }
107153
108- private fun mapStartingTypes (
109- rule : ComplexRule ,
154+ private fun mapTypes (
155+ typeIds : Set <Long >,
156+ title : String ,
157+ isDarkTheme : Boolean ,
110158 typesMap : Map <Long , RecordType >,
111159 typesOrder : List <Long >,
112- ): String {
113- return getFinalText(
114- baseTitle = resourceRepo.getString(R .string.change_complex_starting_activity),
115- data = rule.conditionStartingTypeIds
116- .sortedBy { typesOrder.indexOf(it) }
117- .mapNotNull { typesMap[it]?.name },
118- )
119- }
160+ ): List <ViewHolderType > {
161+ val data = typeIds
162+ .sortedBy { typesOrder.indexOf(it) }
163+ .mapNotNull { typesMap[it] }
164+ if (data.isEmpty()) return emptyList()
120165
121- private fun mapCurrentTypes (
122- rule : ComplexRule ,
123- typesMap : Map <Long , RecordType >,
124- typesOrder : List <Long >,
125- ): String {
126- return getFinalText(
127- baseTitle = resourceRepo.getString(R .string.change_complex_previous_activity),
128- data = rule.conditionCurrentTypeIds
129- .sortedBy { typesOrder.indexOf(it) }
130- .mapNotNull { typesMap[it]?.name },
131- )
166+ val result = mutableListOf<ViewHolderType >()
167+ result + = ComplexRuleElementTitleViewData (title)
168+ result + = data.map {
169+ ComplexRuleElementContentViewData (
170+ text = it.name,
171+ icon = iconMapper.mapIcon(it.icon),
172+ color = colorMapper.mapToColorInt(
173+ color = it.color,
174+ isDarkTheme = isDarkTheme,
175+ ),
176+ )
177+ }
178+ return result
132179 }
133180
134181 private fun mapDaysOfWeek (
135182 rule : ComplexRule ,
136- ): String {
137- return getFinalText(
138- baseTitle = resourceRepo.getString(R .string.range_day),
139- data = rule.conditionDaysOfWeek.map { timeMapper.toShortDayOfWeekName(it) },
140- )
141- }
183+ ): List <ViewHolderType > {
184+ val data = rule.conditionDaysOfWeek
185+ .map { timeMapper.toShortDayOfWeekName(it) }
186+ if (data.isEmpty()) return emptyList()
142187
143- private fun getFinalText (
144- baseTitle : String ,
145- data : List <String >,
146- ): String {
147- return if (data.isNotEmpty()) {
148- " $baseTitle : ${data.joinToString(separator = " , " )} "
149- } else {
150- " "
188+ val result = mutableListOf<ViewHolderType >()
189+ result + = ComplexRuleElementTitleViewData (
190+ text = resourceRepo.getString(R .string.range_day),
191+ )
192+ result + = data.map {
193+ ComplexRuleElementContentViewData (
194+ text = it,
195+ icon = null ,
196+ color = resourceRepo.getColor(R .color.colorSecondary),
197+ )
151198 }
199+ return result
152200 }
153201}
0 commit comments