Coverage Summary for Class: SettingsScreenViewKt (com.vsevolodganin.clicktrack.ui.screen)
Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
SettingsScreenViewKt |
0%
(0/9)
|
0%
(0/55)
|
0%
(0/73)
|
1.2%
(12/1010)
|
SettingsScreenViewKt$WhenMappings |
|
Total |
0%
(0/9)
|
0%
(0/55)
|
0%
(0/73)
|
1.2%
(12/1010)
|
package com.vsevolodganin.clicktrack.ui.screen
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Button
import androidx.compose.material.Divider
import androidx.compose.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.vsevolodganin.clicktrack.generated.resources.MR
import com.vsevolodganin.clicktrack.language.AppLanguage
import com.vsevolodganin.clicktrack.settings.SettingsState
import com.vsevolodganin.clicktrack.settings.SettingsViewModel
import com.vsevolodganin.clicktrack.theme.Theme
import com.vsevolodganin.clicktrack.ui.piece.TopAppBarWithBack
import com.vsevolodganin.clicktrack.ui.piece.settings.BooleanChooser
import com.vsevolodganin.clicktrack.ui.piece.settings.ListChooser
import com.vsevolodganin.clicktrack.ui.piece.settings.ListChooserItem
import com.vsevolodganin.clicktrack.ui.theme.ClickTrackTheme
import com.vsevolodganin.clicktrack.utils.compose.navigationBarsPadding
import com.vsevolodganin.clicktrack.utils.platform.isDebug
import dev.icerock.moko.resources.compose.stringResource
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@Composable
fun SettingsScreenView(viewModel: SettingsViewModel, modifier: Modifier = Modifier) {
Scaffold(
topBar = {
TopAppBarWithBack(
onBackClick = viewModel::onBackClick,
title = { Text(stringResource(MR.strings.settings_screen_title)) },
)
},
modifier = modifier,
) {
Content(viewModel)
}
}
@Composable
private fun Content(viewModel: SettingsViewModel) {
val state by viewModel.state.collectAsState()
Column {
ListChooser(
title = stringResource(MR.strings.settings_theme),
value = state.theme.displayValue(),
variants = Theme.entries.map {
ListChooserItem(
value = it,
displayValue = it.displayValue(),
description = it.description(),
)
},
onChoose = viewModel::onThemeChange,
)
Divider(modifier = Modifier.padding(start = 16.dp))
ListChooser(
title = stringResource(MR.strings.settings_language),
value = state.language.displayValue(),
variants = AppLanguage.entries.map {
ListChooserItem(
value = it,
displayValue = it.displayValue(),
description = null,
)
},
onChoose = viewModel::onLanguageChange,
)
Divider(modifier = Modifier.padding(start = 16.dp))
BooleanChooser(
title = stringResource(MR.strings.settings_ignore_audio_focus),
value = state.ignoreAudioFocus,
onCheckedChange = viewModel::onIgnoreAudioFocusChange,
description = stringResource(MR.strings.settings_ignore_audio_focus_description),
)
if (isDebug()) {
Spacer(modifier = Modifier.weight(1f))
Column(
modifier = Modifier
.navigationBarsPadding()
.fillMaxWidth(),
verticalArrangement = Arrangement.spacedBy(8.dp),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Button(onClick = viewModel::onKotlinExceptionClick) {
Text("Kotlin exception crash")
}
Button(onClick = viewModel::onNativeExceptionCrashClick) {
Text("Native exception crash")
}
Button(onClick = viewModel::onNativeDanglingReferenceCrashClick) {
Text("Native dangling reference crash")
}
Button(onClick = viewModel::onNonFatalClick) {
Text("Non-fatal")
}
}
}
}
}
@Composable
private fun Theme.displayValue(): String = when (this) {
Theme.LIGHT -> MR.strings.settings_theme_light
Theme.DARK -> MR.strings.settings_theme_dark
Theme.SYSTEM -> MR.strings.settings_theme_system
Theme.AUTO -> MR.strings.settings_theme_auto
}.let { stringResource(it) }
@Composable
private fun Theme.description(): String? = when (this) {
Theme.LIGHT -> null
Theme.DARK -> null
Theme.SYSTEM -> MR.strings.settings_theme_system_description
Theme.AUTO -> MR.strings.settings_theme_auto_description
}?.let { stringResource(it) }
@Composable
private fun AppLanguage.displayValue(): String = when (this) {
AppLanguage.SYSTEM -> MR.strings.settings_language_system
AppLanguage.ENGLISH -> MR.strings.settings_language_system_english
AppLanguage.RUSSIAN -> MR.strings.settings_language_system_russian
}.let { stringResource(it) }
@ScreenPreview
@Composable
private fun Preview() = ClickTrackTheme {
SettingsScreenView(
viewModel = object : SettingsViewModel {
override val state: StateFlow<SettingsState> = MutableStateFlow(
SettingsState(
theme = Theme.SYSTEM,
ignoreAudioFocus = false,
language = AppLanguage.SYSTEM,
),
)
override fun onBackClick() = Unit
override fun onThemeChange(theme: Theme) = Unit
override fun onLanguageChange(language: AppLanguage) = Unit
override fun onIgnoreAudioFocusChange(ignoreAudioFocus: Boolean) = Unit
override fun onKotlinExceptionClick() = Unit
override fun onNativeExceptionCrashClick() = Unit
override fun onNativeDanglingReferenceCrashClick() = Unit
override fun onNonFatalClick() = Unit
},
)
}