mirror of
https://github.com/rt-bishop/Look4Sat.git
synced 2026-10-02 03:15:37 +00:00
Fixed SelectAllItems button behaviour
This commit is contained in:
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,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"
|
||||
|
||||
Reference in new issue
Block a user