From b9571727218ebbeb57dbbd799389aa95b6175802 Mon Sep 17 00:00:00 2001 From: denizk0461 Date: Sun, 23 Apr 2023 17:13:48 +0200 Subject: [PATCH] Transitioned from a fairly custom solution to using a colour palette generated by the Material Theme Builder to simplify colour management. Also began work on a bottom sheet for displaying allergens and additives in canteen offers. --- app/build.gradle | 3 +- app/src/main/AndroidManifest.xml | 1 - .../studip/adapter/CanteenOfferItemAdapter.kt | 66 ++++++++--- .../studip/adapter/CanteenOfferPageAdapter.kt | 8 +- .../studip/adapter/StudIPEventItemAdapter.kt | 62 +++++----- .../studip/adapter/StudIPEventPageAdapter.kt | 2 +- .../data/FragmentViewBindingDelegate.kt | 49 ++++++++ .../com/denizk0461/studip/data/StwParser.kt | 6 +- .../denizk0461/studip/fragment/AppFragment.kt | 21 ++++ .../studip/fragment/CanteenFragment.kt | 26 ++++- .../studip/fragment/EventFragment.kt | 3 +- .../studip/fragment/SettingsFragment.kt | 3 +- .../denizk0461/studip/sheet/AllergenSheet.kt | 22 ++++ .../com/denizk0461/studip/sheet/AppSheet.kt | 33 ++++++ .../{TemplateViewModel.kt => AppViewModel.kt} | 2 +- .../studip/viewmodel/CanteenViewModel.kt | 2 +- .../studip/viewmodel/EventViewModel.kt | 2 +- .../studip/viewmodel/FetcherViewModel.kt | 2 +- app/src/main/res/color/bottom_nav_color.xml | 5 - .../res/color/card_background_default.xml | 4 - .../res/color/card_background_highlight.xml | 4 - .../main/res/color/item_chip_background.xml | 5 - app/src/main/res/color/item_chip_outline.xml | 5 - app/src/main/res/color/list_nav_bar_icon.xml | 5 - app/src/main/res/color/list_nav_bar_text.xml | 5 - .../main/res/color/list_switch_decoration.xml | 5 - app/src/main/res/color/list_switch_thumb.xml | 5 - app/src/main/res/color/list_switch_track.xml | 5 - app/src/main/res/layout/activity_fetcher.xml | 3 +- app/src/main/res/layout/activity_main.xml | 1 - app/src/main/res/layout/content_main.xml | 21 +--- app/src/main/res/layout/fragment_canteen.xml | 26 ++--- app/src/main/res/layout/fragment_event.xml | 4 +- app/src/main/res/layout/fragment_settings.xml | 20 ++-- app/src/main/res/layout/item_canteen.xml | 10 +- app/src/main/res/layout/item_canteen_line.xml | 4 +- app/src/main/res/layout/item_event.xml | 3 +- app/src/main/res/layout/item_icon.xml | 2 +- app/src/main/res/layout/sheet_allergen.xml | 34 ++++++ app/src/main/res/values-night/themes.xml | 59 +++++----- app/src/main/res/values/colors.xml | 107 ++++++++++++++---- app/src/main/res/values/themes.xml | 74 +++++------- 42 files changed, 456 insertions(+), 273 deletions(-) create mode 100644 app/src/main/java/com/denizk0461/studip/data/FragmentViewBindingDelegate.kt create mode 100644 app/src/main/java/com/denizk0461/studip/fragment/AppFragment.kt create mode 100644 app/src/main/java/com/denizk0461/studip/sheet/AllergenSheet.kt create mode 100644 app/src/main/java/com/denizk0461/studip/sheet/AppSheet.kt rename app/src/main/java/com/denizk0461/studip/viewmodel/{TemplateViewModel.kt => AppViewModel.kt} (95%) delete mode 100644 app/src/main/res/color/bottom_nav_color.xml delete mode 100644 app/src/main/res/color/card_background_default.xml delete mode 100644 app/src/main/res/color/card_background_highlight.xml delete mode 100644 app/src/main/res/color/item_chip_background.xml delete mode 100644 app/src/main/res/color/item_chip_outline.xml delete mode 100644 app/src/main/res/color/list_nav_bar_icon.xml delete mode 100644 app/src/main/res/color/list_nav_bar_text.xml delete mode 100644 app/src/main/res/color/list_switch_decoration.xml delete mode 100644 app/src/main/res/color/list_switch_thumb.xml delete mode 100644 app/src/main/res/color/list_switch_track.xml create mode 100644 app/src/main/res/layout/sheet_allergen.xml diff --git a/app/build.gradle b/app/build.gradle index 702aecf..b75ea70 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,7 +13,7 @@ android { minSdk 24 targetSdk 33 versionCode 1 - versionName "0.0.1" + versionName "0.4.61" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -43,6 +43,7 @@ dependencies { implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3' + implementation 'androidx.fragment:fragment-ktx:1.6.0-beta01' implementation 'androidx.navigation:navigation-ui-ktx:2.5.3' implementation 'androidx.core:core-ktx:1.10.0' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1655f92..3aecceb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,7 +17,6 @@ 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 bb53c34..aff0b41 100644 --- a/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferItemAdapter.kt +++ b/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferItemAdapter.kt @@ -8,16 +8,37 @@ 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 /** * Custom RecyclerView adapter that lays out the offers of a given canteen on a given day. * * @param offers list of all offers filtered by canteen and day, grouped by category + * @param onClickListener used for listening to clicks and long presses */ class CanteenOfferItemAdapter( - private val offers: List + private val offers: List, + private val onClickListener: OnClickListener ) : 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 * @@ -86,26 +107,39 @@ class CanteenOfferItemAdapter( line.imageViewContainer.addView(img.root) } + // Set up single click listener + line.root.setOnClickListener { + onClickListener.onClick(offer) + } + + // Set up long press listener + line.root.setOnLongClickListener { + onClickListener.onLongClick(offer) + } // Bind the new line to the line container holder.binding.lineContainer.addView(line.root) } } /** - * Provides a converting function between the index of a dietary preference and its according - * icon. + * Interface used to evaluate clicks and long presses on a given item. */ - 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, - ) + interface OnClickListener { + + /** + * Executed when an item has been clicked. + * + * @param offer item that has been clicked + */ + fun onClick(offer: CanteenOfferGroupElement) + + + /** + * Executed when an item has been long-pressed. + * + * @param offer item that has been long-pressed + * @return whether the long press was successful + */ + fun onLongClick(offer: CanteenOfferGroupElement): Boolean + } } \ No newline at end of file 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 a9d0160..3a4c2ba 100644 --- a/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt +++ b/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt @@ -16,10 +16,12 @@ import com.denizk0461.studip.model.CanteenOfferGroup * @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 */ class CanteenOfferPageAdapter( private var offers: List, private var daysCovered: Int, + private val onClickListener: CanteenOfferItemAdapter.OnClickListener, ) : RecyclerView.Adapter() { /** @@ -50,8 +52,12 @@ class CanteenOfferPageAdapter( /* * Create new adapter for every page. Attribute position denotes day that will be set up * by the newly created adapter (0 = Monday, 4 = Friday) + * TODO check if the filtered list is empty, and tell the user if it is */ - adapter = CanteenOfferItemAdapter(offers.filter { it.dateId == position }) // TODO check if empty + adapter = CanteenOfferItemAdapter( + offers.filter { it.dateId == position }, + onClickListener + ) // Animate creation of new page scheduleLayoutAnimation() diff --git a/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventItemAdapter.kt b/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventItemAdapter.kt index c0c4409..a0907b6 100644 --- a/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventItemAdapter.kt +++ b/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventItemAdapter.kt @@ -1,11 +1,8 @@ package com.denizk0461.studip.adapter -import android.content.res.ColorStateList -import android.util.TypedValue import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.denizk0461.studip.R import com.denizk0461.studip.model.StudIPEvent import com.denizk0461.studip.databinding.ItemEventBinding import java.util.* @@ -72,42 +69,43 @@ class StudIPEventItemAdapter( // Use parsed timeslot string as defined in StudIPEvent#timeslot() holder.binding.textTimeslot.text = currentItem.timeslot() + // TODO highlighting functionality is currently not supported! // Set up colours used for highlighting and un-highlighting an item. - val colorPrimaryTranslucent = TypedValue() - val colorCardBackground = TypedValue() - val colorTextHintLighter = TypedValue() +// val colorPrimaryTranslucent = TypedValue() +// val colorCardBackground = TypedValue() +// val colorTextHintLighter = TypedValue() // Resolve themed attributes to get the right values for day and night modes - holder.binding.root.context.theme.apply { - resolveAttribute(R.attr.colorPrimaryTranslucent, colorPrimaryTranslucent, true) - resolveAttribute(R.attr.colorCardBackground, colorCardBackground, true) - resolveAttribute(R.attr.colorTextHintLighter, colorTextHintLighter, true) - } +// holder.binding.root.context.theme.apply { +// resolveAttribute(com.google.android.material.R.attr.colorSecondaryContainer, colorPrimaryTranslucent, true) +// resolveAttribute(R.attr.colorCardBackground, colorCardBackground, true) +// resolveAttribute(R.attr.colorTextHintLighter, colorTextHintLighter, true) +// } /* Highlight the next upcoming course of the day if the day of the adapter matches the * current day, and if no other course has been highlighted, to avoid double highlighting. */ - if (!isAnyCourseHighlighted && currentItem.isCurrentCourse(currentCalendar)) { - // Ensure that no other course will be highlighted - isAnyCourseHighlighted = true - - holder.binding.cardBackground.apply { - // Set the card's background colour to a desaturated shade of the primary colour - backgroundTintList = ColorStateList.valueOf(colorPrimaryTranslucent.data) - - // Hide card stroke - strokeColor = context.getColor(android.R.color.transparent) - } - // Otherwise, apply colours to ensure that the item will not be highlighted - } else { - holder.binding.cardBackground.apply { - // Set the card's background colour to its default value - backgroundTintList = ColorStateList.valueOf(colorCardBackground.data) - - // Set the card's stroke to its default colour - strokeColor = colorTextHintLighter.data - } - } +// if (!isAnyCourseHighlighted && currentItem.isCurrentCourse(currentCalendar)) { +// // Ensure that no other course will be highlighted +// isAnyCourseHighlighted = true +// +// holder.binding.cardBackground.apply { +// // Set the card's background colour to a desaturated shade of the primary colour +// backgroundTintList = ColorStateList.valueOf(colorPrimaryTranslucent.data) +// +// // Hide card stroke +// strokeColor = context.getColor(android.R.color.transparent) +// } +// // Otherwise, apply colours to ensure that the item will not be highlighted +// } else { +// holder.binding.cardBackground.apply { +// // Set the card's background colour to its default value +// backgroundTintList = ColorStateList.valueOf(colorCardBackground.data) +// +// // Set the card's stroke to its default colour +// strokeColor = colorTextHintLighter.data +// } +// } // Set up single click listener holder.binding.cardBackground.setOnClickListener { diff --git a/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventPageAdapter.kt b/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventPageAdapter.kt index 68d4b7f..9945ad7 100644 --- a/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventPageAdapter.kt +++ b/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventPageAdapter.kt @@ -16,7 +16,7 @@ import com.denizk0461.studip.databinding.ItemScrollablePageBinding */ class StudIPEventPageAdapter( private var events: List, - private val onClickListener: StudIPEventItemAdapter.OnClickListener + private val onClickListener: StudIPEventItemAdapter.OnClickListener, ) : RecyclerView.Adapter() { /** diff --git a/app/src/main/java/com/denizk0461/studip/data/FragmentViewBindingDelegate.kt b/app/src/main/java/com/denizk0461/studip/data/FragmentViewBindingDelegate.kt new file mode 100644 index 0000000..313180f --- /dev/null +++ b/app/src/main/java/com/denizk0461/studip/data/FragmentViewBindingDelegate.kt @@ -0,0 +1,49 @@ +package com.denizk0461.studip.data + +import android.view.View +import androidx.fragment.app.Fragment +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.viewbinding.ViewBinding +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KProperty + +// written by Zhuinden (props to them!) +class FragmentViewBindingDelegate( + val fragment: Fragment, + val viewBindingFactory: (View) -> T +) : ReadOnlyProperty { + private var _binding: T? = null + + init { + fragment.lifecycle.addObserver(object : DefaultLifecycleObserver { + override fun onCreate(owner: LifecycleOwner) { + fragment.viewLifecycleOwnerLiveData.observe(fragment) { viewLifecycleOwner -> + viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver { + override fun onDestroy(owner: LifecycleOwner) { + _binding = null + } + }) + } + } + }) + } + + override fun getValue(thisRef: Fragment, property: KProperty<*>): T { + val binding = _binding + if (binding != null) { + return binding + } + + val lifecycle = fragment.viewLifecycleOwner.lifecycle + if (!lifecycle.currentState.isAtLeast(Lifecycle.State.INITIALIZED)) { + throw IllegalStateException("Should not attempt to get bindings when Fragment views are destroyed.") + } + + return viewBindingFactory(thisRef.requireView()).also { _binding = it } + } +} + +fun Fragment.viewBinding(viewBindingFactory: (View) -> T) = + FragmentViewBindingDelegate(this, viewBindingFactory) \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/studip/data/StwParser.kt b/app/src/main/java/com/denizk0461/studip/data/StwParser.kt index 0caa1ed..eb40c1e 100644 --- a/app/src/main/java/com/denizk0461/studip/data/StwParser.kt +++ b/app/src/main/java/com/denizk0461/studip/data/StwParser.kt @@ -209,9 +209,9 @@ class StwParser { * pointless to the website user. As of now, this information is discarded in the app. * TODO implement allergen functionality */ - while (text.contains("")) { - text = text.substring(0 until text.indexOf("")) + text.substring(text.indexOf("")+6 until text.length) - } +// while (text.contains("")) { +// text = text.substring(0 until text.indexOf("")) + text.substring(text.indexOf("")+6 until text.length) +// } // Return the stripped and updated HTML string return text diff --git a/app/src/main/java/com/denizk0461/studip/fragment/AppFragment.kt b/app/src/main/java/com/denizk0461/studip/fragment/AppFragment.kt new file mode 100644 index 0000000..1771eee --- /dev/null +++ b/app/src/main/java/com/denizk0461/studip/fragment/AppFragment.kt @@ -0,0 +1,21 @@ +package com.denizk0461.studip.fragment + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import com.denizk0461.studip.sheet.AppSheet + +/** + * Fragment super class providing common functionality. Fragments are used for providing the user + * with different views and functionality. All fragments should inherit from this. + */ +open class AppFragment : Fragment() { + + /** + * Opens a bottom sheet. Sheet must be a subclass of [com.denizk0461.studip.sheet.AppSheet]. + * + * @param sheet element that will be displayed + */ + protected fun openBottomSheet(sheet: AppSheet) { + sheet.show((context as FragmentActivity).supportFragmentManager, sheet.javaClass.simpleName) + } +} \ 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 1c5f2b2..53734f8 100644 --- a/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt +++ b/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt @@ -5,11 +5,12 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import com.denizk0461.studip.adapter.CanteenOfferItemAdapter import com.denizk0461.studip.adapter.CanteenOfferPageAdapter import com.denizk0461.studip.databinding.FragmentCanteenBinding import com.denizk0461.studip.model.* +import com.denizk0461.studip.sheet.AllergenSheet import com.denizk0461.studip.viewmodel.CanteenViewModel import com.google.android.material.tabs.TabLayoutMediator @@ -17,7 +18,7 @@ import com.google.android.material.tabs.TabLayoutMediator * User-facing fragment view that displays the canteen offers from the website of the * Studierendenwerk Bremen. */ -class CanteenFragment : Fragment() { +class CanteenFragment : AppFragment(), CanteenOfferItemAdapter.OnClickListener { // Nullable view binding reference private var _binding: FragmentCanteenBinding? = null @@ -91,7 +92,7 @@ class CanteenFragment : Fragment() { } // Set up the view pager's adapter - viewPagerAdapter = CanteenOfferPageAdapter(listOf(), 0) + viewPagerAdapter = CanteenOfferPageAdapter(listOf(), 0, this) // Assign the adapter to the view pager binding.viewPager.adapter = viewPagerAdapter @@ -268,4 +269,23 @@ class CanteenFragment : Fragment() { ) } } + + /** + * Executed when an item has been clicked. + * + * @param offer item that has been clicked + */ + override fun onClick(offer: CanteenOfferGroupElement) { + openBottomSheet(AllergenSheet(offer)) + } + + /** + * Executed when an item has been long-pressed. + * + * @param offer item that has been long-pressed + * @return whether the long press was successful + */ + override fun onLongClick(offer: CanteenOfferGroupElement): Boolean { + return false + } } \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/studip/fragment/EventFragment.kt b/app/src/main/java/com/denizk0461/studip/fragment/EventFragment.kt index dc8d84e..0ff99c0 100644 --- a/app/src/main/java/com/denizk0461/studip/fragment/EventFragment.kt +++ b/app/src/main/java/com/denizk0461/studip/fragment/EventFragment.kt @@ -1,7 +1,6 @@ package com.denizk0461.studip.fragment import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -18,7 +17,7 @@ import java.util.* /** * User-facing fragment view that displays the user's Stud.IP schedule. */ -class EventFragment : Fragment() { +class EventFragment : AppFragment() { // Nullable view binding reference private var _binding: FragmentEventBinding? = null 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 6fcd27a..baf7e70 100644 --- a/app/src/main/java/com/denizk0461/studip/fragment/SettingsFragment.kt +++ b/app/src/main/java/com/denizk0461/studip/fragment/SettingsFragment.kt @@ -7,7 +7,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import com.denizk0461.studip.BuildConfig import com.denizk0461.studip.activity.FetcherActivity import com.denizk0461.studip.databinding.FragmentSettingsBinding @@ -15,7 +14,7 @@ import com.denizk0461.studip.databinding.FragmentSettingsBinding /** * User-facing fragment view that is used to change app settings. */ -class SettingsFragment : Fragment() { +class SettingsFragment : AppFragment() { // Nullable view binding reference private var _binding: FragmentSettingsBinding? = null diff --git a/app/src/main/java/com/denizk0461/studip/sheet/AllergenSheet.kt b/app/src/main/java/com/denizk0461/studip/sheet/AllergenSheet.kt new file mode 100644 index 0000000..cc507df --- /dev/null +++ b/app/src/main/java/com/denizk0461/studip/sheet/AllergenSheet.kt @@ -0,0 +1,22 @@ +package com.denizk0461.studip.sheet + +import android.os.Bundle +import android.view.View +import com.denizk0461.studip.R +import com.denizk0461.studip.data.viewBinding +import com.denizk0461.studip.databinding.SheetAllergenBinding +import com.denizk0461.studip.model.CanteenOfferGroupElement + +class AllergenSheet(private val offer: CanteenOfferGroupElement) : AppSheet(R.layout.sheet_allergen) { + + private val binding: SheetAllergenBinding by viewBinding(SheetAllergenBinding::bind) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.apply { + title.text = offer.title + textContent.text = "hello there" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/studip/sheet/AppSheet.kt b/app/src/main/java/com/denizk0461/studip/sheet/AppSheet.kt new file mode 100644 index 0000000..46ce437 --- /dev/null +++ b/app/src/main/java/com/denizk0461/studip/sheet/AppSheet.kt @@ -0,0 +1,33 @@ +package com.denizk0461.studip.sheet + +import android.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.LayoutRes +import com.google.android.material.bottomsheet.BottomSheetDialogFragment + +/** + * Bottom sheet super class providing common functionality. All bottom sheets should inherit from + * this. + * + * @param layoutId ID of the layout of the bottom sheet + */ +open class AppSheet(@LayoutRes private val layoutId: Int) : BottomSheetDialogFragment() { + + // Internal context object + private lateinit var _context: Context + + // Get non-null context. Only valid after onAttach() + override fun getContext(): Context = _context + + override fun onAttach(context: Context) { + super.onAttach(context) + _context = context + } + + // Inflate the given layout + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = + LayoutInflater.from(context).inflate(layoutId, container, false) +} \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/studip/viewmodel/TemplateViewModel.kt b/app/src/main/java/com/denizk0461/studip/viewmodel/AppViewModel.kt similarity index 95% rename from app/src/main/java/com/denizk0461/studip/viewmodel/TemplateViewModel.kt rename to app/src/main/java/com/denizk0461/studip/viewmodel/AppViewModel.kt index bdcb7b5..7d77b20 100644 --- a/app/src/main/java/com/denizk0461/studip/viewmodel/TemplateViewModel.kt +++ b/app/src/main/java/com/denizk0461/studip/viewmodel/AppViewModel.kt @@ -16,7 +16,7 @@ import kotlinx.coroutines.runBlocking * * @param app reference to the app */ -open class TemplateViewModel(app: Application) : AndroidViewModel(app) { +open class AppViewModel(app: Application) : AndroidViewModel(app) { // Reference to the app's repository for database transactions protected val repo: AppRepository = Dependencies.repo 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 9d4d5d8..7098040 100644 --- a/app/src/main/java/com/denizk0461/studip/viewmodel/CanteenViewModel.kt +++ b/app/src/main/java/com/denizk0461/studip/viewmodel/CanteenViewModel.kt @@ -13,7 +13,7 @@ import com.denizk0461.studip.model.OfferDate * * @param app reference to the app */ -class CanteenViewModel(app: Application) : TemplateViewModel(app) { +class CanteenViewModel(app: Application) : AppViewModel(app) { // Instantiate a parser, should the user want to refresh the canteen offers private val parser = StwParser() diff --git a/app/src/main/java/com/denizk0461/studip/viewmodel/EventViewModel.kt b/app/src/main/java/com/denizk0461/studip/viewmodel/EventViewModel.kt index 186f6ce..8829705 100644 --- a/app/src/main/java/com/denizk0461/studip/viewmodel/EventViewModel.kt +++ b/app/src/main/java/com/denizk0461/studip/viewmodel/EventViewModel.kt @@ -9,7 +9,7 @@ import com.denizk0461.studip.model.StudIPEvent * * @param app reference to the app */ -class EventViewModel(app: Application) : TemplateViewModel(app) { +class EventViewModel(app: Application) : AppViewModel(app) { /** * Retrieves all Stud.IP events. diff --git a/app/src/main/java/com/denizk0461/studip/viewmodel/FetcherViewModel.kt b/app/src/main/java/com/denizk0461/studip/viewmodel/FetcherViewModel.kt index d687a65..2426d8e 100644 --- a/app/src/main/java/com/denizk0461/studip/viewmodel/FetcherViewModel.kt +++ b/app/src/main/java/com/denizk0461/studip/viewmodel/FetcherViewModel.kt @@ -8,7 +8,7 @@ import com.denizk0461.studip.model.StudIPEvent * * @param app reference to the app */ -class FetcherViewModel(app: Application) : TemplateViewModel(app) { +class FetcherViewModel(app: Application) : AppViewModel(app) { /** * Save a list of Stud.IP events to persistent storage asynchronously. diff --git a/app/src/main/res/color/bottom_nav_color.xml b/app/src/main/res/color/bottom_nav_color.xml deleted file mode 100644 index cfd21eb..0000000 --- a/app/src/main/res/color/bottom_nav_color.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/card_background_default.xml b/app/src/main/res/color/card_background_default.xml deleted file mode 100644 index 5ae061b..0000000 --- a/app/src/main/res/color/card_background_default.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/color/card_background_highlight.xml b/app/src/main/res/color/card_background_highlight.xml deleted file mode 100644 index 00ab9ab..0000000 --- a/app/src/main/res/color/card_background_highlight.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/color/item_chip_background.xml b/app/src/main/res/color/item_chip_background.xml deleted file mode 100644 index ebcec5d..0000000 --- a/app/src/main/res/color/item_chip_background.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/item_chip_outline.xml b/app/src/main/res/color/item_chip_outline.xml deleted file mode 100644 index 5334657..0000000 --- a/app/src/main/res/color/item_chip_outline.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/list_nav_bar_icon.xml b/app/src/main/res/color/list_nav_bar_icon.xml deleted file mode 100644 index 201d836..0000000 --- a/app/src/main/res/color/list_nav_bar_icon.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/list_nav_bar_text.xml b/app/src/main/res/color/list_nav_bar_text.xml deleted file mode 100644 index c82831e..0000000 --- a/app/src/main/res/color/list_nav_bar_text.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/list_switch_decoration.xml b/app/src/main/res/color/list_switch_decoration.xml deleted file mode 100644 index a157963..0000000 --- a/app/src/main/res/color/list_switch_decoration.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/list_switch_thumb.xml b/app/src/main/res/color/list_switch_thumb.xml deleted file mode 100644 index c82831e..0000000 --- a/app/src/main/res/color/list_switch_thumb.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/list_switch_track.xml b/app/src/main/res/color/list_switch_track.xml deleted file mode 100644 index 8c46431..0000000 --- a/app/src/main/res/color/list_switch_track.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fetcher.xml b/app/src/main/res/layout/activity_fetcher.xml index ba8ac15..d10388d 100644 --- a/app/src/main/res/layout/activity_fetcher.xml +++ b/app/src/main/res/layout/activity_fetcher.xml @@ -2,8 +2,7 @@ + android:layout_height="match_parent"> + app:layout_behavior="@string/appbar_scrolling_view_behavior"> + app:layout_constraintEnd_toEndOf="parent"> - - + app:layout_constraintEnd_toEndOf="parent"/> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_canteen.xml b/app/src/main/res/layout/fragment_canteen.xml index 375798c..ac6edcb 100644 --- a/app/src/main/res/layout/fragment_canteen.xml +++ b/app/src/main/res/layout/fragment_canteen.xml @@ -2,16 +2,13 @@ + android:layout_height="match_parent"> @@ -52,74 +49,73 @@ android:id="@+id/chips_preference" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@android:color/transparent" android:animateLayoutChanges="true"> + tools:context=".fragment.EventFragment"> diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 5961cfa..226cb94 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -4,8 +4,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" - tools:context=".fragment.SettingsFragment" - android:background="?attr/colorBackground"> + tools:context=".fragment.SettingsFragment"> + style="@style/Widget.Material3.CardView.Outlined"> + android:paddingVertical="8dp" + android:background="?android:attr/selectableItemBackground"> + android:paddingVertical="8dp" + android:background="?android:attr/selectableItemBackground"> + android:paddingVertical="8dp" + android:background="?android:attr/selectableItemBackground"> + style="@style/Widget.Material3.CardView.Outlined"> - - - - - - diff --git a/app/src/main/res/layout/item_canteen_line.xml b/app/src/main/res/layout/item_canteen_line.xml index a3bafac..6ed7399 100644 --- a/app/src/main/res/layout/item_canteen_line.xml +++ b/app/src/main/res/layout/item_canteen_line.xml @@ -4,11 +4,11 @@ android:layout_height="wrap_content" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="horizontal" - android:background="@drawable/layout_ripple" android:clickable="true" android:focusable="true" android:paddingHorizontal="16dp" - android:paddingVertical="2dp"> + android:paddingVertical="2dp" + android:background="?android:attr/selectableItemBackground"> + style="@style/Widget.Material3.CardView.Outlined"> + app:tint="?attr/colorOnSurfaceVariant" /> \ 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 new file mode 100644 index 0000000..c1ee477 --- /dev/null +++ b/app/src/main/res/layout/sheet_allergen.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 8a0d32c..fd01bbc 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -1,36 +1,37 @@ - + - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f1e81d3..f3ffb2f 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,35 +1,100 @@ - #FF000000 - #FFFFFFFF + + #c85848 + #A33D2F + #FFFFFF + #FFDAD4 + #410000 + #775651 + #FFFFFF + #FFDAD4 + #2C1511 + #705C2E + #FFFFFF + #FBDFA6 + #251A00 + #BA1A1A + #FFDAD6 + #FFFFFF + #410002 + #FFFBFF + #201A19 + #FFFBFF + #201A19 + #F5DDDA + #534341 + #857370 + #FBEEEC + #362F2E + #FFB4A8 + #000000 + #A33D2F + #D8C2BE + #000000 + #FFB4A8 + #630E07 + #83251A + #FFDAD4 + #E7BDB6 + #442925 + #5D3F3A + #FFDAD4 + #DEC48C + #3E2E04 + #564419 + #FBDFA6 + #FFB4AB + #93000A + #690005 + #FFDAD6 + #201A19 + #EDE0DD + #201A19 + #EDE0DD + #534341 + #D8C2BE + #A08C89 + #201A19 + #EDE0DD + #A33D2F + #000000 + #FFB4A8 + #534341 + #000000 + + + + + #FF46BB - - #B2665A - #80B2665A - #995348 - #80995348 + + + + + - #871D1E - #CB9890 + + - #141414 - #CDCBCB + + - #2A2828 - #B9B6B6 + + - #AFACAC - #5E5A5A + + - #EBEBEB - #151414 + + - #E0E0E0 - #1F1E1E + + - #D6D6D6 - #2A2828 + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index ec4951d..0fd597e 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,53 +1,39 @@ - + - - - - - - - - \ No newline at end of file