Coverage Summary for Class: AppearanceState (com.georgeci.moneysurfer.feature.settings.appearance)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| AppearanceState |
0%
(0/1)
|
0%
(0/4)
|
0%
(0/4)
|
0%
(0/7)
|
0%
(0/51)
|
package com.georgeci.moneysurfer.feature.settings.appearance
import com.georgeci.moneysurfer.domain.preferences.AccentSeed
import com.georgeci.moneysurfer.domain.preferences.ContainerStyle
import com.georgeci.moneysurfer.domain.preferences.PaletteSource
import com.georgeci.moneysurfer.domain.preferences.ThemeMode
import com.georgeci.moneysurfer.domain.preferences.UiPreferences
import com.georgeci.moneysurfer.utils.MviViewModel
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.onEach
import org.koin.core.annotation.KoinViewModel
@KoinViewModel
class AppearanceViewModel(
private val uiPreferences: UiPreferences,
) : MviViewModel<AppearanceState, AppearanceEvent, Nothing>(
initialState = AppearanceState(isDynamicColorAvailable = uiPreferences.isDynamicColorAvailable),
) {
init {
launch {
uiPreferences.paletteSource.flow
.onEach { source -> updateState { copy(paletteSource = source) } }
.collect()
}
launch {
uiPreferences.themeMode.flow
.onEach { mode -> updateState { copy(themeMode = mode) } }
.collect()
}
launch {
uiPreferences.containerStyle.flow
.onEach { style -> updateState { copy(containerStyle = style) } }
.collect()
}
}
override fun onEvent(event: AppearanceEvent) {
when (event) {
AppearanceEvent.OnDynamicSelect -> launch {
uiPreferences.paletteSource.set(PaletteSource.Dynamic)
}
AppearanceEvent.OnBrandSelect -> launch {
uiPreferences.paletteSource.set(PaletteSource.Brand)
}
is AppearanceEvent.OnPresetSelect -> launch {
uiPreferences.paletteSource.set(PaletteSource.Preset(event.seed))
}
is AppearanceEvent.OnThemeModeSelect -> launch {
uiPreferences.themeMode.set(event.mode)
}
is AppearanceEvent.OnContainerStyleSelect -> launch {
uiPreferences.containerStyle.set(event.style)
}
}
}
}
data class AppearanceState(
val isDynamicColorAvailable: Boolean = false,
val paletteSource: PaletteSource = PaletteSource.DEFAULT,
val themeMode: ThemeMode = ThemeMode.System,
val containerStyle: ContainerStyle = ContainerStyle.Card,
) {
val isDynamicColorEnabled: Boolean get() = paletteSource is PaletteSource.Dynamic
val isBrandSelected: Boolean get() = paletteSource is PaletteSource.Brand
val selectedSeed: AccentSeed? get() = (paletteSource as? PaletteSource.Preset)?.seed
}
sealed interface AppearanceEvent {
data object OnDynamicSelect : AppearanceEvent
data object OnBrandSelect : AppearanceEvent
data class OnPresetSelect(val seed: AccentSeed) : AppearanceEvent
data class OnThemeModeSelect(val mode: ThemeMode) : AppearanceEvent
data class OnContainerStyleSelect(val style: ContainerStyle) : AppearanceEvent
}