From 38c59a63601f1c2481f61ca2da063ed4fb904700 Mon Sep 17 00:00:00 2001 From: razeeman Date: Sun, 16 Apr 2023 10:29:05 +0300 Subject: [PATCH] add comment change to data edit --- .../DataEditTypeSelectionDialogFragment.kt | 6 ++ .../DataEditTypeSelectionDialogListener.kt | 1 + .../interactor/DateEditChangeInteractor.kt | 36 +++++++---- .../interactor/DateEditViewDataInteractor.kt | 11 +++- .../model/DataEditChangeCommentState.kt | 7 +++ .../view/DataEditFragment.kt | 33 ++++++++++ .../viewModel/DataEditViewModel.kt | 62 ++++++++++++++----- .../main/res/layout/data_edit_fragment.xml | 21 +++++++ 8 files changed, 148 insertions(+), 29 deletions(-) create mode 100644 features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/model/DataEditChangeCommentState.kt diff --git a/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/dialog/DataEditTypeSelectionDialogFragment.kt b/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/dialog/DataEditTypeSelectionDialogFragment.kt index 08ea8fc7..d4782381 100644 --- a/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/dialog/DataEditTypeSelectionDialogFragment.kt +++ b/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/dialog/DataEditTypeSelectionDialogFragment.kt @@ -1,6 +1,7 @@ package com.example.util.simpletimetracker.feature_data_edit.dialog import android.content.Context +import android.content.DialogInterface import android.view.LayoutInflater import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity @@ -55,6 +56,11 @@ class DataEditTypeSelectionDialogFragment : BaseBottomSheetFragment() { } } + override fun onDismiss(dialog: DialogInterface) { + listener?.onDismissed() + super.onDismiss(dialog) + } + override fun initDialog() { setSkipCollapsed() setFullScreen() diff --git a/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/dialog/DataEditTypeSelectionDialogListener.kt b/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/dialog/DataEditTypeSelectionDialogListener.kt index 0f2b2145..f3d6c819 100644 --- a/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/dialog/DataEditTypeSelectionDialogListener.kt +++ b/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/dialog/DataEditTypeSelectionDialogListener.kt @@ -3,4 +3,5 @@ package com.example.util.simpletimetracker.feature_data_edit.dialog interface DataEditTypeSelectionDialogListener { fun onTypeSelected(typeId: Long) + fun onDismissed() } \ No newline at end of file diff --git a/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/interactor/DateEditChangeInteractor.kt b/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/interactor/DateEditChangeInteractor.kt index 75303c43..ee1c1339 100644 --- a/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/interactor/DateEditChangeInteractor.kt +++ b/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/interactor/DateEditChangeInteractor.kt @@ -6,6 +6,8 @@ import com.example.util.simpletimetracker.domain.interactor.NotificationGoalTime import com.example.util.simpletimetracker.domain.interactor.RecordInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTagInteractor import com.example.util.simpletimetracker.domain.model.RecordsFilter +import com.example.util.simpletimetracker.feature_data_edit.model.DataEditChangeActivityState +import com.example.util.simpletimetracker.feature_data_edit.model.DataEditChangeCommentState import javax.inject.Inject class DateEditChangeInteractor @Inject constructor( @@ -17,36 +19,46 @@ class DateEditChangeInteractor @Inject constructor( ) { suspend fun changeData( - newTypeId: Long?, + typeState: DataEditChangeActivityState, + commentState: DataEditChangeCommentState, filters: List ) { if (filters.isEmpty()) return - if (newTypeId == null) return + val newTypeId = (typeState as? DataEditChangeActivityState.Enabled)?.viewData?.id + val newComment = (commentState as? DataEditChangeCommentState.Enabled)?.viewData + if (newTypeId == null && newComment == null) return val records = recordFilterInteractor.getByFilter(filters) val tags = recordTagInteractor.getAll().associateBy { it.id } val oldTypeIds = mutableSetOf() + var newTagIds: List? = null records.forEach { record -> - // Remove all typed tags of previous activity. - val newTagIds = record.tagIds.filter { tagId -> - val tagTypeId = tags[tagId]?.typeId - tagTypeId == 0L || tagTypeId == newTypeId + if (newTypeId != null && record.typeId != newTypeId) { + // Remove all typed tags. + newTagIds = record.tagIds.filter { tagId -> + tags[tagId]?.typeId == 0L + } + // Save old typeId before change to update data later. + oldTypeIds.add(record.typeId) } - oldTypeIds.add(record.typeId) + // Change activity record.copy( - typeId = newTypeId, - tagIds = newTagIds + typeId = newTypeId ?: record.typeId, + comment = newComment ?: record.comment, + tagIds = newTagIds ?: record.tagIds ).let { recordInteractor.add(it) } } // Check goal time and statistics widget consistency. - oldTypeIds.forEach { typeId -> - notificationGoalTimeInteractor.checkAndReschedule(typeId) + if (newTypeId != null) { + oldTypeIds.forEach { typeId -> + notificationGoalTimeInteractor.checkAndReschedule(typeId) + } + addRecordMediator.doAfterAdd(newTypeId) } - addRecordMediator.doAfterAdd(newTypeId) } } \ No newline at end of file diff --git a/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/interactor/DateEditViewDataInteractor.kt b/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/interactor/DateEditViewDataInteractor.kt index b6a75bfa..3cc3ec2b 100644 --- a/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/interactor/DateEditViewDataInteractor.kt +++ b/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/interactor/DateEditViewDataInteractor.kt @@ -9,6 +9,7 @@ import com.example.util.simpletimetracker.domain.model.RecordsFilter import com.example.util.simpletimetracker.feature_data_edit.R import com.example.util.simpletimetracker.feature_data_edit.model.DataEditChangeActivityState import com.example.util.simpletimetracker.feature_data_edit.model.DataEditChangeButtonState +import com.example.util.simpletimetracker.feature_data_edit.model.DataEditChangeCommentState import javax.inject.Inject class DateEditViewDataInteractor @Inject constructor( @@ -38,9 +39,9 @@ class DateEditViewDataInteractor @Inject constructor( } suspend fun getChangeActivityState( - newTypeId: Long?, + newTypeId: Long, ): DataEditChangeActivityState { - val type = newTypeId?.let { recordTypeInteractor.get(it) } + val type = newTypeId.let { recordTypeInteractor.get(it) } return if (type == null) { DataEditChangeActivityState.Disabled @@ -54,6 +55,12 @@ class DateEditViewDataInteractor @Inject constructor( } } + fun getChangeCommentState( + newComment: String, + ): DataEditChangeCommentState { + return DataEditChangeCommentState.Enabled(newComment) + } + suspend fun getChangeButtonState( enabled: Boolean, ): DataEditChangeButtonState { diff --git a/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/model/DataEditChangeCommentState.kt b/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/model/DataEditChangeCommentState.kt new file mode 100644 index 00000000..3173b85d --- /dev/null +++ b/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/model/DataEditChangeCommentState.kt @@ -0,0 +1,7 @@ +package com.example.util.simpletimetracker.feature_data_edit.model + +sealed interface DataEditChangeCommentState { + + object Disabled : DataEditChangeCommentState + data class Enabled(val viewData: String) : DataEditChangeCommentState +} \ No newline at end of file diff --git a/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/view/DataEditFragment.kt b/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/view/DataEditFragment.kt index 9d91176b..d1dd965a 100644 --- a/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/view/DataEditFragment.kt +++ b/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/view/DataEditFragment.kt @@ -4,11 +4,15 @@ import android.content.res.ColorStateList import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.view.isVisible +import androidx.core.widget.doAfterTextChanged import androidx.fragment.app.viewModels import com.example.util.simpletimetracker.core.base.BaseFragment +import com.example.util.simpletimetracker.core.extension.hideKeyboard +import com.example.util.simpletimetracker.core.extension.showKeyboard import com.example.util.simpletimetracker.feature_data_edit.dialog.DataEditTypeSelectionDialogListener import com.example.util.simpletimetracker.feature_data_edit.model.DataEditChangeActivityState import com.example.util.simpletimetracker.feature_data_edit.model.DataEditChangeButtonState +import com.example.util.simpletimetracker.feature_data_edit.model.DataEditChangeCommentState import com.example.util.simpletimetracker.feature_data_edit.viewModel.DataEditViewModel import com.example.util.simpletimetracker.feature_views.extension.setOnClick import dagger.hilt.android.AndroidEntryPoint @@ -30,6 +34,8 @@ class DataEditFragment : override fun initUx() = with(binding) { checkboxDataEditChangeActivity.setOnClick(viewModel::onChangeActivityClick) + checkboxDataEditChangeComment.setOnClick(viewModel::onChangeCommentClick) + etDataEditChangeComment.doAfterTextChanged { viewModel.onCommentChange(it.toString()) } btnDataEditChange.setOnClick(throttle(viewModel::onChangeClick)) } @@ -37,7 +43,12 @@ class DataEditFragment : with(binding) { selectedRecordsCountViewData.observe(tvDataEditSelectedRecords::setText) changeActivityState.observe(::setChangeActivityState) + changeCommentState.observe(::setChangeCommentState) changeButtonState.observe(::setChangeButtonState) + keyboardVisibility.observe { visible -> + if (visible) showKeyboard(etDataEditChangeComment) + else hideKeyboard() + } } } @@ -53,6 +64,10 @@ class DataEditFragment : viewModel.onTypeSelected(typeId) } + override fun onDismissed() { + viewModel.onTypeDismissed() + } + private fun setChangeActivityState( state: DataEditChangeActivityState, ) = with(binding) { @@ -75,6 +90,24 @@ class DataEditFragment : } } + private fun setChangeCommentState( + state: DataEditChangeCommentState, + ) = with(binding) { + when (state) { + is DataEditChangeCommentState.Disabled -> { + checkboxDataEditChangeComment.isChecked = false + inputDataEditChangeComment.isVisible = false + } + is DataEditChangeCommentState.Enabled -> { + checkboxDataEditChangeComment.isChecked = true + inputDataEditChangeComment.isVisible = true + if (etDataEditChangeComment.text.toString() != state.viewData) { + etDataEditChangeComment.setText(state.viewData) + } + } + } + } + private fun setChangeButtonState( state: DataEditChangeButtonState ) = with(binding) { diff --git a/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/viewModel/DataEditViewModel.kt b/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/viewModel/DataEditViewModel.kt index 8a8acc2b..671f9519 100644 --- a/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/viewModel/DataEditViewModel.kt +++ b/features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/viewModel/DataEditViewModel.kt @@ -14,6 +14,7 @@ import com.example.util.simpletimetracker.feature_data_edit.interactor.DateEditC import com.example.util.simpletimetracker.feature_data_edit.interactor.DateEditViewDataInteractor import com.example.util.simpletimetracker.feature_data_edit.model.DataEditChangeActivityState import com.example.util.simpletimetracker.feature_data_edit.model.DataEditChangeButtonState +import com.example.util.simpletimetracker.feature_data_edit.model.DataEditChangeCommentState import com.example.util.simpletimetracker.navigation.Router import com.example.util.simpletimetracker.navigation.params.notification.SnackBarParams import com.example.util.simpletimetracker.navigation.params.screen.DataEditTypeSelectionDialogParams @@ -38,10 +39,10 @@ class DataEditViewModel @Inject constructor( } } val changeActivityState: LiveData by lazy { - MutableLiveData().let { initial -> - viewModelScope.launch { initial.value = loadChangeActivityState() } - initial - } + MutableLiveData(typeState) + } + val changeCommentState: LiveData by lazy { + MutableLiveData(commentState) } val changeButtonState: LiveData by lazy { MutableLiveData().let { initial -> @@ -49,10 +50,15 @@ class DataEditViewModel @Inject constructor( initial } } + val keyboardVisibility: LiveData = MutableLiveData(false) private var filters: List = emptyList() - private var newTypeId: Long? = null - private val changeButtonEnabled: Boolean get() = newTypeId != null + private var typeState: DataEditChangeActivityState = DataEditChangeActivityState.Disabled + private var commentState: DataEditChangeCommentState = DataEditChangeCommentState.Disabled + + private val changeButtonEnabled: Boolean + get() = typeState is DataEditChangeActivityState.Enabled || + commentState is DataEditChangeCommentState.Enabled fun onSelectRecordsClick() { router.setResultListener(FILTER_TAG) { @@ -65,25 +71,52 @@ class DataEditViewModel @Inject constructor( } fun onChangeActivityClick() { - if (newTypeId == null) { + if (typeState is DataEditChangeActivityState.Disabled) { router.navigate(DataEditTypeSelectionDialogParams) } else { - newTypeId = null + typeState = DataEditChangeActivityState.Disabled updateChangeActivityState() updateChangeButtonState() } } - fun onTypeSelected(typeId: Long) { - newTypeId = typeId + fun onTypeSelected(typeId: Long) = viewModelScope.launch { + typeState = dataEditViewDataInteractor.getChangeActivityState(typeId) updateChangeActivityState() updateChangeButtonState() } + fun onTypeDismissed() { + updateChangeActivityState() + } + + fun onChangeCommentClick() { + if (commentState is DataEditChangeCommentState.Disabled) { + commentState = dataEditViewDataInteractor.getChangeCommentState("") + } else { + commentState = DataEditChangeCommentState.Disabled + keyboardVisibility.set(false) + } + updateChangeCommentState() + updateChangeButtonState() + } + + fun onCommentChange(text: String) { + val state = commentState + if (state is DataEditChangeCommentState.Enabled && state.viewData != text) { + commentState = DataEditChangeCommentState.Enabled(text) + updateChangeCommentState() + } + } + fun onChangeClick() = viewModelScope.launch { changeButtonState.set(dataEditViewDataInteractor.getChangeButtonState(false)) dataEditRepo.inProgress.set(true) - dataEditChangeInteractor.changeData(newTypeId, filters) + dataEditChangeInteractor.changeData( + typeState = typeState, + commentState = commentState, + filters = filters + ) dataEditRepo.inProgress.set(false) showMessage(R.string.data_edit_success_message) router.back() @@ -109,12 +142,11 @@ class DataEditViewModel @Inject constructor( } private fun updateChangeActivityState() = viewModelScope.launch { - val data = loadChangeActivityState() - changeActivityState.set(data) + changeActivityState.set(typeState) } - private suspend fun loadChangeActivityState(): DataEditChangeActivityState { - return dataEditViewDataInteractor.getChangeActivityState(newTypeId) + private fun updateChangeCommentState() = viewModelScope.launch { + changeCommentState.set(commentState) } private fun updateChangeButtonState() = viewModelScope.launch { diff --git a/features/feature_data_edit/src/main/res/layout/data_edit_fragment.xml b/features/feature_data_edit/src/main/res/layout/data_edit_fragment.xml index 980e8be9..aa3d335c 100644 --- a/features/feature_data_edit/src/main/res/layout/data_edit_fragment.xml +++ b/features/feature_data_edit/src/main/res/layout/data_edit_fragment.xml @@ -173,6 +173,27 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + + +