From 9bfa9365664b1ade6523562560470ebd0639d8cd Mon Sep 17 00:00:00 2001 From: razeeman Date: Sat, 19 Nov 2022 13:24:47 +0300 Subject: [PATCH] refactor change record type chooser state --- .../view/ChangeRecordTypeFragment.kt | 84 +++++++++++-------- .../viewData/ChangeRecordTypeChooserState.kt | 8 ++ .../viewModel/ChangeRecordTypeViewModel.kt | 46 ++++------ 3 files changed, 70 insertions(+), 68 deletions(-) create mode 100644 features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewData/ChangeRecordTypeChooserState.kt diff --git a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/view/ChangeRecordTypeFragment.kt b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/view/ChangeRecordTypeFragment.kt index b66d3ea5..9fbf4aa6 100644 --- a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/view/ChangeRecordTypeFragment.kt +++ b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/view/ChangeRecordTypeFragment.kt @@ -3,7 +3,9 @@ package com.example.util.simpletimetracker.feature_change_record_type.view import com.example.util.simpletimetracker.feature_change_record_type.databinding.ChangeRecordTypeFragmentBinding as Binding import android.os.Bundle import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup +import androidx.cardview.widget.CardView import androidx.core.view.isVisible import androidx.core.widget.doAfterTextChanged import androidx.fragment.app.viewModels @@ -39,6 +41,11 @@ import com.example.util.simpletimetracker.feature_change_record_type.R import com.example.util.simpletimetracker.feature_change_record_type.adapter.createChangeRecordTypeIconAdapterDelegate import com.example.util.simpletimetracker.feature_change_record_type.adapter.createChangeRecordTypeIconCategoryAdapterDelegate import com.example.util.simpletimetracker.feature_change_record_type.adapter.createChangeRecordTypeIconCategoryInfoAdapterDelegate +import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState +import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState.Category +import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState.Closed +import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState.Color +import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState.Icon import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconCategoryInfoViewData import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconStateViewData import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconSwitchViewData @@ -197,42 +204,7 @@ class ChangeRecordTypeFragment : iconsTypeViewData.observe(btnChangeRecordTypeIconSwitch.adapter::replace) categories.observe(categoriesAdapter::replace) goalTimeViewData.observe(tvChangeRecordTypeGoalTimeTime::setText) - flipColorChooser.observe { opened -> - rvChangeRecordTypeColor.isVisible = opened - fieldChangeRecordTypeColor.setChooserColor(opened) - arrowChangeRecordTypeColor.apply { - if (opened) rotateDown() else rotateUp() - } - - inputChangeRecordTypeName.isVisible = !opened - fieldChangeRecordTypeIcon.isVisible = !opened - fieldChangeRecordTypeCategory.isVisible = !opened - containerChangeRecordTypeGoalTime.isVisible = !opened - } - flipIconChooser.observe { opened -> - containerChangeRecordTypeIcon.isVisible = opened - fieldChangeRecordTypeIcon.setChooserColor(opened) - arrowChangeRecordTypeIcon.apply { - if (opened) rotateDown() else rotateUp() - } - - inputChangeRecordTypeName.isVisible = !opened - fieldChangeRecordTypeColor.isVisible = !opened - fieldChangeRecordTypeCategory.isVisible = !opened - containerChangeRecordTypeGoalTime.isVisible = !opened - } - flipCategoryChooser.observe { opened -> - rvChangeRecordTypeCategories.isVisible = opened - fieldChangeRecordTypeCategory.setChooserColor(opened) - arrowChangeRecordTypeCategory.apply { - if (opened) rotateDown() else rotateUp() - } - - inputChangeRecordTypeName.isVisible = !opened - fieldChangeRecordTypeColor.isVisible = !opened - fieldChangeRecordTypeIcon.isVisible = !opened - containerChangeRecordTypeGoalTime.isVisible = !opened - } + chooserState.observe(::updateChooserState) keyboardVisibility.observe { visible -> if (visible) showKeyboard(etChangeRecordTypeName) else hideKeyboard() } @@ -300,6 +272,46 @@ class ChangeRecordTypeFragment : } } + private fun updateChooserState(state: ChangeRecordTypeChooserState) = with(binding) { + updateChooser( + opened = state is Color, + chooserData = rvChangeRecordTypeColor, + chooserView = fieldChangeRecordTypeColor, + chooserArrow = arrowChangeRecordTypeColor + ) + updateChooser( + opened = state is Icon, + chooserData = containerChangeRecordTypeIcon, + chooserView = fieldChangeRecordTypeIcon, + chooserArrow = arrowChangeRecordTypeIcon + ) + updateChooser( + opened = state is Category, + chooserData = rvChangeRecordTypeCategories, + chooserView = fieldChangeRecordTypeCategory, + chooserArrow = arrowChangeRecordTypeCategory + ) + + inputChangeRecordTypeName.isVisible = state is Closed + containerChangeRecordTypeGoalTime.isVisible = state is Closed + fieldChangeRecordTypeColor.isVisible = state is Closed || state is Color + fieldChangeRecordTypeIcon.isVisible = state is Closed || state is Icon + fieldChangeRecordTypeCategory.isVisible = state is Closed || state is Category + } + + private fun updateChooser( + opened: Boolean, + chooserData: View, + chooserView: CardView, + chooserArrow: View, + ) { + chooserData.isVisible = opened + chooserView.setChooserColor(opened) + chooserArrow.apply { + if (opened) rotateDown() else rotateUp() + } + } + private fun updateIconsState(state: ChangeRecordTypeIconStateViewData) = with(binding) { when (state) { is ChangeRecordTypeIconStateViewData.Icons -> { diff --git a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewData/ChangeRecordTypeChooserState.kt b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewData/ChangeRecordTypeChooserState.kt new file mode 100644 index 00000000..cba2e342 --- /dev/null +++ b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewData/ChangeRecordTypeChooserState.kt @@ -0,0 +1,8 @@ +package com.example.util.simpletimetracker.feature_change_record_type.viewData + +sealed interface ChangeRecordTypeChooserState { + object Closed: ChangeRecordTypeChooserState + object Color : ChangeRecordTypeChooserState + object Icon : ChangeRecordTypeChooserState + object Category : ChangeRecordTypeChooserState +} diff --git a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewModel/ChangeRecordTypeViewModel.kt b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewModel/ChangeRecordTypeViewModel.kt index 23c28532..2c2ff22b 100644 --- a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewModel/ChangeRecordTypeViewModel.kt +++ b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewModel/ChangeRecordTypeViewModel.kt @@ -15,8 +15,6 @@ import com.example.util.simpletimetracker.core.mapper.IconEmojiMapper import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper import com.example.util.simpletimetracker.core.repo.ResourceRepo import com.example.util.simpletimetracker.core.view.buttonsRowView.ButtonsRowViewData -import com.example.util.simpletimetracker.domain.extension.flip -import com.example.util.simpletimetracker.domain.extension.orTrue import com.example.util.simpletimetracker.domain.extension.orZero import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTypeCategoryInteractor @@ -33,6 +31,7 @@ import com.example.util.simpletimetracker.feature_base_adapter.recordType.Record import com.example.util.simpletimetracker.feature_change_record_type.R import com.example.util.simpletimetracker.feature_change_record_type.interactor.ChangeRecordTypeViewDataInteractor import com.example.util.simpletimetracker.feature_change_record_type.mapper.ChangeRecordTypeMapper +import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconCategoryInfoViewData import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconCategoryViewData import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconStateViewData @@ -116,9 +115,7 @@ class ChangeRecordTypeViewModel @Inject constructor( initial } } - val flipColorChooser: LiveData = MutableLiveData() - val flipIconChooser: LiveData = MutableLiveData() - val flipCategoryChooser: LiveData = MutableLiveData() + val chooserState: LiveData = MutableLiveData(ChangeRecordTypeChooserState.Closed) val deleteButtonEnabled: LiveData = MutableLiveData(true) val saveButtonEnabled: LiveData = MutableLiveData(true) val deleteIconVisibility: LiveData by lazy { MutableLiveData(recordTypeId != 0L) } @@ -151,39 +148,15 @@ class ChangeRecordTypeViewModel @Inject constructor( } fun onColorChooserClick() { - keyboardVisibility.set(false) - flipColorChooser.set(flipColorChooser.value?.flip().orTrue()) - - if (flipIconChooser.value == true) { - flipIconChooser.set(false) - } - if (flipCategoryChooser.value == true) { - flipCategoryChooser.set(false) - } + onNewChooserState(ChangeRecordTypeChooserState.Color) } fun onIconChooserClick() { - keyboardVisibility.set(false) - flipIconChooser.set(flipIconChooser.value?.flip().orTrue()) - - if (flipColorChooser.value == true) { - flipColorChooser.set(false) - } - if (flipCategoryChooser.value == true) { - flipCategoryChooser.set(false) - } + onNewChooserState(ChangeRecordTypeChooserState.Icon) } fun onCategoryChooserClick() { - keyboardVisibility.set(false) - flipCategoryChooser.set(flipCategoryChooser.value?.flip().orTrue()) - - if (flipColorChooser.value == true) { - flipColorChooser.set(false) - } - if (flipIconChooser.value == true) { - flipIconChooser.set(false) - } + onNewChooserState(ChangeRecordTypeChooserState.Category) } fun onColorClick(item: ColorViewData) { @@ -374,6 +347,15 @@ class ChangeRecordTypeViewModel @Inject constructor( iconsScrollPosition.set(ChangeRecordTypeScrollViewData.NoScroll) } + private fun onNewChooserState(newState: ChangeRecordTypeChooserState) { + keyboardVisibility.set(false) + if (chooserState.value == newState) { + chooserState.set(ChangeRecordTypeChooserState.Closed) + } else { + chooserState.set(newState) + } + } + private fun openEmojiSelectionDialog(item: EmojiViewData) { val params = changeRecordTypeMapper.mapEmojiSelectionParams( color = newColor, -- 2.51.2