From 8b524c6687bd5eff747e0c6579e8ea29684e6b59 Mon Sep 17 00:00:00 2001 From: razeeman Date: Sun, 14 May 2023 14:06:11 +0300 Subject: [PATCH] add days of week to records filter --- .../core/extension/ViewDataExensions.kt | 2 + .../core/interactor/RecordFilterInteractor.kt | 55 ++++++++++++++++++- .../core/mapper/TimeMapper.kt | 27 +++++++++ .../extension/RecordsFilterExtensions.kt | 7 +++ .../domain/model/RecordsFilter.kt | 2 + .../recordFilter/RecordFilterViewData.kt | 1 + .../RecordsFilterDayOfWeekAdapterDelegate.kt | 21 +++++++ .../adapter/RecordsFilterDayOfWeekViewData.kt | 17 ++++++ .../RecordsFilterViewDataInteractor.kt | 24 ++++++++ .../mapper/RecordsFilterViewDataMapper.kt | 6 ++ .../view/RecordsFilterFragment.kt | 2 + .../viewModel/RecordsFilterViewModel.kt | 31 ++++++++++- .../item_records_filter_day_of_week.xml | 25 +++++++++ .../params/screen/RecordsFilterParam.kt | 4 ++ 14 files changed, 220 insertions(+), 4 deletions(-) create mode 100644 features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/adapter/RecordsFilterDayOfWeekAdapterDelegate.kt create mode 100644 features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/adapter/RecordsFilterDayOfWeekViewData.kt create mode 100644 features/feature_records_filter/src/main/res/layout/item_records_filter_day_of_week.xml diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/extension/ViewDataExensions.kt b/core/src/main/java/com/example/util/simpletimetracker/core/extension/ViewDataExensions.kt index 747193be..4e5d813a 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/extension/ViewDataExensions.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/extension/ViewDataExensions.kt @@ -45,6 +45,7 @@ fun RecordsFilterParam.toModel(): RecordsFilter { is RecordsFilterParam.SelectedTags -> RecordsFilter.SelectedTags(items.map { it.toModel() }) is RecordsFilterParam.FilteredTags -> RecordsFilter.FilteredTags(items.map { it.toModel() }) is RecordsFilterParam.ManuallyFiltered -> RecordsFilter.ManuallyFiltered(recordIds) + is RecordsFilterParam.DaysOfWeek -> RecordsFilter.DaysOfWeek(items) } } @@ -57,6 +58,7 @@ fun RecordsFilter.toParams(): RecordsFilterParam { is RecordsFilter.SelectedTags -> RecordsFilterParam.SelectedTags(items.map { it.toParams() }) is RecordsFilter.FilteredTags -> RecordsFilterParam.FilteredTags(items.map { it.toParams() }) is RecordsFilter.ManuallyFiltered -> RecordsFilterParam.ManuallyFiltered(recordIds) + is RecordsFilter.DaysOfWeek -> RecordsFilterParam.DaysOfWeek(items) } } diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/interactor/RecordFilterInteractor.kt b/core/src/main/java/com/example/util/simpletimetracker/core/interactor/RecordFilterInteractor.kt index 803961ad..3a33442a 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/interactor/RecordFilterInteractor.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/interactor/RecordFilterInteractor.kt @@ -5,6 +5,7 @@ import com.example.util.simpletimetracker.domain.extension.getAllTypeIds import com.example.util.simpletimetracker.domain.extension.getCommentItems import com.example.util.simpletimetracker.domain.extension.getComments import com.example.util.simpletimetracker.domain.extension.getDate +import com.example.util.simpletimetracker.domain.extension.getDaysOfWeek import com.example.util.simpletimetracker.domain.extension.getFilteredTags import com.example.util.simpletimetracker.domain.extension.getManuallyFilteredRecordIds import com.example.util.simpletimetracker.domain.extension.getSelectedTags @@ -18,10 +19,13 @@ import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor import com.example.util.simpletimetracker.domain.interactor.RecordInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTypeCategoryInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor +import com.example.util.simpletimetracker.domain.model.DayOfWeek import com.example.util.simpletimetracker.domain.model.Range import com.example.util.simpletimetracker.domain.model.RangeLength import com.example.util.simpletimetracker.domain.model.Record import com.example.util.simpletimetracker.domain.model.RecordsFilter +import java.util.Calendar +import java.util.concurrent.TimeUnit import javax.inject.Inject class RecordFilterInteractor @Inject constructor( @@ -56,6 +60,8 @@ class RecordFilterInteractor @Inject constructor( suspend fun getByFilter(filters: List): List { if (filters.isEmpty()) return emptyList() + val startOfDayShift = prefsInteractor.getStartOfDayShift() + val calendar: Calendar = Calendar.getInstance() val typeIds: List = when { filters.hasCategoryFilter() -> { val types = recordTypeInteractor.getAll() @@ -76,6 +82,7 @@ class RecordFilterInteractor @Inject constructor( val filteredTaggedIds: List = filteredTagItems.getTaggedIds() val filteredUntagged: Boolean = filteredTagItems.hasUntaggedItem() val manuallyFilteredIds: List = filters.getManuallyFilteredRecordIds() + val daysOfWeek: List = filters.getDaysOfWeek() // Use different queries for optimization. // TODO by tag (tagged, untagged). @@ -156,13 +163,59 @@ class RecordFilterInteractor @Inject constructor( return id in manuallyFilteredIds } + fun Record.selectedByDayOfWeek(): Boolean { + if (daysOfWeek.isEmpty()) return true + + val daysOfRecord: MutableSet = mutableSetOf() + val startDay = timeMapper.getDayOfWeek( + timestamp = timeStarted, + calendar = calendar, + startOfDayShift = startOfDayShift + ) + val endDay = timeMapper.getDayOfWeek( + timestamp = timeEnded, + calendar = calendar, + startOfDayShift = startOfDayShift + ) + daysOfRecord.add(startDay) + daysOfRecord.add(endDay) + + // Check long records. + if (timeEnded - timeStarted > dayInMillis) { + var check = true + calendar.timeInMillis = timeStarted + // Continuously add one day to time start until reach time ended. + while (check && daysOfRecord.size != 7) { + calendar.apply { + add(Calendar.DATE, 1) + if (timeInMillis < timeEnded) { + timeInMillis -= startOfDayShift + get(Calendar.DAY_OF_WEEK) + .let(timeMapper::toDayOfWeek) + .let(daysOfRecord::add) + timeInMillis += startOfDayShift + } else { + check = false + } + } + } + } + + return daysOfRecord.any { it in daysOfWeek } + } + return records.filter { record -> record.selectedByActivity() && record.selectedByComment() && record.selectedByDate() && record.selectedByTag() && !record.filteredByTag() && - !record.isManuallyFiltered() + !record.isManuallyFiltered() && + record.selectedByDayOfWeek() } } + + companion object { + private val dayInMillis = TimeUnit.DAYS.toMillis(1) + } } \ No newline at end of file diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt index f5598a23..601f3d62 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/TimeMapper.kt @@ -257,6 +257,19 @@ class TimeMapper @Inject constructor( } } + fun toDayOfWeek(dayOfWeek: Int): DayOfWeek { + return when (dayOfWeek) { + Calendar.SUNDAY -> DayOfWeek.SUNDAY + Calendar.MONDAY -> DayOfWeek.MONDAY + Calendar.TUESDAY -> DayOfWeek.TUESDAY + Calendar.WEDNESDAY -> DayOfWeek.WEDNESDAY + Calendar.THURSDAY -> DayOfWeek.THURSDAY + Calendar.FRIDAY -> DayOfWeek.FRIDAY + Calendar.SATURDAY -> DayOfWeek.SATURDAY + else -> DayOfWeek.SUNDAY + } + } + fun sameDay(date1: Long, date2: Long, calendar: Calendar): Boolean { calendar.apply { timeInMillis = date1 } val year1: Int = calendar.get(Calendar.YEAR) @@ -543,6 +556,20 @@ class TimeMapper @Inject constructor( }.timeInMillis } + fun getDayOfWeek( + timestamp: Long, + calendar: Calendar, + startOfDayShift: Long, + ): DayOfWeek { + return calendar + .apply { timeInMillis = timestamp } + .let { + it.timeInMillis -= startOfDayShift + it.get(Calendar.DAY_OF_WEEK) + } + .let(::toDayOfWeek) + } + private fun isFirstWeekOfNextYear(calendar: Calendar): Boolean { return calendar.get(Calendar.WEEK_OF_YEAR) == 1 && calendar.get(Calendar.MONTH) == calendar.getActualMaximum(Calendar.MONTH) diff --git a/domain/src/main/java/com/example/util/simpletimetracker/domain/extension/RecordsFilterExtensions.kt b/domain/src/main/java/com/example/util/simpletimetracker/domain/extension/RecordsFilterExtensions.kt index 0180251c..77ce7948 100644 --- a/domain/src/main/java/com/example/util/simpletimetracker/domain/extension/RecordsFilterExtensions.kt +++ b/domain/src/main/java/com/example/util/simpletimetracker/domain/extension/RecordsFilterExtensions.kt @@ -1,5 +1,6 @@ package com.example.util.simpletimetracker.domain.extension +import com.example.util.simpletimetracker.domain.model.DayOfWeek import com.example.util.simpletimetracker.domain.model.Range import com.example.util.simpletimetracker.domain.model.RecordType import com.example.util.simpletimetracker.domain.model.RecordTypeCategory @@ -87,6 +88,12 @@ fun List.getManuallyFilteredRecordIds(): List { .flatten() } +fun List.getDaysOfWeek(): List { + return filterIsInstance() + .map(RecordsFilter.DaysOfWeek::items) + .flatten() +} + fun List.getTaggedIds(): List { return filterIsInstance() .map(RecordsFilter.TagItem.Tagged::tagId) diff --git a/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordsFilter.kt b/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordsFilter.kt index 1d8faf6e..e961af60 100644 --- a/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordsFilter.kt +++ b/domain/src/main/java/com/example/util/simpletimetracker/domain/model/RecordsFilter.kt @@ -16,6 +16,8 @@ sealed interface RecordsFilter { data class ManuallyFiltered(val recordIds: List) : RecordsFilter + data class DaysOfWeek(val items: List) : RecordsFilter + sealed interface CommentItem { object NoComment : CommentItem object AnyComment : CommentItem diff --git a/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/recordFilter/RecordFilterViewData.kt b/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/recordFilter/RecordFilterViewData.kt index d3e71391..96448f4d 100644 --- a/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/recordFilter/RecordFilterViewData.kt +++ b/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/recordFilter/RecordFilterViewData.kt @@ -25,6 +25,7 @@ data class RecordFilterViewData( SELECTED_TAGS, FILTERED_TAGS, MANUALLY_FILTERED, + DAYS_OF_WEEK, } enum class CommentType { diff --git a/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/adapter/RecordsFilterDayOfWeekAdapterDelegate.kt b/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/adapter/RecordsFilterDayOfWeekAdapterDelegate.kt new file mode 100644 index 00000000..2be83f9e --- /dev/null +++ b/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/adapter/RecordsFilterDayOfWeekAdapterDelegate.kt @@ -0,0 +1,21 @@ +package com.example.util.simpletimetracker.feature_records_filter.adapter + +import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate +import com.example.util.simpletimetracker.feature_views.extension.setOnClickWith +import com.example.util.simpletimetracker.feature_records_filter.adapter.RecordsFilterDayOfWeekViewData as ViewData +import com.example.util.simpletimetracker.feature_records_filter.databinding.ItemRecordsFilterDayOfWeekBinding as Binding + +fun createRecordsFilterDayOfWeekAdapterDelegate( + onClick: (ViewData) -> Unit, +) = createRecyclerBindingAdapterDelegate( + Binding::inflate +) { binding, item, _ -> + + with(binding) { + item as ViewData + + containerRecordFilterDayOfWeekItem.setCardBackgroundColor(item.color) + btnRecordsFilterDayOfWeekItem.text = item.text + btnRecordsFilterDayOfWeekItem.setOnClickWith(item, onClick) + } +} diff --git a/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/adapter/RecordsFilterDayOfWeekViewData.kt b/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/adapter/RecordsFilterDayOfWeekViewData.kt new file mode 100644 index 00000000..71140e08 --- /dev/null +++ b/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/adapter/RecordsFilterDayOfWeekViewData.kt @@ -0,0 +1,17 @@ +package com.example.util.simpletimetracker.feature_records_filter.adapter + +import androidx.annotation.ColorInt +import com.example.util.simpletimetracker.domain.model.DayOfWeek +import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType + +data class RecordsFilterDayOfWeekViewData( + val dayOfWeek: DayOfWeek, + val text: String, + @ColorInt val color: Int, +) : ViewHolderType { + + override fun getUniqueId(): Long = dayOfWeek.ordinal.toLong() + + override fun isValidType(other: ViewHolderType): Boolean = + other is RecordsFilterDayOfWeekViewData +} \ No newline at end of file diff --git a/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/interactor/RecordsFilterViewDataInteractor.kt b/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/interactor/RecordsFilterViewDataInteractor.kt index c1516759..a053884e 100644 --- a/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/interactor/RecordsFilterViewDataInteractor.kt +++ b/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/interactor/RecordsFilterViewDataInteractor.kt @@ -15,6 +15,7 @@ import com.example.util.simpletimetracker.domain.extension.getCategoryItems import com.example.util.simpletimetracker.domain.extension.getCommentItems import com.example.util.simpletimetracker.domain.extension.getComments import com.example.util.simpletimetracker.domain.extension.getDate +import com.example.util.simpletimetracker.domain.extension.getDaysOfWeek import com.example.util.simpletimetracker.domain.extension.getFilteredTags import com.example.util.simpletimetracker.domain.extension.getManuallyFilteredRecordIds import com.example.util.simpletimetracker.domain.extension.getSelectedTags @@ -26,6 +27,7 @@ import com.example.util.simpletimetracker.domain.extension.hasUntaggedItem import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor import com.example.util.simpletimetracker.domain.interactor.RecordInteractor import com.example.util.simpletimetracker.domain.model.Category +import com.example.util.simpletimetracker.domain.model.DayOfWeek import com.example.util.simpletimetracker.domain.model.Range import com.example.util.simpletimetracker.domain.model.Record import com.example.util.simpletimetracker.domain.model.RecordTag @@ -40,6 +42,7 @@ import com.example.util.simpletimetracker.feature_base_adapter.recordFilter.Reco import com.example.util.simpletimetracker.feature_records_filter.R import com.example.util.simpletimetracker.feature_records_filter.adapter.RecordsFilterButtonViewData import com.example.util.simpletimetracker.feature_records_filter.adapter.RecordsFilterCommentViewData +import com.example.util.simpletimetracker.feature_records_filter.adapter.RecordsFilterDayOfWeekViewData import com.example.util.simpletimetracker.feature_records_filter.adapter.RecordsFilterRangeViewData import com.example.util.simpletimetracker.feature_records_filter.mapper.RecordsFilterViewDataMapper import com.example.util.simpletimetracker.feature_records_filter.model.RecordsFilterSelectedRecordsViewData @@ -186,6 +189,7 @@ class RecordsFilterViewDataInteractor @Inject constructor( }, RecordFilterViewData.Type.SELECTED_TAGS, RecordFilterViewData.Type.FILTERED_TAGS, + RecordFilterViewData.Type.DAYS_OF_WEEK, RecordFilterViewData.Type.MANUALLY_FILTERED.takeIf { filters.hasManuallyFiltered() } @@ -419,6 +423,26 @@ class RecordsFilterViewDataInteractor @Inject constructor( .let(dateDividerViewDataMapper::addDateViewData) } + suspend fun getDaysOfWeekFilterSelectionViewData( + filters: List, + ): List { + val selectedDays = filters.getDaysOfWeek() + val isDarkTheme = prefsInteractor.getDarkMode() + + return DayOfWeek.values().map { + val selected = it in selectedDays + RecordsFilterDayOfWeekViewData( + dayOfWeek = it, + text = timeMapper.toShortDayOfWeekName(it), + color = if (selected) { + colorMapper.toActiveColor(isDarkTheme) + } else { + colorMapper.toInactiveColor(isDarkTheme) + }, + ) + } + } + private fun mapFilteredRecord( record: Record, recordTypes: Map, diff --git a/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/mapper/RecordsFilterViewDataMapper.kt b/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/mapper/RecordsFilterViewDataMapper.kt index 53435914..9efb6f88 100644 --- a/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/mapper/RecordsFilterViewDataMapper.kt +++ b/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/mapper/RecordsFilterViewDataMapper.kt @@ -49,6 +49,7 @@ class RecordsFilterViewDataMapper @Inject constructor( RecordFilterViewData.Type.SELECTED_TAGS -> R.string.records_filter_select_tags RecordFilterViewData.Type.FILTERED_TAGS -> R.string.records_filter_filter_tags RecordFilterViewData.Type.MANUALLY_FILTERED -> R.string.records_filter_manually_filtered + RecordFilterViewData.Type.DAYS_OF_WEEK -> R.string.range_day }.let(resourceRepo::getString) } @@ -110,6 +111,9 @@ class RecordsFilterViewDataMapper @Inject constructor( is RecordsFilter.ManuallyFiltered -> { "${filter.recordIds.size}" } + is RecordsFilter.DaysOfWeek -> { + "${filter.items.size}" + } } return "$filterName($filterValue)" @@ -157,6 +161,7 @@ class RecordsFilterViewDataMapper @Inject constructor( RecordFilterViewData.Type.SELECTED_TAGS -> RecordsFilter.SelectedTags::class.java RecordFilterViewData.Type.FILTERED_TAGS -> RecordsFilter.FilteredTags::class.java RecordFilterViewData.Type.MANUALLY_FILTERED -> RecordsFilter.ManuallyFiltered::class.java + RecordFilterViewData.Type.DAYS_OF_WEEK -> RecordsFilter.DaysOfWeek::class.java } } @@ -169,6 +174,7 @@ class RecordsFilterViewDataMapper @Inject constructor( RecordsFilter.SelectedTags::class.java -> RecordFilterViewData.Type.SELECTED_TAGS RecordsFilter.FilteredTags::class.java -> RecordFilterViewData.Type.FILTERED_TAGS RecordsFilter.ManuallyFiltered::class.java -> RecordFilterViewData.Type.MANUALLY_FILTERED + RecordsFilter.DaysOfWeek::class.java -> RecordFilterViewData.Type.DAYS_OF_WEEK else -> null } } diff --git a/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/view/RecordsFilterFragment.kt b/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/view/RecordsFilterFragment.kt index f8c03e15..2a34b8fb 100644 --- a/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/view/RecordsFilterFragment.kt +++ b/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/view/RecordsFilterFragment.kt @@ -30,6 +30,7 @@ import com.example.util.simpletimetracker.feature_base_adapter.recordType.create import com.example.util.simpletimetracker.feature_base_adapter.recordsDateDivider.createRecordsDateDividerAdapterDelegate import com.example.util.simpletimetracker.feature_records_filter.adapter.createRecordsFilterButtonAdapterDelegate import com.example.util.simpletimetracker.feature_records_filter.adapter.createRecordsFilterCommentAdapterDelegate +import com.example.util.simpletimetracker.feature_records_filter.adapter.createRecordsFilterDayOfWeekAdapterDelegate import com.example.util.simpletimetracker.feature_records_filter.adapter.createRecordsFilterRangeAdapterDelegate import com.example.util.simpletimetracker.feature_records_filter.model.RecordsFilterSelectedRecordsViewData import com.example.util.simpletimetracker.feature_records_filter.viewModel.RecordsFilterViewModel @@ -71,6 +72,7 @@ class RecordsFilterFragment : createRecordAdapterDelegate(viewModel::onRecordClick), createRecordsFilterCommentAdapterDelegate(viewModel::onCommentChange), createRecordsFilterButtonAdapterDelegate(viewModel::onInnerFilterButtonClick), + createRecordsFilterDayOfWeekAdapterDelegate(viewModel::onDayOfWeekClick), createRecordsFilterRangeAdapterDelegate( viewModel::onRangeTimeStartedClick, viewModel::onRangeTimeEndedClick, diff --git a/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/viewModel/RecordsFilterViewModel.kt b/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/viewModel/RecordsFilterViewModel.kt index f5f78ad9..8279c072 100644 --- a/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/viewModel/RecordsFilterViewModel.kt +++ b/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/viewModel/RecordsFilterViewModel.kt @@ -12,6 +12,7 @@ import com.example.util.simpletimetracker.domain.extension.getAllTypeIds import com.example.util.simpletimetracker.domain.extension.getCategoryItems import com.example.util.simpletimetracker.domain.extension.getCommentItems import com.example.util.simpletimetracker.domain.extension.getDate +import com.example.util.simpletimetracker.domain.extension.getDaysOfWeek import com.example.util.simpletimetracker.domain.extension.getFilteredTags import com.example.util.simpletimetracker.domain.extension.getManuallyFilteredRecordIds import com.example.util.simpletimetracker.domain.extension.getSelectedTags @@ -24,6 +25,7 @@ import com.example.util.simpletimetracker.domain.interactor.RecordTagInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTypeCategoryInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor import com.example.util.simpletimetracker.domain.model.Category +import com.example.util.simpletimetracker.domain.model.DayOfWeek import com.example.util.simpletimetracker.domain.model.Range import com.example.util.simpletimetracker.domain.model.RecordTag import com.example.util.simpletimetracker.domain.model.RecordType @@ -36,6 +38,7 @@ import com.example.util.simpletimetracker.feature_base_adapter.record.RecordView import com.example.util.simpletimetracker.feature_base_adapter.recordFilter.RecordFilterViewData import com.example.util.simpletimetracker.feature_base_adapter.recordType.RecordTypeViewData import com.example.util.simpletimetracker.feature_records_filter.adapter.RecordsFilterButtonViewData +import com.example.util.simpletimetracker.feature_records_filter.adapter.RecordsFilterDayOfWeekViewData import com.example.util.simpletimetracker.feature_records_filter.interactor.RecordsFilterViewDataInteractor import com.example.util.simpletimetracker.feature_records_filter.mapper.RecordsFilterViewDataMapper import com.example.util.simpletimetracker.feature_records_filter.model.RecordsFilterSelectedRecordsViewData @@ -252,6 +255,18 @@ class RecordsFilterViewModel @Inject constructor( handleInvertSelection() } } + + updateFilters() + updateFilterSelectionViewData() + updateRecords() + } + + fun onDayOfWeekClick(viewData: RecordsFilterDayOfWeekViewData) { + handleDayOfWeekClick(viewData.dayOfWeek) + + updateFilters() + updateFilterSelectionViewData() + updateRecords() } private suspend fun handleTypeClick(id: Long) { @@ -419,10 +434,15 @@ class RecordsFilterViewModel @Inject constructor( filters.removeAll { it is RecordsFilter.ManuallyFiltered } if (selectedIds.isNotEmpty()) filters.add(RecordsFilter.ManuallyFiltered(selectedIds)) checkManualFilterVisibility() + } - updateFilters() - updateFilterSelectionViewData() - updateRecords() + private fun handleDayOfWeekClick(dayOfWeek: DayOfWeek) { + val newDays = filters.getDaysOfWeek() + .toMutableList() + .apply { addOrRemove(dayOfWeek) } + + filters.removeAll { it is RecordsFilter.DaysOfWeek } + if (newDays.isNotEmpty()) filters.add(RecordsFilter.DaysOfWeek(newDays)) } private fun checkManualFilterVisibility() { @@ -550,6 +570,11 @@ class RecordsFilterViewModel @Inject constructor( recordTags = getTagsCache(), ) } + RecordFilterViewData.Type.DAYS_OF_WEEK -> { + viewDataInteractor.getDaysOfWeekFilterSelectionViewData( + filters = filters, + ) + } } } diff --git a/features/feature_records_filter/src/main/res/layout/item_records_filter_day_of_week.xml b/features/feature_records_filter/src/main/res/layout/item_records_filter_day_of_week.xml new file mode 100644 index 00000000..a7f05513 --- /dev/null +++ b/features/feature_records_filter/src/main/res/layout/item_records_filter_day_of_week.xml @@ -0,0 +1,25 @@ + + + + + + \ No newline at end of file diff --git a/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/RecordsFilterParam.kt b/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/RecordsFilterParam.kt index 9c10aecb..5d7a4a3a 100644 --- a/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/RecordsFilterParam.kt +++ b/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/RecordsFilterParam.kt @@ -1,6 +1,7 @@ package com.example.util.simpletimetracker.navigation.params.screen import android.os.Parcelable +import com.example.util.simpletimetracker.domain.model.DayOfWeek import kotlinx.parcelize.Parcelize sealed interface RecordsFilterParam : Parcelable { @@ -26,6 +27,9 @@ sealed interface RecordsFilterParam : Parcelable { @Parcelize data class ManuallyFiltered(val recordIds: List) : RecordsFilterParam + @Parcelize + data class DaysOfWeek(val items: List) : RecordsFilterParam + sealed interface CommentItem : Parcelable { @Parcelize object NoComment : CommentItem -- 2.54.0