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 1557d72..0d2295f 100644 --- a/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferItemAdapter.kt +++ b/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferItemAdapter.kt @@ -2,13 +2,14 @@ package com.denizk0461.studip.adapter import android.view.LayoutInflater import android.view.ViewGroup +import androidx.appcompat.content.res.AppCompatResources import androidx.recyclerview.widget.RecyclerView -import com.denizk0461.studip.R import com.denizk0461.studip.databinding.ItemCanteenBinding import com.denizk0461.studip.databinding.ItemCanteenLineBinding import com.denizk0461.studip.databinding.ItemIconBinding import com.denizk0461.studip.model.CanteenOfferGroup import com.denizk0461.studip.model.CanteenOfferGroupElement +import com.denizk0461.studip.model.DietaryPreferences /** * Custom RecyclerView adapter that lays out the offers of a given canteen on a given day. @@ -23,24 +24,6 @@ class CanteenOfferItemAdapter( private val displayAllergens: Boolean, ) : RecyclerView.Adapter() { - /** - * Provides a converting function between the index of a dietary preference and its according - * icon. - */ - private val indexToDrawable: Map = mapOf( - 0 to R.drawable.handshake, - 1 to R.drawable.fish, - 2 to R.drawable.chicken, - 3 to R.drawable.sheep, - 4 to R.drawable.yoga, - 5 to R.drawable.cow, - 6 to R.drawable.pig, - 7 to R.drawable.leaf, - 8 to R.drawable.carrot, - 9 to R.drawable.deer, - 10 to R.drawable.circle, - ) - /** * View holder class for parent class * @@ -102,7 +85,10 @@ class CanteenOfferItemAdapter( // Set the appropriate icon img.imageView.setImageDrawable( - holder.binding.root.context.getDrawable(indexToDrawable[index]!!) + AppCompatResources.getDrawable( + holder.binding.root.context, + DietaryPreferences.indexToDrawable[index]!!, + ) ) // Bind the new icon to the line view @@ -111,7 +97,7 @@ class CanteenOfferItemAdapter( // Set up single click listener line.root.setOnClickListener { - onClickListener.onClick(offer) + onClickListener.onClick(offer, currentItem.category) } // Set up long press listener @@ -153,7 +139,7 @@ class CanteenOfferItemAdapter( * * @param offer item that has been clicked */ - fun onClick(offer: CanteenOfferGroupElement) + fun onClick(offer: CanteenOfferGroupElement, category: String) /** 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 08d3b31..95039ed 100644 --- a/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt +++ b/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt @@ -279,8 +279,8 @@ class CanteenFragment : AppFragment(), CanteenOfferItemAdapter.OnClickListener { * * @param offer item that has been clicked */ - override fun onClick(offer: CanteenOfferGroupElement) { - openBottomSheet(AllergenSheet(offer)) + override fun onClick(offer: CanteenOfferGroupElement, category: String) { + openBottomSheet(AllergenSheet(offer, category)) } /** diff --git a/app/src/main/java/com/denizk0461/studip/model/DietaryPreferences.kt b/app/src/main/java/com/denizk0461/studip/model/DietaryPreferences.kt index 940d49e..f61a717 100644 --- a/app/src/main/java/com/denizk0461/studip/model/DietaryPreferences.kt +++ b/app/src/main/java/com/denizk0461/studip/model/DietaryPreferences.kt @@ -1,5 +1,7 @@ package com.denizk0461.studip.model +import com.denizk0461.studip.R + /** * Enumeration that can be used in conjunction with DietaryPrefObject.kt to more concisely look up, * specify, and iterate through dietary preferences. Order of these elements matches the order used @@ -19,4 +21,45 @@ enum class DietaryPreferences(val value: String) { VEGAN("isVegan"), VEGETARIAN("isVegetarian"), GAME("isGame"), + ; + + companion object { + /** + * Provides a converting function between the index of a dietary preference and its according + * icon. + * TODO this seems inefficient + */ + val indexToDrawable: Map = mapOf( + 0 to R.drawable.handshake, + 1 to R.drawable.fish, + 2 to R.drawable.chicken, + 3 to R.drawable.sheep, + 4 to R.drawable.yoga, + 5 to R.drawable.cow, + 6 to R.drawable.pig, + 7 to R.drawable.leaf, + 8 to R.drawable.carrot, + 9 to R.drawable.deer, + 10 to R.drawable.circle, + ) + + /** + * Provides a converting function between the index of a dietary preference and its + * according localised text string. + * TODO this seems inefficient + */ + val indexToString: Map = mapOf( + 0 to R.string.pref_fair, + 1 to R.string.pref_fish, + 2 to R.string.pref_poultry, + 3 to R.string.pref_lamb, + 4 to R.string.pref_vital, + 5 to R.string.pref_beef, + 6 to R.string.pref_pork, + 7 to R.string.pref_vegan, + 8 to R.string.pref_vegetarian, + 9 to R.string.pref_game, + 10 to 0, // shouldn't occur + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/studip/sheet/AllergenSheet.kt b/app/src/main/java/com/denizk0461/studip/sheet/AllergenSheet.kt index b715fc5..15ad6ae 100644 --- a/app/src/main/java/com/denizk0461/studip/sheet/AllergenSheet.kt +++ b/app/src/main/java/com/denizk0461/studip/sheet/AllergenSheet.kt @@ -1,14 +1,25 @@ package com.denizk0461.studip.sheet import android.os.Bundle +import android.view.LayoutInflater import android.view.View +import androidx.appcompat.content.res.AppCompatResources.getDrawable import com.denizk0461.studip.R import com.denizk0461.studip.data.viewBinding +import com.denizk0461.studip.databinding.ItemSheetPreferenceBinding import com.denizk0461.studip.databinding.SheetAllergenBinding import com.denizk0461.studip.model.Allergens import com.denizk0461.studip.model.CanteenOfferGroupElement +import com.denizk0461.studip.model.DietaryPreferences -class AllergenSheet(private val offer: CanteenOfferGroupElement) : AppSheet(R.layout.sheet_allergen) { +/** + * This class is used to display further information on a canteen offer to the user. Unlike the name + * implies, it displays more than just allergens. + */ +class AllergenSheet( + private val offer: CanteenOfferGroupElement, + private val category: String, +) : AppSheet(R.layout.sheet_allergen) { private val binding: SheetAllergenBinding by viewBinding(SheetAllergenBinding::bind) @@ -16,8 +27,46 @@ class AllergenSheet(private val offer: CanteenOfferGroupElement) : AppSheet(R.la super.onViewCreated(view, savedInstanceState) binding.apply { - title.text = offer.title + + // Category header + textCategory.text = getString(R.string.sheet_category, category) + + // Offer text + textTitle.text = offer.title + + // Iterate through all dietary preferences + offer.dietaryPreferences.toList().forEachIndexed { index, c -> + // If a preference is met, inflate a view to display it + if (c == 't') { + // Inflate the view + val prefLine = ItemSheetPreferenceBinding.inflate(LayoutInflater.from(context)) + + // Add the localised text for the preference + prefLine.preferenceText.text = getString(DietaryPreferences.indexToString[index]!!) + + // Set the appropriate icon + prefLine.preferenceImage.setImageDrawable( + getDrawable( + context, + DietaryPreferences.indexToDrawable[index]!!, + ) + ) + + // Add the view to the sheet's view container + containerPreferences.addView(prefLine.root) + } + } + + // Allergen and additive notice textContent.text = offer.allergens.compileAllergenString() + + // Show a price, if one is available + if (offer.price.isBlank()) { + textPrice.visibility = View.GONE + } else { + textPrice.visibility = View.VISIBLE + textPrice.text = offer.price + } } } diff --git a/app/src/main/res/layout/item_sheet_preference.xml b/app/src/main/res/layout/item_sheet_preference.xml new file mode 100644 index 0000000..05f2a3b --- /dev/null +++ b/app/src/main/res/layout/item_sheet_preference.xml @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/sheet_allergen.xml b/app/src/main/res/layout/sheet_allergen.xml index c1ee477..c15161e 100644 --- a/app/src/main/res/layout/sheet_allergen.xml +++ b/app/src/main/res/layout/sheet_allergen.xml @@ -5,30 +5,53 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="16dp" + android:paddingBottom="16dp" + android:paddingHorizontal="24dp" app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"> + + + android:layout_marginBottom="8dp"/> - + + + + + + android:orientation="vertical" + android:layout_marginBottom="8dp"/> - + + - + + + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 49c7d03..8fd423d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -104,6 +104,4 @@ App-Verison mit ♡️ aus Bremen-Osterholz\von denizk0461 \\__* - - In our hearts, she lives forevermore \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1f1783d..57a73b1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -22,6 +22,8 @@ Cafeteria Bremerhaven Interimsmensa HfK + [ %s ] + Fair Fish @@ -105,5 +107,5 @@ with ♡️ from Bremen-Osterholz\nmade by denizk0461 \\__* - In our hearts, she lives forevermore + In our hearts, she lives forevermore \ No newline at end of file