Refactored preference functions so that view models cannot access preferences directly, instead having to use get/set methods, which also solves a potential bug source of defining different default values for certain properties in different view models

This commit is contained in:
denizk0461
2023-05-14 13:10:47 +02:00
parent d9a4ead7ec
commit d4e64018d2
11 changed files with 199 additions and 90 deletions
@@ -198,7 +198,7 @@ class StwParser(application: Application) {
*
* Hence, getIntPreference() + 2
*/
repo.getIntPreference(SettingsPreferences.PRICING) + 2
repo.getPreferencePricing() + 2
),
dietaryPreferences = prefs.deconstruct(),
allergens = filteredText.second,
@@ -46,8 +46,10 @@ class AppRepository(app: Application) {
*/
fun getRepositoryInstance(app: Application): AppRepository {
if (!::repo.isInitialized) {
synchronized(Object::class.java) {
repo = AppRepository(app)
}
}
return repo
}
}
@@ -251,7 +253,144 @@ class AppRepository(app: Application) {
*/
fun insertItems(items: List<OfferItem>) { dao.insertItems(items) }
// --- settings preferences --- //
// --- user-set preferences --- //
/**
* This value determines which allergens the user wants to have displayed or hidden.
*/
fun getPreferenceAllergenConfig(): String = getStringPreference(
SettingsPreferences.ALLERGEN_CONFIG,
defaultValue = AllergenPreferences.TEMPLATE,
)
/**
* This value determines how many allergens the user wants to have displayed or hidden.
*/
fun getPreferenceAllergenConfigCount(): Int = getPreferenceAllergenConfig().run {
if (isBlank()) 0 else split(",").count()
}
fun setPreferenceAllergenConfig(newValue: String) {
setPreference(SettingsPreferences.ALLERGEN_CONFIG, newValue)
}
/**
* This value determines whether the user wants to have allergens marked.
*/
fun getPreferenceAllergen(): Boolean = getBooleanPreference(
SettingsPreferences.ALLERGEN,
defaultValue = true,
)
fun setPreferenceAllergen(newValue: Boolean) {
setPreference(SettingsPreferences.ALLERGEN, newValue)
}
/**
* This value determines which canteen the user has selected.
*/
fun getPreferenceColour(): Boolean = getBooleanPreference(
SettingsPreferences.COLOUR_PREFS,
defaultValue = true,
)
fun setPreferenceColour(newValue: Boolean) {
setPreference(SettingsPreferences.COLOUR_PREFS, newValue)
}
/**
* This value determines which canteen the user has selected.
*/
fun getPreferenceCanteen(): Int = getIntPreference(
SettingsPreferences.CANTEEN,
)
fun setPreferenceCanteen(newValue: Int) {
setPreference(SettingsPreferences.CANTEEN, newValue)
}
/**
* This value determines whether the user has opened the canteen fragment before.
*/
fun getPreferenceHasOpenedCanteen(): Boolean = getBooleanPreference(
SettingsPreferences.HAS_OPENED_CANTEEN,
)
fun setPreferenceHasOpenedCanteen(newValue: Boolean) {
setPreference(SettingsPreferences.HAS_OPENED_CANTEEN, newValue)
}
/**
* This value determines whether the user wants to have the next course in their schedule
* highlighted.
*/
fun getPreferenceCourseHighlighting(): Boolean = getBooleanPreference(
SettingsPreferences.COURSE_HIGHLIGHTING,
defaultValue = true,
)
fun setPreferenceCourseHighlighting(newValue: Boolean) {
setPreference(SettingsPreferences.COURSE_HIGHLIGHTING, newValue)
}
/**
* This value determines whether the user wants their timetable to launch with the current day.
*/
fun getPreferenceCurrentDay(): Boolean = getBooleanPreference(
SettingsPreferences.CURRENT_DAY,
defaultValue = true,
)
fun setPreferenceCurrentDay(newValue: Boolean) {
setPreference(SettingsPreferences.CURRENT_DAY, newValue)
}
/**
* Determines whether the user is launching the app for the first time.
*/
fun getPreferenceFirstLaunch(): Boolean = getBooleanPreference(
SettingsPreferences.FIRST_LAUNCH,
defaultValue = true,
)
fun setPreferenceFirstLaunch(newValue: Boolean) {
setPreference(SettingsPreferences.FIRST_LAUNCH, 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.
*/
fun getPreferenceLaunchFragment(): Int = getIntPreference(
SettingsPreferences.LAUNCH_FRAGMENT_ON_START,
)
fun setPreferenceLaunchFragment(newValue: Int) {
setPreference(SettingsPreferences.LAUNCH_FRAGMENT_ON_START, 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.
*/
fun getPreferencePricing(): Int = getIntPreference(
SettingsPreferences.PRICING,
)
fun setPreferencePricing(newValue: Int) {
setPreference(SettingsPreferences.PRICING, newValue)
}
/**
* This value determines whether the user opts into submitting crash reports.
*/
fun getPreferenceDataHandling(): Boolean = getBooleanPreference(
SettingsPreferences.DATA_HANDLING,
)
fun setPreferenceDataHandling(newValue: Boolean) {
setPreference(SettingsPreferences.DATA_HANDLING, newValue)
}
/**
* This value determines whether the user has enabled experimental settings.
*/
fun getPreferenceExperimentalSettingsEnabled(): Boolean = getBooleanPreference(
SettingsPreferences.EXPERIMENTAL_ENABLED,
)
fun setPreferenceExperimentalSettingsEnabled(newValue: Boolean) {
setPreference(SettingsPreferences.EXPERIMENTAL_ENABLED, newValue)
}
// --- private preference handlers preferences --- //
/**
* Retrieves a user-set boolean preference.
@@ -259,53 +398,53 @@ class AppRepository(app: Application) {
* @param pref preference to retrieve
* @return whether the user set this preference
*/
fun getBooleanPreference(pref: SettingsPreferences, defaultValue: Boolean = false): Boolean =
private fun getBooleanPreference(pref: SettingsPreferences, defaultValue: Boolean = false): Boolean =
prefs.getBoolean(pref.key, defaultValue)
/**
* Retrieves a user-set string preference.
*
* @param pref preference to retrieve
* @return string that was set
*/
fun getStringPreference(pref: SettingsPreferences, defaultValue: String = ""): String =
prefs.getString(pref.key, defaultValue) ?: ""
/**
* Retrieves a user-set integer preference.
*
* @param pref preference to retrieve
* @return whether the user set this preference
*/
fun getIntPreference(pref: SettingsPreferences): Int = prefs.getInt(pref.key, 0)
/**
* Updates a user-set boolean preference.
*
* @param pref preference to set
* @param newValue new value to set the preference to
*/
fun setPreference(pref: SettingsPreferences, newValue: Boolean) {
private fun setPreference(pref: SettingsPreferences, newValue: Boolean) {
prefs.edit().putBoolean(pref.key, newValue).apply()
}
/**
* Retrieves a user-set string preference.
*
* @param pref preference to retrieve
* @return string that was set
*/
private fun getStringPreference(pref: SettingsPreferences, defaultValue: String = ""): String =
prefs.getString(pref.key, defaultValue) ?: ""
/**
* Updates a user-set string preference.
*
* @param pref preference to set
* @param newValue new value to set the preference to
*/
fun setPreference(pref: SettingsPreferences, newValue: String) {
private fun setPreference(pref: SettingsPreferences, newValue: String) {
prefs.edit().putString(pref.key, newValue).apply()
}
/**
* Retrieves a user-set integer preference.
*
* @param pref preference to retrieve
* @return whether the user set this preference
*/
private fun getIntPreference(pref: SettingsPreferences): Int = prefs.getInt(pref.key, 0)
/**
* Updates a user-set integer preference.
*
* @param pref preference to set
* @param newValue new value to set the preference to
*/
fun setPreference(pref: SettingsPreferences, newValue: Int) {
private fun setPreference(pref: SettingsPreferences, newValue: Int) {
prefs.edit().putInt(pref.key, newValue).apply()
}
}
@@ -1,8 +1,6 @@
package com.denizk0461.weserplaner.viewmodel
import android.app.Application
import com.denizk0461.weserplaner.model.AllergenPreferences
import com.denizk0461.weserplaner.model.SettingsPreferences
class AllergenConfigViewModel(application: Application) : AppViewModel(application) {
@@ -10,8 +8,6 @@ class AllergenConfigViewModel(application: Application) : AppViewModel(applicati
* This value determines which allergens the user wants to have displayed or hidden.
*/
var preferenceAllergenConfig: String
get() = repo.getStringPreference(
SettingsPreferences.ALLERGEN_CONFIG, defaultValue = AllergenPreferences.TEMPLATE
)
set(newValue) { repo.setPreference(SettingsPreferences.ALLERGEN_CONFIG, newValue) }
get() = repo.getPreferenceAllergenConfig()
set(value) { repo.setPreferenceAllergenConfig(value) }
}
@@ -2,10 +2,8 @@ package com.denizk0461.weserplaner.viewmodel
import android.app.Application
import androidx.lifecycle.LiveData
import com.denizk0461.weserplaner.model.AllergenPreferences
import com.denizk0461.weserplaner.model.CanteenOffer
import com.denizk0461.weserplaner.model.DietaryPreferences
import com.denizk0461.weserplaner.model.SettingsPreferences
class CanteenPageViewModel(app: Application) : AppViewModel(app) {
@@ -33,19 +31,17 @@ class CanteenPageViewModel(app: Application) : AppViewModel(app) {
* This value determines which allergens the user wants to have displayed or hidden.
*/
val preferenceAllergenConfig: String
get() = repo.getStringPreference(
SettingsPreferences.ALLERGEN_CONFIG, defaultValue = AllergenPreferences.TEMPLATE
)
get() = repo.getPreferenceAllergenConfig()
/**
* This value determines whether the user wants to have allergens marked.
*/
val preferenceAllergen: Boolean
get() = repo.getBooleanPreference(SettingsPreferences.ALLERGEN, defaultValue = true)
get() = repo.getPreferenceAllergen()
/**
* This value determines which canteen the user has selected.
*/
val preferenceColour: Boolean
get() = repo.getBooleanPreference(SettingsPreferences.COLOUR_PREFS, defaultValue = true)
get() = repo.getPreferenceColour()
}
@@ -78,13 +78,13 @@ class CanteenViewModel(app: Application) : AppViewModel(app) {
* This value determines which canteen the user has selected.
*/
var preferenceCanteen: Int
get() = repo.getIntPreference(SettingsPreferences.CANTEEN)
set(newValue) { repo.setPreference(SettingsPreferences.CANTEEN, newValue) }
get() = repo.getPreferenceCanteen()
set(newValue) { repo.setPreferenceCanteen(newValue) }
/**
* This value determines whether the user has opened the canteen fragment before.
*/
var preferenceHasOpenedCanteen: Boolean
get() = repo.getBooleanPreference(SettingsPreferences.HAS_OPENED_CANTEEN)
set(newValue) { repo.setPreference(SettingsPreferences.HAS_OPENED_CANTEEN, newValue) }
get() = repo.getPreferenceHasOpenedCanteen()
set(newValue) { repo.setPreferenceHasOpenedCanteen(newValue) }
}
@@ -2,7 +2,6 @@ package com.denizk0461.weserplaner.viewmodel
import android.app.Application
import androidx.lifecycle.LiveData
import com.denizk0461.weserplaner.model.SettingsPreferences
import com.denizk0461.weserplaner.model.StudIPEvent
/**
@@ -24,8 +23,5 @@ class EventPageViewModel(app: Application) : AppViewModel(app) {
* highlighted.
*/
val preferenceCourseHighlighting: Boolean
get() = repo.getBooleanPreference(
SettingsPreferences.COURSE_HIGHLIGHTING,
defaultValue = true
)
get() = repo.getPreferenceCourseHighlighting()
}
@@ -2,7 +2,6 @@ package com.denizk0461.weserplaner.viewmodel
import android.app.Application
import androidx.lifecycle.LiveData
import com.denizk0461.weserplaner.model.SettingsPreferences
/**
* View model for [com.denizk0461.weserplaner.fragment.EventFragment]
@@ -22,18 +21,12 @@ class EventViewModel(app: Application) : AppViewModel(app) {
* This value determines whether the user wants their timetable to launch with the current day.
*/
val preferenceCurrentDay: Boolean
get() = repo.getBooleanPreference(
SettingsPreferences.CURRENT_DAY,
defaultValue = true,
)
get() = repo.getPreferenceCurrentDay()
/**
* Determines whether the user is launching the app for the first time.
*/
var preferenceFirstLaunch: Boolean
get() = repo.getBooleanPreference(
SettingsPreferences.FIRST_LAUNCH,
defaultValue = true,
)
set(value) { repo.setPreference(SettingsPreferences.FIRST_LAUNCH, value) }
get() = repo.getPreferenceFirstLaunch()
set(value) { repo.setPreferenceFirstLaunch(value) }
}
@@ -1,7 +1,6 @@
package com.denizk0461.weserplaner.viewmodel
import android.app.Application
import com.denizk0461.weserplaner.model.SettingsPreferences
/**
* View model for [com.denizk0461.weserplaner.activity.MainActivity]
@@ -15,5 +14,5 @@ class MainViewModel(application: Application) : AppViewModel(application) {
* the order that the items are arranged in in the bottom nav bar.
*/
val preferenceLaunchFragment: Int
get() = repo.getIntPreference(SettingsPreferences.LAUNCH_FRAGMENT_ON_START)
get() = repo.getPreferenceLaunchFragment()
}
@@ -1,8 +1,6 @@
package com.denizk0461.weserplaner.viewmodel
import android.app.Application
import com.denizk0461.weserplaner.model.AllergenPreferences
import com.denizk0461.weserplaner.model.SettingsPreferences
/**
* View model for [com.denizk0461.weserplaner.fragment.SettingsFragment]
@@ -15,76 +13,66 @@ class SettingsViewModel(app: Application) : AppViewModel(app) {
* This value determines whether the user wants their timetable to launch with the current day.
*/
var preferenceCurrentDay: Boolean
get() = repo.getBooleanPreference(
SettingsPreferences.CURRENT_DAY,
defaultValue = true,
)
set(newValue) { repo.setPreference(SettingsPreferences.CURRENT_DAY, newValue) }
get() = repo.getPreferenceCurrentDay()
set(newValue) { repo.setPreferenceCurrentDay(newValue) }
/**
* This value determines whether the user wants to have the next course in their schedule
* highlighted.
*/
var preferenceCourseHighlighting: Boolean
get() = repo.getBooleanPreference(
SettingsPreferences.COURSE_HIGHLIGHTING,
defaultValue = true
)
set(newValue) { repo.setPreference(SettingsPreferences.COURSE_HIGHLIGHTING, newValue) }
get() = repo.getPreferenceCourseHighlighting()
set(newValue) { repo.setPreferenceCourseHighlighting(newValue) }
/**
* This value determines whether the user wants to have allergens marked.
*/
var preferenceAllergen: Boolean
get() = repo.getBooleanPreference(SettingsPreferences.ALLERGEN, defaultValue = true)
set(newValue) { repo.setPreference(SettingsPreferences.ALLERGEN, newValue) }
get() = repo.getPreferenceAllergen()
set(newValue) { repo.setPreferenceAllergen(newValue) }
/**
* This value determines how many allergens the user wants to have displayed or hidden.
*/
val preferenceAllergenConfigCount: Int
get() = repo.getStringPreference(
SettingsPreferences.ALLERGEN_CONFIG, defaultValue = AllergenPreferences.TEMPLATE
).run {
if (isBlank()) 0 else split(",").count()
}
get() = repo.getPreferenceAllergenConfigCount()
/**
* 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 preferencePricing: Int
get() = repo.getIntPreference(SettingsPreferences.PRICING)
set(newValue) { repo.setPreference(SettingsPreferences.PRICING, newValue) }
get() = repo.getPreferencePricing()
set(newValue) { repo.setPreferencePricing(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) }
get() = repo.getPreferenceLaunchFragment()
set(newValue) { repo.setPreferenceLaunchFragment(newValue) }
/**
* This value determines which canteen the user has selected.
*/
var preferenceColour: Boolean
get() = repo.getBooleanPreference(SettingsPreferences.COLOUR_PREFS, defaultValue = true)
set(newValue) { repo.setPreference(SettingsPreferences.COLOUR_PREFS, newValue) }
get() = repo.getPreferenceColour()
set(newValue) { repo.setPreferenceColour(newValue) }
/**
* This value determines whether the user opts into submitting crash reports.
*/
var preferenceDataHandling: Boolean
get() = repo.getBooleanPreference(SettingsPreferences.DATA_HANDLING)
set(newValue) { repo.setPreference(SettingsPreferences.DATA_HANDLING, newValue) }
get() = repo.getPreferenceDataHandling()
set(newValue) { repo.setPreferenceDataHandling(newValue) }
/**
* This value determines whether the user has enabled experimental settings.
*/
var preferenceExperimentalSettingsEnabled: Boolean
get() = repo.getBooleanPreference(SettingsPreferences.EXPERIMENTAL_ENABLED)
set(newValue) { repo.setPreference(SettingsPreferences.EXPERIMENTAL_ENABLED, newValue) }
get() = repo.getPreferenceExperimentalSettingsEnabled()
set(newValue) { repo.setPreferenceExperimentalSettingsEnabled(newValue) }
// --- functions for dev codes --- //
+3 -1
View File
@@ -20,7 +20,8 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp">
android:layout_marginStart="16dp"
android:layout_marginEnd="8dp">
<TextView
android:id="@+id/app_title_bar"
@@ -30,6 +31,7 @@
android:textSize="28sp"
android:layout_marginTop="16dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="4dp"
android:fontFamily="@font/lato_blackitalic"
android:singleLine="true"
android:ellipsize="marquee"