Skip to content

Commit d4e6975

Browse files
committed
add value tag selection to wear
1 parent 3106197 commit d4e6975

File tree

33 files changed

+458
-103
lines changed

33 files changed

+458
-103
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.example.util.simpletimetracker.core.mapper
2+
3+
import com.example.util.simpletimetracker.core.common.R
4+
import com.example.util.simpletimetracker.core.repo.BaseResourceRepo
5+
import javax.inject.Inject
6+
7+
class RecordTagValueMapper @Inject constructor(
8+
private val resourceRepo: BaseResourceRepo,
9+
) {
10+
11+
fun map(value: Double): String {
12+
// TODO TAG do better?
13+
return value.toBigDecimal().stripTrailingZeros().toPlainString()
14+
}
15+
16+
fun getNameWithValue(name: String, value: Double): String {
17+
val actualValue = map(value)
18+
return resourceRepo.getString(
19+
R.string.separator_template,
20+
name,
21+
"($actualValue)",
22+
)
23+
}
24+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class CategoryViewDataMapper @Inject constructor(
2626
private val iconMapper: IconMapper,
2727
private val resourceRepo: ResourceRepo,
2828
private val recordTagViewDataMapper: RecordTagViewDataMapper,
29-
private val recordTagFullNameMapper: RecordTagFullNameMapper,
29+
private val recordTagValueMapper: RecordTagValueMapper,
3030
) {
3131

3232
fun mapCategory(
@@ -117,7 +117,7 @@ class CategoryViewDataMapper @Inject constructor(
117117
)
118118
val value = tagData?.numericValue
119119
return if (value != null) {
120-
val newName = recordTagFullNameMapper.getNameWithValue(
120+
val newName = recordTagValueMapper.getNameWithValue(
121121
name = viewData.name,
122122
value = value,
123123
)

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

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,13 @@
11
package com.example.util.simpletimetracker.core.mapper
22

3-
import com.example.util.simpletimetracker.core.R
4-
import com.example.util.simpletimetracker.core.repo.ResourceRepo
53
import com.example.util.simpletimetracker.domain.record.model.RecordBase
64
import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
75
import javax.inject.Inject
86

97
class RecordTagFullNameMapper @Inject constructor(
10-
private val resourceRepo: ResourceRepo,
8+
private val recordTagValueMapper: RecordTagValueMapper,
119
) {
1210

13-
fun getNameWithValue(name: String, value: Double): String {
14-
// TODO TAG do better?
15-
val actualValue = value.toBigDecimal().stripTrailingZeros().toPlainString()
16-
return resourceRepo.getString(
17-
R.string.separator_template,
18-
name,
19-
"($actualValue)",
20-
)
21-
}
22-
2311
fun getFullName(
2412
tags: List<RecordTag>,
2513
tagData: List<RecordBase.Tag>,
@@ -28,9 +16,9 @@ class RecordTagFullNameMapper @Inject constructor(
2816
return tags.joinToString(
2917
separator = ", ",
3018
transform = { tag ->
31-
tagDataMap[tag.id]?.numericValue
32-
?.let { value -> getNameWithValue(tag.name, value) }
33-
?: tag.name
19+
tagDataMap[tag.id]?.numericValue?.let { value ->
20+
recordTagValueMapper.getNameWithValue(tag.name, value)
21+
} ?: tag.name
3422
},
3523
)
3624
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.example.util.simpletimetracker.domain.extension
2+
3+
inline fun <T> List<T>.removeIf(crossinline filter: (T) -> Boolean): List<T> {
4+
return this.toMutableList().apply { removeAll { filter(it) } }
5+
}
6+
7+
inline fun <T> Set<T>.removeIf(crossinline filter: (T) -> Boolean): Set<T> {
8+
return this.toMutableSet().apply { removeAll { filter(it) } }
9+
}

domain/src/main/java/com/example/util/simpletimetracker/domain/extension/CollectionExtensions.kt

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,6 @@ operator fun <T> List<T>.plus(elements: List<T>?): List<T> {
5151
return if (elements != null) this.toMutableList().apply { addAll(elements) } else this
5252
}
5353

54-
inline fun <T> List<T>.removeIf(crossinline filter: (T) -> Boolean): List<T> {
55-
return this.toMutableList().apply { removeAll { filter(it) } }
56-
}
57-
58-
inline fun <T> Set<T>.removeIf(crossinline filter: (T) -> Boolean): Set<T> {
59-
return this.toMutableSet().apply { removeAll { filter(it) } }
60-
}
61-
6254
inline fun <T> List<T>.replaceWith(new: T, crossinline filter: (T) -> Boolean): List<T> {
6355
return this.removeIf(filter).toMutableList().apply { add(new) }
6456
}

domain/src/main/java/com/example/util/simpletimetracker/domain/record/model/RecordBase.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ sealed interface RecordBase {
88
val tags: List<Tag>
99

1010
val duration: Long get() = timeEnded - timeStarted
11-
val tagIds: List<Long> get() = tags.map { it.tagId }
11+
val tagIds: List<Long> get() = tags.map { it.tagId } // TODO TAG not good, maps every time
1212

1313
data class Tag(
1414
val tagId: Long,

features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/typesSelection/viewModel/TypesSelectionViewModel.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,11 @@ class TypesSelectionViewModel @Inject constructor(
7272
val clickedTag = viewDataCache
7373
.firstOrNull { it.id == item.id }
7474
as? TypesSelectionCacheHolder.Tag
75-
val needValueSelection = needTagValueSelectionInteractor.execute(
76-
selectedTagIds = dataIdsSelected,
77-
clickedTag = clickedTag?.data,
78-
) && extra.allowTagValueSelection
75+
val needValueSelection = extra.allowTagValueSelection &&
76+
needTagValueSelectionInteractor.execute(
77+
selectedTagIds = dataIdsSelected,
78+
clickedTag = clickedTag?.data,
79+
)
7980

8081
if (needValueSelection) {
8182
// TODO TAG add to statistics

features/feature_wear/src/main/java/com/example/util/simpletimetracker/feature_wear/WearDataLocalMapper.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.example.util.simpletimetracker.domain.color.mapper.AppColorMapper
1212
import com.example.util.simpletimetracker.domain.color.model.AppColor
1313
import com.example.util.simpletimetracker.domain.daysOfWeek.model.DayOfWeek
1414
import com.example.util.simpletimetracker.domain.record.model.Record
15+
import com.example.util.simpletimetracker.domain.record.model.RecordBase
1516
import com.example.util.simpletimetracker.domain.record.model.RunningRecord
1617
import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
1718
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
@@ -46,7 +47,7 @@ class WearDataLocalMapper @Inject constructor(
4647

4748
fun map(
4849
record: RunningRecord,
49-
tags: List<WearTagDTO>,
50+
tags: List<WearCurrentActivityDTO.TagDTO>,
5051
): WearCurrentActivityDTO {
5152
return WearCurrentActivityDTO(
5253
id = record.id,
@@ -57,7 +58,7 @@ class WearDataLocalMapper @Inject constructor(
5758

5859
fun map(
5960
record: Record,
60-
tags: List<WearTagDTO>,
61+
tags: List<WearCurrentActivityDTO.TagDTO>,
6162
): WearLastRecordDTO {
6263
return WearLastRecordDTO(
6364
activityId = record.typeId,
@@ -81,6 +82,16 @@ class WearDataLocalMapper @Inject constructor(
8182
)
8283
}
8384

85+
fun map(
86+
recordTag: RecordTag,
87+
recordTagData: RecordBase.Tag?,
88+
): WearCurrentActivityDTO.TagDTO {
89+
return WearCurrentActivityDTO.TagDTO(
90+
name = recordTag.name,
91+
numericValue = recordTagData?.numericValue,
92+
)
93+
}
94+
8495
fun map(
8596
statistics: Statistics,
8697
dataHolder: StatisticsDataHolder?,

features/feature_wear/src/main/java/com/example/util/simpletimetracker/feature_wear/WearDataRepo.kt

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,34 +10,37 @@ import com.example.util.simpletimetracker.core.interactor.StatisticsMediator
1010
import com.example.util.simpletimetracker.core.mapper.TimeMapper
1111
import com.example.util.simpletimetracker.domain.activitySuggestion.interactor.GetCurrentActivitySuggestionsInteractor
1212
import com.example.util.simpletimetracker.domain.extension.orZero
13-
import com.example.util.simpletimetracker.domain.record.interactor.AddRunningRecordMediator
14-
import com.example.util.simpletimetracker.domain.recordTag.interactor.GetSelectableTagsInteractor
13+
import com.example.util.simpletimetracker.domain.notifications.interactor.UpdateExternalViewsInteractor
1514
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
15+
import com.example.util.simpletimetracker.domain.record.interactor.AddRunningRecordMediator
1616
import com.example.util.simpletimetracker.domain.record.interactor.RecordInteractor
17-
import com.example.util.simpletimetracker.domain.recordTag.interactor.RecordTagInteractor
18-
import com.example.util.simpletimetracker.domain.recordType.interactor.RecordTypeInteractor
1917
import com.example.util.simpletimetracker.domain.record.interactor.RemoveRunningRecordMediator
2018
import com.example.util.simpletimetracker.domain.record.interactor.RunningRecordInteractor
21-
import com.example.util.simpletimetracker.domain.statistics.interactor.SettingsDataUpdateInteractor
2219
import com.example.util.simpletimetracker.domain.record.interactor.ShouldShowRecordDataSelectionInteractor
23-
import com.example.util.simpletimetracker.domain.notifications.interactor.UpdateExternalViewsInteractor
2420
import com.example.util.simpletimetracker.domain.record.model.RecordBase
25-
import com.example.util.simpletimetracker.domain.widget.interactor.WidgetInteractor
2621
import com.example.util.simpletimetracker.domain.record.model.RecordDataSelectionDialogResult
27-
import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
22+
import com.example.util.simpletimetracker.domain.recordTag.interactor.GetSelectableTagsInteractor
23+
import com.example.util.simpletimetracker.domain.recordTag.interactor.NeedTagValueSelectionInteractor
24+
import com.example.util.simpletimetracker.domain.recordTag.interactor.RecordTagInteractor
25+
import com.example.util.simpletimetracker.domain.recordType.interactor.RecordTypeInteractor
2826
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
27+
import com.example.util.simpletimetracker.domain.statistics.interactor.SettingsDataUpdateInteractor
2928
import com.example.util.simpletimetracker.domain.statistics.model.ChartFilterType
3029
import com.example.util.simpletimetracker.domain.statistics.model.RangeLength
30+
import com.example.util.simpletimetracker.domain.widget.interactor.WidgetInteractor
3131
import com.example.util.simpletimetracker.domain.widget.model.WidgetType
3232
import com.example.util.simpletimetracker.navigation.Router
3333
import com.example.util.simpletimetracker.wear_api.WearActivityDTO
3434
import com.example.util.simpletimetracker.wear_api.WearCommunicationAPI
35+
import com.example.util.simpletimetracker.wear_api.WearCurrentActivityDTO
3536
import com.example.util.simpletimetracker.wear_api.WearCurrentStateDTO
3637
import com.example.util.simpletimetracker.wear_api.WearRecordRepeatResponse
3738
import com.example.util.simpletimetracker.wear_api.WearSetSettingsRequest
3839
import com.example.util.simpletimetracker.wear_api.WearSettingsDTO
3940
import com.example.util.simpletimetracker.wear_api.WearShouldShowTagSelectionRequest
4041
import com.example.util.simpletimetracker.wear_api.WearShouldShowTagSelectionResponse
42+
import com.example.util.simpletimetracker.wear_api.WearShouldShowTagValueSelectionRequest
43+
import com.example.util.simpletimetracker.wear_api.WearShouldShowTagValueSelectionResponse
4144
import com.example.util.simpletimetracker.wear_api.WearStartActivityRequest
4245
import com.example.util.simpletimetracker.wear_api.WearStatisticsDTO
4346
import com.example.util.simpletimetracker.wear_api.WearStatisticsRequest
@@ -54,6 +57,7 @@ class WearDataRepo @Inject constructor(
5457
private val runningRecordInteractor: RunningRecordInteractor,
5558
private val recordInteractor: RecordInteractor,
5659
private val shouldShowRecordDataSelectionInteractor: ShouldShowRecordDataSelectionInteractor,
60+
private val needTagValueSelectionInteractor: NeedTagValueSelectionInteractor,
5761
private val removeRunningRecordMediator: Lazy<RemoveRunningRecordMediator>,
5862
private val addRunningRecordMediator: Lazy<AddRunningRecordMediator>,
5963
private val recordRepeatInteractor: Lazy<RecordRepeatInteractor>,
@@ -74,13 +78,15 @@ class WearDataRepo @Inject constructor(
7478
}
7579

7680
override suspend fun queryCurrentActivities(): WearCurrentStateDTO {
77-
val tags = recordTagInteractor.getAll().associateBy(RecordTag::id)
81+
val tags = recordTagInteractor.getAll()
7882

79-
fun mapTags(tagIds: List<Long>): List<WearTagDTO> {
80-
return tagIds.mapNotNull { tagId ->
83+
fun mapTags(record: RecordBase): List<WearCurrentActivityDTO.TagDTO> {
84+
val tagDataMap = record.tags.associateBy { it.tagId }
85+
return tags.mapNotNull { tag ->
86+
if (tag.id !in tagDataMap.keys) return@mapNotNull null
8187
wearDataLocalMapper.map(
82-
recordTag = tags[tagId] ?: return@mapNotNull null,
83-
types = emptyMap(), // Color is not needed.
88+
recordTag = tag,
89+
recordTagData = tagDataMap[tag.id],
8490
)
8591
}
8692
}
@@ -90,12 +96,12 @@ class WearDataRepo @Inject constructor(
9096
}
9197
val runningRecords = runningRecordInteractor.getAll()
9298
val runningRecordsData = runningRecords.map { record ->
93-
wearDataLocalMapper.map(record, mapTags(record.tagIds))
99+
wearDataLocalMapper.map(record, mapTags(record))
94100
}
95101
val prevRecordsData = recordInteractor
96102
.getAllPrev(timeStarted = System.currentTimeMillis())
97103
.map { record ->
98-
wearDataLocalMapper.map(record, mapTags(record.tagIds))
104+
wearDataLocalMapper.map(record, mapTags(record))
99105
}
100106
val suggestionsData = getCurrentActivitySuggestionsInteractor.execute(
101107
recordTypesMapProvider = recordTypesMapProvider,
@@ -152,10 +158,10 @@ class WearDataRepo @Inject constructor(
152158
override suspend fun startActivity(request: WearStartActivityRequest) {
153159
addRunningRecordMediator.get().startTimer(
154160
typeId = request.id,
155-
tags = request.tagIds.map {
161+
tags = request.tags.map {
156162
RecordBase.Tag(
157-
tagId = it,
158-
numericValue = null, // TODO TAG add value selection to wear
163+
tagId = it.tagId,
164+
numericValue = it.numericValue,
159165
)
160166
},
161167
comment = "",
@@ -199,6 +205,18 @@ class WearDataRepo @Inject constructor(
199205
)
200206
}
201207

208+
override suspend fun queryShouldShowTagValueSelection(
209+
request: WearShouldShowTagValueSelectionRequest,
210+
): WearShouldShowTagValueSelectionResponse {
211+
val result = needTagValueSelectionInteractor.execute(
212+
selectedTagIds = request.selectedTagIds,
213+
clickedTagId = request.clickedTagId,
214+
)
215+
return WearShouldShowTagValueSelectionResponse(
216+
shouldShow = result,
217+
)
218+
}
219+
202220
override suspend fun querySettings(): WearSettingsDTO {
203221
return wearDataLocalMapper.map(
204222
allowMultitasking = prefsInteractor.getAllowMultitasking(),

0 commit comments

Comments
 (0)