Skip to content

Commit 7fce681

Browse files
committed
add tag value statistics
1 parent dba88b0 commit 7fce681

File tree

42 files changed

+542
-18
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+542
-18
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class RecordTagValueMapper @Inject constructor(
99
) {
1010

1111
fun map(value: Double): String {
12-
// TODO TAG do better?
12+
// TODO do better?
1313
return value.toBigDecimal().stripTrailingZeros().toPlainString()
1414
}
1515

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ fun Int?.orZero(): Int = this ?: 0
1515

1616
fun Float?.orZero(): Float = this ?: 0f
1717

18+
fun Double?.orZero(): Double = this ?: 0.0
19+
1820
fun <T> List<T>?.orEmpty(): List<T> = this ?: emptyList()
1921

2022
fun <T> List<T>.rotateLeft(n: Int): List<T> = drop(n) + take(n)

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ class ChangeRecordTagViewDataInteractor @Inject constructor(
6767
val result = mutableListOf<ViewHolderType>()
6868

6969
result += HintViewData(
70-
// TODO TAG change hint
7170
text = resourceRepo.getString(R.string.change_record_type_value_type_hint),
7271
)
7372
result += ButtonsRowItemViewData(

features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/recordQuickActions/interactor/RecordQuickActionsInteractor.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ class RecordQuickActionsInteractor @Inject constructor(
6969
val records = recordIds
7070
.mapNotNull { recordInteractor.get(it) }
7171
.filter {
72-
// TODO TAG translate strings
7372
it.tags.sortedBy(RecordBase.Tag::tagId) !=
7473
newTags.sortedBy(RecordBase.Tag::tagId)
7574
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ class TypesSelectionViewModel @Inject constructor(
7979
)
8080

8181
if (needValueSelection) {
82-
// TODO TAG add to statistics
8382
RecordTagValueSelectionParams(
8483
tag = CHANGE_RECORD_TAG_VALUE_SELECTION,
8584
tagId = item.id,

features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/external/ExternalBroadcastInteractor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ class ExternalBroadcastInteractor @Inject constructor(
232232
return ids.map {
233233
RecordBase.Tag(
234234
tagId = it,
235-
numericValue = null, // TODO TAG value selection?
235+
numericValue = null, // TODO value selection?
236236
)
237237
}
238238
}

features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/adapter/StatisticsDetailBlock.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ enum class StatisticsDetailBlock : ButtonsRowItemViewData.ButtonsRowId {
3838
GoalChartLength,
3939
GoalRangeAverages,
4040
GoalTotals,
41+
TagValuesHint,
42+
TagValuesChartData,
43+
TagValuesChartGrouping,
44+
TagValuesChartLength,
45+
TagValuesRangeAverages,
46+
TagValuesTotals,
4147
DataDistributionHint,
4248
DataDistributionPieChart,
4349
DataDistributionBarChart,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.example.util.simpletimetracker.feature_statistics_detail.conts
2+
3+
internal const val TAG_VALUE_PRECISION = 1000

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

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import com.example.util.simpletimetracker.domain.recordType.interactor.RecordTyp
2020
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
2121
import com.example.util.simpletimetracker.domain.recordType.model.RecordTypeGoal
2222
import com.example.util.simpletimetracker.domain.statistics.model.RangeLength
23+
import com.example.util.simpletimetracker.feature_statistics_detail.conts.TAG_VALUE_PRECISION
2324
import com.example.util.simpletimetracker.feature_statistics_detail.mapper.StatisticsDetailViewDataMapper
2425
import com.example.util.simpletimetracker.feature_statistics_detail.model.ChartBarDataDuration
2526
import com.example.util.simpletimetracker.feature_statistics_detail.model.ChartBarDataRange
@@ -33,6 +34,7 @@ import kotlinx.coroutines.withContext
3334
import java.util.Calendar
3435
import javax.inject.Inject
3536
import kotlin.math.abs
37+
import kotlin.math.roundToLong
3638

3739
class StatisticsDetailChartInteractor @Inject constructor(
3840
private val timeMapper: TimeMapper,
@@ -196,10 +198,17 @@ class StatisticsDetailChartInteractor @Inject constructor(
196198
}
197199
}
198200

199-
fun mapRangesToValue(list: List<Range>): Long {
201+
fun mapRangesToValue(list: List<RecordBase>, range: Range): Long {
200202
return when (chartMode) {
201-
ChartMode.DURATIONS -> rangeMapper.mapToDuration(list)
203+
ChartMode.DURATIONS -> list
204+
.map { record -> rangeMapper.clampToRange(record, range) }
205+
.let(rangeMapper::mapToDuration)
202206
ChartMode.COUNTS -> list.size.toLong()
207+
ChartMode.TAG_VALUE -> list
208+
.sumOf { record ->
209+
record.tags.sumOf { it.numericValue.orZero() * TAG_VALUE_PRECISION }
210+
}
211+
.roundToLong()
203212
}
204213
}
205214

@@ -219,17 +228,15 @@ class StatisticsDetailChartInteractor @Inject constructor(
219228
.map { data ->
220229
val range = Range(data.rangeStart, data.rangeEnd)
221230
val durations = if (!splitByActivity) {
222-
rangeMapper.getRecordsFromRange(records, range)
223-
.map { record -> rangeMapper.clampToRange(record, range) }
224-
.let(::mapRangesToValue)
225-
.let { listOf(it to 0) }
231+
val clampedRecords = rangeMapper.getRecordsFromRange(records, range)
232+
val value = mapRangesToValue(clampedRecords, range)
233+
listOf(value to 0)
226234
} else {
227235
rangeMapper.getRecordsFromRange(records, range)
228236
.groupBy { it.typeIds.firstOrNull().orZero() }
229237
.toList()
230238
.map { (id, records) ->
231-
val value = records.map { record -> rangeMapper.clampToRange(record, range) }
232-
.let(::mapRangesToValue)
239+
val value = mapRangesToValue(records, range)
233240
value to id
234241
}
235242
.run {

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.example.util.simpletimetracker.feature_statistics_detail.viewData.Sta
2424
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailPreviewViewData
2525
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailStatsViewData
2626
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailStreaksViewData
27+
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailTagValuesCompositeViewData
2728
import javax.inject.Inject
2829

2930
class StatisticsDetailContentInteractor @Inject constructor(
@@ -46,6 +47,7 @@ class StatisticsDetailContentInteractor @Inject constructor(
4647
nextActivitiesViewData: List<ViewHolderType>?,
4748
goalsViewData: StatisticsDetailGoalsCompositeViewData?,
4849
dataDistributionViewData: StatisticsDetailDataDistributionViewData?,
50+
tagValueViewData: StatisticsDetailTagValuesCompositeViewData?,
4951
): List<ViewHolderType> {
5052
val result = mutableListOf<ViewHolderType>()
5153

@@ -300,6 +302,14 @@ class StatisticsDetailContentInteractor @Inject constructor(
300302

301303
result += goalsViewData?.viewData.orEmpty()
302304

305+
result += tagValueViewData?.viewData.orEmpty().map {
306+
if (it is StatisticsDetailBarChartViewData) {
307+
it.copy(singleColor = getPreviewColor())
308+
} else {
309+
it
310+
}
311+
}
312+
303313
result += dataDistributionViewData?.splitData.orEmpty()
304314

305315
return result

0 commit comments

Comments
 (0)