From e5140fce0f7e4f675968c4bf97221de3a03f5d74 Mon Sep 17 00:00:00 2001 From: razeeman Date: Sun, 1 Sep 2024 10:05:44 +0300 Subject: [PATCH] add click on statistics total tracked --- .../GetStatisticsDetailRangeInteractor.kt | 36 +++++++++++ .../StatisticsDetailNavigationInteractor.kt | 23 +------ .../adapter/StatisticsInfoAdapterDelegate.kt | 24 ++++--- .../StatisticsDetailTotalNavigator.kt | 64 +++++++++++++++++++ .../view/StatisticsFragment.kt | 4 +- .../viewModel/StatisticsViewModel.kt | 16 ++++- .../view/StatisticsDetailFragment.kt | 2 +- .../params/screen/StatisticsDetailParams.kt | 20 ++++-- 8 files changed, 149 insertions(+), 40 deletions(-) create mode 100644 core/src/main/java/com/example/util/simpletimetracker/core/interactor/GetStatisticsDetailRangeInteractor.kt create mode 100644 features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/interactor/StatisticsDetailTotalNavigator.kt diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/interactor/GetStatisticsDetailRangeInteractor.kt b/core/src/main/java/com/example/util/simpletimetracker/core/interactor/GetStatisticsDetailRangeInteractor.kt new file mode 100644 index 000000000..23003302b --- /dev/null +++ b/core/src/main/java/com/example/util/simpletimetracker/core/interactor/GetStatisticsDetailRangeInteractor.kt @@ -0,0 +1,36 @@ +package com.example.util.simpletimetracker.core.interactor + +import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor +import com.example.util.simpletimetracker.domain.model.RangeLength +import com.example.util.simpletimetracker.navigation.params.screen.StatisticsDetailParams.RangeLengthParams +import javax.inject.Inject + +class GetStatisticsDetailRangeInteractor @Inject constructor( + private val prefsInteractor: PrefsInteractor, +) { + + suspend fun execute(): RangeLengthParams { + return when (val rangeLength = getRangeLength()) { + is RangeLength.Day -> RangeLengthParams.Day + is RangeLength.Week -> RangeLengthParams.Week + is RangeLength.Month -> RangeLengthParams.Month + is RangeLength.Year -> RangeLengthParams.Year + is RangeLength.All -> RangeLengthParams.All + is RangeLength.Custom -> RangeLengthParams.Custom( + start = rangeLength.range.timeStarted, + end = rangeLength.range.timeEnded, + ) + is RangeLength.Last -> RangeLengthParams.Last( + days = rangeLength.days, + ) + } + } + + private suspend fun getRangeLength(): RangeLength { + return if (prefsInteractor.getKeepStatisticsRange()) { + prefsInteractor.getStatisticsRange() + } else { + prefsInteractor.getStatisticsDetailRange() + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/interactor/StatisticsDetailNavigationInteractor.kt b/core/src/main/java/com/example/util/simpletimetracker/core/interactor/StatisticsDetailNavigationInteractor.kt index 8c4e01059..dc99464bd 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/interactor/StatisticsDetailNavigationInteractor.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/interactor/StatisticsDetailNavigationInteractor.kt @@ -9,7 +9,6 @@ import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTypeGoalInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor import com.example.util.simpletimetracker.domain.model.ChartFilterType -import com.example.util.simpletimetracker.domain.model.RangeLength import com.example.util.simpletimetracker.domain.model.RecordTypeGoal import com.example.util.simpletimetracker.domain.model.RecordsFilter import com.example.util.simpletimetracker.feature_views.viewData.RecordTypeIcon @@ -26,6 +25,7 @@ class StatisticsDetailNavigationInteractor @Inject constructor( private val categoryInteractor: CategoryInteractor, private val recordTypeInteractor: RecordTypeInteractor, private val recordTypeGoalInteractor: RecordTypeGoalInteractor, + private val getStatisticsDetailRangeInteractor: GetStatisticsDetailRangeInteractor, ) { suspend fun navigate( @@ -38,12 +38,6 @@ class StatisticsDetailNavigationInteractor @Inject constructor( itemIcon: RecordTypeIcon?, itemColor: Int, ) { - val rangeLength = if (prefsInteractor.getKeepStatisticsRange()) { - prefsInteractor.getStatisticsRange() - } else { - prefsInteractor.getStatisticsDetailRange() - } - router.navigate( data = StatisticsDetailParams( transitionName = transitionName, @@ -51,20 +45,7 @@ class StatisticsDetailNavigationInteractor @Inject constructor( filterType = filterType, selectedId = itemId, ).let(::listOf).map(RecordsFilter::toParams), - range = when (rangeLength) { - is RangeLength.Day -> StatisticsDetailParams.RangeLengthParams.Day - is RangeLength.Week -> StatisticsDetailParams.RangeLengthParams.Week - is RangeLength.Month -> StatisticsDetailParams.RangeLengthParams.Month - is RangeLength.Year -> StatisticsDetailParams.RangeLengthParams.Year - is RangeLength.All -> StatisticsDetailParams.RangeLengthParams.All - is RangeLength.Custom -> StatisticsDetailParams.RangeLengthParams.Custom( - start = rangeLength.range.timeStarted, - end = rangeLength.range.timeEnded, - ) - is RangeLength.Last -> StatisticsDetailParams.RangeLengthParams.Last( - days = rangeLength.days, - ) - }, + range = getStatisticsDetailRangeInteractor.execute(), shift = shift, preview = StatisticsDetailParams.Preview( name = itemName, diff --git a/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/adapter/StatisticsInfoAdapterDelegate.kt b/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/adapter/StatisticsInfoAdapterDelegate.kt index 53781faa2..ddbd519d3 100644 --- a/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/adapter/StatisticsInfoAdapterDelegate.kt +++ b/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/adapter/StatisticsInfoAdapterDelegate.kt @@ -1,18 +1,22 @@ package com.example.util.simpletimetracker.feature_statistics.adapter import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate +import com.example.util.simpletimetracker.feature_views.extension.setOnClick import com.example.util.simpletimetracker.feature_statistics.databinding.ItemStatisticsInfoLayoutBinding as Binding import com.example.util.simpletimetracker.feature_statistics.viewData.StatisticsInfoViewData as ViewData -fun createStatisticsInfoAdapterDelegate() = - createRecyclerBindingAdapterDelegate( - Binding::inflate, - ) { binding, item, _ -> +fun createStatisticsInfoAdapterDelegate( + onClick: () -> Unit, +) = createRecyclerBindingAdapterDelegate( + Binding::inflate, +) { binding, item, _ -> - with(binding) { - item as ViewData + with(binding) { + item as ViewData - tvStatisticsInfoName.text = item.name - tvStatisticsInfoText.text = item.text - } - } \ No newline at end of file + tvStatisticsInfoName.text = item.name + tvStatisticsInfoText.text = item.text + + root.setOnClick(onClick) + } +} \ No newline at end of file diff --git a/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/interactor/StatisticsDetailTotalNavigator.kt b/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/interactor/StatisticsDetailTotalNavigator.kt new file mode 100644 index 000000000..f3123e4f4 --- /dev/null +++ b/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/interactor/StatisticsDetailTotalNavigator.kt @@ -0,0 +1,64 @@ +package com.example.util.simpletimetracker.feature_statistics.interactor + +import com.example.util.simpletimetracker.core.extension.toParams +import com.example.util.simpletimetracker.core.interactor.GetStatisticsDetailRangeInteractor +import com.example.util.simpletimetracker.domain.interactor.CategoryInteractor +import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor +import com.example.util.simpletimetracker.domain.interactor.RecordTagInteractor +import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor +import com.example.util.simpletimetracker.domain.model.Category +import com.example.util.simpletimetracker.domain.model.ChartFilterType +import com.example.util.simpletimetracker.domain.model.RecordTag +import com.example.util.simpletimetracker.domain.model.RecordType +import com.example.util.simpletimetracker.domain.model.RecordsFilter +import com.example.util.simpletimetracker.navigation.Router +import com.example.util.simpletimetracker.navigation.params.screen.StatisticsDetailParams +import javax.inject.Inject + +class StatisticsDetailTotalNavigator @Inject constructor( + private val router: Router, + private val prefsInteractor: PrefsInteractor, + private val getStatisticsDetailRangeInteractor: GetStatisticsDetailRangeInteractor, + private val recordTypeInteractor: RecordTypeInteractor, + private val categoryInteractor: CategoryInteractor, + private val recordTagInteractor: RecordTagInteractor, +) { + + suspend fun execute( + shift: Int, + ) { + val filter = when (prefsInteractor.getChartFilterType()) { + ChartFilterType.ACTIVITY -> { + val typeIds = recordTypeInteractor.getAll() + .map(RecordType::id) + RecordsFilter.Activity(typeIds) + } + ChartFilterType.CATEGORY -> { + val categoryIds = categoryInteractor.getAll() + .map(Category::id) + val items = categoryIds + .map(RecordsFilter.CategoryItem::Categorized) + + RecordsFilter.CategoryItem.Uncategorized + RecordsFilter.Category(items) + } + ChartFilterType.RECORD_TAG -> { + val tagIds = recordTagInteractor.getAll() + .map(RecordTag::id) + val items = tagIds + .map(RecordsFilter.TagItem::Tagged) + + RecordsFilter.TagItem.Untagged + RecordsFilter.SelectedTags(items) + } + } + + val params = StatisticsDetailParams( + transitionName = "", + filter = filter.let(::listOf).map(RecordsFilter::toParams), + range = getStatisticsDetailRangeInteractor.execute(), + shift = shift, + preview = null, + ) + + router.navigate(params) + } +} \ No newline at end of file diff --git a/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/view/StatisticsFragment.kt b/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/view/StatisticsFragment.kt index dcbf80715..f8259becb 100644 --- a/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/view/StatisticsFragment.kt +++ b/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/view/StatisticsFragment.kt @@ -145,7 +145,9 @@ class StatisticsFragment : onShareClick = throttle(viewModel::onShareClick), onChartAttached = viewModel::onChartAttached, ), - createStatisticsInfoAdapterDelegate(), + createStatisticsInfoAdapterDelegate( + onClick = viewModel::onTotalClicked, + ), createStatisticsAdapterDelegate( onItemClick = throttle(viewModel::onItemClick), ), diff --git a/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/viewModel/StatisticsViewModel.kt b/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/viewModel/StatisticsViewModel.kt index 90ec6ac23..dbf6173db 100644 --- a/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/viewModel/StatisticsViewModel.kt +++ b/features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/viewModel/StatisticsViewModel.kt @@ -16,6 +16,7 @@ import com.example.util.simpletimetracker.feature_base_adapter.loader.LoaderView import com.example.util.simpletimetracker.feature_base_adapter.statistics.StatisticsViewData import com.example.util.simpletimetracker.feature_base_adapter.statisticsGoal.StatisticsGoalViewData import com.example.util.simpletimetracker.feature_statistics.extra.StatisticsExtra +import com.example.util.simpletimetracker.feature_statistics.interactor.StatisticsDetailTotalNavigator import com.example.util.simpletimetracker.feature_statistics.interactor.StatisticsViewDataInteractor import com.example.util.simpletimetracker.navigation.Router import com.example.util.simpletimetracker.navigation.params.screen.ChartFilterDialogParams @@ -34,6 +35,7 @@ class StatisticsViewModel @Inject constructor( private val sharingInteractor: SharingInteractor, private val prefsInteractor: PrefsInteractor, private val statisticsDetailNavigationInteractor: StatisticsDetailNavigationInteractor, + private val statisticsDetailTotalNavigator: StatisticsDetailTotalNavigator, ) : ViewModel() { var extra: StatisticsExtra? = null @@ -100,7 +102,7 @@ class StatisticsViewModel @Inject constructor( statisticsDetailNavigationInteractor.navigate( transitionName = item.transitionName, filterType = prefsInteractor.getChartFilterType(), - shift = if (prefsInteractor.getKeepStatisticsRange()) shift else 0, + shift = getShift(), sharedElements = sharedElements, itemId = item.id, itemName = item.name, @@ -112,7 +114,13 @@ class StatisticsViewModel @Inject constructor( fun onGoalClick(item: StatisticsGoalViewData) = viewModelScope.launch { statisticsDetailNavigationInteractor.navigateByGoal( goalId = item.id, - shift = if (prefsInteractor.getKeepStatisticsRange()) shift else 0, + shift = getShift(), + ) + } + + fun onTotalClicked() = viewModelScope.launch { + statisticsDetailTotalNavigator.execute( + shift = getShift(), ) } @@ -132,6 +140,10 @@ class StatisticsViewModel @Inject constructor( } } + private suspend fun getShift(): Int { + return if (prefsInteractor.getKeepStatisticsRange()) shift else 0 + } + private fun updateAnimateChartParticles() { val shouldAnimate = isVisible && isChartAttached && !isTabScrolling && !isChartFilterOpened animateChartParticles.set(shouldAnimate) diff --git a/features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/view/StatisticsDetailFragment.kt b/features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/view/StatisticsDetailFragment.kt index cac985517..69f743803 100644 --- a/features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/view/StatisticsDetailFragment.kt +++ b/features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/view/StatisticsDetailFragment.kt @@ -81,7 +81,7 @@ class StatisticsDetailFragment : ) } private val params: StatisticsDetailParams by fragmentArgumentDelegate( - key = ARGS_PARAMS, default = StatisticsDetailParams(), + key = ARGS_PARAMS, default = StatisticsDetailParams.Empty, ) override fun initUi(): Unit = with(binding) { diff --git a/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/StatisticsDetailParams.kt b/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/StatisticsDetailParams.kt index 159caa7fa..13611e476 100644 --- a/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/StatisticsDetailParams.kt +++ b/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/StatisticsDetailParams.kt @@ -6,11 +6,11 @@ import kotlinx.parcelize.Parcelize @Parcelize data class StatisticsDetailParams( - val transitionName: String = "", - val filter: List = emptyList(), - val range: RangeLengthParams = RangeLengthParams.All, - val shift: Int = 0, - val preview: Preview? = null, + val transitionName: String, + val filter: List, + val range: RangeLengthParams, + val shift: Int, + val preview: Preview?, ) : Parcelable, ScreenParams { @Parcelize @@ -42,4 +42,14 @@ data class StatisticsDetailParams( @Parcelize data class Last(val days: Int) : RangeLengthParams() } + + companion object { + val Empty = StatisticsDetailParams( + transitionName = "", + filter = emptyList(), + range = RangeLengthParams.All, + shift = 0, + preview = null, + ) + } } \ No newline at end of file