Made some improvements to the dietary preference handling, but CanteenOfferPageAdapter.kt still needs some work for the filtering to work properly; it should only filter out elements if they meet NO preferences!

This commit is contained in:
denizk0461
2023-04-18 15:39:49 +02:00
parent c385da4287
commit 4d9ad39578
12 changed files with 252 additions and 113 deletions
@@ -46,14 +46,21 @@ interface EventDAO {
"JOIN offer_category ON offer_item.categoryId = offer_category.id " +
"JOIN offer_canteen ON offer_category.canteenId = offer_canteen.id " +
"JOIN offer_date ON offer_category.dateId = offer_date.id " +
"WHERE isFair = :isFair AND isFish = :isFish AND isPoultry = :isPoultry " +
"AND isLamb = :isLamb AND isVital = :isVital AND isBeef = :isBeef " +
"AND isPork = :isPork AND isVegan = :isVegan AND isVegetarian = :isVegetarian " +
"AND isGame = :isGame "
"WHERE dietary_preferences = :prefs "
// "WHERE isFair = :isFair " +
// "OR isFish = :isFish " +
// "OR isPoultry = :isPoultry " +
// "OR isLamb = :isLamb " +
// "OR isVital = :isVital " +
// "OR isBeef = :isBeef " +
// "OR isPork = :isPork " +
// "OR isVegan = :isVegan " +
// "OR isVegetarian = :isVegetarian " +
// "OR isGame = :isGame "
)
fun getOffersByPreference(
isFair: Boolean, isFish: Boolean, isPoultry: Boolean, isLamb: Boolean, isVital: Boolean,
isBeef: Boolean, isPork: Boolean, isVegan: Boolean, isVegetarian: Boolean, isGame: Boolean
fun getOffersByPreference(prefs: String
// isFair: Boolean, isFish: Boolean, isPoultry: Boolean, isLamb: Boolean, isVital: Boolean,
// isBeef: Boolean, isPork: Boolean, isVegan: Boolean, isVegetarian: Boolean, isGame: Boolean
): LiveData<List<CanteenOffer>>
@get:Query("SELECT id FROM offer_date")
@@ -14,7 +14,7 @@ import com.denizk0461.studip.model.*
OfferCategory::class,
OfferItem::class
],
version = 8
version = 10,
)
abstract class EventDatabase : RoomDatabase() {
@@ -1,6 +1,7 @@
package com.denizk0461.studip.db
import android.app.Application
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.preference.PreferenceManager
import com.denizk0461.studip.model.*
@@ -12,6 +13,8 @@ class EventRepository(private val app: Application) {
val allEvents: LiveData<List<StudIPEvent>> = dao.allEvents
private val dietaryPrefString = "prefs_obj"
fun insertEvent(event: StudIPEvent) { dao.insertEvent(event) }
fun insertEvents(events: List<StudIPEvent>) { dao.insertEvents(events) }
fun nukeEvents() { dao.nukeEvents() }
@@ -19,63 +22,100 @@ class EventRepository(private val app: Application) {
val allOffers: LiveData<List<CanteenOffer>> = dao.allOffers
// is this better than List.filter?
fun getOffersByPreference(prefs: DietaryPrefObject = getDietaryPrefs()): LiveData<List<CanteenOffer>> {
return if (isPreferenceSet()) {
fun getOffersByPreference(prefs: String = getDietaryPrefs()): LiveData<List<CanteenOffer>> {
return if (prefs != "ffffffffff") {//isPreferenceSet()) {
dao.getOffersByPreference(
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,
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
}
private fun getDietaryPrefs(): DietaryPrefObject {
return DietaryPrefObject(
isFair = prefs.getBoolean(DietaryPreferences.FAIR.value, false),
isFish = prefs.getBoolean(DietaryPreferences.FISH.value, false),
isPoultry = prefs.getBoolean(DietaryPreferences.POULTRY.value, false),
isLamb = prefs.getBoolean(DietaryPreferences.LAMB.value, false),
isVital = prefs.getBoolean(DietaryPreferences.VITAL.value, false),
isBeef = prefs.getBoolean(DietaryPreferences.BEEF.value, false),
isPork = prefs.getBoolean(DietaryPreferences.PORK.value, false),
isVegan = prefs.getBoolean(DietaryPreferences.VEGAN.value, false),
isVegetarian = prefs.getBoolean(DietaryPreferences.VEGETARIAN.value, false),
isGame = prefs.getBoolean(DietaryPreferences.GAME.value, false),
)
fun getDietaryPrefs(): String {
return prefs.getString(dietaryPrefString, "ffffffffff") ?: "ffffffffff"
// return DietaryPrefObject(
// isFair = prefs.getBoolean(DietaryPreferences.FAIR.value, false),
// isFish = prefs.getBoolean(DietaryPreferences.FISH.value, false),
// isPoultry = prefs.getBoolean(DietaryPreferences.POULTRY.value, false),
// isLamb = prefs.getBoolean(DietaryPreferences.LAMB.value, false),
// isVital = prefs.getBoolean(DietaryPreferences.VITAL.value, false),
// isBeef = prefs.getBoolean(DietaryPreferences.BEEF.value, false),
// isPork = prefs.getBoolean(DietaryPreferences.PORK.value, false),
// isVegan = prefs.getBoolean(DietaryPreferences.VEGAN.value, false),
// isVegetarian = prefs.getBoolean(DietaryPreferences.VEGETARIAN.value, false),
// isGame = prefs.getBoolean(DietaryPreferences.GAME.value, false),
// )
}
private fun isPreferenceSet(): Boolean {
getDietaryPrefs().also { p ->
if (p.isFair) return true
if (p.isFish) return true
if (p.isPoultry) return true
if (p.isLamb) return true
if (p.isVital) return true
if (p.isBeef) return true
if (p.isPork) return true
if (p.isVegan) return true
if (p.isVegetarian) return true
if (p.isGame) return true
}
return false
}
fun getDietaryPrefsAsObj(): DietaryPrefObject = DietaryPrefObject.construct(getDietaryPrefs())
// private fun isPreferenceSet(): Boolean {
// getDietaryPrefs().also { p ->
// if (p.isFair) return true
// if (p.isFish) return true
// if (p.isPoultry) return true
// if (p.isLamb) return true
// if (p.isVital) return true
// if (p.isBeef) return true
// if (p.isPork) return true
// if (p.isVegan) return true
// if (p.isVegetarian) return true
// if (p.isGame) return true
// }
// return false
// }
fun setPreference(pref: DietaryPreferences, newValue: Boolean) {
prefs.edit().putBoolean(pref.value, newValue).apply()
// prefs.edit().putBoolean(pref.value, newValue).apply()
val oldString = getDietaryPrefs().toMutableList()
when (pref) {
DietaryPreferences.FAIR -> oldString[0] = newValue.toChar()
DietaryPreferences.FISH -> oldString[1] = newValue.toChar()
DietaryPreferences.POULTRY -> oldString[2] = newValue.toChar()
DietaryPreferences.LAMB -> oldString[3] = newValue.toChar()
DietaryPreferences.VITAL -> oldString[4] = newValue.toChar()
DietaryPreferences.BEEF -> oldString[5] = newValue.toChar()
DietaryPreferences.PORK -> oldString[6] = newValue.toChar()
DietaryPreferences.VEGAN -> oldString[7] = newValue.toChar()
DietaryPreferences.VEGETARIAN -> oldString[8] = newValue.toChar()
DietaryPreferences.GAME -> oldString[9] = newValue.toChar()
}
val newString = oldString.joinToString("")
Log.d("eek!4", newString)
prefs.edit().putString(dietaryPrefString, newString).apply()
}
fun getPreference(pref: DietaryPreferences): Boolean =
prefs.getBoolean(pref.value, false)
private fun Boolean.toChar() = if (this) 't' else 'f'
fun getPreference(pref: DietaryPreferences): Boolean {
val prefString = getDietaryPrefs().toList()
return when (pref) {
DietaryPreferences.FAIR -> prefString[0] == 't'
DietaryPreferences.FISH -> prefString[1] == 't'
DietaryPreferences.POULTRY -> prefString[2] == 't'
DietaryPreferences.LAMB -> prefString[3] == 't'
DietaryPreferences.VITAL -> prefString[4] == 't'
DietaryPreferences.BEEF -> prefString[5] == 't'
DietaryPreferences.PORK -> prefString[6] == 't'
DietaryPreferences.VEGAN -> prefString[7] == 't'
DietaryPreferences.VEGETARIAN -> prefString[8] == 't'
DietaryPreferences.GAME -> prefString[9] == 't'
}
}
// prefs.getBoolean(pref.value, false)
// fun insertOffers(offers: List<CanteenOffer>) { dao.insertOffers(offers) }
fun nukeOffers() {