@@ -21,6 +21,8 @@ import androidx.lifecycle.viewModelScope
2121import com.machiav3lli.backup.MAIN_FILTER_DEFAULT
2222import com.machiav3lli.backup.MAIN_FILTER_DEFAULT_WITHOUT_SPECIAL
2323import com.machiav3lli.backup.STATEFLOW_SUBSCRIBE_BUFFER
24+ import com.machiav3lli.backup.data.dbs.entity.AppExtras
25+ import com.machiav3lli.backup.data.dbs.repository.AppExtrasRepository
2426import com.machiav3lli.backup.data.dbs.repository.BlocklistRepository
2527import com.machiav3lli.backup.data.dbs.repository.PackageRepository
2628import com.machiav3lli.backup.data.entity.MainState
@@ -31,7 +33,8 @@ import com.machiav3lli.backup.data.preferences.traceFlows
3133import com.machiav3lli.backup.ui.navigation.NavItem
3234import com.machiav3lli.backup.ui.pages.pref_newAndUpdatedNotification
3335import com.machiav3lli.backup.utils.TraceUtils.trace
34- import com.machiav3lli.backup.utils.applySearchAndFilter
36+ import com.machiav3lli.backup.utils.applyFilter
37+ import com.machiav3lli.backup.utils.applySearch
3538import com.machiav3lli.backup.utils.extensions.IconCache
3639import com.machiav3lli.backup.utils.extensions.NeoViewModel
3740import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -48,6 +51,7 @@ import kotlinx.coroutines.launch
4851class MainVM (
4952 private val packageRepository : PackageRepository ,
5053 private val blocklistRepository : BlocklistRepository ,
54+ appExtrasRepository : AppExtrasRepository ,
5155 private val prefs : NeoPrefs ,
5256) : NeoViewModel() {
5357 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FLOWS
@@ -92,6 +96,38 @@ class MainVM(
9296 emptyMap()
9397 )
9498
99+ private val notBlockedPackages = combine(
100+ packageRepository.getPackagesFlow(),
101+ blocklistRepository.getBlocklist(),
102+ ) { packages, blocklist ->
103+ packages.filterNot { it.packageName in blocklist }
104+ }
105+
106+ private val extras = appExtrasRepository.getAllFlow()
107+ .mapLatest { it.associateBy { extra -> extra.packageName } }
108+ .stateIn(
109+ viewModelScope,
110+ started = SharingStarted .WhileSubscribed (STATEFLOW_SUBSCRIBE_BUFFER ),
111+ emptyMap()
112+ )
113+
114+ val tagsMap = extras
115+ .mapLatest { it.mapValues { extras -> extras.value.customTags } }
116+ .stateIn(
117+ viewModelScope,
118+ started = SharingStarted .WhileSubscribed (STATEFLOW_SUBSCRIBE_BUFFER ),
119+ emptyMap()
120+ )
121+
122+ val allTags = tagsMap
123+ .mapLatest { it.values.flatten().toSet() }
124+ .trace { " *** all tags <<- ${it.size} " }
125+ .stateIn(
126+ viewModelScope,
127+ started = SharingStarted .WhileSubscribed (STATEFLOW_SUBSCRIBE_BUFFER ),
128+ emptySet()
129+ )
130+
95131 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FLOWS end
96132
97133 init {
@@ -104,14 +140,23 @@ class MainVM(
104140 packageRepository.getPackagesFlow(),
105141 blocklistRepository.getBlocklist(),
106142 homeSortFilterModelFlow,
143+ extras,
107144 searchQuery,
108145 selection,
109- ) { packages, blocklist, sortFilter, search, selection ->
146+ ) { args ->
147+ val packages: List <Package > = args[0 ] as List <Package >
148+ val blocklist: Set <String > = args[1 ] as Set <String >
149+ val sortFilter: SortFilterModel = args[2 ] as SortFilterModel
150+ val extras: Map <String , AppExtras > = args[3 ] as Map <String , AppExtras >
151+ val search: String = args[4 ] as String
152+ val selection: Set <String > = args[5 ] as Set <String >
153+
110154 val (filteredPackages, updatedPackages) = packages
111155 .filterNot { it.packageName in blocklist }
112156 .let {
113157 Pair (
114- it.applySearchAndFilter(search, emptyMap(), sortFilter),
158+ it.applySearch(search, extras)
159+ .applyFilter(sortFilter, extras.mapValues { it.value.customTags }),
115160 it.filter { item ->
116161 item.isUpdated || (pref_newAndUpdatedNotification.value && item.isNew)
117162 }
@@ -125,7 +170,7 @@ class MainVM(
125170 blocklist = blocklist,
126171 searchQuery = search,
127172 sortFilter = sortFilter,
128- selection = selection
173+ selection = selection,
129174 )
130175 }.collect { newState ->
131176 homeState.update { newState }
@@ -136,20 +181,29 @@ class MainVM(
136181 packageRepository.getPackagesFlow(),
137182 blocklistRepository.getBlocklist(),
138183 backupSortFilterModelFlow,
184+ extras,
139185 searchQuery,
140186 selection,
141- ) { packages, blocklist, sortFilter, search, selection ->
187+ ) { args ->
188+ val packages: List <Package > = args[0 ] as List <Package >
189+ val blocklist: Set <String > = args[1 ] as Set <String >
190+ val sortFilter: SortFilterModel = args[2 ] as SortFilterModel
191+ val extras: Map <String , AppExtras > = args[3 ] as Map <String , AppExtras >
192+ val search: String = args[4 ] as String
193+ val selection: Set <String > = args[5 ] as Set <String >
194+
142195 val filteredPackages = packages
143196 .filterNot { it.packageName in blocklist }
144- .applySearchAndFilter(search, emptyMap(), sortFilter)
197+ .applySearch(search, extras)
198+ .applyFilter(sortFilter, extras.mapValues { it.value.customTags })
145199
146200 MainState (
147201 packages = packages,
148202 filteredPackages = filteredPackages,
149203 blocklist = blocklist,
150204 searchQuery = search,
151205 sortFilter = sortFilter,
152- selection = selection
206+ selection = selection,
153207 )
154208 }.collect { newState ->
155209 backupState.update { newState }
@@ -160,20 +214,29 @@ class MainVM(
160214 packageRepository.getPackagesFlow(),
161215 blocklistRepository.getBlocklist(),
162216 restoreSortFilterModelFlow,
217+ extras,
163218 searchQuery,
164219 selection,
165- ) { packages, blocklist, sortFilter, search, selection ->
220+ ) { args ->
221+ val packages: List <Package > = args[0 ] as List <Package >
222+ val blocklist: Set <String > = args[1 ] as Set <String >
223+ val sortFilter: SortFilterModel = args[2 ] as SortFilterModel
224+ val extras: Map <String , AppExtras > = args[3 ] as Map <String , AppExtras >
225+ val search: String = args[4 ] as String
226+ val selection: Set <String > = args[5 ] as Set <String >
227+
166228 val filteredPackages = packages
167229 .filterNot { it.packageName in blocklist }
168- .applySearchAndFilter(search, emptyMap(), sortFilter)
230+ .applySearch(search, extras)
231+ .applyFilter(sortFilter, extras.mapValues { it.value.customTags })
169232
170233 MainState (
171234 packages = packages,
172235 filteredPackages = filteredPackages,
173236 blocklist = blocklist,
174237 searchQuery = search,
175238 sortFilter = sortFilter,
176- selection = selection
239+ selection = selection,
177240 )
178241 }.collect { newState ->
179242 restoreState.update { newState }
@@ -198,6 +261,7 @@ class MainVM(
198261 prefs.updatedFilterBackup.set(value.updatedFilter)
199262 prefs.latestFilterBackup.set(value.latestFilter)
200263 prefs.enabledFilterBackup.set(value.enabledFilter)
264+ prefs.tagsFilterBackup.set(value.tags)
201265 }
202266
203267 NavItem .Restore -> {
@@ -210,6 +274,7 @@ class MainVM(
210274 prefs.updatedFilterRestore.set(value.updatedFilter)
211275 prefs.latestFilterRestore.set(value.latestFilter)
212276 prefs.enabledFilterRestore.set(value.enabledFilter)
277+ prefs.tagsFilterRestore.set(value.tags)
213278 }
214279
215280 else -> {
@@ -222,6 +287,7 @@ class MainVM(
222287 prefs.updatedFilterHome.set(value.updatedFilter)
223288 prefs.latestFilterHome.set(value.latestFilter)
224289 prefs.enabledFilterHome.set(value.enabledFilter)
290+ prefs.tagsFilterHome.set(value.tags)
225291 }
226292 }
227293 }
0 commit comments