feat(settings): add SettingsScreen and integrate settings management

This commit is contained in:
2026-05-03 14:32:19 +02:00
parent f925ca57ea
commit a5bb1f84dc
10 changed files with 323 additions and 2 deletions

View File

@@ -256,6 +256,10 @@ class AppViewModel @Inject constructor(
navigationManager.navigate(Route.HomeSearchRoute)
}
fun openSettings() {
navigationManager.navigate(Route.SettingsRoute)
}
fun logout() {
viewModelScope.launch {
userSessionRepository.setLoggedIn(false)

View File

@@ -0,0 +1,47 @@
package hu.bbara.purefin.feature.settings
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import hu.bbara.purefin.navigation.NavigationManager
import hu.bbara.purefin.settings.BooleanSetting
import hu.bbara.purefin.settings.NumberSetting
import hu.bbara.purefin.settings.SettingsRepository
import hu.bbara.purefin.settings.StringSetting
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class SettingsViewModel @Inject constructor(
private val settingsRepository: SettingsRepository,
private val navigationManager: NavigationManager,
) : ViewModel() {
fun value(option: NumberSetting) = settingsRepository.value(option)
fun value(option: BooleanSetting) = settingsRepository.value(option)
fun value(option: StringSetting) = settingsRepository.value(option)
fun set(option: NumberSetting, value: Double) {
viewModelScope.launch {
settingsRepository.set(option, value)
}
}
fun set(option: BooleanSetting, value: Boolean) {
viewModelScope.launch {
settingsRepository.set(option, value)
}
}
fun set(option: StringSetting, value: String) {
viewModelScope.launch {
settingsRepository.set(option, value)
}
}
fun onBack() {
navigationManager.pop()
}
}

View File

@@ -26,6 +26,9 @@ sealed interface Route : NavKey {
@Serializable
data object LoginRoute : Route
@Serializable
data object SettingsRoute : Route
@Serializable
data class PlayerRoute(val mediaId: String) : Route
}

View File

@@ -2,20 +2,50 @@ package hu.bbara.purefin.settings
sealed interface SettingOption<T> {
val key: String
val title: String
val defaultValue: T
}
data class NumberSetting(
override val key: String,
override val defaultValue: Double
override val title: String,
override val defaultValue: Double,
val valueRange: ClosedFloatingPointRange<Double> = 0.0..100.0,
) : SettingOption<Double>
data class BooleanSetting(
override val key: String,
override val title: String,
override val defaultValue: Boolean
) : SettingOption<Boolean>
data class StringSetting(
override val key: String,
override val title: String,
override val defaultValue: String
) : SettingOption<String>
object SettingsOptions {
val defaultPlaybackSpeed = NumberSetting(
key = "default_playback_speed",
title = "Default playback speed",
defaultValue = 1.0,
valueRange = 0.5..2.0
)
val confirmMobileDataPlayback = BooleanSetting(
key = "confirm_mobile_data_playback",
title = "Confirm mobile data playback",
defaultValue = true
)
val preferredAudioLanguage = StringSetting(
key = "preferred_audio_language",
title = "Preferred audio language",
defaultValue = "English"
)
val numberSettings = listOf(defaultPlaybackSpeed)
val booleanSettings = listOf(confirmMobileDataPlayback)
val stringSettings = listOf(preferredAudioLanguage)
}