diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/adapters/EntriesAdapter.kt b/app/src/main/java/com/rtbishop/look4sat/ui/adapters/EntriesAdapter.kt index 6b8fe9fd..f6bd113c 100755 --- a/app/src/main/java/com/rtbishop/look4sat/ui/adapters/EntriesAdapter.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/adapters/EntriesAdapter.kt @@ -22,15 +22,88 @@ package com.rtbishop.look4sat.ui.adapters import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.SearchView import androidx.recyclerview.widget.RecyclerView import com.rtbishop.look4sat.data.SatEntry import com.rtbishop.look4sat.databinding.ItemSatEntryBinding import java.util.* -class EntriesAdapter(private var entries: MutableList = mutableListOf()) : - RecyclerView.Adapter() { +class EntriesAdapter : RecyclerView.Adapter(), + SearchView.OnQueryTextListener { - private var selectAllToggle = true + private var shouldSearchAll = true + private var allEntries = mutableListOf() + private var currentEntries = mutableListOf() + + fun getEntries(): MutableList { + return allEntries + } + + fun setEntries(list: MutableList) { + allEntries = list + currentEntries = list + notifyDataSetChanged() + } + + fun selectAll() { + shouldSearchAll = if (shouldSearchAll) { + currentEntries.forEach { it.isSelected = true } + notifyDataSetChanged() + false + } else { + currentEntries.forEach { it.isSelected = false } + notifyDataSetChanged() + true + } + } + + private fun filterEntries(list: MutableList, query: String): MutableList { + if (query.isEmpty()) return list + return try { + filterByCatNum(list, query.toInt()) + } catch (e: NumberFormatException) { + filterByName(list, query) + } + } + + private fun filterByCatNum(list: MutableList, catNum: Int): MutableList { + return list.filter { it.catNum == catNum } as MutableList + } + + private fun filterByName(list: MutableList, query: String): MutableList { + val defaultLocale = Locale.getDefault() + val filteredList = mutableListOf() + val searchQuery = query.toLowerCase(defaultLocale) + list.forEach { + val entryName = it.name.toLowerCase(defaultLocale) + if (entryName.contains(searchQuery)) filteredList.add(it) + } + return filteredList + } + + override fun onQueryTextChange(newText: String): Boolean { + currentEntries = filterEntries(getEntries(), newText) + notifyDataSetChanged() + return false + } + + override fun onQueryTextSubmit(query: String): Boolean { + return false + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SatEntryHolder { + val binding = ItemSatEntryBinding + .inflate(LayoutInflater.from(parent.context), parent, false) + return SatEntryHolder(binding.root, binding) + } + + override fun onBindViewHolder(holder: SatEntryHolder, position: Int) { + holder.bind(currentEntries[position]) + } + + override fun getItemCount(): Int { + return currentEntries.size + } inner class SatEntryHolder(itemView: View, private val binding: ItemSatEntryBinding) : RecyclerView.ViewHolder(itemView) { @@ -43,65 +116,4 @@ class EntriesAdapter(private var entries: MutableList = mutableListOf( } } } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SatEntryHolder { - val binding = ItemSatEntryBinding - .inflate(LayoutInflater.from(parent.context), parent, false) - return SatEntryHolder(binding.root, binding) - } - - override fun onBindViewHolder(holder: SatEntryHolder, position: Int) { - holder.bind(entries[position]) - } - - override fun getItemCount(): Int { - return entries.size - } - - fun getEntries(): MutableList { - return entries - } - - fun setEntries(list: MutableList) { - entries = list - notifyDataSetChanged() - } - - fun selectAll() { - selectAllToggle = if (selectAllToggle) { - val currentList = getEntries() - currentList.forEach { it.isSelected = true } - setEntries(currentList) - false - } else { - val currentList = getEntries() - currentList.forEach { it.isSelected = false } - setEntries(currentList) - true - } - } - - fun filterEntries(list: MutableList, query: String): MutableList { - if (query.isEmpty()) return list - return try { - filterByCatNum(list, query.toInt()) - } catch (e: NumberFormatException) { - filterByName(list, query) - } - } - - private fun filterByCatNum(list: MutableList, catNum: Int): MutableList { - val filteredList = list.filter { it.catNum == catNum } - return filteredList as MutableList - } - - private fun filterByName(list: MutableList, query: String): MutableList { - val searchQuery = query.toLowerCase(Locale.getDefault()) - val filteredList = mutableListOf() - list.forEach { - val entryName = it.name.toLowerCase(Locale.getDefault()) - if (entryName.contains(searchQuery)) filteredList.add(it) - } - return filteredList - } } diff --git a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/EntriesFragment.kt b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/EntriesFragment.kt index 5ff39091..6159b35e 100644 --- a/app/src/main/java/com/rtbishop/look4sat/ui/fragments/EntriesFragment.kt +++ b/app/src/main/java/com/rtbishop/look4sat/ui/fragments/EntriesFragment.kt @@ -3,7 +3,6 @@ package com.rtbishop.look4sat.ui.fragments import android.content.Intent import android.os.Bundle import android.view.View -import android.widget.SearchView import androidx.appcompat.app.AppCompatActivity import androidx.core.content.res.ResourcesCompat import androidx.fragment.app.Fragment @@ -22,8 +21,7 @@ import com.rtbishop.look4sat.ui.adapters.EntriesAdapter import javax.inject.Inject class EntriesFragment : Fragment(R.layout.fragment_entries), - SourcesDialog.SourcesSubmitListener, - SearchView.OnQueryTextListener { + SourcesDialog.SourcesSubmitListener { @Inject lateinit var factory: ViewModelFactory @@ -47,7 +45,7 @@ class EntriesFragment : Fragment(R.layout.fragment_entries), binding.apply { importWeb.setOnClickListener { showSourcesDialog() } importFile.setOnClickListener { showFileDialog() } - searchBar.setOnQueryTextListener(this@EntriesFragment) + searchBar.setOnQueryTextListener(entriesAdapter) selectAll.setOnClickListener { entriesAdapter.selectAll() } entriesRecycler.apply { val linearLayoutMgr = LinearLayoutManager(requireContext()) @@ -111,14 +109,4 @@ class EntriesFragment : Fragment(R.layout.fragment_entries), viewModel.updateEntriesSelection(catNumList) requireView().findNavController().navigate(R.id.action_entries_to_passes) } - - override fun onQueryTextChange(newText: String): Boolean { - val filteredList = entriesAdapter.filterEntries(entriesAdapter.getEntries(), newText) - entriesAdapter.setEntries(filteredList) - return false - } - - override fun onQueryTextSubmit(query: String): Boolean { - return false - } } \ No newline at end of file