feat: enhance settings screen with dropdown and void setting options for improved user experience

This commit is contained in:
2026-05-08 20:19:05 +02:00
parent e05041fd14
commit af2e8b0dc9
9 changed files with 422 additions and 97 deletions

View File

@@ -5,7 +5,8 @@ import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import hu.bbara.purefin.core.navigation.NavigationManager
import hu.bbara.purefin.core.settings.BooleanSetting
import hu.bbara.purefin.core.settings.NumberSetting
import hu.bbara.purefin.core.settings.DropdownSetting
import hu.bbara.purefin.core.settings.RangeSetting
import hu.bbara.purefin.core.settings.SettingsRepository
import hu.bbara.purefin.core.settings.StringSetting
import kotlinx.coroutines.launch
@@ -17,13 +18,15 @@ class SettingsViewModel @Inject constructor(
private val navigationManager: NavigationManager,
) : ViewModel() {
fun value(option: NumberSetting) = settingsRepository.value(option)
fun value(option: RangeSetting) = settingsRepository.value(option)
fun value(option: BooleanSetting) = settingsRepository.value(option)
fun value(option: StringSetting) = settingsRepository.value(option)
fun set(option: NumberSetting, value: Double) {
fun <T> value(option: DropdownSetting<T>) = settingsRepository.value(option)
fun set(option: RangeSetting, value: Double) {
viewModelScope.launch {
settingsRepository.set(option, value)
}
@@ -41,6 +44,12 @@ class SettingsViewModel @Inject constructor(
}
}
fun <T> set(option: DropdownSetting<T>, value: T) {
viewModelScope.launch {
settingsRepository.set(option, value)
}
}
fun onBack() {
navigationManager.pop()
}

View File

@@ -6,7 +6,7 @@ sealed interface SettingOption<T> {
val defaultValue: T
}
data class NumberSetting(
data class RangeSetting(
override val key: String,
override val title: String,
override val defaultValue: Double,
@@ -25,8 +25,26 @@ data class StringSetting(
override val defaultValue: String
) : SettingOption<String>
data class VoidSetting(
override val key: String,
override val title: String,
override val defaultValue: Unit = Unit
) : SettingOption<Unit>
data class DropdownSetting<T>(
override val key: String,
override val title: String,
override val defaultValue: T,
val options: List<T>
): SettingOption<T>
data class SettingGroup(
val title: String?,
val options: List<SettingOption<*>>
)
object SettingsOptions {
val defaultPlaybackSpeed = NumberSetting(
val defaultPlaybackSpeed = RangeSetting(
key = "default_playback_speed",
title = "Default playback speed",
defaultValue = 1.0,
@@ -45,7 +63,28 @@ object SettingsOptions {
defaultValue = "English"
)
val numberSettings = listOf(defaultPlaybackSpeed)
val booleanSettings = listOf(confirmMobileDataPlayback)
val stringSettings = listOf(preferredAudioLanguage)
val resetPlaybackSettings = VoidSetting(
key = "reset_playback_settings",
title = "Reset playback settings"
)
val streamingQuality = DropdownSetting(
key = "streaming_quality",
title = "Streaming quality",
defaultValue = "Auto",
options = listOf("Auto", "Low", "Medium", "High")
)
val groups = listOf(
SettingGroup(
title = "Playback",
options = listOf(
defaultPlaybackSpeed,
confirmMobileDataPlayback,
preferredAudioLanguage,
resetPlaybackSettings,
streamingQuality
)
)
)
}

View File

@@ -6,15 +6,19 @@ import kotlinx.coroutines.flow.Flow
interface SettingsRepository {
val settings: Flow<Settings>
fun value(option: NumberSetting): Flow<Double>
fun value(option: RangeSetting): Flow<Double>
fun value(option: BooleanSetting): Flow<Boolean>
fun value(option: StringSetting): Flow<String>
suspend fun set(option: NumberSetting, value: Double)
fun <T> value(option: DropdownSetting<T>): Flow<T>
suspend fun set(option: RangeSetting, value: Double)
suspend fun set(option: BooleanSetting, value: Boolean)
suspend fun set(option: StringSetting, value: String)
suspend fun <T> set(option: DropdownSetting<T>, value: T)
}