diff --git a/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt b/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt index e07b16d..9ac107f 100644 --- a/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt +++ b/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt @@ -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, private var daysCovered: Int, private var prefs: DietaryPrefObject) : RecyclerView.Adapter() { +class CanteenOfferPageAdapter(private var offers: List, private var daysCovered: Int, private var prefsRegex: Regex) : RecyclerView.Adapter() { class CanteenOfferPageViewHolder(val binding: ItemScrollablePageBinding) : RecyclerView.ViewHolder(binding.root) @@ -30,8 +30,26 @@ class CanteenOfferPageAdapter(private var offers: List, 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, 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', '.') } \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/studip/db/EventRepository.kt b/app/src/main/java/com/denizk0461/studip/db/EventRepository.kt index 651cc95..5f67f07 100644 --- a/app/src/main/java/com/denizk0461/studip/db/EventRepository.kt +++ b/app/src/main/java/com/denizk0461/studip/db/EventRepository.kt @@ -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> = dao.allOffers - // is this better than List.filter? - fun getOffersByPreference(prefs: String = getDietaryPrefs()): LiveData> { - 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() diff --git a/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt b/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt index e87bcf2..7aaba13 100644 --- a/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt +++ b/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt @@ -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() - -// 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>.forceRefresh() { - this.value = this.value - } + private fun getPrefRegex(): Regex = + Regex(viewModel.getDietaryPrefs().deconstruct().replace('t', '.')) } \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/studip/model/DietaryPrefObject.kt b/app/src/main/java/com/denizk0461/studip/model/DietaryPrefObject.kt index 2a258e2..5344d7f 100644 --- a/app/src/main/java/com/denizk0461/studip/model/DietaryPrefObject.kt +++ b/app/src/main/java/com/denizk0461/studip/model/DietaryPrefObject.kt @@ -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', diff --git a/app/src/main/java/com/denizk0461/studip/viewmodel/CanteenViewModel.kt b/app/src/main/java/com/denizk0461/studip/viewmodel/CanteenViewModel.kt index c4de321..528e00f 100644 --- a/app/src/main/java/com/denizk0461/studip/viewmodel/CanteenViewModel.kt +++ b/app/src/main/java/com/denizk0461/studip/viewmodel/CanteenViewModel.kt @@ -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>() - val allOffers: LiveData> = repo.allOffers - fun getOffersByPreference(): LiveData> { - 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) { 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) }