AddAppViewModel.kt 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package com.simplauncher.models
  2. import androidx.lifecycle.MutableLiveData
  3. import androidx.lifecycle.Observer
  4. import androidx.lifecycle.ViewModel
  5. import androidx.lifecycle.viewModelScope
  6. import com.simplauncher.data.model.App
  7. import dagger.hilt.android.lifecycle.HiltViewModel
  8. import kotlinx.coroutines.Dispatchers
  9. import kotlinx.coroutines.launch
  10. import javax.inject.Inject
  11. @HiltViewModel
  12. class AddAppViewModel @Inject constructor(
  13. private val repository: Repository
  14. ) : ViewModel() {
  15. private var filterQuery = ""
  16. private val regex = Regex("[!@#\$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>/? ]")
  17. private val _installedApps = mutableListOf<App>()
  18. private val _homeApps = mutableListOf<App>()
  19. private val homeAppsObserver = Observer<List<HomeApp>> {
  20. this._homeApps.clear()
  21. it.orEmpty().forEach { item -> this._homeApps.add(App.from(item)) }
  22. if (it !== null) updateDisplayedApps()
  23. }
  24. val apps = MutableLiveData<List<App>>()
  25. init {
  26. repository.apps.observeForever(homeAppsObserver)
  27. }
  28. fun filterApps(query: String = "") {
  29. this.filterQuery = regex.replace(query, "")
  30. this.updateDisplayedApps()
  31. }
  32. private fun updateDisplayedApps() {
  33. val filteredApps = _installedApps.filterNot { _homeApps.contains(it) }
  34. this.apps.postValue(filteredApps.filter {
  35. regex.replace(it.appName, "").contains(filterQuery, ignoreCase = true)
  36. })
  37. }
  38. fun setInstalledApps(apps: List<App>) {
  39. this.filterQuery = ""
  40. this._installedApps.clear()
  41. this._installedApps.addAll(apps)
  42. }
  43. fun addAppToHomeScreen(app: App) {
  44. val index = _homeApps.size
  45. viewModelScope.launch(Dispatchers.IO) {
  46. repository.add(HomeApp.from(app, index))
  47. }
  48. }
  49. override fun onCleared() {
  50. super.onCleared()
  51. repository.apps.removeObserver(homeAppsObserver)
  52. }
  53. }