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
import android.util.Log
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.denizk0461.studip.databinding.ItemScrollablePageBinding
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)
@@ -30,8 +30,26 @@ class CanteenOfferPageAdapter(private var offers: List<CanteenOffer>, private va
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
val filtered = offers.filter { it.dateId == position }.filter { it.dietaryPreferences == prefs.deconstruct() }
adapter = CanteenOfferItemAdapter(filtered) // TODO check if empty
// Log.d("eek!5", prefsRegex.toString())
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()
}
}
@@ -42,8 +60,11 @@ class CanteenOfferPageAdapter(private var offers: List<CanteenOffer>, private va
notifyDataSetChanged()
}
fun refreshView(prefs: DietaryPrefObject) {
this.prefs = prefs
fun refreshView(prefsRegex: Regex) {
this.prefsRegex = prefsRegex
notifyDataSetChanged()
}
// private fun constructRegex(pref: String): String =
// pref.replace('f', '.')
}
@@ -6,7 +6,7 @@ import androidx.lifecycle.LiveData
import androidx.preference.PreferenceManager
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 prefs = PreferenceManager.getDefaultSharedPreferences(app)
@@ -21,31 +21,8 @@ class EventRepository(private val app: Application) {
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 {
return prefs.getString(dietaryPrefString, "ffffffffff") ?: "ffffffffff"
return prefs.getString(dietaryPrefString, "..........") ?: ".........."
// return DietaryPrefObject(
// isFair = prefs.getBoolean(DietaryPreferences.FAIR.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()
}
private fun Boolean.toChar() = if (this) 't' else 'f'
private fun Boolean.toChar() = if (this) 't' else '.'
fun getPreference(pref: DietaryPreferences): Boolean {
val prefString = getDietaryPrefs().toList()
@@ -5,17 +5,14 @@ import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.children
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.denizk0461.studip.adapter.CanteenOfferPageAdapter
import com.denizk0461.studip.databinding.FragmentCanteenBinding
import com.denizk0461.studip.model.CanteenOffer
import com.denizk0461.studip.model.DietaryPreferences
import com.denizk0461.studip.viewmodel.CanteenViewModel
import com.google.android.material.chip.Chip
import com.google.android.material.tabs.TabLayoutMediator
class CanteenFragment : Fragment() {
@@ -71,40 +68,17 @@ class CanteenFragment : Fragment() {
}
}
// binding.chipPrefFair
// binding.chipPrefFair.setOnCheckedChangeListener { _, newValue ->
// setPreference(DietaryPreferences.FAIR, newValue)
// }
viewPagerAdapter = CanteenOfferPageAdapter(listOf(), 0, viewModel.getDietaryPrefs())
viewPagerAdapter = CanteenOfferPageAdapter(listOf(), 0, getPrefRegex())
binding.viewPager.adapter = viewPagerAdapter
createTabLayoutMediator()
liveData = viewModel.getOffersByPreference()
liveData = viewModel.allOffers
liveData.observe(viewLifecycleOwner) { offers ->
dates = offers.map { it.date }.distinct()
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)
// 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) {
viewModel.setPreference(pref, newValue)
viewPagerAdapter.refreshView(viewModel.getDietaryPrefs())
// Log.d("eek!4", "this")
// liveData.forceRefresh()
// viewModel.forceRefresh()
// notifyDataSetChanged?
viewPagerAdapter.refreshView(getPrefRegex())
}
private fun getPreference(pref: DietaryPreferences): Boolean =
viewModel.getPreference(pref)
private fun MutableLiveData<List<CanteenOffer>>.forceRefresh() {
this.value = this.value
}
private fun getPrefRegex(): Regex =
Regex(viewModel.getDietaryPrefs().deconstruct().replace('t', '.'))
}
@@ -15,7 +15,7 @@ data class DietaryPrefObject(
companion object {
/* assume that the values must be parsed as follows:
* "xxxxxxxxxx"
* t = true, f = false
* t = true, . = false
*/
fun construct(values: String) = DietaryPrefObject(
isFair = values[0] == 't',
@@ -2,7 +2,6 @@ package com.denizk0461.studip.viewmodel
import android.app.Application
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.denizk0461.studip.data.StwParser
import com.denizk0461.studip.model.CanteenOffer
import com.denizk0461.studip.model.DietaryPrefObject
@@ -12,26 +11,10 @@ class CanteenViewModel(app: Application) : TemplateViewModel(app) {
private val parser = StwParser()
// bad pattern i know
private val mutableOffers = MutableLiveData<List<CanteenOffer>>()
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 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 setPreference(pref: DietaryPreferences, newValue: Boolean) { repo.setPreference(pref, newValue) }