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 offers list of all offers filtered by canteen and day, grouped by category
|
||||||
* @param onClickListener used for listening to clicks and long presses
|
* @param onClickListener used for listening to clicks and long presses
|
||||||
|
* @param displayAllergens whether the user wants allergens to be marked
|
||||||
*/
|
*/
|
||||||
class CanteenOfferItemAdapter(
|
class CanteenOfferItemAdapter(
|
||||||
private val offers: List<CanteenOfferGroup>,
|
private val offers: List<CanteenOfferGroup>,
|
||||||
private val onClickListener: OnClickListener
|
private val onClickListener: OnClickListener,
|
||||||
|
private val displayAllergens: Boolean,
|
||||||
) : RecyclerView.Adapter<CanteenOfferItemAdapter.OfferViewHolder>() {
|
) : RecyclerView.Adapter<CanteenOfferItemAdapter.OfferViewHolder>() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -75,7 +77,7 @@ class CanteenOfferItemAdapter(
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Set text values
|
// Set text values
|
||||||
line.textContent.text = offer.title
|
line.textContent.text = offer.title.addAllergenNotice(displayAllergens, offer.allergens)
|
||||||
line.textPrice.text = offer.price
|
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.
|
* 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
|
* Example: if the next two weeks are available, Monday through Friday and
|
||||||
* excluding weekends, this value should be 10.
|
* excluding weekends, this value should be 10.
|
||||||
* @param onClickListener for managing click and long press events
|
* @param onClickListener for managing click and long press events
|
||||||
|
* @param displayAllergens whether the user wants allergens to be marked
|
||||||
*/
|
*/
|
||||||
class CanteenOfferPageAdapter(
|
class CanteenOfferPageAdapter(
|
||||||
private var offers: List<CanteenOfferGroup>,
|
private var offers: List<CanteenOfferGroup>,
|
||||||
private var daysCovered: Int,
|
private var daysCovered: Int,
|
||||||
private val onClickListener: CanteenOfferItemAdapter.OnClickListener,
|
private val onClickListener: CanteenOfferItemAdapter.OnClickListener,
|
||||||
|
private val displayAllergens: Boolean,
|
||||||
) : RecyclerView.Adapter<CanteenOfferPageAdapter.CanteenOfferPageViewHolder>() {
|
) : RecyclerView.Adapter<CanteenOfferPageAdapter.CanteenOfferPageViewHolder>() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -47,7 +49,9 @@ class CanteenOfferPageAdapter(
|
|||||||
|
|
||||||
holder.binding.pageRecyclerView.apply {
|
holder.binding.pageRecyclerView.apply {
|
||||||
// Set page to horizontally scroll
|
// 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
|
* Create new adapter for every page. Attribute position denotes day that will be set up
|
||||||
@@ -56,7 +60,8 @@ class CanteenOfferPageAdapter(
|
|||||||
*/
|
*/
|
||||||
adapter = CanteenOfferItemAdapter(
|
adapter = CanteenOfferItemAdapter(
|
||||||
offers.filter { it.dateId == position },
|
offers.filter { it.dateId == position },
|
||||||
onClickListener
|
onClickListener,
|
||||||
|
displayAllergens,
|
||||||
)
|
)
|
||||||
|
|
||||||
// Animate creation of new page
|
// Animate creation of new page
|
||||||
|
|||||||
@@ -85,18 +85,6 @@ class AppRepository(app: Application) {
|
|||||||
val oldString = getDietaryPrefs().toMutableList()
|
val oldString = getDietaryPrefs().toMutableList()
|
||||||
|
|
||||||
oldString[pref.ordinal] = newValue.toChar()
|
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("")
|
val newString = oldString.joinToString("")
|
||||||
prefs.edit().putString(dietaryPrefString, newString).apply()
|
prefs.edit().putString(dietaryPrefString, newString).apply()
|
||||||
}
|
}
|
||||||
@@ -117,19 +105,6 @@ class AppRepository(app: Application) {
|
|||||||
*/
|
*/
|
||||||
fun getPreference(pref: DietaryPreferences): Boolean =
|
fun getPreference(pref: DietaryPreferences): Boolean =
|
||||||
getDietaryPrefs()[pref.ordinal] == DietaryPrefObject.C_TRUE
|
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.
|
* Deletes all canteen offers from the database.
|
||||||
@@ -168,4 +143,22 @@ class AppRepository(app: Application) {
|
|||||||
* @param item object to be saved to the database
|
* @param item object to be saved to the database
|
||||||
*/
|
*/
|
||||||
fun insert(item: OfferItem) { dao.insert(item) }
|
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
|
// 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
|
// Assign the adapter to the view pager
|
||||||
binding.viewPager.adapter = viewPagerAdapter
|
binding.viewPager.adapter = viewPagerAdapter
|
||||||
@@ -129,7 +131,7 @@ class CanteenFragment : AppFragment(), CanteenOfferItemAdapter.OnClickListener {
|
|||||||
viewModel.fetchOffers(onRefreshUpdate = { status ->
|
viewModel.fetchOffers(onRefreshUpdate = { status ->
|
||||||
// TODO refresh updates
|
// TODO refresh updates
|
||||||
}, onFinish = {
|
}, onFinish = {
|
||||||
createTabLayoutMediator()
|
// createTabLayoutMediator()
|
||||||
// binding.swipeRefreshLayout.isRefreshing = false
|
// binding.swipeRefreshLayout.isRefreshing = false
|
||||||
// createTabLayoutMediator()
|
// createTabLayoutMediator()
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -7,9 +7,11 @@ import android.os.Bundle
|
|||||||
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.fragment.app.viewModels
|
||||||
import com.denizk0461.studip.BuildConfig
|
import com.denizk0461.studip.BuildConfig
|
||||||
import com.denizk0461.studip.activity.FetcherActivity
|
import com.denizk0461.studip.activity.FetcherActivity
|
||||||
import com.denizk0461.studip.databinding.FragmentSettingsBinding
|
import com.denizk0461.studip.databinding.FragmentSettingsBinding
|
||||||
|
import com.denizk0461.studip.viewmodel.SettingsViewModel
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User-facing fragment view that is used to change app settings.
|
* User-facing fragment view that is used to change app settings.
|
||||||
@@ -25,6 +27,9 @@ class SettingsFragment : AppFragment() {
|
|||||||
*/
|
*/
|
||||||
private val binding get() = _binding!!
|
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
|
// Click counter on the app version button
|
||||||
private var appVersionClick = 0
|
private var appVersionClick = 0
|
||||||
|
|
||||||
@@ -45,6 +50,13 @@ class SettingsFragment : AppFragment() {
|
|||||||
launchWebView()
|
launchWebView()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
binding.switchAllergens.apply {
|
||||||
|
isChecked = viewModel.preferenceAllergen
|
||||||
|
setOnCheckedChangeListener { _, b ->
|
||||||
|
viewModel.preferenceAllergen = b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Set click listener for the app version button
|
// Set click listener for the app version button
|
||||||
binding.buttonAppVersion.setOnClickListener {
|
binding.buttonAppVersion.setOnClickListener {
|
||||||
when (appVersionClick) {
|
when (appVersionClick) {
|
||||||
|
|||||||
@@ -61,4 +61,10 @@ class CanteenViewModel(app: Application) : AppViewModel(app) {
|
|||||||
* @return whether the preference needs to be met
|
* @return whether the preference needs to be met
|
||||||
*/
|
*/
|
||||||
fun getPreference(pref: DietaryPreferences): Boolean = repo.getPreference(pref)
|
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