1
1
package com.example.util.simpletimetracker.feature_change_category.view
2
2
3
- import com.example.util.simpletimetracker.feature_change_category.databinding.ChangeCategoryFragmentBinding as Binding
4
3
import android.os.Bundle
5
4
import android.view.LayoutInflater
6
5
import android.view.ViewGroup
6
+ import androidx.core.view.isVisible
7
7
import androidx.core.widget.doAfterTextChanged
8
8
import androidx.fragment.app.viewModels
9
9
import com.example.util.simpletimetracker.core.base.BaseFragment
10
10
import com.example.util.simpletimetracker.core.dialog.ColorSelectionDialogListener
11
+ import com.example.util.simpletimetracker.core.dialog.DurationDialogListener
11
12
import com.example.util.simpletimetracker.core.extension.hideKeyboard
12
13
import com.example.util.simpletimetracker.core.extension.observeOnce
13
14
import com.example.util.simpletimetracker.core.extension.setSharedTransitions
14
15
import com.example.util.simpletimetracker.core.extension.showKeyboard
15
16
import com.example.util.simpletimetracker.core.utils.fragmentArgumentDelegate
16
- import com.example.util.simpletimetracker.core.utils.setChooserColor
17
17
import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter
18
18
import com.example.util.simpletimetracker.feature_base_adapter.category.CategoryViewData
19
19
import com.example.util.simpletimetracker.feature_base_adapter.color.createColorAdapterDelegate
@@ -23,8 +23,13 @@ import com.example.util.simpletimetracker.feature_base_adapter.empty.createEmpty
23
23
import com.example.util.simpletimetracker.feature_base_adapter.info.createInfoAdapterDelegate
24
24
import com.example.util.simpletimetracker.feature_base_adapter.recordType.createRecordTypeAdapterDelegate
25
25
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
28
33
import com.example.util.simpletimetracker.feature_views.extension.setOnClick
29
34
import com.example.util.simpletimetracker.feature_views.extension.visible
30
35
import com.example.util.simpletimetracker.navigation.params.screen.ChangeCategoryFromScreen
@@ -34,11 +39,13 @@ import com.google.android.flexbox.FlexWrap
34
39
import com.google.android.flexbox.FlexboxLayoutManager
35
40
import com.google.android.flexbox.JustifyContent
36
41
import dagger.hilt.android.AndroidEntryPoint
42
+ import com.example.util.simpletimetracker.feature_change_category.databinding.ChangeCategoryFragmentBinding as Binding
37
43
38
44
@AndroidEntryPoint
39
45
class ChangeCategoryFragment :
40
46
BaseFragment <Binding >(),
41
- ColorSelectionDialogListener {
47
+ ColorSelectionDialogListener ,
48
+ DurationDialogListener {
42
49
43
50
override val inflater: (LayoutInflater , ViewGroup ? , Boolean ) -> Binding = Binding ::inflate
44
51
@@ -55,12 +62,12 @@ class ChangeCategoryFragment :
55
62
createRecordTypeAdapterDelegate(viewModel::onTypeClick),
56
63
createDividerAdapterDelegate(),
57
64
createInfoAdapterDelegate(),
58
- createEmptyAdapterDelegate()
65
+ createEmptyAdapterDelegate(),
59
66
)
60
67
}
61
68
62
69
private val params: ChangeTagData by fragmentArgumentDelegate(
63
- key = ARGS_PARAMS , default = ChangeTagData .New ()
70
+ key = ARGS_PARAMS , default = ChangeTagData .New (),
64
71
)
65
72
66
73
override fun initUi (): Unit = with (binding) {
@@ -69,7 +76,7 @@ class ChangeCategoryFragment :
69
76
setSharedTransitions(
70
77
additionalCondition = { params !is ChangeTagData .New },
71
78
transitionName = (params as ? ChangeTagData .Change )?.transitionName.orEmpty(),
72
- sharedView = previewChangeCategory
79
+ sharedView = previewChangeCategory,
73
80
)
74
81
75
82
rvChangeCategoryColor.apply {
@@ -89,14 +96,21 @@ class ChangeCategoryFragment :
89
96
}
90
97
adapter = typesAdapter
91
98
}
99
+
100
+ GoalsViewDelegate .initGoalUi(binding.layoutChangeCategoryGoals)
92
101
}
93
102
94
103
override fun initUx () = with (binding) {
95
104
etChangeCategoryName.doAfterTextChanged { viewModel.onNameChange(it.toString()) }
96
105
fieldChangeCategoryColor.setOnClick(viewModel::onColorChooserClick)
97
106
fieldChangeCategoryType.setOnClick(viewModel::onTypeChooserClick)
107
+ fieldChangeCategoryGoalTime.setOnClick(viewModel::onGoalTimeChooserClick)
98
108
btnChangeCategorySave.setOnClick(viewModel::onSaveClick)
99
109
btnChangeCategoryDelete.setOnClick(viewModel::onDeleteClick)
110
+ GoalsViewDelegate .initGoalUx(
111
+ viewModel = viewModel,
112
+ layout = layoutChangeCategoryGoals,
113
+ )
100
114
}
101
115
102
116
override fun initViewModel (): Unit = with (binding) {
@@ -109,30 +123,39 @@ class ChangeCategoryFragment :
109
123
categoryPreview.observe(::updatePreview)
110
124
colors.observe(colorsAdapter::replace)
111
125
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)
126
131
keyboardVisibility.observe { visible ->
127
132
if (visible) showKeyboard(etChangeCategoryName) else hideKeyboard()
128
133
}
129
134
}
130
135
}
131
136
137
+ override fun onResume () {
138
+ super .onResume()
139
+ viewModel.onVisible()
140
+ GoalsViewDelegate .onResume(binding.layoutChangeCategoryGoals)
141
+ }
142
+
132
143
override fun onColorSelected (colorInt : Int ) {
133
144
viewModel.onCustomColorSelected(colorInt)
134
145
}
135
146
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
+
136
159
private fun updateUi (item : CategoryViewData ) = with (binding) {
137
160
etChangeCategoryName.setText(item.name)
138
161
etChangeCategoryName.setSelection(item.name.length)
@@ -152,6 +175,42 @@ class ChangeCategoryFragment :
152
175
}
153
176
}
154
177
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
+
155
214
companion object {
156
215
private const val ARGS_PARAMS = " args_params"
157
216
0 commit comments