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:
+29
-61
@@ -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))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user