Skip to content

Commit ed0cfec

Browse files
committed
support tag value suffix
1 parent 815833a commit ed0cfec

File tree

15 files changed

+89
-29
lines changed

15 files changed

+89
-29
lines changed

core/common/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordTagValueMapper.kt

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,17 @@ class RecordTagValueMapper @Inject constructor(
1313
return value.toBigDecimal().stripTrailingZeros().toPlainString()
1414
}
1515

16-
fun getNameWithValue(name: String, value: Double): String {
16+
fun getNameWithValue(
17+
name: String,
18+
value: Double,
19+
valueSuffix: String,
20+
): String {
1721
val actualValue = map(value)
18-
return resourceRepo.getString(
19-
R.string.separator_template,
20-
name,
21-
"($actualValue)",
22-
)
22+
val tagValue = if (valueSuffix.isEmpty()) {
23+
actualValue
24+
} else {
25+
resourceRepo.getString(R.string.separator_template, actualValue, valueSuffix)
26+
}
27+
return resourceRepo.getString(R.string.separator_template, name, "($tagValue)")
2328
}
2429
}

core/src/main/java/com/example/util/simpletimetracker/core/mapper/CategoryViewDataMapper.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ class CategoryViewDataMapper @Inject constructor(
120120
val newName = recordTagValueMapper.getNameWithValue(
121121
name = viewData.name,
122122
value = value,
123+
valueSuffix = tag.valueSuffix,
123124
)
124125
return viewData.copy(name = newName)
125126
} else {

core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordTagFullNameMapper.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ class RecordTagFullNameMapper @Inject constructor(
1717
separator = ", ",
1818
transform = { tag ->
1919
tagDataMap[tag.id]?.numericValue?.let { value ->
20-
recordTagValueMapper.getNameWithValue(tag.name, value)
20+
recordTagValueMapper.getNameWithValue(
21+
name = tag.name,
22+
value = value,
23+
valueSuffix = tag.valueSuffix,
24+
)
2125
} ?: tag.name
2226
},
2327
)

features/feature_change_record_tag/src/main/java/com/example/util/simpletimetracker/feature_change_record_tag/interactor/ChangeRecordTagViewDataInteractor.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.example.util.simpletimetracker.domain.recordTag.model.RecordTagValueT
88
import com.example.util.simpletimetracker.domain.recordType.interactor.RecordTypeInteractor
99
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
1010
import com.example.util.simpletimetracker.feature_base_adapter.buttonsRow.ButtonsRowItemViewData
11+
import com.example.util.simpletimetracker.feature_base_adapter.commentField.CommentFieldViewData
1112
import com.example.util.simpletimetracker.feature_base_adapter.divider.DividerViewData
1213
import com.example.util.simpletimetracker.feature_base_adapter.hint.HintViewData
1314
import com.example.util.simpletimetracker.feature_change_record_tag.R
@@ -56,6 +57,7 @@ class ChangeRecordTagViewDataInteractor @Inject constructor(
5657
fun getTagValueState(
5758
valueType: RecordTagValueType,
5859
valueSuffix: String,
60+
fromValueChange: Boolean,
5961
): ChangeRecordTagValueViewData {
6062
fun mapValueTypeName(type: RecordTagValueType): String {
6163
return when (type) {
@@ -84,7 +86,13 @@ class ChangeRecordTagViewDataInteractor @Inject constructor(
8486
},
8587
)
8688
if (valueType == RecordTagValueType.NUMERIC) {
87-
// TODO TAG add input field for suffix
89+
result += CommentFieldViewData(
90+
id = "change_record_tag_value_suffix".hashCode().toLong(),
91+
text = if (fromValueChange) null else valueSuffix,
92+
marginTopDp = 0,
93+
marginHorizontal = resourceRepo.getDimenInDp(R.dimen.edit_screen_margin_horizontal),
94+
hint = resourceRepo.getString(R.string.change_record_type_value_suffix),
95+
)
8896
}
8997

9098
return ChangeRecordTagValueViewData(

features/feature_change_record_tag/src/main/java/com/example/util/simpletimetracker/feature_change_record_tag/view/ChangeRecordTagFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import com.example.util.simpletimetracker.feature_base_adapter.category.Category
4343
import com.example.util.simpletimetracker.feature_base_adapter.color.createColorAdapterDelegate
4444
import com.example.util.simpletimetracker.feature_base_adapter.color.createColorFavouriteAdapterDelegate
4545
import com.example.util.simpletimetracker.feature_base_adapter.color.createColorPaletteAdapterDelegate
46+
import com.example.util.simpletimetracker.feature_base_adapter.commentField.createCommentFieldAdapterDelegate
4647
import com.example.util.simpletimetracker.feature_base_adapter.divider.createDividerAdapterDelegate
4748
import com.example.util.simpletimetracker.feature_base_adapter.emoji.createEmojiAdapterDelegate
4849
import com.example.util.simpletimetracker.feature_base_adapter.empty.createEmptyAdapterDelegate
@@ -144,6 +145,7 @@ class ChangeRecordTagFragment :
144145
createHintAdapterDelegate(),
145146
createDividerAdapterDelegate(),
146147
createButtonsRowAdapterDelegate(viewModel::onButtonsRowClick),
148+
createCommentFieldAdapterDelegate(viewModel::onValueChange),
147149
)
148150
}
149151
private var iconsLayoutManager: GridLayoutManager? = null

features/feature_change_record_tag/src/main/java/com/example/util/simpletimetracker/feature_change_record_tag/viewModel/ChangeRecordTagViewModel.kt

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ class ChangeRecordTagViewModel @Inject constructor(
120120
val valueState: LiveData<ChangeRecordTagValueViewData> by lazy {
121121
return@lazy MutableLiveData<ChangeRecordTagValueViewData>().let { initial ->
122122
viewModelScope.launch {
123-
initial.value = loadValueState()
123+
initial.value = loadValueState(fromValueChange = false)
124124
}
125125
initial
126126
}
@@ -259,6 +259,13 @@ class ChangeRecordTagViewModel @Inject constructor(
259259
updateValueState()
260260
}
261261

262+
fun onValueChange(valueText: String) {
263+
if (valueText != newValueSuffix) {
264+
newValueSuffix = valueText
265+
updateValueState(fromValueChange = true)
266+
}
267+
}
268+
262269
fun onArchiveClick() {
263270
archiveButtonEnabled.set(false)
264271
viewModelScope.launch {
@@ -584,15 +591,20 @@ class ChangeRecordTagViewModel @Inject constructor(
584591
return newNote
585592
}
586593

587-
private fun updateValueState() {
588-
val data = loadValueState()
594+
private fun updateValueState(
595+
fromValueChange: Boolean = false,
596+
) {
597+
val data = loadValueState(fromValueChange)
589598
valueState.set(data)
590599
}
591600

592-
private fun loadValueState(): ChangeRecordTagValueViewData {
601+
private fun loadValueState(
602+
fromValueChange: Boolean,
603+
): ChangeRecordTagValueViewData {
593604
return changeRecordTagViewDataInteractor.getTagValueState(
594605
valueType = newValueType,
595606
valueSuffix = newValueSuffix,
607+
fromValueChange = fromValueChange,
596608
)
597609
}
598610

features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/activitySwitch/interactor/GetNotificationActivitySwitchControlsInteractor.kt

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper
99
import com.example.util.simpletimetracker.core.repo.ResourceRepo
1010
import com.example.util.simpletimetracker.domain.base.REPEAT_BUTTON_ITEM_ID
1111
import com.example.util.simpletimetracker.domain.recordTag.interactor.GetSelectableTagsInteractor
12+
import com.example.util.simpletimetracker.domain.recordTag.interactor.RecordTagInteractor
1213
import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
1314
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
1415
import com.example.util.simpletimetracker.domain.recordType.model.RecordTypeGoal
@@ -29,6 +30,7 @@ class GetNotificationActivitySwitchControlsInteractor @Inject constructor(
2930
private val recordTagViewDataMapper: RecordTagViewDataMapper,
3031
private val completeTypesStateInteractor: CompleteTypesStateInteractor,
3132
private val getSelectableTagsInteractor: GetSelectableTagsInteractor,
33+
private val recordTagInteractor: RecordTagInteractor,
3234
) {
3335

3436
suspend fun getControls(
@@ -49,6 +51,8 @@ class GetNotificationActivitySwitchControlsInteractor @Inject constructor(
4951
mapTagSelectionViewState(
5052
isDarkTheme = isDarkTheme,
5153
currentValueString = selectedTagValue,
54+
valueSuffix = recordTagInteractor.get(selectedTagId)
55+
?.valueSuffix.orEmpty(),
5256
)
5357
} else {
5458
mapTypesViewState(
@@ -180,11 +184,18 @@ class GetNotificationActivitySwitchControlsInteractor @Inject constructor(
180184
private fun mapTagSelectionViewState(
181185
isDarkTheme: Boolean,
182186
currentValueString: String?,
187+
valueSuffix: String,
183188
): NotificationControlsParams.ViewState {
184-
val hint = if (currentValueString.isNullOrEmpty()) {
185-
resourceRepo.getString(R.string.change_record_type_value_selection_hint)
186-
} else {
187-
currentValueString // TODO TAG add suffix
189+
val hint = when {
190+
currentValueString.isNullOrEmpty() -> {
191+
resourceRepo.getString(R.string.change_record_type_value_selection_hint)
192+
}
193+
valueSuffix.isEmpty() -> {
194+
currentValueString
195+
}
196+
else -> {
197+
"$currentValueString $valueSuffix"
198+
}
188199
}
189200

190201
val controlIconColor = colorMapper.toInactiveColor(isDarkTheme)

features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/interactor/StatisticsDetailTagValueInteractor.kt

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,12 @@ class StatisticsDetailTagValueInteractor @Inject constructor(
4040
rangePosition: Int,
4141
): StatisticsDetailTagValuesCompositeViewData = withContext(Dispatchers.Default) {
4242
val tags = recordTagInteractor.getAll()
43-
val needToShowTagValue = needToShowTagValue(filter, tags)
44-
45-
if (!needToShowTagValue) {
46-
return@withContext StatisticsDetailTagValuesCompositeViewData(
43+
val valuedTag = getSingleSelectedTagWithValue(filter, tags)
44+
?: return@withContext StatisticsDetailTagValuesCompositeViewData(
4745
viewData = emptyList(),
4846
appliedChartGrouping = currentChartGrouping,
4947
appliedChartLength = currentChartLength,
5048
)
51-
}
5249

5350
val firstDayOfWeek = prefsInteractor.getFirstDayOfWeek()
5451
val startOfDayShift = prefsInteractor.getStartOfDayShift()
@@ -109,6 +106,7 @@ class StatisticsDetailTagValueInteractor @Inject constructor(
109106
availableChartLengths = compositeData.availableChartLengths,
110107
appliedChartLength = compositeData.appliedChartLength,
111108
chartMode = chartMode,
109+
valueSuffix = valuedTag.valueSuffix,
112110
useProportionalMinutes = useProportionalMinutes,
113111
showSeconds = showSeconds,
114112
isDarkTheme = isDarkTheme,
@@ -121,17 +119,20 @@ class StatisticsDetailTagValueInteractor @Inject constructor(
121119
)
122120
}
123121

124-
private fun needToShowTagValue(
122+
private fun getSingleSelectedTagWithValue(
125123
filter: List<RecordsFilter>,
126124
tags: List<RecordTag>,
127-
): Boolean {
125+
): RecordTag? {
128126
val previewType = statisticsDetailPreviewInteractor.getPreviewType(filter)
129127
val selectedTags = filter.getSelectedTags().filterIsInstance<RecordsFilter.TagItem.Tagged>()
130-
val selectedTag = selectedTags.firstOrNull()
131-
val tagType = tags.firstOrNull { it.id == selectedTag?.tagId }?.valueType
128+
val selectedTagId = selectedTags.firstOrNull()?.tagId
129+
val selectedTag = tags.firstOrNull { it.id == selectedTagId }
130+
val tagType = selectedTag?.valueType
132131

133-
return previewType is PreviewType.SelectedTags &&
132+
val needToShowTagValue = previewType is PreviewType.SelectedTags &&
134133
selectedTags.size == 1 &&
135134
tagType == RecordTagValueType.NUMERIC
135+
136+
return if (needToShowTagValue) selectedTag else null
136137
}
137138
}

features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/mapper/StatisticsDetailTagValuesViewDataMapper.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class StatisticsDetailTagValuesViewDataMapper @Inject constructor(
3131
availableChartLengths: List<ChartLength>,
3232
appliedChartLength: ChartLength,
3333
chartMode: ChartMode,
34+
valueSuffix: String,
3435
useProportionalMinutes: Boolean,
3536
showSeconds: Boolean,
3637
isDarkTheme: Boolean,
@@ -71,9 +72,15 @@ class StatisticsDetailTagValuesViewDataMapper @Inject constructor(
7172
)
7273

7374
if (chartData.visible) {
75+
val mainHint = resourceRepo.getString(R.string.statistics_detail_tag_values_hint)
76+
val hint = if (valueSuffix.isEmpty()) {
77+
mainHint
78+
} else {
79+
"$mainHint ($valueSuffix)"
80+
}
7481
items += StatisticsDetailHintViewData(
7582
block = StatisticsDetailBlock.TagValuesHint,
76-
text = resourceRepo.getString(R.string.statistics_detail_tag_values_hint),
83+
text = hint,
7784
)
7885
}
7986

features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/mapper/StatisticsDetailViewDataMapper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ class StatisticsDetailViewDataMapper @Inject constructor(
634634
val (legendSuffix, isMinutes) = when (chartMode) {
635635
ChartMode.DURATIONS -> mapLegendSuffix(data)
636636
ChartMode.COUNTS -> "" to false
637-
ChartMode.TAG_VALUE -> "" to false // TODO TAG suffix?
637+
ChartMode.TAG_VALUE -> "" to false
638638
}
639639

640640
fun formatInterval(interval: Long): Float {

0 commit comments

Comments
 (0)