feat(settings): reorder top-level settings sections and add appearance subtext #169

Merged
JMR-dev merged 1 commits from feat-158-settings-hierarchy into main 2026-07-02 22:08:30 +00:00
2 changed files with 50 additions and 43 deletions
@@ -132,41 +132,6 @@ fun SettingsScreen(
ClickRow(title = stringResource(R.string.settings_add_account), onClick = onAddAccount) ClickRow(title = stringResource(R.string.settings_add_account), onClick = onAddAccount)
HorizontalDivider() HorizontalDivider()
SectionHeader(stringResource(R.string.settings_notifications))
SwitchRow(
title = stringResource(R.string.settings_new_mail),
checked = settings.newMailNotifications,
onCheckedChange = viewModel::setNewMailNotifications,
subtitle = stringResource(R.string.settings_new_mail_summary),
)
HorizontalDivider()
SectionHeader(stringResource(R.string.settings_contacts))
ContactAutocompleteRow(
state = contactsState,
onClick = {
when (contactsState) {
// Already on: send to system settings, the only place to turn it back off.
ContactPermissionState.GRANTED ->
runCatching { context.startActivity(viewModel.contactsSettingsIntent()) }
// Re-requestable in-app: explain first (#128), then launch the system dialog.
ContactPermissionState.DENIED -> showContactsRationale = true
// Permanently denied: an in-app request is a no-op, so deep-link to settings.
ContactPermissionState.BLOCKED -> showContactsBlocked = true
}
},
)
HorizontalDivider()
SectionHeader(stringResource(R.string.settings_appearance))
SwitchRow(
title = stringResource(R.string.settings_dynamic_color),
checked = settings.dynamicColor,
onCheckedChange = viewModel::setDynamicColor,
subtitle = stringResource(R.string.settings_dynamic_color_summary),
)
HorizontalDivider()
SectionHeader(stringResource(R.string.settings_downloading)) SectionHeader(stringResource(R.string.settings_downloading))
RadioRow( RadioRow(
title = stringResource(R.string.fetch_always), title = stringResource(R.string.fetch_always),
@@ -188,11 +153,35 @@ fun SettingsScreen(
) )
HorizontalDivider() HorizontalDivider()
SectionHeader(stringResource(R.string.settings_diagnostics)) SectionHeader(stringResource(R.string.settings_contacts))
ClickRow( ContactAutocompleteRow(
title = stringResource(R.string.settings_report_problem), state = contactsState,
subtitle = stringResource(R.string.settings_report_problem_summary), onClick = {
onClick = onReportProblem, when (contactsState) {
// Already on: send to system settings, the only place to turn it back off.
ContactPermissionState.GRANTED ->
runCatching { context.startActivity(viewModel.contactsSettingsIntent()) }
// Re-requestable in-app: explain first (#128), then launch the system dialog.
ContactPermissionState.DENIED -> showContactsRationale = true
// Permanently denied: an in-app request is a no-op, so deep-link to settings.
ContactPermissionState.BLOCKED -> showContactsBlocked = true
}
},
)
HorizontalDivider()
SectionHeader(stringResource(R.string.settings_appearance))
Text(
text = stringResource(R.string.settings_appearance_summary),
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(horizontal = 16.dp),
)
SwitchRow(
title = stringResource(R.string.settings_dynamic_color),
checked = settings.dynamicColor,
onCheckedChange = viewModel::setDynamicColor,
subtitle = stringResource(R.string.settings_dynamic_color_summary),
) )
HorizontalDivider() HorizontalDivider()
@@ -205,6 +194,15 @@ fun SettingsScreen(
) )
HorizontalDivider() HorizontalDivider()
SectionHeader(stringResource(R.string.settings_notifications))
SwitchRow(
title = stringResource(R.string.settings_new_mail),
checked = settings.newMailNotifications,
onCheckedChange = viewModel::setNewMailNotifications,
subtitle = stringResource(R.string.settings_new_mail_summary),
)
HorizontalDivider()
// Global device-only retention default (issue #13); accounts may override it. // Global device-only retention default (issue #13); accounts may override it.
RetentionSection( RetentionSection(
count = settings.retentionCount, count = settings.retentionCount,
@@ -215,6 +213,15 @@ fun SettingsScreen(
) )
HorizontalDivider() HorizontalDivider()
// Standalone trailing action, no section header — matches AccountSettingsScreen's
// "Remove account" row; self-explanatory as the last item in the list (#158).
ClickRow(
title = stringResource(R.string.settings_report_problem),
subtitle = stringResource(R.string.settings_report_problem_summary),
onClick = onReportProblem,
)
HorizontalDivider()
AdvancedHeader(expanded = advancedExpanded, onToggle = viewModel::toggleAdvanced) AdvancedHeader(expanded = advancedExpanded, onToggle = viewModel::toggleAdvanced)
AnimatedVisibility(visible = advancedExpanded) { AnimatedVisibility(visible = advancedExpanded) {
Column { Column {
+3 -3
View File
@@ -224,13 +224,13 @@
<string name="fetch_on_demand">Always on-demand</string> <string name="fetch_on_demand">Always on-demand</string>
<string name="fetch_on_demand_summary">Sync only message headers; download a message\'s content when you open it.</string> <string name="fetch_on_demand_summary">Sync only message headers; download a message\'s content when you open it.</string>
<string name="settings_notifications">Notifications</string> <string name="settings_notifications">Notifications</string>
<string name="settings_new_mail">New-mail notifications</string> <string name="settings_new_mail">New mail notifications</string>
<string name="settings_new_mail_summary">Show a notification when new mail arrives</string> <string name="settings_new_mail_summary">Show a notification when new mail arrives</string>
<string name="settings_no_accounts">No accounts yet</string> <string name="settings_no_accounts">No accounts yet</string>
<string name="account_remove">Remove account</string> <string name="account_remove">Remove account</string>
<!-- Backup --> <!-- Backup -->
<string name="settings_backup">Backup</string> <string name="settings_backup">Settings Backup</string>
<string name="settings_backup_include">Include settings in Android Backup</string> <string name="settings_backup_include">Include settings in Android Backup</string>
<string name="settings_backup_include_summary">Let Android back up your LibreMail preferences (Google Auto Backup) so they restore when you set up a new device. Your mail, accounts, passwords, and encryption keys are never backed up — only app settings. Off by default; uses Google infrastructure.</string> <string name="settings_backup_include_summary">Let Android back up your LibreMail preferences (Google Auto Backup) so they restore when you set up a new device. Your mail, accounts, passwords, and encryption keys are never backed up — only app settings. Off by default; uses Google infrastructure.</string>
@@ -278,6 +278,7 @@
<string name="settings_account_system_notif">Sound &amp; vibration</string> <string name="settings_account_system_notif">Sound &amp; vibration</string>
<string name="settings_account_system_notif_summary">Manage sound, vibration, and importance in Android settings</string> <string name="settings_account_system_notif_summary">Manage sound, vibration, and importance in Android settings</string>
<string name="settings_appearance">Appearance</string> <string name="settings_appearance">Appearance</string>
<string name="settings_appearance_summary">Match device theme\nMaterial You theming (Android 12+)</string>
<string name="settings_dynamic_color">Use wallpaper colors</string> <string name="settings_dynamic_color">Use wallpaper colors</string>
<string name="settings_dynamic_color_summary">Material You dynamic theming (Android 12+)</string> <string name="settings_dynamic_color_summary">Material You dynamic theming (Android 12+)</string>
<string name="settings_add_account">Add account</string> <string name="settings_add_account">Add account</string>
@@ -319,7 +320,6 @@
<string name="settings_contacts_open_settings">Open settings</string> <string name="settings_contacts_open_settings">Open settings</string>
<!-- Diagnostics / debug reporting --> <!-- Diagnostics / debug reporting -->
<string name="settings_diagnostics">Diagnostics</string>
<string name="settings_report_problem">Report a problem</string> <string name="settings_report_problem">Report a problem</string>
<string name="settings_report_problem_summary">Capture diagnostics you can review and optionally send</string> <string name="settings_report_problem_summary">Capture diagnostics you can review and optionally send</string>
<string name="reports_title">Problem reports</string> <string name="reports_title">Problem reports</string>