Archived
FILTERING WORKS
This commit is contained in:
@@ -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) }
|
||||||
|
|||||||
Reference in New Issue
Block a user