Skip to content

Commit 1f95f2a

Browse files
committed
add goal adding to category
1 parent 28b815a commit 1f95f2a

File tree

13 files changed

+816
-535
lines changed

13 files changed

+816
-535
lines changed

features/feature_change_category/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ applyAndroidLibrary()
1212

1313
dependencies {
1414
implementation(project(":core"))
15+
implementation(project(":feature_change_record_type"))
1516
implementation(Deps.Google.dagger)
1617
kapt(Deps.Kapt.dagger)
1718
}

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

Lines changed: 81 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
package com.example.util.simpletimetracker.feature_change_category.view
22

3-
import com.example.util.simpletimetracker.feature_change_category.databinding.ChangeCategoryFragmentBinding as Binding
43
import android.os.Bundle
54
import android.view.LayoutInflater
65
import android.view.ViewGroup
6+
import androidx.core.view.isVisible
77
import androidx.core.widget.doAfterTextChanged
88
import androidx.fragment.app.viewModels
99
import com.example.util.simpletimetracker.core.base.BaseFragment
1010
import com.example.util.simpletimetracker.core.dialog.ColorSelectionDialogListener
11+
import com.example.util.simpletimetracker.core.dialog.DurationDialogListener
1112
import com.example.util.simpletimetracker.core.extension.hideKeyboard
1213
import com.example.util.simpletimetracker.core.extension.observeOnce
1314
import com.example.util.simpletimetracker.core.extension.setSharedTransitions
1415
import com.example.util.simpletimetracker.core.extension.showKeyboard
1516
import com.example.util.simpletimetracker.core.utils.fragmentArgumentDelegate
16-
import com.example.util.simpletimetracker.core.utils.setChooserColor
1717
import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter
1818
import com.example.util.simpletimetracker.feature_base_adapter.category.CategoryViewData
1919
import com.example.util.simpletimetracker.feature_base_adapter.color.createColorAdapterDelegate
@@ -23,8 +23,13 @@ import com.example.util.simpletimetracker.feature_base_adapter.empty.createEmpty
2323
import com.example.util.simpletimetracker.feature_base_adapter.info.createInfoAdapterDelegate
2424
import com.example.util.simpletimetracker.feature_base_adapter.recordType.createRecordTypeAdapterDelegate
2525
import com.example.util.simpletimetracker.feature_change_category.viewModel.ChangeCategoryViewModel
26-
import com.example.util.simpletimetracker.feature_views.extension.rotateDown
27-
import com.example.util.simpletimetracker.feature_views.extension.rotateUp
26+
import com.example.util.simpletimetracker.feature_change_record_type.goals.GoalsViewDelegate
27+
import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState
28+
import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState.State.Closed
29+
import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState.State.Color
30+
import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState.State.GoalTime
31+
import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState.State.Type
32+
import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeGoalsViewData
2833
import com.example.util.simpletimetracker.feature_views.extension.setOnClick
2934
import com.example.util.simpletimetracker.feature_views.extension.visible
3035
import com.example.util.simpletimetracker.navigation.params.screen.ChangeCategoryFromScreen
@@ -34,11 +39,13 @@ import com.google.android.flexbox.FlexWrap
3439
import com.google.android.flexbox.FlexboxLayoutManager
3540
import com.google.android.flexbox.JustifyContent
3641
import dagger.hilt.android.AndroidEntryPoint
42+
import com.example.util.simpletimetracker.feature_change_category.databinding.ChangeCategoryFragmentBinding as Binding
3743

3844
@AndroidEntryPoint
3945
class ChangeCategoryFragment :
4046
BaseFragment<Binding>(),
41-
ColorSelectionDialogListener {
47+
ColorSelectionDialogListener,
48+
DurationDialogListener {
4249

4350
override val inflater: (LayoutInflater, ViewGroup?, Boolean) -> Binding = Binding::inflate
4451

@@ -55,12 +62,12 @@ class ChangeCategoryFragment :
5562
createRecordTypeAdapterDelegate(viewModel::onTypeClick),
5663
createDividerAdapterDelegate(),
5764
createInfoAdapterDelegate(),
58-
createEmptyAdapterDelegate()
65+
createEmptyAdapterDelegate(),
5966
)
6067
}
6168

6269
private val params: ChangeTagData by fragmentArgumentDelegate(
63-
key = ARGS_PARAMS, default = ChangeTagData.New()
70+
key = ARGS_PARAMS, default = ChangeTagData.New(),
6471
)
6572

6673
override fun initUi(): Unit = with(binding) {
@@ -69,7 +76,7 @@ class ChangeCategoryFragment :
6976
setSharedTransitions(
7077
additionalCondition = { params !is ChangeTagData.New },
7178
transitionName = (params as? ChangeTagData.Change)?.transitionName.orEmpty(),
72-
sharedView = previewChangeCategory
79+
sharedView = previewChangeCategory,
7380
)
7481

7582
rvChangeCategoryColor.apply {
@@ -89,14 +96,21 @@ class ChangeCategoryFragment :
8996
}
9097
adapter = typesAdapter
9198
}
99+
100+
GoalsViewDelegate.initGoalUi(binding.layoutChangeCategoryGoals)
92101
}
93102

94103
override fun initUx() = with(binding) {
95104
etChangeCategoryName.doAfterTextChanged { viewModel.onNameChange(it.toString()) }
96105
fieldChangeCategoryColor.setOnClick(viewModel::onColorChooserClick)
97106
fieldChangeCategoryType.setOnClick(viewModel::onTypeChooserClick)
107+
fieldChangeCategoryGoalTime.setOnClick(viewModel::onGoalTimeChooserClick)
98108
btnChangeCategorySave.setOnClick(viewModel::onSaveClick)
99109
btnChangeCategoryDelete.setOnClick(viewModel::onDeleteClick)
110+
GoalsViewDelegate.initGoalUx(
111+
viewModel = viewModel,
112+
layout = layoutChangeCategoryGoals,
113+
)
100114
}
101115

102116
override fun initViewModel(): Unit = with(binding) {
@@ -109,30 +123,39 @@ class ChangeCategoryFragment :
109123
categoryPreview.observe(::updatePreview)
110124
colors.observe(colorsAdapter::replace)
111125
types.observe(typesAdapter::replace)
112-
flipColorChooser.observe { opened ->
113-
rvChangeCategoryColor.visible = opened
114-
fieldChangeCategoryColor.setChooserColor(opened)
115-
arrowChangeCategoryColor.apply {
116-
if (opened) rotateDown() else rotateUp()
117-
}
118-
}
119-
flipTypesChooser.observe { opened ->
120-
rvChangeCategoryType.visible = opened
121-
fieldChangeCategoryType.setChooserColor(opened)
122-
arrowChangeCategoryType.apply {
123-
if (opened) rotateDown() else rotateUp()
124-
}
125-
}
126+
goalsViewData.observe(::updateGoalsState)
127+
notificationsHintVisible.observe(
128+
layoutChangeCategoryGoals.containerChangeRecordTypeGoalNotificationsHint::visible::set
129+
)
130+
chooserState.observe(::updateChooserState)
126131
keyboardVisibility.observe { visible ->
127132
if (visible) showKeyboard(etChangeCategoryName) else hideKeyboard()
128133
}
129134
}
130135
}
131136

137+
override fun onResume() {
138+
super.onResume()
139+
viewModel.onVisible()
140+
GoalsViewDelegate.onResume(binding.layoutChangeCategoryGoals)
141+
}
142+
132143
override fun onColorSelected(colorInt: Int) {
133144
viewModel.onCustomColorSelected(colorInt)
134145
}
135146

147+
override fun onDurationSet(duration: Long, tag: String?) {
148+
viewModel.onDurationSet(
149+
tag = tag,
150+
duration = duration,
151+
anchor = binding.btnChangeCategorySave,
152+
)
153+
}
154+
155+
override fun onDisable(tag: String?) {
156+
viewModel.onDurationDisabled(tag)
157+
}
158+
136159
private fun updateUi(item: CategoryViewData) = with(binding) {
137160
etChangeCategoryName.setText(item.name)
138161
etChangeCategoryName.setSelection(item.name.length)
@@ -152,6 +175,42 @@ class ChangeCategoryFragment :
152175
}
153176
}
154177

178+
private fun updateChooserState(state: ChangeRecordTypeChooserState) = with(binding) {
179+
GoalsViewDelegate.updateChooser<Color>(
180+
state = state,
181+
chooserData = rvChangeCategoryColor,
182+
chooserView = fieldChangeCategoryColor,
183+
chooserArrow = arrowChangeCategoryColor,
184+
)
185+
GoalsViewDelegate.updateChooser<Type>(
186+
state = state,
187+
chooserData = rvChangeCategoryType,
188+
chooserView = fieldChangeCategoryType,
189+
chooserArrow = arrowChangeCategoryType,
190+
)
191+
GoalsViewDelegate.updateChooser<GoalTime>(
192+
state = state,
193+
chooserData = containerChangeCategoryGoalTime,
194+
chooserView = fieldChangeCategoryGoalTime,
195+
chooserArrow = arrowChangeCategoryGoalTime,
196+
)
197+
198+
val isClosed = state.current is Closed
199+
inputChangeCategoryName.isVisible = isClosed
200+
201+
// Chooser fields
202+
fieldChangeCategoryColor.isVisible = isClosed || state.current is Color
203+
fieldChangeCategoryType.isVisible = isClosed || state.current is Type
204+
fieldChangeCategoryGoalTime.isVisible = isClosed || state.current is GoalTime
205+
}
206+
207+
private fun updateGoalsState(state: ChangeRecordTypeGoalsViewData) = with(binding) {
208+
GoalsViewDelegate.updateGoalsState(
209+
state = state,
210+
layout = layoutChangeCategoryGoals,
211+
)
212+
}
213+
155214
companion object {
156215
private const val ARGS_PARAMS = "args_params"
157216

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

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import com.example.util.simpletimetracker.core.interactor.ColorViewDataInteracto
99
import com.example.util.simpletimetracker.core.mapper.CategoryViewDataMapper
1010
import com.example.util.simpletimetracker.core.mapper.ColorMapper
1111
import com.example.util.simpletimetracker.core.repo.ResourceRepo
12-
import com.example.util.simpletimetracker.domain.extension.flip
13-
import com.example.util.simpletimetracker.domain.extension.orTrue
1412
import com.example.util.simpletimetracker.domain.extension.orZero
1513
import com.example.util.simpletimetracker.domain.interactor.CategoryInteractor
1614
import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor
@@ -23,6 +21,10 @@ import com.example.util.simpletimetracker.feature_base_adapter.color.ColorViewDa
2321
import com.example.util.simpletimetracker.feature_base_adapter.recordType.RecordTypeViewData
2422
import com.example.util.simpletimetracker.feature_change_category.R
2523
import com.example.util.simpletimetracker.feature_change_category.interactor.ChangeCategoryViewDataInteractor
24+
import com.example.util.simpletimetracker.feature_change_record_type.goals.GoalsViewModelDelegate
25+
import com.example.util.simpletimetracker.feature_change_record_type.goals.GoalsViewModelDelegateImpl
26+
import com.example.util.simpletimetracker.feature_change_record_type.goals.GoalsViewModelDelegateImpl.IdData
27+
import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState
2628
import com.example.util.simpletimetracker.navigation.Router
2729
import com.example.util.simpletimetracker.navigation.params.notification.SnackBarParams
2830
import com.example.util.simpletimetracker.navigation.params.screen.ChangeTagData
@@ -42,7 +44,9 @@ class ChangeCategoryViewModel @Inject constructor(
4244
private val categoryViewDataMapper: CategoryViewDataMapper,
4345
private val resourceRepo: ResourceRepo,
4446
private val colorMapper: ColorMapper,
45-
) : ViewModel() {
47+
private val goalsViewModelDelegate: GoalsViewModelDelegateImpl,
48+
) : ViewModel(),
49+
GoalsViewModelDelegate by goalsViewModelDelegate {
4650

4751
lateinit var extra: ChangeTagData
4852

@@ -67,8 +71,12 @@ class ChangeCategoryViewModel @Inject constructor(
6771
initial
6872
}
6973
}
70-
val flipColorChooser: LiveData<Boolean> = MutableLiveData()
71-
val flipTypesChooser: LiveData<Boolean> = MutableLiveData()
74+
val chooserState: LiveData<ChangeRecordTypeChooserState> = MutableLiveData(
75+
ChangeRecordTypeChooserState(
76+
current = ChangeRecordTypeChooserState.State.Closed,
77+
previous = ChangeRecordTypeChooserState.State.Closed,
78+
),
79+
)
7280
val deleteButtonEnabled: LiveData<Boolean> = MutableLiveData(true)
7381
val saveButtonEnabled: LiveData<Boolean> = MutableLiveData(true)
7482
val deleteIconVisibility: LiveData<Boolean> by lazy { MutableLiveData(categoryId != 0L) }
@@ -80,6 +88,10 @@ class ChangeCategoryViewModel @Inject constructor(
8088
private var newColor: AppColor = AppColor(colorId = (0..ColorMapper.colorsNumber).random(), colorInt = "")
8189
private var newTypes: MutableList<Long> = mutableListOf()
8290

91+
fun onVisible() = viewModelScope.launch {
92+
goalsViewModelDelegate.onVisible()
93+
}
94+
8395
fun onNameChange(name: String) {
8496
viewModelScope.launch {
8597
if (name != newName) {
@@ -90,23 +102,15 @@ class ChangeCategoryViewModel @Inject constructor(
90102
}
91103

92104
fun onColorChooserClick() {
93-
(keyboardVisibility as MutableLiveData).value = false
94-
(flipColorChooser as MutableLiveData).value = flipColorChooser.value
95-
?.flip().orTrue()
96-
97-
if (flipTypesChooser.value == true) {
98-
(flipTypesChooser as MutableLiveData).value = false
99-
}
105+
onNewChooserState(ChangeRecordTypeChooserState.State.Color)
100106
}
101107

102108
fun onTypeChooserClick() {
103-
(keyboardVisibility as MutableLiveData).value = false
104-
(flipTypesChooser as MutableLiveData).value = flipTypesChooser.value
105-
?.flip().orTrue()
109+
onNewChooserState(ChangeRecordTypeChooserState.State.Type)
110+
}
106111

107-
if (flipColorChooser.value == true) {
108-
(flipColorChooser as MutableLiveData).value = false
109-
}
112+
fun onGoalTimeChooserClick() {
113+
onNewChooserState(ChangeRecordTypeChooserState.State.GoalTime)
110114
}
111115

112116
fun onColorClick(item: ColorViewData) {
@@ -175,6 +179,7 @@ class ChangeCategoryViewModel @Inject constructor(
175179
).let {
176180
val addedId = saveCategory()
177181
saveTypes(addedId)
182+
goalsViewModelDelegate.saveGoals(IdData.Category(addedId))
178183
(keyboardVisibility as MutableLiveData).value = false
179184
router.back()
180185
}
@@ -199,6 +204,28 @@ class ChangeCategoryViewModel @Inject constructor(
199204
recordTypeCategoryInteractor.removeTypes(categoryId, removedTypes)
200205
}
201206

207+
private fun onNewChooserState(
208+
newState: ChangeRecordTypeChooserState.State,
209+
) {
210+
val current = chooserState.value?.current ?: ChangeRecordTypeChooserState.State.Closed
211+
keyboardVisibility.set(false)
212+
if (current == newState) {
213+
chooserState.set(
214+
ChangeRecordTypeChooserState(
215+
current = ChangeRecordTypeChooserState.State.Closed,
216+
previous = current,
217+
),
218+
)
219+
} else {
220+
chooserState.set(
221+
ChangeRecordTypeChooserState(
222+
current = newState,
223+
previous = current,
224+
),
225+
)
226+
}
227+
}
228+
202229
private suspend fun initializeSelectedTypes() {
203230
when (extra) {
204231
is ChangeTagData.Change -> {
@@ -223,6 +250,7 @@ class ChangeCategoryViewModel @Inject constructor(
223250
?.let {
224251
newName = it.name
225252
newColor = it.color
253+
goalsViewModelDelegate.initialize(IdData.Category(it.id))
226254
updateColors()
227255
}
228256
val isDarkTheme = prefsInteractor.getDarkMode()

0 commit comments

Comments
 (0)