@@ -5,11 +5,14 @@ import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper
55import com.example.util.simpletimetracker.core.repo.ResourceRepo
66import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
77import com.example.util.simpletimetracker.domain.recordTag.interactor.RecordTagInteractor
8+ import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
89import com.example.util.simpletimetracker.domain.recordType.interactor.RecordTypeInteractor
10+ import com.example.util.simpletimetracker.domain.recordType.model.RecordType
911import com.example.util.simpletimetracker.feature_archive.R
1012import com.example.util.simpletimetracker.feature_archive.viewData.ArchiveViewData
1113import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
1214import com.example.util.simpletimetracker.feature_base_adapter.divider.DividerViewData
15+ import com.example.util.simpletimetracker.feature_base_adapter.emptySpace.EmptySpaceViewData
1316import com.example.util.simpletimetracker.feature_base_adapter.hint.HintViewData
1417import com.example.util.simpletimetracker.feature_views.GoalCheckmarkView
1518import javax.inject.Inject
@@ -25,52 +28,71 @@ class ArchiveViewDataInteractor @Inject constructor(
2528 private val categoryViewDataMapper : CategoryViewDataMapper ,
2629) {
2730
28- suspend fun getViewData (): ArchiveViewData {
31+ suspend fun getViewData (
32+ navBarHeightDp : Int ,
33+ searchEnabled : Boolean ,
34+ searchText : String ,
35+ ): ArchiveViewData {
2936 val result: MutableList <ViewHolderType > = mutableListOf ()
3037 val numberOfCards = prefsInteractor.getNumberOfCards()
3138 val isDarkTheme = prefsInteractor.getDarkMode()
39+ val isSearching: Boolean = searchEnabled && searchText.isNotEmpty()
3240
3341 val types = recordTypeInteractor.getAll().associateBy { it.id }
3442 val archivedTypes = types.values.filter { it.hidden }
3543 val archivedRecordTags = recordTagInteractor.getAll().filter { it.archived }
3644
37- val typesViewData = archivedTypes.map { type ->
38- recordTypeViewDataMapper.mapFiltered(
39- recordType = type,
40- numberOfCards = numberOfCards,
41- isDarkTheme = isDarkTheme,
42- isFiltered = false ,
43- checkState = GoalCheckmarkView .CheckState .HIDDEN ,
44- isComplete = false ,
45- )
46- }
47-
48- val recordTagsViewData = archivedRecordTags.map { tag ->
49- categoryViewDataMapper.mapRecordTag(
50- tag = tag,
51- type = types[tag.iconColorSource],
52- isDarkTheme = isDarkTheme,
53- isFiltered = false ,
54- )
55- }
56-
57- if (typesViewData.isNotEmpty()) {
58- HintViewData (resourceRepo.getString(R .string.activity_hint)).let (result::add)
59- typesViewData.let (result::addAll)
45+ if (archivedTypes.isNotEmpty()) {
46+ val typesViewData = searchTypes(
47+ types = archivedTypes,
48+ isSearching = isSearching,
49+ searchText = searchText,
50+ ).map { type ->
51+ recordTypeViewDataMapper.mapFiltered(
52+ recordType = type,
53+ numberOfCards = numberOfCards,
54+ isDarkTheme = isDarkTheme,
55+ isFiltered = false ,
56+ checkState = GoalCheckmarkView .CheckState .HIDDEN ,
57+ isComplete = false ,
58+ )
59+ }
60+ result + = HintViewData (resourceRepo.getString(R .string.activity_hint))
61+ result + = if (typesViewData.isEmpty() && isSearching) {
62+ mapSearchEmpty()
63+ } else {
64+ typesViewData
65+ }
6066 }
6167
62- if (recordTagsViewData.isNotEmpty()) {
63- if (typesViewData.isNotEmpty()) {
64- DividerViewData (1 ).let (result::add)
68+ if (archivedRecordTags.isNotEmpty()) {
69+ val recordTagsViewData = searchTags(
70+ tags = archivedRecordTags,
71+ isSearching = isSearching,
72+ searchText = searchText,
73+ ).map { tag ->
74+ categoryViewDataMapper.mapRecordTag(
75+ tag = tag,
76+ type = types[tag.iconColorSource],
77+ isDarkTheme = isDarkTheme,
78+ isFiltered = false ,
79+ )
80+ }
81+ if (archivedTypes.isNotEmpty()) result + = DividerViewData (1 )
82+ result + = HintViewData (resourceRepo.getString(R .string.record_tag_hint))
83+ result + = if (recordTagsViewData.isEmpty() && isSearching) {
84+ mapSearchEmpty()
85+ } else {
86+ recordTagsViewData
6587 }
66- HintViewData (resourceRepo.getString(R .string.record_tag_hint)).let (result::add)
67- recordTagsViewData.let (result::addAll)
6888 }
6989
7090 if (result.isEmpty()) {
71- HintViewData (resourceRepo.getString(R .string.archive_empty)). let (result::add )
91+ result + = HintViewData (resourceRepo.getString(R .string.archive_empty))
7292 }
7393
94+ result + = getBottomEmptySpace(navBarHeightDp)
95+
7496 val showHint = archivedTypes.isNotEmpty() ||
7597 archivedRecordTags.isNotEmpty()
7698
@@ -79,4 +101,45 @@ class ArchiveViewDataInteractor @Inject constructor(
79101 showHint = showHint,
80102 )
81103 }
104+
105+ private fun getBottomEmptySpace (
106+ navBarHeightDp : Int ,
107+ ): ViewHolderType {
108+ val optionsButtonHeight = resourceRepo.getDimenInDp(R .dimen.button_height)
109+ val size = optionsButtonHeight + navBarHeightDp
110+ return EmptySpaceViewData (
111+ id = " archive_bottom_space" .hashCode().toLong(),
112+ height = EmptySpaceViewData .ViewDimension .ExactSizeDp (size),
113+ wrapBefore = true ,
114+ )
115+ }
116+
117+ private fun mapSearchEmpty (): List <ViewHolderType > {
118+ return HintViewData (text = resourceRepo.getString(R .string.widget_load_error))
119+ .let (::listOf)
120+ }
121+
122+ private fun searchTypes (
123+ types : List <RecordType >,
124+ isSearching : Boolean ,
125+ searchText : String ,
126+ ): List <RecordType > {
127+ return if (isSearching) {
128+ types.filter { it.name.lowercase().contains(searchText) }
129+ } else {
130+ types
131+ }
132+ }
133+
134+ private fun searchTags (
135+ tags : List <RecordTag >,
136+ isSearching : Boolean ,
137+ searchText : String ,
138+ ): List <RecordTag > {
139+ return if (isSearching) {
140+ tags.filter { it.name.lowercase().contains(searchText) }
141+ } else {
142+ tags
143+ }
144+ }
82145}
0 commit comments