Fixed SelectAllItems button behaviour

This commit is contained in:
Arty Bishop committed 2021-03-20 15:34:42 +00:00
1 parent 46bf23171f
commit d32e5a5ce3
6 files changed
+93 -102

No files matched your search

@@ -58,10 +58,17 @@ interface SatelliteDao {
// Update
@Transaction
suspend fun updateEntriesSelection(catNums: List<Int>, isSelected: Boolean) {
suspend fun restoreEntriesSelection(catNums: List<Int>, isSelected: Boolean) {
clearEntriesSelection()
catNums.forEach { catNum ->
updateItemSelection(catNum, true)
updateItemSelection(catNum, isSelected)
}
}
@Transaction
suspend fun updateEntriesSelection(catNums: List<Int>, isSelected: Boolean) {
catNums.forEach { catNum ->
updateItemSelection(catNum, isSelected)
}
}
@@ -139,7 +139,7 @@ class SatelliteRepo @Inject constructor(
private suspend fun insertEntriesAndRestoreSelection(entries: List<SatEntry>) {
val selectedCatNums = satelliteDao.getSelectedCatNums()
satelliteDao.insertEntries(entries)
satelliteDao.updateEntriesSelection(selectedCatNums, true)
satelliteDao.restoreEntriesSelection(selectedCatNums, true)
}
// Update
@@ -148,10 +148,6 @@ class SatelliteRepo @Inject constructor(
satelliteDao.updateEntriesSelection(catNums, isSelected)
}
suspend fun updateItemSelection(catNum: Int, isSelected: Boolean) {
satelliteDao.updateItemSelection(catNum, isSelected)
}
// Delete
suspend fun deleteAllData() {
@@ -28,65 +28,6 @@ import java.util.*
class EntriesAdapter : RecyclerView.Adapter<EntriesAdapter.SatItemHolder>() {
private var allItems = listOf<SatItem>()
private var selectAll = true
private lateinit var entriesClickListener: EntriesClickListener
fun submitAllItems(items: List<SatItem>) {
allItems = items
listDiffer.submitList(items)
}
private fun submitCurrentItems(items: List<SatItem>) {
listDiffer.submitList(items)
}
fun setEntriesClickListener(listener: EntriesClickListener) {
entriesClickListener = listener
}
fun filterItems(query: String) {
selectAll = true
if (query.isEmpty()) {
submitCurrentItems(allItems)
} else {
try {
val catNum = query.toInt()
submitCurrentItems(filterByCatNum(allItems, catNum))
} catch (e: NumberFormatException) {
submitCurrentItems(filterByName(allItems, query))
}
}
}
private fun filterByCatNum(list: List<SatItem>, catNum: Int): List<SatItem> {
return list.filter { it.catNum == catNum }
}
private fun filterByName(list: List<SatItem>, query: String): List<SatItem> {
val defaultLocale = Locale.getDefault()
val searchQuery = query.toLowerCase(defaultLocale)
return list.filter { satItem ->
val lowerCaseItem = satItem.name.toLowerCase(defaultLocale)
lowerCaseItem.contains(searchQuery)
}
}
fun selectAllItems() {
// currentItems.forEach { it.isSelected = selectAll }
// selectAll = selectAll.not()
// notifyDataSetChanged()
// val catNums = listDiffer.currentList.map { it.catNum }
// entriesClickListener.onSelectAllClick(catNums, selectAll)
// selectAll = selectAll.not()
}
interface EntriesClickListener {
fun onItemClick(catNum: Int, isSelected: Boolean)
fun onSelectAllClick(catNums: List<Int>, isSelected: Boolean)
}
private val diffCallback = object : DiffUtil.ItemCallback<SatItem>() {
override fun areItemsTheSame(oldItem: SatItem, newItem: SatItem): Boolean {
return oldItem.catNum == newItem.catNum
@@ -96,28 +37,85 @@ class EntriesAdapter : RecyclerView.Adapter<EntriesAdapter.SatItemHolder>() {
return oldItem.isSelected == newItem.isSelected
}
}
private val listDiffer = AsyncListDiffer(this, diffCallback)
private var allItems = emptyList<SatItem>()
private var shouldSelectAll = true
private lateinit var entriesClickListener: EntriesClickListener
interface EntriesClickListener {
fun updateSelection(catNums: List<Int>, isSelected: Boolean)
}
fun setEntriesClickListener(listener: EntriesClickListener) {
entriesClickListener = listener
}
fun submitAllItems(items: List<SatItem>) {
allItems = items
listDiffer.submitList(items)
}
fun selectAllItems() {
val catNums = listDiffer.currentList.map { it.catNum }
entriesClickListener.updateSelection(catNums, shouldSelectAll)
shouldSelectAll = !shouldSelectAll
}
fun filterItems(query: String) {
if (query.isEmpty()) {
submitCurrentItems(allItems)
} else {
try {
filterByCatNum(query.toInt())
} catch (e: NumberFormatException) {
filterByName(query)
}
}
shouldSelectAll = true
}
private fun submitCurrentItems(items: List<SatItem>) {
listDiffer.submitList(items)
}
private fun filterByCatNum(catNum: Int) {
submitCurrentItems(allItems.filter { it.catNum == catNum })
}
private fun filterByName(query: String) {
val searchQuery = query.toLowerCase(Locale.getDefault())
val filteredItems = allItems.filter { satItem ->
val lowerCaseItem = satItem.name.toLowerCase(Locale.getDefault())
lowerCaseItem.contains(searchQuery)
}
submitCurrentItems(filteredItems)
}
override fun getItemCount(): Int = listDiffer.currentList.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SatItemHolder {
val inflater = LayoutInflater.from(parent.context)
return SatItemHolder(ItemSatEntryBinding.inflate(inflater, parent, false))
return SatItemHolder.from(parent)
}
override fun onBindViewHolder(holder: SatItemHolder, position: Int) {
holder.bind(listDiffer.currentList[position])
holder.bind(listDiffer.currentList[position], entriesClickListener)
}
inner class SatItemHolder(private val binding: ItemSatEntryBinding) :
class SatItemHolder private constructor(private val binding: ItemSatEntryBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: SatItem) {
binding.satEntryCheckbox.text = item.name
binding.satEntryCheckbox.isChecked = item.isSelected
fun bind(item: SatItem, clickListener: EntriesClickListener) {
binding.satItemCheckbox.text = item.name
binding.satItemCheckbox.isChecked = item.isSelected
itemView.setOnClickListener {
entriesClickListener.onItemClick(item.catNum, !item.isSelected)
clickListener.updateSelection(listOf(item.catNum), item.isSelected.not())
}
}
companion object {
fun from(parent: ViewGroup): SatItemHolder {
val inflater = LayoutInflater.from(parent.context)
return SatItemHolder(ItemSatEntryBinding.inflate(inflater, parent, false))
}
}
}
@@ -18,6 +18,7 @@
package com.rtbishop.look4sat.ui.entriesScreen
import android.os.Bundle
import android.text.Editable
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.widget.addTextChangedListener
@@ -45,21 +46,20 @@ class EntriesFragment : Fragment(R.layout.fragment_entries), EntriesAdapter.Entr
registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
uri?.let { viewModel.importSatDataFromFile(uri) }
}
private val entriesAdapter = EntriesAdapter().apply {
setEntriesClickListener(this@EntriesFragment)
}
private var binding: FragmentEntriesBinding? = null
private var entriesAdapter: EntriesAdapter? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = FragmentEntriesBinding.bind(view)
setupComponents()
setupObservers()
observeSatelliteData()
observeSourcesResult()
}
private fun setupComponents() {
entriesAdapter = EntriesAdapter().apply {
setEntriesClickListener(this@EntriesFragment)
}
binding?.apply {
entriesRecycler.apply {
setHasFixedSize(true)
@@ -70,23 +70,20 @@ class EntriesFragment : Fragment(R.layout.fragment_entries), EntriesAdapter.Entr
}
importWeb.setOnClickListener { showImportFromWebDialog() }
importFile.setOnClickListener { filePicker.launch("*/*") }
selectAll.setOnClickListener { entriesAdapter?.selectAllItems() }
searchBar.addTextChangedListener {
entriesAdapter?.filterItems(it.toString())
binding?.entriesRecycler?.scrollToPosition(0)
}
selectAll.setOnClickListener { entriesAdapter.selectAllItems() }
searchBar.addTextChangedListener { query -> filterByQuery(query) }
searchBar.clearFocus()
}
}
private fun setupObservers() {
private fun observeSatelliteData() {
viewModel.satData.observe(viewLifecycleOwner, { result ->
when (result) {
is Result.Success -> {
if (result.data.isEmpty()) {
setEmpty()
} else {
entriesAdapter?.submitAllItems(result.data)
entriesAdapter.submitAllItems(result.data)
setLoaded()
}
}
@@ -131,20 +128,20 @@ class EntriesFragment : Fragment(R.layout.fragment_entries), EntriesAdapter.Entr
}
}
private fun filterByQuery(it: Editable?) {
entriesAdapter.filterItems(it.toString())
binding?.entriesRecycler?.scrollToPosition(0)
}
private fun showImportFromWebDialog() {
findNavController().navigate(R.id.nav_dialog_sources)
}
override fun onItemClick(catNum: Int, isSelected: Boolean) {
viewModel.updateItemSelection(catNum, isSelected)
}
override fun onSelectAllClick(catNums: List<Int>, isSelected: Boolean) {
override fun updateSelection(catNums: List<Int>, isSelected: Boolean) {
viewModel.updateEntriesSelection(catNums, isSelected)
}
override fun onDestroyView() {
entriesAdapter = null
binding = null
super.onDestroyView()
}
@@ -76,14 +76,7 @@ class EntriesViewModel @Inject constructor(
fun updateEntriesSelection(items: List<Int>, isSelected: Boolean) {
viewModelScope.launch {
// val selectedEntries = items.filter { it.isSelected }.map { it.catNum }
// satelliteRepo.updateEntriesSelection(selectedEntries, isSelected)
}
}
fun updateItemSelection(catNum: Int, isSelected: Boolean) {
viewModelScope.launch {
satelliteRepo.updateItemSelection(catNum, isSelected)
satelliteRepo.updateEntriesSelection(items, isSelected)
}
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.checkbox.MaterialCheckBox xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/sat_entry_checkbox"
android:id="@+id/sat_item_checkbox"
android:layout_width="match_parent"
android:layout_height="32dp"
android:background="@null"