Remove stringResource() id named argument (#3618)

This commit is contained in:
Phil Oliver 2025-11-04 21:36:26 -05:00 committed by GitHub
parent 828edc653f
commit a687328f08
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
68 changed files with 196 additions and 224 deletions

View file

@ -50,8 +50,8 @@ internal fun CriticalAlertsScreen(onSkip: () -> Unit, onConfigure: () -> Unit) {
IntroBottomBar(
onSkip = onSkip,
onConfigure = onConfigure,
configureButtonText = stringResource(id = R.string.configure_critical_alerts),
skipButtonText = stringResource(id = R.string.skip),
configureButtonText = stringResource(R.string.configure_critical_alerts),
skipButtonText = stringResource(R.string.skip),
)
},
) { innerPadding ->

View file

@ -50,20 +50,19 @@ internal fun FeatureRow(feature: FeatureUIData) {
Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth()) {
Icon(
imageVector = feature.icon,
contentDescription =
feature.titleRes?.let { stringResource(id = it) } ?: stringResource(id = feature.subtitleRes),
contentDescription = feature.titleRes?.let { stringResource(it) } ?: stringResource(feature.subtitleRes),
modifier = Modifier.padding(end = 16.dp),
tint = MaterialTheme.colorScheme.primary,
)
Column {
feature.titleRes?.let { titleRes ->
Text(
text = stringResource(id = titleRes),
text = stringResource(titleRes),
style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.SemiBold),
)
}
Text(
text = stringResource(id = feature.subtitleRes),
text = stringResource(feature.subtitleRes),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
@ -85,8 +84,8 @@ internal fun Context.createClickableAnnotatedString(
@StringRes linkTextRes: Int,
tag: String,
): AnnotatedString {
val fullText = stringResource(id = fullTextRes)
val linkText = stringResource(id = linkTextRes)
val fullText = stringResource(fullTextRes)
val linkText = stringResource(linkTextRes)
val startIndex = fullText.indexOf(linkText)
return buildAnnotatedString {

View file

@ -92,8 +92,8 @@ internal fun PermissionScreenLayout(
IntroBottomBar(
onSkip = onSkip,
onConfigure = onConfigure,
configureButtonText = stringResource(id = configureButtonTextRes),
skipButtonText = stringResource(id = R.string.skip),
configureButtonText = stringResource(configureButtonTextRes),
skipButtonText = stringResource(R.string.skip),
)
},
) { innerPadding ->

View file

@ -75,7 +75,7 @@ internal fun WelcomeScreen(onGetStarted: () -> Unit) {
onSkip = {}, // No skip on welcome
onConfigure = onGetStarted,
skipButtonText = "", // Not shown
configureButtonText = stringResource(id = R.string.get_started),
configureButtonText = stringResource(R.string.get_started),
showSkipButton = false, // Explicitly hide skip for welcome
)
},

View file

@ -55,7 +55,7 @@ fun CacheLayout(
.padding(8.dp),
) {
Text(
text = stringResource(id = R.string.map_select_download_region),
text = stringResource(R.string.map_select_download_region),
modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center,
style = MaterialTheme.typography.headlineSmall,
@ -75,13 +75,10 @@ fun CacheLayout(
horizontalArrangement = Arrangement.spacedBy(space = 8.dp),
) {
Button(onClick = onCancelDownload, modifier = Modifier.weight(1f)) {
Text(text = stringResource(id = R.string.cancel), color = MaterialTheme.colorScheme.onPrimary)
Text(text = stringResource(R.string.cancel), color = MaterialTheme.colorScheme.onPrimary)
}
Button(onClick = onExecuteJob, modifier = Modifier.weight(1f)) {
Text(
text = stringResource(id = R.string.map_start_download),
color = MaterialTheme.colorScheme.onPrimary,
)
Text(text = stringResource(R.string.map_start_download), color = MaterialTheme.colorScheme.onPrimary)
}
}
}

View file

@ -69,7 +69,7 @@ fun MapControlsOverlay(
if (isNodeMap) {
MapButton(
icon = Icons.Outlined.Tune,
contentDescription = stringResource(id = R.string.map_filter),
contentDescription = stringResource(R.string.map_filter),
onClick = onToggleMapFilterMenu,
)
NodeMapFilterDropdown(
@ -81,7 +81,7 @@ fun MapControlsOverlay(
Box {
MapButton(
icon = Icons.Outlined.Tune,
contentDescription = stringResource(id = R.string.map_filter),
contentDescription = stringResource(R.string.map_filter),
onClick = onToggleMapFilterMenu,
)
MapFilterDropdown(
@ -95,7 +95,7 @@ fun MapControlsOverlay(
Box {
MapButton(
icon = Icons.Outlined.Map,
contentDescription = stringResource(id = R.string.map_tile_source),
contentDescription = stringResource(R.string.map_tile_source),
onClick = onToggleMapTypeMenu,
)
MapTypeDropdown(
@ -108,7 +108,7 @@ fun MapControlsOverlay(
MapButton(
icon = Icons.Outlined.Layers,
contentDescription = stringResource(id = R.string.manage_map_layers),
contentDescription = stringResource(R.string.manage_map_layers),
onClick = onManageLayersClicked,
)
@ -121,7 +121,7 @@ fun MapControlsOverlay(
} else {
Icons.Outlined.MyLocation
},
contentDescription = stringResource(id = R.string.toggle_my_position),
contentDescription = stringResource(R.string.toggle_my_position),
onClick = onToggleLocationTracking,
)
}
@ -137,7 +137,7 @@ private fun CompassButton(onClick: () -> Unit, bearing: Float, isFollowing: Bool
modifier = Modifier.rotate(-bearing),
icon = icon,
iconTint = MaterialTheme.colorScheme.StatusRed.takeIf { bearing == 0f },
contentDescription = stringResource(id = R.string.orient_north),
contentDescription = stringResource(R.string.orient_north),
onClick = onClick,
)
}

View file

@ -50,10 +50,10 @@ internal fun MapFilterDropdown(expanded: Boolean, onDismissRequest: () -> Unit,
val mapFilterState by mapViewModel.mapFilterStateFlow.collectAsStateWithLifecycle()
DropdownMenu(expanded = expanded, onDismissRequest = onDismissRequest) {
DropdownMenuItem(
text = { Text(stringResource(id = R.string.only_favorites)) },
text = { Text(stringResource(R.string.only_favorites)) },
onClick = { mapViewModel.toggleOnlyFavorites() },
leadingIcon = {
Icon(imageVector = Icons.Filled.Star, contentDescription = stringResource(id = R.string.only_favorites))
Icon(imageVector = Icons.Filled.Star, contentDescription = stringResource(R.string.only_favorites))
},
trailingIcon = {
Checkbox(
@ -63,13 +63,10 @@ internal fun MapFilterDropdown(expanded: Boolean, onDismissRequest: () -> Unit,
},
)
DropdownMenuItem(
text = { Text(stringResource(id = R.string.show_waypoints)) },
text = { Text(stringResource(R.string.show_waypoints)) },
onClick = { mapViewModel.toggleShowWaypointsOnMap() },
leadingIcon = {
Icon(
imageVector = Icons.Filled.Place,
contentDescription = stringResource(id = R.string.show_waypoints),
)
Icon(imageVector = Icons.Filled.Place, contentDescription = stringResource(R.string.show_waypoints))
},
trailingIcon = {
Checkbox(
@ -79,12 +76,12 @@ internal fun MapFilterDropdown(expanded: Boolean, onDismissRequest: () -> Unit,
},
)
DropdownMenuItem(
text = { Text(stringResource(id = R.string.show_precision_circle)) },
text = { Text(stringResource(R.string.show_precision_circle)) },
onClick = { mapViewModel.toggleShowPrecisionCircleOnMap() },
leadingIcon = {
Icon(
imageVector = Icons.Outlined.RadioButtonUnchecked, // Placeholder icon
contentDescription = stringResource(id = R.string.show_precision_circle),
contentDescription = stringResource(R.string.show_precision_circle),
)
},
trailingIcon = {

View file

@ -46,10 +46,10 @@ internal fun MapTypeDropdown(
val googleMapTypes =
listOf(
stringResource(id = R.string.map_type_normal) to MapType.NORMAL,
stringResource(id = R.string.map_type_satellite) to MapType.SATELLITE,
stringResource(id = R.string.map_type_terrain) to MapType.TERRAIN,
stringResource(id = R.string.map_type_hybrid) to MapType.HYBRID,
stringResource(R.string.map_type_normal) to MapType.NORMAL,
stringResource(R.string.map_type_satellite) to MapType.SATELLITE,
stringResource(R.string.map_type_terrain) to MapType.TERRAIN,
stringResource(R.string.map_type_hybrid) to MapType.HYBRID,
)
DropdownMenu(expanded = expanded, onDismissRequest = onDismissRequest) {

View file

@ -160,7 +160,7 @@ fun MessageScreen(
Triple(index, id, name)
}
val (channelIndex, nodeId, rawChannelName) = channelInfo
val unknownChannelText = stringResource(id = R.string.unknown_channel)
val unknownChannelText = stringResource(R.string.unknown_channel)
val channelName = rawChannelName ?: unknownChannelText
val title =
@ -350,10 +350,7 @@ private fun BoxScope.ScrollToBottomFab(coroutineScope: CoroutineScope, listState
}
},
) {
Icon(
imageVector = Icons.Default.ArrowDownward,
contentDescription = stringResource(id = R.string.scroll_to_bottom),
)
Icon(imageVector = Icons.Default.ArrowDownward, contentDescription = stringResource(R.string.scroll_to_bottom))
}
}
@ -529,22 +526,19 @@ private fun ActionModeTopBar(selectedCount: Int, onAction: (MessageMenuAction) -
IconButton(onClick = { onAction(MessageMenuAction.Dismiss) }) {
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = stringResource(id = R.string.clear_selection),
contentDescription = stringResource(R.string.clear_selection),
)
}
},
actions = {
IconButton(onClick = { onAction(MessageMenuAction.ClipboardCopy) }) {
Icon(imageVector = Icons.Default.ContentCopy, contentDescription = stringResource(id = R.string.copy))
Icon(imageVector = Icons.Default.ContentCopy, contentDescription = stringResource(R.string.copy))
}
IconButton(onClick = { onAction(MessageMenuAction.Delete) }) {
Icon(imageVector = Icons.Default.Delete, contentDescription = stringResource(id = R.string.delete))
Icon(imageVector = Icons.Default.Delete, contentDescription = stringResource(R.string.delete))
}
IconButton(onClick = { onAction(MessageMenuAction.SelectAll) }) {
Icon(
imageVector = Icons.Default.SelectAll,
contentDescription = stringResource(id = R.string.select_all),
)
Icon(imageVector = Icons.Default.SelectAll, contentDescription = stringResource(R.string.select_all))
}
},
)
@ -586,7 +580,7 @@ private fun MessageTopBar(
IconButton(onClick = onNavigateBack) {
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = stringResource(id = R.string.navigate_back),
contentDescription = stringResource(R.string.navigate_back),
)
}
},
@ -615,7 +609,7 @@ private fun MessageTopBarActions(
var expanded by remember { mutableStateOf(false) }
Box {
IconButton(onClick = { expanded = true }, enabled = true) {
Icon(imageVector = Icons.Default.MoreVert, contentDescription = stringResource(id = R.string.overflow_menu))
Icon(imageVector = Icons.Default.MoreVert, contentDescription = stringResource(R.string.overflow_menu))
}
OverFlowMenu(
expanded = expanded,
@ -662,7 +656,7 @@ private fun OverFlowMenu(
},
)
DropdownMenuItem(
text = { Text(stringResource(id = R.string.quick_chat)) },
text = { Text(stringResource(R.string.quick_chat)) },
onClick = {
onDismiss()
onNavigateToQuickChatOptions()
@ -670,7 +664,7 @@ private fun OverFlowMenu(
leadingIcon = {
Icon(
imageVector = Icons.Default.ChatBubbleOutline,
contentDescription = stringResource(id = R.string.quick_chat),
contentDescription = stringResource(R.string.quick_chat),
)
},
)
@ -775,10 +769,7 @@ private fun MessageInput(
// cursor position and multi-byte characters, likely outside simple inputTransformation.
trailingIcon = {
IconButton(onClick = { if (canSend) onSendMessage() }, enabled = canSend) {
Icon(
imageVector = Icons.AutoMirrored.Default.Send,
contentDescription = stringResource(id = R.string.send),
)
Icon(imageVector = Icons.AutoMirrored.Default.Send, contentDescription = stringResource(R.string.send))
}
},
)

View file

@ -73,19 +73,19 @@ fun DeliveryInfo(
onDismissRequest = onDismiss,
dismissButton = {
FilledTonalButton(onClick = onDismiss, modifier = Modifier.padding(horizontal = 16.dp)) {
Text(text = stringResource(id = R.string.close))
Text(text = stringResource(R.string.close))
}
},
confirmButton = {
if (resendOption) {
FilledTonalButton(onClick = onConfirm, modifier = Modifier.padding(horizontal = 16.dp)) {
Text(text = stringResource(id = R.string.resend))
Text(text = stringResource(R.string.resend))
}
}
},
title = {
Text(
text = stringResource(id = title),
text = stringResource(title),
modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center,
style = MaterialTheme.typography.headlineSmall,
@ -95,7 +95,7 @@ fun DeliveryInfo(
Column(modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
text?.let {
Text(
text = stringResource(id = it),
text = stringResource(it),
textAlign = TextAlign.Center,
style = MaterialTheme.typography.bodyMedium,
)

View file

@ -98,7 +98,7 @@ fun QuickChatScreen(
Scaffold(
topBar = {
MainAppBar(
title = stringResource(id = R.string.quick_chat),
title = stringResource(R.string.quick_chat),
ourNode = null,
showNodeChip = false,
canNavigateUp = true,
@ -137,7 +137,7 @@ fun QuickChatScreen(
onClick = { showActionDialog = QuickChatAction(position = actions.size) },
modifier = Modifier.align(Alignment.BottomEnd).padding(16.dp),
) {
Icon(imageVector = Icons.Default.Add, contentDescription = stringResource(id = R.string.add))
Icon(imageVector = Icons.Default.Add, contentDescription = stringResource(R.string.add))
}
}
}
@ -180,7 +180,7 @@ private fun EditQuickChatDialog(
text = {
Column(modifier = Modifier.fillMaxWidth()) {
Text(
text = stringResource(id = title),
text = stringResource(title),
modifier = Modifier.fillMaxWidth(),
style =
MaterialTheme.typography.titleLarge.copy(
@ -204,7 +204,7 @@ private fun EditQuickChatDialog(
Spacer(modifier = Modifier.height(8.dp))
OutlinedTextFieldWithCounter(
label = stringResource(id = R.string.message),
label = stringResource(R.string.message),
value = actionInput.message,
maxSize = 200,
getSize = { it.toByteArray().size + 1 },
@ -227,7 +227,7 @@ private fun EditQuickChatDialog(
Row(verticalAlignment = Alignment.CenterVertically) {
if (isInstant) {
Icon(imageVector = icon, contentDescription = stringResource(id = text))
Icon(imageVector = icon, contentDescription = stringResource(text))
Spacer(Modifier.width(12.dp))
}
@ -328,7 +328,7 @@ private fun QuickChatItem(
if (action.mode == QuickChatAction.Mode.Instant) {
Icon(
imageVector = Icons.Default.FastForward,
contentDescription = stringResource(id = R.string.quick_chat_instant),
contentDescription = stringResource(R.string.quick_chat_instant),
)
}
},
@ -339,12 +339,12 @@ private fun QuickChatItem(
IconButton(onClick = { onEdit(action) }, modifier = Modifier.size(48.dp)) {
Icon(
imageVector = Icons.Default.Edit,
contentDescription = stringResource(id = R.string.quick_chat_edit),
contentDescription = stringResource(R.string.quick_chat_edit),
)
}
Icon(
imageVector = Icons.Default.DragHandle,
contentDescription = stringResource(id = R.string.quick_chat),
contentDescription = stringResource(R.string.quick_chat),
)
}
},

View file

@ -54,9 +54,9 @@ fun AdministrationSection(
onFirmwareSelect: (FirmwareRelease) -> Unit,
modifier: Modifier = Modifier,
) {
TitledCard(stringResource(id = R.string.administration), modifier = modifier) {
TitledCard(stringResource(R.string.administration), modifier = modifier) {
ListItem(
text = stringResource(id = R.string.request_metadata),
text = stringResource(R.string.request_metadata),
leadingIcon = Icons.Default.Memory,
trailingIcon = null,
onClick = { onAction(NodeDetailAction.TriggerServiceAction(ServiceAction.GetDeviceMetadata(node.num))) },
@ -65,7 +65,7 @@ fun AdministrationSection(
InsetDivider()
ListItem(
text = stringResource(id = R.string.remote_admin),
text = stringResource(R.string.remote_admin),
leadingIcon = Icons.Default.Settings,
enabled = metricsState.isLocal || node.metadata != null,
) {

View file

@ -69,7 +69,7 @@ fun DeviceActions(
)
TitledCard(title = stringResource(R.string.actions), modifier = modifier) {
ListItem(
text = stringResource(id = R.string.share_contact),
text = stringResource(R.string.share_contact),
leadingIcon = Icons.Rounded.QrCode2,
trailingIcon = null,
onClick = { onAction(NodeDetailAction.ShareContact) },
@ -102,7 +102,7 @@ fun DeviceActions(
InsetDivider()
ListItem(
text = stringResource(id = R.string.remove),
text = stringResource(R.string.remove),
leadingIcon = Icons.Rounded.Delete,
trailingIcon = null,
onClick = { displayRemoveDialog = true },

View file

@ -70,9 +70,9 @@ fun FirmwareReleaseSheetContent(firmwareRelease: FirmwareRelease, modifier: Modi
},
modifier = Modifier.weight(1f),
) {
Icon(imageVector = Icons.Default.Link, contentDescription = stringResource(id = R.string.view_release))
Icon(imageVector = Icons.Default.Link, contentDescription = stringResource(R.string.view_release))
Spacer(modifier = Modifier.width(8.dp))
Text(text = stringResource(id = R.string.view_release))
Text(text = stringResource(R.string.view_release))
}
Button(
onClick = {
@ -86,9 +86,9 @@ fun FirmwareReleaseSheetContent(firmwareRelease: FirmwareRelease, modifier: Modi
},
modifier = Modifier.weight(1f),
) {
Icon(imageVector = Icons.Default.Download, contentDescription = stringResource(id = R.string.download))
Icon(imageVector = Icons.Default.Download, contentDescription = stringResource(R.string.download))
Spacer(modifier = Modifier.width(8.dp))
Text(text = stringResource(id = R.string.download))
Text(text = stringResource(R.string.download))
}
}
}

View file

@ -55,7 +55,7 @@ fun MetricsSection(
val nonPositionLogs = availableLogs.filter { it != LogsType.NODE_MAP && it != LogsType.POSITIONS }
if (nonPositionLogs.isNotEmpty()) {
TitledCard(title = stringResource(id = R.string.logs), modifier = modifier) {
TitledCard(title = stringResource(R.string.logs), modifier = modifier) {
nonPositionLogs.forEach { type ->
ListItem(text = stringResource(type.titleRes), leadingIcon = type.icon) {
onAction(NodeDetailAction.Navigate(type.route))

View file

@ -57,19 +57,19 @@ fun NodeDetailsSection(node: Node, modifier: Modifier = Modifier) {
Row(verticalAlignment = Alignment.CenterVertically) {
Icon(
imageVector = Icons.Default.KeyOff,
contentDescription = stringResource(id = R.string.encryption_error),
contentDescription = stringResource(R.string.encryption_error),
tint = Color.Red,
)
Spacer(Modifier.width(12.dp))
Text(
text = stringResource(id = R.string.encryption_error),
text = stringResource(R.string.encryption_error),
style = MaterialTheme.typography.titleLarge.copy(color = Color.Red),
textAlign = TextAlign.Center,
)
}
Spacer(Modifier.height(16.dp))
Text(
text = stringResource(id = R.string.encryption_error_text),
text = stringResource(R.string.encryption_error_text),
style = MaterialTheme.typography.bodyMedium,
textAlign = TextAlign.Center,
)

View file

@ -114,7 +114,7 @@ fun NodeFilterTextField(
.padding(vertical = 16.dp, horizontal = 24.dp),
) {
Text(
text = stringResource(id = R.string.node_filter_ignored),
text = stringResource(R.string.node_filter_ignored),
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.onSurface,
modifier = Modifier.fillMaxWidth(),
@ -135,20 +135,20 @@ private fun NodeFilterTextField(filterText: String, onTextChange: (String) -> Un
value = filterText,
placeholder = {
Text(
text = stringResource(id = R.string.node_filter_placeholder),
text = stringResource(R.string.node_filter_placeholder),
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onBackground.copy(alpha = 0.35F),
)
},
leadingIcon = {
Icon(Icons.Default.Search, contentDescription = stringResource(id = R.string.node_filter_placeholder))
Icon(Icons.Default.Search, contentDescription = stringResource(R.string.node_filter_placeholder))
},
onValueChange = onTextChange,
trailingIcon = {
if (filterText.isNotEmpty() || isFocused) {
Icon(
Icons.Default.Clear,
contentDescription = stringResource(id = R.string.desc_node_filter_clear),
contentDescription = stringResource(R.string.desc_node_filter_clear),
modifier =
Modifier.clickable {
onTextChange("")
@ -192,7 +192,7 @@ private fun NodeSortButton(
NodeSortOption.entries.forEach { sort ->
DropdownMenuRadio(
text = stringResource(id = sort.stringRes),
text = stringResource(sort.stringRes),
selected = sort == currentSortOption,
onClick = { onSortSelect(sort) },
)

View file

@ -74,7 +74,7 @@ fun NodeItem(
) {
val isFavorite = remember(thatNode) { thatNode.isFavorite }
val isIgnored = thatNode.isIgnored
val longName = thatNode.user.longName.ifEmpty { stringResource(id = R.string.unknown_username) }
val longName = thatNode.user.longName.ifEmpty { stringResource(R.string.unknown_username) }
val isThisNode = remember(thatNode) { thisNode?.num == thatNode.num }
val system = remember(distanceUnits) { DisplayConfig.DisplayUnits.forNumber(distanceUnits) }
val distance =
@ -165,7 +165,7 @@ fun NodeItem(
ElevationInfo(
altitude = position.altitude,
system = system,
suffix = stringResource(id = R.string.elevation_suffix),
suffix = stringResource(R.string.elevation_suffix),
contentColor = contentColor,
)
val satCount = position.satsInView

View file

@ -54,7 +54,7 @@ fun NotesSection(node: Node, onSaveNotes: (Int, String) -> Unit, modifier: Modif
value = notes,
onValueChange = { notes = it },
modifier = Modifier.fillMaxWidth().padding(8.dp),
placeholder = { Text(stringResource(id = R.string.add_a_note)) },
placeholder = { Text(stringResource(R.string.add_a_note)) },
trailingIcon = {
IconButton(
onClick = {
@ -63,7 +63,7 @@ fun NotesSection(node: Node, onSaveNotes: (Int, String) -> Unit, modifier: Modif
},
enabled = edited,
) {
Icon(imageVector = Icons.Default.Save, contentDescription = stringResource(id = R.string.save))
Icon(imageVector = Icons.Default.Save, contentDescription = stringResource(R.string.save))
}
},
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),

View file

@ -76,7 +76,7 @@ fun PositionSection(
// Exchange position action
ListItem(
text = stringResource(id = R.string.exchange_position),
text = stringResource(R.string.exchange_position),
leadingIcon = Icons.Default.LocationOn,
trailingIcon = null,
onClick = { onAction(NodeDetailAction.HandleNodeMenuAction(NodeMenuAction.RequestPosition(node))) },

View file

@ -33,7 +33,7 @@ import org.meshtastic.feature.node.model.isEffectivelyUnmessageable
internal fun RemoteDeviceActions(node: Node, lastTracerouteTime: Long?, onAction: (NodeDetailAction) -> Unit) {
if (!node.isEffectivelyUnmessageable) {
ListItem(
text = stringResource(id = R.string.direct_message),
text = stringResource(R.string.direct_message),
leadingIcon = Icons.AutoMirrored.TwoTone.Message,
trailingIcon = null,
onClick = { onAction(NodeDetailAction.HandleNodeMenuAction(NodeMenuAction.DirectMessage(node))) },
@ -43,7 +43,7 @@ internal fun RemoteDeviceActions(node: Node, lastTracerouteTime: Long?, onAction
}
ListItem(
text = stringResource(id = R.string.exchange_userinfo),
text = stringResource(R.string.exchange_userinfo),
leadingIcon = Icons.Default.Person,
trailingIcon = null,
onClick = { onAction(NodeDetailAction.HandleNodeMenuAction(NodeMenuAction.RequestUserInfo(node))) },

View file

@ -42,7 +42,7 @@ private const val COOL_DOWN_TIME_MS = 30000L
@Composable
fun TracerouteButton(
text: String = stringResource(id = R.string.traceroute),
text: String = stringResource(R.string.traceroute),
lastTracerouteTime: Long?,
onClick: () -> Unit,
) {

View file

@ -140,7 +140,7 @@ private fun TemperatureDisplay(envMetrics: TelemetryProtos.EnvironmentMetrics, e
if (!temperature.isNaN()) {
val textFormat = if (environmentDisplayFahrenheit) "%s %.1f°F" else "%s %.1f°C"
Text(
text = textFormat.format(stringResource(id = R.string.temperature), temperature),
text = textFormat.format(stringResource(R.string.temperature), temperature),
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.labelLarge.fontSize,
)
@ -161,7 +161,7 @@ private fun HumidityAndBarometricPressureDisplay(envMetrics: TelemetryProtos.Env
if (hasHumidity) {
val humidity = envMetrics.relativeHumidity!!
Text(
text = "%s %.2f%%".format(stringResource(id = R.string.humidity), humidity),
text = "%s %.2f%%".format(stringResource(R.string.humidity), humidity),
color = MaterialTheme.colorScheme.onSurface,
fontSize = MaterialTheme.typography.labelLarge.fontSize,
modifier = Modifier.padding(vertical = 0.dp),

View file

@ -143,15 +143,15 @@ private fun ActionButtons(
enabled = clearButtonEnabled,
colors = ButtonDefaults.outlinedButtonColors(contentColor = MaterialTheme.colorScheme.error),
) {
Icon(imageVector = Icons.Default.Delete, contentDescription = stringResource(id = R.string.clear))
Icon(imageVector = Icons.Default.Delete, contentDescription = stringResource(R.string.clear))
Spacer(Modifier.width(8.dp))
Text(text = stringResource(id = R.string.clear))
Text(text = stringResource(R.string.clear))
}
OutlinedButton(modifier = Modifier.weight(1f), onClick = onSave, enabled = saveButtonEnabled) {
Icon(imageVector = Icons.Default.Save, contentDescription = stringResource(id = R.string.save))
Icon(imageVector = Icons.Default.Save, contentDescription = stringResource(R.string.save))
Spacer(Modifier.width(8.dp))
Text(text = stringResource(id = R.string.save))
Text(text = stringResource(R.string.save))
}
}
}

View file

@ -185,11 +185,11 @@ private fun DeleteItem(onClick: () -> Unit) {
Row(verticalAlignment = Alignment.CenterVertically) {
Icon(
imageVector = Icons.Default.Delete,
contentDescription = stringResource(id = R.string.delete),
contentDescription = stringResource(R.string.delete),
tint = MaterialTheme.colorScheme.error,
)
Spacer(modifier = Modifier.width(12.dp))
Text(text = stringResource(id = R.string.delete), color = MaterialTheme.colorScheme.error)
Text(text = stringResource(R.string.delete), color = MaterialTheme.colorScheme.error)
}
},
)
@ -202,7 +202,7 @@ private fun TracerouteItem(icon: ImageVector, text: String, modifier: Modifier =
modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(imageVector = icon, contentDescription = stringResource(id = R.string.traceroute))
Icon(imageVector = icon, contentDescription = stringResource(R.string.traceroute))
Spacer(modifier = Modifier.width(8.dp))
Text(text = text, style = MaterialTheme.typography.bodyLarge)
}

View file

@ -349,7 +349,7 @@ fun DebugMenuActions(deleteLogs: () -> Unit, modifier: Modifier = Modifier) {
var showDeleteLogsDialog by remember { mutableStateOf(false) }
IconButton(onClick = { showDeleteLogsDialog = true }, modifier = modifier.padding(4.dp)) {
Icon(imageVector = Icons.Default.Delete, contentDescription = stringResource(id = R.string.debug_clear))
Icon(imageVector = Icons.Default.Delete, contentDescription = stringResource(R.string.debug_clear))
}
if (showDeleteLogsDialog) {
SimpleAlertDialog(
@ -426,7 +426,7 @@ private fun DecodedPayloadBlock(
Column(modifier = modifier) {
Text(
text = stringResource(id = R.string.debug_decoded_payload),
text = stringResource(R.string.debug_decoded_payload),
style = commonTextStyle,
modifier = Modifier.padding(top = 8.dp, bottom = 4.dp),
)
@ -595,11 +595,11 @@ private fun DebugMenuActionsPreview() {
IconButton(onClick = { /* Preview only */ }, modifier = Modifier.padding(4.dp)) {
Icon(
imageVector = Icons.Outlined.FileDownload,
contentDescription = stringResource(id = R.string.debug_logs_export),
contentDescription = stringResource(R.string.debug_logs_export),
)
}
IconButton(onClick = { /* Preview only */ }, modifier = Modifier.padding(4.dp)) {
Icon(imageVector = Icons.Default.Delete, contentDescription = stringResource(id = R.string.debug_clear))
Icon(imageVector = Icons.Default.Delete, contentDescription = stringResource(R.string.debug_clear))
}
}
}
@ -637,7 +637,7 @@ private fun DebugScreenEmptyPreview() {
Text(text = "Filters", style = TextStyle(fontWeight = FontWeight.Bold))
Icon(
imageVector = Icons.TwoTone.FilterAltOff,
contentDescription = stringResource(id = R.string.debug_filters),
contentDescription = stringResource(R.string.debug_filters),
)
}
}

View file

@ -95,7 +95,7 @@ fun DebugCustomFilterInput(
},
enabled = customFilterText.isNotBlank(),
) {
Icon(imageVector = Icons.Default.Add, contentDescription = stringResource(id = R.string.debug_filter_add))
Icon(imageVector = Icons.Default.Add, contentDescription = stringResource(R.string.debug_filter_add))
}
}
}
@ -144,7 +144,7 @@ internal fun DebugPresetFilters(
if (filter in filterTexts) {
Icon(
imageVector = Icons.Filled.Done,
contentDescription = stringResource(id = R.string.debug_filter_included),
contentDescription = stringResource(R.string.debug_filter_included),
)
}
},
@ -181,7 +181,7 @@ internal fun DebugFilterBar(
} else {
Icons.TwoTone.FilterAltOff
},
contentDescription = stringResource(id = R.string.debug_filters),
contentDescription = stringResource(R.string.debug_filters),
)
}
}
@ -256,7 +256,7 @@ internal fun DebugActiveFilters(
IconButton(onClick = { onFilterTextsChange(emptyList()) }) {
Icon(
imageVector = Icons.Default.Clear,
contentDescription = stringResource(id = R.string.debug_filter_clear),
contentDescription = stringResource(R.string.debug_filter_clear),
)
}
}

View file

@ -188,7 +188,7 @@ internal fun DebugSearchState(
IconButton(onClick = onExport, modifier = Modifier) {
Icon(
imageVector = Icons.Outlined.FileDownload,
contentDescription = stringResource(id = R.string.debug_logs_export),
contentDescription = stringResource(R.string.debug_logs_export),
modifier = Modifier.size(24.dp),
)
}

View file

@ -81,7 +81,7 @@ fun ChannelConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
}
ChannelConfigScreen(
title = stringResource(id = R.string.channels),
title = stringResource(R.string.channels),
onBack = onBack,
settingsList = state.channelList,
loraConfig = state.radioConfig.lora,

View file

@ -42,7 +42,7 @@ fun AmbientLightingConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(
val focusManager = LocalFocusManager.current
RadioConfigScreenList(
title = stringResource(id = R.string.ambient_lighting),
title = stringResource(R.string.ambient_lighting),
onBack = onBack,
configState = formState,
enabled = state.connected,

View file

@ -44,7 +44,7 @@ fun AudioConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack:
val focusManager = LocalFocusManager.current
RadioConfigScreenList(
title = stringResource(id = R.string.audio),
title = stringResource(R.string.audio),
onBack = onBack,
configState = formState,
enabled = state.connected,

View file

@ -44,7 +44,7 @@ fun BluetoothConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onB
val focusManager = LocalFocusManager.current
RadioConfigScreenList(
title = stringResource(id = R.string.bluetooth),
title = stringResource(R.string.bluetooth),
onBack = onBack,
configState = formState,
enabled = state.connected,

View file

@ -52,7 +52,7 @@ fun CannedMessageConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(),
val focusManager = LocalFocusManager.current
RadioConfigScreenList(
title = stringResource(id = R.string.canned_message),
title = stringResource(R.string.canned_message),
onBack = onBack,
configState = formState,
enabled = state.connected,

View file

@ -53,7 +53,7 @@ fun DetectionSensorConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(
val context = LocalContext.current
RadioConfigScreenList(
title = stringResource(id = R.string.detection_sensor),
title = stringResource(R.string.detection_sensor),
onBack = onBack,
configState = formState,
enabled = state.connected,

View file

@ -132,7 +132,7 @@ fun DeviceConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack
val focusManager = LocalFocusManager.current
val context = LocalContext.current
RadioConfigScreenList(
title = stringResource(id = R.string.device),
title = stringResource(R.string.device),
onBack = onBack,
configState = formState,
enabled = state.connected,
@ -150,7 +150,7 @@ fun DeviceConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack
enabled = state.connected,
selectedItem = formState.value.role,
onItemSelected = { selectedRole = it },
summary = stringResource(id = formState.value.role.description),
summary = stringResource(formState.value.role.description),
)
HorizontalDivider()
@ -160,7 +160,7 @@ fun DeviceConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack
enabled = state.connected,
selectedItem = formState.value.rebroadcastMode,
onItemSelected = { formState.value = formState.value.copy { rebroadcastMode = it } },
summary = stringResource(id = formState.value.rebroadcastMode.description),
summary = stringResource(formState.value.rebroadcastMode.description),
)
HorizontalDivider()
@ -180,7 +180,7 @@ fun DeviceConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack
TitledCard(title = stringResource(R.string.hardware)) {
SwitchPreference(
title = stringResource(R.string.double_tap_as_button_press),
summary = stringResource(id = R.string.config_device_doubleTapAsButtonPress_summary),
summary = stringResource(R.string.config_device_doubleTapAsButtonPress_summary),
checked = formState.value.doubleTapAsButtonPress,
enabled = state.connected,
onCheckedChange = { formState.value = formState.value.copy { doubleTapAsButtonPress = it } },
@ -191,7 +191,7 @@ fun DeviceConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack
SwitchPreference(
title = stringResource(R.string.triple_click_adhoc_ping),
summary = stringResource(id = R.string.config_device_tripleClickAsAdHocPing_summary),
summary = stringResource(R.string.config_device_tripleClickAsAdHocPing_summary),
checked = !formState.value.disableTripleClick,
enabled = state.connected,
onCheckedChange = { formState.value = formState.value.copy { disableTripleClick = !it } },
@ -202,7 +202,7 @@ fun DeviceConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack
SwitchPreference(
title = stringResource(R.string.led_heartbeat),
summary = stringResource(id = R.string.config_device_ledHeartbeatEnabled_summary),
summary = stringResource(R.string.config_device_ledHeartbeatEnabled_summary),
checked = !formState.value.ledHeartbeatDisabled,
enabled = state.connected,
onCheckedChange = { formState.value = formState.value.copy { ledHeartbeatDisabled = !it } },
@ -230,7 +230,7 @@ fun DeviceConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack
EditTextPreference(
title = "",
value = formState.value.tzdef,
summary = stringResource(id = R.string.config_device_tzdef_summary),
summary = stringResource(R.string.config_device_tzdef_summary),
maxSize = 64, // tzdef max_size:65
enabled = state.connected,
isError = false,

View file

@ -45,7 +45,7 @@ fun DisplayConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBac
val context = LocalContext.current
RadioConfigScreenList(
title = stringResource(id = R.string.display),
title = stringResource(R.string.display),
onBack = onBack,
configState = formState,
enabled = state.connected,
@ -60,7 +60,7 @@ fun DisplayConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBac
TitledCard(title = stringResource(R.string.display_config)) {
SwitchPreference(
title = stringResource(R.string.always_point_north),
summary = stringResource(id = R.string.config_display_compass_north_top_summary),
summary = stringResource(R.string.config_display_compass_north_top_summary),
checked = formState.value.compassNorthTop,
enabled = state.connected,
onCheckedChange = { formState.value = formState.value.copy { compassNorthTop = it } },
@ -78,7 +78,7 @@ fun DisplayConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBac
HorizontalDivider()
SwitchPreference(
title = stringResource(R.string.bold_heading),
summary = stringResource(id = R.string.config_display_heading_bold_summary),
summary = stringResource(R.string.config_display_heading_bold_summary),
checked = formState.value.headingBold,
enabled = state.connected,
onCheckedChange = { formState.value = formState.value.copy { headingBold = it } },
@ -87,7 +87,7 @@ fun DisplayConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBac
HorizontalDivider()
DropDownPreference(
title = stringResource(R.string.display_units),
summary = stringResource(id = R.string.config_display_units_summary),
summary = stringResource(R.string.config_display_units_summary),
enabled = state.connected,
items =
DisplayConfig.DisplayUnits.entries
@ -104,7 +104,7 @@ fun DisplayConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBac
val carouselIntervals = remember { IntervalConfiguration.DISPLAY_CAROUSEL.allowedIntervals }
DropDownPreference(
title = stringResource(R.string.screen_on_for),
summary = stringResource(id = R.string.config_display_screen_on_secs_summary),
summary = stringResource(R.string.config_display_screen_on_secs_summary),
enabled = state.connected,
items = screenOnIntervals.map { it to it.toDisplayString(context = context) },
selectedItem =
@ -115,7 +115,7 @@ fun DisplayConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBac
HorizontalDivider()
DropDownPreference(
title = stringResource(R.string.carousel_interval),
summary = stringResource(id = R.string.config_display_auto_screen_carousel_secs_summary),
summary = stringResource(R.string.config_display_auto_screen_carousel_secs_summary),
enabled = state.connected,
items = carouselIntervals.map { it to it.toDisplayString(context = context) },
selectedItem =
@ -128,7 +128,7 @@ fun DisplayConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBac
HorizontalDivider()
SwitchPreference(
title = stringResource(R.string.wake_on_tap_or_motion),
summary = stringResource(id = R.string.config_display_wake_on_tap_or_motion_summary),
summary = stringResource(R.string.config_display_wake_on_tap_or_motion_summary),
checked = formState.value.wakeOnTapOrMotion,
enabled = state.connected,
onCheckedChange = { formState.value = formState.value.copy { wakeOnTapOrMotion = it } },
@ -137,7 +137,7 @@ fun DisplayConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBac
HorizontalDivider()
SwitchPreference(
title = stringResource(R.string.flip_screen),
summary = stringResource(id = R.string.config_display_flip_screen_summary),
summary = stringResource(R.string.config_display_flip_screen_summary),
checked = formState.value.flipScreen,
enabled = state.connected,
onCheckedChange = { formState.value = formState.value.copy { flipScreen = it } },
@ -146,7 +146,7 @@ fun DisplayConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBac
HorizontalDivider()
DropDownPreference(
title = stringResource(R.string.display_mode),
summary = stringResource(id = R.string.config_display_displaymode_summary),
summary = stringResource(R.string.config_display_displaymode_summary),
enabled = state.connected,
items =
DisplayConfig.DisplayMode.entries
@ -158,7 +158,7 @@ fun DisplayConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBac
HorizontalDivider()
DropDownPreference(
title = stringResource(R.string.oled_type),
summary = stringResource(id = R.string.config_display_oled_summary),
summary = stringResource(R.string.config_display_oled_summary),
enabled = state.connected,
items =
DisplayConfig.OledType.entries

View file

@ -57,7 +57,7 @@ fun ExternalNotificationConfigScreen(viewModel: RadioConfigViewModel = hiltViewM
val context = LocalContext.current
RadioConfigScreenList(
title = stringResource(id = R.string.external_notification),
title = stringResource(R.string.external_notification),
onBack = onBack,
configState = formState,
enabled = state.connected,

View file

@ -54,7 +54,7 @@ fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
val focusManager = LocalFocusManager.current
RadioConfigScreenList(
title = stringResource(id = R.string.lora),
title = stringResource(R.string.lora),
onBack = onBack,
configState = formState,
enabled = state.connected,
@ -69,7 +69,7 @@ fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
TitledCard(title = stringResource(R.string.options)) {
DropDownPreference(
title = stringResource(R.string.region_frequency_plan),
summary = stringResource(id = R.string.config_lora_region_summary),
summary = stringResource(R.string.config_lora_region_summary),
enabled = state.connected,
items = RegionInfo.entries.map { it.regionCode to it.description },
selectedItem = formState.value.region,
@ -87,7 +87,7 @@ fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
if (formState.value.usePreset) {
DropDownPreference(
title = stringResource(R.string.modem_preset),
summary = stringResource(id = R.string.config_lora_modem_preset_summary),
summary = stringResource(R.string.config_lora_modem_preset_summary),
enabled = state.connected && formState.value.usePreset,
items = ChannelOption.entries.map { it.modemPreset to stringResource(it.labelRes) },
selectedItem = formState.value.modemPreset,
@ -150,7 +150,7 @@ fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
val hopLimitItems = remember { hopLimits }
DropDownPreference(
title = stringResource(R.string.hop_limit),
summary = stringResource(id = R.string.config_lora_hop_limit_summary),
summary = stringResource(R.string.config_lora_hop_limit_summary),
items = hopLimitItems,
selectedItem = formState.value.hopLimit,
onItemSelected = { formState.value = formState.value.copy { hopLimit = it } },
@ -160,7 +160,7 @@ fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) {
var isFocusedSlot by remember { mutableStateOf(false) }
EditTextPreference(
title = stringResource(R.string.frequency_slot),
summary = stringResource(id = R.string.config_lora_frequency_slot_summary),
summary = stringResource(R.string.config_lora_frequency_slot_summary),
value =
if (isFocusedSlot || formState.value.channelNum != 0) {
formState.value.channelNum

View file

@ -66,7 +66,7 @@ fun MQTTConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack:
val focusManager = LocalFocusManager.current
RadioConfigScreenList(
title = stringResource(id = R.string.mqtt),
title = stringResource(R.string.mqtt),
onBack = onBack,
configState = formState,
enabled = state.connected && consentValid,

View file

@ -42,7 +42,7 @@ fun NeighborInfoConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(),
val focusManager = LocalFocusManager.current
RadioConfigScreenList(
title = stringResource(id = R.string.neighbor_info),
title = stringResource(R.string.neighbor_info),
onBack = onBack,
configState = formState,
enabled = state.connected,
@ -73,7 +73,7 @@ fun NeighborInfoConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(),
HorizontalDivider()
SwitchPreference(
title = stringResource(R.string.transmit_over_lora),
summary = stringResource(id = R.string.config_device_transmitOverLora_summary),
summary = stringResource(R.string.config_device_transmitOverLora_summary),
checked = formState.value.transmitOverLora,
enabled = state.connected,
onCheckedChange = { formState.value = formState.value.copy { transmitOverLora = it } },

View file

@ -100,7 +100,7 @@ fun NetworkConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBac
val focusManager = LocalFocusManager.current
RadioConfigScreenList(
title = stringResource(id = R.string.network),
title = stringResource(R.string.network),
onBack = onBack,
configState = formState,
enabled = state.connected,
@ -146,7 +146,7 @@ fun NetworkConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBac
TitledCard(title = stringResource(R.string.wifi_config)) {
SwitchPreference(
title = stringResource(R.string.wifi_enabled),
summary = stringResource(id = R.string.config_network_wifi_enabled_summary),
summary = stringResource(R.string.config_network_wifi_enabled_summary),
checked = formState.value.wifiEnabled,
enabled = state.connected,
onCheckedChange = { formState.value = formState.value.copy { wifiEnabled = it } },
@ -189,7 +189,7 @@ fun NetworkConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBac
TitledCard(title = stringResource(R.string.ethernet_config)) {
SwitchPreference(
title = stringResource(R.string.ethernet_enabled),
summary = stringResource(id = R.string.config_network_eth_enabled_summary),
summary = stringResource(R.string.config_network_eth_enabled_summary),
checked = formState.value.ethEnabled,
enabled = state.connected,
onCheckedChange = { formState.value = formState.value.copy { ethEnabled = it } },
@ -204,7 +204,7 @@ fun NetworkConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBac
TitledCard(title = stringResource(R.string.udp_config)) {
SwitchPreference(
title = stringResource(R.string.udp_enabled),
summary = stringResource(id = R.string.config_network_udp_enabled_summary),
summary = stringResource(R.string.config_network_udp_enabled_summary),
checked = formState.value.enabledProtocols == 1,
enabled = state.connected,
onCheckedChange = {

View file

@ -58,10 +58,10 @@ fun <T> PacketResponseStateDialog(state: ResponseState<T>, onDismiss: () -> Unit
if (state.total == state.completed) onComplete()
}
if (state is ResponseState.Success) {
Text(text = stringResource(id = R.string.delivery_confirmed))
Text(text = stringResource(R.string.delivery_confirmed))
}
if (state is ResponseState.Error) {
Text(text = stringResource(id = R.string.error), minLines = 2)
Text(text = stringResource(R.string.error), minLines = 2)
Text(text = state.error.asString())
}
}

View file

@ -48,7 +48,7 @@ fun PaxcounterConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), on
val context = LocalContext.current
RadioConfigScreenList(
title = stringResource(id = R.string.paxcounter),
title = stringResource(R.string.paxcounter),
onBack = onBack,
configState = formState,
enabled = state.connected,

View file

@ -121,7 +121,7 @@ fun PositionConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBa
val focusManager = LocalFocusManager.current
val context = LocalContext.current
RadioConfigScreenList(
title = stringResource(id = R.string.position),
title = stringResource(R.string.position),
onBack = onBack,
configState = formState,
enabled = state.connected,
@ -147,7 +147,7 @@ fun PositionConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBa
val items = remember { IntervalConfiguration.POSITION_BROADCAST.allowedIntervals }
DropDownPreference(
title = stringResource(R.string.broadcast_interval),
summary = stringResource(id = R.string.config_position_broadcast_secs_summary),
summary = stringResource(R.string.config_position_broadcast_secs_summary),
enabled = state.connected,
items = items.map { it to it.toDisplayString(context = context) },
selectedItem =
@ -170,7 +170,7 @@ fun PositionConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBa
DropDownPreference(
title = stringResource(R.string.minimum_interval),
summary =
stringResource(id = R.string.config_position_broadcast_smart_minimum_interval_secs_summary),
stringResource(R.string.config_position_broadcast_smart_minimum_interval_secs_summary),
enabled = state.connected,
items = smartItems.map { it to it.toDisplayString(context = context) },
selectedItem =
@ -184,8 +184,7 @@ fun PositionConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBa
HorizontalDivider()
EditTextPreference(
title = stringResource(R.string.minimum_distance),
summary =
stringResource(id = R.string.config_position_broadcast_smart_minimum_distance_summary),
summary = stringResource(R.string.config_position_broadcast_smart_minimum_distance_summary),
value = formState.value.broadcastSmartMinimumDistance,
enabled = state.connected,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
@ -261,7 +260,7 @@ fun PositionConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBa
val items = remember { IntervalConfiguration.GPS_UPDATE.allowedIntervals }
DropDownPreference(
title = stringResource(R.string.update_interval),
summary = stringResource(id = R.string.config_position_gps_update_interval_summary),
summary = stringResource(R.string.config_position_gps_update_interval_summary),
enabled = state.connected,
items = items.map { it to it.toDisplayString(context = context) },
selectedItem =
@ -277,7 +276,7 @@ fun PositionConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBa
TitledCard(title = stringResource(R.string.position_flags)) {
BitwisePreference(
title = stringResource(R.string.position_flags),
summary = stringResource(id = R.string.config_position_flags_summary),
summary = stringResource(R.string.config_position_flags_summary),
value = formState.value.positionFlags,
enabled = state.connected,
items =

View file

@ -48,7 +48,7 @@ fun PowerConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack:
val context = LocalContext.current
RadioConfigScreenList(
title = stringResource(id = R.string.power),
title = stringResource(R.string.power),
onBack = onBack,
configState = formState,
enabled = state.connected,
@ -63,7 +63,7 @@ fun PowerConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack:
TitledCard(title = stringResource(R.string.power_config)) {
SwitchPreference(
title = stringResource(R.string.enable_power_saving_mode),
summary = stringResource(id = R.string.config_power_is_power_saving_summary),
summary = stringResource(R.string.config_power_is_power_saving_summary),
checked = formState.value.isPowerSaving,
enabled = state.connected,
onCheckedChange = { formState.value = formState.value.copy { isPowerSaving = it } },

View file

@ -44,7 +44,7 @@ fun RangeTestConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onB
val context = LocalContext.current
RadioConfigScreenList(
title = stringResource(id = R.string.range_test),
title = stringResource(R.string.range_test),
onBack = onBack,
configState = formState,
enabled = state.connected,

View file

@ -42,7 +42,7 @@ fun RemoteHardwareConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()
val focusManager = LocalFocusManager.current
RadioConfigScreenList(
title = stringResource(id = R.string.remote_hardware),
title = stringResource(R.string.remote_hardware),
onBack = onBack,
configState = formState,
enabled = state.connected,

View file

@ -123,7 +123,7 @@ fun SecurityConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBa
val focusManager = LocalFocusManager.current
RadioConfigScreenList(
title = stringResource(id = R.string.security),
title = stringResource(R.string.security),
onBack = onBack,
configState = formState,
enabled = state.connected,
@ -138,7 +138,7 @@ fun SecurityConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBa
TitledCard(title = stringResource(R.string.direct_message_key)) {
EditBase64Preference(
title = stringResource(R.string.public_key),
summary = stringResource(id = R.string.config_security_public_key),
summary = stringResource(R.string.config_security_public_key),
value = publicKey,
enabled = state.connected,
readOnly = true,
@ -153,7 +153,7 @@ fun SecurityConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBa
HorizontalDivider()
EditBase64Preference(
title = stringResource(R.string.private_key),
summary = stringResource(id = R.string.config_security_private_key),
summary = stringResource(R.string.config_security_private_key),
value = formState.value.privateKey,
enabled = state.connected,
keyboardActions = KeyboardActions(onDone = { focusManager.clearFocus() }),
@ -186,7 +186,7 @@ fun SecurityConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBa
TitledCard(title = stringResource(R.string.admin_keys)) {
EditListPreference(
title = stringResource(R.string.admin_key),
summary = stringResource(id = R.string.config_security_admin_key),
summary = stringResource(R.string.config_security_admin_key),
list = formState.value.adminKeyList,
maxCount = 3,
enabled = state.connected,
@ -205,7 +205,7 @@ fun SecurityConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBa
TitledCard(title = stringResource(R.string.logs)) {
SwitchPreference(
title = stringResource(R.string.serial_console),
summary = stringResource(id = R.string.config_security_serial_enabled),
summary = stringResource(R.string.config_security_serial_enabled),
checked = formState.value.serialEnabled,
enabled = state.connected,
onCheckedChange = { formState.value = formState.value.copy { serialEnabled = it } },
@ -214,7 +214,7 @@ fun SecurityConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBa
HorizontalDivider()
SwitchPreference(
title = stringResource(R.string.debug_log_api_enabled),
summary = stringResource(id = R.string.config_security_debug_log_api_enabled),
summary = stringResource(R.string.config_security_debug_log_api_enabled),
checked = formState.value.debugLogApiEnabled,
enabled = state.connected,
onCheckedChange = { formState.value = formState.value.copy { debugLogApiEnabled = it } },
@ -226,7 +226,7 @@ fun SecurityConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBa
TitledCard(title = stringResource(R.string.administration)) {
SwitchPreference(
title = stringResource(R.string.managed_mode),
summary = stringResource(id = R.string.config_security_is_managed),
summary = stringResource(R.string.config_security_is_managed),
checked = formState.value.isManaged,
enabled = state.connected && formState.value.adminKeyCount > 0,
onCheckedChange = { formState.value = formState.value.copy { isManaged = it } },

View file

@ -44,7 +44,7 @@ fun SerialConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack
val focusManager = LocalFocusManager.current
RadioConfigScreenList(
title = stringResource(id = R.string.serial),
title = stringResource(R.string.serial),
onBack = onBack,
configState = formState,
enabled = state.connected,

View file

@ -42,7 +42,7 @@ fun StoreForwardConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(),
val focusManager = LocalFocusManager.current
RadioConfigScreenList(
title = stringResource(id = R.string.store_forward),
title = stringResource(R.string.store_forward),
onBack = onBack,
configState = formState,
enabled = state.connected,

View file

@ -49,7 +49,7 @@ fun TelemetryConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onB
val context = LocalContext.current
RadioConfigScreenList(
title = stringResource(id = R.string.telemetry),
title = stringResource(R.string.telemetry),
onBack = onBack,
configState = formState,
enabled = state.connected,

View file

@ -52,7 +52,7 @@ fun UserConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack:
val focusManager = LocalFocusManager.current
RadioConfigScreenList(
title = stringResource(id = R.string.user),
title = stringResource(R.string.user),
onBack = onBack,
configState = formState,
enabled = state.connected && validNames,