1
1
package com.example.util.simpletimetracker.feature_complex_rules.mapper
2
2
3
3
import 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
4
6
import com.example.util.simpletimetracker.core.mapper.TimeMapper
5
7
import com.example.util.simpletimetracker.core.repo.ResourceRepo
6
8
import com.example.util.simpletimetracker.domain.model.ComplexRule
7
9
import com.example.util.simpletimetracker.domain.model.RecordTag
8
10
import com.example.util.simpletimetracker.domain.model.RecordType
11
+ import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
9
12
import com.example.util.simpletimetracker.feature_complex_rules.R
10
13
import 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
11
16
import com.example.util.simpletimetracker.feature_complex_rules.adapter.ComplexRuleViewData
12
17
import javax.inject.Inject
13
18
14
19
class ComplexRulesViewDataMapper @Inject constructor(
15
20
private val timeMapper : TimeMapper ,
21
+ private val iconMapper : IconMapper ,
16
22
private val colorMapper : ColorMapper ,
17
23
private val resourceRepo : ResourceRepo ,
24
+ private val recordTagViewDataMapper : RecordTagViewDataMapper ,
18
25
) {
19
26
20
27
fun mapAddItem (
@@ -34,24 +41,24 @@ class ComplexRulesViewDataMapper @Inject constructor(
34
41
typesOrder : List <Long >,
35
42
tagsOrder : List <Long >,
36
43
): 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
+
37
58
return ComplexRuleViewData (
38
59
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,
55
62
color = if (rule.disabled) {
56
63
colorMapper.toInactiveColor(isDarkTheme)
57
64
} else {
@@ -70,29 +77,68 @@ class ComplexRulesViewDataMapper @Inject constructor(
70
77
)
71
78
}
72
79
73
- private fun mapActionTitle (
80
+ private fun mapActions (
74
81
rule : ComplexRule ,
82
+ isDarkTheme : Boolean ,
83
+ typesMap : Map <Long , RecordType >,
75
84
tagsMap : Map <Long , RecordTag >,
76
85
tagsOrder : List <Long >,
77
- ): String {
86
+ ): List < ViewHolderType > {
78
87
val action = rule.action
79
- val baseTitle = mapBaseTitle(action)
80
- return when (action) {
88
+ val data = when (action) {
81
89
is ComplexRule .Action .AllowMultitasking ,
82
90
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
+ ),
91
111
)
92
112
}
113
+ return result
93
114
}
94
115
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 (
96
142
action : ComplexRule .Action ,
97
143
): String {
98
144
return when (action) {
@@ -105,49 +151,51 @@ class ComplexRulesViewDataMapper @Inject constructor(
105
151
}.let (resourceRepo::getString)
106
152
}
107
153
108
- private fun mapStartingTypes (
109
- rule : ComplexRule ,
154
+ private fun mapTypes (
155
+ typeIds : Set <Long >,
156
+ title : String ,
157
+ isDarkTheme : Boolean ,
110
158
typesMap : Map <Long , RecordType >,
111
159
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()
120
165
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
132
179
}
133
180
134
181
private fun mapDaysOfWeek (
135
182
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()
142
187
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
+ )
151
198
}
199
+ return result
152
200
}
153
201
}
0 commit comments