From b7ebb4fd2cfadd82f2d45db1403eaefe62ee52ed Mon Sep 17 00:00:00 2001 From: razeeman Date: Sat, 10 Aug 2024 21:43:31 +0300 Subject: [PATCH] refactor record actions delegates --- .../ChangeRecordActionsDelegateMapper.kt | 201 ++++++++++++++++++ .../ChangeRecordActionsAdjustDelegate.kt | 14 +- .../ChangeRecordActionsContinueDelegate.kt | 6 +- .../viewModel/ChangeRecordActionsDelegate.kt | 81 +++++++ .../ChangeRecordActionsDelegateBase.kt | 28 --- .../ChangeRecordActionsDelegateHolder.kt | 89 ++++++++ .../ChangeRecordActionsDelegateImpl.kt | 171 +++------------ .../ChangeRecordActionsDuplicateDelegate.kt | 2 + .../ChangeRecordActionsMergeDelegate.kt | 7 +- .../ChangeRecordActionsRepeatDelegate.kt | 2 + .../ChangeRecordActionsSplitDelegate.kt | 8 +- .../viewModel/ChangeRecordBaseViewModel.kt | 117 ++++------ 12 files changed, 466 insertions(+), 260 deletions(-) create mode 100644 features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/mapper/ChangeRecordActionsDelegateMapper.kt create mode 100644 features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegate.kt delete mode 100644 features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegateBase.kt create mode 100644 features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegateHolder.kt diff --git a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/mapper/ChangeRecordActionsDelegateMapper.kt b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/mapper/ChangeRecordActionsDelegateMapper.kt new file mode 100644 index 000000000..c820eb4c9 --- /dev/null +++ b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/mapper/ChangeRecordActionsDelegateMapper.kt @@ -0,0 +1,201 @@ +package com.example.util.simpletimetracker.feature_change_record.mapper + +import com.example.util.simpletimetracker.feature_change_record.viewModel.ChangeRecordActionsAdjustDelegate +import com.example.util.simpletimetracker.feature_change_record.viewModel.ChangeRecordActionsContinueDelegate +import com.example.util.simpletimetracker.feature_change_record.viewModel.ChangeRecordActionsDelegate +import com.example.util.simpletimetracker.feature_change_record.viewModel.ChangeRecordActionsDelegate.Parent.ViewDataParams +import com.example.util.simpletimetracker.feature_change_record.viewModel.ChangeRecordActionsDuplicateDelegate +import com.example.util.simpletimetracker.feature_change_record.viewModel.ChangeRecordActionsMergeDelegate +import com.example.util.simpletimetracker.feature_change_record.viewModel.ChangeRecordActionsRepeatDelegate +import com.example.util.simpletimetracker.feature_change_record.viewModel.ChangeRecordActionsSplitDelegate +import javax.inject.Inject + +class ChangeRecordActionsDelegateMapper @Inject constructor() { + + fun getSplitDelegateParent( + parent: ChangeRecordActionsDelegate.Parent?, + updateViewData: () -> Unit, + ): ChangeRecordActionsSplitDelegate.Parent { + return object : ChangeRecordActionsSplitDelegate.Parent { + override fun getViewDataParams(): ChangeRecordActionsSplitDelegate.Parent.ViewDataParams? { + return parent?.getViewDataParams()?.mapSplitParams() + } + + override fun update() { + updateViewData() + } + + override suspend fun onSplitComplete() { + parent?.onSplitComplete() + } + } + } + + fun getAdjustDelegateParent( + parent: ChangeRecordActionsDelegate.Parent?, + updateViewData: () -> Unit, + ): ChangeRecordActionsAdjustDelegate.Parent { + return object : ChangeRecordActionsAdjustDelegate.Parent { + override fun getViewDataParams(): ChangeRecordActionsAdjustDelegate.Parent.ViewDataParams? { + return parent?.getViewDataParams()?.mapAdjustParams() + } + + override fun update() { + updateViewData() + } + + override suspend fun onAdjustComplete() { + parent?.onSaveClickDelegate() + } + } + } + + fun getContinueActionsDelegateParent( + parent: ChangeRecordActionsDelegate.Parent?, + updateViewData: () -> Unit, + ): ChangeRecordActionsContinueDelegate.Parent { + return object : ChangeRecordActionsContinueDelegate.Parent { + override fun getViewDataParams(): ChangeRecordActionsContinueDelegate.Parent.ViewDataParams? { + return parent?.getViewDataParams()?.mapContinueParams() + } + + override fun update() { + updateViewData() + } + + override suspend fun onSaveClickDelegate() { + parent?.onSaveClickDelegate() + } + + override fun showMessage(stringResId: Int) { + parent?.showMessage(stringResId) + } + } + } + + fun getRepeatActionsDelegateParent( + parent: ChangeRecordActionsDelegate.Parent?, + updateViewData: () -> Unit, + ): ChangeRecordActionsRepeatDelegate.Parent { + return object : ChangeRecordActionsRepeatDelegate.Parent { + override fun getViewDataParams(): ChangeRecordActionsRepeatDelegate.Parent.ViewDataParams? { + return parent?.getViewDataParams()?.mapRepeatParams() + } + + override fun update() { + updateViewData() + } + + override suspend fun onSaveClickDelegate() { + parent?.onSaveClickDelegate() + } + } + } + + fun getDuplicateActionsDelegateParent( + parent: ChangeRecordActionsDelegate.Parent?, + updateViewData: () -> Unit, + ): ChangeRecordActionsDuplicateDelegate.Parent { + return object : ChangeRecordActionsDuplicateDelegate.Parent { + override fun getViewDataParams(): ChangeRecordActionsDuplicateDelegate.Parent.ViewDataParams? { + return parent?.getViewDataParams()?.mapDuplicateParams() + } + + override fun update() { + updateViewData() + } + + override suspend fun onSaveClickDelegate() { + parent?.onSaveClickDelegate() + } + } + } + + fun getMergeDelegateParent( + parent: ChangeRecordActionsDelegate.Parent?, + updateViewData: () -> Unit, + ): ChangeRecordActionsMergeDelegate.Parent { + return object : ChangeRecordActionsMergeDelegate.Parent { + override fun getViewDataParams(): ChangeRecordActionsMergeDelegate.Parent.ViewDataParams? { + return parent?.getViewDataParams()?.mapMergeParams() + } + + override fun update() { + updateViewData() + } + } + } + + private fun ViewDataParams.mapSplitParams(): ChangeRecordActionsSplitDelegate.Parent.ViewDataParams { + return ChangeRecordActionsSplitDelegate.Parent.ViewDataParams( + newTimeSplit = splitParams.newTimeSplit, + newTypeId = baseParams.newTypeId, + newTimeStarted = baseParams.newTimeStarted, + splitPreviewTimeEnded = splitParams.splitPreviewTimeEnded, + newComment = baseParams.newComment, + newCategoryIds = baseParams.newCategoryIds, + showTimeEndedOnSplitPreview = splitParams.showTimeEndedOnSplitPreview, + isButtonEnabled = baseParams.isButtonEnabled, + ) + } + + private fun ViewDataParams.mapAdjustParams(): ChangeRecordActionsAdjustDelegate.Parent.ViewDataParams { + return ChangeRecordActionsAdjustDelegate.Parent.ViewDataParams( + originalRecordId = adjustParams.originalRecordId, + adjustNextRecordAvailable = adjustParams.adjustNextRecordAvailable, + newTypeId = baseParams.newTypeId, + newTimeStarted = baseParams.newTimeStarted, + newTimeEnded = baseParams.newTimeEnded, + adjustPreviewTimeEnded = adjustParams.adjustPreviewTimeEnded, + originalTypeId = adjustParams.originalTypeId, + originalTimeStarted = adjustParams.originalTimeStarted, + adjustPreviewOriginalTimeEnded = adjustParams.adjustPreviewOriginalTimeEnded, + showTimeEndedOnAdjustPreview = adjustParams.showTimeEndedOnAdjustPreview, + isTimeEndedAvailable = adjustParams.isTimeEndedAvailable, + isButtonEnabled = baseParams.isButtonEnabled, + ) + } + + private fun ViewDataParams.mapContinueParams(): ChangeRecordActionsContinueDelegate.Parent.ViewDataParams { + return ChangeRecordActionsContinueDelegate.Parent.ViewDataParams( + originalRecordId = continueParams.originalRecordId, + newTypeId = baseParams.newTypeId, + newTimeStarted = baseParams.newTimeStarted, + newComment = baseParams.newComment, + newCategoryIds = baseParams.newCategoryIds, + isAdditionalActionsAvailable = continueParams.isAdditionalActionsAvailable, + isButtonEnabled = baseParams.isButtonEnabled, + ) + } + + private fun ViewDataParams.mapRepeatParams(): ChangeRecordActionsRepeatDelegate.Parent.ViewDataParams { + return ChangeRecordActionsRepeatDelegate.Parent.ViewDataParams( + newTypeId = baseParams.newTypeId, + newComment = baseParams.newComment, + newCategoryIds = baseParams.newCategoryIds, + isAdditionalActionsAvailable = repeatParams.isAdditionalActionsAvailable, + isButtonEnabled = baseParams.isButtonEnabled, + ) + } + + private fun ViewDataParams.mapDuplicateParams(): ChangeRecordActionsDuplicateDelegate.Parent.ViewDataParams { + return ChangeRecordActionsDuplicateDelegate.Parent.ViewDataParams( + newTypeId = baseParams.newTypeId, + newTimeStarted = baseParams.newTimeStarted, + newTimeEnded = baseParams.newTimeEnded, + newComment = baseParams.newComment, + newCategoryIds = baseParams.newCategoryIds, + isAdditionalActionsAvailable = duplicateParams.isAdditionalActionsAvailable, + isButtonEnabled = baseParams.isButtonEnabled, + ) + } + + private fun ViewDataParams.mapMergeParams(): ChangeRecordActionsMergeDelegate.Parent.ViewDataParams { + return ChangeRecordActionsMergeDelegate.Parent.ViewDataParams( + mergeAvailable = mergeParams.mergeAvailable, + prevRecord = mergeParams.prevRecord, + newTimeEnded = baseParams.newTimeEnded, + isButtonEnabled = baseParams.isButtonEnabled, + ) + } +} \ No newline at end of file diff --git a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsAdjustDelegate.kt b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsAdjustDelegate.kt index d6784f324..af85c0879 100644 --- a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsAdjustDelegate.kt +++ b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsAdjustDelegate.kt @@ -96,15 +96,15 @@ class ChangeRecordActionsAdjustDelegate @Inject constructor( }.let(resourceRepo::getString) result += HintViewData(hintText) val state = loadViewData( - recordId = params.recordId, + recordId = params.originalRecordId, adjustNextRecordAvailable = params.adjustNextRecordAvailable, newTypeId = params.newTypeId, newTimeStarted = params.newTimeStarted, adjustPreviewTimeEnded = params.adjustPreviewTimeEnded, originalTypeId = params.originalTypeId, originalTimeStarted = params.originalTimeStarted, - originalTimeEnded = params.originalTimeEnded, - showTimeEnded = params.showTimeEnded, + originalTimeEnded = params.adjustPreviewOriginalTimeEnded, + showTimeEnded = params.showTimeEndedOnAdjustPreview, ) val previewData = state.currentData result += ChangeRecordChangePreviewViewData( @@ -153,7 +153,7 @@ class ChangeRecordActionsAdjustDelegate @Inject constructor( val params = parent?.getViewDataParams() ?: return val adjacentRecords = getAdjacentRecords( - recordId = params.recordId, + recordId = params.originalRecordId, newTimeStarted = params.newTimeStarted, newTimeEnded = params.newTimeEnded, adjustNextRecordAvailable = params.adjustNextRecordAvailable, @@ -440,7 +440,7 @@ class ChangeRecordActionsAdjustDelegate @Inject constructor( suspend fun onAdjustComplete() data class ViewDataParams( - val recordId: Long, + val originalRecordId: Long, val adjustNextRecordAvailable: Boolean, val newTypeId: Long, val newTimeStarted: Long, @@ -448,8 +448,8 @@ class ChangeRecordActionsAdjustDelegate @Inject constructor( val adjustPreviewTimeEnded: Long, val originalTypeId: Long, val originalTimeStarted: Long, - val originalTimeEnded: Long, - val showTimeEnded: Boolean, + val adjustPreviewOriginalTimeEnded: Long, + val showTimeEndedOnAdjustPreview: Boolean, val isTimeEndedAvailable: Boolean, val isButtonEnabled: Boolean, ) diff --git a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsContinueDelegate.kt b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsContinueDelegate.kt index e4856a554..0b531f59d 100644 --- a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsContinueDelegate.kt +++ b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsContinueDelegate.kt @@ -35,7 +35,7 @@ class ChangeRecordActionsContinueDelegate @Inject constructor( suspend fun onContinueClickDelegate() { val params = parent?.getViewDataParams() ?: return recordActionContinueMediator.execute( - recordId = params.recordId, + recordId = params.originalRecordId, typeId = params.newTypeId, timeStarted = params.newTimeStarted, comment = params.newComment, @@ -60,6 +60,7 @@ class ChangeRecordActionsContinueDelegate @Inject constructor( private fun loadContinueViewData(): List { val params = parent?.getViewDataParams() ?: return emptyList() + if (!params.isAdditionalActionsAvailable) return emptyList() val result = mutableListOf() result += HintViewData( @@ -83,11 +84,12 @@ class ChangeRecordActionsContinueDelegate @Inject constructor( fun showMessage(stringResId: Int) data class ViewDataParams( - val recordId: Long, + val originalRecordId: Long, val newTypeId: Long, val newTimeStarted: Long, val newComment: String, val newCategoryIds: List, + val isAdditionalActionsAvailable: Boolean, val isButtonEnabled: Boolean, ) } diff --git a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegate.kt b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegate.kt new file mode 100644 index 000000000..9e09ff61e --- /dev/null +++ b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegate.kt @@ -0,0 +1,81 @@ +package com.example.util.simpletimetracker.feature_change_record.viewModel + +import androidx.lifecycle.LiveData +import com.example.util.simpletimetracker.domain.model.Record +import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType + +interface ChangeRecordActionsDelegate { + val actionsViewData: LiveData> + + interface Parent { + fun getViewDataParams(): ViewDataParams + + fun updateViewData() + + fun onRecordChangeButtonClick( + onProceed: suspend () -> Unit, + checkTypeSelected: Boolean = true, + ) + + suspend fun onSaveClickDelegate() + + suspend fun onSplitComplete() + + fun showMessage(stringResId: Int) + + data class ViewDataParams( + val baseParams: BaseParams, + val splitParams: SplitParams, + val duplicateParams: DuplicateParams, + val continueParams: ContinueParams, + val repeatParams: RepeatParams, + val adjustParams: AdjustParams, + val mergeParams: MergeParams, + ) { + + data class BaseParams( + val newTypeId: Long, + val newTimeStarted: Long, + val newTimeEnded: Long, + val newComment: String, + val newCategoryIds: List, + val isButtonEnabled: Boolean, + ) + + data class SplitParams( + val newTimeSplit: Long, + val splitPreviewTimeEnded: Long, + val showTimeEndedOnSplitPreview: Boolean, + ) + + data class DuplicateParams( + val isAdditionalActionsAvailable: Boolean, + ) + + data class ContinueParams( + val originalRecordId: Long, + val isAdditionalActionsAvailable: Boolean, + ) + + data class RepeatParams( + val isAdditionalActionsAvailable: Boolean, + ) + + data class AdjustParams( + val originalRecordId: Long, + val originalTypeId: Long, + val originalTimeStarted: Long, + val adjustNextRecordAvailable: Boolean, + val adjustPreviewTimeEnded: Long, + val adjustPreviewOriginalTimeEnded: Long, + val showTimeEndedOnAdjustPreview: Boolean, + val isTimeEndedAvailable: Boolean, + ) + + data class MergeParams( + val mergeAvailable: Boolean, + val prevRecord: Record?, + ) + } + } +} \ No newline at end of file diff --git a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegateBase.kt b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegateBase.kt deleted file mode 100644 index d1ed0e8d2..000000000 --- a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegateBase.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.example.util.simpletimetracker.feature_change_record.viewModel - -import androidx.lifecycle.LiveData -import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType - -interface ChangeRecordActionsDelegateBase { - val actionsViewData: LiveData> - - interface Parent { - fun getSplitViewDataParams(): ChangeRecordActionsSplitDelegate.Parent.ViewDataParams - fun getAdjustViewDataParams(): ChangeRecordActionsAdjustDelegate.Parent.ViewDataParams - fun getContinueViewDataParams(): ChangeRecordActionsContinueDelegate.Parent.ViewDataParams? - fun getRepeatViewDataParams(): ChangeRecordActionsRepeatDelegate.Parent.ViewDataParams? - fun getDuplicateViewDataParams(): ChangeRecordActionsDuplicateDelegate.Parent.ViewDataParams? - fun getMergeViewDataParams(): ChangeRecordActionsMergeDelegate.Parent.ViewDataParams - - fun onRecordChangeButtonClick( - onProceed: suspend () -> Unit, - checkTypeSelected: Boolean = true, - ) - - suspend fun onSaveClickDelegate() - - suspend fun onSplitComplete() - - fun showMessage(stringResId: Int) - } -} \ No newline at end of file diff --git a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegateHolder.kt b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegateHolder.kt new file mode 100644 index 000000000..074258491 --- /dev/null +++ b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegateHolder.kt @@ -0,0 +1,89 @@ +package com.example.util.simpletimetracker.feature_change_record.viewModel + +import com.example.util.simpletimetracker.feature_change_record.mapper.ChangeRecordActionsDelegateMapper +import javax.inject.Inject + +class ChangeRecordActionsDelegateHolder @Inject constructor( + val mergeDelegate: ChangeRecordActionsMergeDelegate, + val splitDelegate: ChangeRecordActionsSplitDelegate, + val adjustDelegate: ChangeRecordActionsAdjustDelegate, + val continueDelegate: ChangeRecordActionsContinueDelegate, + val repeatDelegate: ChangeRecordActionsRepeatDelegate, + val duplicateDelegate: ChangeRecordActionsDuplicateDelegate, + private val changeRecordActionsDelegateMapper: ChangeRecordActionsDelegateMapper, +) { + + val delegatesList = listOf( + splitDelegate, + adjustDelegate, + continueDelegate, + repeatDelegate, + duplicateDelegate, + mergeDelegate, + ) + + fun attach( + parent: ChangeRecordActionsDelegate.Parent, + ) { + splitDelegate.attach(getSplitDelegateParent(parent)) + adjustDelegate.attach(getAdjustDelegateParent(parent)) + continueDelegate.attach(getContinueActionsDelegateParent(parent)) + repeatDelegate.attach(getRepeatActionsDelegateParent(parent)) + duplicateDelegate.attach(getDuplicateActionsDelegateParent(parent)) + mergeDelegate.attach(getMergeDelegateParent(parent)) + } + + private fun getSplitDelegateParent( + parent: ChangeRecordActionsDelegate.Parent, + ): ChangeRecordActionsSplitDelegate.Parent { + return changeRecordActionsDelegateMapper.getSplitDelegateParent( + parent = parent, + updateViewData = parent::updateViewData, + ) + } + + private fun getAdjustDelegateParent( + parent: ChangeRecordActionsDelegate.Parent, + ): ChangeRecordActionsAdjustDelegate.Parent { + return changeRecordActionsDelegateMapper.getAdjustDelegateParent( + parent = parent, + updateViewData = parent::updateViewData, + ) + } + + private fun getContinueActionsDelegateParent( + parent: ChangeRecordActionsDelegate.Parent, + ): ChangeRecordActionsContinueDelegate.Parent { + return changeRecordActionsDelegateMapper.getContinueActionsDelegateParent( + parent = parent, + updateViewData = parent::updateViewData, + ) + } + + private fun getRepeatActionsDelegateParent( + parent: ChangeRecordActionsDelegate.Parent, + ): ChangeRecordActionsRepeatDelegate.Parent { + return changeRecordActionsDelegateMapper.getRepeatActionsDelegateParent( + parent = parent, + updateViewData = parent::updateViewData, + ) + } + + private fun getDuplicateActionsDelegateParent( + parent: ChangeRecordActionsDelegate.Parent, + ): ChangeRecordActionsDuplicateDelegate.Parent { + return changeRecordActionsDelegateMapper.getDuplicateActionsDelegateParent( + parent = parent, + updateViewData = parent::updateViewData, + ) + } + + private fun getMergeDelegateParent( + parent: ChangeRecordActionsDelegate.Parent, + ): ChangeRecordActionsMergeDelegate.Parent { + return changeRecordActionsDelegateMapper.getMergeDelegateParent( + parent = parent, + updateViewData = parent::updateViewData, + ) + } +} \ No newline at end of file diff --git a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegateImpl.kt b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegateImpl.kt index 047dc647d..a9032bc15 100644 --- a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegateImpl.kt +++ b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDelegateImpl.kt @@ -1,6 +1,7 @@ package com.example.util.simpletimetracker.feature_change_record.viewModel import androidx.lifecycle.LiveData +import com.example.util.simpletimetracker.core.base.ScopeHolder import com.example.util.simpletimetracker.core.base.ViewModelDelegate import com.example.util.simpletimetracker.core.extension.lazySuspend import com.example.util.simpletimetracker.core.extension.set @@ -9,61 +10,48 @@ import com.example.util.simpletimetracker.feature_base_adapter.divider.DividerVi import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordButtonViewData import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordChangePreviewViewData import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordTimeDoublePreviewViewData +import com.example.util.simpletimetracker.feature_change_record.mapper.ChangeRecordActionsDelegateMapper import com.example.util.simpletimetracker.feature_change_record.model.ChangeRecordActionsBlock import kotlinx.coroutines.launch import javax.inject.Inject class ChangeRecordActionsDelegateImpl @Inject constructor( - private val mergeDelegate: ChangeRecordActionsMergeDelegate, - private val splitDelegate: ChangeRecordActionsSplitDelegate, - private val adjustDelegate: ChangeRecordActionsAdjustDelegate, - private val continueDelegate: ChangeRecordActionsContinueDelegate, - private val repeatDelegate: ChangeRecordActionsRepeatDelegate, - private val duplicateDelegate: ChangeRecordActionsDuplicateDelegate, -) : ChangeRecordActionsDelegateBase, ViewModelDelegate() { + private val delegateHolder: ChangeRecordActionsDelegateHolder, +) : ChangeRecordActionsDelegate, ViewModelDelegate() { override val actionsViewData: LiveData> by lazySuspend { loadViewData() } - val timeChangeAdjustmentState get() = adjustDelegate.timeChangeAdjustmentState - - private var parent: ChangeRecordActionsDelegateBase.Parent? = null - private val delegatesList = listOf( - splitDelegate, - adjustDelegate, - continueDelegate, - repeatDelegate, - duplicateDelegate, - mergeDelegate, - ) - - init { - splitDelegate.attach(getSplitDelegateParent()) - adjustDelegate.attach(getAdjustDelegateParent()) - continueDelegate.attach(getContinueActionsDelegateParent()) - repeatDelegate.attach(getRepeatActionsDelegateParent()) - duplicateDelegate.attach(getDuplicateActionsDelegateParent()) - mergeDelegate.attach(getMergeDelegateParent()) - } + val timeChangeAdjustmentState get() = delegateHolder.adjustDelegate.timeChangeAdjustmentState + + private var parent: ChangeRecordActionsDelegate.Parent? = null - fun attach(parent: ChangeRecordActionsDelegateBase.Parent) { + fun attach(parent: ChangeRecordActionsDelegate.Parent) { this.parent = parent + delegateHolder.attach(parent) } override fun clear() { - adjustDelegate.clear() + delegateHolder.delegatesList.forEach { + (it as? ViewModelDelegate)?.clear() + } super.clear() } fun updateData() { - delegatesList.forEach { delegate -> + delegateHolder.delegatesList.forEach { delegate -> delegateScope.launch { delegate.updateViewData() } } } + fun updateViewData() { + val data = loadViewData() + actionsViewData.set(data) + } + fun onItemAdjustTimeStartedClick(data: ChangeRecordTimeDoublePreviewViewData) { when (data.block) { ChangeRecordActionsBlock.AdjustTimePreview -> - adjustDelegate.onAdjustTimeStartedClick() + delegateHolder.adjustDelegate.onAdjustTimeStartedClick() else -> { // Do nothing. } @@ -73,7 +61,7 @@ class ChangeRecordActionsDelegateImpl @Inject constructor( fun onItemAdjustTimeEndedClick(data: ChangeRecordTimeDoublePreviewViewData) { when (data.block) { ChangeRecordActionsBlock.AdjustTimePreview -> - adjustDelegate.onAdjustTimeEndedClick() + delegateHolder.adjustDelegate.onAdjustTimeEndedClick() else -> { // Do nothing. } @@ -81,7 +69,7 @@ class ChangeRecordActionsDelegateImpl @Inject constructor( } fun onChangePreviewCheckClick(item: ChangeRecordChangePreviewViewData) { - adjustDelegate.onChangePreviewCheckClick(item) + delegateHolder.adjustDelegate.onChangePreviewCheckClick(item) } fun onItemButtonClick(viewData: ChangeRecordButtonViewData) { @@ -100,32 +88,32 @@ class ChangeRecordActionsDelegateImpl @Inject constructor( private fun onAdjustClick() { parent?.onRecordChangeButtonClick( - onProceed = adjustDelegate::onAdjustClickDelegate, + onProceed = delegateHolder.adjustDelegate::onAdjustClickDelegate, ) } private fun onContinueClick() { - if (!continueDelegate.canContinue()) return + if (!delegateHolder.continueDelegate.canContinue()) return parent?.onRecordChangeButtonClick( - onProceed = continueDelegate::onContinueClickDelegate, + onProceed = delegateHolder.continueDelegate::onContinueClickDelegate, ) } private fun onRepeatClick() { parent?.onRecordChangeButtonClick( - onProceed = repeatDelegate::onRepeatClickDelegate, + onProceed = delegateHolder.repeatDelegate::onRepeatClickDelegate, ) } private fun onDuplicateClick() { parent?.onRecordChangeButtonClick( - onProceed = duplicateDelegate::onDuplicateClickDelegate, + onProceed = delegateHolder.duplicateDelegate::onDuplicateClickDelegate, ) } private fun onMergeClick() { parent?.onRecordChangeButtonClick( - onProceed = mergeDelegate::onMergeClickDelegate, + onProceed = delegateHolder.mergeDelegate::onMergeClickDelegate, checkTypeSelected = false, ) } @@ -133,20 +121,15 @@ class ChangeRecordActionsDelegateImpl @Inject constructor( private fun onSplitClick() { parent?.onRecordChangeButtonClick( onProceed = { - splitDelegate.onSplitClickDelegate() + delegateHolder.splitDelegate.onSplitClickDelegate() }, ) } - private fun updateViewData() { - val data = loadViewData() - actionsViewData.set(data) - } - private fun loadViewData(): List { val result = mutableListOf() - delegatesList.map { + delegateHolder.delegatesList.map { it.getViewData() }.forEachIndexed { index, items -> if (items.isEmpty()) return@forEachIndexed @@ -156,100 +139,4 @@ class ChangeRecordActionsDelegateImpl @Inject constructor( return result } - - private fun getSplitDelegateParent(): ChangeRecordActionsSplitDelegate.Parent { - return object : ChangeRecordActionsSplitDelegate.Parent { - override fun getViewDataParams(): ChangeRecordActionsSplitDelegate.Parent.ViewDataParams? { - return parent?.getSplitViewDataParams() - } - - override fun update() { - updateViewData() - } - - override suspend fun onSplitComplete() { - parent?.onSplitComplete() - } - } - } - - private fun getAdjustDelegateParent(): ChangeRecordActionsAdjustDelegate.Parent { - return object : ChangeRecordActionsAdjustDelegate.Parent { - override fun getViewDataParams(): ChangeRecordActionsAdjustDelegate.Parent.ViewDataParams? { - return parent?.getAdjustViewDataParams() - } - - override fun update() { - updateViewData() - } - - override suspend fun onAdjustComplete() { - parent?.onSaveClickDelegate() - } - } - } - - private fun getContinueActionsDelegateParent(): ChangeRecordActionsContinueDelegate.Parent { - return object : ChangeRecordActionsContinueDelegate.Parent { - override fun getViewDataParams(): ChangeRecordActionsContinueDelegate.Parent.ViewDataParams? { - return parent?.getContinueViewDataParams() - } - - override fun update() { - updateViewData() - } - - override suspend fun onSaveClickDelegate() { - parent?.onSaveClickDelegate() - } - - override fun showMessage(stringResId: Int) { - parent?.showMessage(stringResId) - } - } - } - - private fun getRepeatActionsDelegateParent(): ChangeRecordActionsRepeatDelegate.Parent { - return object : ChangeRecordActionsRepeatDelegate.Parent { - override fun getViewDataParams(): ChangeRecordActionsRepeatDelegate.Parent.ViewDataParams? { - return parent?.getRepeatViewDataParams() - } - - override fun update() { - updateViewData() - } - - override suspend fun onSaveClickDelegate() { - parent?.onSaveClickDelegate() - } - } - } - - private fun getDuplicateActionsDelegateParent(): ChangeRecordActionsDuplicateDelegate.Parent { - return object : ChangeRecordActionsDuplicateDelegate.Parent { - override fun getViewDataParams(): ChangeRecordActionsDuplicateDelegate.Parent.ViewDataParams? { - return parent?.getDuplicateViewDataParams() - } - - override fun update() { - updateViewData() - } - - override suspend fun onSaveClickDelegate() { - parent?.onSaveClickDelegate() - } - } - } - - private fun getMergeDelegateParent(): ChangeRecordActionsMergeDelegate.Parent { - return object : ChangeRecordActionsMergeDelegate.Parent { - override fun getViewDataParams(): ChangeRecordActionsMergeDelegate.Parent.ViewDataParams? { - return parent?.getMergeViewDataParams() - } - - override fun update() { - updateViewData() - } - } - } } \ No newline at end of file diff --git a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDuplicateDelegate.kt b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDuplicateDelegate.kt index 025443e4c..3e2fd80f9 100644 --- a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDuplicateDelegate.kt +++ b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsDuplicateDelegate.kt @@ -45,6 +45,7 @@ class ChangeRecordActionsDuplicateDelegate @Inject constructor( private fun loadDuplicateViewData(): List { val params = parent?.getViewDataParams() ?: return emptyList() + if (!params.isAdditionalActionsAvailable) return emptyList() val result = mutableListOf() result += HintViewData( @@ -72,6 +73,7 @@ class ChangeRecordActionsDuplicateDelegate @Inject constructor( val newTimeEnded: Long, val newComment: String, val newCategoryIds: List, + val isAdditionalActionsAvailable: Boolean, val isButtonEnabled: Boolean, ) } diff --git a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsMergeDelegate.kt b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsMergeDelegate.kt index aa27a3a3d..ded4771bb 100644 --- a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsMergeDelegate.kt +++ b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsMergeDelegate.kt @@ -42,10 +42,10 @@ class ChangeRecordActionsMergeDelegate @Inject constructor( private suspend fun loadViewData(): List { val params = parent?.getViewDataParams() ?: return emptyList() + if (!params.mergeAvailable) return emptyList() val result = mutableListOf() val previewData = loadMergePreviewViewData( - mergeAvailable = params.mergeAvailable, prevRecord = params.prevRecord, newTimeEnded = params.newTimeEnded, ) @@ -93,13 +93,10 @@ class ChangeRecordActionsMergeDelegate @Inject constructor( } private suspend fun loadMergePreviewViewData( - mergeAvailable: Boolean, prevRecord: Record?, newTimeEnded: Long, ): ChangeRecordPreview? { - if (!mergeAvailable || prevRecord == null) { - return null - } + if (prevRecord == null) return null val changedRecord = getChangedRecord(prevRecord, newTimeEnded) val previousRecordPreview = changeRecordViewDataInteractor diff --git a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsRepeatDelegate.kt b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsRepeatDelegate.kt index 56e3e455d..735f052ea 100644 --- a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsRepeatDelegate.kt +++ b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsRepeatDelegate.kt @@ -44,6 +44,7 @@ class ChangeRecordActionsRepeatDelegate @Inject constructor( private fun loadRepeatViewData(): List { val params = parent?.getViewDataParams() ?: return emptyList() + if (!params.isAdditionalActionsAvailable) return emptyList() val result = mutableListOf() result += HintViewData( @@ -69,6 +70,7 @@ class ChangeRecordActionsRepeatDelegate @Inject constructor( val newTypeId: Long, val newComment: String, val newCategoryIds: List, + val isAdditionalActionsAvailable: Boolean, val isButtonEnabled: Boolean, ) } diff --git a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsSplitDelegate.kt b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsSplitDelegate.kt index 84319480b..363eb46d2 100644 --- a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsSplitDelegate.kt +++ b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordActionsSplitDelegate.kt @@ -61,8 +61,8 @@ class ChangeRecordActionsSplitDelegate @Inject constructor( val newTimeSplit = params.newTimeSplit val newTypeId = params.newTypeId val newTimeStarted = params.newTimeStarted - val newTimeEnded = params.newTimeEnded - val showTimeEnded = params.showTimeEnded + val newTimeEnded = params.splitPreviewTimeEnded + val showTimeEnded = params.showTimeEndedOnSplitPreview val isButtonEnabled = params.isButtonEnabled val result = mutableListOf() @@ -163,10 +163,10 @@ class ChangeRecordActionsSplitDelegate @Inject constructor( val newTimeSplit: Long, val newTypeId: Long, val newTimeStarted: Long, - val newTimeEnded: Long, + val splitPreviewTimeEnded: Long, val newComment: String, val newCategoryIds: List, - val showTimeEnded: Boolean, + val showTimeEndedOnSplitPreview: Boolean, val isButtonEnabled: Boolean, ) } diff --git a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordBaseViewModel.kt b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordBaseViewModel.kt index 19cee0d78..0e6f66afc 100644 --- a/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordBaseViewModel.kt +++ b/features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordBaseViewModel.kt @@ -57,7 +57,7 @@ abstract class ChangeRecordBaseViewModel( private val favouriteCommentInteractor: FavouriteCommentInteractor, private val changeRecordActionsDelegate: ChangeRecordActionsDelegateImpl, ) : ViewModel(), - ChangeRecordActionsDelegateBase by changeRecordActionsDelegate { + ChangeRecordActionsDelegate by changeRecordActionsDelegate { val types: LiveData> by lazy { return@lazy MutableLiveData>().let { initial -> @@ -114,7 +114,7 @@ abstract class ChangeRecordBaseViewModel( protected var newTypeId: Long = 0 protected var newTimeEnded: Long = 0 protected var newTimeStarted: Long = 0 - protected var newTimeSplit: Long = 0 // TODO move to split action delegate + protected var newTimeSplit: Long = 0 protected var newComment: String = "" protected var newCategoryIds: MutableList = mutableListOf() protected var originalRecordId: Long = 0 @@ -575,79 +575,52 @@ abstract class ChangeRecordBaseViewModel( updateActionsData() } - private fun getActionsDelegateParent(): ChangeRecordActionsDelegateBase.Parent { - return object : ChangeRecordActionsDelegateBase.Parent { - override fun getSplitViewDataParams(): ChangeRecordActionsSplitDelegate.Parent.ViewDataParams { - return ChangeRecordActionsSplitDelegate.Parent.ViewDataParams( - newTypeId = newTypeId, - newTimeStarted = newTimeStarted, - newTimeSplit = newTimeSplit, - newTimeEnded = splitPreviewTimeEnded, - newComment = newComment, - newCategoryIds = newCategoryIds, - showTimeEnded = showTimeEndedOnSplitPreview, - isButtonEnabled = saveButtonEnabled.value.orFalse(), - ) - } - - override fun getAdjustViewDataParams(): ChangeRecordActionsAdjustDelegate.Parent.ViewDataParams { - return ChangeRecordActionsAdjustDelegate.Parent.ViewDataParams( - recordId = originalRecordId, - adjustNextRecordAvailable = adjustNextRecordAvailable, - newTypeId = newTypeId, - newTimeStarted = newTimeStarted, - newTimeEnded = newTimeEnded, - adjustPreviewTimeEnded = adjustPreviewTimeEnded, - originalTypeId = originalTypeId, - originalTimeStarted = originalTimeStarted, - originalTimeEnded = adjustPreviewOriginalTimeEnded, - showTimeEnded = showTimeEndedOnAdjustPreview, - isTimeEndedAvailable = isTimeEndedAvailable, - isButtonEnabled = saveButtonEnabled.value.orFalse(), - ) - } - - override fun getContinueViewDataParams(): ChangeRecordActionsContinueDelegate.Parent.ViewDataParams? { - if (!isAdditionalActionsAvailable) return null - return ChangeRecordActionsContinueDelegate.Parent.ViewDataParams( - recordId = originalRecordId, - newTypeId = newTypeId, - newTimeStarted = newTimeStarted, - newComment = newComment, - newCategoryIds = newCategoryIds, - isButtonEnabled = saveButtonEnabled.value.orFalse(), - ) - } - - override fun getRepeatViewDataParams(): ChangeRecordActionsRepeatDelegate.Parent.ViewDataParams? { - if (!isAdditionalActionsAvailable) return null - return ChangeRecordActionsRepeatDelegate.Parent.ViewDataParams( - newTypeId = newTypeId, - newComment = newComment, - newCategoryIds = newCategoryIds, - isButtonEnabled = saveButtonEnabled.value.orFalse(), - ) - } - - override fun getDuplicateViewDataParams(): ChangeRecordActionsDuplicateDelegate.Parent.ViewDataParams? { - if (!isAdditionalActionsAvailable) return null - return ChangeRecordActionsDuplicateDelegate.Parent.ViewDataParams( - newTypeId = newTypeId, - newTimeStarted = newTimeStarted, - newTimeEnded = newTimeEnded, - newComment = newComment, - newCategoryIds = newCategoryIds, - isButtonEnabled = saveButtonEnabled.value.orFalse(), + private fun getActionsDelegateParent(): ChangeRecordActionsDelegate.Parent { + return object : ChangeRecordActionsDelegate.Parent { + override fun getViewDataParams(): ChangeRecordActionsDelegate.Parent.ViewDataParams { + return ChangeRecordActionsDelegate.Parent.ViewDataParams( + baseParams = ChangeRecordActionsDelegate.Parent.ViewDataParams.BaseParams( + newTypeId = newTypeId, + newTimeStarted = newTimeStarted, + newTimeEnded = newTimeEnded, + newComment = newComment, + newCategoryIds = newCategoryIds, + isButtonEnabled = saveButtonEnabled.value.orFalse(), + ), + splitParams = ChangeRecordActionsDelegate.Parent.ViewDataParams.SplitParams( + newTimeSplit = newTimeSplit, + splitPreviewTimeEnded = splitPreviewTimeEnded, + showTimeEndedOnSplitPreview = showTimeEndedOnSplitPreview, + ), + duplicateParams = ChangeRecordActionsDelegate.Parent.ViewDataParams.DuplicateParams( + isAdditionalActionsAvailable = isAdditionalActionsAvailable, + ), + continueParams = ChangeRecordActionsDelegate.Parent.ViewDataParams.ContinueParams( + originalRecordId = originalRecordId, + isAdditionalActionsAvailable = isAdditionalActionsAvailable, + ), + repeatParams = ChangeRecordActionsDelegate.Parent.ViewDataParams.RepeatParams( + isAdditionalActionsAvailable = isAdditionalActionsAvailable, + ), + adjustParams = ChangeRecordActionsDelegate.Parent.ViewDataParams.AdjustParams( + originalRecordId = originalRecordId, + originalTypeId = originalTypeId, + originalTimeStarted = originalTimeStarted, + adjustNextRecordAvailable = adjustNextRecordAvailable, + adjustPreviewTimeEnded = adjustPreviewTimeEnded, + adjustPreviewOriginalTimeEnded = adjustPreviewOriginalTimeEnded, + showTimeEndedOnAdjustPreview = showTimeEndedOnAdjustPreview, + isTimeEndedAvailable = isTimeEndedAvailable, + ), + mergeParams = ChangeRecordActionsDelegate.Parent.ViewDataParams.MergeParams( + mergeAvailable = mergeAvailable, + prevRecord = prevRecord, + ) ) } - override fun getMergeViewDataParams(): ChangeRecordActionsMergeDelegate.Parent.ViewDataParams { - return ChangeRecordActionsMergeDelegate.Parent.ViewDataParams( - mergeAvailable = mergeAvailable, - prevRecord = prevRecord, - newTimeEnded = newTimeEnded, - isButtonEnabled = saveButtonEnabled.value.orFalse(), - ) + override fun updateViewData() { + changeRecordActionsDelegate.updateViewData() } override fun onRecordChangeButtonClick(