refactor: switch Compose Settings toggles to Material Switch

Each binary setting (auto-create drafts, AI writing help, tracked
broadcasts) becomes a single-tap Switch instead of a two-tap
Always/Never spinner, and a shared BooleanSwitchRow helper removes the
per-toggle boilerplate.

https://claude.ai/code/session_019b6cF7Ukkv7GL9A3m6bXym
This commit is contained in:
Claude
2026-05-13 19:36:53 +00:00
parent d5860841c9
commit 66202e667d
@@ -26,6 +26,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Switch
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@@ -34,10 +35,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.BooleanType import com.vitorpamplona.amethyst.model.BooleanType
import com.vitorpamplona.amethyst.model.ConnectivityType
import com.vitorpamplona.amethyst.model.UiSettingsFlow import com.vitorpamplona.amethyst.model.UiSettingsFlow
import com.vitorpamplona.amethyst.model.parseBooleanType
import com.vitorpamplona.amethyst.ui.components.TitleExplainer
import com.vitorpamplona.amethyst.ui.navigation.navs.INav import com.vitorpamplona.amethyst.ui.navigation.navs.INav
import com.vitorpamplona.amethyst.ui.navigation.topbars.TopBarWithBackButton import com.vitorpamplona.amethyst.ui.navigation.topbars.TopBarWithBackButton
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
@@ -46,7 +44,7 @@ import com.vitorpamplona.amethyst.ui.theme.RowColSpacing
import com.vitorpamplona.amethyst.ui.theme.Size10dp import com.vitorpamplona.amethyst.ui.theme.Size10dp
import com.vitorpamplona.amethyst.ui.theme.Size20dp import com.vitorpamplona.amethyst.ui.theme.Size20dp
import com.vitorpamplona.amethyst.ui.theme.ThemeComparisonRow import com.vitorpamplona.amethyst.ui.theme.ThemeComparisonRow
import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.flow.MutableStateFlow
@Composable @Composable
fun ComposeSettingsScreen( fun ComposeSettingsScreen(
@@ -82,68 +80,38 @@ fun ComposeSettingsContent(sharedPrefs: UiSettingsFlow) {
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = RowColSpacing, verticalArrangement = RowColSpacing,
) { ) {
AutoCreateDraftsChoice(sharedPrefs) BooleanSwitchRow(
AiWritingHelpChoice(sharedPrefs) sharedPrefs.automaticallyCreateDrafts,
TrackedBroadcastsChoice(sharedPrefs) R.string.auto_create_drafts_setting_title,
R.string.auto_create_drafts_setting_description,
)
BooleanSwitchRow(
sharedPrefs.automaticallyProposeAiImprovements,
R.string.ai_writing_setting_title,
R.string.ai_writing_setting_description,
)
BooleanSwitchRow(
sharedPrefs.useTrackedBroadcasts,
R.string.tracked_broadcasts_setting_title,
R.string.tracked_broadcasts_setting_description,
)
} }
} }
@Composable @Composable
fun AutoCreateDraftsChoice(sharedPrefs: UiSettingsFlow) { private fun BooleanSwitchRow(
val createDraftsIndex by sharedPrefs.automaticallyCreateDrafts.collectAsState() flow: MutableStateFlow<BooleanType>,
title: Int,
description: Int,
) {
val value by flow.collectAsState()
val booleanItems = SettingsRow(title, description) {
persistentListOf( Switch(
TitleExplainer(stringRes(BooleanType.ALWAYS.reourceId)), checked = value == BooleanType.ALWAYS,
TitleExplainer(stringRes(BooleanType.NEVER.reourceId)), onCheckedChange = { isOn ->
flow.tryEmit(if (isOn) BooleanType.ALWAYS else BooleanType.NEVER)
},
) )
SettingsRow(
R.string.auto_create_drafts_setting_title,
R.string.auto_create_drafts_setting_description,
booleanItems,
createDraftsIndex.screenCode,
) {
sharedPrefs.automaticallyCreateDrafts.tryEmit(parseBooleanType(it))
}
}
@Composable
fun AiWritingHelpChoice(sharedPrefs: UiSettingsFlow) {
val aiIndex by sharedPrefs.automaticallyProposeAiImprovements.collectAsState()
val booleanItems =
persistentListOf(
TitleExplainer(stringRes(ConnectivityType.ALWAYS.resourceId)),
TitleExplainer(stringRes(ConnectivityType.NEVER.resourceId)),
)
SettingsRow(
R.string.ai_writing_setting_title,
R.string.ai_writing_setting_description,
booleanItems,
aiIndex.screenCode,
) {
sharedPrefs.automaticallyProposeAiImprovements.tryEmit(parseBooleanType(it))
}
}
@Composable
fun TrackedBroadcastsChoice(sharedPrefs: UiSettingsFlow) {
val useTrackedBroadcastsIndex by sharedPrefs.useTrackedBroadcasts.collectAsState()
val booleanItems =
persistentListOf(
TitleExplainer(stringRes(BooleanType.ALWAYS.reourceId)),
TitleExplainer(stringRes(BooleanType.NEVER.reourceId)),
)
SettingsRow(
R.string.tracked_broadcasts_setting_title,
R.string.tracked_broadcasts_setting_description,
booleanItems,
useTrackedBroadcastsIndex.screenCode,
) {
sharedPrefs.useTrackedBroadcasts.tryEmit(parseBooleanType(it))
} }
} }