Skip to content

Commit 9bf35b4

Browse files
committed
add preselected tags support to wear
1 parent 49f23d2 commit 9bf35b4

File tree

11 files changed

+54
-34
lines changed

11 files changed

+54
-34
lines changed

buildSrc/src/main/kotlin/com/example/util/simpletimetracker/Base.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@ object Base {
1717
const val targetSDKWear = 34
1818

1919
// Raise after wear api changes.
20-
const val wearApiVersion = 2
20+
const val wearApiVersion = 3
2121
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.example.util.simpletimetracker.core.interactor
2+
3+
import com.example.util.simpletimetracker.domain.base.CurrentTimestampProvider
4+
import com.example.util.simpletimetracker.domain.base.suspendLazy
5+
import com.example.util.simpletimetracker.domain.record.interactor.AddRunningRecordMediator
6+
import com.example.util.simpletimetracker.domain.recordTag.interactor.RecordTypeToDefaultTagInteractor
7+
import kotlinx.coroutines.coroutineScope
8+
import javax.inject.Inject
9+
10+
class LoadPreselectedTagsInteractor @Inject constructor(
11+
private val addRunningRecordMediator: AddRunningRecordMediator,
12+
private val recordTypeToDefaultTagInteractor: RecordTypeToDefaultTagInteractor,
13+
private val currentTimestampProvider: CurrentTimestampProvider,
14+
) {
15+
16+
suspend fun execute(typeId: Long) = coroutineScope {
17+
val defaultTags = recordTypeToDefaultTagInteractor.getTags(typeId)
18+
val timeStarted = currentTimestampProvider.get()
19+
val ruleTags = addRunningRecordMediator.processRules(
20+
typeId = typeId,
21+
timeStarted = timeStarted,
22+
prevRecords = suspendLazy { emptyList() },
23+
).tagsIds
24+
defaultTags + ruleTags
25+
}
26+
}

domain/src/main/java/com/example/util/simpletimetracker/domain/base/LazySuspend.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import kotlinx.coroutines.CoroutineStart
55
import kotlinx.coroutines.async
66

77
fun <T> CoroutineScope.suspendLazy(
8-
initializer: suspend CoroutineScope.() -> T
8+
initializer: suspend CoroutineScope.() -> T,
99
) = object : SuspendLazy<T> {
1010
private val deferred = async(start = CoroutineStart.LAZY, block = initializer)
1111
override suspend operator fun invoke(): T = deferred.await()

features/feature_tag_selection/src/main/java/com/example/util/simpletimetracker/feature_tag_selection/viewModel/RecordTagSelectionViewModel.kt

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,15 @@ import androidx.lifecycle.viewModelScope
66
import com.example.util.simpletimetracker.core.ShouldCloseAfterOneTagInteractor
77
import com.example.util.simpletimetracker.core.base.BaseViewModel
88
import com.example.util.simpletimetracker.core.extension.set
9+
import com.example.util.simpletimetracker.core.interactor.LoadPreselectedTagsInteractor
910
import com.example.util.simpletimetracker.core.interactor.RecordCommentSearchViewDataInteractor
1011
import com.example.util.simpletimetracker.core.viewData.CommentFilterTypeViewData
11-
import com.example.util.simpletimetracker.domain.base.CurrentTimestampProvider
12-
import com.example.util.simpletimetracker.domain.base.suspendLazy
1312
import com.example.util.simpletimetracker.domain.extension.addOrRemove
1413
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
1514
import com.example.util.simpletimetracker.domain.record.interactor.AddRunningRecordMediator
1615
import com.example.util.simpletimetracker.domain.record.model.RecordBase
1716
import com.example.util.simpletimetracker.domain.recordTag.interactor.AddTagToTypeIfNotExistMediator
1817
import com.example.util.simpletimetracker.domain.recordTag.interactor.NeedTagValueSelectionInteractor
19-
import com.example.util.simpletimetracker.domain.recordTag.interactor.RecordTypeToDefaultTagInteractor
2018
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
2119
import com.example.util.simpletimetracker.feature_base_adapter.category.CategoryViewData
2220
import com.example.util.simpletimetracker.feature_base_adapter.loader.LoaderViewData
@@ -28,7 +26,6 @@ import com.example.util.simpletimetracker.navigation.params.screen.RecordTagSele
2826
import com.example.util.simpletimetracker.navigation.params.screen.RecordTagValueSelectionParams
2927
import dagger.hilt.android.lifecycle.HiltViewModel
3028
import kotlinx.coroutines.Job
31-
import kotlinx.coroutines.coroutineScope
3229
import kotlinx.coroutines.launch
3330
import javax.inject.Inject
3431

@@ -40,9 +37,8 @@ class RecordTagSelectionViewModel @Inject constructor(
4037
private val prefsInteractor: PrefsInteractor,
4138
private val addTagToTypeIfNotExistMediator: AddTagToTypeIfNotExistMediator,
4239
private val needTagValueSelectionInteractor: NeedTagValueSelectionInteractor,
43-
private val recordTypeToDefaultTagInteractor: RecordTypeToDefaultTagInteractor,
4440
private val shouldCloseAfterOneTagInteractor: ShouldCloseAfterOneTagInteractor,
45-
private val currentTimestampProvider: CurrentTimestampProvider,
41+
private val loadPreselectedTagsInteractor: LoadPreselectedTagsInteractor,
4642
private val recordCommentSearchViewDataInteractor: RecordCommentSearchViewDataInteractor,
4743
) : BaseViewModel() {
4844

@@ -63,7 +59,7 @@ class RecordTagSelectionViewModel @Inject constructor(
6359

6460
private var newComment: String = ""
6561
private var newTags: List<RecordBase.Tag> = emptyList()
66-
private var initialSelectedTagsLoaded: Boolean = false
62+
private var initialDataLoaded: Boolean = false
6763
private var searchLoadJob: Job? = null
6864
private var isMultipleChoiceAvailable: Boolean = true
6965

@@ -162,24 +158,13 @@ class RecordTagSelectionViewModel @Inject constructor(
162158
saveClicked.set(Unit)
163159
}
164160

165-
private suspend fun loadPreselectedTagIds(): Set<Long> = coroutineScope {
166-
// TODO TAG check retroactive mode?
167-
// TODO TAG ability to deselect preselected tags
168-
// TODO TAG multiple choice from notification
169-
// TODO TAG show preselected on wear and notification
170-
val defaultTags = recordTypeToDefaultTagInteractor.getTags(extra.typeId)
171-
val timeStarted = currentTimestampProvider.get()
172-
val ruleTags = addRunningRecordMediator.processRules(
173-
typeId = extra.typeId,
174-
timeStarted = timeStarted,
175-
prevRecords = suspendLazy { emptyList() },
176-
).tagsIds
177-
defaultTags + ruleTags
178-
}
179-
180-
private suspend fun initializePreselectedTags() {
181-
if (initialSelectedTagsLoaded) return
182-
val initialIds = loadPreselectedTagIds()
161+
// TODO TAG add check retroactive mode to loaded preselected tags?
162+
// TODO TAG ability to deselect preselected tags
163+
// TODO TAG multiple choice from notification
164+
// TODO TAG show preselected on notification
165+
private suspend fun initializeData() {
166+
if (initialDataLoaded) return
167+
val initialIds = loadPreselectedTagsInteractor.execute(extra.typeId)
183168
if (initialIds.isNotEmpty()) {
184169
newTags = initialIds.map { RecordBase.Tag(tagId = it, numericValue = null) }
185170
}
@@ -191,7 +176,7 @@ class RecordTagSelectionViewModel @Inject constructor(
191176
// If there are preselected tags - ignore setting.
192177
isMultipleChoiceAvailable = newTags.isNotEmpty() || !shouldCloseAfterOne
193178
updateButtonVisibility()
194-
initialSelectedTagsLoaded = true
179+
initialDataLoaded = true
195180
}
196181

197182
private fun updateButtonVisibility() {
@@ -222,7 +207,7 @@ class RecordTagSelectionViewModel @Inject constructor(
222207
private suspend fun loadViewData(
223208
fromCommentChange: Boolean,
224209
): List<ViewHolderType> {
225-
initializePreselectedTags()
210+
initializeData()
226211

227212
return viewDataInteractor.getViewData(
228213
extra = extra,

features/feature_wear/src/main/java/com/example/util/simpletimetracker/feature_wear/WearDataLocalMapper.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class WearDataLocalMapper @Inject constructor(
7171
fun map(
7272
recordTag: RecordTag,
7373
types: Map<Long, RecordType>,
74+
preselectedTagIds: Set<Long>,
7475
): WearTagDTO {
7576
return WearTagDTO(
7677
id = recordTag.id,
@@ -79,6 +80,7 @@ class WearDataLocalMapper @Inject constructor(
7980
tag = recordTag,
8081
types = types,
8182
).let(::mapColor),
83+
preselected = recordTag.id in preselectedTagIds,
8284
)
8385
}
8486

features/feature_wear/src/main/java/com/example/util/simpletimetracker/feature_wear/WearDataRepo.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package com.example.util.simpletimetracker.feature_wear
77

8+
import com.example.util.simpletimetracker.core.interactor.LoadPreselectedTagsInteractor
89
import com.example.util.simpletimetracker.core.interactor.RecordRepeatInteractor
910
import com.example.util.simpletimetracker.core.interactor.StatisticsMediator
1011
import com.example.util.simpletimetracker.core.mapper.TimeMapper
@@ -63,6 +64,7 @@ class WearDataRepo @Inject constructor(
6364
private val addRunningRecordMediator: Lazy<AddRunningRecordMediator>,
6465
private val recordRepeatInteractor: Lazy<RecordRepeatInteractor>,
6566
private val updateExternalViewsInteractor: Lazy<UpdateExternalViewsInteractor>,
67+
private val loadPreselectedTagsInteractor: Lazy<LoadPreselectedTagsInteractor>,
6668
private val router: Router,
6769
private val timeMapper: TimeMapper,
6870
private val widgetInteractor: WidgetInteractor,
@@ -187,12 +189,14 @@ class WearDataRepo @Inject constructor(
187189

188190
override suspend fun queryTagsForActivity(activityId: Long): List<WearTagDTO> {
189191
val types = recordTypeInteractor.getAll().associateBy { it.id }
192+
val preselectedTagIds = loadPreselectedTagsInteractor.get().execute(activityId)
190193
return getSelectableTagsInteractor.execute(activityId)
191194
.filterNot { it.archived }
192195
.map {
193196
wearDataLocalMapper.map(
194197
recordTag = it,
195198
types = types,
199+
preselectedTagIds = preselectedTagIds,
196200
)
197201
}
198202
}

wear/src/main/java/com/example/util/simpletimetracker/data/WearDataLocalMapper.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class WearDataLocalMapper @Inject constructor() {
8282
id = dto.id,
8383
name = dto.name,
8484
color = dto.color,
85+
preselected = dto.preselected,
8586
)
8687
}
8788

wear/src/main/java/com/example/util/simpletimetracker/domain/model/WearTag.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ data class WearTag(
99
val id: Long,
1010
val name: String,
1111
val color: Long,
12+
val preselected: Boolean,
1213
)

wear/src/main/java/com/example/util/simpletimetracker/features/tagsSelection/mapper/TagsViewDataMapper.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ import com.example.util.simpletimetracker.R
1111
import com.example.util.simpletimetracker.core.ErrorStateMapper
1212
import com.example.util.simpletimetracker.core.mapper.RecordTagValueMapper
1313
import com.example.util.simpletimetracker.data.WearResourceRepo
14-
import com.example.util.simpletimetracker.domain.extension.orFalse
15-
import com.example.util.simpletimetracker.domain.model.WearSettings
1614
import com.example.util.simpletimetracker.domain.model.WearTag
1715
import com.example.util.simpletimetracker.domain.model.WearRecordTag
1816
import com.example.util.simpletimetracker.features.tagsSelection.screen.TagListState
@@ -46,7 +44,7 @@ class TagsViewDataMapper @Inject constructor(
4644
tags = tags,
4745
selectedTags = selectedTags,
4846
loadingState = loadingState,
49-
multipleChoiceAvailable = multipleChoiceAvailable
47+
multipleChoiceAvailable = multipleChoiceAvailable,
5048
)
5149
}
5250

wear/src/main/java/com/example/util/simpletimetracker/features/tagsSelection/viewModel/TagsViewModel.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,13 @@ class TagsViewModel @Inject constructor(
123123
if (settingsResult != null && tagsResult != null) {
124124
settings = settingsResult
125125
tags = tagsResult
126+
selectedTags = tags.filter { it.preselected }.map { WearRecordTag(it.id, null) }
126127
val shouldCloseAfterOne = shouldCloseAfterOneTagInteractor.execute(
127128
typeId = activityId,
128129
closeAfterOne = settings?.recordTagSelectionCloseAfterOne.orFalse(),
129130
excludedActivities = settings?.closeAfterOneTagExcludeActivities.orEmpty(),
130131
)
131-
isMultipleChoiceAvailable = !shouldCloseAfterOne
132+
isMultipleChoiceAvailable = selectedTags.isNotEmpty() || !shouldCloseAfterOne
132133
_state.value = mapState()
133134
} else {
134135
showError()
@@ -186,7 +187,7 @@ class TagsViewModel @Inject constructor(
186187
tags = tags,
187188
selectedTags = selectedTags,
188189
loadingState = loadingState,
189-
multipleChoiceAvailable = isMultipleChoiceAvailable
190+
multipleChoiceAvailable = isMultipleChoiceAvailable,
190191
)
191192
}
192193

0 commit comments

Comments
 (0)