Skip to content

Commit 3252e17

Browse files
committed
hide archived items in record filters
1 parent 2516a64 commit 3252e17

File tree

6 files changed

+90
-39
lines changed

6 files changed

+90
-39
lines changed

core/src/main/java/com/example/util/simpletimetracker/core/interactor/ChartFilterViewDataInteractor.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class ChartFilterViewDataInteractor @Inject constructor(
4040
null
4141
}
4242
val archivedItem = if (showArchived) {
43-
chartFilterViewDataMapper.mapToArchivedItem(
43+
recordTypeViewDataMapper.mapToArchivedItem(
4444
isEnabled = isArchivedShown,
4545
numberOfCards = numberOfCards,
4646
isDarkTheme = isDarkTheme,
@@ -63,7 +63,7 @@ class ChartFilterViewDataInteractor @Inject constructor(
6363
isComplete = false,
6464
)
6565
}
66-
.takeUnless { it.isEmpty() }
66+
.takeUnless { types.isEmpty() }
6767
?.plus(untrackedItem)
6868
?.plus(archivedItem)
6969
?: recordTypeViewDataMapper.mapToEmpty()
@@ -96,7 +96,7 @@ class ChartFilterViewDataInteractor @Inject constructor(
9696
isFiltered = category.id in categoryIdsFiltered,
9797
)
9898
}
99-
.takeUnless { it.isEmpty() }
99+
.takeUnless { categories.isEmpty() }
100100
?.plus(untrackedItem)
101101
?.plus(untaggedItem)
102102
?: categoryViewDataMapper.mapToCategoriesEmpty().let(::listOf)
@@ -145,7 +145,7 @@ class ChartFilterViewDataInteractor @Inject constructor(
145145
isFiltered = tag.id in recordTagsFiltered,
146146
)
147147
}
148-
.takeUnless { it.isEmpty() }
148+
.takeUnless { tags.isEmpty() }
149149
?.plus(untrackedItem)
150150
?.plus(untaggedItem)
151151
?.plus(archivedItem)

core/src/main/java/com/example/util/simpletimetracker/core/mapper/ChartFilterViewDataMapper.kt

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.example.util.simpletimetracker.core.mapper
33
import com.example.util.simpletimetracker.core.R
44
import com.example.util.simpletimetracker.core.repo.ResourceRepo
55
import com.example.util.simpletimetracker.core.viewData.ChartFilterTypeViewData
6-
import com.example.util.simpletimetracker.domain.base.ARCHIVED_BUTTON_ITEM_ID
76
import com.example.util.simpletimetracker.domain.base.UNTRACKED_ITEM_ID
87
import com.example.util.simpletimetracker.domain.statistics.model.ChartFilterType
98
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
@@ -43,28 +42,6 @@ class ChartFilterViewDataMapper @Inject constructor(
4342
)
4443
}
4544

46-
fun mapToArchivedItem(
47-
isEnabled: Boolean,
48-
numberOfCards: Int,
49-
isDarkTheme: Boolean,
50-
): RecordTypeViewData {
51-
return RecordTypeViewData(
52-
id = ARCHIVED_BUTTON_ITEM_ID,
53-
name = R.string.settings_archive
54-
.let(resourceRepo::getString),
55-
iconId = RecordTypeIcon.Image(R.drawable.archive),
56-
iconColor = colorMapper.toIconColor(isDarkTheme),
57-
color = if (isEnabled) {
58-
colorMapper.toActiveColor(isDarkTheme)
59-
} else {
60-
colorMapper.toInactiveColor(isDarkTheme)
61-
},
62-
width = recordTypeCardSizeMapper.toCardWidth(numberOfCards),
63-
height = recordTypeCardSizeMapper.toCardHeight(numberOfCards),
64-
asRow = recordTypeCardSizeMapper.toCardAsRow(numberOfCards),
65-
)
66-
}
67-
6845
fun mapToFilterTypeViewData(filterType: ChartFilterType): List<ViewHolderType> {
6946
return listOf(
7047
ChartFilterType.ACTIVITY,

core/src/main/java/com/example/util/simpletimetracker/core/mapper/RecordTypeViewDataMapper.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.annotation.StringRes
55
import com.example.util.simpletimetracker.core.R
66
import com.example.util.simpletimetracker.core.interactor.GetCurrentRecordsDurationInteractor
77
import com.example.util.simpletimetracker.core.repo.ResourceRepo
8+
import com.example.util.simpletimetracker.domain.base.ARCHIVED_BUTTON_ITEM_ID
89
import com.example.util.simpletimetracker.domain.recordType.extension.getDaily
910
import com.example.util.simpletimetracker.domain.extension.orFalse
1011
import com.example.util.simpletimetracker.domain.extension.orZero
@@ -157,6 +158,28 @@ class RecordTypeViewDataMapper @Inject constructor(
157158
)
158159
}
159160

161+
fun mapToArchivedItem(
162+
isEnabled: Boolean,
163+
numberOfCards: Int,
164+
isDarkTheme: Boolean,
165+
): RecordTypeViewData {
166+
return RecordTypeViewData(
167+
id = ARCHIVED_BUTTON_ITEM_ID,
168+
name = R.string.settings_archive
169+
.let(resourceRepo::getString),
170+
iconId = RecordTypeIcon.Image(R.drawable.archive),
171+
iconColor = colorMapper.toIconColor(isDarkTheme),
172+
color = if (isEnabled) {
173+
colorMapper.toActiveColor(isDarkTheme)
174+
} else {
175+
colorMapper.toInactiveColor(isDarkTheme)
176+
},
177+
width = recordTypeCardSizeMapper.toCardWidth(numberOfCards),
178+
height = recordTypeCardSizeMapper.toCardHeight(numberOfCards),
179+
asRow = recordTypeCardSizeMapper.toCardAsRow(numberOfCards),
180+
)
181+
}
182+
160183
fun mapGoalCheckmark(
161184
type: RecordType,
162185
goals: Map<Long, List<RecordTypeGoal>>,

domain/src/main/java/com/example/util/simpletimetracker/domain/extension/CollectionExtensions.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ operator fun <T> List<T>.plus(element: T?): List<T> {
2727
return if (element != null) this.plusElement(element) else this
2828
}
2929

30+
operator fun <T> List<T>.plus(elements: List<T>?): List<T> {
31+
return if (elements != null) this.toMutableList().apply { addAll(elements) } else this
32+
}
33+
3034
inline fun <T> List<T>.removeIf(crossinline filter: (T) -> Boolean): List<T> {
3135
return this.toMutableList().apply { removeAll { filter(it) } }
3236
}

features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/interactor/RecordsFilterViewDataInteractor.kt

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import com.example.util.simpletimetracker.domain.record.model.Record
4444
import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
4545
import com.example.util.simpletimetracker.domain.recordType.model.RecordType
4646
import com.example.util.simpletimetracker.domain.category.model.RecordTypeCategory
47+
import com.example.util.simpletimetracker.domain.extension.plus
4748
import com.example.util.simpletimetracker.domain.record.extension.hasDuplicationsFilter
4849
import com.example.util.simpletimetracker.domain.recordType.model.RecordTypeGoal
4950
import com.example.util.simpletimetracker.domain.recordTag.model.RecordTypeToTag
@@ -321,6 +322,7 @@ class RecordsFilterViewDataInteractor @Inject constructor(
321322
suspend fun getActivityFilterSelectionViewData(
322323
extra: RecordsFilterParams,
323324
filters: List<RecordsFilter>,
325+
isArchivedShown: Boolean,
324326
types: List<RecordType>,
325327
recordTypeCategories: List<RecordTypeCategory>,
326328
categories: List<Category>,
@@ -329,12 +331,16 @@ class RecordsFilterViewDataInteractor @Inject constructor(
329331

330332
val numberOfCards = prefsInteractor.getNumberOfCards()
331333
val isDarkTheme = prefsInteractor.getDarkMode()
334+
val showArchived = types.any { it.hidden }
332335

333336
val selectedCategoryItems: List<RecordsFilter.CategoryItem> = filters.getCategoryItems()
334337
val selectedCategoryIds: List<Long> = filters.getCategoryIds()
335338
val allSelectedTypeIds: List<Long> = filters.getAllTypeIds(types, recordTypeCategories)
336339

337-
val typesViewData = types.map { type ->
340+
val typesViewData = types.mapNotNull { type ->
341+
if (!isArchivedShown && type.hidden) {
342+
return@mapNotNull null
343+
}
338344
recordTypeViewDataMapper.mapFiltered(
339345
recordType = type,
340346
numberOfCards = numberOfCards,
@@ -343,7 +349,17 @@ class RecordsFilterViewDataInteractor @Inject constructor(
343349
checkState = GoalCheckmarkView.CheckState.HIDDEN,
344350
isComplete = false,
345351
)
346-
}
352+
}.plus(
353+
if (showArchived) {
354+
recordTypeViewDataMapper.mapToArchivedItem(
355+
isEnabled = isArchivedShown,
356+
numberOfCards = numberOfCards,
357+
isDarkTheme = isDarkTheme,
358+
)
359+
} else {
360+
null
361+
},
362+
)
347363

348364
val typesSelectionButtons = mapper.mapToSelectionButtons(
349365
type = RecordsFilterSelectionButtonType.Type.Activities,
@@ -357,27 +373,25 @@ class RecordsFilterViewDataInteractor @Inject constructor(
357373
isFiltered = category.id !in selectedCategoryIds,
358374
)
359375
}
360-
.takeUnless { it.isEmpty() }
361-
?.plus(
376+
.plus(
362377
categoryViewDataMapper.mapToUncategorizedItem(
363378
isFiltered = !selectedCategoryItems.hasUncategorizedItem(),
364379
isDarkTheme = isDarkTheme,
365380
),
366381
)
367-
.orEmpty()
368382

369383
val categoriesSelectionButtons = mapper.mapToSelectionButtons(
370384
type = RecordsFilterSelectionButtonType.Type.Categories,
371385
)
372386

373-
if (categoriesViewData.isNotEmpty()) {
387+
if (categories.isNotEmpty()) {
374388
HintViewData(resourceRepo.getString(R.string.category_hint)).let(result::add)
375389
categoriesSelectionButtons.let(result::addAll)
376390
categoriesViewData.let(result::addAll)
377391
DividerViewData(1).let(result::add)
378392
}
379393

380-
if (typesViewData.isNotEmpty()) {
394+
if (types.isNotEmpty()) {
381395
HintViewData(resourceRepo.getString(R.string.activity_hint)).let(result::add)
382396
typesSelectionButtons.let(result::addAll)
383397
typesViewData.let(result::addAll)
@@ -484,6 +498,7 @@ class RecordsFilterViewDataInteractor @Inject constructor(
484498
suspend fun getTagsFilterSelectionViewData(
485499
type: RecordFilterType,
486500
filters: List<RecordsFilter>,
501+
isArchivedShown: Boolean,
487502
types: List<RecordType>,
488503
recordTypeCategories: List<RecordTypeCategory>,
489504
recordTags: List<RecordTag>,
@@ -508,24 +523,38 @@ class RecordsFilterViewDataInteractor @Inject constructor(
508523
typesToTags = recordTypesToTags,
509524
typeIds = selectedTypes,
510525
)
526+
val selectableTags = recordTags.filter { it.id in selectableTagIds }
527+
val showArchived = selectableTags.any { it.archived }
511528

512-
val recordTagsViewData = recordTags
513-
.filter { it.id in selectableTagIds }
514-
.map { tag ->
529+
val recordTagsViewData = selectableTags
530+
.mapNotNull { tag ->
531+
if (!isArchivedShown && tag.archived) {
532+
return@mapNotNull null
533+
}
515534
categoryViewDataMapper.mapRecordTag(
516535
tag = tag,
517536
type = typesMap[tag.iconColorSource],
518537
isDarkTheme = isDarkTheme,
519538
isFiltered = tag.id !in selectedTaggedIds,
520539
)
521540
}
522-
.takeUnless { it.isEmpty() }
541+
.takeUnless { selectableTags.isEmpty() }
523542
?.plus(
524543
categoryViewDataMapper.mapToUntaggedItem(
525544
isFiltered = !selectedTags.hasUntaggedItem(),
526545
isDarkTheme = isDarkTheme,
527546
),
528547
)
548+
?.plus(
549+
if (showArchived) {
550+
categoryViewDataMapper.mapToTagArchiveItem(
551+
isEnabled = isArchivedShown,
552+
isDarkTheme = isDarkTheme,
553+
)
554+
} else {
555+
null
556+
}
557+
)
529558
.orEmpty()
530559

531560
val selectionButtons = mapper.mapToSelectionButtons(

features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/viewModel/RecordsFilterViewModel.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.example.util.simpletimetracker.core.extension.set
88
import com.example.util.simpletimetracker.core.extension.toModel
99
import com.example.util.simpletimetracker.core.interactor.RecordFilterInteractor
1010
import com.example.util.simpletimetracker.core.mapper.TimeMapper
11+
import com.example.util.simpletimetracker.domain.base.ARCHIVED_BUTTON_ITEM_ID
1112
import com.example.util.simpletimetracker.domain.base.MULTITASK_ITEM_ID
1213
import com.example.util.simpletimetracker.domain.base.UNTRACKED_ITEM_ID
1314
import com.example.util.simpletimetracker.domain.record.extension.getDate
@@ -119,6 +120,8 @@ class RecordsFilterViewModel @Inject constructor(
119120

120121
private var filters: List<RecordsFilter> = emptyList()
121122
private var filterSelectionState: RecordsFilterSelectionState = RecordsFilterSelectionState.Hidden
123+
private var isArchivedTypesShown: Boolean = false
124+
private var isArchivedTagsShown: Boolean = false
122125
private val defaultRange: Range by lazy { viewDataInteractor.getDefaultDateRange() }
123126
private val defaultDurationRange: Range by lazy { viewDataInteractor.getDefaultDurationRange() }
124127
private val defaultTimeOfDayRange: Range by lazy { viewDataInteractor.getDefaultTimeOfDayRange() }
@@ -171,7 +174,11 @@ class RecordsFilterViewModel @Inject constructor(
171174
}
172175

173176
fun onRecordTypeClick(item: RecordTypeViewData) = viewModelScope.launch {
174-
handleTypeClick(item.id)
177+
if (item.id == ARCHIVED_BUTTON_ITEM_ID) {
178+
handleArchivedTypeClick()
179+
} else {
180+
handleTypeClick(item.id)
181+
}
175182
updateViewDataOnFiltersChanged()
176183
}
177184

@@ -183,6 +190,7 @@ class RecordsFilterViewModel @Inject constructor(
183190
is CategoryViewData.Record -> when (item.id) {
184191
UNTRACKED_ITEM_ID -> handleUntrackedClick()
185192
MULTITASK_ITEM_ID -> handleMultitaskClick()
193+
ARCHIVED_BUTTON_ITEM_ID -> handleArchivedTagClick()
186194
else -> handleTagClick(item)
187195
}
188196
}
@@ -367,6 +375,14 @@ class RecordsFilterViewModel @Inject constructor(
367375
)
368376
}
369377

378+
private fun handleArchivedTypeClick() {
379+
isArchivedTypesShown = !isArchivedTypesShown
380+
}
381+
382+
private fun handleArchivedTagClick() {
383+
isArchivedTagsShown = !isArchivedTagsShown
384+
}
385+
370386
private fun handleCommentFilterClick(item: FilterViewData) {
371387
filters = recordsFilterUpdateInteractor.handleCommentFilterClick(
372388
currentFilters = filters,
@@ -718,6 +734,7 @@ class RecordsFilterViewModel @Inject constructor(
718734
viewDataInteractor.getActivityFilterSelectionViewData(
719735
extra = extra,
720736
filters = filters,
737+
isArchivedShown = isArchivedTypesShown,
721738
types = getTypesCache(),
722739
recordTypeCategories = getRecordTypeCategoriesCache(),
723740
categories = getCategoriesCache(),
@@ -734,6 +751,7 @@ class RecordsFilterViewModel @Inject constructor(
734751
viewDataInteractor.getTagsFilterSelectionViewData(
735752
type = type,
736753
filters = filters,
754+
isArchivedShown = isArchivedTagsShown,
737755
types = getTypesCache(),
738756
recordTypeCategories = getRecordTypeCategoriesCache(),
739757
recordTags = getTagsCache(),

0 commit comments

Comments
 (0)