Skip to content

Commit 0252588

Browse files
committed
fix multitasking calculation in detailed stats
1 parent 688beeb commit 0252588

File tree

6 files changed

+24
-35
lines changed

6 files changed

+24
-35
lines changed

core/src/main/java/com/example/util/simpletimetracker/core/interactor/RecordFilterInteractor.kt

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import com.example.util.simpletimetracker.domain.record.extension.hasMultitaskFi
1717
import com.example.util.simpletimetracker.domain.record.extension.hasNoComment
1818
import com.example.util.simpletimetracker.domain.record.extension.hasUntaggedItem
1919
import com.example.util.simpletimetracker.domain.record.extension.hasUntrackedFilter
20-
import com.example.util.simpletimetracker.domain.extension.orZero
2120
import com.example.util.simpletimetracker.domain.extension.toRange
2221
import com.example.util.simpletimetracker.domain.record.interactor.GetMultitaskRecordsInteractor
2322
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
@@ -139,6 +138,11 @@ class RecordFilterInteractor @Inject constructor(
139138
.map(RecordBase::toRange)
140139
getUntrackedRecordsInteractor.get(range, records)
141140
}
141+
hasMultitask -> {
142+
val range = definedRanges.firstOrNull() ?: Range(0, 0)
143+
val records = getAllRecords(range, runningRecords)
144+
getMultitaskRecordsInteractor.get(records)
145+
}
142146
typeIds.isNotEmpty() && definedRanges.isNotEmpty() -> {
143147
val result = mutableMapOf<Long, Record>()
144148
definedRanges
@@ -174,17 +178,12 @@ class RecordFilterInteractor @Inject constructor(
174178
}
175179
else -> interactor.getAll()
176180
}.let {
177-
// For untracked filter running records are added separately.
178-
if (hasUntracked) return@let it
179-
val multitaskRecords = if (hasMultitask) {
180-
// Need to calculate multitask on all records.
181-
val range = definedRanges.firstOrNull() ?: Range(0, 0)
182-
val records = getAllRecords(range, runningRecords)
183-
getMultitaskRecordsInteractor.get(records)
181+
// For these filter running records are added separately.
182+
if (filters.hasUntrackedFilter() || filters.hasMultitaskFilter()) {
183+
it
184184
} else {
185-
emptyList()
185+
it + runningRecords
186186
}
187-
it + multitaskRecords + runningRecords
188187
}
189188

190189
val duplicationIds: Map<Long, Boolean> = if (filters.hasDuplicationsFilter()) {
@@ -200,7 +199,7 @@ class RecordFilterInteractor @Inject constructor(
200199

201200
fun RecordBase.selectedByActivity(): Boolean {
202201
if (typeIds.isEmpty()) return true
203-
return this.typeIds.firstOrNull().orZero() in typeIds
202+
return this.typeIds.any { it in typeIds }
204203
}
205204

206205
fun RecordBase.filteredByActivity(): Boolean {

domain/src/main/java/com/example/util/simpletimetracker/domain/record/interactor/CalculateAdjacentActivitiesInteractor.kt

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import com.example.util.simpletimetracker.domain.record.model.Record
55
import com.example.util.simpletimetracker.domain.record.model.RecordBase
66
import javax.inject.Inject
77

8-
class CalculateAdjacentActivitiesInteractor @Inject constructor() {
8+
class CalculateAdjacentActivitiesInteractor @Inject constructor(
9+
private val getMultitaskRecordsInteractor: GetMultitaskRecordsInteractor,
10+
) {
911

1012
// TODO count multitask also
1113
// Doesn't count multitask activities.
@@ -47,34 +49,22 @@ class CalculateAdjacentActivitiesInteractor @Inject constructor() {
4749
}
4850
}
4951

50-
// TODO make more precise calculations?
5152
fun calculateMultitasking(
5253
typeId: Long,
5354
records: List<RecordBase>,
5455
maxCount: Int,
5556
): List<CalculationResult> {
5657
val counts = mutableMapOf<Long, Long>()
5758

58-
val recordsSorted = records.sortedBy { it.timeStarted }
59-
var currentRecord: RecordBase? = null
60-
recordsSorted.forEach { record ->
61-
val currentTimeStarted = currentRecord?.timeStarted
62-
val currentTimeEnded = currentRecord?.timeEnded
63-
if (currentTimeStarted != null &&
64-
currentTimeEnded != null &&
65-
// Find next records that was started after this one but before this one ends.
66-
currentTimeStarted <= record.timeStarted &&
67-
currentTimeEnded > record.timeStarted &&
68-
// Cutoff short intersections.
69-
currentTimeEnded - record.timeStarted > 1_000L
70-
) {
71-
record.typeIds.firstOrNull()?.let { id ->
59+
getMultitaskRecordsInteractor.get(records).forEach { record ->
60+
if (typeId !in record.typeIds) return@forEach
61+
if (record.duration <= SHORT_MULTITASK_CUTOFF_MS) return@forEach
62+
63+
record.typeIds.forEach { id ->
64+
if (id != typeId) {
7265
counts[id] = counts[id].orZero() + 1
7366
}
7467
}
75-
if (typeId in record.typeIds) {
76-
currentRecord = record
77-
}
7868
}
7969

8070
return counts.keys
@@ -87,4 +77,8 @@ class CalculateAdjacentActivitiesInteractor @Inject constructor() {
8777
val typeId: Long,
8878
val count: Long,
8979
)
80+
81+
companion object {
82+
private const val SHORT_MULTITASK_CUTOFF_MS = 1_000L
83+
}
9084
}

features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/multitaskRecord/MultitaskRecordAdapterDelegate.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.example.util.simpletimetracker.feature_base_adapter.multitaskRecord
22

33
import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate
4-
import com.example.util.simpletimetracker.feature_views.extension.setOnClickWith
54
import com.example.util.simpletimetracker.feature_base_adapter.databinding.ItemMultitaskRecordLayoutBinding as Binding
65
import com.example.util.simpletimetracker.feature_base_adapter.multitaskRecord.MultitaskRecordViewData as ViewData
76

features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/recordTypeSuggestion/RecordTypeSuggestionAdapterDelegate.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerBindi
55
import com.example.util.simpletimetracker.feature_base_adapter.RecyclerAdapterDelegate
66
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
77
import com.example.util.simpletimetracker.feature_base_adapter.recordType.createRecordTypeAdapterDelegate
8-
import com.example.util.simpletimetracker.feature_base_adapter.recordTypeSuggestion.RecordTypeSuggestionViewData
98
import com.example.util.simpletimetracker.feature_views.TransitionNames
109
import com.example.util.simpletimetracker.feature_views.extension.layoutInflater
1110
import com.example.util.simpletimetracker.feature_base_adapter.databinding.ItemRecordTypeLayoutBinding as BaseBinding
@@ -15,7 +14,7 @@ import com.example.util.simpletimetracker.feature_base_adapter.recordTypeSuggest
1514
// Wrapper around RecordType delegate.
1615
// Passes all calls to other delegate.
1716
fun createRecordTypeSuggestionAdapterDelegate(
18-
type: RecordTypeSuggestionViewData.Type,
17+
type: ViewData.Type,
1918
onItemClick: ((BaseViewData) -> Unit)? = null,
2019
onItemLongClick: ((BaseViewData, Pair<Any, String>) -> Unit)? = null,
2120
withTransition: Boolean = true,

features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/interactor/RecordsFilterExcludeInteractorImpl.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ class RecordsFilterExcludeInteractorImpl @Inject constructor(
3131
type: ExcludeType,
3232
currentFilters: List<RecordsFilter>,
3333
): List<RecordsFilter> {
34-
// TODO multitasking filter by Read doesn't work.
3534
// Shouldn't be possible
3635
if (id == UNTRACKED_ITEM_ID) return currentFilters
3736

features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/interactor/RecordsFilterViewDataInteractor.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,6 @@ class RecordsFilterViewDataInteractor @Inject constructor(
465465
it.copy(type = CategoryFilteredType)
466466
}
467467
}
468-
469468
} else {
470469
result += HintViewData(resourceRepo.getString(R.string.change_record_type_categories_empty))
471470
}

0 commit comments

Comments
 (0)