Implemented user setting for displaying allergens next to an offer

This commit is contained in:
denizk0461
2023-04-23 22:06:29 +02:00
parent 8d6a15c4d5
commit d654ba8a03
7 changed files with 94 additions and 36 deletions
@@ -15,10 +15,12 @@ import com.denizk0461.studip.model.CanteenOfferGroupElement
*
* @param offers list of all offers filtered by canteen and day, grouped by category
* @param onClickListener used for listening to clicks and long presses
* @param displayAllergens whether the user wants allergens to be marked
*/
class CanteenOfferItemAdapter(
private val offers: List<CanteenOfferGroup>,
private val onClickListener: OnClickListener
private val onClickListener: OnClickListener,
private val displayAllergens: Boolean,
) : RecyclerView.Adapter<CanteenOfferItemAdapter.OfferViewHolder>() {
/**
@@ -75,7 +77,7 @@ class CanteenOfferItemAdapter(
)
// Set text values
line.textContent.text = offer.title
line.textContent.text = offer.title.addAllergenNotice(displayAllergens, offer.allergens)
line.textPrice.text = offer.price
/*
@@ -121,6 +123,26 @@ class CanteenOfferItemAdapter(
}
}
/**
* Adds a star to mark allergens present in an offer. Allergens will be displayed as a star '*'
* next to the title.
*
* @param displayAllergens whether the user wants allergens to be displayed
* @param allergens allergens present in the offer
* @return the formatted string
*/
private fun String.addAllergenNotice(displayAllergens: Boolean, allergens: String): String {
/*
* Don't add anything to the string if the user does not want a star added, or if the item
* does not contain any allergens or additives.
*/
if (!displayAllergens || allergens.isBlank()) return this
// Add a star to the string
return "$this*"
}
/**
* Interface used to evaluate clicks and long presses on a given item.
*/
@@ -17,11 +17,13 @@ import com.denizk0461.studip.model.CanteenOfferGroup
* Example: if the next two weeks are available, Monday through Friday and
* excluding weekends, this value should be 10.
* @param onClickListener for managing click and long press events
* @param displayAllergens whether the user wants allergens to be marked
*/
class CanteenOfferPageAdapter(
private var offers: List<CanteenOfferGroup>,
private var daysCovered: Int,
private val onClickListener: CanteenOfferItemAdapter.OnClickListener,
private val displayAllergens: Boolean,
) : RecyclerView.Adapter<CanteenOfferPageAdapter.CanteenOfferPageViewHolder>() {
/**
@@ -47,7 +49,9 @@ class CanteenOfferPageAdapter(
holder.binding.pageRecyclerView.apply {
// Set page to horizontally scroll
layoutManager = LinearLayoutManager(holder.binding.root.context, LinearLayoutManager.VERTICAL, false)
layoutManager = LinearLayoutManager(
holder.binding.root.context, LinearLayoutManager.VERTICAL, false
)
/*
* Create new adapter for every page. Attribute position denotes day that will be set up
@@ -56,7 +60,8 @@ class CanteenOfferPageAdapter(
*/
adapter = CanteenOfferItemAdapter(
offers.filter { it.dateId == position },
onClickListener
onClickListener,
displayAllergens,
)
// Animate creation of new page
@@ -85,18 +85,6 @@ class AppRepository(app: Application) {
val oldString = getDietaryPrefs().toMutableList()
oldString[pref.ordinal] = newValue.toChar()
// 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("")
prefs.edit().putString(dietaryPrefString, newString).apply()
}
@@ -117,19 +105,6 @@ class AppRepository(app: Application) {
*/
fun getPreference(pref: DietaryPreferences): Boolean =
getDietaryPrefs()[pref.ordinal] == DietaryPrefObject.C_TRUE
// 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'
// }
/**
* Deletes all canteen offers from the database.
@@ -168,4 +143,22 @@ class AppRepository(app: Application) {
* @param item object to be saved to the database
*/
fun insert(item: OfferItem) { dao.insert(item) }
// --- settings preferences --- //
/**
* Retrieves the user's preference on displaying allergens.
*
* @return whether the user set this preference
*/
fun getPreferenceAllergen(): Boolean = prefs.getBoolean("setting_allergen", false)
/**
* Updates the user's preference on displaying allergens.
*
* @param value new value to set the preference to
*/
fun setPreferenceAllergen(value: Boolean) {
prefs.edit().putBoolean("setting_allergen", value).apply()
}
}
@@ -91,7 +91,9 @@ class CanteenFragment : AppFragment(), CanteenOfferItemAdapter.OnClickListener {
}
// Set up the view pager's adapter
viewPagerAdapter = CanteenOfferPageAdapter(listOf(), 0, this)
viewPagerAdapter = CanteenOfferPageAdapter(
listOf(), 0, this, viewModel.preferenceAllergen
)
// Assign the adapter to the view pager
binding.viewPager.adapter = viewPagerAdapter
@@ -129,7 +131,7 @@ class CanteenFragment : AppFragment(), CanteenOfferItemAdapter.OnClickListener {
viewModel.fetchOffers(onRefreshUpdate = { status ->
// TODO refresh updates
}, onFinish = {
createTabLayoutMediator()
// createTabLayoutMediator()
// binding.swipeRefreshLayout.isRefreshing = false
// createTabLayoutMediator()
})
@@ -7,9 +7,11 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import com.denizk0461.studip.BuildConfig
import com.denizk0461.studip.activity.FetcherActivity
import com.denizk0461.studip.databinding.FragmentSettingsBinding
import com.denizk0461.studip.viewmodel.SettingsViewModel
/**
* User-facing fragment view that is used to change app settings.
@@ -25,6 +27,9 @@ class SettingsFragment : AppFragment() {
*/
private val binding get() = _binding!!
// View model reference for providing access to the database
private val viewModel: SettingsViewModel by viewModels()
// Click counter on the app version button
private var appVersionClick = 0
@@ -45,6 +50,13 @@ class SettingsFragment : AppFragment() {
launchWebView()
}
binding.switchAllergens.apply {
isChecked = viewModel.preferenceAllergen
setOnCheckedChangeListener { _, b ->
viewModel.preferenceAllergen = b
}
}
// Set click listener for the app version button
binding.buttonAppVersion.setOnClickListener {
when (appVersionClick) {
@@ -61,4 +61,10 @@ class CanteenViewModel(app: Application) : AppViewModel(app) {
* @return whether the preference needs to be met
*/
fun getPreference(pref: DietaryPreferences): Boolean = repo.getPreference(pref)
/**
* This value determines whether the user wants to have allergens marked.
*/
val preferenceAllergen: Boolean
get() = repo.getPreferenceAllergen()
}
@@ -0,0 +1,18 @@
package com.denizk0461.studip.viewmodel
import android.app.Application
/**
* View model for [com.denizk0461.studip.fragment.SettingsFragment]
*
* @param app reference to the app
*/
class SettingsViewModel(app: Application) : AppViewModel(app) {
/**
* This value determines whether the user wants to have allergens marked.
*/
var preferenceAllergen: Boolean
get() = repo.getPreferenceAllergen()
set(value) { repo.setPreferenceAllergen(value) }
}