Skip to content

Commit 0267ede

Browse files
committed
refactor options list dialog
1 parent b64c1d3 commit 0267ede

File tree

25 files changed

+366
-288
lines changed

25 files changed

+366
-288
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.example.util.simpletimetracker.core.dialog
22

3-
import com.example.util.simpletimetracker.feature_base_adapter.optionsList.OptionsListViewData
3+
import com.example.util.simpletimetracker.navigation.params.screen.OptionsListParams
44

55
interface OptionsListDialogListener {
66

7-
fun onOptionsItemClick(item: OptionsListViewData)
7+
fun onOptionsItemClick(id: OptionsListParams.Item.Id)
88
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.example.util.simpletimetracker.core.mapper
2+
3+
import com.example.util.simpletimetracker.domain.base.UNCATEGORIZED_ITEM_ID
4+
import com.example.util.simpletimetracker.domain.base.UNTRACKED_ITEM_ID
5+
import com.example.util.simpletimetracker.domain.category.interactor.CategoryInteractor
6+
import com.example.util.simpletimetracker.domain.recordTag.interactor.RecordTagInteractor
7+
import com.example.util.simpletimetracker.domain.recordType.interactor.RecordTypeInteractor
8+
import com.example.util.simpletimetracker.domain.statistics.model.ChartFilterType
9+
import javax.inject.Inject
10+
11+
class OptionsListItemMapper @Inject constructor(
12+
private val recordTypeInteractor: RecordTypeInteractor,
13+
private val categoryInteractor: CategoryInteractor,
14+
private val recordTagInteractor: RecordTagInteractor,
15+
) {
16+
17+
fun isIconCheckVisible(
18+
filteredIds: List<Long>,
19+
existingIds: Map<Long, Boolean>,
20+
): Boolean {
21+
return filteredIds.any {
22+
val isSpecial = it in listOf(UNTRACKED_ITEM_ID, UNCATEGORIZED_ITEM_ID)
23+
val notRemoved = it in existingIds
24+
!isSpecial && notRemoved
25+
}
26+
}
27+
28+
// Map is faster for contains.
29+
suspend fun getExistingIds(
30+
chartFilterType: ChartFilterType,
31+
): Map<Long, Boolean> {
32+
return when (chartFilterType) {
33+
ChartFilterType.ACTIVITY -> recordTypeInteractor.getAll().map { it.id }
34+
ChartFilterType.CATEGORY -> categoryInteractor.getAll().map { it.id }
35+
ChartFilterType.RECORD_TAG -> recordTagInteractor.getAll().map { it.id }
36+
}.associateWith { true }
37+
}
38+
}

core/src/main/java/com/example/util/simpletimetracker/core/model/OptionsListItem.kt

Lines changed: 0 additions & 28 deletions
This file was deleted.

features/feature_categories/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.example.util.simpletimetracker.applyAndroidLibrary
44
plugins {
55
alias(libs.plugins.gradleLibrary)
66
alias(libs.plugins.kotlin)
7+
alias(libs.plugins.kotlinParcelize)
78
alias(libs.plugins.ksp)
89
alias(libs.plugins.hilt)
910
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.example.util.simpletimetracker.feature_categories.mapper
2+
3+
import com.example.util.simpletimetracker.core.repo.ResourceRepo
4+
import com.example.util.simpletimetracker.domain.extension.plusAssign
5+
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
6+
import com.example.util.simpletimetracker.feature_categories.R
7+
import com.example.util.simpletimetracker.feature_categories.model.CategoriesOptionsListItem
8+
import com.example.util.simpletimetracker.navigation.params.screen.OptionsListParams
9+
import javax.inject.Inject
10+
11+
class CategoriesOptionsListMapper @Inject constructor(
12+
private val resourceRepo: ResourceRepo,
13+
private val prefsInteractor: PrefsInteractor,
14+
) {
15+
16+
suspend fun map(
17+
selectedIds: List<Long>,
18+
): List<OptionsListParams.Item> {
19+
val result = mutableListOf<OptionsListParams.Item>()
20+
21+
result += OptionsListParams.Item(
22+
id = CategoriesOptionsListItem.EnabledSearch,
23+
text = resourceRepo.getString(R.string.enable_search_hint),
24+
icon = R.drawable.search,
25+
isIconCheckVisible = prefsInteractor.getIsCategoriesSearchEnabled(),
26+
)
27+
28+
result += OptionsListParams.Item(
29+
id = CategoriesOptionsListItem.Filter,
30+
text = resourceRepo.getString(R.string.chart_filter_hint),
31+
icon = R.drawable.filter,
32+
isIconCheckVisible = selectedIds.isNotEmpty(),
33+
)
34+
35+
return result
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.example.util.simpletimetracker.feature_categories.model
2+
3+
import com.example.util.simpletimetracker.navigation.params.screen.OptionsListParams
4+
import kotlinx.parcelize.Parcelize
5+
6+
sealed interface CategoriesOptionsListItem : OptionsListParams.Item.Id {
7+
8+
@Parcelize
9+
data object Filter : CategoriesOptionsListItem
10+
11+
@Parcelize
12+
data object EnabledSearch : CategoriesOptionsListItem
13+
}

features/feature_categories/src/main/java/com/example/util/simpletimetracker/feature_categories/view/CategoriesFragment.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.example.util.simpletimetracker.feature_categories.viewModel.Categorie
2626
import com.example.util.simpletimetracker.feature_views.extension.pxToDp
2727
import com.example.util.simpletimetracker.feature_views.extension.setMargins
2828
import com.example.util.simpletimetracker.feature_views.extension.setOnClick
29+
import com.example.util.simpletimetracker.navigation.params.screen.OptionsListParams
2930
import com.google.android.flexbox.FlexDirection
3031
import com.google.android.flexbox.FlexWrap
3132
import com.google.android.flexbox.FlexboxLayoutManager
@@ -100,8 +101,8 @@ class CategoriesFragment :
100101
viewModel.onVisible()
101102
}
102103

103-
override fun onOptionsItemClick(item: OptionsListViewData) {
104-
viewModel.onOptionsItemClick(item)
104+
override fun onOptionsItemClick(id: OptionsListParams.Item.Id) {
105+
viewModel.onOptionsItemClick(id)
105106
}
106107

107108
override fun onChartFilterDataSelected(

features/feature_categories/src/main/java/com/example/util/simpletimetracker/feature_categories/viewModel/CategoriesViewModel.kt

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import androidx.lifecycle.ViewModel
66
import androidx.lifecycle.viewModelScope
77
import com.example.util.simpletimetracker.core.extension.set
88
import com.example.util.simpletimetracker.core.extension.toParams
9-
import com.example.util.simpletimetracker.core.model.OptionsListItem
109
import com.example.util.simpletimetracker.core.repo.ResourceRepo
1110
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
1211
import com.example.util.simpletimetracker.domain.recordType.interactor.RecordTypeInteractor
@@ -16,9 +15,10 @@ import com.example.util.simpletimetracker.feature_base_adapter.category.Category
1615
import com.example.util.simpletimetracker.feature_base_adapter.category.CategoryViewData
1716
import com.example.util.simpletimetracker.feature_base_adapter.category.TagType
1817
import com.example.util.simpletimetracker.feature_base_adapter.loader.LoaderViewData
19-
import com.example.util.simpletimetracker.feature_base_adapter.optionsList.OptionsListViewData
2018
import com.example.util.simpletimetracker.feature_categories.R
2119
import com.example.util.simpletimetracker.feature_categories.interactor.CategoriesViewDataInteractor
20+
import com.example.util.simpletimetracker.feature_categories.mapper.CategoriesOptionsListMapper
21+
import com.example.util.simpletimetracker.feature_categories.model.CategoriesOptionsListItem
2222
import com.example.util.simpletimetracker.feature_categories.viewData.CategoriesSearchState
2323
import com.example.util.simpletimetracker.feature_categories.viewData.CategoriesViewData
2424
import com.example.util.simpletimetracker.navigation.Router
@@ -40,6 +40,7 @@ class CategoriesViewModel @Inject constructor(
4040
private val prefsInteractor: PrefsInteractor,
4141
private val recordTypeInteractor: RecordTypeInteractor,
4242
private val categoriesViewDataInteractor: CategoriesViewDataInteractor,
43+
private val categoriesOptionsListMapper: CategoriesOptionsListMapper,
4344
) : ViewModel() {
4445

4546
val categories: LiveData<CategoriesViewData> by lazy {
@@ -55,12 +56,12 @@ class CategoriesViewModel @Inject constructor(
5556
}
5657
}
5758
val searchState: LiveData<CategoriesSearchState> by lazy {
58-
return@lazy MutableLiveData(
59-
CategoriesSearchState(
60-
isVisible = false,
61-
text = "",
62-
),
63-
)
59+
return@lazy MutableLiveData<CategoriesSearchState>().let { initial ->
60+
viewModelScope.launch {
61+
initial.value = loadSearchState()
62+
}
63+
initial
64+
}
6465
}
6566

6667
private var navBarHeightDp: Int = 0
@@ -106,18 +107,16 @@ class CategoriesViewModel @Inject constructor(
106107
updateCategories()
107108
}
108109

109-
fun onOptionsClick() {
110-
val params = OptionsListParams(
111-
type = OptionsListParams.Type.Categories,
112-
)
113-
router.navigate(params)
110+
fun onOptionsClick() = viewModelScope.launch {
111+
val items = categoriesOptionsListMapper.map(selectedTypeIds)
112+
router.navigate(OptionsListParams(items))
114113
}
115114

116-
fun onOptionsItemClick(item: OptionsListViewData) = viewModelScope.launch {
117-
val id = item.id as? OptionsListItem.Categories ?: return@launch
115+
fun onOptionsItemClick(id: OptionsListParams.Item.Id) = viewModelScope.launch {
116+
if (id !is CategoriesOptionsListItem) return@launch
118117
when (id) {
119-
is OptionsListItem.Categories.Filter -> onFilterClick()
120-
is OptionsListItem.Categories.EnabledSearch -> onSearchToggled()
118+
is CategoriesOptionsListItem.Filter -> onFilterClick()
119+
is CategoriesOptionsListItem.EnabledSearch -> onSearchToggled()
121120
}
122121
}
123122

features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/optionsDialog/OptionsListDialogFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ class OptionsListDialogFragment :
5959

6060
private fun onItemClick(item: OptionsListViewData) {
6161
fun onClick(item: OptionsListViewData) {
62-
listener?.onOptionsItemClick(item)
62+
val id = (item.id as? OptionsListItemId)?.id ?: return
63+
listener?.onOptionsItemClick(id)
6364
}
6465
router.back()
6566
item.let(throttle(::onClick))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.example.util.simpletimetracker.feature_dialogs.optionsDialog
2+
3+
import com.example.util.simpletimetracker.feature_base_adapter.optionsList.OptionsListViewData
4+
import com.example.util.simpletimetracker.navigation.params.screen.OptionsListParams
5+
6+
data class OptionsListItemId(
7+
val id: OptionsListParams.Item.Id,
8+
) : OptionsListViewData.Id

0 commit comments

Comments
 (0)