Skip to content

Commit d8c2431

Browse files
committed
fix chooser arrow jumping on More clicked
1 parent 1544f0e commit d8c2431

File tree

10 files changed

+162
-87
lines changed

10 files changed

+162
-87
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
@@ -5,7 +5,7 @@ object Base {
55
const val namespace = "com.example.util.simpletimetracker"
66

77
// Raise by 2 to account for wear version code.
8-
const val versionCode = 99
8+
const val versionCode = 101
99
const val versionName = "1.49"
1010
const val minSDK = 21
1111
const val currentSDK = 34

features/feature_change_category/src/main/java/com/example/util/simpletimetracker/feature_change_category/view/ChangeCategoryFragment.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import com.example.util.simpletimetracker.feature_change_category.viewData.Chang
3939
import com.example.util.simpletimetracker.feature_change_category.viewData.ChangeCategoryChooserState.Color
4040
import com.example.util.simpletimetracker.feature_change_category.viewData.ChangeCategoryChooserState.GoalTime
4141
import com.example.util.simpletimetracker.feature_change_category.viewData.ChangeCategoryChooserState.Type
42+
import com.example.util.simpletimetracker.feature_change_category.viewData.ChangeCategoryFieldsState
4243
import com.example.util.simpletimetracker.feature_change_category.viewData.ChangeCategoryTypesViewData
4344
import com.example.util.simpletimetracker.feature_change_category.viewModel.ChangeCategoryViewModel
4445
import com.example.util.simpletimetracker.feature_change_goals.api.ChangeRecordTypeGoalsViewData
@@ -174,7 +175,6 @@ class ChangeCategoryFragment :
174175
layoutChangeCategoryGoals.containerChangeRecordTypeGoalNotificationsHint::visible::set,
175176
)
176177
chooserState.observe(::updateChooserState)
177-
additionalChoosersVisibility.observe { chooserState.value?.let(::updateChooserState) }
178178
keyboardVisibility.observe { visible ->
179179
if (visible) showKeyboard(etChangeCategoryName) else hideKeyboard()
180180
}
@@ -258,8 +258,9 @@ class ChangeCategoryFragment :
258258
}
259259

260260
private fun updateChooserState(
261-
state: ViewChooserStateDelegate.States,
261+
fieldsState: ChangeCategoryFieldsState,
262262
) = with(binding) {
263+
val state = fieldsState.chooserState
263264
ViewChooserStateDelegate.updateChooser<Color>(
264265
state = state,
265266
chooserData = rvChangeCategoryColor,
@@ -291,7 +292,7 @@ class ChangeCategoryFragment :
291292
fieldChangeCategoryType.isVisible = isClosed || state.current is Type
292293

293294
// Additional fields
294-
val isAdditionalVisible = viewModel.additionalChoosersVisibility.value.orFalse()
295+
val isAdditionalVisible = fieldsState.additionalFieldsVisible
295296
containerChangeCategoryMoreFields.isVisible = isClosed
296297
fieldChangeCategoryGoalTime.isVisible = (isAdditionalVisible && isClosed) || state.current is GoalTime
297298
inputChangeRecordCategoryNote.isVisible = isAdditionalVisible && isClosed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.example.util.simpletimetracker.feature_change_category.viewData
2+
3+
import com.example.util.simpletimetracker.core.view.ViewChooserStateDelegate
4+
5+
data class ChangeCategoryFieldsState(
6+
val chooserState: ViewChooserStateDelegate.States,
7+
val additionalFieldsVisible: Boolean,
8+
)

features/feature_change_category/src/main/java/com/example/util/simpletimetracker/feature_change_category/viewModel/ChangeCategoryViewModel.kt

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import com.example.util.simpletimetracker.feature_change_category.R
3131
import com.example.util.simpletimetracker.feature_change_category.interactor.ChangeCategoryViewDataInteractor
3232
import com.example.util.simpletimetracker.feature_change_category.viewData.ChangeCategoryTypesViewData
3333
import com.example.util.simpletimetracker.feature_change_category.viewData.ChangeCategoryChooserState
34+
import com.example.util.simpletimetracker.feature_change_category.viewData.ChangeCategoryFieldsState
3435
import com.example.util.simpletimetracker.feature_change_goals.api.GoalsViewModelDelegate
3536
import com.example.util.simpletimetracker.navigation.Router
3637
import com.example.util.simpletimetracker.navigation.params.screen.ChangeTagData
@@ -76,13 +77,16 @@ class ChangeCategoryViewModel @Inject constructor(
7677
initial
7778
}
7879
}
79-
val chooserState: LiveData<ViewChooserStateDelegate.States> by lazy {
80-
return@lazy MutableLiveData(
81-
ViewChooserStateDelegate.States(
82-
current = ChangeCategoryChooserState.Closed,
83-
previous = ChangeCategoryChooserState.Closed,
80+
val chooserState: LiveData<ChangeCategoryFieldsState> by lazy {
81+
return@lazy MutableLiveData<ChangeCategoryFieldsState>(
82+
ChangeCategoryFieldsState(
83+
chooserState = ViewChooserStateDelegate.States(
84+
current = ChangeCategoryChooserState.Closed,
85+
previous = ChangeCategoryChooserState.Closed,
86+
),
87+
additionalFieldsVisible = false,
8488
),
85-
)
89+
).also { viewModelScope.launch { initializeChooserState() } }
8690
}
8791
val noteState: LiveData<String> by lazy {
8892
return@lazy MutableLiveData<String>().let { initial ->
@@ -92,9 +96,6 @@ class ChangeCategoryViewModel @Inject constructor(
9296
initial
9397
}
9498
}
95-
val additionalChoosersVisibility: LiveData<Boolean> by lazySuspend {
96-
prefsInteractor.getCategoryAdditionalFieldsShown()
97-
}
9899
val deleteButtonEnabled: LiveData<Boolean> = MutableLiveData(true)
99100
val saveButtonEnabled: LiveData<Boolean> = MutableLiveData(true)
100101
val nameErrorMessage: LiveData<String> = MutableLiveData("")
@@ -202,7 +203,16 @@ class ChangeCategoryViewModel @Inject constructor(
202203
fun onMoreFieldsClick() = viewModelScope.launch {
203204
val newValue = !prefsInteractor.getCategoryAdditionalFieldsShown()
204205
prefsInteractor.setCategoryAdditionalFieldsShown(newValue)
205-
additionalChoosersVisibility.set(newValue)
206+
207+
val currentState = chooserState.value ?: return@launch
208+
val newState = ChangeCategoryFieldsState(
209+
chooserState = ViewChooserStateDelegate.States(
210+
current = currentState.chooserState.current,
211+
previous = currentState.chooserState.current,
212+
),
213+
additionalFieldsVisible = newValue,
214+
)
215+
chooserState.set(newState)
206216
}
207217

208218
fun onSaveClick() {
@@ -231,7 +241,7 @@ class ChangeCategoryViewModel @Inject constructor(
231241
}
232242

233243
fun onBackPressed() {
234-
if (chooserState.value?.current !is ChangeCategoryChooserState.Closed) {
244+
if (chooserState.value?.chooserState?.current !is ChangeCategoryChooserState.Closed) {
235245
onNewChooserState(ChangeCategoryChooserState.Closed)
236246
} else {
237247
router.back()
@@ -249,24 +259,31 @@ class ChangeCategoryViewModel @Inject constructor(
249259
private fun onNewChooserState(
250260
newState: ChangeCategoryChooserState,
251261
) {
252-
val current = chooserState.value?.current
253-
?: ChangeCategoryChooserState.Closed
254-
keyboardVisibility.set(false)
255-
if (current == newState) {
256-
chooserState.set(
257-
ViewChooserStateDelegate.States(
258-
current = ChangeCategoryChooserState.Closed,
259-
previous = current,
260-
),
262+
val currentState = chooserState.value ?: return
263+
val current = currentState.chooserState.current
264+
265+
val newChooserState = if (current == newState) {
266+
ViewChooserStateDelegate.States(
267+
current = ChangeCategoryChooserState.Closed,
268+
previous = current,
261269
)
262270
} else {
263-
chooserState.set(
264-
ViewChooserStateDelegate.States(
265-
current = newState,
266-
previous = current,
267-
),
271+
ViewChooserStateDelegate.States(
272+
current = newState,
273+
previous = current,
268274
)
269275
}
276+
277+
keyboardVisibility.set(false)
278+
chooserState.set(currentState.copy(chooserState = newChooserState))
279+
}
280+
281+
private suspend fun initializeChooserState() {
282+
val current = chooserState.value ?: return
283+
val newState = current.copy(
284+
additionalFieldsVisible = prefsInteractor.getCategoryAdditionalFieldsShown(),
285+
)
286+
chooserState.set(newState)
270287
}
271288

272289
private suspend fun initializeSelectedTypes() {

features/feature_change_record_tag/src/main/java/com/example/util/simpletimetracker/feature_change_record_tag/view/ChangeRecordTagFragment.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import com.example.util.simpletimetracker.feature_change_record_tag.viewData.Cha
5454
import com.example.util.simpletimetracker.feature_change_record_tag.viewData.ChangeRecordTagChooserState.DefaultType
5555
import com.example.util.simpletimetracker.feature_change_record_tag.viewData.ChangeRecordTagChooserState.Icon
5656
import com.example.util.simpletimetracker.feature_change_record_tag.viewData.ChangeRecordTagChooserState.Type
57+
import com.example.util.simpletimetracker.feature_change_record_tag.viewData.ChangeRecordTagFieldsState
5758
import com.example.util.simpletimetracker.feature_change_record_tag.viewData.ChangeRecordTagTypesViewData
5859
import com.example.util.simpletimetracker.feature_change_record_tag.viewModel.ChangeRecordTagViewModel
5960
import com.example.util.simpletimetracker.feature_views.extension.animateColor
@@ -235,7 +236,6 @@ class ChangeRecordTagFragment :
235236
types.observe(::updateTypes)
236237
defaultTypes.observe(::updateDefaultTypes)
237238
chooserState.observe(::updateChooserState)
238-
additionalChoosersVisibility.observe { chooserState.value?.let(::updateChooserState) }
239239
nameErrorMessage.observe(::updateNameErrorMessage)
240240
noteState.observe(::updateNoteState)
241241
keyboardVisibility.observe { visible ->
@@ -342,8 +342,9 @@ class ChangeRecordTagFragment :
342342
}
343343

344344
private fun updateChooserState(
345-
state: ViewChooserStateDelegate.States,
345+
fieldsState: ChangeRecordTagFieldsState,
346346
) = with(binding) {
347+
val state = fieldsState.chooserState
347348
ViewChooserStateDelegate.updateChooser<Color>(
348349
state = state,
349350
chooserData = rvChangeRecordTagColor,
@@ -385,7 +386,7 @@ class ChangeRecordTagFragment :
385386
fieldChangeRecordTagType.isVisible = isClosed || state.current is Type
386387

387388
// Additional fields
388-
val isAdditionalVisible = viewModel.additionalChoosersVisibility.value.orFalse()
389+
val isAdditionalVisible = fieldsState.additionalFieldsVisible
389390
containerChangeRecordTagMoreFields.isVisible = isClosed
390391
fieldChangeRecordTagDefaultType.isVisible = (isAdditionalVisible && isClosed) || state.current is DefaultType
391392
btnChangeRecordTagSelectActivity.isVisible = isAdditionalVisible && isClosed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.example.util.simpletimetracker.feature_change_record_tag.viewData
2+
3+
import com.example.util.simpletimetracker.core.view.ViewChooserStateDelegate
4+
5+
data class ChangeRecordTagFieldsState(
6+
val chooserState: ViewChooserStateDelegate.States,
7+
val additionalFieldsVisible: Boolean,
8+
)

features/feature_change_record_tag/src/main/java/com/example/util/simpletimetracker/feature_change_record_tag/viewModel/ChangeRecordTagViewModel.kt

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ import com.example.util.simpletimetracker.domain.recordTag.interactor.RemoveReco
2727
import com.example.util.simpletimetracker.domain.notifications.interactor.UpdateExternalViewsInteractor
2828
import com.example.util.simpletimetracker.domain.color.model.AppColor
2929
import com.example.util.simpletimetracker.domain.extension.addOrRemove
30-
import com.example.util.simpletimetracker.domain.extension.orFalse
3130
import com.example.util.simpletimetracker.domain.statistics.model.ChartFilterType
3231
import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
3332
import com.example.util.simpletimetracker.feature_base_adapter.category.CategoryViewData
3433
import com.example.util.simpletimetracker.feature_base_adapter.recordType.RecordTypeViewData
3534
import com.example.util.simpletimetracker.feature_change_record_tag.R
3635
import com.example.util.simpletimetracker.feature_change_record_tag.interactor.ChangeRecordTagViewDataInteractor
3736
import com.example.util.simpletimetracker.feature_change_record_tag.viewData.ChangeRecordTagChooserState
37+
import com.example.util.simpletimetracker.feature_change_record_tag.viewData.ChangeRecordTagFieldsState
3838
import com.example.util.simpletimetracker.feature_change_record_tag.viewData.ChangeRecordTagTypesViewData
3939
import com.example.util.simpletimetracker.navigation.Router
4040
import com.example.util.simpletimetracker.navigation.params.screen.ChangeTagData
@@ -94,13 +94,16 @@ class ChangeRecordTagViewModel @Inject constructor(
9494
initial
9595
}
9696
}
97-
val chooserState: LiveData<ViewChooserStateDelegate.States> by lazy {
98-
return@lazy MutableLiveData(
99-
ViewChooserStateDelegate.States(
100-
current = ChangeRecordTagChooserState.Closed,
101-
previous = ChangeRecordTagChooserState.Closed,
97+
val chooserState: LiveData<ChangeRecordTagFieldsState> by lazy {
98+
return@lazy MutableLiveData<ChangeRecordTagFieldsState>(
99+
ChangeRecordTagFieldsState(
100+
chooserState = ViewChooserStateDelegate.States(
101+
current = ChangeRecordTagChooserState.Closed,
102+
previous = ChangeRecordTagChooserState.Closed,
103+
),
104+
additionalFieldsVisible = false,
102105
),
103-
)
106+
).also { viewModelScope.launch { initializeChooserState() } }
104107
}
105108
val noteState: LiveData<String> by lazy {
106109
return@lazy MutableLiveData<String>().let { initial ->
@@ -110,9 +113,6 @@ class ChangeRecordTagViewModel @Inject constructor(
110113
initial
111114
}
112115
}
113-
val additionalChoosersVisibility: LiveData<Boolean> by lazySuspend {
114-
prefsInteractor.getTagAdditionalFieldsShown()
115-
}
116116
val archiveButtonEnabled: LiveData<Boolean> = MutableLiveData(true)
117117
val deleteButtonEnabled: LiveData<Boolean> = MutableLiveData(true)
118118
val saveButtonEnabled: LiveData<Boolean> = MutableLiveData(true)
@@ -271,7 +271,16 @@ class ChangeRecordTagViewModel @Inject constructor(
271271
fun onMoreFieldsClick() = viewModelScope.launch {
272272
val newValue = !prefsInteractor.getTagAdditionalFieldsShown()
273273
prefsInteractor.setTagAdditionalFieldsShown(newValue)
274-
additionalChoosersVisibility.set(newValue)
274+
275+
val currentState = chooserState.value ?: return@launch
276+
val newState = ChangeRecordTagFieldsState(
277+
chooserState = ViewChooserStateDelegate.States(
278+
current = currentState.chooserState.current,
279+
previous = currentState.chooserState.current,
280+
),
281+
additionalFieldsVisible = newValue,
282+
)
283+
chooserState.set(newState)
275284
}
276285

277286
fun onSaveClick() {
@@ -301,7 +310,7 @@ class ChangeRecordTagViewModel @Inject constructor(
301310
}
302311

303312
fun onBackPressed() {
304-
if (chooserState.value?.current !is ChangeRecordTagChooserState.Closed) {
313+
if (chooserState.value?.chooserState?.current !is ChangeRecordTagChooserState.Closed) {
305314
onNewChooserState(ChangeRecordTagChooserState.Closed)
306315
} else {
307316
router.back()
@@ -346,24 +355,31 @@ class ChangeRecordTagViewModel @Inject constructor(
346355
private fun onNewChooserState(
347356
newState: ChangeRecordTagChooserState,
348357
) {
349-
val current = chooserState.value?.current
350-
?: ChangeRecordTagChooserState.Closed
351-
keyboardVisibility.set(false)
352-
if (current == newState) {
353-
chooserState.set(
354-
ViewChooserStateDelegate.States(
355-
current = ChangeRecordTagChooserState.Closed,
356-
previous = current,
357-
),
358+
val currentState = chooserState.value ?: return
359+
val current = currentState.chooserState.current
360+
361+
val newChooserState = if (current == newState) {
362+
ViewChooserStateDelegate.States(
363+
current = ChangeRecordTagChooserState.Closed,
364+
previous = current,
358365
)
359366
} else {
360-
chooserState.set(
361-
ViewChooserStateDelegate.States(
362-
current = newState,
363-
previous = current,
364-
),
367+
ViewChooserStateDelegate.States(
368+
current = newState,
369+
previous = current,
365370
)
366371
}
372+
373+
keyboardVisibility.set(false)
374+
chooserState.set(currentState.copy(chooserState = newChooserState))
375+
}
376+
377+
private suspend fun initializeChooserState() {
378+
val current = chooserState.value ?: return
379+
val newState = current.copy(
380+
additionalFieldsVisible = prefsInteractor.getTagAdditionalFieldsShown(),
381+
)
382+
chooserState.set(newState)
367383
}
368384

369385
private suspend fun initializeTypes() {

features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/view/ChangeRecordTypeFragment.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import com.example.util.simpletimetracker.feature_change_record_type.viewData.Ch
6060
import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState.Color
6161
import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState.GoalTime
6262
import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState.Icon
63+
import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeFieldsState
6364
import com.example.util.simpletimetracker.feature_change_record_type.viewModel.ChangeRecordTypeViewModel
6465
import com.example.util.simpletimetracker.feature_views.extension.animateColor
6566
import com.example.util.simpletimetracker.feature_views.extension.dpToPx
@@ -252,7 +253,6 @@ class ChangeRecordTypeFragment :
252253
layoutChangeRecordTypeGoals.containerChangeRecordTypeGoalNotificationsHint::visible::set,
253254
)
254255
chooserState.observe(::updateChooserState)
255-
additionalChoosersVisibility.observe { chooserState.value?.let(::updateChooserState) }
256256
keyboardVisibility.observe { visible ->
257257
if (visible) showKeyboard(etChangeRecordTypeName) else hideKeyboard()
258258
}
@@ -375,8 +375,9 @@ class ChangeRecordTypeFragment :
375375
}
376376

377377
private fun updateChooserState(
378-
state: ViewChooserStateDelegate.States,
378+
fieldsState: ChangeRecordTypeFieldsState,
379379
) = with(binding) {
380+
val state = fieldsState.chooserState
380381
ViewChooserStateDelegate.updateChooser<Color>(
381382
state = state,
382383
chooserData = rvChangeRecordTypeColor,
@@ -423,7 +424,7 @@ class ChangeRecordTypeFragment :
423424
fieldChangeRecordTypeIcon.isVisible = isClosed || state.current is Icon
424425

425426
// Additional fields
426-
val isAdditionalVisible = viewModel.additionalChoosersVisibility.value.orFalse()
427+
val isAdditionalVisible = fieldsState.additionalFieldsVisible
427428
containerChangeRecordTypeMoreFields.isVisible = isClosed
428429
fieldChangeRecordTypeCategory.isVisible = (isAdditionalVisible && isClosed) || state.current is Category
429430
fieldChangeRecordTypeGoalTime.isVisible = (isAdditionalVisible && isClosed) || state.current is GoalTime
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.example.util.simpletimetracker.feature_change_record_type.viewData
2+
3+
import com.example.util.simpletimetracker.core.view.ViewChooserStateDelegate
4+
5+
data class ChangeRecordTypeFieldsState(
6+
val chooserState: ViewChooserStateDelegate.States,
7+
val additionalFieldsVisible: Boolean,
8+
)

0 commit comments

Comments
 (0)