diff --git a/app/src/main/java/com/rtbishop/look4sat/data/database/SatelliteDao.kt b/app/src/main/java/com/rtbishop/look4sat/data/database/SatelliteDao.kt index 38e30345..14e7d2b1 100644 --- a/app/src/main/java/com/rtbishop/look4sat/data/database/SatelliteDao.kt +++ b/app/src/main/java/com/rtbishop/look4sat/data/database/SatelliteDao.kt @@ -58,10 +58,17 @@ interface SatelliteDao { // Update @Transaction - suspend fun updateEntriesSelection(catNums: List, isSelected: Boolean) { + suspend fun restoreEntriesSelection(catNums: List, isSelected: Boolean) { clearEntriesSelection() catNums.forEach { catNum -> - updateItemSelection(catNum, true) + updateItemSelection(catNum, isSelected) + } + } + + @Transaction + suspend fun updateEntriesSelection(catNums: List, isSelected: Boolean) { + catNums.forEach { catNum -> + updateItemSelection(catNum, isSelected) } } diff --git a/app/src/main/java/com/rtbishop/look4sat/data/repository/SatelliteRepo.kt b/app/src/main/java/com/rtbishop/look4sat/data/repository/SatelliteRepo.kt index eb3672ce..dfa5034d 100644 --- a/app/src/main/java/com/rtbishop/look4sat/data/repository/SatelliteRepo.kt +++ b/app/src/main/java/com/rtbishop/look4sat/data/repository/SatelliteRepo.kt @@ -139,7 +139,7 @@ class SatelliteRepo @Inject constructor( private suspend fun insertEntriesAndRestoreSelection(entries: List) { 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() { diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesAdapter.kt b/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesAdapter.kt index 2e689d4c..32ce1a12 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesAdapter.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesAdapter.kt @@ -28,65 +28,6 @@ import java.util.* class EntriesAdapter : RecyclerView.Adapter() { - private var allItems = listOf() - private var selectAll = true - private lateinit var entriesClickListener: EntriesClickListener - - fun submitAllItems(items: List) { - allItems = items - listDiffer.submitList(items) - } - - private fun submitCurrentItems(items: List) { - 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, catNum: Int): List { - return list.filter { it.catNum == catNum } - } - - private fun filterByName(list: List, query: String): List { - 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, isSelected: Boolean) - } - private val diffCallback = object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: SatItem, newItem: SatItem): Boolean { return oldItem.catNum == newItem.catNum @@ -96,28 +37,85 @@ class EntriesAdapter : RecyclerView.Adapter() { return oldItem.isSelected == newItem.isSelected } } - private val listDiffer = AsyncListDiffer(this, diffCallback) + private var allItems = emptyList() + private var shouldSelectAll = true + private lateinit var entriesClickListener: EntriesClickListener + + interface EntriesClickListener { + fun updateSelection(catNums: List, isSelected: Boolean) + } + + fun setEntriesClickListener(listener: EntriesClickListener) { + entriesClickListener = listener + } + + fun submitAllItems(items: List) { + 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) { + 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)) } } } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt index e63edd07..6f7ac96c 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesFragment.kt @@ -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, isSelected: Boolean) { + override fun updateSelection(catNums: List, isSelected: Boolean) { viewModel.updateEntriesSelection(catNums, isSelected) } override fun onDestroyView() { - entriesAdapter = null binding = null super.onDestroyView() } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesViewModel.kt b/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesViewModel.kt index 71d028f5..8ddff484 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesViewModel.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/entriesScreen/EntriesViewModel.kt @@ -76,14 +76,7 @@ class EntriesViewModel @Inject constructor( fun updateEntriesSelection(items: List, 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) } } } \ No newline at end of file diff --git a/app/src/main/res/layout/item_sat_entry.xml b/app/src/main/res/layout/item_sat_entry.xml index fbbae115..ae952a40 100644 --- a/app/src/main/res/layout/item_sat_entry.xml +++ b/app/src/main/res/layout/item_sat_entry.xml @@ -1,6 +1,6 @@