Skip to content

Commit b4cc9fc

Browse files
committed
change fab buttons color
1 parent 7c548a2 commit b4cc9fc

File tree

12 files changed

+317
-123
lines changed

12 files changed

+317
-123
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
package com.example.util.simpletimetracker.feature_complex_rules.adapter
22

3-
import android.widget.TextView
43
import androidx.annotation.ColorInt
4+
import androidx.recyclerview.widget.RecyclerView
5+
import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter
56
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
67
import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate
78
import com.example.util.simpletimetracker.feature_views.ColorUtils
89
import com.example.util.simpletimetracker.feature_views.extension.setOnClickWith
910
import com.example.util.simpletimetracker.feature_views.extension.visible
11+
import com.example.util.simpletimetracker.feature_views.viewData.RecordTypeIcon
12+
import com.google.android.flexbox.FlexDirection
13+
import com.google.android.flexbox.FlexWrap
14+
import com.google.android.flexbox.FlexboxLayoutManager
15+
import com.google.android.flexbox.JustifyContent
16+
import com.example.util.simpletimetracker.feature_complex_rules.adapter.ComplexRuleElementContentViewData as ContentViewData
17+
import com.example.util.simpletimetracker.feature_complex_rules.adapter.ComplexRuleElementTitleViewData as TitleViewData
1018
import com.example.util.simpletimetracker.feature_complex_rules.adapter.ComplexRuleViewData as ViewData
19+
import com.example.util.simpletimetracker.feature_complex_rules.databinding.ItemComplexRuleElementContentBinding as ContentBinding
20+
import com.example.util.simpletimetracker.feature_complex_rules.databinding.ItemComplexRuleElementTitleBinding as TitleBinding
1121
import com.example.util.simpletimetracker.feature_complex_rules.databinding.ItemComplexRuleLayoutBinding as Binding
1222

1323
fun createComplexRuleAdapterDelegate(
@@ -17,38 +27,48 @@ fun createComplexRuleAdapterDelegate(
1727
Binding::inflate,
1828
) { binding, item, _ ->
1929

30+
fun createAdapter(): BaseRecyclerAdapter {
31+
return BaseRecyclerAdapter(
32+
createElementTitleAdapter(),
33+
createElementContentAdapter(),
34+
)
35+
}
36+
37+
fun bindRecycler(
38+
recyclerView: RecyclerView,
39+
items: List<ViewHolderType>,
40+
) {
41+
recyclerView.itemAnimator = null
42+
recyclerView.layoutManager = FlexboxLayoutManager(binding.root.context).apply {
43+
flexDirection = FlexDirection.ROW
44+
justifyContent = JustifyContent.FLEX_START
45+
flexWrap = FlexWrap.WRAP
46+
}
47+
val adapter: RecyclerView.Adapter<*> = recyclerView.adapter
48+
?: createAdapter().also { recyclerView.adapter = it }
49+
(adapter as? BaseRecyclerAdapter)?.replace(items)
50+
}
51+
2052
with(binding) {
2153
item as ViewData
2254

23-
fun TextView.setData(data: String) {
24-
if (data.isNotEmpty()) {
25-
visible = true
26-
text = data
27-
} else {
28-
visible = false
29-
}
30-
}
55+
bindRecycler(rvComplexRuleItemActions, item.actionItems)
56+
bindRecycler(rvComplexRuleItemConditions, item.conditionItems)
3157

3258
containerComplexRuleItem.setCardBackgroundColor(item.color)
3359
btnComplexRuleButtonDisable.setCardBackgroundColor(item.disableButtonColor)
3460
tvComplexRuleButtonDisable.text = item.disableButtonText
3561
viewComplexRuleItemDivider.setBackgroundColor(ColorUtils.normalizeLightness(item.color))
36-
tvComplexRuleItemAction.text = item.actionTitle
37-
tvComplexRuleItemStartingTypes.setData(item.startingTypes)
38-
tvComplexRuleItemCurrentTypes.setData(item.currentTypes)
39-
tvComplexRuleItemDayOfWeek.setData(item.daysOfWeek)
4062

41-
containerComplexRuleItem.setOnClickWith(item, onItemClick)
63+
viewComplexRuleItemConditionsClick.setOnClickWith(item, onItemClick)
4264
btnComplexRuleButtonDisable.setOnClickWith(item, onDisableClick)
4365
}
4466
}
4567

4668
data class ComplexRuleViewData(
4769
val id: Long,
48-
val actionTitle: String,
49-
val startingTypes: String,
50-
val currentTypes: String,
51-
val daysOfWeek: String,
70+
val actionItems: List<ViewHolderType>,
71+
val conditionItems: List<ViewHolderType>,
5272
@ColorInt val color: Int,
5373
@ColorInt val disableButtonColor: Int,
5474
val disableButtonText: String,
@@ -57,4 +77,53 @@ data class ComplexRuleViewData(
5777
override fun getUniqueId(): Long = id
5878

5979
override fun isValidType(other: ViewHolderType): Boolean = other is ViewData
60-
}
80+
}
81+
82+
data class ComplexRuleElementTitleViewData(
83+
val text: String,
84+
) : ViewHolderType {
85+
86+
override fun getUniqueId(): Long = text.hashCode().toLong()
87+
88+
override fun isValidType(other: ViewHolderType): Boolean = other is TitleViewData
89+
}
90+
91+
data class ComplexRuleElementContentViewData(
92+
val text: String,
93+
val icon: RecordTypeIcon?,
94+
@ColorInt val color: Int,
95+
) : ViewHolderType {
96+
97+
override fun getUniqueId(): Long = text.hashCode().toLong()
98+
99+
override fun isValidType(other: ViewHolderType): Boolean = other is ContentViewData
100+
}
101+
102+
private fun createElementTitleAdapter() = createRecyclerBindingAdapterDelegate<TitleViewData, TitleBinding>(
103+
TitleBinding::inflate,
104+
) { binding, item, _ ->
105+
with(binding) {
106+
item as TitleViewData
107+
108+
(binding.root.layoutParams as? FlexboxLayoutManager.LayoutParams)
109+
?.apply { isWrapBefore = true }
110+
tvComplexRuleElementItemTitle.text = item.text
111+
}
112+
}
113+
114+
private fun createElementContentAdapter() = createRecyclerBindingAdapterDelegate<ContentViewData, ContentBinding>(
115+
ContentBinding::inflate,
116+
) { binding, item, _ ->
117+
with(binding) {
118+
item as ContentViewData
119+
120+
tvComplexRuleElementItemContent.text = item.text
121+
cvComplexRuleElementItemContent.setCardBackgroundColor(item.color)
122+
if (item.icon != null) {
123+
ivComplexRuleElementItemContent.visible = true
124+
ivComplexRuleElementItemContent.itemIcon = item.icon
125+
} else {
126+
ivComplexRuleElementItemContent.visible = false
127+
}
128+
}
129+
}

features/feature_complex_rules/src/main/java/com/example/util/simpletimetracker/feature_complex_rules/interactor/ComplexRulesViewDataInteractor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class ComplexRulesViewDataInteractor @Inject constructor(
4444
if (shouldAddHints) {
4545
val anyAction = group.firstOrNull()?.action
4646
if (anyAction != null) {
47-
val hint = complexRulesViewDataMapper.mapBaseTitle(anyAction)
47+
val hint = complexRulesViewDataMapper.mapActionTitle(anyAction)
4848
result += HintViewData(hint)
4949
}
5050
}
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,27 @@
11
package com.example.util.simpletimetracker.feature_complex_rules.mapper
22

33
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
46
import com.example.util.simpletimetracker.core.mapper.TimeMapper
57
import com.example.util.simpletimetracker.core.repo.ResourceRepo
68
import com.example.util.simpletimetracker.domain.model.ComplexRule
79
import com.example.util.simpletimetracker.domain.model.RecordTag
810
import com.example.util.simpletimetracker.domain.model.RecordType
11+
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
912
import com.example.util.simpletimetracker.feature_complex_rules.R
1013
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
1116
import com.example.util.simpletimetracker.feature_complex_rules.adapter.ComplexRuleViewData
1217
import javax.inject.Inject
1318

1419
class 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

Comments
 (0)