Skip to content

Commit 4753636

Browse files
committed
tag value on start in wear
1 parent 50e8b70 commit 4753636

File tree

5 files changed

+67
-27
lines changed

5 files changed

+67
-27
lines changed
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 javax.inject.Inject
4+
5+
class IsMultipleTagChoiceAvailableInteractor @Inject constructor(
6+
private val shouldCloseAfterOneTagInteractor: ShouldCloseAfterOneTagInteractor,
7+
) {
8+
9+
fun execute(
10+
typeId: Long,
11+
hasPreselectedTags: Boolean,
12+
closeAfterOne: Boolean,
13+
excludedActivities: Set<Long>,
14+
): Boolean {
15+
val shouldCloseAfterOne = shouldCloseAfterOneTagInteractor.execute(
16+
typeId = typeId,
17+
closeAfterOne = closeAfterOne,
18+
excludedActivities = excludedActivities,
19+
)
20+
// If there are preselected tags - ignore setting.
21+
return hasPreselectedTags || !shouldCloseAfterOne
22+
}
23+
}

core/common/src/main/java/com/example/util/simpletimetracker/core/ShouldCloseAfterOneTagInteractor.kt renamed to core/common/src/main/java/com/example/util/simpletimetracker/core/interactor/ShouldCloseAfterOneTagInteractor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.example.util.simpletimetracker.core
1+
package com.example.util.simpletimetracker.core.interactor
22

33
import javax.inject.Inject
44

features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/interactor/ActivityStartStopFromBroadcastInteractor.kt

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.example.util.simpletimetracker.feature_notification.recordType.interactor
22

3-
import com.example.util.simpletimetracker.core.ShouldCloseAfterOneTagInteractor
43
import com.example.util.simpletimetracker.core.interactor.CompleteTypesStateInteractor
4+
import com.example.util.simpletimetracker.core.interactor.IsMultipleTagChoiceAvailableInteractor
55
import com.example.util.simpletimetracker.core.interactor.RecordRepeatInteractor
66
import com.example.util.simpletimetracker.domain.base.REPEAT_BUTTON_ITEM_ID
77
import com.example.util.simpletimetracker.domain.extension.orZero
@@ -33,7 +33,7 @@ class ActivityStartStopFromBroadcastInteractor @Inject constructor(
3333
private val completeTypesStateInteractor: CompleteTypesStateInteractor,
3434
private val needTagValueSelectionInteractor: NeedTagValueSelectionInteractor,
3535
private val prefsInteractor: PrefsInteractor,
36-
private val shouldCloseAfterOneTagInteractor: ShouldCloseAfterOneTagInteractor,
36+
private val isMultipleTagChoiceAvailableInteractor: IsMultipleTagChoiceAvailableInteractor,
3737
) {
3838

3939
suspend fun onActionActivityStop(
@@ -288,13 +288,6 @@ class ActivityStartStopFromBroadcastInteractor @Inject constructor(
288288
)
289289
}
290290

291-
private suspend fun cancelRequiredValueSelection(
292-
from: NotificationControlsManager.From,
293-
typesShift: Int,
294-
) {
295-
update(from, typesShift)
296-
}
297-
298291
private suspend fun update(
299292
from: NotificationControlsManager.From,
300293
typesShift: Int,
@@ -366,11 +359,11 @@ class ActivityStartStopFromBroadcastInteractor @Inject constructor(
366359
selectedTypeId: Long,
367360
selectedTags: List<RecordBase.Tag> = emptyList(),
368361
): Boolean {
369-
val shouldCloseAfterOne = shouldCloseAfterOneTagInteractor.execute(
362+
return isMultipleTagChoiceAvailableInteractor.execute(
370363
typeId = selectedTypeId,
364+
hasPreselectedTags = selectedTags.isNotEmpty(),
371365
closeAfterOne = prefsInteractor.getRecordTagSelectionCloseAfterOne(),
372366
excludedActivities = prefsInteractor.getCloseAfterOneTagExcludeActivities().toSet(),
373367
)
374-
return selectedTags.isNotEmpty() || !shouldCloseAfterOne
375368
}
376369
}

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ package com.example.util.simpletimetracker.feature_tag_selection.viewModel
33
import androidx.lifecycle.LiveData
44
import androidx.lifecycle.MutableLiveData
55
import androidx.lifecycle.viewModelScope
6-
import com.example.util.simpletimetracker.core.ShouldCloseAfterOneTagInteractor
76
import com.example.util.simpletimetracker.core.base.BaseViewModel
87
import com.example.util.simpletimetracker.core.extension.set
98
import com.example.util.simpletimetracker.core.extension.toModel
9+
import com.example.util.simpletimetracker.core.interactor.IsMultipleTagChoiceAvailableInteractor
1010
import com.example.util.simpletimetracker.core.interactor.RecordCommentSearchViewDataInteractor
1111
import com.example.util.simpletimetracker.core.viewData.CommentFilterTypeViewData
1212
import com.example.util.simpletimetracker.domain.extension.addOrRemove
@@ -41,7 +41,7 @@ class RecordTagSelectionViewModel @Inject constructor(
4141
private val recordTagInteractor: RecordTagInteractor,
4242
private val addTagToTypeIfNotExistMediator: AddTagToTypeIfNotExistMediator,
4343
private val needTagValueSelectionInteractor: NeedTagValueSelectionInteractor,
44-
private val shouldCloseAfterOneTagInteractor: ShouldCloseAfterOneTagInteractor,
44+
private val isMultipleTagChoiceAvailableInteractor: IsMultipleTagChoiceAvailableInteractor,
4545
private val recordCommentSearchViewDataInteractor: RecordCommentSearchViewDataInteractor,
4646
) : BaseViewModel() {
4747

@@ -172,15 +172,12 @@ class RecordTagSelectionViewModel @Inject constructor(
172172
private suspend fun initializeData() {
173173
if (initialDataLoaded) return
174174
newTags = extra.preselectedTags.map(RecordTagParam::toModel)
175-
val shouldCloseAfterOne = shouldCloseAfterOneTagInteractor.execute(
175+
isMultipleChoiceAvailable = isMultipleTagChoiceAvailableInteractor.execute(
176176
typeId = extra.typeId,
177+
hasPreselectedTags = newTags.isNotEmpty(),
177178
closeAfterOne = prefsInteractor.getRecordTagSelectionCloseAfterOne(),
178179
excludedActivities = prefsInteractor.getCloseAfterOneTagExcludeActivities().toSet(),
179180
)
180-
// If there are preselected tags - ignore setting.
181-
isMultipleChoiceAvailable = newTags.isNotEmpty() ||
182-
!shouldCloseAfterOne ||
183-
extra.requiredValueSelectionTagIds.isNotEmpty()
184181
updateButtonVisibility()
185182
initialDataLoaded = true
186183
startRequiredTagValueSelectionIfNeeded()
@@ -230,7 +227,6 @@ class RecordTagSelectionViewModel @Inject constructor(
230227
return newTags.any { it.tagId == tagId && it.numericValue == null }
231228
}
232229

233-
// TODO VALUE TAG add to wear
234230
// TODO VALUE TAG don't show tag selection dialog, show value dialog directly
235231
// TODO VALUE TAG add check retroactive mode to loaded preselected tags?
236232
private suspend fun startRequiredTagValueSelectionIfNeeded() {

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

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ package com.example.util.simpletimetracker.features.tagsSelection.viewModel
77

88
import androidx.lifecycle.ViewModel
99
import androidx.lifecycle.viewModelScope
10-
import com.example.util.simpletimetracker.core.ShouldCloseAfterOneTagInteractor
10+
import com.example.util.simpletimetracker.core.interactor.IsMultipleTagChoiceAvailableInteractor
1111
import com.example.util.simpletimetracker.data.WearDataRepo
1212
import com.example.util.simpletimetracker.domain.extension.orFalse
1313
import com.example.util.simpletimetracker.domain.extension.removeIf
@@ -22,6 +22,7 @@ import com.example.util.simpletimetracker.features.tagsSelection.screen.TagListS
2222
import com.example.util.simpletimetracker.features.tagsSelection.ui.TagsLoadingState
2323
import dagger.hilt.android.lifecycle.HiltViewModel
2424
import kotlinx.coroutines.channels.BufferOverflow
25+
import kotlinx.coroutines.delay
2526
import kotlinx.coroutines.flow.MutableSharedFlow
2627
import kotlinx.coroutines.flow.MutableStateFlow
2728
import 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

Comments
 (0)