Remove PreferenceText, replace by ListItem.

This commit is contained in:
Benoit Marty 2025-03-05 12:43:29 +01:00
parent 0ab1e564df
commit b0cd9905ce
10 changed files with 117 additions and 280 deletions

View file

@ -11,16 +11,17 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.compound.theme.ElementTheme
import io.element.android.features.lockscreen.impl.R
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
import io.element.android.libraries.designsystem.components.preferences.PreferenceDivider
import io.element.android.libraries.designsystem.components.preferences.PreferencePage
import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch
import io.element.android.libraries.designsystem.components.preferences.PreferenceText
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.ListItem
import io.element.android.libraries.designsystem.theme.components.ListItemStyle
import io.element.android.libraries.designsystem.theme.components.Text
@Composable
fun LockScreenSettingsView(
@ -35,15 +36,19 @@ fun LockScreenSettingsView(
modifier = modifier
) {
PreferenceCategory(showTopDivider = false) {
PreferenceText(
title = stringResource(id = R.string.screen_app_lock_settings_change_pin),
onClick = onChangePinClick
ListItem(
headlineContent = {
Text(stringResource(id = R.string.screen_app_lock_settings_change_pin))
},
onClick = onChangePinClick,
)
PreferenceDivider()
if (state.showRemovePinOption) {
PreferenceText(
title = stringResource(id = R.string.screen_app_lock_settings_remove_pin),
tintColor = ElementTheme.colors.textCriticalPrimary,
ListItem(
headlineContent = {
Text(stringResource(id = R.string.screen_app_lock_settings_remove_pin))
},
style = ListItemStyle.Destructive,
onClick = {
state.eventSink(LockScreenSettingsEvents.OnRemovePin)
}

View file

@ -12,9 +12,10 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.libraries.designsystem.components.preferences.PreferencePage
import io.element.android.libraries.designsystem.components.preferences.PreferenceText
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.ListItem
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.ui.strings.CommonStrings
@Composable
@ -31,13 +32,17 @@ fun AboutView(
title = stringResource(id = CommonStrings.common_about)
) {
state.elementLegals.forEach { elementLegal ->
PreferenceText(
title = stringResource(id = elementLegal.titleRes),
ListItem(
headlineContent = {
Text(stringResource(id = elementLegal.titleRes))
},
onClick = { onElementLegalClick(elementLegal) }
)
}
PreferenceText(
title = stringResource(id = CommonStrings.common_open_source_licenses),
ListItem(
headlineContent = {
Text(stringResource(id = CommonStrings.common_open_source_licenses))
},
onClick = onOpenSourceLicensesClick,
)
}

View file

@ -7,23 +7,30 @@
package io.element.android.features.preferences.impl.developer
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.progressSemantics
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.features.preferences.impl.R
import io.element.android.features.preferences.impl.developer.tracing.LogLevelItem
import io.element.android.features.rageshake.api.preferences.RageshakePreferencesView
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
import io.element.android.libraries.designsystem.components.preferences.PreferenceDropdown
import io.element.android.libraries.designsystem.components.preferences.PreferencePage
import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch
import io.element.android.libraries.designsystem.components.preferences.PreferenceText
import io.element.android.libraries.designsystem.components.preferences.PreferenceTextField
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator
import io.element.android.libraries.designsystem.theme.components.ListItem
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.featureflag.ui.FeatureListView
import io.element.android.libraries.featureflag.ui.model.FeatureUiModel
import io.element.android.libraries.ui.strings.CommonStrings
@ -57,13 +64,15 @@ fun DeveloperSettingsView(
selectedOption = state.tracingLogLevel.dataOrNull(),
options = LogLevelItem.entries.toPersistentList(),
onSelectOption = { logLevel ->
state.eventSink(DeveloperSettingsEvents.SetTracingLogLevel(logLevel))
state.eventSink(DeveloperSettingsEvents.SetTracingLogLevel(logLevel))
}
)
}
PreferenceCategory(title = "Showkase") {
PreferenceText(
title = "Open Showkase browser",
ListItem(
headlineContent = {
Text("Open Showkase browser")
},
onClick = onOpenShowkase
)
}
@ -71,17 +80,31 @@ fun DeveloperSettingsView(
state = state.rageshakeState,
)
PreferenceCategory(title = "Crash", showTopDivider = false) {
PreferenceText(
title = "Crash the app 💥",
ListItem(
headlineContent = {
Text("Crash the app 💥")
},
onClick = { error("This crash is a test.") }
)
}
val cache = state.cacheSize
PreferenceCategory(title = "Cache", showTopDivider = false) {
PreferenceText(
title = "Clear cache",
currentValue = cache.dataOrNull(),
loadingCurrentValue = state.cacheSize.isLoading() || state.clearCacheAction.isLoading(),
ListItem(
headlineContent = {
Text("Clear cache")
},
trailingContent = if (state.cacheSize.isLoading() || state.clearCacheAction.isLoading()) {
ListItemContent.Custom {
CircularProgressIndicator(
modifier = Modifier
.progressSemantics()
.size(20.dp),
strokeWidth = 2.dp
)
}
} else {
ListItemContent.Text(cache.dataOrNull().orEmpty())
},
onClick = {
if (state.clearCacheAction.isLoading().not()) {
state.eventSink(DeveloperSettingsEvents.ClearCache)

View file

@ -31,10 +31,10 @@ import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
import io.element.android.libraries.designsystem.components.preferences.PreferencePage
import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch
import io.element.android.libraries.designsystem.components.preferences.PreferenceText
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator
import io.element.android.libraries.designsystem.theme.components.IconSource
import io.element.android.libraries.designsystem.theme.components.ListItem
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.utils.OnLifecycleEvent
@ -109,13 +109,19 @@ private fun NotificationSettingsContentView(
val context = LocalContext.current
val systemSettings: NotificationSettingsState.AppSettings = state.appSettings
if (systemSettings.appNotificationsEnabled && !systemSettings.systemNotificationsEnabled) {
PreferenceText(
icon = CompoundIcons.NotificationsOffSolid(),
title = stringResource(id = R.string.screen_notification_settings_system_notifications_turned_off),
subtitle = stringResource(
id = R.string.screen_notification_settings_system_notifications_action_required,
stringResource(id = R.string.screen_notification_settings_system_notifications_action_required_content_link)
),
ListItem(
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.NotificationsOffSolid())),
headlineContent = {
Text(stringResource(id = R.string.screen_notification_settings_system_notifications_turned_off))
},
supportingContent = {
Text(
stringResource(
id = R.string.screen_notification_settings_system_notifications_action_required,
stringResource(id = R.string.screen_notification_settings_system_notifications_action_required_content_link)
)
)
},
onClick = {
context.startNotificationSettingsIntent()
}
@ -131,10 +137,14 @@ private fun NotificationSettingsContentView(
if (systemSettings.appNotificationsEnabled) {
if (!state.fullScreenIntentPermissionsState.permissionGranted) {
PreferenceCategory {
PreferenceText(
icon = CompoundIcons.VoiceCallSolid(),
title = stringResource(id = R.string.full_screen_intent_banner_title),
subtitle = stringResource(R.string.full_screen_intent_banner_message),
ListItem(
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.VoiceCallSolid())),
headlineContent = {
Text(stringResource(id = R.string.full_screen_intent_banner_title))
},
supportingContent = {
Text(stringResource(R.string.full_screen_intent_banner_message))
},
onClick = {
state.fullScreenIntentPermissionsState.openFullScreenIntentSettings()
}
@ -142,15 +152,22 @@ private fun NotificationSettingsContentView(
}
}
PreferenceCategory(title = stringResource(id = R.string.screen_notification_settings_notification_section_title)) {
PreferenceText(
title = stringResource(id = R.string.screen_notification_settings_group_chats),
subtitle = getTitleForRoomNotificationMode(mode = matrixSettings.defaultGroupNotificationMode),
ListItem(
headlineContent = {
Text(stringResource(id = R.string.screen_notification_settings_group_chats))
},
supportingContent = {
Text(getTitleForRoomNotificationMode(mode = matrixSettings.defaultGroupNotificationMode))
},
onClick = onGroupChatsClick
)
PreferenceText(
title = stringResource(id = R.string.screen_notification_settings_direct_chats),
subtitle = getTitleForRoomNotificationMode(mode = matrixSettings.defaultOneToOneNotificationMode),
ListItem(
headlineContent = {
Text(stringResource(id = R.string.screen_notification_settings_direct_chats))
},
supportingContent = {
Text(getTitleForRoomNotificationMode(mode = matrixSettings.defaultOneToOneNotificationMode))
},
onClick = onDirectChatsClick
)
}
@ -180,9 +197,10 @@ private fun NotificationSettingsContentView(
)
}
PreferenceCategory(title = stringResource(id = R.string.troubleshoot_notifications_entry_point_section)) {
PreferenceText(
modifier = Modifier,
title = stringResource(id = R.string.troubleshoot_notifications_entry_point_title),
ListItem(
headlineContent = {
Text(stringResource(id = R.string.troubleshoot_notifications_entry_point_title))
},
onClick = onTroubleshootNotificationsClick
)
}

View file

@ -16,9 +16,10 @@ import io.element.android.features.rageshake.api.R
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
import io.element.android.libraries.designsystem.components.preferences.PreferenceSlide
import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch
import io.element.android.libraries.designsystem.components.preferences.PreferenceText
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.ListItem
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.ui.strings.CommonStrings
@Composable
@ -52,7 +53,11 @@ fun RageshakePreferencesView(
onValueChange = ::onSensitivityChanged
)
} else {
PreferenceText(title = "Rageshaking is not supported by your device")
ListItem(
headlineContent = {
Text("Rageshaking is not supported by your device")
},
)
}
}
}

View file

@ -38,12 +38,13 @@ import io.element.android.libraries.designsystem.components.preferences.Preferen
import io.element.android.libraries.designsystem.components.preferences.PreferencePage
import io.element.android.libraries.designsystem.components.preferences.PreferenceRow
import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch
import io.element.android.libraries.designsystem.components.preferences.PreferenceText
import io.element.android.libraries.designsystem.modifiers.onTabOrEnterKeyFocusNext
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.preview.debugPlaceholderBackground
import io.element.android.libraries.designsystem.theme.components.Button
import io.element.android.libraries.designsystem.theme.components.ListItem
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TextField
import io.element.android.libraries.designsystem.theme.components.TextFieldValidity
import io.element.android.libraries.ui.strings.CommonStrings
@ -96,8 +97,10 @@ fun BugReportView(
}
Spacer(modifier = Modifier.height(16.dp))
PreferenceDivider()
PreferenceText(
title = stringResource(id = R.string.screen_bug_report_view_logs),
ListItem(
headlineContent = {
Text(stringResource(id = R.string.screen_bug_report_view_logs))
},
enabled = isFormEnabled,
onClick = onViewLogs,
)

View file

@ -54,7 +54,6 @@ import io.element.android.libraries.designsystem.components.button.MainActionBut
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch
import io.element.android.libraries.designsystem.components.preferences.PreferenceText
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
import io.element.android.libraries.designsystem.preview.PreviewWithLargeHeight
@ -481,10 +480,14 @@ private fun TopicSection(
showTopDivider = false,
) {
if (roomTopic is RoomTopicState.CanAddTopic) {
PreferenceText(
title = stringResource(R.string.screen_room_details_add_topic_title),
icon = CompoundIcons.Plus(),
onClick = { onActionClick(RoomDetailsAction.AddTopic) },
ListItem(
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Plus())),
headlineContent = {
Text(stringResource(id = R.string.screen_room_details_add_topic_title))
},
onClick = {
onActionClick(RoomDetailsAction.AddTopic)
},
)
} else if (roomTopic is RoomTopicState.ExistingTopic) {
ClickableLinkText(