@@ -14,13 +14,16 @@ import com.example.util.simpletimetracker.domain.record.model.RecordsFilter
1414import com.example.util.simpletimetracker.feature_statistics_detail.mapper.StatisticsDetailViewDataMapper
1515import com.example.util.simpletimetracker.feature_statistics_detail.model.SplitChartGrouping
1616import com.example.util.simpletimetracker.feature_statistics_detail.viewData.StatisticsDetailChartViewData
17+ import kotlinx.coroutines.CoroutineScope
1718import java.util.Calendar
1819import java.util.concurrent.TimeUnit
1920import javax.inject.Inject
2021import kotlin.math.abs
2122import kotlin.math.ceil
2223import kotlin.math.floor
2324import kotlinx.coroutines.Dispatchers
25+ import kotlinx.coroutines.coroutineScope
26+ import kotlinx.coroutines.ensureActive
2427import kotlinx.coroutines.withContext
2528
2629class StatisticsDetailSplitChartInteractor @Inject constructor(
@@ -145,7 +148,7 @@ class StatisticsDetailSplitChartInteractor @Inject constructor(
145148 return @withContext mapper.mapToDurationsSlipChartViewData(data, isVisible)
146149 }
147150
148- private fun getDurations (
151+ private suspend fun getDurations (
149152 records : List <RecordBase >,
150153 range : Range ,
151154 splitChartGrouping : SplitChartGrouping ,
@@ -184,19 +187,19 @@ class StatisticsDetailSplitChartInteractor @Inject constructor(
184187 }
185188 }
186189
187- private fun processRecords (
190+ private suspend fun processRecords (
188191 calendar : Calendar ,
189192 records : List <Range >,
190193 splitChartGrouping : SplitChartGrouping ,
191194 startOfDayShift : Long ,
192- ): List <Range > {
195+ ): List <Range > = coroutineScope {
193196 val processedRecords: MutableList <Range > = mutableListOf ()
194197
195198 records.forEach { record ->
196199 splitIntoRecords(calendar, record, splitChartGrouping, startOfDayShift).forEach(processedRecords::add)
197200 }
198201
199- return processedRecords
202+ return @coroutineScope processedRecords
200203 }
201204
202205 private fun mapToGrouping (
@@ -224,13 +227,15 @@ class StatisticsDetailSplitChartInteractor @Inject constructor(
224227 /* *
225228 * If a record is on several days or hours - split into several records each within separate range.
226229 */
227- private tailrec fun splitIntoRecords (
230+ private tailrec fun CoroutineScope. splitIntoRecords (
228231 calendar : Calendar ,
229232 record : Range ,
230233 splitChartGrouping : SplitChartGrouping ,
231234 startOfDayShift : Long ,
232235 splitRecords : MutableList <Range > = mutableListOf(),
233236 ): List <Range > {
237+ ensureActive()
238+
234239 // Avoid infinite loop.
235240 if (record.duration < 0 ) return emptyList()
236241
0 commit comments