Skip to content

Commit d3f1d2c

Browse files
committed
shortcuts for settings model support
1 parent c96c822 commit d3f1d2c

File tree

27 files changed

+1426
-86
lines changed

27 files changed

+1426
-86
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,12 @@ class ActivityFilterViewDataInteractor @Inject constructor(
9999
return applyFilter(
100100
list = list,
101101
filter = filter,
102-
predicate = { data, typeIds -> data.typeId in typeIds },
102+
predicate = { data, typeIds ->
103+
when (val target = data.target) {
104+
is RecordShortcut.Target.Record -> target.typeId in typeIds
105+
is RecordShortcut.Target.Setting -> true
106+
}
107+
},
103108
)
104109
}
105110

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.example.util.simpletimetracker.core.interactor
2+
3+
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
4+
import com.example.util.simpletimetracker.domain.recordShortcut.model.RecordShortcut
5+
import javax.inject.Inject
6+
7+
class IsSettingShortcutEnabledInteractor @Inject constructor(
8+
private val prefsInteractor: PrefsInteractor,
9+
) {
10+
11+
suspend fun execute(
12+
shortcut: RecordShortcut.Target.Setting,
13+
): Boolean {
14+
return when (shortcut.action) {
15+
RecordShortcut.SettingAction.Multitasking -> {
16+
prefsInteractor.getAllowMultitasking()
17+
}
18+
RecordShortcut.SettingAction.RetroactiveMode -> {
19+
prefsInteractor.getRetroactiveTrackingMode()
20+
}
21+
}
22+
}
23+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.example.util.simpletimetracker.core.interactor
2+
3+
import com.example.util.simpletimetracker.domain.notifications.interactor.UpdateExternalViewsInteractor
4+
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
5+
import com.example.util.simpletimetracker.domain.record.interactor.RemoveRunningRecordMediator
6+
import com.example.util.simpletimetracker.domain.record.interactor.RunningRecordInteractor
7+
import com.example.util.simpletimetracker.domain.recordShortcut.model.RecordShortcut
8+
import javax.inject.Inject
9+
10+
class OnSettingsShortcutClickInteractor @Inject constructor(
11+
private val prefsInteractor: PrefsInteractor,
12+
private val runningRecordInteractor: RunningRecordInteractor,
13+
private val removeRunningRecordMediator: RemoveRunningRecordMediator,
14+
private val externalViewsInteractor: UpdateExternalViewsInteractor,
15+
) {
16+
17+
suspend fun execute(action: RecordShortcut.SettingAction) {
18+
when (action) {
19+
RecordShortcut.SettingAction.Multitasking -> {
20+
val newValue = !prefsInteractor.getAllowMultitasking()
21+
prefsInteractor.setAllowMultitasking(newValue)
22+
onAllowMultitaskingChange()
23+
}
24+
RecordShortcut.SettingAction.RetroactiveMode -> {
25+
val newValue = !prefsInteractor.getRetroactiveTrackingMode()
26+
prefsInteractor.setRetroactiveTrackingMode(newValue)
27+
onRetroactiveTrackingModeChange()
28+
}
29+
}
30+
}
31+
32+
suspend fun onAllowMultitaskingChange() {
33+
externalViewsInteractor.onAllowMultitaskingChange()
34+
}
35+
36+
suspend fun onRetroactiveTrackingModeChange() {
37+
runningRecordInteractor.getAll().forEach {
38+
removeRunningRecordMediator.removeWithRecordAdd(it)
39+
}
40+
// TODO do not update widgets if there was running records?
41+
externalViewsInteractor.onRetroactiveTrackingModeChange()
42+
}
43+
}

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

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.example.util.simpletimetracker.core.mapper.RecordShortcutViewDataMapp
44
import com.example.util.simpletimetracker.domain.extension.search
55
import com.example.util.simpletimetracker.domain.record.model.RunningRecord
66
import com.example.util.simpletimetracker.domain.recordShortcut.interactor.RecordShortcutInteractor
7+
import com.example.util.simpletimetracker.domain.recordShortcut.model.RecordShortcut
78
import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
89
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
910
import com.example.util.simpletimetracker.feature_base_adapter.recordShortcut.RecordShortcutViewData
@@ -12,6 +13,7 @@ import javax.inject.Inject
1213
class RecordsShortcutsViewDataInteractor @Inject constructor(
1314
private val recordShortcutInteractor: RecordShortcutInteractor,
1415
private val recordShortcutViewDataMapper: RecordShortcutViewDataMapper,
16+
private val isSettingShortcutEnabledInteractor: IsSettingShortcutEnabledInteractor,
1517
private val activityFilterViewDataInteractor: ActivityFilterViewDataInteractor,
1618
) {
1719

@@ -32,17 +34,29 @@ class RecordsShortcutsViewDataInteractor @Inject constructor(
3234
return shortcuts.let {
3335
activityFilterViewDataInteractor.applyFilterToShortcuts(it, filter)
3436
}.mapNotNull { shortcut ->
35-
val isRunning = runningRecordsProcessed.any { runningRecord ->
36-
runningRecord.id == shortcut.typeId &&
37-
runningRecord.comment == shortcut.comment &&
38-
runningRecord.tags == shortcut.tags.sortedBy { it.tagId }
37+
val isFiltered = when (val target = shortcut.target) {
38+
is RecordShortcut.Target.Record -> {
39+
runningRecordsProcessed.any { runningRecord ->
40+
runningRecord.id == target.typeId &&
41+
runningRecord.comment == target.comment &&
42+
runningRecord.tags == target.tags.sortedBy { it.tagId }
43+
}
44+
}
45+
is RecordShortcut.Target.Setting -> false
46+
}
47+
val isEnabled = when (val target = shortcut.target) {
48+
is RecordShortcut.Target.Record -> false
49+
is RecordShortcut.Target.Setting -> {
50+
isSettingShortcutEnabledInteractor.execute(target)
51+
}
3952
}
4053
recordShortcutViewDataMapper.map(
4154
shortcut = shortcut,
42-
recordType = recordTypesMap[shortcut.typeId] ?: return@mapNotNull null,
43-
recordTags = recordTags,
55+
typesMap = recordTypesMap,
56+
tags = recordTags,
4457
isDarkTheme = isDarkTheme,
45-
isFiltered = isRunning,
58+
isFiltered = isFiltered,
59+
isEnabled = isEnabled,
4660
)
4761
}.search(
4862
text = searchText,

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

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,58 @@
11
package com.example.util.simpletimetracker.core.mapper
22

3+
import com.example.util.simpletimetracker.core.R
4+
import com.example.util.simpletimetracker.core.repo.ResourceRepo
5+
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
36
import com.example.util.simpletimetracker.domain.record.model.RecordBase
47
import com.example.util.simpletimetracker.domain.recordShortcut.model.RecordShortcut
58
import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
69
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
710
import com.example.util.simpletimetracker.feature_base_adapter.category.CategoryViewData
811
import com.example.util.simpletimetracker.feature_base_adapter.recordShortcut.RecordShortcutViewData
12+
import com.example.util.simpletimetracker.feature_views.viewData.RecordTypeIcon
913
import javax.inject.Inject
1014

1115
class RecordShortcutViewDataMapper @Inject constructor(
16+
private val resourceRepo: ResourceRepo,
1217
private val iconMapper: IconMapper,
1318
private val colorMapper: ColorMapper,
1419
private val recordTagFullNameMapper: RecordTagFullNameMapper,
1520
) {
1621

1722
fun map(
1823
shortcut: RecordShortcut,
24+
typesMap: Map<Long, RecordType>,
25+
tags: List<RecordTag>,
26+
isDarkTheme: Boolean,
27+
isFiltered: Boolean,
28+
isEnabled: Boolean,
29+
): RecordShortcutViewData? {
30+
return when (val target = shortcut.target) {
31+
is RecordShortcut.Target.Record -> {
32+
mapRecord(
33+
id = shortcut.id,
34+
shortcut = target,
35+
recordType = typesMap[target.typeId] ?: return null,
36+
recordTags = tags,
37+
isDarkTheme = isDarkTheme,
38+
isFiltered = isFiltered,
39+
)
40+
}
41+
is RecordShortcut.Target.Setting -> {
42+
mapSetting(
43+
id = shortcut.id,
44+
shortcut = target,
45+
isDarkTheme = isDarkTheme,
46+
isFiltered = isFiltered,
47+
isEnabled = isEnabled,
48+
)
49+
}
50+
}
51+
}
52+
53+
private fun mapRecord(
54+
id: Long,
55+
shortcut: RecordShortcut.Target.Record,
1956
recordType: RecordType,
2057
recordTags: List<RecordTag>,
2158
isDarkTheme: Boolean,
@@ -55,7 +92,46 @@ class RecordShortcutViewDataMapper @Inject constructor(
5592
)
5693

5794
return RecordShortcutViewData(
58-
id = shortcut.id,
95+
id = id,
96+
hint = resourceRepo.getQuantityString(
97+
stringResId = R.plurals.statistics_detail_times_tracked,
98+
quantity = 1,
99+
),
100+
data = data,
101+
)
102+
}
103+
104+
private fun mapSetting(
105+
id: Long,
106+
shortcut: RecordShortcut.Target.Setting,
107+
isDarkTheme: Boolean,
108+
isFiltered: Boolean,
109+
isEnabled: Boolean,
110+
): RecordShortcutViewData {
111+
val icon: RecordTypeIcon? = null
112+
113+
val data = CategoryViewData.Record.Tagged(
114+
id = id,
115+
name = when (shortcut.action) {
116+
RecordShortcut.SettingAction.Multitasking -> R.string.settings_allow_multitasking
117+
RecordShortcut.SettingAction.RetroactiveMode -> R.string.settings_retroactive_tracking_mode
118+
}.let(resourceRepo::getString),
119+
iconColor = colorMapper.toIconColor(
120+
isDarkTheme = isDarkTheme,
121+
isFiltered = isFiltered,
122+
),
123+
color = when {
124+
isEnabled -> resourceRepo.getThemedAttr(R.attr.colorAccent, isDarkTheme)
125+
isFiltered -> colorMapper.toFilteredColor(isDarkTheme)
126+
else -> colorMapper.toInactiveColor(isDarkTheme)
127+
},
128+
icon = icon,
129+
iconAlpha = colorMapper.toIconAlpha(icon, isFiltered),
130+
)
131+
132+
return RecordShortcutViewData(
133+
id = id,
134+
hint = resourceRepo.getString(R.string.shortcut_navigation_settings),
59135
data = data,
60136
)
61137
}

core/src/main/java/com/example/util/simpletimetracker/core/utils/TestUtils.kt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -383,14 +383,16 @@ class TestUtils @Inject constructor(
383383
.map { it.id }
384384

385385
val data = RecordShortcut(
386-
typeId = type.id,
387-
comment = comment,
388-
tags = tagIds.map {
389-
RecordBase.Tag(
390-
tagId = it,
391-
numericValue = null,
392-
)
393-
},
386+
target = RecordShortcut.Target.Record(
387+
typeId = type.id,
388+
comment = comment,
389+
tags = tagIds.map {
390+
RecordBase.Tag(
391+
tagId = it,
392+
numericValue = null,
393+
)
394+
},
395+
),
394396
)
395397

396398
recordShortcutInteractor.add(data)

0 commit comments

Comments
 (0)