diff --git a/app/src/main/java/com/denizk0461/weserplaner/activity/MainActivity.kt b/app/src/main/java/com/denizk0461/weserplaner/activity/MainActivity.kt
index 344e754..0de0f39 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/activity/MainActivity.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/activity/MainActivity.kt
@@ -47,17 +47,21 @@ class MainActivity : FragmentActivity() {
* Sets the navigation graph for the fragments. Also sets the start destination.
*/
private fun setNavigationGraph() {
+ // Get nav host
val navHostFragment = supportFragmentManager
.findFragmentById(R.id.nav_host_fragment_content_main) as NavHostFragment
- val navController = navHostFragment.navController
- val navGraph = navController.navInflater.inflate(R.navigation.main_nav_graph)
- navGraph.setStartDestination(if (viewModel.preferenceLaunchCanteen) {
- R.id.canteen
- } else {
- R.id.schedule
+ // Inflate new nav graph
+ val navGraph = navHostFragment
+ .navController.navInflater.inflate(R.navigation.main_nav_graph)
+
+ // Set the starting fragment for the app
+ navGraph.setStartDestination(when (viewModel.preferenceLaunchFragment) {
+ 1 -> R.id.canteen
+ else -> R.id.schedule // 0
})
- navController.graph = navGraph
+ // Set the newly defined nav graph
+ navHostFragment.navController.graph = navGraph
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/denizk0461/weserplaner/data/StwParser.kt b/app/src/main/java/com/denizk0461/weserplaner/data/StwParser.kt
index 7c17d06..96e2728 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/data/StwParser.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/data/StwParser.kt
@@ -252,7 +252,18 @@ class StwParser(application: Application) {
itemId,
categoryId,
title = filteredText.first,
- price = tableRows.getTextOrEmpty(2),
+ price = tableRows.getTextOrEmpty(
+ /*
+ * ID stored for student: 0
+ * Index required to fetch student price: 2
+ *
+ * ID stored for employee: 1
+ * Index required to fetch employee price: 3
+ *
+ * Hence, getIntPreference() + 2
+ */
+ repo.getIntPreference(SettingsPreferences.PRICING) + 2
+ ),
dietaryPreferences = prefs.deconstruct(),
allergens = filteredText.second,
)
diff --git a/app/src/main/java/com/denizk0461/weserplaner/fragment/CanteenFragment.kt b/app/src/main/java/com/denizk0461/weserplaner/fragment/CanteenFragment.kt
index 6954edf..583f195 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/fragment/CanteenFragment.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/fragment/CanteenFragment.kt
@@ -14,8 +14,6 @@ import com.denizk0461.weserplaner.data.showErrorSnackBar
import com.denizk0461.weserplaner.databinding.FragmentCanteenBinding
import com.denizk0461.weserplaner.model.*
import com.denizk0461.weserplaner.viewmodel.CanteenViewModel
-import com.google.android.material.badge.BadgeDrawable
-import com.google.android.material.badge.BadgeUtils
import com.google.android.material.tabs.TabLayoutMediator
/**
@@ -72,10 +70,12 @@ class CanteenFragment : AppFragment() {
}
// Create badge
- val badge = BadgeDrawable.create(context)
- badge.isVisible = true
- // Attach badge to button
- BadgeUtils.attachBadgeDrawable(badge, binding.buttonNotifications)
+// val badge = BadgeDrawable.create(context)
+//// badge.isVisible = true
+// badge.number = 1
+// badge.badgeGravity = BadgeDrawable.TOP_END
+// // Attach badge to button
+// BadgeUtils.attachBadgeDrawable(badge, binding.buttonNotifications, binding.buttonNotificationsBadgeContainer)
// Assign a preference value to every button to filter for dietary preferences
val chipMap = mapOf(
diff --git a/app/src/main/java/com/denizk0461/weserplaner/fragment/SettingsFragment.kt b/app/src/main/java/com/denizk0461/weserplaner/fragment/SettingsFragment.kt
index 061965b..1cce41f 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/fragment/SettingsFragment.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/fragment/SettingsFragment.kt
@@ -106,10 +106,62 @@ class SettingsFragment : AppFragment() {
}
// Set up switch for launching the app with a specific view
- binding.switchLaunchCanteen.apply {
- isChecked = viewModel.preferenceLaunchCanteen
- setOnCheckedChangeListener { _, newValue ->
- viewModel.preferenceLaunchCanteen = newValue
+// binding.switchLaunchCanteen.apply {
+// isChecked = viewModel.preferenceLaunchCanteen
+// setOnCheckedChangeListener { _, newValue ->
+// viewModel.preferenceLaunchCanteen = newValue
+// }
+// }
+
+ // Set up button toggle group for changing prices displayed for the canteen offers
+ binding.togglePricingGroup.apply {
+ // Check the pricing that is currently selected
+ check(when (viewModel.preferencePricing) {
+ 1 -> R.id.toggle_pricing_employee
+ else -> R.id.toggle_pricing_student // 0
+ })
+
+ // Set up checked listener for toggle group
+ addOnButtonCheckedListener { _, checkedId, isChecked ->
+ /*
+ * Check if the button that is changed is the checked button. If this is not checked
+ * for, the listener will simply loop through this when-statement with all buttons
+ * that had their state changed somehow, and save the ID of the last one that had
+ * its state changed.
+ */
+ if (isChecked) {
+ // Save new preference
+ viewModel.preferencePricing = when (checkedId) {
+ R.id.toggle_pricing_employee -> 1
+ else -> 0 // R.id.toggle_pricing_student
+ }
+ }
+ }
+ }
+
+ // Set up button toggle group for changing default fragment
+ binding.toggleLaunchFragmentGroup.apply {
+ // Check the fragment that is currently selected
+ check(when (viewModel.preferenceLaunchFragment) {
+ 1 -> R.id.toggle_launch_fragment_canteen
+ else -> R.id.toggle_launch_fragment_schedule // 0
+ })
+
+ // Set up checked listener for toggle group
+ addOnButtonCheckedListener { _, checkedId, isChecked ->
+ /*
+ * Check if the button that is changed is the checked button. If this is not checked
+ * for, the listener will simply loop through this when-statement with all buttons
+ * that had their state changed somehow, and save the ID of the last one that had
+ * its state changed.
+ */
+ if (isChecked) {
+ // Save new preference
+ viewModel.preferenceLaunchFragment = when (checkedId) {
+ R.id.toggle_launch_fragment_canteen -> 1
+ else -> 0 // R.id.toggle_launch_fragment_schedule
+ }
+ }
}
}
diff --git a/app/src/main/java/com/denizk0461/weserplaner/model/SettingsPreferences.kt b/app/src/main/java/com/denizk0461/weserplaner/model/SettingsPreferences.kt
index 04290ac..581430c 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/model/SettingsPreferences.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/model/SettingsPreferences.kt
@@ -3,6 +3,7 @@ package com.denizk0461.weserplaner.model
/**
* Enumeration class for user-set preferences that will be saved in persistent storage via
* SharedPreferences.
+ * TODO mark which data types should be used for which preferences (boolean, string, int)
*
* @param key key for the SharedPreferences transaction
*/
@@ -34,9 +35,14 @@ enum class SettingsPreferences(val key: String) {
COURSE_HIGHLIGHTING("setting_highlight"),
/**
- * Whether the user wants the app to launch with the canteen fragment.
+ * Which prices the user wants to have displayed for the canteen offers.
*/
- LAUNCH_CANTEEN_ON_START("settings_launch_canteen"),
+ PRICING("settings_pricing"),
+
+ /**
+ * Which fragment the user wants the app to start with.
+ */
+ LAUNCH_FRAGMENT_ON_START("settings_launch_fragment"),
/**
* Whether the user wants dietary preferences to be coloured.
diff --git a/app/src/main/java/com/denizk0461/weserplaner/sheet/DevCodeSheet.kt b/app/src/main/java/com/denizk0461/weserplaner/sheet/DevCodeSheet.kt
index a67b611..3affe91 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/sheet/DevCodeSheet.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/sheet/DevCodeSheet.kt
@@ -60,6 +60,10 @@ class DevCodeSheet : AppSheet(R.layout.sheet_dev_code) {
"TE9ORUxZ".d64 -> launchLink("aHR0cHM6Ly95b3V0dS5iZS9uLURFNHNfc3d5Zw==".d64)
"QkVBVVRZ".d64 -> launchLink("aHR0cHM6Ly95b3V0dS5iZS9vbVQ1ckttVTVfaw==".d64)
"Uk9NQ09N".d64 -> launchLink("aHR0cHM6Ly95b3V0dS5iZS9HUW1nUG5uZjE4WQ==".d64)
+ "Tk9DQVNI".d64 -> launchLink(listOf(
+ "aHR0cHM6Ly95b3V0dS5iZS9lRzh3bkx2NTlPbw==",
+ "aHR0cHM6Ly95b3V0dS5iZS9RSzBZLUQ1bVpaaw==",
+ ).random().d64)
"Qk9KQUNL".d64 -> {
startActivity(Intent(context, ImageActivity::class.java).also { intent ->
val bundle = Bundle()
diff --git a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/MainViewModel.kt b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/MainViewModel.kt
index fdd6966..99793ed 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/MainViewModel.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/MainViewModel.kt
@@ -11,8 +11,9 @@ import com.denizk0461.weserplaner.model.SettingsPreferences
class MainViewModel(application: Application) : AppViewModel(application) {
/**
- * This value determines whether the user wants the app to launch with the canteen view.
+ * This value determines which fragment the user wants the app to start with. Order is equal to
+ * the order that the items are arranged in in the bottom nav bar.
*/
- val preferenceLaunchCanteen: Boolean
- get() = repo.getBooleanPreference(SettingsPreferences.LAUNCH_CANTEEN_ON_START)
+ val preferenceLaunchFragment: Int
+ get() = repo.getIntPreference(SettingsPreferences.LAUNCH_FRAGMENT_ON_START)
}
\ No newline at end of file
diff --git a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/SettingsViewModel.kt b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/SettingsViewModel.kt
index b4c79ae..4b21663 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/SettingsViewModel.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/SettingsViewModel.kt
@@ -50,11 +50,20 @@ class SettingsViewModel(app: Application) : AppViewModel(app) {
}
/**
- * This value determines whether the user wants the app to launch with the canteen view.
+ * This value determines which fragment the user wants the app to start with. Order is equal to
+ * the order that the items are arranged in in the bottom nav bar.
*/
- var preferenceLaunchCanteen: Boolean
- get() = repo.getBooleanPreference(SettingsPreferences.LAUNCH_CANTEEN_ON_START)
- set(newValue) { repo.setPreference(SettingsPreferences.LAUNCH_CANTEEN_ON_START, newValue) }
+ var preferencePricing: Int
+ get() = repo.getIntPreference(SettingsPreferences.PRICING)
+ set(newValue) { repo.setPreference(SettingsPreferences.PRICING, newValue) }
+
+ /**
+ * This value determines which fragment the user wants the app to start with. Order is equal to
+ * the order that the items are arranged in in the bottom nav bar.
+ */
+ var preferenceLaunchFragment: Int
+ get() = repo.getIntPreference(SettingsPreferences.LAUNCH_FRAGMENT_ON_START)
+ set(newValue) { repo.setPreference(SettingsPreferences.LAUNCH_FRAGMENT_ON_START, newValue) }
/**
* This value determines which canteen the user has selected.
diff --git a/app/src/main/res/layout/fragment_canteen.xml b/app/src/main/res/layout/fragment_canteen.xml
index 9780462..68ddfc6 100644
--- a/app/src/main/res/layout/fragment_canteen.xml
+++ b/app/src/main/res/layout/fragment_canteen.xml
@@ -21,16 +21,16 @@
+ android:layout_marginHorizontal="16dp">
@@ -229,10 +228,10 @@
android:layout_height="match_parent"
android:orientation="vertical">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -363,48 +413,49 @@
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp" />
-
-
+
-
-
-
-
-
-
-
-
-
+ android:fontFamily="@font/lato_bolditalic"
+ android:text="@string/settings_launch_canteen_title"
+ android:textSize="16sp" />
-
+
+
+
+
+
+
+
+
+
Lizenzen
Dein Stundenplan
- Mensenangebote
+ Stundenplan
+ Mensenangebote
+ Mensa
%s – Angebote
App-Einstellungen
@@ -178,11 +180,15 @@
Achtung: bitte verlasse Dich nicht vollständig auf diese Funktion. Stelle immer in der Mensa, die Du besuchst, sicher, dass die Stoffe, auf die Du allergisch reagierst, nicht in deren Angeboten vorhanden sind. Die Allergen-Hinweise einiger Mensen sind online leider unvollständig.
Deine Allergene wurden gespeichert.
+ Siehe Preise für
+ Wird nach einer Aktualisierung der Angebote wirksam
+ Studierende
+ Bedienstete
+
Markiere Angebote mit Allergenen mit einem Stern*
Wird auch für Zusatzstoffe genutzt
- Starte die App mit dem Mensaplan
- Sonst wird Dein Stundenplan beim Start gezeigt
+ Wähle, mit welchem Bildschirm die App startet
Färbe Diätpreferenzen
Dies färbt die kleinen Symbole ähnlich wie auf der Webseite
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 3917165..eeabab5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -78,7 +78,9 @@
Android developer resources by Google.\nhttps://developer.android.com/\nandroidx.appcompat:appcompat:1.6.1\nandroidx.constraintlayout:constraintlayout:2.1.4\nandroidx.core:core-ktx:1.10.0\nandroidx.fragment:fragment-ktx:1.6.0-beta01\nandroidx.navigation:navigation-fragment-ktx:2.5.3\nandroidx.navigation:navigation-ui-ktx:2.5.3\nandroidx.preference:preference-ktx:1.2.0\nandroidx.room:room-runtime:2.5.1\nandroidx.room:room-compiler:2.5.1\nandroidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01\n\nDesign guidelines, icons, and colour palette by Google.\nhttps://m3.material.io/\ncom.google.android.material:material:1.9.0\n\nAdditional icons by Flaticon.\nhttps://www.flaticon.com/\n\nWeb scraping functionality by Jonathan Hedley.\nhttps://jhy.io/\nhttps://jsoup.org/\norg.jsoup:jsoup:1.15.4\n\nApp developed by Deniz Düzgören.\ndenizk0461@gmail.com\ndeniz7@uni-bremen.de
Your Schedule
- Canteen Offers
+ Schedule
+ Canteen Offers
+ Canteen
%s – Offers
App Settings
@@ -182,14 +184,18 @@
Note: please don\'t entirely rely on this. Always check the notices displayed at the canteen you\'re visiting to confirm substances you may be allergic against are not present in their offerings. Some canteens unfortunately don\'t provide full allergen information online.
Your allergen settings have been saved.
+ View prices for
+ Takes effect after refreshing the offers
+ Students
+ Employees
+
Mark offers with allergens with a star*
Also applies to additives
Colour dietary preferences
Icons will be coloured similarly to how they look the website
- Show canteen plan on app launch
- Otherwise your schedule will be shown at launch
+ Select which screen to start the app with
Opt-in to sharing crash data