@@ -7,7 +7,7 @@ package com.example.util.simpletimetracker.features.tagsSelection.viewModel
77
88import androidx.lifecycle.ViewModel
99import androidx.lifecycle.viewModelScope
10- import com.example.util.simpletimetracker.core.ShouldCloseAfterOneTagInteractor
10+ import com.example.util.simpletimetracker.core.interactor.IsMultipleTagChoiceAvailableInteractor
1111import com.example.util.simpletimetracker.data.WearDataRepo
1212import com.example.util.simpletimetracker.domain.extension.orFalse
1313import com.example.util.simpletimetracker.domain.extension.removeIf
@@ -22,6 +22,7 @@ import com.example.util.simpletimetracker.features.tagsSelection.screen.TagListS
2222import com.example.util.simpletimetracker.features.tagsSelection.ui.TagsLoadingState
2323import dagger.hilt.android.lifecycle.HiltViewModel
2424import kotlinx.coroutines.channels.BufferOverflow
25+ import kotlinx.coroutines.delay
2526import kotlinx.coroutines.flow.MutableSharedFlow
2627import kotlinx.coroutines.flow.MutableStateFlow
2728import kotlinx.coroutines.flow.SharedFlow
@@ -37,7 +38,7 @@ class TagsViewModel @Inject constructor(
3738 private val startActivityMediator : StartActivityMediator ,
3839 private val tagsViewDataMapper : TagsViewDataMapper ,
3940 private val tagValueSelectedInteractor : TagValueSelectedInteractor ,
40- private val shouldCloseAfterOneTagInteractor : ShouldCloseAfterOneTagInteractor ,
41+ private val isMultipleTagChoiceAvailableInteractor : IsMultipleTagChoiceAvailableInteractor ,
4142 private val wearTagSelectionDataInteractor : WearTagSelectionDataInteractor ,
4243) : ViewModel() {
4344
@@ -56,6 +57,7 @@ class TagsViewModel @Inject constructor(
5657 private var selectedTags: List <WearRecordTag > = emptyList()
5758 private var settings: WearSettings ? = null
5859 private var isMultipleChoiceAvailable: Boolean = true
60+ private var requiredValueSelectionTagIds: List <Long > = emptyList()
5961
6062 // TODO switch to savedStateHandle
6163 fun init (activityId : Long ) {
@@ -125,14 +127,17 @@ class TagsViewModel @Inject constructor(
125127 if (settingsResult != null && tagsResult != null ) {
126128 settings = settingsResult
127129 tags = tagsResult
128- selectedTags = wearTagSelectionDataInteractor.data[activityId]?.preselectedTags.orEmpty()
129- val shouldCloseAfterOne = shouldCloseAfterOneTagInteractor.execute(
130+ val selectionResult = wearTagSelectionDataInteractor.data[activityId]
131+ selectedTags = selectionResult?.preselectedTags.orEmpty()
132+ requiredValueSelectionTagIds = selectionResult?.requiredTagValueSelectionTagIds.orEmpty()
133+ isMultipleChoiceAvailable = isMultipleTagChoiceAvailableInteractor.execute(
130134 typeId = activityId,
135+ hasPreselectedTags = selectedTags.isNotEmpty(),
131136 closeAfterOne = settings?.recordTagSelectionCloseAfterOne.orFalse(),
132137 excludedActivities = settings?.closeAfterOneTagExcludeActivities.orEmpty(),
133138 )
134- isMultipleChoiceAvailable = selectedTags.isNotEmpty() || ! shouldCloseAfterOne
135139 _state .value = mapState()
140+ startRequiredTagValueSelectionIfNeeded()
136141 } else {
137142 showError()
138143 }
@@ -156,7 +161,9 @@ class TagsViewModel @Inject constructor(
156161 ) = viewModelScope.launch {
157162 val tagId = result.tagId
158163 val value = result.value
159- selectedTags = selectedTags + WearRecordTag (tagId = tagId, numericValue = value)
164+ selectedTags = selectedTags.filter { it.tagId != tagId } +
165+ WearRecordTag (tagId = tagId, numericValue = value)
166+ startRequiredTagValueSelectionIfNeeded()
160167 onTagSelected(tagId)
161168 }
162169
@@ -165,6 +172,14 @@ class TagsViewModel @Inject constructor(
165172 ) {
166173 val activityId = this @TagsViewModel.activityId ? : return
167174
175+ val hasRequiredTagValueSelectionPending = requiredValueSelectionTagIds
176+ .any(::isRequiredTagValueSelectionMissingValue)
177+
178+ if (hasRequiredTagValueSelectionPending) {
179+ startRequiredTagValueSelectionIfNeeded()
180+ return
181+ }
182+
168183 _state .value = mapState(loadingState)
169184
170185 val result = startActivityMediator.start(
@@ -182,6 +197,19 @@ class TagsViewModel @Inject constructor(
182197 _state .value = tagsViewDataMapper.mapErrorState()
183198 }
184199
200+ private fun isRequiredTagValueSelectionMissingValue (tagId : Long ): Boolean {
201+ return selectedTags.any { it.tagId == tagId && it.numericValue == null }
202+ }
203+
204+ private suspend fun startRequiredTagValueSelectionIfNeeded (): Boolean {
205+ val nextRequiredTagId = requiredValueSelectionTagIds
206+ .firstOrNull { isRequiredTagValueSelectionMissingValue(it) }
207+ ? : return false
208+ delay(300 )
209+ openTagValueSelection(nextRequiredTagId)
210+ return true
211+ }
212+
185213 private fun mapState (
186214 loadingState : TagsLoadingState = TagsLoadingState .NotLoading ,
187215 ): TagListState {
@@ -213,4 +241,4 @@ class TagsViewModel @Inject constructor(
213241 data object OnComplete : Effect
214242 data class OnRequestTagValueSelection (val tagId : Long ) : Effect
215243 }
216- }
244+ }
0 commit comments