Optimized satellite item selection flow + bugfix

This commit is contained in:
Arty Bishop committed 2022-02-19 12:07:39 +00:00
1 parent 04c4ef25d2
commit 7349ee6c5e
2 files changed
+19 -25

No files matched your search

@@ -22,8 +22,8 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.AsyncListDiffer import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.rtbishop.look4sat.domain.model.SatItem
import com.rtbishop.look4sat.databinding.ItemEntryBinding import com.rtbishop.look4sat.databinding.ItemEntryBinding
import com.rtbishop.look4sat.domain.model.SatItem
class EntriesAdapter(private val clickListener: EntriesClickListener) : class EntriesAdapter(private val clickListener: EntriesClickListener) :
RecyclerView.Adapter<EntriesAdapter.SatItemHolder>() { RecyclerView.Adapter<EntriesAdapter.SatItemHolder>() {
@@ -59,7 +59,7 @@ class EntriesAdapter(private val clickListener: EntriesClickListener) :
fun bind(item: SatItem, listener: EntriesClickListener) { fun bind(item: SatItem, listener: EntriesClickListener) {
binding.entryCheckbox.text = item.name binding.entryCheckbox.text = item.name
binding.entryCheckbox.isChecked = item.isSelected binding.entryCheckbox.isChecked = item.isSelected
itemView.setOnClickListener { binding.entryCheckbox.setOnClickListener {
listener.updateSelection(listOf(item.catnum), item.isSelected.not()) listener.updateSelection(listOf(item.catnum), item.isSelected.not())
} }
} }
@@ -17,41 +17,38 @@
*/ */
package com.rtbishop.look4sat.presentation.entriesScreen package com.rtbishop.look4sat.presentation.entriesScreen
import android.widget.SearchView
import androidx.lifecycle.* import androidx.lifecycle.*
import com.rtbishop.look4sat.data.ISettingsHandler import com.rtbishop.look4sat.data.ISettingsHandler
import com.rtbishop.look4sat.domain.IDataRepository import com.rtbishop.look4sat.domain.IDataRepository
import com.rtbishop.look4sat.domain.model.DataState import com.rtbishop.look4sat.domain.model.DataState
import com.rtbishop.look4sat.domain.model.SatItem import com.rtbishop.look4sat.domain.model.SatItem
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
@HiltViewModel @HiltViewModel
class EntriesViewModel @Inject constructor( class EntriesViewModel @Inject constructor(
private val preferences: ISettingsHandler, private val preferences: ISettingsHandler,
private val dataRepository: IDataRepository private val repository: IDataRepository
) : ViewModel(), SearchView.OnQueryTextListener, EntriesAdapter.EntriesClickListener { ) : ViewModel(), EntriesAdapter.EntriesClickListener {
private val transModes = MutableLiveData(preferences.loadModesSelection()) private val transModes = MutableLiveData(preferences.loadModesSelection())
private val currentQuery = MutableLiveData(String()) private val currentQuery = MutableLiveData(String())
private val itemsFromRepo = liveData {
repository.getSatelliteItems().collect { itemsAll -> emit(itemsAll) }
} as MutableLiveData
private val itemsWithModes = transModes.switchMap { modes -> private val itemsWithModes = transModes.switchMap { modes ->
liveData { dataRepository.getSatelliteItems().collect { emit(filterByModes(it, modes)) } } itemsFromRepo.map { items -> filterByModes(items, modes) }
} }
private val itemsWithQuery = currentQuery.switchMap { query -> private val itemsWithQuery = currentQuery.switchMap { query ->
itemsWithModes.map { items -> DataState.Success(filterByQuery(items, query)) } itemsWithModes.map { items -> filterByQuery(items, query) }
}
private val _satData = MediatorLiveData<DataState<List<SatItem>>>().apply {
addSource(itemsWithQuery) { value -> this.value = value }
} }
private var shouldSelectAll = true private var shouldSelectAll = true
val satData: LiveData<DataState<List<SatItem>>> = _satData val satData = itemsWithQuery.map { items -> DataState.Success(items) }
fun selectCurrentItems() { fun selectCurrentItems() {
val currentValue = _satData.value itemsWithQuery.value?.let { itemsWithQuery ->
if (currentValue is DataState.Success) { updateSelection(itemsWithQuery.map { item -> item.catnum }, shouldSelectAll)
updateSelection(currentValue.data.map { it.catnum }, shouldSelectAll)
shouldSelectAll = shouldSelectAll.not() shouldSelectAll = shouldSelectAll.not()
} }
} }
@@ -70,17 +67,14 @@ class EntriesViewModel @Inject constructor(
currentQuery.value = query currentQuery.value = query
} }
override fun onQueryTextSubmit(query: String): Boolean {
return true
}
override fun onQueryTextChange(newText: String): Boolean {
currentQuery.value = newText
return true
}
override fun updateSelection(catNums: List<Int>, isSelected: Boolean) { override fun updateSelection(catNums: List<Int>, isSelected: Boolean) {
viewModelScope.launch { dataRepository.updateSelection(catNums, isSelected) } itemsFromRepo.value?.let { itemsAll ->
val copiedList = itemsAll.map { item -> item.copy() }
catNums.forEach { catnum ->
copiedList.find { item -> item.catnum == catnum }?.isSelected = isSelected
}
itemsFromRepo.value = copiedList
}
} }
private fun filterByModes(items: List<SatItem>, modes: List<String>): List<SatItem> { private fun filterByModes(items: List<SatItem>, modes: List<String>): List<SatItem> {