Sections: drop .uppercase() from all section / header titles

Source string resources are already in sentence case (e.g. "Profile images", "Message reception"). The .uppercase() calls forced them to ALL CAPS, which is the Android settings convention but conflicts with the iOS-style facelift. Remove the call everywhere so headers render as in the source.
This commit is contained in:
another-simple-pixel
2026-05-18 01:54:22 -07:00
parent 58201212d0
commit 6a898550c1
31 changed files with 126 additions and 126 deletions
@@ -576,7 +576,7 @@ fun ChatInfoLayout(
SectionSpacer()
if (customUserProfile != null) {
SectionView(generalGetString(MR.strings.incognito).uppercase()) {
SectionView(generalGetString(MR.strings.incognito)) {
SectionItemViewSpaceBetween {
Text(generalGetString(MR.strings.incognito_random_profile))
Text(customUserProfile.chatViewName, color = Indigo)
@@ -627,7 +627,7 @@ fun ChatInfoLayout(
}
if (contact.contactLink != null) {
SectionView(stringResource(MR.strings.address_section_title).uppercase()) {
SectionView(stringResource(MR.strings.address_section_title)) {
SimpleXLinkQRCode(contact.contactLink)
val clipboard = LocalClipboardManager.current
ShareAddressButton { clipboard.shareText(simplexChatLink(contact.contactLink)) }
@@ -135,7 +135,7 @@ private fun FeatureSection(
)
SectionView(
feature.text.uppercase(),
feature.text,
icon = feature.iconFilled(),
iconTint = if (enabled.forUser) SimplexGreen else if (enabled.forContact) WarningYellow else Color.Red,
leadingIcon = true,
@@ -170,7 +170,7 @@ private fun TimedMessagesFeatureSection(
)
SectionView(
ChatFeature.TimedMessages.text.uppercase(),
ChatFeature.TimedMessages.text,
icon = ChatFeature.TimedMessages.iconFilled(),
iconTint = if (enabled.forUser) SimplexGreen else if (enabled.forContact) WarningYellow else Color.Red,
leadingIcon = true,
@@ -196,7 +196,7 @@ fun AddGroupMembersLayout(
InviteSectionFooter(selectedContactsCount = selectedContacts.size, allowModifyMembers, clearSelection)
}
SectionDividerSpaced(maxTopPadding = true)
SectionView(stringResource(MR.strings.select_contacts).uppercase()) {
SectionView(stringResource(MR.strings.select_contacts)) {
SectionItemView(padding = PaddingValues(start = DEFAULT_PADDING, end = DEFAULT_PADDING_HALF)) {
SearchRowView(searchText)
}
@@ -132,7 +132,7 @@ private fun AddGroupRelayLayout(
)
}
SectionDividerSpaced(maxTopPadding = true)
SectionView(generalGetString(MR.strings.select_relays).uppercase()) {
SectionView(generalGetString(MR.strings.select_relays)) {
availableRelays.forEach { item ->
val selected = item.relayId in selectedRelayIds
SectionItemView(
@@ -44,7 +44,7 @@ fun ChannelMembersView(
if (groupInfo.isOwner) {
val subscriberCount = groupInfo.groupSummary.publicMemberCount ?: (members.size + 1).toLong()
SectionView(title = subscriberCountStr(subscriberCount).uppercase()) {
SectionView(title = subscriberCountStr(subscriberCount)) {
SectionItemView(minHeight = 54.dp, padding = PaddingValues(horizontal = DEFAULT_PADDING)) {
ChannelMemberRow(groupInfo.membership, user = true, showRole = true)
}
@@ -584,7 +584,7 @@ fun ModalData.GroupChatInfoLayout(
SectionSpacer()
if (groupInfo.useRelays && groupInfo.membership.memberIncognito) {
SectionView(generalGetString(MR.strings.incognito).uppercase()) {
SectionView(generalGetString(MR.strings.incognito)) {
SectionItemViewSpaceBetween {
Text(generalGetString(MR.strings.incognito_random_profile))
Text(groupInfo.membership.chatViewName, color = Indigo)
@@ -566,7 +566,7 @@ fun GroupMemberInfoLayout(
}
if (member.contactLink != null) {
SectionView(stringResource(MR.strings.address_section_title).uppercase()) {
SectionView(stringResource(MR.strings.address_section_title)) {
SimpleXLinkQRCode(member.contactLink)
val clipboard = LocalClipboardManager.current
ShareAddressButton { clipboard.shareText(simplexChatLink(member.contactLink)) }
@@ -152,7 +152,7 @@ enum class PresentedServerType {
@Composable
private fun ServerSessionsView(sess: ServerSessions) {
SectionView(generalGetString(MR.strings.servers_info_transport_sessions_section_header).uppercase()) {
SectionView(generalGetString(MR.strings.servers_info_transport_sessions_section_header)) {
InfoRow(
generalGetString(MR.strings.servers_info_sessions_connected),
numOrDash(sess.ssConnected)
@@ -294,7 +294,7 @@ private fun XFTPServersListView(servers: List<XFTPServerSummary>, statsStartedAt
@Composable
private fun SMPStatsView(stats: AgentSMPServerStatsData, statsStartedAt: Instant, remoteHostInfo: RemoteHostInfo?) {
SectionView(generalGetString(MR.strings.servers_info_statistics_section_header).uppercase()) {
SectionView(generalGetString(MR.strings.servers_info_statistics_section_header)) {
InfoRow(
generalGetString(MR.strings.servers_info_messages_sent),
numOrDash(stats._sentDirect + stats._sentViaProxy)
@@ -330,7 +330,7 @@ private fun SMPSubscriptionsSection(totals: SMPTotals) {
horizontalArrangement = Arrangement.spacedBy(DEFAULT_SPACE_AFTER_ICON * 2)
) {
Text(
generalGetString(MR.strings.servers_info_subscriptions_section_header).uppercase(),
generalGetString(MR.strings.servers_info_subscriptions_section_header),
color = MaterialTheme.colors.secondary,
style = MaterialTheme.typography.body2,
fontSize = 12.sp
@@ -360,7 +360,7 @@ private fun SMPSubscriptionsSection(subs: SMPServerSubs, summary: SMPServerSumma
horizontalArrangement = Arrangement.spacedBy(DEFAULT_SPACE_AFTER_ICON * 2)
) {
Text(
generalGetString(MR.strings.servers_info_subscriptions_section_header).uppercase(),
generalGetString(MR.strings.servers_info_subscriptions_section_header),
color = MaterialTheme.colors.secondary,
style = MaterialTheme.typography.body2,
fontSize = 12.sp
@@ -416,7 +416,7 @@ private fun reconnectServerAlert(rh: RemoteHostInfo?, server: String) {
@Composable
fun XFTPStatsView(stats: AgentXFTPServerStatsData, statsStartedAt: Instant, rh: RemoteHostInfo?) {
SectionView(generalGetString(MR.strings.servers_info_statistics_section_header).uppercase()) {
SectionView(generalGetString(MR.strings.servers_info_statistics_section_header)) {
InfoRow(
generalGetString(MR.strings.servers_info_uploaded),
prettySize(stats._uploadsSize)
@@ -450,7 +450,7 @@ private fun IndentedInfoRow(title: String, desc: String) {
@Composable
fun DetailedSMPStatsLayout(stats: AgentSMPServerStatsData, statsStartedAt: Instant) {
SectionView(generalGetString(MR.strings.servers_info_detailed_statistics_sent_messages_header).uppercase()) {
SectionView(generalGetString(MR.strings.servers_info_detailed_statistics_sent_messages_header)) {
InfoRow(generalGetString(MR.strings.servers_info_detailed_statistics_sent_messages_total), numOrDash(stats._sentDirect + stats._sentViaProxy))
InfoRowTwoValues(generalGetString(MR.strings.sent_directly), generalGetString(MR.strings.attempts_label), stats._sentDirect, stats._sentDirectAttempts)
InfoRowTwoValues(generalGetString(MR.strings.sent_via_proxy), generalGetString(MR.strings.attempts_label), stats._sentViaProxy, stats._sentViaProxyAttempts)
@@ -466,7 +466,7 @@ fun DetailedSMPStatsLayout(stats: AgentSMPServerStatsData, statsStartedAt: Insta
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.servers_info_detailed_statistics_received_messages_header).uppercase()) {
SectionView(generalGetString(MR.strings.servers_info_detailed_statistics_received_messages_header)) {
InfoRow(generalGetString(MR.strings.servers_info_detailed_statistics_received_total), numOrDash(stats._recvMsgs))
SectionItemView {
Text(generalGetString(MR.strings.servers_info_detailed_statistics_receive_errors), color = MaterialTheme.colors.onBackground)
@@ -484,7 +484,7 @@ fun DetailedSMPStatsLayout(stats: AgentSMPServerStatsData, statsStartedAt: Insta
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.connections).uppercase()) {
SectionView(generalGetString(MR.strings.connections)) {
InfoRow(generalGetString(MR.strings.created), numOrDash(stats._connCreated))
InfoRow(generalGetString(MR.strings.secured), numOrDash(stats._connSecured))
InfoRow(generalGetString(MR.strings.completed), numOrDash(stats._connCompleted))
@@ -503,7 +503,7 @@ fun DetailedSMPStatsLayout(stats: AgentSMPServerStatsData, statsStartedAt: Insta
@Composable
fun DetailedXFTPStatsLayout(stats: AgentXFTPServerStatsData, statsStartedAt: Instant) {
SectionView(generalGetString(MR.strings.uploaded_files).uppercase()) {
SectionView(generalGetString(MR.strings.uploaded_files)) {
InfoRow(generalGetString(MR.strings.size), prettySize(stats._uploadsSize))
InfoRowTwoValues(generalGetString(MR.strings.chunks_uploaded), generalGetString(MR.strings.attempts_label), stats._uploads, stats._uploadAttempts)
InfoRow(generalGetString(MR.strings.upload_errors), numOrDash(stats._uploadErrs))
@@ -511,7 +511,7 @@ fun DetailedXFTPStatsLayout(stats: AgentXFTPServerStatsData, statsStartedAt: Ins
InfoRow(generalGetString(MR.strings.deletion_errors), numOrDash(stats._deleteErrs))
}
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.downloaded_files).uppercase()) {
SectionView(generalGetString(MR.strings.downloaded_files)) {
InfoRow(generalGetString(MR.strings.size), prettySize(stats._downloadsSize))
InfoRowTwoValues(generalGetString(MR.strings.chunks_downloaded), generalGetString(MR.strings.attempts_label), stats._downloads, stats._downloadAttempts)
SectionItemView {
@@ -529,7 +529,7 @@ fun DetailedXFTPStatsLayout(stats: AgentXFTPServerStatsData, statsStartedAt: Ins
@Composable
fun XFTPServerSummaryLayout(summary: XFTPServerSummary, statsStartedAt: Instant, rh: RemoteHostInfo?) {
SectionView(generalGetString(MR.strings.server_address).uppercase()) {
SectionView(generalGetString(MR.strings.server_address)) {
SelectionContainer {
Text(
summary.xftpServer,
@@ -557,7 +557,7 @@ fun XFTPServerSummaryLayout(summary: XFTPServerSummary, statsStartedAt: Instant,
@Composable
fun SMPServerSummaryLayout(summary: SMPServerSummary, statsStartedAt: Instant, rh: RemoteHostInfo?) {
SectionView(generalGetString(MR.strings.server_address).uppercase()) {
SectionView(generalGetString(MR.strings.server_address)) {
SelectionContainer {
Text(
summary.smpServer,
@@ -840,7 +840,7 @@ fun ModalData.ServersSummaryView(rh: RemoteHostInfo?, serversSummary: MutableSta
SMPServersListView(
servers = currentlyUsedSMPServers,
statsStartedAt = statsStartedAt,
header = generalGetString(MR.strings.servers_info_connected_servers_section_header).uppercase(),
header = generalGetString(MR.strings.servers_info_connected_servers_section_header),
rh = rh
)
SectionDividerSpaced()
@@ -850,7 +850,7 @@ fun ModalData.ServersSummaryView(rh: RemoteHostInfo?, serversSummary: MutableSta
SMPServersListView(
servers = previouslyUsedSMPServers,
statsStartedAt = statsStartedAt,
header = generalGetString(MR.strings.servers_info_previously_connected_servers_section_header).uppercase(),
header = generalGetString(MR.strings.servers_info_previously_connected_servers_section_header),
rh = rh
)
SectionDividerSpaced()
@@ -860,7 +860,7 @@ fun ModalData.ServersSummaryView(rh: RemoteHostInfo?, serversSummary: MutableSta
SMPServersListView(
servers = proxySMPServers,
statsStartedAt = statsStartedAt,
header = generalGetString(MR.strings.servers_info_proxied_servers_section_header).uppercase(),
header = generalGetString(MR.strings.servers_info_proxied_servers_section_header),
footer = generalGetString(MR.strings.servers_info_proxied_servers_section_footer),
rh = rh
)
@@ -887,7 +887,7 @@ fun ModalData.ServersSummaryView(rh: RemoteHostInfo?, serversSummary: MutableSta
XFTPServersListView(
currentlyUsedXFTPServers,
statsStartedAt,
generalGetString(MR.strings.servers_info_connected_servers_section_header).uppercase(),
generalGetString(MR.strings.servers_info_connected_servers_section_header),
rh
)
SectionDividerSpaced()
@@ -897,7 +897,7 @@ fun ModalData.ServersSummaryView(rh: RemoteHostInfo?, serversSummary: MutableSta
XFTPServersListView(
previouslyUsedXFTPServers,
statsStartedAt,
generalGetString(MR.strings.servers_info_previously_connected_servers_section_header).uppercase(),
generalGetString(MR.strings.servers_info_previously_connected_servers_section_header),
rh
)
SectionDividerSpaced()
@@ -119,7 +119,7 @@ fun DatabaseEncryptionLayout(
ChatStoppedView()
SectionSpacer()
}
SectionView(if (migration) generalGetString(MR.strings.database_passphrase).uppercase() else null) {
SectionView(if (migration) generalGetString(MR.strings.database_passphrase) else null) {
SavePassphraseSetting(
useKeychain.value,
initialRandomDBPassphrase.value,
@@ -170,7 +170,7 @@ fun DatabaseLayout(
AppBarTitle(stringResource(MR.strings.your_chat_database))
if (!chatModel.desktopNoUserNoRemote) {
SectionView(stringResource(MR.strings.messages_section_title).uppercase()) {
SectionView(stringResource(MR.strings.messages_section_title)) {
TtlOptions(chatItemTTL, enabled = rememberUpdatedState(!stopped && !progressIndicator), onChatItemTTLSelected)
}
SectionTextFooter(
@@ -262,7 +262,7 @@ fun DatabaseLayout(
}
SectionDividerSpaced()
SectionView(stringResource(MR.strings.files_and_media_section).uppercase()) {
SectionView(stringResource(MR.strings.files_and_media_section)) {
val deleteFilesDisabled = operationsDisabled || appFilesCountAndSize.value.first == 0
SectionItemView(
deleteAppFilesAndMedia,
@@ -182,7 +182,7 @@ private fun SectionByState(
@Composable
private fun MutableState<MigrationFromState>.ChatStopInProgressView() {
Box {
SectionView(stringResource(MR.strings.migrate_from_device_stopping_chat).uppercase()) {}
SectionView(stringResource(MR.strings.migrate_from_device_stopping_chat)) {}
ProgressView()
}
LaunchedEffect(Unit) {
@@ -192,7 +192,7 @@ private fun MutableState<MigrationFromState>.ChatStopInProgressView() {
@Composable
private fun MutableState<MigrationFromState>.ChatStopFailedView(reason: String) {
SectionView(stringResource(MR.strings.error_stopping_chat).uppercase()) {
SectionView(stringResource(MR.strings.error_stopping_chat)) {
Text(reason)
SectionSpacer()
SettingsActionItemWithContent(
@@ -226,7 +226,7 @@ private fun MutableState<MigrationFromState>.PassphraseConfirmationView() {
ChatStoppedView()
SectionSpacer()
SectionView(stringResource(MR.strings.migrate_from_device_verify_database_passphrase).uppercase()) {
SectionView(stringResource(MR.strings.migrate_from_device_verify_database_passphrase)) {
PassphraseField(currentKey, placeholder = stringResource(MR.strings.current_passphrase), Modifier.padding(horizontal = DEFAULT_PADDING), isValid = ::validKey, requestFocus = true)
SettingsActionItemWithContent(
@@ -254,7 +254,7 @@ private fun MutableState<MigrationFromState>.PassphraseConfirmationView() {
@Composable
private fun MutableState<MigrationFromState>.UploadConfirmationView() {
SectionView(stringResource(MR.strings.migrate_from_device_confirm_upload).uppercase()) {
SectionView(stringResource(MR.strings.migrate_from_device_confirm_upload)) {
SettingsActionItemWithContent(
icon = painterResource(MR.images.ic_ios_share),
text = stringResource(MR.strings.migrate_from_device_archive_and_upload),
@@ -268,7 +268,7 @@ private fun MutableState<MigrationFromState>.UploadConfirmationView() {
@Composable
private fun MutableState<MigrationFromState>.ArchivingView() {
Box {
SectionView(stringResource(MR.strings.migrate_from_device_archiving_database).uppercase()) {}
SectionView(stringResource(MR.strings.migrate_from_device_archiving_database)) {}
ProgressView()
}
LaunchedEffect(Unit) {
@@ -279,7 +279,7 @@ private fun MutableState<MigrationFromState>.ArchivingView() {
@Composable
private fun MutableState<MigrationFromState>.DatabaseInitView(tempDatabaseFile: File, totalBytes: Long, archivePath: String) {
Box {
SectionView(stringResource(MR.strings.migrate_from_device_database_init).uppercase()) {}
SectionView(stringResource(MR.strings.migrate_from_device_database_init)) {}
ProgressView()
}
LaunchedEffect(Unit) {
@@ -298,7 +298,7 @@ private fun MutableState<MigrationFromState>.UploadProgressView(
archivePath: String,
) {
Box {
SectionView(stringResource(MR.strings.migrate_from_device_uploading_archive).uppercase()) {
SectionView(stringResource(MR.strings.migrate_from_device_uploading_archive)) {
val ratio = uploadedBytes.toFloat() / max(totalBytes, 1)
LargeProgressView(ratio, "${(ratio * 100).toInt()}%", stringResource(MR.strings.migrate_from_device_bytes_uploaded).format(formatBytes(uploadedBytes)))
}
@@ -310,7 +310,7 @@ private fun MutableState<MigrationFromState>.UploadProgressView(
@Composable
private fun MutableState<MigrationFromState>.UploadFailedView(totalBytes: Long, archivePath: String, chatReceiver: MigrationFromChatReceiver?) {
SectionView(stringResource(MR.strings.migrate_from_device_upload_failed).uppercase()) {
SectionView(stringResource(MR.strings.migrate_from_device_upload_failed)) {
SettingsActionItemWithContent(
icon = painterResource(MR.images.ic_ios_share),
text = stringResource(MR.strings.migrate_from_device_repeat_upload),
@@ -329,7 +329,7 @@ private fun MutableState<MigrationFromState>.UploadFailedView(totalBytes: Long,
@Composable
private fun LinkCreationView() {
Box {
SectionView(stringResource(MR.strings.migrate_from_device_creating_archive_link).uppercase()) {}
SectionView(stringResource(MR.strings.migrate_from_device_creating_archive_link)) {}
ProgressView()
}
}
@@ -365,11 +365,11 @@ private fun MutableState<MigrationFromState>.LinkShownView(fileId: Long, link: S
SectionTextFooter(annotatedStringResource(MR.strings.migrate_from_device_archive_will_be_deleted))
SectionTextFooter(annotatedStringResource(MR.strings.migrate_from_device_choose_migrate_from_another_device))
SectionSpacer()
SectionView(stringResource(MR.strings.show_QR_code).uppercase()) {
SectionView(stringResource(MR.strings.show_QR_code)) {
SimpleXLinkQRCode(link, onShare = {})
}
SectionSpacer()
SectionView(stringResource(MR.strings.migrate_from_device_or_share_this_file_link).uppercase()) {
SectionView(stringResource(MR.strings.migrate_from_device_or_share_this_file_link)) {
LinkTextView(link, true)
}
}
@@ -377,7 +377,7 @@ private fun MutableState<MigrationFromState>.LinkShownView(fileId: Long, link: S
@Composable
private fun MutableState<MigrationFromState>.FinishedView(chatDeletion: Boolean) {
Box {
SectionView(stringResource(MR.strings.migrate_from_device_migration_complete).uppercase()) {
SectionView(stringResource(MR.strings.migrate_from_device_migration_complete)) {
SettingsActionItemWithContent(
icon = painterResource(MR.images.ic_play_arrow_filled),
text = stringResource(MR.strings.migrate_from_device_start_chat),
@@ -201,7 +201,7 @@ private fun MutableState<MigrationToState?>.PasteOrScanLinkView(close: () -> Uni
val progressIndicator = remember { mutableStateOf(false) }
Column {
if (appPlatform.isAndroid) {
SectionView(stringResource(MR.strings.scan_QR_code).replace('\n', ' ').uppercase()) {
SectionView(stringResource(MR.strings.scan_QR_code).replace('\n', ' ')) {
QRCodeScanner(showQRCodeScanner = remember { mutableStateOf(true) }) { text ->
checkUserLink(text)
}
@@ -209,12 +209,12 @@ private fun MutableState<MigrationToState?>.PasteOrScanLinkView(close: () -> Uni
SectionSpacer()
}
SectionView(stringResource(if (appPlatform.isAndroid) MR.strings.or_paste_archive_link else MR.strings.paste_archive_link).uppercase()) {
SectionView(stringResource(if (appPlatform.isAndroid) MR.strings.or_paste_archive_link else MR.strings.paste_archive_link)) {
PasteLinkView()
}
SectionSpacer()
SectionView(stringResource(MR.strings.chat_archive).uppercase()) {
SectionView(stringResource(MR.strings.chat_archive)) {
ArchiveImportView(progressIndicator, close)
}
}
@@ -280,7 +280,7 @@ private fun ModalData.OnionView(link: String, legacyLinkSocksProxy: String?, lin
mutableStateOf(getNetCfg().withOnionHosts(onionHosts.value).copy(socksProxy = linkNetworkProxy?.toProxyString() ?: legacyLinkSocksProxy, sessionMode = sessionMode.value))
}
SectionView(stringResource(MR.strings.migrate_to_device_confirm_network_settings).uppercase()) {
SectionView(stringResource(MR.strings.migrate_to_device_confirm_network_settings)) {
SettingsActionItemWithContent(
icon = painterResource(MR.images.ic_check),
text = stringResource(MR.strings.migrate_to_device_apply_onion),
@@ -305,7 +305,7 @@ private fun ModalData.OnionView(link: String, legacyLinkSocksProxy: String?, lin
val networkProxyPref = SharedPreference(get = { networkProxy.value }, set = {
networkProxy.value = it
})
SectionView(stringResource(MR.strings.network_settings_title).uppercase()) {
SectionView(stringResource(MR.strings.network_settings_title)) {
OnionRelatedLayout(
appPreferences.developerTools.get(),
networkUseSocksProxy,
@@ -325,7 +325,7 @@ private fun ModalData.OnionView(link: String, legacyLinkSocksProxy: String?, lin
@Composable
private fun MutableState<MigrationToState?>.DatabaseInitView(link: String, tempDatabaseFile: File, netCfg: NetCfg, networkProxy: NetworkProxy?) {
Box {
SectionView(stringResource(MR.strings.migrate_to_device_database_init).uppercase()) {}
SectionView(stringResource(MR.strings.migrate_to_device_database_init)) {}
ProgressView()
}
LaunchedEffect(Unit) {
@@ -345,7 +345,7 @@ private fun MutableState<MigrationToState?>.LinkDownloadingView(
networkProxy: NetworkProxy?
) {
Box {
SectionView(stringResource(MR.strings.migrate_to_device_downloading_details).uppercase()) {}
SectionView(stringResource(MR.strings.migrate_to_device_downloading_details)) {}
ProgressView()
}
LaunchedEffect(Unit) {
@@ -356,7 +356,7 @@ private fun MutableState<MigrationToState?>.LinkDownloadingView(
@Composable
private fun DownloadProgressView(downloadedBytes: Long, totalBytes: Long) {
Box {
SectionView(stringResource(MR.strings.migrate_to_device_downloading_archive).uppercase()) {
SectionView(stringResource(MR.strings.migrate_to_device_downloading_archive)) {
val ratio = downloadedBytes.toFloat() / max(totalBytes, 1)
LargeProgressView(ratio, "${(ratio * 100).toInt()}%", stringResource(MR.strings.migrate_to_device_bytes_downloaded).format(formatBytes(downloadedBytes)))
}
@@ -365,7 +365,7 @@ private fun DownloadProgressView(downloadedBytes: Long, totalBytes: Long) {
@Composable
private fun MutableState<MigrationToState?>.DownloadFailedView(link: String, chatReceiver: MigrationToChatReceiver?, archivePath: String, netCfg: NetCfg, networkProxy: NetworkProxy?) {
SectionView(stringResource(MR.strings.migrate_to_device_download_failed).uppercase()) {
SectionView(stringResource(MR.strings.migrate_to_device_download_failed)) {
SettingsActionItemWithContent(
icon = painterResource(MR.images.ic_download),
text = stringResource(MR.strings.migrate_to_device_repeat_download),
@@ -386,7 +386,7 @@ private fun MutableState<MigrationToState?>.DownloadFailedView(link: String, cha
@Composable
private fun MutableState<MigrationToState?>.ArchiveImportView(archivePath: String, netCfg: NetCfg, networkProxy: NetworkProxy?) {
Box {
SectionView(stringResource(MR.strings.migrate_to_device_importing_archive).uppercase()) {}
SectionView(stringResource(MR.strings.migrate_to_device_importing_archive)) {}
ProgressView()
}
LaunchedEffect(Unit) {
@@ -396,7 +396,7 @@ private fun MutableState<MigrationToState?>.ArchiveImportView(archivePath: Strin
@Composable
private fun MutableState<MigrationToState?>.ArchiveImportFailedView(archivePath: String, netCfg: NetCfg, networkProxy: NetworkProxy?) {
SectionView(stringResource(MR.strings.migrate_to_device_import_failed).uppercase()) {
SectionView(stringResource(MR.strings.migrate_to_device_import_failed)) {
SettingsActionItemWithContent(
icon = painterResource(MR.images.ic_download),
text = stringResource(MR.strings.migrate_to_device_repeat_import),
@@ -417,7 +417,7 @@ private fun MutableState<MigrationToState?>.PassphraseEnteringView(currentKey: S
Box {
val view = LocalMultiplatformView()
SectionView(stringResource(MR.strings.migrate_to_device_enter_passphrase).uppercase()) {
SectionView(stringResource(MR.strings.migrate_to_device_enter_passphrase)) {
SavePassphraseSetting(
useKeychain.value,
false,
@@ -489,7 +489,7 @@ private fun MutableState<MigrationToState?>.MigrationConfirmationView(status: DB
}
else -> Tuple4(generalGetString(MR.strings.error), null, generalGetString(MR.strings.unknown_error), null)
}
SectionView(header.uppercase()) {
SectionView(header) {
if (button != null && confirmation != null) {
SettingsActionItemWithContent(
icon = painterResource(MR.images.ic_download),
@@ -507,7 +507,7 @@ private fun MutableState<MigrationToState?>.MigrationConfirmationView(status: DB
@Composable
private fun MigrationView(passphrase: String, confirmation: MigrationConfirmation, useKeychain: Boolean, netCfg: NetCfg, networkProxy: NetworkProxy?, close: () -> Unit) {
Box {
SectionView(stringResource(MR.strings.migrate_to_device_migrating).uppercase()) {}
SectionView(stringResource(MR.strings.migrate_to_device_migrating)) {}
ProgressView()
}
LaunchedEffect(Unit) {
@@ -130,7 +130,7 @@ private fun ContactConnectionInfoLayout(
if (connLink != null && connLink.connFullLink.isNotEmpty() && contactConnection.initiated) {
Spacer(Modifier.height(DEFAULT_PADDING))
SectionViewWithButton(
stringResource(MR.strings.one_time_link).uppercase(),
stringResource(MR.strings.one_time_link),
titleButton = if (connLink.connShortLink == null) null else {{ ToggleShortLinkButton(showShortLink) }}
) {
SimpleXCreatedLinkQRCode(connLink, short = showShortLink.value)
@@ -325,7 +325,7 @@ private fun ModalData.NewChatSheetLayout(
item {
if (filteredContactChats.isNotEmpty() && searchText.value.text.isEmpty()) {
SectionDividerSpaced(maxTopPadding = false, maxBottomPadding = false)
SectionView(stringResource(MR.strings.contact_list_header_title).uppercase(), headerBottomPadding = DEFAULT_PADDING_HALF) {
SectionView(stringResource(MR.strings.contact_list_header_title), headerBottomPadding = DEFAULT_PADDING_HALF) {
filteredContactChats.forEachIndexed { index, chat ->
val nextChatSelected = remember(chat.id, filteredContactChats) {
derivedStateOf {
@@ -410,7 +410,7 @@ private fun ModalData.NewChatSheetLayout(
item {
if (filteredContactChats.isNotEmpty() && searchText.value.text.isEmpty()) {
SectionDividerSpaced()
SectionView(stringResource(MR.strings.contact_list_header_title).uppercase(), headerBottomPadding = DEFAULT_PADDING_HALF) {
SectionView(stringResource(MR.strings.contact_list_header_title), headerBottomPadding = DEFAULT_PADDING_HALF) {
filteredContactChats.forEachIndexed { index, chat ->
val nextChatSelected = remember(chat.id, filteredContactChats) {
derivedStateOf {
@@ -495,14 +495,14 @@ private fun InviteView(rhId: Long?, connLinkInvitation: CreatedConnLink, contact
)
SimpleXCreatedLinkQRCode(connLinkInvitation, short = showShortLink.value, onShare = { chatModel.markShowingInvitationUsed() })
} else {
SectionView(stringResource(MR.strings.share_this_1_time_link).uppercase(), headerBottomPadding = 5.dp) {
SectionView(stringResource(MR.strings.share_this_1_time_link), headerBottomPadding = 5.dp) {
LinkTextView(connLinkInvitation.simplexChatUri(short = showShortLink.value), true)
}
Spacer(Modifier.height(DEFAULT_PADDING))
SectionViewWithButton(
stringResource(MR.strings.or_show_this_qr_code).uppercase(),
stringResource(MR.strings.or_show_this_qr_code),
titleButton = if (connLinkInvitation.connShortLink != null) {{ ToggleShortLinkButton(showShortLink) }} else null
) {
SimpleXCreatedLinkQRCode(connLinkInvitation, short = showShortLink.value, onShare = { chatModel.markShowingInvitationUsed() })
@@ -519,7 +519,7 @@ private fun InviteView(rhId: Long?, connLinkInvitation: CreatedConnLink, contact
val currentUser = remember { chatModel.currentUser }.value
if (currentUser != null) {
SectionView(stringResource(MR.strings.new_chat_share_profile).uppercase(), headerBottomPadding = 5.dp) {
SectionView(stringResource(MR.strings.new_chat_share_profile), headerBottomPadding = 5.dp) {
SectionItemView(
padding = PaddingValues(
top = 0.dp,
@@ -643,14 +643,14 @@ private fun ConnectView(rhId: Long?, showQRCodeScanner: MutableState<Boolean>, p
)
}
SectionView(stringResource(MR.strings.paste_the_link_you_received).uppercase(), headerBottomPadding = 5.dp) {
SectionView(stringResource(MR.strings.paste_the_link_you_received), headerBottomPadding = 5.dp) {
PasteLinkView(rhId, pastedLink, showQRCodeScanner, close)
}
if (appPlatform.isAndroid) {
Spacer(Modifier.height(10.dp))
SectionView(stringResource(MR.strings.or_scan_qr_code).uppercase(), headerBottomPadding = 5.dp) {
SectionView(stringResource(MR.strings.or_scan_qr_code), headerBottomPadding = 5.dp) {
QRCodeScanner(showQRCodeScanner) { text ->
val linkVerified = verifyOnly(text)
if (!linkVerified) {
@@ -373,7 +373,7 @@ private fun ChooseServerOperatorsInfoView() {
SectionDividerSpaced()
SectionView(title = stringResource(MR.strings.onboarding_network_about_operators).uppercase()) {
SectionView(title = stringResource(MR.strings.onboarding_network_about_operators)) {
chatModel.conditions.value.serverOperators.forEach { op ->
ServerOperatorRow(op)
}
@@ -65,7 +65,7 @@ private fun LinkAMobileLayout(
Modifier.weight(0.3f),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
SectionView(generalGetString(MR.strings.this_device_name).uppercase()) {
SectionView(generalGetString(MR.strings.this_device_name)) {
DeviceNameField(deviceName.value ?: "") { updateDeviceName(it) }
SectionTextFooter(generalGetString(MR.strings.this_device_name_shared_with_mobile))
PreferenceToggle(stringResource(MR.strings.multicast_discoverable_via_local_network), checked = remember { ChatModel.controller.appPrefs.offerRemoteMulticast.state }.value) {
@@ -128,7 +128,7 @@ private fun ConnectDesktopLayout(deviceName: String, close: () -> Unit) {
@Composable
private fun ConnectDesktop(deviceName: String, remoteCtrls: SnapshotStateList<RemoteCtrlInfo>, sessionAddress: MutableState<String>) {
AppBarTitle(stringResource(MR.strings.connect_to_desktop))
SectionView(stringResource(MR.strings.this_device_name).uppercase()) {
SectionView(stringResource(MR.strings.this_device_name)) {
DevicesView(deviceName, remoteCtrls) {
if (it != "") {
setDeviceName(it)
@@ -147,7 +147,7 @@ private fun ConnectDesktop(deviceName: String, remoteCtrls: SnapshotStateList<Re
@Composable
private fun ConnectingDesktop(session: RemoteCtrlSession, rc: RemoteCtrlInfo?) {
AppBarTitle(stringResource(MR.strings.connecting_to_desktop))
SectionView(stringResource(MR.strings.connecting_to_desktop).uppercase(), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
SectionView(stringResource(MR.strings.connecting_to_desktop), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
CtrlDeviceNameText(session, rc)
Spacer(Modifier.height(DEFAULT_PADDING_HALF))
CtrlDeviceVersionText(session)
@@ -155,7 +155,7 @@ private fun ConnectingDesktop(session: RemoteCtrlSession, rc: RemoteCtrlInfo?) {
if (session.sessionCode != null) {
SectionSpacer()
SectionView(stringResource(MR.strings.session_code).uppercase()) {
SectionView(stringResource(MR.strings.session_code)) {
SessionCodeText(session.sessionCode!!)
}
}
@@ -188,7 +188,7 @@ private fun ProgressIndicator() {
@Composable
private fun SearchingDesktop(deviceName: String, remoteCtrls: SnapshotStateList<RemoteCtrlInfo>) {
AppBarTitle(stringResource(MR.strings.connecting_to_desktop))
SectionView(stringResource(MR.strings.this_device_name).uppercase()) {
SectionView(stringResource(MR.strings.this_device_name)) {
DevicesView(deviceName, remoteCtrls) {
if (it != "") {
setDeviceName(it)
@@ -197,7 +197,7 @@ private fun SearchingDesktop(deviceName: String, remoteCtrls: SnapshotStateList<
}
}
SectionDividerSpaced()
SectionView(stringResource(MR.strings.found_desktop).uppercase(), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
SectionView(stringResource(MR.strings.found_desktop), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
Text(stringResource(MR.strings.waiting_for_desktop), fontStyle = FontStyle.Italic)
}
SectionSpacer()
@@ -215,7 +215,7 @@ private fun FoundDesktop(
sessionAddress: MutableState<String>,
) {
AppBarTitle(stringResource(MR.strings.found_desktop))
SectionView(stringResource(MR.strings.this_device_name).uppercase()) {
SectionView(stringResource(MR.strings.this_device_name)) {
DevicesView(deviceName, remoteCtrls) {
if (it != "") {
setDeviceName(it)
@@ -224,7 +224,7 @@ private fun FoundDesktop(
}
}
SectionDividerSpaced()
SectionView(stringResource(MR.strings.found_desktop).uppercase(), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
SectionView(stringResource(MR.strings.found_desktop), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
CtrlDeviceNameText(session, rc)
CtrlDeviceVersionText(session)
if (!compatible) {
@@ -256,7 +256,7 @@ private fun FoundDesktop(
@Composable
private fun VerifySession(session: RemoteCtrlSession, rc: RemoteCtrlInfo?, sessCode: String, remoteCtrls: SnapshotStateList<RemoteCtrlInfo>) {
AppBarTitle(stringResource(MR.strings.verify_connection))
SectionView(stringResource(MR.strings.connected_to_desktop).uppercase(), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
SectionView(stringResource(MR.strings.connected_to_desktop), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
CtrlDeviceNameText(session, rc)
Spacer(Modifier.height(DEFAULT_PADDING_HALF))
CtrlDeviceVersionText(session)
@@ -264,7 +264,7 @@ private fun VerifySession(session: RemoteCtrlSession, rc: RemoteCtrlInfo?, sessC
SectionSpacer()
SectionView(stringResource(MR.strings.verify_code_with_desktop).uppercase()) {
SectionView(stringResource(MR.strings.verify_code_with_desktop)) {
SessionCodeText(sessCode)
}
@@ -311,7 +311,7 @@ private fun CtrlDeviceVersionText(session: RemoteCtrlSession) {
@Composable
private fun ActiveSession(session: RemoteCtrlSession, rc: RemoteCtrlInfo, close: () -> Unit) {
AppBarTitle(stringResource(MR.strings.connected_to_desktop))
SectionView(stringResource(MR.strings.connected_desktop).uppercase(), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
SectionView(stringResource(MR.strings.connected_desktop), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
Text(rc.deviceViewName)
Spacer(Modifier.height(DEFAULT_PADDING_HALF))
CtrlDeviceVersionText(session)
@@ -319,7 +319,7 @@ private fun ActiveSession(session: RemoteCtrlSession, rc: RemoteCtrlInfo, close:
if (session.sessionCode != null) {
SectionSpacer()
SectionView(stringResource(MR.strings.session_code).uppercase()) {
SectionView(stringResource(MR.strings.session_code)) {
SessionCodeText(session.sessionCode!!)
}
}
@@ -355,7 +355,7 @@ private fun DevicesView(deviceName: String, remoteCtrls: SnapshotStateList<Remot
@Composable
private fun ScanDesktopAddressView(sessionAddress: MutableState<String>) {
SectionView(stringResource(MR.strings.scan_qr_code_from_desktop).uppercase()) {
SectionView(stringResource(MR.strings.scan_qr_code_from_desktop)) {
QRCodeScanner { text ->
sessionAddress.value = text
connectDesktopAddress(sessionAddress, text)
@@ -366,7 +366,7 @@ private fun ScanDesktopAddressView(sessionAddress: MutableState<String>) {
@Composable
private fun DesktopAddressView(sessionAddress: MutableState<String>) {
val clipboard = LocalClipboardManager.current
SectionView(stringResource(MR.strings.desktop_address).uppercase()) {
SectionView(stringResource(MR.strings.desktop_address)) {
if (sessionAddress.value.isEmpty()) {
SettingsActionItem(
painterResource(MR.images.ic_content_paste),
@@ -410,7 +410,7 @@ private fun DesktopAddressView(sessionAddress: MutableState<String>) {
private fun LinkedDesktopsView(remoteCtrls: SnapshotStateList<RemoteCtrlInfo>) {
ColumnWithScrollBar {
AppBarTitle(stringResource(MR.strings.linked_desktops))
SectionView(stringResource(MR.strings.desktop_devices).uppercase()) {
SectionView(stringResource(MR.strings.desktop_devices)) {
remoteCtrls.forEach { rc ->
val showMenu = rememberSaveable { mutableStateOf(false) }
SectionItemViewLongClickable(click = {}, longClick = { showMenu.value = true }) {
@@ -427,7 +427,7 @@ private fun LinkedDesktopsView(remoteCtrls: SnapshotStateList<RemoteCtrlInfo>) {
}
SectionDividerSpaced()
SectionView(stringResource(MR.strings.linked_desktop_options).uppercase()) {
SectionView(stringResource(MR.strings.linked_desktop_options)) {
PreferenceToggle(stringResource(MR.strings.verify_connections), checked = remember { controller.appPrefs.confirmRemoteSessions.state }.value) {
controller.appPrefs.confirmRemoteSessions.set(it)
}
@@ -92,7 +92,7 @@ fun ConnectMobileLayout(
) {
ColumnWithScrollBar {
AppBarTitle(stringResource(if (remember { chatModel.remoteHosts }.isEmpty()) MR.strings.link_a_mobile else MR.strings.linked_mobiles))
SectionView(generalGetString(MR.strings.this_device_name).uppercase()) {
SectionView(generalGetString(MR.strings.this_device_name)) {
DeviceNameField(deviceName.value ?: "") { updateDeviceName(it) }
PreferenceToggle(stringResource(MR.strings.multicast_discoverable_via_local_network), checked = remember { controller.appPrefs.offerRemoteMulticast.state }.value) {
controller.appPrefs.offerRemoteMulticast.set(it)
@@ -100,7 +100,7 @@ fun ConnectMobileLayout(
}
SectionTextFooter(generalGetString(MR.strings.this_device_name_shared_with_mobile))
SectionDividerSpaced()
SectionView(stringResource(MR.strings.devices).uppercase()) {
SectionView(stringResource(MR.strings.devices)) {
if (chatModel.localUserCreated.value == true) {
SettingsActionItemWithContent(text = stringResource(MR.strings.this_device), icon = painterResource(MR.images.ic_desktop), click = connectDesktop) {
if (connectedHost.value == null) {
@@ -215,7 +215,7 @@ private fun ConnectMobileViewLayout(
if (deviceName != null || sessionCode != null) {
SectionView(stringResource(MR.strings.connected_mobile).uppercase()) {
SectionView(stringResource(MR.strings.connected_mobile)) {
SelectionContainer {
Text(
deviceName ?: stringResource(MR.strings.new_mobile_device),
@@ -228,7 +228,7 @@ private fun ConnectMobileViewLayout(
}
if (sessionCode != null) {
SectionView(stringResource(MR.strings.verify_code_on_mobile).uppercase()) {
SectionView(stringResource(MR.strings.verify_code_on_mobile)) {
SelectionContainer {
Text(
sessionCode.substring(0, 23),
@@ -61,7 +61,7 @@ expect fun AppearanceView(m: ChatModel)
object AppearanceScope {
@Composable
fun ProfileImageSection() {
SectionView(stringResource(MR.strings.settings_section_title_profile_images).uppercase(), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
SectionView(stringResource(MR.strings.settings_section_title_profile_images), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
val image = remember { chatModel.currentUser }.value?.image
Row(Modifier.padding(vertical = 10.dp), horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically) {
val size = 60
@@ -94,7 +94,7 @@ object AppearanceScope {
@Composable
fun AppToolbarsSection() {
BoxWithConstraints {
SectionView(stringResource(MR.strings.appearance_app_toolbars).uppercase()) {
SectionView(stringResource(MR.strings.appearance_app_toolbars)) {
SectionItemViewWithoutMinPadding {
Box(Modifier.weight(1f)) {
Text(
@@ -178,7 +178,7 @@ object AppearanceScope {
@Composable
fun MessageShapeSection() {
BoxWithConstraints {
SectionView(stringResource(MR.strings.settings_section_title_message_shape).uppercase()) {
SectionView(stringResource(MR.strings.settings_section_title_message_shape)) {
SectionItemViewWithoutMinPadding {
Text(stringResource(MR.strings.settings_message_shape_corner), Modifier.weight(1f))
Spacer(Modifier.width(10.dp))
@@ -208,7 +208,7 @@ object AppearanceScope {
@Composable
fun FontScaleSection() {
val localFontScale = remember { mutableStateOf(appPrefs.fontScale.get()) }
SectionView(stringResource(MR.strings.appearance_font_size).uppercase(), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
SectionView(stringResource(MR.strings.appearance_font_size), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
Row(Modifier.padding(vertical = 10.dp), verticalAlignment = Alignment.CenterVertically) {
Box(Modifier.size(50.dp)
.background(MaterialTheme.colors.surface, RoundedCornerShape(percent = 22))
@@ -656,7 +656,7 @@ object AppearanceScope {
}
SectionDividerSpaced()
SectionView(stringResource(MR.strings.settings_section_title_chat_colors).uppercase()) {
SectionView(stringResource(MR.strings.settings_section_title_chat_colors)) {
WallpaperSetupView(
wallpaperType,
baseTheme,
@@ -36,7 +36,7 @@ fun DeveloperView(withAuth: (title: String, desc: String, block: () -> Unit) ->
)
if (devTools.value) {
SectionDividerSpaced(maxTopPadding = true)
SectionView(stringResource(MR.strings.developer_options_section).uppercase()) {
SectionView(stringResource(MR.strings.developer_options_section)) {
SettingsActionItemWithContent(painterResource(MR.images.ic_breaking_news), stringResource(MR.strings.debug_logs)) {
DefaultSwitch(
checked = remember { appPrefs.logLevel.state }.value <= LogLevel.DEBUG,
@@ -60,7 +60,7 @@ fun DeveloperView(withAuth: (title: String, desc: String, block: () -> Unit) ->
}
}
SectionDividerSpaced(maxTopPadding = true)
SectionView(stringResource(MR.strings.deprecated_options_section).uppercase()) {
SectionView(stringResource(MR.strings.deprecated_options_section)) {
val simplexLinkMode = chatModel.controller.appPrefs.simplexLinkMode
SimpleXLinkOptions(chatModel.simplexLinkMode, onSelected = {
simplexLinkMode.set(it)
@@ -68,7 +68,7 @@ private fun HiddenProfileLayout(
val passwordValid by remember { derivedStateOf { hidePassword.value == hidePassword.value.trim() } }
val confirmValid by remember { derivedStateOf { confirmHidePassword.value == "" || hidePassword.value == confirmHidePassword.value } }
val saveDisabled by remember { derivedStateOf { hidePassword.value == "" || !passwordValid || confirmHidePassword.value == "" || !confirmValid } }
SectionView(stringResource(MR.strings.hidden_profile_password).uppercase()) {
SectionView(stringResource(MR.strings.hidden_profile_password)) {
SectionItemViewWithoutMinPadding {
PassphraseField(hidePassword, generalGetString(MR.strings.password_to_show), isValid = { passwordValid }, showStrength = true)
}
@@ -619,7 +619,7 @@ fun SimplexLockView(
}
if (performLA.value && laMode.value == LAMode.PASSCODE) {
SectionDividerSpaced()
SectionView(stringResource(MR.strings.self_destruct_passcode).uppercase()) {
SectionView(stringResource(MR.strings.self_destruct_passcode)) {
val openInfo = {
ModalManager.start.showModal {
SelfDestructInfoView()
@@ -301,12 +301,12 @@ private fun UserAddressLayout(
) {
if (userAddress == null) {
if (!onboarding) {
SectionView(generalGetString(MR.strings.for_social_media).uppercase()) {
SectionView(generalGetString(MR.strings.for_social_media)) {
CreateAddressButton(createAddress)
}
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.or_to_share_privately).uppercase()) {
SectionView(generalGetString(MR.strings.or_to_share_privately)) {
CreateOneTimeLinkButton()
}
@@ -336,7 +336,7 @@ private fun UserAddressLayout(
val savedAddressSettingsState = remember { mutableStateOf(addressSettingsState.value) }
SectionViewWithButton(
stringResource(MR.strings.for_social_media).uppercase(),
stringResource(MR.strings.for_social_media),
titleButton = if (userAddress.connLinkContact.connShortLink != null) {{ ToggleShortLinkButton(showShortLink) }} else null
) {
SimpleXCreatedLinkQRCode(userAddress.connLinkContact, short = showShortLink.value)
@@ -360,7 +360,7 @@ private fun UserAddressLayout(
}
SectionDividerSpaced(maxTopPadding = addressSettingsState.value.businessAddress)
SectionView(generalGetString(MR.strings.or_to_share_privately).uppercase()) {
SectionView(generalGetString(MR.strings.or_to_share_privately)) {
CreateOneTimeLinkButton()
}
SectionDividerSpaced(maxBottomPadding = false)
@@ -513,7 +513,7 @@ private fun ModalData.UserAddressSettings(
SectionDividerSpaced()
SectionView(
stringResource(MR.strings.address_welcome_message).uppercase(),
stringResource(MR.strings.address_welcome_message),
contentPadding = PaddingValues(vertical = DEFAULT_PADDING_HALF),
) {
AutoReplyEditor(addressSettingsState)
@@ -236,11 +236,11 @@ fun ModalData.AdvancedNetworkSettingsView(showModal: (@Composable ModalData.() -
SectionTextFooter(stringResource(MR.strings.private_routing_explanation))
SectionDividerSpaced(maxTopPadding = true)
SectionView(stringResource(MR.strings.network_session_mode_transport_isolation).uppercase()) {
SectionView(stringResource(MR.strings.network_session_mode_transport_isolation)) {
SessionModePicker(sessionMode, showModal, updateSessionMode)
}
SectionDividerSpaced()
SectionView(stringResource(MR.strings.network_smp_web_port_section_title).uppercase()) {
SectionView(stringResource(MR.strings.network_smp_web_port_section_title)) {
ExposedDropDownSettingRow(
stringResource(MR.strings.network_smp_web_port_toggle),
SMPWebPortServers.entries.map { it to stringResource(it.text) },
@@ -253,7 +253,7 @@ fun ModalData.AdvancedNetworkSettingsView(showModal: (@Composable ModalData.() -
)
SectionDividerSpaced(maxTopPadding = true)
SectionView(stringResource(MR.strings.network_option_tcp_connection).uppercase()) {
SectionView(stringResource(MR.strings.network_option_tcp_connection)) {
SectionItemView {
TimeoutSettingRow(
stringResource(MR.strings.network_option_tcp_connection_timeout), networkTCPConnectTimeoutInteractive,
@@ -182,7 +182,7 @@ private fun ChatRelayLayout(
@Composable
private fun PresetRelay(relay: MutableState<UserChatRelay>, testing: MutableState<Boolean>) {
SectionView(stringResource(MR.strings.preset_relay_address).uppercase()) {
SectionView(stringResource(MR.strings.preset_relay_address)) {
SelectionContainer {
Text(
relay.value.address,
@@ -192,7 +192,7 @@ private fun PresetRelay(relay: MutableState<UserChatRelay>, testing: MutableStat
}
}
SectionDividerSpaced()
SectionView(stringResource(MR.strings.preset_relay_name).uppercase()) {
SectionView(stringResource(MR.strings.preset_relay_name)) {
SectionItemView {
Text(relay.value.displayName)
}
@@ -229,7 +229,7 @@ private fun CustomRelay(
}
SectionView(
stringResource(MR.strings.your_relay_address).uppercase(),
stringResource(MR.strings.your_relay_address),
icon = painterResource(MR.images.ic_error),
iconTint = if (!validAddress.value) MaterialTheme.colors.error else Color.Transparent,
) {
@@ -244,7 +244,7 @@ private fun CustomRelay(
val iconSize = with(LocalDensity.current) { 21.sp.toDp() }
Row(Modifier.padding(start = DEFAULT_PADDING, bottom = 5.dp), verticalAlignment = Alignment.CenterVertically) {
Text(
stringResource(MR.strings.your_relay_name).uppercase(),
stringResource(MR.strings.your_relay_name),
color = MaterialTheme.colors.secondary, style = MaterialTheme.typography.body2, fontSize = 12.sp
)
IconButton(
@@ -291,7 +291,7 @@ private fun UseRelaySection(
testing: MutableState<Boolean>
) {
val scope = rememberCoroutineScope()
SectionView(stringResource(MR.strings.use_relay).uppercase()) {
SectionView(stringResource(MR.strings.use_relay)) {
SectionItemViewSpaceBetween(
click = {
testing.value = true
@@ -210,7 +210,7 @@ fun ModalData.NetworkAndServersView(closeNetworkAndServers: () -> Unit) {
AppBarTitle(stringResource(MR.strings.network_and_servers))
// TODO: Review this and socks.
if (!chatModel.desktopNoUserNoRemote) {
SectionView(generalGetString(MR.strings.network_preset_servers_title).uppercase()) {
SectionView(generalGetString(MR.strings.network_preset_servers_title)) {
userServers.value.forEachIndexed { index, srv ->
srv.operator?.let { ServerOperatorRow(index, it, currUserServers, userServers, serverErrors, serverWarnings, currentRemoteHost?.remoteHostId) }
}
@@ -307,7 +307,7 @@ fun ModalData.NetworkAndServersView(closeNetworkAndServers: () -> Unit) {
if (appPlatform.isAndroid) {
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.settings_section_title_network_connection).uppercase()) {
SectionView(generalGetString(MR.strings.settings_section_title_network_connection)) {
val info = remember { chatModel.networkInfo }.value
SettingsActionItemWithContent(icon = null, info.networkType.text) {
Icon(painterResource(MR.images.ic_circle_filled), stringResource(MR.strings.icon_descr_server_status_connected), tint = if (info.online) Color.Green else MaterialTheme.colors.error)
@@ -460,7 +460,7 @@ fun SocksProxySettings(
) {
ColumnWithScrollBar {
AppBarTitle(generalGetString(MR.strings.network_socks_proxy_settings))
SectionView(stringResource(MR.strings.network_socks_proxy).uppercase()) {
SectionView(stringResource(MR.strings.network_socks_proxy)) {
Column(Modifier.padding(horizontal = DEFAULT_PADDING)) {
DefaultConfigurableTextField(
hostUnsaved,
@@ -489,7 +489,7 @@ fun SocksProxySettings(
SectionDividerSpaced(maxTopPadding = true)
SectionView(stringResource(MR.strings.network_proxy_auth).uppercase()) {
SectionView(stringResource(MR.strings.network_proxy_auth)) {
PreferenceToggle(
stringResource(MR.strings.network_proxy_random_credentials),
checked = proxyAuthRandomUnsaved.value,
@@ -181,7 +181,7 @@ fun OperatorViewLayout(
val duplicateHosts = findDuplicateHosts(serverErrors.value)
Column {
SectionView(generalGetString(MR.strings.operator).uppercase()) {
SectionView(generalGetString(MR.strings.operator)) {
SectionItemView({ ModalManager.start.showModalCloseable { _ -> OperatorInfoView(operator) } }) {
Row(
Modifier.fillMaxWidth(),
@@ -238,7 +238,7 @@ fun OperatorViewLayout(
if (userServers.value[operatorIndex].chatRelays.any { !it.deleted }) {
val duplicateRelayAddresses = findDuplicateRelayAddresses(serverErrors.value)
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.chat_relays).uppercase()) {
SectionView(generalGetString(MR.strings.chat_relays)) {
userServers.value[operatorIndex].chatRelays.forEachIndexed { index, relay ->
if (!relay.deleted) {
ChatRelayViewLink(relay, duplicateRelayAddresses) {
@@ -252,7 +252,7 @@ fun OperatorViewLayout(
if (userServers.value[operatorIndex].smpServers.any { !it.deleted }) {
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.operator_use_for_messages).uppercase()) {
SectionView(generalGetString(MR.strings.operator_use_for_messages)) {
SectionItemView(padding = PaddingValues(horizontal = DEFAULT_PADDING)) {
Text(
stringResource(MR.strings.operator_use_for_messages_receiving),
@@ -306,7 +306,7 @@ fun OperatorViewLayout(
// Preset servers can't be deleted
if (userServers.value[operatorIndex].smpServers.any { it.preset }) {
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.message_servers).uppercase()) {
SectionView(generalGetString(MR.strings.message_servers)) {
userServers.value[operatorIndex].smpServers.forEachIndexed { i, server ->
if (!server.preset) return@forEachIndexed
SectionItemView({ navigateToProtocolView(i, server, ServerProtocol.SMP) }) {
@@ -340,7 +340,7 @@ fun OperatorViewLayout(
if (userServers.value[operatorIndex].smpServers.any { !it.preset && !it.deleted }) {
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.operator_added_message_servers).uppercase()) {
SectionView(generalGetString(MR.strings.operator_added_message_servers)) {
userServers.value[operatorIndex].smpServers.forEachIndexed { i, server ->
if (server.deleted || server.preset) return@forEachIndexed
SectionItemView({ navigateToProtocolView(i, server, ServerProtocol.SMP) }) {
@@ -356,7 +356,7 @@ fun OperatorViewLayout(
if (userServers.value[operatorIndex].xftpServers.any { !it.deleted }) {
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.operator_use_for_files).uppercase()) {
SectionView(generalGetString(MR.strings.operator_use_for_files)) {
SectionItemView(padding = PaddingValues(horizontal = DEFAULT_PADDING)) {
Text(
stringResource(MR.strings.operator_use_for_sending),
@@ -389,7 +389,7 @@ fun OperatorViewLayout(
// Preset servers can't be deleted
if (userServers.value[operatorIndex].xftpServers.any { it.preset }) {
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.media_and_file_servers).uppercase()) {
SectionView(generalGetString(MR.strings.media_and_file_servers)) {
userServers.value[operatorIndex].xftpServers.forEachIndexed { i, server ->
if (!server.preset) return@forEachIndexed
SectionItemView({ navigateToProtocolView(i, server, ServerProtocol.XFTP) }) {
@@ -423,7 +423,7 @@ fun OperatorViewLayout(
if (userServers.value[operatorIndex].xftpServers.any { !it.preset && !it.deleted}) {
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.operator_added_xftp_servers).uppercase()) {
SectionView(generalGetString(MR.strings.operator_added_xftp_servers)) {
userServers.value[operatorIndex].xftpServers.forEachIndexed { i, server ->
if (server.deleted || server.preset) return@forEachIndexed
SectionItemView({ navigateToProtocolView(i, server, ServerProtocol.XFTP) }) {
@@ -140,7 +140,7 @@ private fun PresetServer(
testing: Boolean,
testServer: () -> Unit
) {
SectionView(stringResource(MR.strings.smp_servers_preset_address).uppercase()) {
SectionView(stringResource(MR.strings.smp_servers_preset_address)) {
SelectionContainer {
Text(
server.value.server,
@@ -172,7 +172,7 @@ fun CustomServer(
}
}
SectionView(
stringResource(MR.strings.smp_servers_your_server_address).uppercase(),
stringResource(MR.strings.smp_servers_your_server_address),
icon = painterResource(MR.images.ic_error),
iconTint = if (!valid.value) MaterialTheme.colors.error else Color.Transparent,
padding = PaddingValues(vertical = DEFAULT_PADDING_HALF),
@@ -197,7 +197,7 @@ fun CustomServer(
if (valid.value) {
SectionDividerSpaced()
SectionView(stringResource(MR.strings.smp_servers_add_to_another_device).uppercase()) {
SectionView(stringResource(MR.strings.smp_servers_add_to_another_device)) {
QRCode(serverAddress.value, small = true)
}
}
@@ -211,7 +211,7 @@ private fun UseServerSection(
testServer: () -> Unit,
onDelete: (() -> Unit)? = null,
) {
SectionView(stringResource(MR.strings.smp_servers_use_server).uppercase()) {
SectionView(stringResource(MR.strings.smp_servers_use_server)) {
SectionItemViewSpaceBetween(testServer, disabled = !valid || testing) {
Text(stringResource(MR.strings.smp_servers_test_server), color = if (valid && !testing) MaterialTheme.colors.onBackground else MaterialTheme.colors.secondary)
ShowTestStatus(server.value)
@@ -86,7 +86,7 @@ fun YourServersViewLayout(
Column {
if (userServers.value[operatorIndex].chatRelays.any { !it.deleted }) {
val duplicateRelayAddresses = findDuplicateRelayAddresses(serverErrors.value)
SectionView(generalGetString(MR.strings.chat_relays).uppercase()) {
SectionView(generalGetString(MR.strings.chat_relays)) {
userServers.value[operatorIndex].chatRelays.forEachIndexed { i, relay ->
if (relay.deleted) return@forEachIndexed
ChatRelayViewLink(relay, duplicateRelayAddresses) {
@@ -99,7 +99,7 @@ fun YourServersViewLayout(
if (userServers.value[operatorIndex].smpServers.any { !it.deleted }) {
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.message_servers).uppercase()) {
SectionView(generalGetString(MR.strings.message_servers)) {
userServers.value[operatorIndex].smpServers.forEachIndexed { i, server ->
if (server.deleted) return@forEachIndexed
SectionItemView({ navigateToProtocolView(i, server, ServerProtocol.SMP) }) {
@@ -133,7 +133,7 @@ fun YourServersViewLayout(
if (userServers.value[operatorIndex].xftpServers.any { !it.deleted }) {
SectionDividerSpaced()
SectionView(generalGetString(MR.strings.media_and_file_servers).uppercase()) {
SectionView(generalGetString(MR.strings.media_and_file_servers)) {
userServers.value[operatorIndex].xftpServers.forEachIndexed { i, server ->
if (server.deleted) return@forEachIndexed
SectionItemView({ navigateToProtocolView(i, server, ServerProtocol.XFTP) }) {
@@ -110,7 +110,7 @@ private fun MinimizeToTraySection() {
@Composable
fun DensityScaleSection() {
val localDensityScale = remember { mutableStateOf(appPrefs.densityScale.get()) }
SectionView(stringResource(MR.strings.appearance_zoom).uppercase(), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
SectionView(stringResource(MR.strings.appearance_zoom), contentPadding = PaddingValues(horizontal = DEFAULT_PADDING)) {
Row(Modifier.padding(vertical = 10.dp), verticalAlignment = Alignment.CenterVertically) {
Box(Modifier.size(50.dp)
.background(MaterialTheme.colors.surface, RoundedCornerShape(percent = 22))