diff --git a/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferItemAdapter.kt b/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferItemAdapter.kt index aff0b41..1557d72 100644 --- a/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferItemAdapter.kt +++ b/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferItemAdapter.kt @@ -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, - private val onClickListener: OnClickListener + private val onClickListener: OnClickListener, + private val displayAllergens: Boolean, ) : RecyclerView.Adapter() { /** @@ -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. */ 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 3a4c2ba..82a9432 100644 --- a/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt +++ b/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt @@ -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, private var daysCovered: Int, private val onClickListener: CanteenOfferItemAdapter.OnClickListener, + private val displayAllergens: Boolean, ) : RecyclerView.Adapter() { /** @@ -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 diff --git a/app/src/main/java/com/denizk0461/studip/db/AppRepository.kt b/app/src/main/java/com/denizk0461/studip/db/AppRepository.kt index 1c5217e..73ba986 100644 --- a/app/src/main/java/com/denizk0461/studip/db/AppRepository.kt +++ b/app/src/main/java/com/denizk0461/studip/db/AppRepository.kt @@ -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() + } } \ No newline at end of file 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 051300f..08d3b31 100644 --- a/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt +++ b/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt @@ -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() }) diff --git a/app/src/main/java/com/denizk0461/studip/fragment/SettingsFragment.kt b/app/src/main/java/com/denizk0461/studip/fragment/SettingsFragment.kt index baf7e70..d1be148 100644 --- a/app/src/main/java/com/denizk0461/studip/fragment/SettingsFragment.kt +++ b/app/src/main/java/com/denizk0461/studip/fragment/SettingsFragment.kt @@ -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) { 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 7098040..fb64fb1 100644 --- a/app/src/main/java/com/denizk0461/studip/viewmodel/CanteenViewModel.kt +++ b/app/src/main/java/com/denizk0461/studip/viewmodel/CanteenViewModel.kt @@ -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() } \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/studip/viewmodel/SettingsViewModel.kt b/app/src/main/java/com/denizk0461/studip/viewmodel/SettingsViewModel.kt new file mode 100644 index 0000000..0223699 --- /dev/null +++ b/app/src/main/java/com/denizk0461/studip/viewmodel/SettingsViewModel.kt @@ -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) } +} \ No newline at end of file