@@ -2,6 +2,7 @@ package com.example.util.simpletimetracker.feature_statistics_detail.mapper
22
33import android.annotation.SuppressLint
44import android.graphics.Color
5+ import com.example.util.simpletimetracker.core.extension.removeTrailingZeroes
56import com.example.util.simpletimetracker.core.mapper.CategoryViewDataMapper
67import com.example.util.simpletimetracker.core.mapper.ColorMapper
78import com.example.util.simpletimetracker.core.mapper.IconMapper
@@ -481,23 +482,33 @@ class StatisticsDetailViewDataMapper @Inject constructor(
481482 // No reason to show average of one value.
482483 if (data.size < 2 && compareData.size < 2 ) return " " to emptyList()
483484
484- // TODO TAG show decimal values?
485- fun getAverage (data : List <ChartBarDataDuration >): Long {
486- if (data.isEmpty()) return 0L
487- return data.sumOf { it.durations.sumOf { it.first } } / data.size
485+ // TODO TAG show decimal on selected bar
486+ fun getAverage (data : List <ChartBarDataDuration >): Float {
487+ if (data.isEmpty()) return 0f
488+ val sum = data.sumOf { point -> point.durations.sumOf { it.first } }.toFloat()
489+ return sum / data.size
488490 }
489491
490- fun formatInterval (
491- interval : Long ,
492- ): String {
492+ @SuppressLint(" DefaultLocale" )
493+ fun formatDecimalValue (value : Float ): String {
494+ val abs = abs(value)
495+ return when {
496+ abs >= 1000f -> value.toLong().toString()
497+ abs >= 100f -> String .format(" %.1f" , abs)
498+ abs >= 10f -> String .format(" %.2f" , abs)
499+ else -> String .format(" %.3f" , abs)
500+ }.toString().removeTrailingZeroes()
501+ }
502+
503+ fun formatInterval (interval : Float ): String {
493504 return when (chartMode) {
494505 ChartMode .DURATIONS -> timeMapper.formatInterval(
495- interval = interval,
506+ interval = interval.toLong() ,
496507 forceSeconds = showSeconds,
497508 useProportionalMinutes = useProportionalMinutes,
498509 )
499- ChartMode .COUNTS -> interval.toString( )
500- ChartMode .TAG_VALUE -> (interval / TAG_VALUE_PRECISION ).toString( )
510+ ChartMode .COUNTS -> formatDecimalValue(interval )
511+ ChartMode .TAG_VALUE -> formatDecimalValue (interval / TAG_VALUE_PRECISION )
501512 }
502513 }
503514
@@ -580,8 +591,8 @@ class StatisticsDetailViewDataMapper @Inject constructor(
580591 }
581592
582593 private fun mapValueChange (
583- average : Long ,
584- prevAverage : Long ,
594+ average : Float ,
595+ prevAverage : Float ,
585596 rangeLength : RangeLength ,
586597 isDarkTheme : Boolean ,
587598 ): StatisticsDetailCardInternalViewData .ValueChange {
@@ -590,15 +601,14 @@ class StatisticsDetailViewDataMapper @Inject constructor(
590601 }
591602
592603 val change: Float = when {
593- prevAverage.orZero() == 0L && average.orZero() == 0L -> 0f
594- prevAverage.orZero() == 0L && average.orZero() > 0L -> 100f
595- prevAverage.orZero() == 0L && average.orZero() < 0L -> - 100f
596- prevAverage != 0L -> {
597- (average.orZero() - prevAverage) * 100f / abs(prevAverage)
598- }
604+ prevAverage.orZero() == 0f && average.orZero() == 0f -> 0f
605+ prevAverage.orZero() == 0f && average.orZero() > 0f -> 100f
606+ prevAverage.orZero() == 0f && average.orZero() < 0f -> - 100f
607+ prevAverage != 0f -> (average.orZero() - prevAverage) * 100f / abs(prevAverage)
599608 else -> 0f
600609 }
601610
611+ // Lowest precision is one decimal.
602612 @SuppressLint(" DefaultLocale" )
603613 fun formatChange (value : Float ): String {
604614 val abs = abs(value)
@@ -641,7 +651,7 @@ class StatisticsDetailViewDataMapper @Inject constructor(
641651 return when (chartMode) {
642652 ChartMode .DURATIONS -> formatInterval(interval, isMinutes)
643653 ChartMode .COUNTS -> interval.toFloat()
644- ChartMode .TAG_VALUE -> ( interval / TAG_VALUE_PRECISION ) .toFloat()
654+ ChartMode .TAG_VALUE -> interval.toFloat() / TAG_VALUE_PRECISION
645655 }
646656 }
647657
0 commit comments