WeserPlaner 1.0.2: canteen news button is now highlighted if news are available, and the news sheet will now only be shown if there are any news available. Otherwise, a toast will tell the user that no news are available.

This commit is contained in:
denizk0461
2023-05-12 11:40:43 +02:00
parent 2d3dd390bf
commit 6053e8a9c4
10 changed files with 73 additions and 15 deletions
+2 -2
View File
@@ -11,8 +11,8 @@
"type": "SINGLE", "type": "SINGLE",
"filters": [], "filters": [],
"attributes": [], "attributes": [],
"versionCode": 4, "versionCode": 5,
"versionName": "1.0.1", "versionName": "1.0.2",
"outputFile": "app-release.apk" "outputFile": "app-release.apk"
} }
], ],
@@ -27,7 +27,7 @@ class AppRepository(app: Application) {
private val blankDietaryPrefs: String = DietaryPreferences.TEMPLATE_EMPTY private val blankDietaryPrefs: String = DietaryPreferences.TEMPLATE_EMPTY
/** /**
* Used to observe just to register an update of the user-set dietary preferences. * Used to observe whenever updates are made to the dietary preferences.
*/ */
val dietaryPreferencesUpdate: MutableLiveData<Int> = MutableLiveData(0) val dietaryPreferencesUpdate: MutableLiveData<Int> = MutableLiveData(0)
@@ -1,16 +1,20 @@
package com.denizk0461.weserplaner.fragment package com.denizk0461.weserplaner.fragment
import android.content.res.ColorStateList
import android.os.Bundle 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.appcompat.content.res.AppCompatResources
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import com.denizk0461.weserplaner.R import com.denizk0461.weserplaner.R
import com.denizk0461.weserplaner.adapter.CanteenOfferPageAdapter import com.denizk0461.weserplaner.adapter.CanteenOfferPageAdapter
import com.denizk0461.weserplaner.data.getTextSheet import com.denizk0461.weserplaner.data.getTextSheet
import com.denizk0461.weserplaner.data.getThemedColor
import com.denizk0461.weserplaner.data.setRainbowProgressCircle import com.denizk0461.weserplaner.data.setRainbowProgressCircle
import com.denizk0461.weserplaner.data.showErrorSnackBar import com.denizk0461.weserplaner.data.showErrorSnackBar
import com.denizk0461.weserplaner.data.showToast
import com.denizk0461.weserplaner.databinding.FragmentCanteenBinding import com.denizk0461.weserplaner.databinding.FragmentCanteenBinding
import com.denizk0461.weserplaner.model.* import com.denizk0461.weserplaner.model.*
import com.denizk0461.weserplaner.viewmodel.CanteenViewModel import com.denizk0461.weserplaner.viewmodel.CanteenViewModel
@@ -60,13 +64,53 @@ class CanteenFragment : AppFragment() {
R.string.title_canteen_template, R.string.title_canteen_template,
getCurrentlySelectedCanteenName(), getCurrentlySelectedCanteenName(),
) )
// Set the title to be selected so it scrolls (marquee)
binding.appTitleBar.isSelected = true binding.appTitleBar.isSelected = true
binding.buttonNotifications.setOnClickListener { // Set up observer for the selected canteen
openBottomSheet(getTextSheet( viewModel.getCanteen().observe(viewLifecycleOwner) { canteen ->
getString(R.string.canteen_news_sheet_title), if (canteen == null || canteen.news.isBlank()) {
contentId = TextSheetContentId.NEWS, // Set icon to show that no news are available
)) binding.buttonNotifications.icon = AppCompatResources.getDrawable(
context,
R.drawable.notifications_none,
)
// Apply default colour
binding.buttonNotifications.iconTint = ColorStateList.valueOf(
context.theme.getThemedColor(
R.attr.colorOnSurfaceVariant
)
)
// Set up click listener to tell the user that no news are available
binding.buttonNotifications.setOnClickListener {
showToast(context, getString(R.string.text_sheet_news_empty))
}
} else {
// Set icon to show that news are available
binding.buttonNotifications.icon = AppCompatResources.getDrawable(
context,
R.drawable.notifications_active,
)
// Apply highlight colour
binding.buttonNotifications.iconTint = ColorStateList.valueOf(
context.theme.getThemedColor(
com.google.android.material.R.attr.colorPrimary
)
)
// Set up click listener to show news sheet
binding.buttonNotifications.setOnClickListener {
openBottomSheet(getTextSheet(
getString(R.string.canteen_news_sheet_title),
contentId = TextSheetContentId.NEWS,
))
}
}
} }
// Assign a preference value to every button to filter for dietary preferences // Assign a preference value to every button to filter for dietary preferences
@@ -17,6 +17,9 @@ class CanteenPageViewModel(app: Application) : AppViewModel(app) {
fun getOffersByDay(day: Int): LiveData<List<CanteenOffer>> = fun getOffersByDay(day: Int): LiveData<List<CanteenOffer>> =
repo.getOffersByDay(day) repo.getOffersByDay(day)
/**
* Used to observe whenever updates are made to the dietary preferences.
*/
val dietaryPreferencesUpdate: LiveData<Int> = repo.dietaryPreferencesUpdate val dietaryPreferencesUpdate: LiveData<Int> = repo.dietaryPreferencesUpdate
/** /**
@@ -42,6 +42,16 @@ class CanteenViewModel(app: Application) : AppViewModel(app) {
} }
} }
/**
* Retrieves the canteen stored in the database. Should always be 0 or 1.
*
* @return canteen
*/
fun getCanteen(): LiveData<OfferCanteen> = repo.getCanteen()
/**
* Register that the user has made an update to their dietary preferences.
*/
fun registerDietaryPreferencesUpdate() { fun registerDietaryPreferencesUpdate() {
repo.dietaryPreferencesUpdate.postValue(repo.dietaryPreferencesUpdate.value?.plus(1)) repo.dietaryPreferencesUpdate.postValue(repo.dietaryPreferencesUpdate.value?.plus(1))
} }
@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M7.58,4.08L6.15,2.65C3.75,4.48 2.17,7.3 2.03,10.5h2c0.15,-2.65 1.51,-4.97 3.55,-6.42zM19.97,10.5h2c-0.15,-3.2 -1.73,-6.02 -4.12,-7.85l-1.42,1.43c2.02,1.45 3.39,3.77 3.54,6.42zM18,11c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2v-5zM12,22c0.14,0 0.27,-0.01 0.4,-0.04 0.65,-0.14 1.18,-0.58 1.44,-1.18 0.1,-0.24 0.15,-0.5 0.15,-0.78h-4c0.01,1.1 0.9,2 2.01,2z"/>
</vector>
@@ -1,5 +1,5 @@
<vector android:height="24dp" android:tint="#000000" <vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24" android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2z"/> <path android:fillColor="@android:color/white" android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.9,2 2,2zM18,16v-5c0,-3.07 -1.63,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.64,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2zM16,17L8,17v-6c0,-2.48 1.51,-4.5 4,-4.5s4,2.02 4,4.5v6z"/>
</vector> </vector>
+1 -1
View File
@@ -49,7 +49,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minWidth="0dp" android:minWidth="0dp"
app:icon="@drawable/notification" app:icon="@drawable/notifications_none"
app:iconPadding="0dp" app:iconPadding="0dp"
app:layout_constraintTop_toTopOf="@id/app_title_bar" app:layout_constraintTop_toTopOf="@id/app_title_bar"
app:layout_constraintBottom_toBottomOf="@id/app_title_bar" app:layout_constraintBottom_toBottomOf="@id/app_title_bar"
-3
View File
@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<!-- I am unsure whether these attrs are necessary to define -->
<!-- <attr name="colorPrimary" type="color" />-->
<attr name="scheduleColorDefault" type="color" /> <attr name="scheduleColorDefault" type="color" />
<attr name="colorOutlineVariant" type="color" /> <attr name="colorOutlineVariant" type="color" />
<attr name="colorOnSurfaceVariant" type="color" /> <attr name="colorOnSurfaceVariant" type="color" />
@@ -11,7 +9,6 @@
<attr name="colorOnSecondaryContainer" type="color" /> <attr name="colorOnSecondaryContainer" type="color" />
<attr name="colorText" type="color" /> <attr name="colorText" type="color" />
<attr name="colorErrorText" type="color" /> <attr name="colorErrorText" type="color" />
<!-- <attr name="colorOutline" type="color"/>-->
<!-- dietary preference colours --> <!-- dietary preference colours -->
<!-- fair / animal welfare --> <!-- fair / animal welfare -->
-1
View File
@@ -23,4 +23,3 @@ kotlin.code.style=official
android.nonTransitiveRClass=true android.nonTransitiveRClass=true
android.defaults.buildfeatures.buildconfig=true android.defaults.buildfeatures.buildconfig=true
android.nonFinalResIds=false android.nonFinalResIds=false
org.gradle.unsafe.configuration-cache=true