Skip to content

Commit 1544f0e

Browse files
committed
add collapsing additional fields on change screens
1 parent 84a1927 commit 1544f0e

File tree

42 files changed

+316
-34
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+316
-34
lines changed

data_local/src/main/java/com/example/util/simpletimetracker/data_local/backup/BackupPrefsRepo.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Compani
1313
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_CARD_ORDER_MANUAL
1414
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_CATEGORIES_TYPES_FILTERED_ON_CHART
1515
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_CATEGORIES_TYPES_FILTERED_ON_LIST
16+
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_CATEGORY_ADDITIONAL_FIELDS_SHOWN
1617
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_CATEGORY_ORDER
1718
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_CATEGORY_ORDER_MANUAL
1819
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_CHART_FILTER_TYPE
@@ -80,8 +81,10 @@ import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Compani
8081
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_STATISTICS_RANGE_LAST_DAYS
8182
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_TAGS_FILTERED_ON_CHART
8283
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_TAGS_FILTERED_ON_LIST
84+
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_TAG_ADDITIONAL_FIELDS_SHOWN
8385
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_TAG_ORDER
8486
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_TAG_ORDER_MANUAL
87+
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_TYPE_ADDITIONAL_FIELDS_SHOWN
8588
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_UNTRACKED_RANGE_ENABLED
8689
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_UNTRACKED_RANGE_END
8790
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_UNTRACKED_RANGE_START
@@ -227,6 +230,9 @@ class BackupPrefsRepo @Inject constructor(
227230
PrefsProcessor(KEY_IS_ARCHIVE_SEARCH_ENABLED, ::isArchiveSearchEnabled),
228231
PrefsProcessor(KEY_IS_COMMENT_SELECTION_SUGGESTIONS_ENABLED, ::isCommentSelectionSuggestionsEnabled),
229232
PrefsProcessor(KEY_DURATION_SUGGESTIONS_WAS_PREPOPULATED, ::durationSuggestionsWasPrepopulated),
233+
PrefsProcessor(KEY_TYPE_ADDITIONAL_FIELDS_SHOWN, ::typeAdditionalFieldsShown),
234+
PrefsProcessor(KEY_CATEGORY_ADDITIONAL_FIELDS_SHOWN, ::categoryAdditionalFieldsShown),
235+
PrefsProcessor(KEY_TAG_ADDITIONAL_FIELDS_SHOWN, ::tagAdditionalFieldsShown),
230236
PrefsProcessor(KEY_STATISTICS_DETAIL_STREAK_TYPE, ::statisticsDetailStreakType),
231237
)
232238
}

data_local/src/main/java/com/example/util/simpletimetracker/data_local/prefs/PrefsRepoImpl.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,18 @@ class PrefsRepoImpl @Inject constructor(
405405
KEY_DURATION_SUGGESTIONS_WAS_PREPOPULATED, false,
406406
)
407407

408+
override var typeAdditionalFieldsShown: Boolean by prefs.delegate(
409+
KEY_TYPE_ADDITIONAL_FIELDS_SHOWN, false,
410+
)
411+
412+
override var categoryAdditionalFieldsShown: Boolean by prefs.delegate(
413+
KEY_CATEGORY_ADDITIONAL_FIELDS_SHOWN, false,
414+
)
415+
416+
override var tagAdditionalFieldsShown: Boolean by prefs.delegate(
417+
KEY_TAG_ADDITIONAL_FIELDS_SHOWN, false,
418+
)
419+
408420
override var statisticsDetailStreakType: Int by prefs.delegate(
409421
KEY_STATISTICS_DETAIL_STREAK_TYPE, 0,
410422
)
@@ -678,6 +690,9 @@ class PrefsRepoImpl @Inject constructor(
678690
const val KEY_IS_ARCHIVE_SEARCH_ENABLED = "isArchiveSearchEnabled"
679691
const val KEY_IS_COMMENT_SELECTION_SUGGESTIONS_ENABLED = "isCommentSelectionSuggestionsEnabled"
680692
const val KEY_DURATION_SUGGESTIONS_WAS_PREPOPULATED = "durationSuggestionsWasPrepopulated"
693+
const val KEY_TYPE_ADDITIONAL_FIELDS_SHOWN = "typeAdditionalFieldsShown"
694+
const val KEY_CATEGORY_ADDITIONAL_FIELDS_SHOWN = "categoryAdditionalFieldsShown"
695+
const val KEY_TAG_ADDITIONAL_FIELDS_SHOWN = "tagAdditionalFieldsShown"
681696
const val KEY_STATISTICS_DETAIL_STREAK_TYPE = "statisticsDetailStreakType"
682697
const val KEY_CARD_ORDER_MANUAL = "cardOrderManual"
683698
const val KEY_CATEGORY_ORDER_MANUAL = "categoryOrderManual"

domain/src/main/java/com/example/util/simpletimetracker/domain/prefs/interactor/PrefsInteractor.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,30 @@ class PrefsInteractor @Inject constructor(
900900
prefsRepo.durationSuggestionsWasPrepopulated = value
901901
}
902902

903+
suspend fun getTypeAdditionalFieldsShown(): Boolean = withContext(Dispatchers.IO) {
904+
prefsRepo.typeAdditionalFieldsShown
905+
}
906+
907+
suspend fun setTypeAdditionalFieldsShown(value: Boolean) = withContext(Dispatchers.IO) {
908+
prefsRepo.typeAdditionalFieldsShown = value
909+
}
910+
911+
suspend fun getCategoryAdditionalFieldsShown(): Boolean = withContext(Dispatchers.IO) {
912+
prefsRepo.categoryAdditionalFieldsShown
913+
}
914+
915+
suspend fun setCategoryAdditionalFieldsShown(value: Boolean) = withContext(Dispatchers.IO) {
916+
prefsRepo.categoryAdditionalFieldsShown = value
917+
}
918+
919+
suspend fun getTagAdditionalFieldsShown(): Boolean = withContext(Dispatchers.IO) {
920+
prefsRepo.tagAdditionalFieldsShown
921+
}
922+
923+
suspend fun setTagAdditionalFieldsShown(value: Boolean) = withContext(Dispatchers.IO) {
924+
prefsRepo.tagAdditionalFieldsShown = value
925+
}
926+
903927
suspend fun getStatisticsStreaksType(): StatisticsStreaksType = withContext(Dispatchers.IO) {
904928
when (prefsRepo.statisticsDetailStreakType) {
905929
0 -> StatisticsStreaksType.LONGEST

domain/src/main/java/com/example/util/simpletimetracker/domain/prefs/repo/PrefsRepo.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,12 @@ interface PrefsRepo {
176176

177177
var durationSuggestionsWasPrepopulated: Boolean
178178

179+
var typeAdditionalFieldsShown: Boolean
180+
181+
var categoryAdditionalFieldsShown: Boolean
182+
183+
var tagAdditionalFieldsShown: Boolean
184+
179185
var statisticsDetailStreakType: Int
180186

181187
fun setWidget(widgetId: Int, recordType: Long)

features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/view/ChangeActivityFilterFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,8 @@ class ChangeActivityFilterFragment :
220220
val sizeBig = resources.getDimensionPixelSize(R.dimen.input_field_height_big)
221221
val colorSize = if (state.current is Color) sizeDefault else sizeBig
222222
fieldChangeActivityFilterColor.updateLayoutParams { height = colorSize }
223+
val activitiesSize = if (state.current is Type) sizeDefault else sizeBig
224+
fieldChangeActivityFilterType.updateLayoutParams { height = activitiesSize }
223225
}
224226

225227
private fun updateTypes(

features/feature_change_activity_filter/src/main/res/layout/change_activity_filter_fragment.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@
138138
android:id="@+id/fieldChangeActivityFilterType"
139139
style="@style/InputFieldCard"
140140
android:layout_width="0dp"
141-
android:layout_height="@dimen/input_field_height"
141+
android:layout_height="@dimen/input_field_height_big"
142142
android:layout_marginHorizontal="@dimen/edit_screen_field_margin_horizontal"
143143
app:layout_constraintEnd_toEndOf="parent"
144144
app:layout_constraintStart_toStartOf="parent"

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ class ChangeCategoryFragment :
101101
)
102102

103103
override fun initUi(): Unit = with(binding) {
104+
postponeEnterTransition()
105+
104106
setPreview()
105107

106108
setSharedTransitions(
@@ -131,6 +133,10 @@ class ChangeCategoryFragment :
131133
layout = binding.layoutChangeCategoryGoals,
132134
dayOfWeekAdapter = dailyGoalDayOfWeekAdapter,
133135
)
136+
137+
setOnPreDrawListener {
138+
startPostponedEnterTransition()
139+
}
134140
}
135141

136142
override fun initUx(): Unit = with(binding) {
@@ -142,6 +148,7 @@ class ChangeCategoryFragment :
142148
btnChangeCategorySave.setOnClick(viewModel::onSaveClick)
143149
btnChangeCategoryDelete.setOnClick(viewModel::onDeleteClick)
144150
btnChangeCategoryStatistics.setOnClick(viewModel::onStatisticsClick)
151+
tvChangeCategoryMoreFields.setOnClick(viewModel::onMoreFieldsClick)
145152
GoalsViewDelegate.initGoalUx(
146153
viewModel = viewModel,
147154
layout = layoutChangeCategoryGoals,
@@ -167,6 +174,7 @@ class ChangeCategoryFragment :
167174
layoutChangeCategoryGoals.containerChangeRecordTypeGoalNotificationsHint::visible::set,
168175
)
169176
chooserState.observe(::updateChooserState)
177+
additionalChoosersVisibility.observe { chooserState.value?.let(::updateChooserState) }
170178
keyboardVisibility.observe { visible ->
171179
if (visible) showKeyboard(etChangeCategoryName) else hideKeyboard()
172180
}
@@ -277,19 +285,25 @@ class ChangeCategoryFragment :
277285
viewModel.statsIconVisibility.value.orFalse() && isClosed
278286
btnChangeCategoryDelete.isVisible =
279287
viewModel.deleteIconVisibility.value.orFalse() && isClosed
280-
inputChangeRecordCategoryNote.isVisible = isClosed
281-
dividerChangeCategoryBottom.isInvisible = isClosed
282288

283-
// Chooser fields
289+
// Main fields
284290
fieldChangeCategoryColor.isVisible = isClosed || state.current is Color
285291
fieldChangeCategoryType.isVisible = isClosed || state.current is Type
286-
fieldChangeCategoryGoalTime.isVisible = isClosed || state.current is GoalTime
292+
293+
// Additional fields
294+
val isAdditionalVisible = viewModel.additionalChoosersVisibility.value.orFalse()
295+
containerChangeCategoryMoreFields.isVisible = isClosed
296+
fieldChangeCategoryGoalTime.isVisible = (isAdditionalVisible && isClosed) || state.current is GoalTime
297+
inputChangeRecordCategoryNote.isVisible = isAdditionalVisible && isClosed
298+
dividerChangeCategoryBottom.isInvisible = isClosed
287299

288300
// Chooser size
289301
val sizeDefault = resources.getDimensionPixelSize(R.dimen.input_field_height)
290302
val sizeBig = resources.getDimensionPixelSize(R.dimen.input_field_height_big)
291303
val colorSize = if (state.current is Color) sizeDefault else sizeBig
292304
fieldChangeCategoryColor.updateLayoutParams { height = colorSize }
305+
val activitiesSize = if (state.current is Type) sizeDefault else sizeBig
306+
fieldChangeCategoryType.updateLayoutParams { height = activitiesSize }
293307
}
294308

295309
private fun updateGoalsState(state: ChangeRecordTypeGoalsViewData) = with(binding) {

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import androidx.lifecycle.LiveData
44
import androidx.lifecycle.MutableLiveData
55
import androidx.lifecycle.ViewModel
66
import androidx.lifecycle.viewModelScope
7+
import com.example.util.simpletimetracker.core.base.BaseViewModel
78
import com.example.util.simpletimetracker.core.base.ViewModelDelegate
89
import com.example.util.simpletimetracker.core.delegates.colorSelection.ColorSelectionViewModelDelegate
910
import com.example.util.simpletimetracker.core.delegates.colorSelection.ColorSelectionViewModelDelegateImpl
11+
import com.example.util.simpletimetracker.core.extension.lazySuspend
1012
import com.example.util.simpletimetracker.core.extension.set
1113
import com.example.util.simpletimetracker.core.extension.trimIfNotBlank
1214
import com.example.util.simpletimetracker.core.interactor.SnackBarMessageNavigationInteractor
@@ -19,6 +21,7 @@ import com.example.util.simpletimetracker.domain.category.interactor.CategoryInt
1921
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
2022
import com.example.util.simpletimetracker.domain.category.interactor.RecordTypeCategoryInteractor
2123
import com.example.util.simpletimetracker.domain.category.model.Category
24+
import com.example.util.simpletimetracker.domain.extension.orFalse
2225
import com.example.util.simpletimetracker.domain.notifications.interactor.UpdateExternalViewsInteractor
2326
import com.example.util.simpletimetracker.domain.statistics.model.ChartFilterType
2427
import com.example.util.simpletimetracker.domain.recordType.model.RecordTypeGoal
@@ -49,7 +52,7 @@ class ChangeCategoryViewModel @Inject constructor(
4952
private val statisticsDetailNavigationInteractor: StatisticsDetailNavigationInteractor,
5053
private val externalViewsInteractor: UpdateExternalViewsInteractor,
5154
private val colorSelectionViewModelDelegateImpl: ColorSelectionViewModelDelegateImpl,
52-
) : ViewModel(),
55+
) : BaseViewModel(),
5356
GoalsViewModelDelegate by goalsViewModelDelegate,
5457
ColorSelectionViewModelDelegate by colorSelectionViewModelDelegateImpl {
5558

@@ -89,6 +92,9 @@ class ChangeCategoryViewModel @Inject constructor(
8992
initial
9093
}
9194
}
95+
val additionalChoosersVisibility: LiveData<Boolean> by lazySuspend {
96+
prefsInteractor.getCategoryAdditionalFieldsShown()
97+
}
9298
val deleteButtonEnabled: LiveData<Boolean> = MutableLiveData(true)
9399
val saveButtonEnabled: LiveData<Boolean> = MutableLiveData(true)
94100
val nameErrorMessage: LiveData<String> = MutableLiveData("")
@@ -193,6 +199,12 @@ class ChangeCategoryViewModel @Inject constructor(
193199
)
194200
}
195201

202+
fun onMoreFieldsClick() = viewModelScope.launch {
203+
val newValue = !prefsInteractor.getCategoryAdditionalFieldsShown()
204+
prefsInteractor.setCategoryAdditionalFieldsShown(newValue)
205+
additionalChoosersVisibility.set(newValue)
206+
}
207+
196208
fun onSaveClick() {
197209
if (newName.isEmpty()) {
198210
showMessage(R.string.change_category_message_choose_name)

features/feature_change_category/src/main/res/layout/change_category_fragment.xml

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@
154154
android:id="@+id/fieldChangeCategoryType"
155155
style="@style/InputFieldCard"
156156
android:layout_width="0dp"
157-
android:layout_height="@dimen/input_field_height"
157+
android:layout_height="@dimen/input_field_height_big"
158158
android:layout_marginHorizontal="@dimen/edit_screen_field_margin_horizontal"
159159
app:layout_constraintEnd_toEndOf="parent"
160160
app:layout_constraintStart_toStartOf="parent"
@@ -205,6 +205,50 @@
205205

206206
</androidx.cardview.widget.CardView>
207207

208+
<androidx.constraintlayout.widget.ConstraintLayout
209+
android:id="@+id/containerChangeCategoryMoreFields"
210+
android:layout_width="match_parent"
211+
android:layout_height="wrap_content"
212+
app:layout_constraintTop_toBottomOf="@id/fieldChangeCategoryType">
213+
214+
<View
215+
android:layout_width="0dp"
216+
android:layout_height="2dp"
217+
android:background="?appDividerColor"
218+
app:layout_constraintBottom_toBottomOf="parent"
219+
app:layout_constraintEnd_toEndOf="parent"
220+
app:layout_constraintStart_toStartOf="parent"
221+
app:layout_constraintTop_toTopOf="parent"
222+
app:layout_constraintWidth_percent="0.5" />
223+
224+
<androidx.cardview.widget.CardView
225+
android:id="@+id/tvChangeCategoryMoreFields"
226+
android:layout_width="wrap_content"
227+
android:layout_height="wrap_content"
228+
android:layout_marginTop="16dp"
229+
android:layout_marginBottom="16dp"
230+
android:foreground="?selectableItemBackground"
231+
app:cardBackgroundColor="?appBackgroundColor"
232+
app:cardCornerRadius="@dimen/input_field_corner_radius"
233+
app:cardElevation="0dp"
234+
app:cardUseCompatPadding="false"
235+
app:layout_constraintBottom_toBottomOf="parent"
236+
app:layout_constraintEnd_toEndOf="parent"
237+
app:layout_constraintStart_toStartOf="parent"
238+
app:layout_constraintTop_toTopOf="parent">
239+
240+
<androidx.appcompat.widget.AppCompatTextView
241+
android:layout_width="wrap_content"
242+
android:layout_height="wrap_content"
243+
android:background="?appInputFieldBorder"
244+
android:gravity="center"
245+
android:paddingHorizontal="12dp"
246+
android:text="@string/change_record_type_more_fields" />
247+
248+
</androidx.cardview.widget.CardView>
249+
250+
</androidx.constraintlayout.widget.ConstraintLayout>
251+
208252
<androidx.cardview.widget.CardView
209253
android:id="@+id/fieldChangeCategoryGoalTime"
210254
style="@style/InputFieldCard"
@@ -213,7 +257,7 @@
213257
android:layout_marginHorizontal="@dimen/edit_screen_field_margin_horizontal"
214258
app:layout_constraintEnd_toEndOf="parent"
215259
app:layout_constraintStart_toStartOf="parent"
216-
app:layout_constraintTop_toBottomOf="@id/fieldChangeCategoryType"
260+
app:layout_constraintTop_toBottomOf="@id/containerChangeCategoryMoreFields"
217261
app:layout_goneMarginTop="@dimen/edit_screen_field_top_margin">
218262

219263
<androidx.constraintlayout.widget.ConstraintLayout

0 commit comments

Comments
 (0)