FILTERING WORKS

This commit is contained in:
denizk0461
2023-04-18 16:41:01 +02:00
parent 4d9ad39578
commit c4d482f78f
5 changed files with 36 additions and 86 deletions
@@ -1,14 +1,14 @@
package com.denizk0461.studip.adapter package com.denizk0461.studip.adapter
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.denizk0461.studip.databinding.ItemScrollablePageBinding import com.denizk0461.studip.databinding.ItemScrollablePageBinding
import com.denizk0461.studip.model.CanteenOffer import com.denizk0461.studip.model.CanteenOffer
import com.denizk0461.studip.model.DietaryPrefObject
class CanteenOfferPageAdapter(private var offers: List<CanteenOffer>, private var daysCovered: Int, private var prefs: DietaryPrefObject) : RecyclerView.Adapter<CanteenOfferPageAdapter.CanteenOfferPageViewHolder>() { class CanteenOfferPageAdapter(private var offers: List<CanteenOffer>, private var daysCovered: Int, private var prefsRegex: Regex) : RecyclerView.Adapter<CanteenOfferPageAdapter.CanteenOfferPageViewHolder>() {
class CanteenOfferPageViewHolder(val binding: ItemScrollablePageBinding) : RecyclerView.ViewHolder(binding.root) class CanteenOfferPageViewHolder(val binding: ItemScrollablePageBinding) : RecyclerView.ViewHolder(binding.root)
@@ -30,8 +30,26 @@ class CanteenOfferPageAdapter(private var offers: List<CanteenOffer>, private va
layoutManager = LinearLayoutManager(holder.binding.root.context, LinearLayoutManager.VERTICAL, false) layoutManager = LinearLayoutManager(holder.binding.root.context, LinearLayoutManager.VERTICAL, false)
// TODO second filter needs to be worked on; it shouldn't filter out something if two options are selected and only one is met // TODO second filter needs to be worked on; it shouldn't filter out something if two options are selected and only one is met
val filtered = offers.filter { it.dateId == position }.filter { it.dietaryPreferences == prefs.deconstruct() } // Log.d("eek!5", prefsRegex.toString())
adapter = CanteenOfferItemAdapter(filtered) // TODO check if empty val filteredForDate = offers.filter { it.dateId == position }
val filteredForPreferences = if (prefsRegex.toString() == "ffffffffff") {
// show all elements and skip filtering
filteredForDate
} else {
filteredForDate.filter {
Log.d("eek!5", it.dietaryPreferences)
prefsRegex.matches(it.dietaryPreferences)
}
}
// .filter { it.dietaryPreferences == prefs.deconstruct() }
// val filtered2 = filtered
// offers
adapter = CanteenOfferItemAdapter(filteredForPreferences) // TODO check if empty
scheduleLayoutAnimation() scheduleLayoutAnimation()
} }
} }
@@ -42,8 +60,11 @@ class CanteenOfferPageAdapter(private var offers: List<CanteenOffer>, private va
notifyDataSetChanged() notifyDataSetChanged()
} }
fun refreshView(prefs: DietaryPrefObject) { fun refreshView(prefsRegex: Regex) {
this.prefs = prefs this.prefsRegex = prefsRegex
notifyDataSetChanged() notifyDataSetChanged()
} }
// private fun constructRegex(pref: String): String =
// pref.replace('f', '.')
} }
@@ -6,7 +6,7 @@ import androidx.lifecycle.LiveData
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.denizk0461.studip.model.* import com.denizk0461.studip.model.*
class EventRepository(private val app: Application) { class EventRepository(app: Application) {
private val dao: EventDAO = EventDatabase.getInstance(app.applicationContext).dao() private val dao: EventDAO = EventDatabase.getInstance(app.applicationContext).dao()
private val prefs = PreferenceManager.getDefaultSharedPreferences(app) private val prefs = PreferenceManager.getDefaultSharedPreferences(app)
@@ -21,31 +21,8 @@ class EventRepository(private val app: Application) {
val allOffers: LiveData<List<CanteenOffer>> = dao.allOffers val allOffers: LiveData<List<CanteenOffer>> = dao.allOffers
// is this better than List.filter?
fun getOffersByPreference(prefs: String = getDietaryPrefs()): LiveData<List<CanteenOffer>> {
return if (prefs != "ffffffffff") {//isPreferenceSet()) {
dao.getOffersByPreference(
prefs
// isFair = prefs.isFair,
// isFish = prefs.isFish,
// isPoultry = prefs.isPoultry,
// isLamb = prefs.isLamb,
// isVital = prefs.isVital,
// isBeef = prefs.isBeef,
// isPork = prefs.isPork,
// isVegan = prefs.isVegan,
// isVegetarian = prefs.isVegetarian,
// isGame = prefs.isGame,
)
} else {
dao.allOffers
}
// return dao.allOffers
}
fun getDietaryPrefs(): String { fun getDietaryPrefs(): String {
return prefs.getString(dietaryPrefString, "ffffffffff") ?: "ffffffffff" return prefs.getString(dietaryPrefString, "..........") ?: ".........."
// return DietaryPrefObject( // return DietaryPrefObject(
// isFair = prefs.getBoolean(DietaryPreferences.FAIR.value, false), // isFair = prefs.getBoolean(DietaryPreferences.FAIR.value, false),
// isFish = prefs.getBoolean(DietaryPreferences.FISH.value, false), // isFish = prefs.getBoolean(DietaryPreferences.FISH.value, false),
@@ -98,7 +75,7 @@ class EventRepository(private val app: Application) {
prefs.edit().putString(dietaryPrefString, newString).apply() prefs.edit().putString(dietaryPrefString, newString).apply()
} }
private fun Boolean.toChar() = if (this) 't' else 'f' private fun Boolean.toChar() = if (this) 't' else '.'
fun getPreference(pref: DietaryPreferences): Boolean { fun getPreference(pref: DietaryPreferences): Boolean {
val prefString = getDietaryPrefs().toList() val prefString = getDietaryPrefs().toList()
@@ -5,17 +5,14 @@ import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.children
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.denizk0461.studip.adapter.CanteenOfferPageAdapter import com.denizk0461.studip.adapter.CanteenOfferPageAdapter
import com.denizk0461.studip.databinding.FragmentCanteenBinding import com.denizk0461.studip.databinding.FragmentCanteenBinding
import com.denizk0461.studip.model.CanteenOffer import com.denizk0461.studip.model.CanteenOffer
import com.denizk0461.studip.model.DietaryPreferences import com.denizk0461.studip.model.DietaryPreferences
import com.denizk0461.studip.viewmodel.CanteenViewModel import com.denizk0461.studip.viewmodel.CanteenViewModel
import com.google.android.material.chip.Chip
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
class CanteenFragment : Fragment() { class CanteenFragment : Fragment() {
@@ -71,40 +68,17 @@ class CanteenFragment : Fragment() {
} }
} }
// binding.chipPrefFair viewPagerAdapter = CanteenOfferPageAdapter(listOf(), 0, getPrefRegex())
// binding.chipPrefFair.setOnCheckedChangeListener { _, newValue ->
// setPreference(DietaryPreferences.FAIR, newValue)
// }
viewPagerAdapter = CanteenOfferPageAdapter(listOf(), 0, viewModel.getDietaryPrefs())
binding.viewPager.adapter = viewPagerAdapter binding.viewPager.adapter = viewPagerAdapter
createTabLayoutMediator() createTabLayoutMediator()
liveData = viewModel.getOffersByPreference() liveData = viewModel.allOffers
liveData.observe(viewLifecycleOwner) { offers -> liveData.observe(viewLifecycleOwner) { offers ->
dates = offers.map { it.date }.distinct() dates = offers.map { it.date }.distinct()
createTabLayoutMediator() createTabLayoutMediator()
// val newOffers = mutableListOf<CanteenOffer>()
// val prefs = viewModel.getDietaryPrefs()
// if (prefs.isFair) { newOffers.addAll(offers.filter { it.isFair }) }
// if (prefs.isFish) { newOffers.addAll(offers.filter { it.isFish }) }
// if (prefs.isPoultry) { newOffers.addAll(offers.filter { it.isPoultry }) }
// if (prefs.isLamb) { newOffers.addAll(offers.filter { it.isLamb }) }
// if (prefs.isVital) { newOffers.addAll(offers.filter { it.isVital }) }
// if (prefs.isBeef) { newOffers.addAll(offers.filter { it.isBeef }) }
// if (prefs.isPork) { newOffers.addAll(offers.filter { it.isPork }) }
// if (prefs.isVegetarian) { newOffers.addAll(offers.filter { it.isVegetarian }) }
// if (prefs.isVegan) { newOffers.addAll(offers.filter { it.isVegan }) }
// if (prefs.isGame) { newOffers.addAll(offers.filter { it.isGame }) }
// newOffers.sortBy { it ->
// Log.d("eek!4", "title: ${it.title} - id: ${it.itemId}")
// it.itemId
// }
viewPagerAdapter.setNewItems(offers, dates.size) viewPagerAdapter.setNewItems(offers, dates.size)
// TODO this must be changed. if an exception is raised, then this will not fire // TODO this must be changed. if an exception is raised, then this will not fire
@@ -135,17 +109,12 @@ class CanteenFragment : Fragment() {
private fun setPreference(pref: DietaryPreferences, newValue: Boolean) { private fun setPreference(pref: DietaryPreferences, newValue: Boolean) {
viewModel.setPreference(pref, newValue) viewModel.setPreference(pref, newValue)
viewPagerAdapter.refreshView(viewModel.getDietaryPrefs()) viewPagerAdapter.refreshView(getPrefRegex())
// Log.d("eek!4", "this")
// liveData.forceRefresh()
// viewModel.forceRefresh()
// notifyDataSetChanged?
} }
private fun getPreference(pref: DietaryPreferences): Boolean = private fun getPreference(pref: DietaryPreferences): Boolean =
viewModel.getPreference(pref) viewModel.getPreference(pref)
private fun MutableLiveData<List<CanteenOffer>>.forceRefresh() { private fun getPrefRegex(): Regex =
this.value = this.value Regex(viewModel.getDietaryPrefs().deconstruct().replace('t', '.'))
}
} }
@@ -15,7 +15,7 @@ data class DietaryPrefObject(
companion object { companion object {
/* assume that the values must be parsed as follows: /* assume that the values must be parsed as follows:
* "xxxxxxxxxx" * "xxxxxxxxxx"
* t = true, f = false * t = true, . = false
*/ */
fun construct(values: String) = DietaryPrefObject( fun construct(values: String) = DietaryPrefObject(
isFair = values[0] == 't', isFair = values[0] == 't',
@@ -2,7 +2,6 @@ package com.denizk0461.studip.viewmodel
import android.app.Application import android.app.Application
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.denizk0461.studip.data.StwParser import com.denizk0461.studip.data.StwParser
import com.denizk0461.studip.model.CanteenOffer import com.denizk0461.studip.model.CanteenOffer
import com.denizk0461.studip.model.DietaryPrefObject import com.denizk0461.studip.model.DietaryPrefObject
@@ -12,26 +11,10 @@ class CanteenViewModel(app: Application) : TemplateViewModel(app) {
private val parser = StwParser() private val parser = StwParser()
// bad pattern i know
private val mutableOffers = MutableLiveData<List<CanteenOffer>>()
val allOffers: LiveData<List<CanteenOffer>> = repo.allOffers val allOffers: LiveData<List<CanteenOffer>> = repo.allOffers
fun getOffersByPreference(): LiveData<List<CanteenOffer>> {
val of = repo.getOffersByPreference()
mutableOffers.postValue(of.value)
return of
}
fun getDietaryPrefs(): DietaryPrefObject = repo.getDietaryPrefsAsObj() fun getDietaryPrefs(): DietaryPrefObject = repo.getDietaryPrefsAsObj()
fun forceRefresh() {
mutableOffers.value = mutableOffers.value
}
// fun insertOffers(offers: List<CanteenOffer>) { doAsync { repo.insertOffers(offers) }}
fun nukeOffers() { doAsync { repo.nukeOffers() }}
fun fetchOffers(onRefreshUpdate: (status: Int) -> Unit, onFinish: () -> Unit) { doAsync { parser.parse(onRefreshUpdate, onFinish) }} fun fetchOffers(onRefreshUpdate: (status: Int) -> Unit, onFinish: () -> Unit) { doAsync { parser.parse(onRefreshUpdate, onFinish) }}
fun setPreference(pref: DietaryPreferences, newValue: Boolean) { repo.setPreference(pref, newValue) } fun setPreference(pref: DietaryPreferences, newValue: Boolean) { repo.setPreference(pref, newValue) }