Skip to content

Commit 9cf2367

Browse files
committed
move stat detail data distribution to separate delegate
1 parent 72c35ca commit 9cf2367

File tree

8 files changed

+135
-47
lines changed

8 files changed

+135
-47
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.example.util.simpletimetracker.feature_statistics_detail.adapter.Stat
1818
import com.example.util.simpletimetracker.feature_statistics_detail.adapter.StatisticsDetailSeriesChartViewData
1919
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailChartCompositeViewData
2020
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailChartViewData
21+
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailDataDistributionViewData
2122
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailGoalsCompositeViewData
2223
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailPreviewCompositeViewData
2324
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailPreviewViewData
@@ -44,6 +45,7 @@ class StatisticsDetailContentInteractor @Inject constructor(
4445
comparisonDurationSplitChartViewData: StatisticsDetailChartViewData?,
4546
nextActivitiesViewData: List<ViewHolderType>?,
4647
goalsViewData: StatisticsDetailGoalsCompositeViewData?,
48+
dataDistributionViewData: StatisticsDetailDataDistributionViewData?,
4749
): List<ViewHolderType> {
4850
val result = mutableListOf<ViewHolderType>()
4951

@@ -298,9 +300,7 @@ class StatisticsDetailContentInteractor @Inject constructor(
298300

299301
result += goalsViewData?.viewData.orEmpty()
300302

301-
statsViewData?.let { viewData ->
302-
result += viewData.splitData
303-
}
303+
result += dataDistributionViewData?.splitData.orEmpty()
304304

305305
return result
306306
}

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

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.example.util.simpletimetracker.core.interactor.StatisticsChartViewDat
44
import com.example.util.simpletimetracker.core.interactor.StatisticsMediator
55
import com.example.util.simpletimetracker.core.mapper.ColorMapper
66
import com.example.util.simpletimetracker.core.mapper.StatisticsViewDataMapper
7+
import com.example.util.simpletimetracker.core.mapper.TimeMapper
78
import com.example.util.simpletimetracker.core.repo.ResourceRepo
89
import com.example.util.simpletimetracker.core.viewData.StatisticsDataHolder
910
import com.example.util.simpletimetracker.domain.base.UNCATEGORIZED_ITEM_ID
@@ -13,8 +14,12 @@ import com.example.util.simpletimetracker.domain.statistics.interactor.Statistic
1314
import com.example.util.simpletimetracker.domain.statistics.interactor.StatisticsTagInteractor
1415
import com.example.util.simpletimetracker.domain.statistics.model.ChartFilterType
1516
import com.example.util.simpletimetracker.domain.base.OneShotValue
17+
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
18+
import com.example.util.simpletimetracker.domain.record.mapper.RangeMapper
1619
import com.example.util.simpletimetracker.domain.record.model.RecordBase
20+
import com.example.util.simpletimetracker.domain.recordType.interactor.RecordTypeInteractor
1721
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
22+
import com.example.util.simpletimetracker.domain.statistics.model.RangeLength
1823
import com.example.util.simpletimetracker.domain.statistics.model.Statistics
1924
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
2025
import com.example.util.simpletimetracker.feature_base_adapter.statistics.StatisticsViewData
@@ -32,21 +37,69 @@ import com.example.util.simpletimetracker.feature_statistics_detail.model.DataDi
3237
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailChartViewData
3338
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailDataDistributionGraphViewData
3439
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailDataDistributionModeViewData
40+
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailDataDistributionViewData
41+
import kotlinx.coroutines.Dispatchers
42+
import kotlinx.coroutines.withContext
3543
import javax.inject.Inject
3644

3745
class StatisticsDetailDataDistributionInteractor @Inject constructor(
46+
private val colorMapper: ColorMapper,
47+
private val resourceRepo: ResourceRepo,
48+
private val prefsInteractor: PrefsInteractor,
49+
private val recordTypeInteractor: RecordTypeInteractor,
50+
private val timeMapper: TimeMapper,
51+
private val rangeMapper: RangeMapper,
3852
private val statisticsInteractor: StatisticsInteractor,
3953
private val statisticsTagInteractor: StatisticsTagInteractor,
4054
private val statisticsCategoryInteractor: StatisticsCategoryInteractor,
4155
private val statisticsMediator: StatisticsMediator,
4256
private val statisticsChartViewDataInteractor: StatisticsChartViewDataInteractor,
4357
private val statisticsDetailViewDataMapper: StatisticsDetailViewDataMapper,
4458
private val statisticsViewDataMapper: StatisticsViewDataMapper,
45-
private val colorMapper: ColorMapper,
46-
private val resourceRepo: ResourceRepo,
4759
) {
4860

49-
suspend fun mapDataDistribution(
61+
suspend fun getViewData(
62+
records: List<RecordBase>,
63+
rangeLength: RangeLength,
64+
rangePosition: Int,
65+
dataDistributionMode: DataDistributionMode,
66+
dataDistributionGraph: DataDistributionGraph,
67+
): StatisticsDetailDataDistributionViewData = withContext(Dispatchers.Default) {
68+
val isDarkTheme = prefsInteractor.getDarkMode()
69+
val firstDayOfWeek = prefsInteractor.getFirstDayOfWeek()
70+
val startOfDayShift = prefsInteractor.getStartOfDayShift()
71+
val useProportionalMinutes = prefsInteractor.getUseProportionalMinutes()
72+
val showSeconds = prefsInteractor.getShowSeconds()
73+
val types = recordTypeInteractor.getAll()
74+
75+
val typesMap = types.associateBy(RecordType::id)
76+
val range = timeMapper.getRangeStartAndEnd(
77+
rangeLength = rangeLength,
78+
shift = rangePosition,
79+
firstDayOfWeek = firstDayOfWeek,
80+
startOfDayShift = startOfDayShift,
81+
)
82+
val splitData = mapDataDistribution(
83+
mode = dataDistributionMode,
84+
graph = dataDistributionGraph,
85+
records = if (range.timeStarted == 0L && range.timeEnded == 0L) {
86+
records
87+
} else {
88+
rangeMapper.getRecordsFromRange(records, range)
89+
.map { rangeMapper.clampRecordToRange(it, range) }
90+
},
91+
typesMap = typesMap,
92+
isDarkTheme = isDarkTheme,
93+
useProportionalMinutes = useProportionalMinutes,
94+
showSeconds = showSeconds,
95+
)
96+
97+
return@withContext StatisticsDetailDataDistributionViewData(
98+
splitData = splitData,
99+
)
100+
}
101+
102+
private suspend fun mapDataDistribution(
50103
mode: DataDistributionMode,
51104
graph: DataDistributionGraph,
52105
records: List<RecordBase>,

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

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ class StatisticsDetailStatsInteractor @Inject constructor(
3737
showComparison: Boolean,
3838
rangeLength: RangeLength,
3939
rangePosition: Int,
40-
dataDistributionMode: DataDistributionMode,
41-
dataDistributionGraph: DataDistributionGraph,
4240
): StatisticsDetailStatsViewData = withContext(Dispatchers.Default) {
4341
val isDarkTheme = prefsInteractor.getDarkMode()
4442
val firstDayOfWeek = prefsInteractor.getFirstDayOfWeek()
@@ -70,8 +68,6 @@ class StatisticsDetailStatsInteractor @Inject constructor(
7068
},
7169
showComparison = showComparison,
7270
types = types,
73-
dataDistributionMode = dataDistributionMode,
74-
dataDistributionGraph = dataDistributionGraph,
7571
isDarkTheme = isDarkTheme,
7672
useMilitaryTime = useMilitaryTime,
7773
useProportionalMinutes = useProportionalMinutes,
@@ -98,17 +94,14 @@ class StatisticsDetailStatsInteractor @Inject constructor(
9894
compareFirstRecord = "",
9995
lastRecord = "",
10096
compareLastRecord = "",
101-
splitData = emptyList(),
10297
)
10398
}
10499

105-
private suspend fun mapStatsData(
100+
private fun mapStatsData(
106101
records: List<RecordBase>,
107102
compareRecords: List<RecordBase>,
108103
showComparison: Boolean,
109104
types: List<RecordType>,
110-
dataDistributionMode: DataDistributionMode,
111-
dataDistributionGraph: DataDistributionGraph,
112105
isDarkTheme: Boolean,
113106
useMilitaryTime: Boolean,
114107
useProportionalMinutes: Boolean,
@@ -135,15 +128,6 @@ class StatisticsDetailStatsInteractor @Inject constructor(
135128
R.color.colorInactive
136129
}.let(resourceRepo::getColor),
137130
)
138-
val splitData = dataDistributionInteractor.mapDataDistribution(
139-
mode = dataDistributionMode,
140-
graph = dataDistributionGraph,
141-
records = records,
142-
typesMap = typesMap,
143-
isDarkTheme = isDarkTheme,
144-
useProportionalMinutes = useProportionalMinutes,
145-
showSeconds = showSeconds,
146-
)
147131

148132
fun formatInterval(value: Long?): String {
149133
value ?: return emptyValue
@@ -233,7 +217,6 @@ class StatisticsDetailStatsInteractor @Inject constructor(
233217
compareLastRecord = compareRecordsSorted.lastOrNull()?.timeEnded
234218
.let(::formatDateTimeYear)
235219
.let(::processComparisonString),
236-
splitData = splitData,
237220
)
238221
}
239222

@@ -255,7 +238,6 @@ class StatisticsDetailStatsInteractor @Inject constructor(
255238
compareFirstRecord: String,
256239
lastRecord: String,
257240
compareLastRecord: String,
258-
splitData: List<ViewHolderType>,
259241
): StatisticsDetailStatsViewData {
260242
return StatisticsDetailStatsViewData(
261243
totalDuration = listOf(
@@ -318,7 +300,6 @@ class StatisticsDetailStatsInteractor @Inject constructor(
318300
description = resourceRepo.getString(R.string.statistics_detail_last_record),
319301
),
320302
),
321-
splitData = splitData,
322303
)
323304
}
324305
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.example.util.simpletimetracker.feature_statistics_detail.viewData
2+
3+
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
4+
5+
data class StatisticsDetailDataDistributionViewData(
6+
val splitData: List<ViewHolderType>,
7+
)
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
package com.example.util.simpletimetracker.feature_statistics_detail.viewData
22

3-
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
4-
53
data class StatisticsDetailStatsViewData(
64
val totalDuration: List<StatisticsDetailCardInternalViewData>,
75
val timesTracked: List<StatisticsDetailCardInternalViewData>,
86
val averageRecord: List<StatisticsDetailCardInternalViewData>,
97
val datesTracked: List<StatisticsDetailCardInternalViewData>,
10-
val splitData: List<ViewHolderType>,
118
)

features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/viewModel/StatisticsDetailViewModel.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import com.example.util.simpletimetracker.feature_statistics_detail.viewData.Sta
3030
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailPreviewCompositeViewData
3131
import com.example.util.simpletimetracker.feature_statistics_detail.viewModel.delegate.StatisticsDetailChartViewModelDelegate
3232
import com.example.util.simpletimetracker.feature_statistics_detail.viewModel.delegate.StatisticsDetailDailyCalendarViewModelDelegate
33+
import com.example.util.simpletimetracker.feature_statistics_detail.viewModel.delegate.StatisticsDetailDataDistributionViewModelDelegate
3334
import com.example.util.simpletimetracker.feature_statistics_detail.viewModel.delegate.StatisticsDetailDurationSplitViewModelDelegate
3435
import com.example.util.simpletimetracker.feature_statistics_detail.viewModel.delegate.StatisticsDetailFilterViewModelDelegate
3536
import com.example.util.simpletimetracker.feature_statistics_detail.viewModel.delegate.StatisticsDetailGoalsViewModelDelegate
@@ -66,6 +67,7 @@ class StatisticsDetailViewModel @Inject constructor(
6667
private val filterDelegate: StatisticsDetailFilterViewModelDelegate,
6768
private val dailyCalendarDelegate: StatisticsDetailDailyCalendarViewModelDelegate,
6869
private val goalsDelegate: StatisticsDetailGoalsViewModelDelegate,
70+
private val dataDistributionDelegate: StatisticsDetailDataDistributionViewModelDelegate,
6971
private val statisticsDetailOptionsListMapper: StatisticsDetailOptionsListMapper,
7072
) : BaseViewModel() {
7173

@@ -90,6 +92,7 @@ class StatisticsDetailViewModel @Inject constructor(
9092
filterDelegate,
9193
dailyCalendarDelegate,
9294
goalsDelegate,
95+
dataDistributionDelegate,
9396
)
9497

9598
init {
@@ -137,9 +140,9 @@ class StatisticsDetailViewModel @Inject constructor(
137140
StatisticsDetailBlock.SplitChartGrouping ->
138141
splitChartDelegate.onSplitChartGroupingClick(viewData)
139142
StatisticsDetailBlock.DataDistributionMode ->
140-
statsDelegate.onDataDistributionModeClick(viewData)
143+
dataDistributionDelegate.onDataDistributionModeClick(viewData)
141144
StatisticsDetailBlock.DataDistributionGraph ->
142-
statsDelegate.onDataDistributionGraphClick(viewData)
145+
dataDistributionDelegate.onDataDistributionGraphClick(viewData)
143146
else -> {
144147
// Do nothing
145148
}
@@ -265,6 +268,7 @@ class StatisticsDetailViewModel @Inject constructor(
265268
durationSplitDelegate.updateViewData()
266269
nextActivitiesDelegate.updateViewData()
267270
goalsDelegate.updateViewData()
271+
dataDistributionDelegate.updateViewData()
268272
}
269273

270274
private fun updateContent() {
@@ -291,6 +295,7 @@ class StatisticsDetailViewModel @Inject constructor(
291295
comparisonDurationSplitChartViewData = durationSplitDelegate.comparisonViewData.value,
292296
nextActivitiesViewData = nextActivitiesDelegate.viewData.value,
293297
goalsViewData = goalsDelegate.viewData.value,
298+
dataDistributionViewData = dataDistributionDelegate.viewData.value,
294299
)
295300
}
296301

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.example.util.simpletimetracker.feature_statistics_detail.viewModel.delegate
2+
3+
import androidx.lifecycle.LiveData
4+
import androidx.lifecycle.MutableLiveData
5+
import com.example.util.simpletimetracker.core.base.ViewModelDelegate
6+
import com.example.util.simpletimetracker.core.extension.set
7+
import com.example.util.simpletimetracker.core.view.buttonsRowView.ButtonsRowViewData
8+
import com.example.util.simpletimetracker.feature_statistics_detail.interactor.StatisticsDetailDataDistributionInteractor
9+
import com.example.util.simpletimetracker.feature_statistics_detail.model.DataDistributionMode
10+
import com.example.util.simpletimetracker.feature_statistics_detail.model.DataDistributionGraph
11+
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailDataDistributionModeViewData
12+
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailDataDistributionGraphViewData
13+
import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailDataDistributionViewData
14+
import kotlinx.coroutines.launch
15+
import javax.inject.Inject
16+
17+
class StatisticsDetailDataDistributionViewModelDelegate @Inject constructor(
18+
private val dataDistributionInteractor: StatisticsDetailDataDistributionInteractor,
19+
) : StatisticsDetailViewModelDelegate, ViewModelDelegate() {
20+
21+
val viewData: LiveData<StatisticsDetailDataDistributionViewData?> by lazy {
22+
MutableLiveData()
23+
}
24+
25+
private var parent: StatisticsDetailViewModelDelegate.Parent? = null
26+
private var dataDistributionMode = DataDistributionMode.ACTIVITY
27+
private var dataDistributionGraph = DataDistributionGraph.PIE_CHART
28+
29+
override fun attach(parent: StatisticsDetailViewModelDelegate.Parent) {
30+
this.parent = parent
31+
}
32+
33+
fun onDataDistributionModeClick(viewData: ButtonsRowViewData) {
34+
if (viewData !is StatisticsDetailDataDistributionModeViewData) return
35+
this.dataDistributionMode = viewData.mode
36+
updateViewData()
37+
}
38+
39+
fun onDataDistributionGraphClick(viewData: ButtonsRowViewData) {
40+
if (viewData !is StatisticsDetailDataDistributionGraphViewData) return
41+
this.dataDistributionGraph = viewData.graph
42+
updateViewData()
43+
}
44+
45+
fun updateViewData() = delegateScope.launch {
46+
viewData.set(loadViewData())
47+
parent?.updateContent()
48+
}
49+
50+
private suspend fun loadViewData(): StatisticsDetailDataDistributionViewData? {
51+
val parent = parent ?: return null
52+
53+
return dataDistributionInteractor.getViewData(
54+
records = parent.records,
55+
rangeLength = parent.rangeLength,
56+
rangePosition = parent.rangePosition,
57+
dataDistributionMode = dataDistributionMode,
58+
dataDistributionGraph = dataDistributionGraph,
59+
)
60+
}
61+
}

features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/viewModel/delegate/StatisticsDetailStatsViewModelDelegate.kt

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,11 @@ class StatisticsDetailStatsViewModelDelegate @Inject constructor(
2323
}
2424

2525
private var parent: StatisticsDetailViewModelDelegate.Parent? = null
26-
private var dataDistributionMode = DataDistributionMode.ACTIVITY
27-
private var dataDistributionGraph = DataDistributionGraph.PIE_CHART
2826

2927
override fun attach(parent: StatisticsDetailViewModelDelegate.Parent) {
3028
this.parent = parent
3129
}
3230

33-
fun onDataDistributionModeClick(viewData: ButtonsRowViewData) {
34-
if (viewData !is StatisticsDetailDataDistributionModeViewData) return
35-
this.dataDistributionMode = viewData.mode
36-
updateViewData()
37-
}
38-
39-
fun onDataDistributionGraphClick(viewData: ButtonsRowViewData) {
40-
if (viewData !is StatisticsDetailDataDistributionGraphViewData) return
41-
this.dataDistributionGraph = viewData.graph
42-
updateViewData()
43-
}
44-
4531
fun updateViewData() = delegateScope.launch {
4632
viewData.set(loadViewData())
4733
parent?.updateContent()
@@ -60,8 +46,6 @@ class StatisticsDetailStatsViewModelDelegate @Inject constructor(
6046
showComparison = parent.comparisonFilter.isNotEmpty(),
6147
rangeLength = parent.rangeLength,
6248
rangePosition = parent.rangePosition,
63-
dataDistributionMode = dataDistributionMode,
64-
dataDistributionGraph = dataDistributionGraph,
6549
)
6650
}
6751
}

0 commit comments

Comments
 (0)