Archived
Implemented user setting for displaying allergens next to an offer
This commit is contained in:
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -11,17 +11,19 @@ import com.denizk0461.studip.model.CanteenOfferGroup
|
||||
* Custom RecyclerView adapter for managing multiple pages of canteen offers in a RecyclerView or
|
||||
* ViewPager.
|
||||
*
|
||||
* @param offers all offers for a given canteen, grouped by category (not filtered by day at
|
||||
* this point)
|
||||
* @param daysCovered tells for how many days offers are available for.
|
||||
* Example: if the next two weeks are available, Monday through Friday and
|
||||
* excluding weekends, this value should be 10.
|
||||
* @param offers all offers for a given canteen, grouped by category (not filtered by day at
|
||||
* this point)
|
||||
* @param daysCovered tells for how many days offers are available for.
|
||||
* 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) }
|
||||
}
|
||||
Reference in New Issue
Block a user