diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a88f71b12..370f4b819 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -87,42 +87,42 @@ android { androidResources.localeFilters.addAll( listOf( "en", - "ar-rSA", - "b+sr+Latn", - "bg-rBG", - "ca-rES", - "cs-rCZ", - "de-rDE", - "el-rGR", - "es-rES", - "et-rEE", - "fi-rFI", - "fr-rFR", - "ga-rIE", - "gl-rES", - "hr-rHR", - "ht-rHT", - "hu-rHU", - "is-rIS", - "it-rIT", - "iw-rIL", - "ja-rJP", - "ko-rKR", - "lt-rLT", - "nl-rNL", - "no-rNO", - "pl-rPL", + "ar", + "bg", + "ca", + "cs", + "de", + "el", + "es", + "et", + "fi", + "fr", + "ga", + "gl", + "hr", + "ht", + "hu", + "is", + "it", + "iw", + "ja", + "ko", + "lt", + "nl", + "no", + "pl", + "pt", "pt-rBR", - "pt-rPT", - "ro-rRO", - "ru-rRU", - "sk-rSK", - "sl-rSI", - "sq-rAL", + "ro", + "ru", + "sk", + "sl", + "sq", + "sr", "srp", - "sv-rSE", - "tr-rTR", - "uk-rUA", + "sv", + "tr", + "uk", "zh-rCN", "zh-rTW", ), diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt index ea3ccf816..daf26128e 100644 --- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt +++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt @@ -46,13 +46,15 @@ import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.meshtastic.core.datastore.UiPreferencesDataSource import org.meshtastic.core.navigation.DEEP_LINK_BASE_URI +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.channel_invalid +import org.meshtastic.core.strings.contact_invalid import org.meshtastic.core.ui.theme.AppTheme import org.meshtastic.core.ui.theme.MODE_DYNAMIC import org.meshtastic.core.ui.util.showToast import org.meshtastic.feature.intro.AppIntroductionScreen import timber.log.Timber import javax.inject.Inject -import org.meshtastic.core.strings.R as Res @AndroidEntryPoint class MainActivity : AppCompatActivity() { diff --git a/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt b/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt index dcc604405..f443b275b 100644 --- a/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt +++ b/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt @@ -47,14 +47,18 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.getString import org.meshtastic.core.datastore.RecentAddressesDataSource import org.meshtastic.core.datastore.model.RecentAddress import org.meshtastic.core.model.util.anonymize import org.meshtastic.core.service.ServiceRepository +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.meshtastic +import org.meshtastic.core.strings.pairing_completed +import org.meshtastic.core.strings.pairing_failed_try_again import org.meshtastic.core.ui.viewmodel.stateInWhileSubscribed import timber.log.Timber import javax.inject.Inject -import org.meshtastic.core.strings.R as Res /** * A sealed class is used here to represent the different types of devices that can be displayed in the list. This is @@ -135,8 +139,7 @@ constructor( val idBytes = txtRecords["id"] val shortName = - shortNameBytes?.let { String(it, Charsets.UTF_8) } - ?: context.getString(Res.string.meshtastic) + shortNameBytes?.let { String(it, Charsets.UTF_8) } ?: getString(Res.string.meshtastic) val deviceId = idBytes?.let { String(it, Charsets.UTF_8) }?.replace("!", "") var displayName = recentMap[address] ?: shortName if (deviceId != null && !displayName.split("_").none { it == deviceId }) { @@ -283,10 +286,10 @@ constructor( if (state != BluetoothDevice.BOND_BONDING) { Timber.d("Bonding completed, state=$state") if (state == BluetoothDevice.BOND_BONDED) { - setErrorText(context.getString(Res.string.pairing_completed)) + setErrorText(getString(Res.string.pairing_completed)) changeDeviceAddress("x${device.address}") } else { - setErrorText(context.getString(Res.string.pairing_failed_try_again)) + setErrorText(getString(Res.string.pairing_failed_try_again)) } } } diff --git a/app/src/main/java/com/geeksville/mesh/model/UIState.kt b/app/src/main/java/com/geeksville/mesh/model/UIState.kt index 7b5a790cd..18cfea79d 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -39,6 +39,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.shareIn +import org.jetbrains.compose.resources.getString import org.meshtastic.core.analytics.platform.PlatformAnalytics import org.meshtastic.core.data.repository.FirmwareReleaseRepository import org.meshtastic.core.data.repository.MeshLogRepository @@ -51,6 +52,8 @@ import org.meshtastic.core.model.util.toChannelSet import org.meshtastic.core.service.IMeshService import org.meshtastic.core.service.MeshServiceNotifications import org.meshtastic.core.service.ServiceRepository +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.client_notification import org.meshtastic.core.ui.component.toSharedContact import org.meshtastic.core.ui.viewmodel.stateInWhileSubscribed import org.meshtastic.proto.AdminProtos @@ -58,7 +61,6 @@ import org.meshtastic.proto.AppOnlyProtos import org.meshtastic.proto.MeshProtos import timber.log.Timber import javax.inject.Inject -import org.meshtastic.core.strings.R as Res // Given a human name, strip out the first letter of the first three words and return that as the // initials for @@ -178,7 +180,7 @@ constructor( .filterNotNull() .onEach { showAlert( - title = app.getString(Res.string.client_notification), + title = getString(Res.string.client_notification), message = it, onConfirm = { serviceRepository.clearErrorMessage() }, dismissable = false, diff --git a/app/src/main/java/com/geeksville/mesh/navigation/NodesNavigation.kt b/app/src/main/java/com/geeksville/mesh/navigation/NodesNavigation.kt index a7d4da824..d40439b82 100644 --- a/app/src/main/java/com/geeksville/mesh/navigation/NodesNavigation.kt +++ b/app/src/main/java/com/geeksville/mesh/navigation/NodesNavigation.kt @@ -17,7 +17,6 @@ package com.geeksville.mesh.navigation -import androidx.annotation.StringRes import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.CellTower import androidx.compose.material.icons.filled.LightMode @@ -39,11 +38,22 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import androidx.navigation.compose.navigation import androidx.navigation.navDeepLink +import org.jetbrains.compose.resources.StringResource import org.meshtastic.core.navigation.ContactsRoutes import org.meshtastic.core.navigation.DEEP_LINK_BASE_URI import org.meshtastic.core.navigation.NodeDetailRoutes import org.meshtastic.core.navigation.NodesRoutes import org.meshtastic.core.navigation.Route +import org.meshtastic.core.strings.R +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.device +import org.meshtastic.core.strings.environment +import org.meshtastic.core.strings.host +import org.meshtastic.core.strings.pax +import org.meshtastic.core.strings.position_log +import org.meshtastic.core.strings.power +import org.meshtastic.core.strings.signal +import org.meshtastic.core.strings.traceroute import org.meshtastic.feature.map.node.NodeMapScreen import org.meshtastic.feature.map.node.NodeMapViewModel import org.meshtastic.feature.node.detail.NodeDetailScreen @@ -57,7 +67,6 @@ import org.meshtastic.feature.node.metrics.PositionLogScreen import org.meshtastic.feature.node.metrics.PowerMetricsScreen import org.meshtastic.feature.node.metrics.SignalMetricsScreen import org.meshtastic.feature.node.metrics.TracerouteLogScreen -import org.meshtastic.core.strings.R as Res fun NavGraphBuilder.nodesGraph(navController: NavHostController) { navigation(startDestination = NodesRoutes.Nodes) { @@ -198,7 +207,7 @@ private inline fun NavGraphBuilder.addNodeDetailScreenCompos } enum class NodeDetailRoute( - @StringRes val title: Int, + val title: StringResource, val route: Route, val icon: ImageVector?, val screenComposable: @Composable (metricsViewModel: MetricsViewModel, onNavigateUp: () -> Unit) -> Unit, diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt index 080903543..bc86f0e17 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -37,6 +37,7 @@ import com.geeksville.mesh.util.ignoreException import com.geeksville.mesh.util.toRemoteExceptions import com.google.protobuf.ByteString import com.google.protobuf.InvalidProtocolBufferException +import com.meshtastic.core.strings.getString import dagger.Lazy import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CancellationException @@ -86,6 +87,14 @@ import org.meshtastic.core.service.MeshServiceNotifications import org.meshtastic.core.service.SERVICE_NOTIFY_ID import org.meshtastic.core.service.ServiceAction import org.meshtastic.core.service.ServiceRepository +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.connected_count +import org.meshtastic.core.strings.critical_alert +import org.meshtastic.core.strings.device_sleeping +import org.meshtastic.core.strings.disconnected +import org.meshtastic.core.strings.error_duty_cycle +import org.meshtastic.core.strings.unknown_username +import org.meshtastic.core.strings.waypoint_received import org.meshtastic.proto.AdminProtos import org.meshtastic.proto.AppOnlyProtos import org.meshtastic.proto.ChannelProtos @@ -113,7 +122,6 @@ import java.util.UUID import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject import kotlin.math.absoluteValue -import org.meshtastic.core.strings.R as Res /** * Handles all the communication with android apps. Also keeps an internal model of the network state. diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotificationsImpl.kt b/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotificationsImpl.kt index 6b0c08746..d3074454d 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotificationsImpl.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotificationsImpl.kt @@ -28,7 +28,6 @@ import android.content.Intent import android.graphics.Color import android.media.AudioAttributes import android.media.RingtoneManager -import androidx.annotation.StringRes import androidx.core.app.NotificationCompat import androidx.core.app.Person import androidx.core.app.RemoteInput @@ -37,17 +36,32 @@ import androidx.core.net.toUri import com.geeksville.mesh.MainActivity import com.geeksville.mesh.R.raw import com.geeksville.mesh.service.ReplyReceiver.Companion.KEY_TEXT_REPLY +import com.meshtastic.core.strings.getString import dagger.hilt.android.qualifiers.ApplicationContext +import org.jetbrains.compose.resources.StringResource import org.meshtastic.core.database.entity.NodeEntity import org.meshtastic.core.model.util.formatUptime import org.meshtastic.core.navigation.DEEP_LINK_BASE_URI import org.meshtastic.core.service.MeshServiceNotifications import org.meshtastic.core.service.SERVICE_NOTIFY_ID +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.client_notification +import org.meshtastic.core.strings.low_battery_message +import org.meshtastic.core.strings.low_battery_title +import org.meshtastic.core.strings.meshtastic_alerts_notifications +import org.meshtastic.core.strings.meshtastic_broadcast_notifications +import org.meshtastic.core.strings.meshtastic_low_battery_notifications +import org.meshtastic.core.strings.meshtastic_low_battery_temporary_remote_notifications +import org.meshtastic.core.strings.meshtastic_messages_notifications +import org.meshtastic.core.strings.meshtastic_new_nodes_notifications +import org.meshtastic.core.strings.meshtastic_service_notifications +import org.meshtastic.core.strings.new_node_seen +import org.meshtastic.core.strings.no_local_stats +import org.meshtastic.core.strings.reply import org.meshtastic.proto.MeshProtos import org.meshtastic.proto.TelemetryProtos import org.meshtastic.proto.TelemetryProtos.LocalStats import javax.inject.Inject -import org.meshtastic.core.strings.R as Res /** * Manages the creation and display of all app notifications. @@ -73,7 +87,7 @@ class MeshServiceNotificationsImpl @Inject constructor(@ApplicationContext priva */ private sealed class NotificationType( val channelId: String, - @StringRes val channelNameRes: Int, + val channelNameRes: StringResource, val importance: Int, ) { object ServiceState : diff --git a/app/src/main/java/com/geeksville/mesh/ui/Main.kt b/app/src/main/java/com/geeksville/mesh/ui/Main.kt index 11a850874..62dba6474 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/Main.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/Main.kt @@ -21,7 +21,6 @@ package com.geeksville.mesh.ui import android.Manifest import android.os.Build -import androidx.annotation.StringRes import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.LinearEasing @@ -71,8 +70,6 @@ import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalResources -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavDestination @@ -100,6 +97,9 @@ import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.rememberPermissionState import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.getString +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.DeviceVersion import org.meshtastic.core.navigation.ConnectionsRoutes import org.meshtastic.core.navigation.ContactsRoutes @@ -108,6 +108,25 @@ import org.meshtastic.core.navigation.NodesRoutes import org.meshtastic.core.navigation.Route import org.meshtastic.core.navigation.SettingsRoutes import org.meshtastic.core.service.ConnectionState +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.app_too_old +import org.meshtastic.core.strings.bottom_nav_settings +import org.meshtastic.core.strings.client_notification +import org.meshtastic.core.strings.compromised_keys +import org.meshtastic.core.strings.connected +import org.meshtastic.core.strings.connections +import org.meshtastic.core.strings.conversations +import org.meshtastic.core.strings.device_sleeping +import org.meshtastic.core.strings.disconnected +import org.meshtastic.core.strings.firmware_old +import org.meshtastic.core.strings.firmware_too_old +import org.meshtastic.core.strings.map +import org.meshtastic.core.strings.must_update +import org.meshtastic.core.strings.nodes +import org.meshtastic.core.strings.okay +import org.meshtastic.core.strings.should_update +import org.meshtastic.core.strings.should_update_firmware +import org.meshtastic.core.strings.traceroute import org.meshtastic.core.ui.component.MultipleChoiceAlertDialog import org.meshtastic.core.ui.component.SimpleAlertDialog import org.meshtastic.core.ui.icon.Conversations @@ -122,9 +141,8 @@ import org.meshtastic.core.ui.theme.StatusColors.StatusGreen import org.meshtastic.feature.node.metrics.annotateTraceroute import org.meshtastic.proto.MeshProtos import timber.log.Timber -import org.meshtastic.core.strings.R as Res -enum class TopLevelDestination(@StringRes val label: Int, val icon: ImageVector, val route: Route) { +enum class TopLevelDestination(val label: StringResource, val icon: ImageVector, val route: Route) { Conversations(Res.string.conversations, MeshtasticIcons.Conversations, ContactsRoutes.ContactsGraph), Nodes(Res.string.nodes, MeshtasticIcons.Nodes, NodesRoutes.NodesGraph), Map(Res.string.map, MeshtasticIcons.Map, MapRoutes.Map), @@ -392,7 +410,6 @@ private fun VersionChecks(viewModel: UIViewModel) { val connectionState by viewModel.connectionState.collectAsStateWithLifecycle() val myNodeInfo by viewModel.myNodeInfo.collectAsStateWithLifecycle() val context = LocalContext.current - val resources = LocalResources.current val myFirmwareVersion = myNodeInfo?.firmwareVersion @@ -424,8 +441,8 @@ private fun VersionChecks(viewModel: UIViewModel) { val isOld = info.minAppVersion > BuildConfig.VERSION_CODE && BuildConfig.DEBUG.not() if (isOld) { viewModel.showAlert( - resources.getString(Res.string.app_too_old), - resources.getString(Res.string.must_update), + getString(Res.string.app_too_old), + getString(Res.string.must_update), dismissable = false, onConfirm = { val service = viewModel.meshService ?: return@showAlert @@ -436,8 +453,8 @@ private fun VersionChecks(viewModel: UIViewModel) { myFirmwareVersion?.let { val curVer = DeviceVersion(it) if (curVer < MeshService.absoluteMinDeviceVersion) { - val title = resources.getString(Res.string.firmware_too_old) - val message = resources.getString(Res.string.firmware_old) + val title = getString(Res.string.firmware_too_old) + val message = getString(Res.string.firmware_old) viewModel.showAlert( title = title, html = message, @@ -448,9 +465,8 @@ private fun VersionChecks(viewModel: UIViewModel) { }, ) } else if (curVer < MeshService.minDeviceVersion) { - val title = resources.getString(Res.string.should_update_firmware) - val message = - resources.getString(Res.string.should_update, latestStableFirmwareRelease.asString) + val title = getString(Res.string.should_update_firmware) + val message = getString(Res.string.should_update, latestStableFirmwareRelease.asString) viewModel.showAlert(title = title, message = message, dismissable = false, onConfirm = {}) } } diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsScreen.kt index 08232739d..d7b858cf9 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsScreen.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsScreen.kt @@ -46,8 +46,6 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp @@ -62,9 +60,20 @@ import com.geeksville.mesh.ui.connections.components.NetworkDevices import com.geeksville.mesh.ui.connections.components.UsbDevices import com.google.accompanist.permissions.ExperimentalPermissionsApi import kotlinx.coroutines.delay +import org.jetbrains.compose.resources.getString +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.navigation.Route import org.meshtastic.core.navigation.SettingsRoutes import org.meshtastic.core.service.ConnectionState +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.connected +import org.meshtastic.core.strings.connected_device +import org.meshtastic.core.strings.connected_sleeping +import org.meshtastic.core.strings.connections +import org.meshtastic.core.strings.must_set_region +import org.meshtastic.core.strings.not_connected +import org.meshtastic.core.strings.set_your_region +import org.meshtastic.core.strings.warning_not_paired import org.meshtastic.core.ui.component.ListItem import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.component.TitledCard @@ -73,7 +82,6 @@ import org.meshtastic.feature.settings.navigation.getNavRouteFrom import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.feature.settings.radio.component.PacketResponseStateDialog import org.meshtastic.proto.ConfigProtos -import org.meshtastic.core.strings.R as Res fun String?.isIPAddress(): Boolean = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { @Suppress("DEPRECATION") @@ -104,7 +112,6 @@ fun ConnectionsScreen( val connectionState by connectionsViewModel.connectionState.collectAsStateWithLifecycle(ConnectionState.DISCONNECTED) val scanning by scanModel.spinner.collectAsStateWithLifecycle(false) - val context = LocalContext.current val ourNode by connectionsViewModel.ourNodeInfo.collectAsStateWithLifecycle() val selectedDevice by scanModel.selectedNotNullFlow.collectAsStateWithLifecycle() val bluetoothState by connectionsViewModel.bluetoothState.collectAsStateWithLifecycle() @@ -158,7 +165,7 @@ fun ConnectionsScreen( ConnectionState.DISCONNECTED -> Res.string.not_connected ConnectionState.DEVICE_SLEEP -> Res.string.connected_sleeping - }.let { scanModel.setErrorText(context.getString(it)) } + }.let { scanModel.setErrorText(getString(it)) } } Scaffold( diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/components/BLEDevices.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/components/BLEDevices.kt index 69f3489f2..a91d6d8d3 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/connections/components/BLEDevices.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/connections/components/BLEDevices.kt @@ -43,7 +43,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.model.BTScanModel @@ -51,9 +50,20 @@ import com.geeksville.mesh.model.DeviceListEntry import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.MultiplePermissionsState import com.google.accompanist.permissions.rememberMultiplePermissionsState +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.service.ConnectionState +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.bluetooth_available_devices +import org.meshtastic.core.strings.bluetooth_disabled +import org.meshtastic.core.strings.bluetooth_paired_devices +import org.meshtastic.core.strings.grant_permissions +import org.meshtastic.core.strings.no_ble_devices +import org.meshtastic.core.strings.open_settings +import org.meshtastic.core.strings.permission_missing +import org.meshtastic.core.strings.permission_missing_31 +import org.meshtastic.core.strings.scan +import org.meshtastic.core.strings.scanning_bluetooth import org.meshtastic.core.ui.component.TitledCard -import org.meshtastic.core.strings.R as Res /** * Composable that displays a list of Bluetooth Low Energy (BLE) devices and allows scanning. It handles Bluetooth diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/components/ConnectionsSegmentedBar.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/components/ConnectionsSegmentedBar.kt index 7e5486a7f..1b5ed2de5 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/connections/components/ConnectionsSegmentedBar.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/connections/components/ConnectionsSegmentedBar.kt @@ -17,7 +17,6 @@ package com.geeksville.mesh.ui.connections.components -import androidx.annotation.StringRes import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.Bluetooth import androidx.compose.material.icons.rounded.Usb @@ -30,12 +29,16 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import com.geeksville.mesh.ui.connections.DeviceType +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.bluetooth +import org.meshtastic.core.strings.network +import org.meshtastic.core.strings.serial import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res @Suppress("LambdaParameterEventTrailing") @Composable @@ -58,7 +61,7 @@ fun ConnectionsSegmentedBar( } } -private enum class Item(val imageVector: ImageVector, @StringRes val textRes: Int, val deviceType: DeviceType) { +private enum class Item(val imageVector: ImageVector, val textRes: StringResource, val deviceType: DeviceType) { BLUETOOTH(imageVector = Icons.Rounded.Bluetooth, textRes = Res.string.bluetooth, deviceType = DeviceType.BLE), NETWORK(imageVector = Icons.Rounded.Wifi, textRes = Res.string.network, deviceType = DeviceType.TCP), SERIAL(imageVector = Icons.Rounded.Usb, textRes = Res.string.serial, deviceType = DeviceType.USB), diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/components/CurrentlyConnectedInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/components/CurrentlyConnectedInfo.kt index fbab227f0..42fe80b89 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/connections/components/CurrentlyConnectedInfo.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/connections/components/CurrentlyConnectedInfo.kt @@ -32,11 +32,14 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.RectangleShape -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.disconnect +import org.meshtastic.core.strings.firmware_version import org.meshtastic.core.ui.component.MaterialBatteryInfo import org.meshtastic.core.ui.component.NodeChip import org.meshtastic.core.ui.theme.AppTheme @@ -44,7 +47,6 @@ import org.meshtastic.core.ui.theme.StatusColors.StatusRed import org.meshtastic.proto.MeshProtos import org.meshtastic.proto.PaxcountProtos import org.meshtastic.proto.TelemetryProtos -import org.meshtastic.core.strings.R as Res /** Converts Bluetooth RSSI to a 0-4 bar signal strength level. */ @Composable diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/components/DeviceListItem.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/components/DeviceListItem.kt index 217486635..42c8f2219 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/connections/components/DeviceListItem.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/connections/components/DeviceListItem.kt @@ -33,9 +33,13 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import com.geeksville.mesh.model.DeviceListEntry -import org.meshtastic.core.strings.R as Res +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.add +import org.meshtastic.core.strings.bluetooth +import org.meshtastic.core.strings.network +import org.meshtastic.core.strings.serial @Suppress("LongMethod", "CyclomaticComplexMethod") @Composable diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/components/NetworkDevices.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/components/NetworkDevices.kt index 24852e198..146342281 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/connections/components/NetworkDevices.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/connections/components/NetworkDevices.kt @@ -46,7 +46,6 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.PreviewLightDark @@ -56,10 +55,20 @@ import com.geeksville.mesh.model.DeviceListEntry import com.geeksville.mesh.repository.network.NetworkRepository import com.geeksville.mesh.ui.connections.isIPAddress import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.service.ConnectionState +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.add_network_device +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.confirm_delete_node +import org.meshtastic.core.strings.delete +import org.meshtastic.core.strings.discovered_network_devices +import org.meshtastic.core.strings.ip_address +import org.meshtastic.core.strings.ip_port +import org.meshtastic.core.strings.no_network_devices +import org.meshtastic.core.strings.recent_network_devices import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res @OptIn(ExperimentalMaterial3Api::class) @Suppress("MagicNumber", "LongMethod") diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/components/UsbDevices.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/components/UsbDevices.kt index f99de96d7..df4a9cc18 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/connections/components/UsbDevices.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/connections/components/UsbDevices.kt @@ -21,14 +21,15 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.UsbOff import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewLightDark import com.geeksville.mesh.model.BTScanModel import com.geeksville.mesh.model.DeviceListEntry +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.service.ConnectionState +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.no_usb_devices import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res @Composable fun UsbDevices( diff --git a/app/src/main/java/com/geeksville/mesh/ui/contact/ContactItem.kt b/app/src/main/java/com/geeksville/mesh/ui/contact/ContactItem.kt index 37e4b9c81..881b3d537 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/contact/ContactItem.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/contact/ContactItem.kt @@ -44,7 +44,6 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.font.FontWeight @@ -53,10 +52,14 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import com.geeksville.mesh.model.Contact +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.sample_message +import org.meshtastic.core.strings.some_username +import org.meshtastic.core.strings.unknown_username import org.meshtastic.core.ui.component.SecurityIcon import org.meshtastic.core.ui.theme.AppTheme import org.meshtastic.proto.AppOnlyProtos -import org.meshtastic.core.strings.R as Res @Suppress("LongMethod") @Composable diff --git a/app/src/main/java/com/geeksville/mesh/ui/contact/Contacts.kt b/app/src/main/java/com/geeksville/mesh/ui/contact/Contacts.kt index d15997ce5..52079d58d 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/contact/Contacts.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/contact/Contacts.kt @@ -55,19 +55,37 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.compose.ui.res.pluralStringResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.model.Contact +import org.jetbrains.compose.resources.pluralStringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.entity.ContactSettings import org.meshtastic.core.model.util.formatMuteRemainingTime +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.close_selection +import org.meshtastic.core.strings.conversations +import org.meshtastic.core.strings.currently +import org.meshtastic.core.strings.delete +import org.meshtastic.core.strings.delete_messages +import org.meshtastic.core.strings.delete_selection +import org.meshtastic.core.strings.mute_1_week +import org.meshtastic.core.strings.mute_8_hours +import org.meshtastic.core.strings.mute_always +import org.meshtastic.core.strings.mute_notifications +import org.meshtastic.core.strings.mute_status_always +import org.meshtastic.core.strings.mute_status_muted_for_days +import org.meshtastic.core.strings.mute_status_muted_for_hours +import org.meshtastic.core.strings.mute_status_unmuted +import org.meshtastic.core.strings.okay +import org.meshtastic.core.strings.select_all +import org.meshtastic.core.strings.unmute import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.proto.AppOnlyProtos import java.util.concurrent.TimeUnit -import org.meshtastic.core.strings.R as Res @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Suppress("LongMethod") diff --git a/app/src/main/java/com/geeksville/mesh/ui/contact/ContactsViewModel.kt b/app/src/main/java/com/geeksville/mesh/ui/contact/ContactsViewModel.kt index 3a856b6eb..4165027a3 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/contact/ContactsViewModel.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/contact/ContactsViewModel.kt @@ -17,15 +17,14 @@ package com.geeksville.mesh.ui.contact -import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.geeksville.mesh.model.Contact import dagger.hilt.android.lifecycle.HiltViewModel -import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.getString import org.meshtastic.core.data.repository.NodeRepository import org.meshtastic.core.data.repository.PacketRepository import org.meshtastic.core.data.repository.RadioConfigRepository @@ -34,17 +33,17 @@ import org.meshtastic.core.model.DataPacket import org.meshtastic.core.model.util.getChannel import org.meshtastic.core.model.util.getShortDate import org.meshtastic.core.service.ServiceRepository +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.channel_name import org.meshtastic.core.ui.viewmodel.stateInWhileSubscribed import org.meshtastic.proto.channelSet import javax.inject.Inject import kotlin.collections.map -import org.meshtastic.core.strings.R as Res @HiltViewModel class ContactsViewModel @Inject constructor( - @ApplicationContext private val context: Context, private val nodeRepository: NodeRepository, private val packetRepository: PacketRepository, radioConfigRepository: RadioConfigRepository, @@ -87,7 +86,7 @@ constructor( val shortName = user.shortName val longName = if (toBroadcast) { - channelSet.getChannel(data.channel)?.name ?: context.getString(Res.string.channel_name) + channelSet.getChannel(data.channel)?.name ?: getString(Res.string.channel_name) } else { user.longName } diff --git a/app/src/main/java/com/geeksville/mesh/ui/sharing/Channel.kt b/app/src/main/java/com/geeksville/mesh/ui/sharing/Channel.kt index 3759f253e..fcbbeaf3c 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/sharing/Channel.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/sharing/Channel.kt @@ -78,7 +78,6 @@ import androidx.compose.ui.platform.LocalClipboard import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview @@ -94,12 +93,31 @@ import com.google.accompanist.permissions.rememberPermissionState import com.journeyapps.barcodescanner.ScanContract import com.journeyapps.barcodescanner.ScanOptions import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.Channel import org.meshtastic.core.model.util.getChannelUrl import org.meshtastic.core.model.util.qrCode import org.meshtastic.core.model.util.toChannelSet import org.meshtastic.core.navigation.Route import org.meshtastic.core.service.ConnectionState +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.add +import org.meshtastic.core.strings.apply +import org.meshtastic.core.strings.are_you_sure_change_default +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.cant_change_no_radio +import org.meshtastic.core.strings.channel_invalid +import org.meshtastic.core.strings.copy +import org.meshtastic.core.strings.edit +import org.meshtastic.core.strings.modem_preset +import org.meshtastic.core.strings.navigate_into_label +import org.meshtastic.core.strings.qr_code +import org.meshtastic.core.strings.replace +import org.meshtastic.core.strings.reset +import org.meshtastic.core.strings.reset_to_defaults +import org.meshtastic.core.strings.scan +import org.meshtastic.core.strings.send +import org.meshtastic.core.strings.url import org.meshtastic.core.ui.component.AdaptiveTwoPane import org.meshtastic.core.ui.component.ChannelSelection import org.meshtastic.core.ui.component.MainAppBar @@ -116,7 +134,6 @@ import org.meshtastic.proto.ConfigProtos import org.meshtastic.proto.channelSet import org.meshtastic.proto.copy import timber.log.Timber -import org.meshtastic.core.strings.R as Res /** * Composable screen for managing and sharing Meshtastic channels. Allows users to view, edit, and share channel diff --git a/app/src/main/java/com/geeksville/mesh/ui/sharing/Share.kt b/app/src/main/java/com/geeksville/mesh/ui/sharing/Share.kt index b6710fe32..b16ec8666 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/sharing/Share.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/sharing/Share.kt @@ -35,7 +35,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel @@ -43,9 +42,15 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.model.Contact import com.geeksville.mesh.ui.contact.ContactItem import com.geeksville.mesh.ui.contact.ContactsViewModel +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.sample_message +import org.meshtastic.core.strings.share +import org.meshtastic.core.strings.share_to +import org.meshtastic.core.strings.some_username +import org.meshtastic.core.strings.unknown_username import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res @Composable fun ShareScreen(viewModel: ContactsViewModel = hiltViewModel(), onConfirm: (String) -> Unit, onNavigateUp: () -> Unit) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 000000000..a7f9760ae --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,19 @@ + + + Meshtastic + diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 8f834eb0b..fc8710ab8 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -112,5 +112,10 @@ gradlePlugin { implementationClass = "SpotlessConventionPlugin" } + register("kmpLibrary") { + id = libs.plugins.meshtastic.kmp.library.get().pluginId + implementationClass = "KmpLibraryConventionPlugin" + } + } } diff --git a/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt new file mode 100644 index 000000000..3da6a596e --- /dev/null +++ b/build-logic/convention/src/main/kotlin/KmpLibraryConventionPlugin.kt @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2025 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +import com.android.build.api.dsl.androidLibrary +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.configure +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import java.io.FileInputStream +import java.util.Properties + +class KmpLibraryConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + apply(plugin = "org.jetbrains.kotlin.multiplatform") + apply(plugin = "org.jetbrains.kotlin.plugin.compose") + apply(plugin = "com.android.kotlin.multiplatform.library") + apply(plugin = "meshtastic.detekt") + apply(plugin = "meshtastic.spotless") + apply(plugin = "com.autonomousapps.dependency-analysis") + + val configPropertiesFile = rootProject.file("config.properties") + val configProperties = Properties() + + if (configPropertiesFile.exists()) { + FileInputStream(configPropertiesFile).use { configProperties.load(it) } + } + + extensions.configure { + @Suppress("UnstableApiUsage") + androidLibrary { + compileSdk = configProperties.getProperty("COMPILE_SDK").toInt() + minSdk = configProperties.getProperty("MIN_SDK").toInt() + } + } + } + } +} diff --git a/build.gradle.kts b/build.gradle.kts index e137f7e11..6a54d6bbd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,8 +19,10 @@ plugins { alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.kotlin.multiplatform.library) apply false alias(libs.plugins.android.library) apply false - alias(libs.plugins.compose) apply false + alias(libs.plugins.compose.compiler) apply false + alias(libs.plugins.compose.multiplatform) apply false alias(libs.plugins.datadog) apply false alias(libs.plugins.devtools.ksp) apply false alias(libs.plugins.firebase.crashlytics) apply false @@ -30,6 +32,7 @@ plugins { alias(libs.plugins.room) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.jvm) apply false + alias(libs.plugins.kotlin.multiplatform) apply false alias(libs.plugins.kotlin.parcelize) apply false alias(libs.plugins.kotlin.serialization) apply false alias(libs.plugins.ktorfit) apply false diff --git a/core/database/src/main/kotlin/org/meshtastic/core/database/model/Message.kt b/core/database/src/main/kotlin/org/meshtastic/core/database/model/Message.kt index 6e1fd0247..888f60096 100644 --- a/core/database/src/main/kotlin/org/meshtastic/core/database/model/Message.kt +++ b/core/database/src/main/kotlin/org/meshtastic/core/database/model/Message.kt @@ -17,15 +17,37 @@ package org.meshtastic.core.database.model -import androidx.annotation.StringRes +import org.jetbrains.compose.resources.StringResource import org.meshtastic.core.database.entity.Reaction import org.meshtastic.core.model.MessageStatus +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.delivery_confirmed +import org.meshtastic.core.strings.error +import org.meshtastic.core.strings.message_delivery_status +import org.meshtastic.core.strings.message_status_enroute +import org.meshtastic.core.strings.message_status_queued +import org.meshtastic.core.strings.routing_error_admin_bad_session_key +import org.meshtastic.core.strings.routing_error_admin_public_key_unauthorized +import org.meshtastic.core.strings.routing_error_bad_request +import org.meshtastic.core.strings.routing_error_duty_cycle_limit +import org.meshtastic.core.strings.routing_error_got_nak +import org.meshtastic.core.strings.routing_error_max_retransmit +import org.meshtastic.core.strings.routing_error_no_channel +import org.meshtastic.core.strings.routing_error_no_interface +import org.meshtastic.core.strings.routing_error_no_response +import org.meshtastic.core.strings.routing_error_no_route +import org.meshtastic.core.strings.routing_error_none +import org.meshtastic.core.strings.routing_error_not_authorized +import org.meshtastic.core.strings.routing_error_pki_failed +import org.meshtastic.core.strings.routing_error_pki_unknown_pubkey +import org.meshtastic.core.strings.routing_error_rate_limit_exceeded +import org.meshtastic.core.strings.routing_error_timeout +import org.meshtastic.core.strings.routing_error_too_large +import org.meshtastic.core.strings.unrecognized import org.meshtastic.proto.MeshProtos.Routing -import org.meshtastic.core.strings.R as Res @Suppress("CyclomaticComplexMethod") -@StringRes -fun getStringResFrom(routingError: Int): Int = when (routingError) { +fun getStringResFrom(routingError: Int): StringResource = when (routingError) { Routing.Error.NONE_VALUE -> Res.string.routing_error_none Routing.Error.NO_ROUTE_VALUE -> Res.string.routing_error_no_route Routing.Error.GOT_NAK_VALUE -> Res.string.routing_error_got_nak @@ -66,7 +88,7 @@ data class Message( val viaMqtt: Boolean = false, val relayNode: Int? = null, ) { - fun getStatusStringRes(): Pair { + fun getStatusStringRes(): Pair { val title = if (routingError > 0) Res.string.error else Res.string.message_delivery_status val text = when (status) { diff --git a/core/database/src/main/kotlin/org/meshtastic/core/database/model/NodeSortOption.kt b/core/database/src/main/kotlin/org/meshtastic/core/database/model/NodeSortOption.kt index 1726dd27d..d186341ef 100644 --- a/core/database/src/main/kotlin/org/meshtastic/core/database/model/NodeSortOption.kt +++ b/core/database/src/main/kotlin/org/meshtastic/core/database/model/NodeSortOption.kt @@ -17,10 +17,17 @@ package org.meshtastic.core.database.model -import androidx.annotation.StringRes -import org.meshtastic.core.strings.R as Res +import org.jetbrains.compose.resources.StringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.node_sort_alpha +import org.meshtastic.core.strings.node_sort_channel +import org.meshtastic.core.strings.node_sort_distance +import org.meshtastic.core.strings.node_sort_hops_away +import org.meshtastic.core.strings.node_sort_last_heard +import org.meshtastic.core.strings.node_sort_via_favorite +import org.meshtastic.core.strings.node_sort_via_mqtt -enum class NodeSortOption(val sqlValue: String, @StringRes val stringRes: Int) { +enum class NodeSortOption(val sqlValue: String, val stringRes: StringResource) { LAST_HEARD("last_heard", Res.string.node_sort_last_heard), ALPHABETICAL("alpha", Res.string.node_sort_alpha), DISTANCE("distance", Res.string.node_sort_distance), diff --git a/core/model/src/main/kotlin/org/meshtastic/core/model/ChannelOption.kt b/core/model/src/main/kotlin/org/meshtastic/core/model/ChannelOption.kt index 6bc564dba..1b80cf32f 100644 --- a/core/model/src/main/kotlin/org/meshtastic/core/model/ChannelOption.kt +++ b/core/model/src/main/kotlin/org/meshtastic/core/model/ChannelOption.kt @@ -17,12 +17,21 @@ package org.meshtastic.core.model -import androidx.annotation.StringRes +import org.jetbrains.compose.resources.StringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.label_long_fast +import org.meshtastic.core.strings.label_long_moderate +import org.meshtastic.core.strings.label_long_slow +import org.meshtastic.core.strings.label_medium_fast +import org.meshtastic.core.strings.label_medium_slow +import org.meshtastic.core.strings.label_short_fast +import org.meshtastic.core.strings.label_short_slow +import org.meshtastic.core.strings.label_short_turbo +import org.meshtastic.core.strings.label_very_long_slow import org.meshtastic.proto.ConfigProtos.Config.LoRaConfig import org.meshtastic.proto.ConfigProtos.Config.LoRaConfig.ModemPreset import org.meshtastic.proto.ConfigProtos.Config.LoRaConfig.RegionCode import kotlin.math.floor -import org.meshtastic.core.strings.R as Res /** hash a string into an integer using the djb2 algorithm by Dan Bernstein http://www.cse.yorku.ca/~oz/hash.html */ private fun hash(name: String): UInt { // using UInt instead of Long to match RadioInterface.cpp results @@ -296,7 +305,7 @@ enum class RegionInfo( } } -enum class ChannelOption(val modemPreset: ModemPreset, @StringRes val labelRes: Int, val bandwidth: Float) { +enum class ChannelOption(val modemPreset: ModemPreset, val labelRes: StringResource, val bandwidth: Float) { VERY_LONG_SLOW(ModemPreset.VERY_LONG_SLOW, Res.string.label_very_long_slow, .0625f), LONG_FAST(ModemPreset.LONG_FAST, Res.string.label_long_fast, .250f), LONG_MODERATE(ModemPreset.LONG_MODERATE, Res.string.label_long_moderate, .125f), diff --git a/core/strings/build.gradle.kts b/core/strings/build.gradle.kts index 6167108e4..fc672ed64 100644 --- a/core/strings/build.gradle.kts +++ b/core/strings/build.gradle.kts @@ -14,7 +14,30 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +import com.android.build.api.dsl.androidLibrary -plugins { alias(libs.plugins.meshtastic.android.library) } +plugins { + alias(libs.plugins.meshtastic.kmp.library) + alias(libs.plugins.compose.multiplatform) +} -android { namespace = "org.meshtastic.core.strings" } +kotlin { + @Suppress("UnstableApiUsage") + androidLibrary { + namespace = "org.meshtastic.core.strings" + androidResources.enable = true + } + + sourceSets { + commonMain.dependencies { + implementation(compose.runtime) + // API because consuming modules will always need this dependency + api(compose.components.resources) + } + } +} + +compose.resources { + publicResClass = true + packageOfResClass = "org.meshtastic.core.strings" +} diff --git a/core/strings/src/androidMain/kotlin/com/meshtastic/core/strings/ContextExt.kt b/core/strings/src/androidMain/kotlin/com/meshtastic/core/strings/ContextExt.kt new file mode 100644 index 000000000..dbd8709a8 --- /dev/null +++ b/core/strings/src/androidMain/kotlin/com/meshtastic/core/strings/ContextExt.kt @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2025 Meshtastic LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.meshtastic.core.strings + +import android.content.Context +import android.content.res.Resources +import kotlinx.coroutines.runBlocking +import org.jetbrains.compose.resources.StringResource + +fun Context.getString(stringResource: StringResource): String = runBlocking { + org.jetbrains.compose.resources.getString(stringResource) +} + +fun Context.getString(stringResource: StringResource, vararg formatArgs: Any): String = runBlocking { + org.jetbrains.compose.resources.getString(stringResource, *formatArgs) +} + +fun Resources.getString(stringResource: StringResource): String = runBlocking { + org.jetbrains.compose.resources.getString(stringResource) +} + +fun Resources.getString(stringResource: StringResource, vararg formatArgs: Any): String = runBlocking { + org.jetbrains.compose.resources.getString(stringResource, *formatArgs) +} diff --git a/core/strings/src/main/res/values-ar-rSA/strings.xml b/core/strings/src/commonMain/composeResources/values-ar/strings.xml similarity index 100% rename from core/strings/src/main/res/values-ar-rSA/strings.xml rename to core/strings/src/commonMain/composeResources/values-ar/strings.xml diff --git a/core/strings/src/main/res/values-be-rBY/strings.xml b/core/strings/src/commonMain/composeResources/values-be/strings.xml similarity index 100% rename from core/strings/src/main/res/values-be-rBY/strings.xml rename to core/strings/src/commonMain/composeResources/values-be/strings.xml diff --git a/core/strings/src/main/res/values-bg-rBG/strings.xml b/core/strings/src/commonMain/composeResources/values-bg/strings.xml similarity index 100% rename from core/strings/src/main/res/values-bg-rBG/strings.xml rename to core/strings/src/commonMain/composeResources/values-bg/strings.xml diff --git a/core/strings/src/main/res/values-ca-rES/strings.xml b/core/strings/src/commonMain/composeResources/values-ca/strings.xml similarity index 100% rename from core/strings/src/main/res/values-ca-rES/strings.xml rename to core/strings/src/commonMain/composeResources/values-ca/strings.xml diff --git a/core/strings/src/main/res/values-cs-rCZ/strings.xml b/core/strings/src/commonMain/composeResources/values-cs/strings.xml similarity index 100% rename from core/strings/src/main/res/values-cs-rCZ/strings.xml rename to core/strings/src/commonMain/composeResources/values-cs/strings.xml diff --git a/core/strings/src/main/res/values-de-rDE/strings.xml b/core/strings/src/commonMain/composeResources/values-de/strings.xml similarity index 100% rename from core/strings/src/main/res/values-de-rDE/strings.xml rename to core/strings/src/commonMain/composeResources/values-de/strings.xml diff --git a/core/strings/src/main/res/values-el-rGR/strings.xml b/core/strings/src/commonMain/composeResources/values-el/strings.xml similarity index 100% rename from core/strings/src/main/res/values-el-rGR/strings.xml rename to core/strings/src/commonMain/composeResources/values-el/strings.xml diff --git a/core/strings/src/main/res/values-es-rES/strings.xml b/core/strings/src/commonMain/composeResources/values-es/strings.xml similarity index 100% rename from core/strings/src/main/res/values-es-rES/strings.xml rename to core/strings/src/commonMain/composeResources/values-es/strings.xml diff --git a/core/strings/src/main/res/values-et-rEE/strings.xml b/core/strings/src/commonMain/composeResources/values-et/strings.xml similarity index 100% rename from core/strings/src/main/res/values-et-rEE/strings.xml rename to core/strings/src/commonMain/composeResources/values-et/strings.xml diff --git a/core/strings/src/main/res/values-fi-rFI/strings.xml b/core/strings/src/commonMain/composeResources/values-fi/strings.xml similarity index 100% rename from core/strings/src/main/res/values-fi-rFI/strings.xml rename to core/strings/src/commonMain/composeResources/values-fi/strings.xml diff --git a/core/strings/src/main/res/values-fr-rFR/strings.xml b/core/strings/src/commonMain/composeResources/values-fr/strings.xml similarity index 100% rename from core/strings/src/main/res/values-fr-rFR/strings.xml rename to core/strings/src/commonMain/composeResources/values-fr/strings.xml diff --git a/core/strings/src/main/res/values-ga-rIE/strings.xml b/core/strings/src/commonMain/composeResources/values-ga/strings.xml similarity index 100% rename from core/strings/src/main/res/values-ga-rIE/strings.xml rename to core/strings/src/commonMain/composeResources/values-ga/strings.xml diff --git a/core/strings/src/main/res/values-gl-rES/strings.xml b/core/strings/src/commonMain/composeResources/values-gl/strings.xml similarity index 100% rename from core/strings/src/main/res/values-gl-rES/strings.xml rename to core/strings/src/commonMain/composeResources/values-gl/strings.xml diff --git a/core/strings/src/main/res/values-hr-rHR/strings.xml b/core/strings/src/commonMain/composeResources/values-hr/strings.xml similarity index 100% rename from core/strings/src/main/res/values-hr-rHR/strings.xml rename to core/strings/src/commonMain/composeResources/values-hr/strings.xml diff --git a/core/strings/src/main/res/values-ht-rHT/strings.xml b/core/strings/src/commonMain/composeResources/values-ht/strings.xml similarity index 100% rename from core/strings/src/main/res/values-ht-rHT/strings.xml rename to core/strings/src/commonMain/composeResources/values-ht/strings.xml diff --git a/core/strings/src/main/res/values-hu-rHU/strings.xml b/core/strings/src/commonMain/composeResources/values-hu/strings.xml similarity index 100% rename from core/strings/src/main/res/values-hu-rHU/strings.xml rename to core/strings/src/commonMain/composeResources/values-hu/strings.xml diff --git a/core/strings/src/main/res/values-is-rIS/strings.xml b/core/strings/src/commonMain/composeResources/values-is/strings.xml similarity index 100% rename from core/strings/src/main/res/values-is-rIS/strings.xml rename to core/strings/src/commonMain/composeResources/values-is/strings.xml diff --git a/core/strings/src/main/res/values-it-rIT/strings.xml b/core/strings/src/commonMain/composeResources/values-it/strings.xml similarity index 100% rename from core/strings/src/main/res/values-it-rIT/strings.xml rename to core/strings/src/commonMain/composeResources/values-it/strings.xml diff --git a/core/strings/src/main/res/values-iw-rIL/strings.xml b/core/strings/src/commonMain/composeResources/values-iw/strings.xml similarity index 100% rename from core/strings/src/main/res/values-iw-rIL/strings.xml rename to core/strings/src/commonMain/composeResources/values-iw/strings.xml diff --git a/core/strings/src/main/res/values-ja-rJP/strings.xml b/core/strings/src/commonMain/composeResources/values-ja/strings.xml similarity index 100% rename from core/strings/src/main/res/values-ja-rJP/strings.xml rename to core/strings/src/commonMain/composeResources/values-ja/strings.xml diff --git a/core/strings/src/main/res/values-ko-rKR/strings.xml b/core/strings/src/commonMain/composeResources/values-ko/strings.xml similarity index 100% rename from core/strings/src/main/res/values-ko-rKR/strings.xml rename to core/strings/src/commonMain/composeResources/values-ko/strings.xml diff --git a/core/strings/src/main/res/values-lt-rLT/strings.xml b/core/strings/src/commonMain/composeResources/values-lt/strings.xml similarity index 100% rename from core/strings/src/main/res/values-lt-rLT/strings.xml rename to core/strings/src/commonMain/composeResources/values-lt/strings.xml diff --git a/core/strings/src/main/res/values-nl-rNL/strings.xml b/core/strings/src/commonMain/composeResources/values-nl/strings.xml similarity index 100% rename from core/strings/src/main/res/values-nl-rNL/strings.xml rename to core/strings/src/commonMain/composeResources/values-nl/strings.xml diff --git a/core/strings/src/main/res/values-no-rNO/strings.xml b/core/strings/src/commonMain/composeResources/values-no/strings.xml similarity index 100% rename from core/strings/src/main/res/values-no-rNO/strings.xml rename to core/strings/src/commonMain/composeResources/values-no/strings.xml diff --git a/core/strings/src/main/res/values-pl-rPL/strings.xml b/core/strings/src/commonMain/composeResources/values-pl/strings.xml similarity index 100% rename from core/strings/src/main/res/values-pl-rPL/strings.xml rename to core/strings/src/commonMain/composeResources/values-pl/strings.xml diff --git a/core/strings/src/main/res/values-pt-rBR/strings.xml b/core/strings/src/commonMain/composeResources/values-pt-rBR/strings.xml similarity index 100% rename from core/strings/src/main/res/values-pt-rBR/strings.xml rename to core/strings/src/commonMain/composeResources/values-pt-rBR/strings.xml diff --git a/core/strings/src/main/res/values-pt-rPT/strings.xml b/core/strings/src/commonMain/composeResources/values-pt/strings.xml similarity index 100% rename from core/strings/src/main/res/values-pt-rPT/strings.xml rename to core/strings/src/commonMain/composeResources/values-pt/strings.xml diff --git a/core/strings/src/main/res/values-ro-rRO/strings.xml b/core/strings/src/commonMain/composeResources/values-ro/strings.xml similarity index 100% rename from core/strings/src/main/res/values-ro-rRO/strings.xml rename to core/strings/src/commonMain/composeResources/values-ro/strings.xml diff --git a/core/strings/src/main/res/values-ru-rRU/strings.xml b/core/strings/src/commonMain/composeResources/values-ru/strings.xml similarity index 100% rename from core/strings/src/main/res/values-ru-rRU/strings.xml rename to core/strings/src/commonMain/composeResources/values-ru/strings.xml diff --git a/core/strings/src/main/res/values-sk-rSK/strings.xml b/core/strings/src/commonMain/composeResources/values-sk/strings.xml similarity index 100% rename from core/strings/src/main/res/values-sk-rSK/strings.xml rename to core/strings/src/commonMain/composeResources/values-sk/strings.xml diff --git a/core/strings/src/main/res/values-sl-rSI/strings.xml b/core/strings/src/commonMain/composeResources/values-sl/strings.xml similarity index 100% rename from core/strings/src/main/res/values-sl-rSI/strings.xml rename to core/strings/src/commonMain/composeResources/values-sl/strings.xml diff --git a/core/strings/src/main/res/values-sq-rAL/strings.xml b/core/strings/src/commonMain/composeResources/values-sq/strings.xml similarity index 100% rename from core/strings/src/main/res/values-sq-rAL/strings.xml rename to core/strings/src/commonMain/composeResources/values-sq/strings.xml diff --git a/core/strings/src/main/res/values-b+sr+Latn/strings.xml b/core/strings/src/commonMain/composeResources/values-sr/strings.xml similarity index 100% rename from core/strings/src/main/res/values-b+sr+Latn/strings.xml rename to core/strings/src/commonMain/composeResources/values-sr/strings.xml diff --git a/core/strings/src/main/res/values-srp/strings.xml b/core/strings/src/commonMain/composeResources/values-srp/strings.xml similarity index 100% rename from core/strings/src/main/res/values-srp/strings.xml rename to core/strings/src/commonMain/composeResources/values-srp/strings.xml diff --git a/core/strings/src/main/res/values-sv-rSE/strings.xml b/core/strings/src/commonMain/composeResources/values-sv/strings.xml similarity index 100% rename from core/strings/src/main/res/values-sv-rSE/strings.xml rename to core/strings/src/commonMain/composeResources/values-sv/strings.xml diff --git a/core/strings/src/main/res/values-tr-rTR/strings.xml b/core/strings/src/commonMain/composeResources/values-tr/strings.xml similarity index 100% rename from core/strings/src/main/res/values-tr-rTR/strings.xml rename to core/strings/src/commonMain/composeResources/values-tr/strings.xml diff --git a/core/strings/src/main/res/values-uk-rUA/strings.xml b/core/strings/src/commonMain/composeResources/values-uk/strings.xml similarity index 100% rename from core/strings/src/main/res/values-uk-rUA/strings.xml rename to core/strings/src/commonMain/composeResources/values-uk/strings.xml diff --git a/core/strings/src/main/res/values-zh-rCN/strings.xml b/core/strings/src/commonMain/composeResources/values-zh-rCN/strings.xml similarity index 100% rename from core/strings/src/main/res/values-zh-rCN/strings.xml rename to core/strings/src/commonMain/composeResources/values-zh-rCN/strings.xml diff --git a/core/strings/src/main/res/values-zh-rTW/strings.xml b/core/strings/src/commonMain/composeResources/values-zh-rTW/strings.xml similarity index 100% rename from core/strings/src/main/res/values-zh-rTW/strings.xml rename to core/strings/src/commonMain/composeResources/values-zh-rTW/strings.xml diff --git a/core/strings/src/main/res/values/strings.xml b/core/strings/src/commonMain/composeResources/values/strings.xml similarity index 99% rename from core/strings/src/main/res/values/strings.xml rename to core/strings/src/commonMain/composeResources/values/strings.xml index 0365fe458..62f305004 100644 --- a/core/strings/src/main/res/values/strings.xml +++ b/core/strings/src/commonMain/composeResources/values/strings.xml @@ -22,7 +22,6 @@ 简体中文 繁體中文 - Meshtastic SKH hey I found the cache, it is over here next to the big tiger. I\'m kinda scared. diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/AlertDialogs.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/AlertDialogs.kt index 06a36a7ef..6572499ff 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/AlertDialogs.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/AlertDialogs.kt @@ -29,7 +29,6 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.TextLinkStyles @@ -37,7 +36,9 @@ import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.fromHtml import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp -import org.meshtastic.core.strings.R as Res +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.okay @Composable fun SimpleAlertDialog( diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/BitwisePreference.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/BitwisePreference.kt index 330f170ab..920fc8b75 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/BitwisePreference.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/BitwisePreference.kt @@ -38,7 +38,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import org.meshtastic.core.strings.R as Res +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.clear +import org.meshtastic.core.strings.close @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/ClickableTextField.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/ClickableTextField.kt index 645494269..2d4accc60 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/ClickableTextField.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/ClickableTextField.kt @@ -17,7 +17,6 @@ package org.meshtastic.core.ui.component -import androidx.annotation.StringRes import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.material3.Icon @@ -28,11 +27,12 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource @Composable fun ClickableTextField( - @StringRes label: Int, + label: StringResource, enabled: Boolean, trailingIcon: ImageVector, value: String, diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/ContactSharing.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/ContactSharing.kt index 674459525..4d8f00cb8 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/ContactSharing.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/ContactSharing.kt @@ -40,7 +40,6 @@ import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.painter.BitmapPainter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.core.net.toUri @@ -55,15 +54,19 @@ import com.google.zxing.WriterException import com.journeyapps.barcodescanner.BarcodeEncoder import com.journeyapps.barcodescanner.ScanContract import com.journeyapps.barcodescanner.ScanOptions +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node import org.meshtastic.core.model.DeviceVersion +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.qr_code +import org.meshtastic.core.strings.scan_qr_code +import org.meshtastic.core.strings.share_contact import org.meshtastic.core.ui.R import org.meshtastic.core.ui.share.SharedContactDialog import org.meshtastic.proto.AdminProtos import org.meshtastic.proto.MeshProtos import timber.log.Timber import java.net.MalformedURLException -import org.meshtastic.core.strings.R as Res /** * Composable FloatingActionButton to initiate scanning a QR code for adding a contact. Handles camera permission diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/CopyIconButton.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/CopyIconButton.kt index 094ae2cbb..b8168904d 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/CopyIconButton.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/CopyIconButton.kt @@ -27,9 +27,10 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ClipEntry import androidx.compose.ui.platform.LocalClipboard -import androidx.compose.ui.res.stringResource import kotlinx.coroutines.launch -import org.meshtastic.core.strings.R as Res +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.copy @Composable fun CopyIconButton( diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditBase64Preference.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditBase64Preference.kt index a56288ae9..e8c017e85 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditBase64Preference.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditBase64Preference.kt @@ -39,16 +39,18 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.focus.onFocusChanged -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.google.protobuf.ByteString +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.Channel import org.meshtastic.core.model.util.encodeToString import org.meshtastic.core.model.util.toByteString -import org.meshtastic.core.strings.R as Res +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.error +import org.meshtastic.core.strings.reset @Suppress("LongMethod") @Composable diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditListPreference.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditListPreference.kt index ef0ca0886..23ed2fab0 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditListPreference.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditListPreference.kt @@ -35,17 +35,23 @@ import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.google.protobuf.ByteString +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.add +import org.meshtastic.core.strings.delete +import org.meshtastic.core.strings.gpio_pin +import org.meshtastic.core.strings.ignore_incoming +import org.meshtastic.core.strings.name +import org.meshtastic.core.strings.type import org.meshtastic.proto.ModuleConfigProtos.RemoteHardwarePin import org.meshtastic.proto.ModuleConfigProtos.RemoteHardwarePinType import org.meshtastic.proto.copy import org.meshtastic.proto.remoteHardwarePin -import org.meshtastic.core.strings.R as Res @Suppress("LongMethod") @Composable diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditPasswordPreference.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditPasswordPreference.kt index 36ca23e0e..da78d7f51 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditPasswordPreference.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditPasswordPreference.kt @@ -29,13 +29,15 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.tooling.preview.Preview -import org.meshtastic.core.strings.R as Res +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.hide_password +import org.meshtastic.core.strings.show_password @Composable fun EditPasswordPreference( diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditTextPreference.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditTextPreference.kt index 31506dcef..6f90570bd 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditTextPreference.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditTextPreference.kt @@ -38,13 +38,14 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusState import androidx.compose.ui.focus.onFocusEvent -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import org.meshtastic.core.strings.R as Res +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.error @Composable fun SignedIntegerEditTextPreference( diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/IndoorAirQuality.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/IndoorAirQuality.kt index 548b840c6..6b25b5969 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/IndoorAirQuality.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/IndoorAirQuality.kt @@ -51,12 +51,16 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.air_quality_icon +import org.meshtastic.core.strings.close +import org.meshtastic.core.strings.indoor_air_quality_iaq import org.meshtastic.core.ui.theme.IAQColors.IAQDangerouslyPolluted import org.meshtastic.core.ui.theme.IAQColors.IAQExcellent import org.meshtastic.core.ui.theme.IAQColors.IAQExtremelyPolluted @@ -65,7 +69,6 @@ import org.meshtastic.core.ui.theme.IAQColors.IAQHeavilyPolluted import org.meshtastic.core.ui.theme.IAQColors.IAQLightlyPolluted import org.meshtastic.core.ui.theme.IAQColors.IAQModeratelyPolluted import org.meshtastic.core.ui.theme.IAQColors.IAQSeverelyPolluted -import org.meshtastic.core.strings.R as Res @Suppress("MagicNumber") enum class Iaq(val color: Color, val description: String, val range: IntRange) { diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/LoraSignalIndicator.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/LoraSignalIndicator.kt index 47ad924da..a10910121 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/LoraSignalIndicator.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/LoraSignalIndicator.kt @@ -43,13 +43,22 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.bad +import org.meshtastic.core.strings.fair +import org.meshtastic.core.strings.good +import org.meshtastic.core.strings.none_quality +import org.meshtastic.core.strings.rssi +import org.meshtastic.core.strings.signal +import org.meshtastic.core.strings.signal_quality +import org.meshtastic.core.strings.snr import org.meshtastic.core.ui.theme.StatusColors.StatusGreen import org.meshtastic.core.ui.theme.StatusColors.StatusOrange import org.meshtastic.core.ui.theme.StatusColors.StatusRed import org.meshtastic.core.ui.theme.StatusColors.StatusYellow -import org.meshtastic.core.strings.R as Res const val SNR_GOOD_THRESHOLD = -7f const val SNR_FAIR_THRESHOLD = -15f @@ -59,7 +68,7 @@ const val RSSI_FAIR_THRESHOLD = -126 @Stable enum class Quality( - @Stable val nameRes: Int, + @Stable val nameRes: StringResource, @Stable val imageVector: ImageVector, @Stable val color: @Composable () -> Color, ) { diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MainAppBar.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MainAppBar.kt index e691506ed..75fe99393 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MainAppBar.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MainAppBar.kt @@ -33,17 +33,20 @@ import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node +import org.meshtastic.core.strings.R +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.application_icon +import org.meshtastic.core.strings.navigate_back import org.meshtastic.core.ui.component.preview.BooleanProvider import org.meshtastic.core.ui.component.preview.previewNode import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res @OptIn(ExperimentalMaterial3ExpressiveApi::class, ExperimentalMaterial3Api::class) @Composable diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MaterialBatteryInfo.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MaterialBatteryInfo.kt index 31d3a70b8..a854114fe 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MaterialBatteryInfo.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MaterialBatteryInfo.kt @@ -33,11 +33,13 @@ import androidx.compose.ui.draw.rotate import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.unknown import org.meshtastic.core.ui.icon.BatteryEmpty import org.meshtastic.core.ui.icon.BatteryUnknown import org.meshtastic.core.ui.icon.MeshtasticIcons @@ -45,7 +47,6 @@ import org.meshtastic.core.ui.theme.AppTheme import org.meshtastic.core.ui.theme.StatusColors.StatusGreen import org.meshtastic.core.ui.theme.StatusColors.StatusOrange import org.meshtastic.core.ui.theme.StatusColors.StatusRed -import org.meshtastic.core.strings.R as Res private const val FORMAT = "%d%%" private const val SIZE_ICON = 20 diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MaterialBluetoothSignalInfo.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MaterialBluetoothSignalInfo.kt index 961b12b06..c0dbe7c09 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MaterialBluetoothSignalInfo.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MaterialBluetoothSignalInfo.kt @@ -35,11 +35,13 @@ import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.rememberVectorPainter -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.dbm_value import org.meshtastic.core.ui.icon.MeshtasticIcons import org.meshtastic.core.ui.icon.SignalCellular0Bar import org.meshtastic.core.ui.icon.SignalCellular1Bar @@ -51,7 +53,6 @@ import org.meshtastic.core.ui.theme.StatusColors.StatusGreen import org.meshtastic.core.ui.theme.StatusColors.StatusOrange import org.meshtastic.core.ui.theme.StatusColors.StatusRed import org.meshtastic.core.ui.theme.StatusColors.StatusYellow -import org.meshtastic.core.strings.R as Res private const val SIZE_ICON = 20 diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/NodeKeyStatusIcon.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/NodeKeyStatusIcon.kt index 723b9b674..37c925a20 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/NodeKeyStatusIcon.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/NodeKeyStatusIcon.kt @@ -18,7 +18,6 @@ package org.meshtastic.core.ui.component import android.util.Base64 -import androidx.annotation.StringRes import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -53,19 +52,32 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import com.google.protobuf.ByteString +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.Channel +import org.meshtastic.core.strings.R +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.config_security_public_key +import org.meshtastic.core.strings.encryption_error +import org.meshtastic.core.strings.encryption_error_text +import org.meshtastic.core.strings.encryption_pkc +import org.meshtastic.core.strings.encryption_pkc_text +import org.meshtastic.core.strings.encryption_psk +import org.meshtastic.core.strings.encryption_psk_text +import org.meshtastic.core.strings.security_icon_help_dismiss +import org.meshtastic.core.strings.security_icon_help_show_all +import org.meshtastic.core.strings.security_icon_help_show_less +import org.meshtastic.core.strings.show_all_key_title import org.meshtastic.core.ui.theme.AppTheme import org.meshtastic.core.ui.theme.StatusColors.StatusGreen import org.meshtastic.core.ui.theme.StatusColors.StatusRed import org.meshtastic.core.ui.theme.StatusColors.StatusYellow -import org.meshtastic.core.strings.R as Res /** * function to display information about the current node's encryption key. @@ -131,9 +143,9 @@ fun NodeKeyStatusIcon( enum class NodeKeySecurityState( @Stable val icon: ImageVector, @Stable val color: @Composable () -> Color, - @StringRes val descriptionResId: Int, - @StringRes val helpTextResId: Int, - @Stable val title: Int, + val descriptionResId: StringResource, + val helpTextResId: StringResource, + @Stable val title: StringResource, ) { // State for public key mismatch PKM( @@ -164,7 +176,7 @@ enum class NodeKeySecurityState( } @Composable -private fun KeyStatusDialog(@StringRes title: Int, @StringRes text: Int, key: ByteString?, onDismiss: () -> Unit = {}) { +private fun KeyStatusDialog(title: StringResource, text: StringResource, key: ByteString?, onDismiss: () -> Unit = {}) { var showAll by rememberSaveable { mutableStateOf(false) } AlertDialog( modifier = Modifier, diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PositionPrecisionPreference.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PositionPrecisionPreference.kt index 83b4cb707..1b4c0a696 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PositionPrecisionPreference.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PositionPrecisionPreference.kt @@ -27,15 +27,17 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.util.DistanceUnit import org.meshtastic.core.model.util.toDistanceString +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.position_enabled +import org.meshtastic.core.strings.precise_location import kotlin.math.pow import kotlin.math.roundToInt -import org.meshtastic.core.strings.R as Res private const val POSITION_ENABLED = 32 private const val POSITION_DISABLED = 0 diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PreferenceFooter.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PreferenceFooter.kt index da0fcb01f..75024aba5 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PreferenceFooter.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PreferenceFooter.kt @@ -17,7 +17,6 @@ package org.meshtastic.core.ui.component -import androidx.annotation.StringRes import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth @@ -29,17 +28,18 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource @Deprecated(message = "Use overload that accepts Strings for button text.") @Composable fun PreferenceFooter( enabled: Boolean, - @StringRes negativeText: Int, + negativeText: StringResource, onNegativeClicked: () -> Unit, - @StringRes positiveText: Int, + positiveText: StringResource, onPositiveClicked: () -> Unit, modifier: Modifier = Modifier, ) { diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SecurityIcon.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SecurityIcon.kt index 421f15704..cd8bf3b7d 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SecurityIcon.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SecurityIcon.kt @@ -19,7 +19,6 @@ package org.meshtastic.core.ui.component -import androidx.annotation.StringRes import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -57,18 +56,34 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.Channel import org.meshtastic.core.model.util.getChannel +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.security_icon_badge_warning_description +import org.meshtastic.core.strings.security_icon_description +import org.meshtastic.core.strings.security_icon_help_dismiss +import org.meshtastic.core.strings.security_icon_help_green_lock +import org.meshtastic.core.strings.security_icon_help_red_open_lock +import org.meshtastic.core.strings.security_icon_help_show_all +import org.meshtastic.core.strings.security_icon_help_show_less +import org.meshtastic.core.strings.security_icon_help_title +import org.meshtastic.core.strings.security_icon_help_title_all +import org.meshtastic.core.strings.security_icon_help_warning_precise_mqtt +import org.meshtastic.core.strings.security_icon_help_yellow_open_lock +import org.meshtastic.core.strings.security_icon_insecure_no_precise +import org.meshtastic.core.strings.security_icon_insecure_precise_only +import org.meshtastic.core.strings.security_icon_secure +import org.meshtastic.core.strings.security_icon_warning_precise_mqtt import org.meshtastic.core.ui.theme.StatusColors.StatusGreen import org.meshtastic.core.ui.theme.StatusColors.StatusRed import org.meshtastic.core.ui.theme.StatusColors.StatusYellow import org.meshtastic.proto.AppOnlyProtos import org.meshtastic.proto.ChannelProtos.ChannelSettings import org.meshtastic.proto.ConfigProtos.Config.LoRaConfig -import org.meshtastic.core.strings.R as Res private const val PRECISE_POSITION_BITS = 32 @@ -87,8 +102,8 @@ private const val PRECISE_POSITION_BITS = 32 enum class SecurityState( @Stable val icon: ImageVector, @Stable val color: @Composable () -> Color, - @StringRes val descriptionResId: Int, - @StringRes val helpTextResId: Int, + val descriptionResId: StringResource, + val helpTextResId: StringResource, @Stable val badgeIcon: ImageVector? = null, @Stable val badgeIconColor: @Composable () -> Color? = { null }, ) { diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SignalInfo.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SignalInfo.kt index ba85cb3c3..651302a56 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SignalInfo.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SignalInfo.kt @@ -28,15 +28,19 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.channel_air_util +import org.meshtastic.core.strings.hops_away +import org.meshtastic.core.strings.signal +import org.meshtastic.core.strings.signal_quality import org.meshtastic.core.ui.component.preview.NodePreviewParameterProvider import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res const val MAX_VALID_SNR = 100F const val MAX_VALID_RSSI = 0 diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SimpleAlertDialog.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SimpleAlertDialog.kt index 17c71f42b..adc46a57c 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SimpleAlertDialog.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SimpleAlertDialog.kt @@ -17,7 +17,6 @@ package org.meshtastic.core.ui.component -import androidx.annotation.StringRes import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape @@ -28,16 +27,21 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.message +import org.meshtastic.core.strings.okay +import org.meshtastic.core.strings.sample_message import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res @Composable fun SimpleAlertDialog( - @StringRes title: Int, + title: StringResource, text: @Composable (() -> Unit)? = null, confirmText: String? = null, onConfirm: (() -> Unit)? = null, @@ -74,8 +78,8 @@ fun SimpleAlertDialog( @Composable fun SimpleAlertDialog( - @StringRes title: Int, - @StringRes text: Int, + title: StringResource, + text: StringResource, onConfirm: (() -> Unit)? = null, onDismiss: () -> Unit = {}, ) = SimpleAlertDialog( @@ -87,7 +91,7 @@ fun SimpleAlertDialog( @Composable fun SimpleAlertDialog( - @StringRes title: Int, + title: StringResource, text: String, onConfirm: (() -> Unit)? = null, onDismiss: () -> Unit = {}, diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/qr/ScannedQrCodeDialog.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/qr/ScannedQrCodeDialog.kt index bbf6dd0d8..a858d1ba3 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/qr/ScannedQrCodeDialog.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/qr/ScannedQrCodeDialog.kt @@ -43,7 +43,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp @@ -51,13 +50,19 @@ import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.Channel +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.accept +import org.meshtastic.core.strings.add +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.new_channel_rcvd +import org.meshtastic.core.strings.replace import org.meshtastic.core.ui.component.ChannelSelection import org.meshtastic.proto.AppOnlyProtos.ChannelSet import org.meshtastic.proto.ConfigProtos.Config.LoRaConfig.ModemPreset import org.meshtastic.proto.channelSet import org.meshtastic.proto.copy -import org.meshtastic.core.strings.R as Res @Composable fun ScannedQrCodeDialog( diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/share/SharedContactDialog.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/share/SharedContactDialog.kt index 44e1d5d50..f975ad3e1 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/share/SharedContactDialog.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/share/SharedContactDialog.kt @@ -23,14 +23,19 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.import_known_shared_contact_text +import org.meshtastic.core.strings.import_label +import org.meshtastic.core.strings.import_shared_contact +import org.meshtastic.core.strings.public_key_changed import org.meshtastic.core.ui.component.SimpleAlertDialog import org.meshtastic.core.ui.component.compareUsers import org.meshtastic.core.ui.component.userFieldsToString import org.meshtastic.proto.AdminProtos -import org.meshtastic.core.strings.R as Res /** A dialog for importing a shared contact that was scanned from a QR code. */ @Composable diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/util/ContextExtensions.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/util/ContextExtensions.kt index 55318db91..bde1ef263 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/util/ContextExtensions.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/util/ContextExtensions.kt @@ -19,16 +19,17 @@ package org.meshtastic.core.ui.util import android.content.Context import android.widget.Toast -import androidx.annotation.StringRes +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.getString -suspend fun Context.showToast(@StringRes resId: Int) { - showToast(getString(resId)) +suspend fun Context.showToast(stringResource: StringResource) { + showToast(getString(stringResource)) } -suspend fun Context.showToast(text: CharSequence) { +suspend fun Context.showToast(stringResource: StringResource, vararg formatArgs: Any) { + Toast.makeText(this, getString(stringResource, formatArgs), Toast.LENGTH_SHORT).show() +} + +suspend fun Context.showToast(text: String) { Toast.makeText(this, text, Toast.LENGTH_SHORT).show() } - -suspend fun Context.showToast(@StringRes resId: Int, vararg formatArgs: Any) { - Toast.makeText(this, getString(resId, formatArgs), Toast.LENGTH_SHORT).show() -} diff --git a/core/ui/src/main/kotlin/org/meshtastic/core/ui/util/ProtoExtensions.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/util/ProtoExtensions.kt index 1a102c59c..8d080a5bd 100644 --- a/core/ui/src/main/kotlin/org/meshtastic/core/ui/util/ProtoExtensions.kt +++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/util/ProtoExtensions.kt @@ -18,7 +18,9 @@ package org.meshtastic.core.ui.util import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.unknown_age import org.meshtastic.proto.ChannelProtos import org.meshtastic.proto.ChannelProtos.ChannelSettings import org.meshtastic.proto.MeshProtos @@ -28,7 +30,6 @@ import org.meshtastic.proto.channel import org.meshtastic.proto.channelSettings import java.text.DateFormat import kotlin.time.Duration.Companion.days -import org.meshtastic.core.strings.R as Res private const val SECONDS_TO_MILLIS = 1000L diff --git a/crowdin.yml b/crowdin.yml index 1d2d2c097..a045a3539 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -2,7 +2,7 @@ pull_request_labels: - automation - l10n files: - - source: /**/src/main/res/values/strings.xml + - source: /**/src/commonMain/composeResources/values/strings.xml translation: /%original_path%-%android_code%/strings.xml translate_attributes: 0 content_segmentation: 0 diff --git a/feature/intro/src/google/kotlin/org/meshtastic/feature/intro/AnalyticsIntro.kt b/feature/intro/src/google/kotlin/org/meshtastic/feature/intro/AnalyticsIntro.kt index 1175449f8..db951c818 100644 --- a/feature/intro/src/google/kotlin/org/meshtastic/feature/intro/AnalyticsIntro.kt +++ b/feature/intro/src/google/kotlin/org/meshtastic/feature/intro/AnalyticsIntro.kt @@ -24,12 +24,18 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.analytics_notice +import org.meshtastic.core.strings.analytics_platforms +import org.meshtastic.core.strings.datadog_link +import org.meshtastic.core.strings.firebase_link +import org.meshtastic.core.strings.for_more_information_see_our_privacy_policy +import org.meshtastic.core.strings.privacy_url import org.meshtastic.core.ui.component.AutoLinkText -import org.meshtastic.core.strings.R as Res @Composable fun AnalyticsIntro(modifier: Modifier = Modifier) { diff --git a/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/CriticalAlertsScreen.kt b/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/CriticalAlertsScreen.kt index a6b371aba..79b2a3ce8 100644 --- a/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/CriticalAlertsScreen.kt +++ b/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/CriticalAlertsScreen.kt @@ -30,11 +30,15 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import org.meshtastic.core.strings.R as Res +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.configure_critical_alerts +import org.meshtastic.core.strings.critical_alerts +import org.meshtastic.core.strings.critical_alerts_dnd_request_text +import org.meshtastic.core.strings.skip /** * Screen for explaining and guiding the user to configure critical alert settings. This screen is part of the app diff --git a/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/FeatureUIData.kt b/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/FeatureUIData.kt index 5bb669554..49f29ba6b 100644 --- a/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/FeatureUIData.kt +++ b/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/FeatureUIData.kt @@ -17,8 +17,8 @@ package org.meshtastic.feature.intro -import androidx.annotation.StringRes import androidx.compose.ui.graphics.vector.ImageVector +import org.jetbrains.compose.resources.StringResource /** * Data class representing the UI elements for a feature row in the app introduction. @@ -29,6 +29,6 @@ import androidx.compose.ui.graphics.vector.ImageVector */ internal data class FeatureUIData( val icon: ImageVector, - @StringRes val titleRes: Int? = null, - @StringRes val subtitleRes: Int, + val titleRes: StringResource? = null, + val subtitleRes: StringResource, ) diff --git a/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/IntroUiHelpers.kt b/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/IntroUiHelpers.kt index c081ba721..7d7c3600c 100644 --- a/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/IntroUiHelpers.kt +++ b/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/IntroUiHelpers.kt @@ -18,7 +18,6 @@ package org.meshtastic.feature.intro import android.content.Context -import androidx.annotation.StringRes import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth @@ -29,13 +28,14 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource /** Tag used for identifying clickable annotations in text, specifically for linking to settings. */ internal const val SETTINGS_TAG = "settings_link_tag" @@ -80,8 +80,8 @@ internal fun FeatureRow(feature: FeatureUIData) { */ @Composable internal fun Context.createClickableAnnotatedString( - @StringRes fullTextRes: Int, - @StringRes linkTextRes: Int, + fullTextRes: StringResource, + linkTextRes: StringResource, tag: String, ): AnnotatedString { val fullText = stringResource(fullTextRes) diff --git a/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/LocationScreen.kt b/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/LocationScreen.kt index f5fe4a7a5..f7185d3e2 100644 --- a/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/LocationScreen.kt +++ b/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/LocationScreen.kt @@ -26,7 +26,20 @@ import androidx.compose.material.icons.outlined.Router import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext -import org.meshtastic.core.strings.R as Res +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.configure_location_permissions +import org.meshtastic.core.strings.distance_filters +import org.meshtastic.core.strings.distance_filters_description +import org.meshtastic.core.strings.distance_measurements +import org.meshtastic.core.strings.distance_measurements_description +import org.meshtastic.core.strings.mesh_map_location +import org.meshtastic.core.strings.mesh_map_location_description +import org.meshtastic.core.strings.next +import org.meshtastic.core.strings.phone_location +import org.meshtastic.core.strings.phone_location_description +import org.meshtastic.core.strings.settings +import org.meshtastic.core.strings.share_location +import org.meshtastic.core.strings.share_location_description /** * Screen for configuring location permissions during the app introduction. It explains why location permissions are diff --git a/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/NotificationsScreen.kt b/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/NotificationsScreen.kt index e3ce2dd38..023fa86b2 100644 --- a/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/NotificationsScreen.kt +++ b/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/NotificationsScreen.kt @@ -33,11 +33,24 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import org.meshtastic.core.strings.R as Res +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.app_notifications +import org.meshtastic.core.strings.configure_notification_permissions +import org.meshtastic.core.strings.critical_alerts +import org.meshtastic.core.strings.critical_alerts_description +import org.meshtastic.core.strings.incoming_messages +import org.meshtastic.core.strings.low_battery +import org.meshtastic.core.strings.new_nodes +import org.meshtastic.core.strings.next +import org.meshtastic.core.strings.notification_permissions_description +import org.meshtastic.core.strings.notifications_for_channel_and_direct_messages +import org.meshtastic.core.strings.notifications_for_low_battery_alerts +import org.meshtastic.core.strings.notifications_for_newly_discovered_nodes +import org.meshtastic.core.strings.settings /** * Screen for configuring notification permissions during the app introduction. It explains why notification permissions diff --git a/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/PermissionScreenLayout.kt b/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/PermissionScreenLayout.kt index 92f49b9f1..f80456c03 100644 --- a/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/PermissionScreenLayout.kt +++ b/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/PermissionScreenLayout.kt @@ -17,7 +17,6 @@ package org.meshtastic.feature.intro -import androidx.annotation.StringRes import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer @@ -37,13 +36,15 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.input.pointer.pointerInput -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.TextLayoutResult import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import org.meshtastic.core.strings.R as Res +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.skip /** * A generic layout for screens within the app introduction flow. It typically presents a headline, a descriptive text @@ -60,13 +61,13 @@ import org.meshtastic.core.strings.R as Res */ @Composable internal fun PermissionScreenLayout( - @StringRes headlineRes: Int, + headlineRes: StringResource, annotatedDescription: AnnotatedString, features: List, additionalContent: (@Composable () -> Unit)? = null, onSkip: () -> Unit, onConfigure: () -> Unit, - @StringRes configureButtonTextRes: Int, + configureButtonTextRes: StringResource, onAnnotationClick: (String) -> Unit, ) { var textLayoutResult by remember { mutableStateOf(null) } diff --git a/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/WelcomeScreen.kt b/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/WelcomeScreen.kt index f0490c03f..fac0417fb 100644 --- a/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/WelcomeScreen.kt +++ b/feature/intro/src/main/kotlin/org/meshtastic/feature/intro/WelcomeScreen.kt @@ -35,12 +35,21 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import org.meshtastic.core.strings.R as Res +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.communicate_off_the_grid +import org.meshtastic.core.strings.create_your_own_networks +import org.meshtastic.core.strings.easily_set_up_private_mesh_networks +import org.meshtastic.core.strings.get_started +import org.meshtastic.core.strings.intro_welcome +import org.meshtastic.core.strings.meshtastic +import org.meshtastic.core.strings.share_your_location_in_real_time +import org.meshtastic.core.strings.stay_connected_anywhere +import org.meshtastic.core.strings.track_and_share_locations /** * The initial welcome screen for the app introduction flow. It displays a brief overview of the app's key features. diff --git a/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/MapView.kt b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/MapView.kt index ea9b60c4c..5a7dce196 100644 --- a/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/MapView.kt +++ b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/MapView.kt @@ -58,7 +58,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalResources -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel @@ -66,13 +65,47 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.accompanist.permissions.ExperimentalPermissionsApi // Added for Accompanist import com.google.accompanist.permissions.rememberMultiplePermissionsState // Added for Accompanist import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.meshtastic.core.strings.getString import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.getString +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.common.gpsDisabled import org.meshtastic.core.common.hasGps import org.meshtastic.core.database.entity.Packet import org.meshtastic.core.database.model.Node import org.meshtastic.core.model.DataPacket import org.meshtastic.core.model.util.formatAgo +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.calculating +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.clear +import org.meshtastic.core.strings.close +import org.meshtastic.core.strings.delete_for_everyone +import org.meshtastic.core.strings.delete_for_me +import org.meshtastic.core.strings.expires +import org.meshtastic.core.strings.location_disabled +import org.meshtastic.core.strings.map_cache_info +import org.meshtastic.core.strings.map_cache_manager +import org.meshtastic.core.strings.map_cache_size +import org.meshtastic.core.strings.map_cache_tiles +import org.meshtastic.core.strings.map_clear_tiles +import org.meshtastic.core.strings.map_download_complete +import org.meshtastic.core.strings.map_download_errors +import org.meshtastic.core.strings.map_download_region +import org.meshtastic.core.strings.map_filter +import org.meshtastic.core.strings.map_node_popup_details +import org.meshtastic.core.strings.map_offline_manager +import org.meshtastic.core.strings.map_purge_fail +import org.meshtastic.core.strings.map_purge_success +import org.meshtastic.core.strings.map_style_selection +import org.meshtastic.core.strings.map_subDescription +import org.meshtastic.core.strings.map_tile_source +import org.meshtastic.core.strings.only_favorites +import org.meshtastic.core.strings.show_precision_circle +import org.meshtastic.core.strings.show_waypoints +import org.meshtastic.core.strings.toggle_my_position +import org.meshtastic.core.strings.waypoint_delete +import org.meshtastic.core.strings.you import org.meshtastic.core.ui.util.showToast import org.meshtastic.feature.map.cluster.RadiusMarkerClusterer import org.meshtastic.feature.map.component.CacheLayout @@ -106,7 +139,6 @@ import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay import timber.log.Timber import java.io.File import java.text.DateFormat -import org.meshtastic.core.strings.R as Res @Composable private fun MapView.UpdateMarkers( @@ -186,7 +218,7 @@ private fun Context.purgeTileSource(onResult: (String) -> Unit) { val b = cache.purgeCache(item.source) onResult( if (b) { - getString(Res.string.map_purge_success, item.source) + getString(Res.string.map_purge_success, item.source.toString()) } else { getString(Res.string.map_purge_fail) }, @@ -336,7 +368,8 @@ fun MapView(mapViewModel: MapViewModel = hiltViewModel(), navigateToNodeDetails: if (node.batteryStr != "") node.batteryStr else "?", ) ourNode?.distanceStr(node, displayUnits)?.let { dist -> - subDescription = resources.getString(Res.string.map_subDescription, ourNode.bearing(node), dist) + subDescription = + resources.getString(Res.string.map_subDescription, ourNode.bearing(node).toString(), dist) } setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM) position = nodePosition @@ -460,7 +493,7 @@ fun MapView(mapViewModel: MapViewModel = hiltViewModel(), navigateToNodeDetails: val currentCacheUsage = cacheManager.currentCacheUsage() val mapCacheInfoText = - resources.getString( + getString( Res.string.map_cache_info, cacheCapacity / (1024.0 * 1024.0), currentCacheUsage / (1024.0 * 1024.0), diff --git a/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/CacheLayout.kt b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/CacheLayout.kt index 55855aee3..0e2a7a539 100644 --- a/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/CacheLayout.kt +++ b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/CacheLayout.kt @@ -32,11 +32,15 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import org.meshtastic.core.strings.R as Res +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.map_select_download_region +import org.meshtastic.core.strings.map_start_download +import org.meshtastic.core.strings.map_tile_download_estimate @OptIn(ExperimentalLayoutApi::class) @Composable diff --git a/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/DownloadButton.kt b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/DownloadButton.kt index af55d723a..42cadeb73 100644 --- a/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/DownloadButton.kt +++ b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/DownloadButton.kt @@ -30,8 +30,9 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.scale -import androidx.compose.ui.res.stringResource -import org.meshtastic.core.strings.R as Res +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.map_download_region @Composable fun DownloadButton(enabled: Boolean, onClick: () -> Unit) { diff --git a/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/EditWaypointDialog.kt b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/EditWaypointDialog.kt index 13c134e0a..611781d81 100644 --- a/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/EditWaypointDialog.kt +++ b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/EditWaypointDialog.kt @@ -56,7 +56,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType @@ -64,6 +63,19 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.date +import org.meshtastic.core.strings.delete +import org.meshtastic.core.strings.description +import org.meshtastic.core.strings.expires +import org.meshtastic.core.strings.locked +import org.meshtastic.core.strings.name +import org.meshtastic.core.strings.send +import org.meshtastic.core.strings.time +import org.meshtastic.core.strings.waypoint_edit +import org.meshtastic.core.strings.waypoint_new import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.emoji.EmojiPickerDialog import org.meshtastic.core.ui.theme.AppTheme @@ -73,7 +85,6 @@ import org.meshtastic.proto.waypoint import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale -import org.meshtastic.core.strings.R as Res @Suppress("LongMethod") @OptIn(ExperimentalLayoutApi::class) diff --git a/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/MapButton.kt b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/MapButton.kt index 969d67c0c..5ced0960d 100644 --- a/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/MapButton.kt +++ b/feature/map/src/fdroid/kotlin/org/meshtastic/feature/map/component/MapButton.kt @@ -17,7 +17,6 @@ package org.meshtastic.feature.map.component -import androidx.annotation.StringRes import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Layers @@ -26,16 +25,18 @@ import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.map_style_selection import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res @Composable fun MapButton( icon: ImageVector, - @StringRes contentDescription: Int, + contentDescription: StringResource, modifier: Modifier = Modifier, onClick: () -> Unit = {}, ) { diff --git a/feature/map/src/google/kotlin/org/meshtastic/feature/map/MapView.kt b/feature/map/src/google/kotlin/org/meshtastic/feature/map/MapView.kt index 7d9d61329..dbf9b2df7 100644 --- a/feature/map/src/google/kotlin/org/meshtastic/feature/map/MapView.kt +++ b/feature/map/src/google/kotlin/org/meshtastic/feature/map/MapView.kt @@ -58,7 +58,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.graphics.createBitmap import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel @@ -90,12 +89,23 @@ import com.google.maps.android.compose.rememberUpdatedMarkerState import com.google.maps.android.compose.widgets.ScaleBar import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node import org.meshtastic.core.model.util.formatAgo import org.meshtastic.core.model.util.metersIn import org.meshtastic.core.model.util.mpsToKmph import org.meshtastic.core.model.util.mpsToMph import org.meshtastic.core.model.util.toString +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.alt +import org.meshtastic.core.strings.heading +import org.meshtastic.core.strings.latitude +import org.meshtastic.core.strings.longitude +import org.meshtastic.core.strings.position +import org.meshtastic.core.strings.sats +import org.meshtastic.core.strings.speed +import org.meshtastic.core.strings.timestamp +import org.meshtastic.core.strings.track_point import org.meshtastic.core.ui.component.NodeChip import org.meshtastic.core.ui.util.formatPositionTime import org.meshtastic.feature.map.component.ClusterItemsListDialog @@ -113,7 +123,6 @@ import org.meshtastic.proto.copy import org.meshtastic.proto.waypoint import timber.log.Timber import java.text.DateFormat -import org.meshtastic.core.strings.R as Res private const val MIN_TRACK_POINT_DISTANCE_METERS = 20f private const val DEG_D = 1e-7 diff --git a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/ClusterItemsListDialog.kt b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/ClusterItemsListDialog.kt index cd8123f65..aea1f1114 100644 --- a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/ClusterItemsListDialog.kt +++ b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/ClusterItemsListDialog.kt @@ -29,11 +29,13 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.nodes_at_this_location +import org.meshtastic.core.strings.okay import org.meshtastic.core.ui.component.NodeChip import org.meshtastic.feature.map.model.NodeClusterItem -import org.meshtastic.core.strings.R as Res @Composable fun ClusterItemsListDialog( diff --git a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/CustomMapLayersSheet.kt b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/CustomMapLayersSheet.kt index 0f14fc398..637a1e653 100644 --- a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/CustomMapLayersSheet.kt +++ b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/CustomMapLayersSheet.kt @@ -37,10 +37,17 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.add_layer +import org.meshtastic.core.strings.hide_layer +import org.meshtastic.core.strings.manage_map_layers +import org.meshtastic.core.strings.map_layer_formats +import org.meshtastic.core.strings.no_map_layers_loaded +import org.meshtastic.core.strings.remove_layer +import org.meshtastic.core.strings.show_layer import org.meshtastic.feature.map.MapLayerItem -import org.meshtastic.core.strings.R as Res @Suppress("LongMethod") @Composable diff --git a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/CustomTileProviderManagerSheet.kt b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/CustomTileProviderManagerSheet.kt index da2850657..7ac3d3266 100644 --- a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/CustomTileProviderManagerSheet.kt +++ b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/CustomTileProviderManagerSheet.kt @@ -47,14 +47,28 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import kotlinx.coroutines.flow.collectLatest +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.data.model.CustomTileProviderConfig +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.add_custom_tile_source +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.delete_custom_tile_source +import org.meshtastic.core.strings.edit_custom_tile_source +import org.meshtastic.core.strings.manage_custom_tile_sources +import org.meshtastic.core.strings.name +import org.meshtastic.core.strings.name_cannot_be_empty +import org.meshtastic.core.strings.no_custom_tile_sources_found +import org.meshtastic.core.strings.provider_name_exists +import org.meshtastic.core.strings.save +import org.meshtastic.core.strings.url_cannot_be_empty +import org.meshtastic.core.strings.url_must_contain_placeholders +import org.meshtastic.core.strings.url_template +import org.meshtastic.core.strings.url_template_hint import org.meshtastic.core.ui.util.showToast import org.meshtastic.feature.map.MapViewModel -import org.meshtastic.core.strings.R as Res @Suppress("LongMethod") @Composable diff --git a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/EditWaypointDialog.kt b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/EditWaypointDialog.kt index db6d34056..d8a588f73 100644 --- a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/EditWaypointDialog.kt +++ b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/EditWaypointDialog.kt @@ -55,13 +55,25 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.date +import org.meshtastic.core.strings.delete +import org.meshtastic.core.strings.description +import org.meshtastic.core.strings.expires +import org.meshtastic.core.strings.locked +import org.meshtastic.core.strings.name +import org.meshtastic.core.strings.send +import org.meshtastic.core.strings.time +import org.meshtastic.core.strings.waypoint_edit +import org.meshtastic.core.strings.waypoint_new import org.meshtastic.core.ui.emoji.EmojiPickerDialog import org.meshtastic.proto.MeshProtos.Waypoint import org.meshtastic.proto.copy @@ -69,7 +81,6 @@ import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale import java.util.TimeZone -import org.meshtastic.core.strings.R as Res @OptIn(ExperimentalMaterial3Api::class) @Suppress("LongMethod", "CyclomaticComplexMethod", "MagicNumber") diff --git a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/MapControlsOverlay.kt b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/MapControlsOverlay.kt index ada93543d..72cc94268 100644 --- a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/MapControlsOverlay.kt +++ b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/MapControlsOverlay.kt @@ -32,10 +32,15 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.rotate -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.manage_map_layers +import org.meshtastic.core.strings.map_filter +import org.meshtastic.core.strings.map_tile_source +import org.meshtastic.core.strings.orient_north +import org.meshtastic.core.strings.toggle_my_position import org.meshtastic.core.ui.theme.StatusColors.StatusRed import org.meshtastic.feature.map.MapViewModel -import org.meshtastic.core.strings.R as Res @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable diff --git a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/MapFilterDropdown.kt b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/MapFilterDropdown.kt index 65a9e417e..c9bcbbca4 100644 --- a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/MapFilterDropdown.kt +++ b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/MapFilterDropdown.kt @@ -37,13 +37,17 @@ import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.last_heard_filter_label +import org.meshtastic.core.strings.only_favorites +import org.meshtastic.core.strings.show_precision_circle +import org.meshtastic.core.strings.show_waypoints import org.meshtastic.feature.map.LastHeardFilter import org.meshtastic.feature.map.MapViewModel import kotlin.math.roundToInt -import org.meshtastic.core.strings.R as Res @Composable internal fun MapFilterDropdown(expanded: Boolean, onDismissRequest: () -> Unit, mapViewModel: MapViewModel) { diff --git a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/MapTypeDropdown.kt b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/MapTypeDropdown.kt index e08d25232..6a6fc7480 100644 --- a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/MapTypeDropdown.kt +++ b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/MapTypeDropdown.kt @@ -26,11 +26,17 @@ import androidx.compose.material3.Icon import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.ui.res.stringResource import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.maps.android.compose.MapType +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.manage_custom_tile_sources +import org.meshtastic.core.strings.map_type_hybrid +import org.meshtastic.core.strings.map_type_normal +import org.meshtastic.core.strings.map_type_satellite +import org.meshtastic.core.strings.map_type_terrain +import org.meshtastic.core.strings.selected_map_type import org.meshtastic.feature.map.MapViewModel -import org.meshtastic.core.strings.R as Res @Suppress("LongMethod") @Composable diff --git a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/WaypointMarkers.kt b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/WaypointMarkers.kt index 92d4fcbe6..89ae93a40 100644 --- a/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/WaypointMarkers.kt +++ b/feature/map/src/google/kotlin/org/meshtastic/feature/map/component/WaypointMarkers.kt @@ -25,10 +25,11 @@ import com.google.android.gms.maps.model.LatLng import com.google.maps.android.compose.Marker import com.google.maps.android.compose.rememberUpdatedMarkerState import kotlinx.coroutines.launch +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.locked import org.meshtastic.core.ui.util.showToast import org.meshtastic.feature.map.BaseMapViewModel import org.meshtastic.proto.MeshProtos -import org.meshtastic.core.strings.R as Res private const val DEG_D = 1e-7 diff --git a/feature/map/src/main/kotlin/org/meshtastic/feature/map/BaseMapViewModel.kt b/feature/map/src/main/kotlin/org/meshtastic/feature/map/BaseMapViewModel.kt index 8ca75139a..218b3e82c 100644 --- a/feature/map/src/main/kotlin/org/meshtastic/feature/map/BaseMapViewModel.kt +++ b/feature/map/src/main/kotlin/org/meshtastic/feature/map/BaseMapViewModel.kt @@ -18,7 +18,6 @@ package org.meshtastic.feature.map import android.os.RemoteException -import androidx.annotation.StringRes import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers @@ -28,6 +27,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.StringResource import org.meshtastic.core.data.repository.NodeRepository import org.meshtastic.core.data.repository.PacketRepository import org.meshtastic.core.database.entity.Packet @@ -35,14 +35,19 @@ import org.meshtastic.core.database.model.Node import org.meshtastic.core.model.DataPacket import org.meshtastic.core.prefs.map.MapPrefs import org.meshtastic.core.service.ServiceRepository +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.any +import org.meshtastic.core.strings.eight_hours +import org.meshtastic.core.strings.one_day +import org.meshtastic.core.strings.one_hour +import org.meshtastic.core.strings.two_days import org.meshtastic.core.ui.viewmodel.stateInWhileSubscribed import org.meshtastic.proto.MeshProtos import timber.log.Timber import java.util.concurrent.TimeUnit -import org.meshtastic.core.strings.R as Res @Suppress("MagicNumber") -sealed class LastHeardFilter(val seconds: Long, @StringRes val label: Int) { +sealed class LastHeardFilter(val seconds: Long, val label: StringResource) { data object Any : LastHeardFilter(0L, Res.string.any) data object OneHour : LastHeardFilter(TimeUnit.HOURS.toSeconds(1), Res.string.one_hour) diff --git a/feature/map/src/main/kotlin/org/meshtastic/feature/map/MapScreen.kt b/feature/map/src/main/kotlin/org/meshtastic/feature/map/MapScreen.kt index 557870b03..7a31fbea2 100644 --- a/feature/map/src/main/kotlin/org/meshtastic/feature/map/MapScreen.kt +++ b/feature/map/src/main/kotlin/org/meshtastic/feature/map/MapScreen.kt @@ -23,11 +23,12 @@ import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.map import org.meshtastic.core.ui.component.MainAppBar -import org.meshtastic.core.strings.R as Res @Composable fun MapScreen( diff --git a/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/Message.kt b/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/Message.kt index a3ee6a080..95e69d344 100644 --- a/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/Message.kt +++ b/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/Message.kt @@ -85,7 +85,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalClipboard import androidx.compose.ui.res.pluralStringResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow @@ -95,18 +94,42 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.pluralStringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.entity.QuickChatAction import org.meshtastic.core.database.model.Message import org.meshtastic.core.database.model.Node import org.meshtastic.core.model.DataPacket import org.meshtastic.core.model.util.getChannel +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.alert_bell_text +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.cancel_reply +import org.meshtastic.core.strings.clear_selection +import org.meshtastic.core.strings.copy +import org.meshtastic.core.strings.delete +import org.meshtastic.core.strings.delete_messages +import org.meshtastic.core.strings.delete_messages_title +import org.meshtastic.core.strings.message_input_label +import org.meshtastic.core.strings.navigate_back +import org.meshtastic.core.strings.overflow_menu +import org.meshtastic.core.strings.quick_chat +import org.meshtastic.core.strings.quick_chat_hide +import org.meshtastic.core.strings.quick_chat_show +import org.meshtastic.core.strings.reply +import org.meshtastic.core.strings.replying_to +import org.meshtastic.core.strings.scroll_to_bottom +import org.meshtastic.core.strings.select_all +import org.meshtastic.core.strings.send +import org.meshtastic.core.strings.type_a_message +import org.meshtastic.core.strings.unknown +import org.meshtastic.core.strings.unknown_channel import org.meshtastic.core.ui.component.NodeKeyStatusIcon import org.meshtastic.core.ui.component.SecurityIcon import org.meshtastic.core.ui.component.SharedContactDialog import org.meshtastic.core.ui.theme.AppTheme import org.meshtastic.proto.AppOnlyProtos import java.nio.charset.StandardCharsets -import org.meshtastic.core.strings.R as Res private const val MESSAGE_CHARACTER_LIMIT_BYTES = 200 private const val SNIPPET_CHARACTER_LIMIT = 50 diff --git a/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/MessageList.kt b/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/MessageList.kt index 25d8f0703..ae2e5d3c3 100644 --- a/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/MessageList.kt +++ b/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/MessageList.kt @@ -17,7 +17,6 @@ package org.meshtastic.feature.messaging -import androidx.annotation.StringRes import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth @@ -45,26 +44,30 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.entity.Packet import org.meshtastic.core.database.entity.Reaction import org.meshtastic.core.database.model.Message import org.meshtastic.core.database.model.Node import org.meshtastic.core.model.MessageStatus +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.close +import org.meshtastic.core.strings.relayed_by +import org.meshtastic.core.strings.resend import org.meshtastic.feature.messaging.component.MessageItem import org.meshtastic.feature.messaging.component.ReactionDialog -import org.meshtastic.core.strings.R as Res @Composable fun DeliveryInfo( - @StringRes title: Int, - @StringRes text: Int? = null, + title: StringResource, + text: StringResource? = null, relayNodeName: String? = null, onConfirm: (() -> Unit) = {}, onDismiss: () -> Unit = {}, diff --git a/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/QuickChat.kt b/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/QuickChat.kt index dce9c51db..6a7c1baa4 100644 --- a/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/QuickChat.kt +++ b/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/QuickChat.kt @@ -64,20 +64,31 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.onFocusEvent import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.entity.QuickChatAction +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.add +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.delete +import org.meshtastic.core.strings.message +import org.meshtastic.core.strings.name +import org.meshtastic.core.strings.quick_chat +import org.meshtastic.core.strings.quick_chat_append +import org.meshtastic.core.strings.quick_chat_edit +import org.meshtastic.core.strings.quick_chat_instant +import org.meshtastic.core.strings.quick_chat_new +import org.meshtastic.core.strings.save import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.component.dragContainer import org.meshtastic.core.ui.component.dragDropItemsIndexed import org.meshtastic.core.ui.component.rememberDragDropState import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res @Composable fun QuickChatScreen( diff --git a/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/component/MessageActions.kt b/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/component/MessageActions.kt index 793f393d6..2ef223feb 100644 --- a/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/component/MessageActions.kt +++ b/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/component/MessageActions.kt @@ -38,10 +38,13 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.MessageStatus +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.message_delivery_status +import org.meshtastic.core.strings.react +import org.meshtastic.core.strings.reply import org.meshtastic.core.ui.emoji.EmojiPickerDialog -import org.meshtastic.core.strings.R as Res @Composable internal fun ReactionButton(onSendReaction: (String) -> Unit = {}) { diff --git a/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/component/MessageItem.kt b/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/component/MessageItem.kt index 2a6c6016c..85bc604dc 100644 --- a/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/component/MessageItem.kt +++ b/feature/messaging/src/main/kotlin/org/meshtastic/feature/messaging/component/MessageItem.kt @@ -44,15 +44,20 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.entity.Reaction import org.meshtastic.core.database.model.Message import org.meshtastic.core.database.model.Node import org.meshtastic.core.model.MessageStatus +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.hops_away_template +import org.meshtastic.core.strings.reply +import org.meshtastic.core.strings.sample_message +import org.meshtastic.core.strings.via_mqtt import org.meshtastic.core.ui.component.AutoLinkText import org.meshtastic.core.ui.component.NodeChip import org.meshtastic.core.ui.component.Rssi @@ -60,7 +65,6 @@ import org.meshtastic.core.ui.component.Snr import org.meshtastic.core.ui.component.preview.NodePreviewParameterProvider import org.meshtastic.core.ui.theme.AppTheme import org.meshtastic.core.ui.theme.MessageItemColors -import org.meshtastic.core.strings.R as Res @Suppress("LongMethod", "CyclomaticComplexMethod") @Composable diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/AdministrationSection.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/AdministrationSection.kt index ee5187c07..b26eac004 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/AdministrationSection.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/AdministrationSection.kt @@ -26,13 +26,22 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.entity.FirmwareRelease import org.meshtastic.core.database.entity.asDeviceVersion import org.meshtastic.core.database.model.Node import org.meshtastic.core.model.DeviceVersion import org.meshtastic.core.navigation.SettingsRoutes import org.meshtastic.core.service.ServiceAction +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.administration +import org.meshtastic.core.strings.firmware +import org.meshtastic.core.strings.firmware_edition +import org.meshtastic.core.strings.installed_firmware_version +import org.meshtastic.core.strings.latest_alpha_firmware +import org.meshtastic.core.strings.latest_stable_firmware +import org.meshtastic.core.strings.remote_admin +import org.meshtastic.core.strings.request_metadata import org.meshtastic.core.ui.component.InsetDivider import org.meshtastic.core.ui.component.ListItem import org.meshtastic.core.ui.component.TitledCard @@ -43,7 +52,6 @@ import org.meshtastic.core.ui.theme.StatusColors.StatusYellow import org.meshtastic.feature.node.model.MetricsState import org.meshtastic.feature.node.model.NodeDetailAction import org.meshtastic.proto.MeshProtos -import org.meshtastic.core.strings.R as Res @Suppress("LongMethod") @Composable diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/DeviceActions.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/DeviceActions.kt index dcdd1ef8d..f7ad9ee89 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/DeviceActions.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/DeviceActions.kt @@ -32,14 +32,19 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.actions +import org.meshtastic.core.strings.favorite +import org.meshtastic.core.strings.ignore +import org.meshtastic.core.strings.remove +import org.meshtastic.core.strings.share_contact import org.meshtastic.core.ui.component.InsetDivider import org.meshtastic.core.ui.component.ListItem import org.meshtastic.core.ui.component.SwitchListItem import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.feature.node.model.NodeDetailAction -import org.meshtastic.core.strings.R as Res @Composable fun DeviceActions( diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/DeviceDetailsSection.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/DeviceDetailsSection.kt index c26b3f820..575427c83 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/DeviceDetailsSection.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/DeviceDetailsSection.kt @@ -38,19 +38,24 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.unit.dp import coil3.compose.AsyncImage import coil3.request.ImageRequest +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.DeviceHardware +import org.meshtastic.core.strings.R +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.device +import org.meshtastic.core.strings.hardware +import org.meshtastic.core.strings.supported +import org.meshtastic.core.strings.supported_by_community import org.meshtastic.core.ui.component.InsetDivider import org.meshtastic.core.ui.component.ListItem import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.core.ui.theme.StatusColors.StatusGreen import org.meshtastic.core.ui.theme.StatusColors.StatusRed import org.meshtastic.feature.node.model.MetricsState -import org.meshtastic.core.strings.R as Res @Composable fun DeviceDetailsSection(state: MetricsState, modifier: Modifier = Modifier) { diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/DistanceInfo.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/DistanceInfo.kt index 73021df0c..f378dab41 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/DistanceInfo.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/DistanceInfo.kt @@ -23,10 +23,11 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewLightDark +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.distance import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res @Composable fun DistanceInfo( diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/ElevationInfo.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/ElevationInfo.kt index 7904e51b9..55648c9c8 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/ElevationInfo.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/ElevationInfo.kt @@ -21,14 +21,16 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.util.metersIn import org.meshtastic.core.model.util.toString +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.altitude +import org.meshtastic.core.strings.elevation_suffix import org.meshtastic.core.ui.icon.Elevation import org.meshtastic.core.ui.icon.MeshtasticIcons import org.meshtastic.proto.ConfigProtos.Config.DisplayConfig.DisplayUnits -import org.meshtastic.core.strings.R as Res @Composable fun ElevationInfo( diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/EnvironmentMetrics.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/EnvironmentMetrics.kt index 57534f61d..0e74feb66 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/EnvironmentMetrics.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/EnvironmentMetrics.kt @@ -35,16 +35,33 @@ import androidx.compose.material.icons.outlined.Navigation import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node import org.meshtastic.core.model.util.UnitConversions import org.meshtastic.core.model.util.UnitConversions.toTempString import org.meshtastic.core.model.util.toSmallDistanceString import org.meshtastic.core.model.util.toSpeedString +import org.meshtastic.core.strings.R +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.current +import org.meshtastic.core.strings.dew_point +import org.meshtastic.core.strings.distance +import org.meshtastic.core.strings.gas_resistance +import org.meshtastic.core.strings.humidity +import org.meshtastic.core.strings.iaq +import org.meshtastic.core.strings.lux +import org.meshtastic.core.strings.pressure +import org.meshtastic.core.strings.radiation +import org.meshtastic.core.strings.soil_moisture +import org.meshtastic.core.strings.soil_temperature +import org.meshtastic.core.strings.temperature +import org.meshtastic.core.strings.uv_lux +import org.meshtastic.core.strings.voltage +import org.meshtastic.core.strings.weight +import org.meshtastic.core.strings.wind import org.meshtastic.feature.node.model.DrawableMetricInfo import org.meshtastic.feature.node.model.VectorMetricInfo import org.meshtastic.proto.ConfigProtos -import org.meshtastic.core.strings.R as Res @Suppress("CyclomaticComplexMethod", "LongMethod") @Composable diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/FirmwareReleaseSheetContent.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/FirmwareReleaseSheetContent.kt index 157ea2d34..ca6feba6d 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/FirmwareReleaseSheetContent.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/FirmwareReleaseSheetContent.kt @@ -39,15 +39,18 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.net.toUri import com.mikepenz.markdown.m3.Markdown import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.entity.FirmwareRelease +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.download +import org.meshtastic.core.strings.error_no_app_to_handle_link +import org.meshtastic.core.strings.view_release import org.meshtastic.core.ui.util.showToast import timber.log.Timber -import org.meshtastic.core.strings.R as Res @Composable fun FirmwareReleaseSheetContent(firmwareRelease: FirmwareRelease, modifier: Modifier = Modifier) { diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/LastHeardInfo.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/LastHeardInfo.kt index 5db67c2d8..e46a9aac1 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/LastHeardInfo.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/LastHeardInfo.kt @@ -22,13 +22,14 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.PreviewLightDark +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.util.formatAgo +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.node_sort_last_heard import org.meshtastic.core.ui.R import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res @Composable fun LastHeardInfo( diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/LinkedCoordinatesItem.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/LinkedCoordinatesItem.kt index bb765dfb5..0f8b95fe9 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/LinkedCoordinatesItem.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/LinkedCoordinatesItem.kt @@ -30,20 +30,21 @@ import androidx.compose.ui.platform.ClipEntry import androidx.compose.ui.platform.Clipboard import androidx.compose.ui.platform.LocalClipboard import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.core.net.toUri import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node import org.meshtastic.core.model.util.GPSFormat import org.meshtastic.core.model.util.formatAgo +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.last_position_update import org.meshtastic.core.ui.component.BasicListItem import org.meshtastic.core.ui.component.icon import org.meshtastic.core.ui.theme.AppTheme import org.meshtastic.core.ui.util.showToast import timber.log.Timber import java.net.URLEncoder -import org.meshtastic.core.strings.R as Res @OptIn(ExperimentalFoundationApi::class) @Composable diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/MetricsSection.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/MetricsSection.kt index 3358d2f91..035683531 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/MetricsSection.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/MetricsSection.kt @@ -21,15 +21,18 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.environment +import org.meshtastic.core.strings.logs +import org.meshtastic.core.strings.power import org.meshtastic.core.ui.component.ListItem import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.feature.node.model.LogsType import org.meshtastic.feature.node.model.MetricsState import org.meshtastic.feature.node.model.NodeDetailAction -import org.meshtastic.core.strings.R as Res @Composable @Suppress("MultipleEmitters") diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeDetailsSection.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeDetailsSection.kt index 113d583bc..ec98cac15 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeDetailsSection.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeDetailsSection.kt @@ -38,17 +38,28 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node import org.meshtastic.core.model.util.formatAgo import org.meshtastic.core.model.util.formatUptime +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.details +import org.meshtastic.core.strings.encryption_error +import org.meshtastic.core.strings.encryption_error_text +import org.meshtastic.core.strings.long_name +import org.meshtastic.core.strings.node_number +import org.meshtastic.core.strings.node_sort_last_heard +import org.meshtastic.core.strings.role +import org.meshtastic.core.strings.short_name +import org.meshtastic.core.strings.unmonitored_or_infrastructure +import org.meshtastic.core.strings.uptime +import org.meshtastic.core.strings.user_id import org.meshtastic.core.ui.component.InsetDivider import org.meshtastic.core.ui.component.ListItem import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.feature.node.model.isEffectivelyUnmessageable -import org.meshtastic.core.strings.R as Res @Composable fun NodeDetailsSection(node: Node, modifier: Modifier = Modifier) { diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeFilterTextField.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeFilterTextField.kt index da5a105b7..bafd089ce 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeFilterTextField.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeFilterTextField.kt @@ -54,16 +54,26 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.onFocusEvent import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.NodeSortOption +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.desc_node_filter_clear +import org.meshtastic.core.strings.node_filter_ignored +import org.meshtastic.core.strings.node_filter_include_unknown +import org.meshtastic.core.strings.node_filter_only_direct +import org.meshtastic.core.strings.node_filter_only_online +import org.meshtastic.core.strings.node_filter_placeholder +import org.meshtastic.core.strings.node_filter_show_ignored +import org.meshtastic.core.strings.node_filter_title +import org.meshtastic.core.strings.node_sort_button +import org.meshtastic.core.strings.node_sort_title import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res @Suppress("LongParameterList") @Composable diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeItem.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeItem.kt index 102fd90a7..c7d97869c 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeItem.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeItem.kt @@ -40,15 +40,18 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node import org.meshtastic.core.database.model.isUnmessageableRole import org.meshtastic.core.model.util.toDistanceString +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.elevation_suffix +import org.meshtastic.core.strings.unknown_username import org.meshtastic.core.ui.component.MaterialBatteryInfo import org.meshtastic.core.ui.component.NodeChip import org.meshtastic.core.ui.component.NodeKeyStatusIcon @@ -56,7 +59,6 @@ import org.meshtastic.core.ui.component.SignalInfo import org.meshtastic.core.ui.component.preview.NodePreviewParameterProvider import org.meshtastic.core.ui.theme.AppTheme import org.meshtastic.proto.ConfigProtos.Config.DisplayConfig -import org.meshtastic.core.strings.R as Res @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Suppress("LongMethod", "CyclomaticComplexMethod") diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeMenu.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeMenu.kt index e4aff468b..ee85f3dd6 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeMenu.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeMenu.kt @@ -18,10 +18,18 @@ package org.meshtastic.feature.node.component import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.favorite +import org.meshtastic.core.strings.favorite_add +import org.meshtastic.core.strings.favorite_remove +import org.meshtastic.core.strings.ignore +import org.meshtastic.core.strings.ignore_add +import org.meshtastic.core.strings.ignore_remove +import org.meshtastic.core.strings.remove +import org.meshtastic.core.strings.remove_node_text import org.meshtastic.core.ui.component.SimpleAlertDialog -import org.meshtastic.core.strings.R as Res @Composable fun NodeActionDialogs( diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeStatusIcons.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeStatusIcons.kt index c8c2fc0bd..fe4370abf 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeStatusIcons.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NodeStatusIcons.kt @@ -37,13 +37,19 @@ import androidx.compose.material3.TooltipDefaults import androidx.compose.material3.rememberTooltipState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.connected +import org.meshtastic.core.strings.disconnected +import org.meshtastic.core.strings.favorite +import org.meshtastic.core.strings.not_connected +import org.meshtastic.core.strings.unmessageable +import org.meshtastic.core.strings.unmonitored_or_infrastructure import org.meshtastic.core.ui.theme.StatusColors.StatusGreen import org.meshtastic.core.ui.theme.StatusColors.StatusRed import org.meshtastic.core.ui.theme.StatusColors.StatusYellow -import org.meshtastic.core.strings.R as Res @Suppress("LongMethod") @OptIn(ExperimentalMaterial3Api::class) diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NotesSection.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NotesSection.kt index 2bc6feac2..0c991ad83 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NotesSection.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/NotesSection.kt @@ -34,12 +34,15 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalSoftwareKeyboardController -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.add_a_note +import org.meshtastic.core.strings.notes +import org.meshtastic.core.strings.save import org.meshtastic.core.ui.component.TitledCard -import org.meshtastic.core.strings.R as Res @Composable fun NotesSection(node: Node, onSaveNotes: (Int, String) -> Unit, modifier: Modifier = Modifier) { diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/PositionSection.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/PositionSection.kt index e271aae63..48b1e3a8c 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/PositionSection.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/PositionSection.kt @@ -24,17 +24,20 @@ import androidx.compose.material.icons.filled.LocationOn import androidx.compose.material.icons.filled.SocialDistance import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node import org.meshtastic.core.model.util.toDistanceString +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.exchange_position +import org.meshtastic.core.strings.node_sort_distance +import org.meshtastic.core.strings.position import org.meshtastic.core.ui.component.InsetDivider import org.meshtastic.core.ui.component.ListItem import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.feature.node.model.LogsType import org.meshtastic.feature.node.model.MetricsState import org.meshtastic.feature.node.model.NodeDetailAction -import org.meshtastic.core.strings.R as Res /** * Displays node position details, last update time, distance, and related actions like requesting position and diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/PowerMetrics.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/PowerMetrics.kt index fc4d992a5..221c75258 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/PowerMetrics.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/PowerMetrics.kt @@ -27,10 +27,13 @@ import androidx.compose.material.icons.filled.Power import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.channel_1 +import org.meshtastic.core.strings.channel_2 +import org.meshtastic.core.strings.channel_3 import org.meshtastic.feature.node.model.VectorMetricInfo -import org.meshtastic.core.strings.R as Res /** * Displays environmental metrics for a node, including temperature, humidity, pressure, and other sensor data. diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/RemoteDeviceActions.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/RemoteDeviceActions.kt index f0ec9dd19..dff008af1 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/RemoteDeviceActions.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/RemoteDeviceActions.kt @@ -21,13 +21,15 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.twotone.Message import androidx.compose.material.icons.filled.Person import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.direct_message +import org.meshtastic.core.strings.exchange_userinfo import org.meshtastic.core.ui.component.InsetDivider import org.meshtastic.core.ui.component.ListItem import org.meshtastic.feature.node.model.NodeDetailAction import org.meshtastic.feature.node.model.isEffectivelyUnmessageable -import org.meshtastic.core.strings.R as Res @Composable internal fun RemoteDeviceActions(node: Node, lastTracerouteTime: Long?, onAction: (NodeDetailAction) -> Unit) { diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/SatelliteCountInfo.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/SatelliteCountInfo.kt index 9fb6a4986..8f3298029 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/SatelliteCountInfo.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/SatelliteCountInfo.kt @@ -23,10 +23,11 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewLightDark +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.sats import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res @Composable fun SatelliteCountInfo( diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/TracerouteButton.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/TracerouteButton.kt index 56c4f8baf..284283726 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/TracerouteButton.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/component/TracerouteButton.kt @@ -31,12 +31,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.traceroute import org.meshtastic.core.ui.component.BasicListItem import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res private const val COOL_DOWN_TIME_MS = 30000L diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt index 04e962f0a..3805a5731 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/list/NodeListScreen.kt @@ -53,13 +53,21 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.Node import org.meshtastic.core.model.DeviceVersion import org.meshtastic.core.service.ConnectionState +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.add_favorite +import org.meshtastic.core.strings.ignore +import org.meshtastic.core.strings.node_count_template +import org.meshtastic.core.strings.nodes +import org.meshtastic.core.strings.remove +import org.meshtastic.core.strings.remove_favorite +import org.meshtastic.core.strings.remove_ignored import org.meshtastic.core.ui.component.AddContactFAB import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.component.rememberTimeTickWithLifecycle @@ -69,7 +77,6 @@ import org.meshtastic.feature.node.component.NodeActionDialogs import org.meshtastic.feature.node.component.NodeFilterTextField import org.meshtastic.feature.node.component.NodeItem import org.meshtastic.proto.AdminProtos -import org.meshtastic.core.strings.R as Res @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Suppress("LongMethod", "CyclomaticComplexMethod") diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/CommonCharts.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/CommonCharts.kt index 139d0a88f..5a35f0085 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/CommonCharts.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/CommonCharts.kt @@ -48,7 +48,6 @@ import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.nativeCanvas import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign @@ -56,11 +55,18 @@ import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.close +import org.meshtastic.core.strings.info +import org.meshtastic.core.strings.logs +import org.meshtastic.core.strings.rssi +import org.meshtastic.core.strings.snr import org.meshtastic.feature.node.metrics.CommonCharts.DATE_TIME_MINUTE_FORMAT import org.meshtastic.feature.node.metrics.CommonCharts.MAX_PERCENT_VALUE import org.meshtastic.feature.node.metrics.CommonCharts.MS_PER_SEC import java.text.DateFormat -import org.meshtastic.core.strings.R as Res object CommonCharts { val DATE_TIME_FORMAT: DateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM) @@ -79,7 +85,7 @@ private const val LINE_LIMIT = 4 private const val TEXT_PAINT_ALPHA = 192 data class LegendData( - val nameRes: Int, + val nameRes: StringResource, val color: Color, val isLine: Boolean = false, val environmentMetric: Environment? = null, @@ -269,7 +275,7 @@ fun Legend(legendData: List, displayInfoIcon: Boolean = true, prompt * @param onDismiss Executes when the user presses the close button. */ @Composable -fun LegendInfoDialog(pairedRes: List>, onDismiss: () -> Unit) { +fun LegendInfoDialog(pairedRes: List>, onDismiss: () -> Unit) { AlertDialog( title = { Text( diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt index 4e1b29bd3..ee64fd4e9 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt @@ -53,13 +53,20 @@ import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalWindowInfo -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.air_util_definition +import org.meshtastic.core.strings.air_utilization +import org.meshtastic.core.strings.battery +import org.meshtastic.core.strings.ch_util_definition +import org.meshtastic.core.strings.channel_air_util +import org.meshtastic.core.strings.channel_utilization import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.component.MaterialBatteryInfo import org.meshtastic.core.ui.component.OptionLabel @@ -76,7 +83,6 @@ import org.meshtastic.feature.node.metrics.GraphUtil.plotPoint import org.meshtastic.feature.node.model.TimeFrame import org.meshtastic.proto.TelemetryProtos import org.meshtastic.proto.TelemetryProtos.Telemetry -import org.meshtastic.core.strings.R as Res private const val CHART_WEIGHT = 1f private const val Y_AXIS_WEIGHT = 0.1f diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt index 38be537da..aa048aede 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentCharts.kt @@ -40,11 +40,19 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalWindowInfo import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.baro_pressure +import org.meshtastic.core.strings.humidity +import org.meshtastic.core.strings.iaq +import org.meshtastic.core.strings.lux +import org.meshtastic.core.strings.soil_moisture +import org.meshtastic.core.strings.soil_temperature +import org.meshtastic.core.strings.temperature +import org.meshtastic.core.strings.uv_lux import org.meshtastic.feature.node.metrics.GraphUtil.createPath import org.meshtastic.feature.node.metrics.GraphUtil.drawPathWithGradient import org.meshtastic.feature.node.model.TimeFrame import org.meshtastic.proto.TelemetryProtos.Telemetry -import org.meshtastic.core.strings.R as Res private const val CHART_WEIGHT = 1f private const val Y_AXIS_WEIGHT = 0.1f diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentMetrics.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentMetrics.kt index 3abf7d8ae..865da442b 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentMetrics.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/EnvironmentMetrics.kt @@ -42,14 +42,27 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.util.UnitConversions.celsiusToFahrenheit +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.current +import org.meshtastic.core.strings.gas_resistance +import org.meshtastic.core.strings.humidity +import org.meshtastic.core.strings.iaq +import org.meshtastic.core.strings.iaq_definition +import org.meshtastic.core.strings.lux +import org.meshtastic.core.strings.radiation +import org.meshtastic.core.strings.soil_moisture +import org.meshtastic.core.strings.soil_temperature +import org.meshtastic.core.strings.temperature +import org.meshtastic.core.strings.uv_lux +import org.meshtastic.core.strings.voltage import org.meshtastic.core.ui.component.IaqDisplayMode import org.meshtastic.core.ui.component.IndoorAirQuality import org.meshtastic.core.ui.component.MainAppBar @@ -61,7 +74,6 @@ import org.meshtastic.feature.node.model.TimeFrame import org.meshtastic.proto.TelemetryProtos import org.meshtastic.proto.TelemetryProtos.Telemetry import org.meshtastic.proto.copy -import org.meshtastic.core.strings.R as Res @Composable fun EnvironmentMetricsScreen(viewModel: MetricsViewModel = hiltViewModel(), onNavigateUp: () -> Unit) { diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/HostMetricsLog.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/HostMetricsLog.kt index a80b1d2e7..6c49e4781 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/HostMetricsLog.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/HostMetricsLog.kt @@ -45,7 +45,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight @@ -54,13 +53,19 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.util.formatUptime +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.disk_free_indexed +import org.meshtastic.core.strings.free_memory +import org.meshtastic.core.strings.load_indexed +import org.meshtastic.core.strings.uptime +import org.meshtastic.core.strings.user_string import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.theme.AppTheme import org.meshtastic.feature.node.metrics.CommonCharts.DATE_TIME_FORMAT import org.meshtastic.proto.TelemetryProtos import java.text.DecimalFormat -import org.meshtastic.core.strings.R as Res @OptIn(ExperimentalFoundationApi::class) @Composable diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/MetricsViewModel.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/MetricsViewModel.kt index 2d7a1dbdd..381732b39 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/MetricsViewModel.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/MetricsViewModel.kt @@ -38,6 +38,7 @@ import kotlinx.coroutines.flow.toList import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.jetbrains.compose.resources.getString import org.meshtastic.core.data.repository.DeviceHardwareRepository import org.meshtastic.core.data.repository.FirmwareReleaseRepository import org.meshtastic.core.data.repository.MeshLogRepository @@ -50,6 +51,8 @@ import org.meshtastic.core.model.DataPacket import org.meshtastic.core.navigation.NodesRoutes import org.meshtastic.core.service.ServiceAction import org.meshtastic.core.service.ServiceRepository +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.fallback_node_name import org.meshtastic.core.ui.util.toPosition import org.meshtastic.feature.node.model.MetricsState import org.meshtastic.feature.node.model.TimeFrame @@ -64,7 +67,6 @@ import java.io.FileWriter import java.text.SimpleDateFormat import java.util.Locale import javax.inject.Inject -import org.meshtastic.core.strings.R as Res private const val DEFAULT_ID_SUFFIX_LENGTH = 4 @@ -95,10 +97,10 @@ constructor( * Creates a fallback node for hidden clients or nodes not yet in the database. This prevents the detail screen from * freezing when viewing unknown nodes. */ - private fun createFallbackNode(nodeNum: Int): Node { + private suspend fun createFallbackNode(nodeNum: Int): Node { val userId = DataPacket.nodeNumToDefaultId(nodeNum) val safeUserId = userId.padStart(DEFAULT_ID_SUFFIX_LENGTH, '0').takeLast(DEFAULT_ID_SUFFIX_LENGTH) - val longName = app.getString(Res.string.fallback_node_name) + " $safeUserId" + val longName = getString(Res.string.fallback_node_name) + " $safeUserId" val defaultUser = MeshProtos.User.newBuilder() .setId(userId) diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PaxMetrics.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PaxMetrics.kt index 61ccd7208..467a59436 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PaxMetrics.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PaxMetrics.kt @@ -48,14 +48,21 @@ import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalWindowInfo -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.entity.MeshLog import org.meshtastic.core.model.util.formatUptime +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.ble_devices +import org.meshtastic.core.strings.no_pax_metrics_logs +import org.meshtastic.core.strings.pax +import org.meshtastic.core.strings.uptime +import org.meshtastic.core.strings.wifi_devices import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.component.OptionLabel import org.meshtastic.core.ui.component.SlidingSelector @@ -64,13 +71,12 @@ import org.meshtastic.proto.PaxcountProtos import org.meshtastic.proto.Portnums.PortNum import java.text.DateFormat import java.util.Date -import org.meshtastic.core.strings.R as Res private const val CHART_WEIGHT = 1f private const val Y_AXIS_WEIGHT = 0.1f private const val CHART_WIDTH_RATIO = CHART_WEIGHT / (CHART_WEIGHT + Y_AXIS_WEIGHT + Y_AXIS_WEIGHT) -private enum class PaxSeries(val color: Color, val legendRes: Int) { +private enum class PaxSeries(val color: Color, val legendRes: StringResource) { PAX(Color.Black, Res.string.pax), BLE(Color.Cyan, Res.string.ble_devices), WIFI(Color.Green, Res.string.wifi_devices), diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PositionLog.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PositionLog.kt index 5263934fc..07086c27f 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PositionLog.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PositionLog.kt @@ -54,7 +54,6 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview @@ -62,15 +61,25 @@ import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.util.metersIn import org.meshtastic.core.model.util.toString +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.alt +import org.meshtastic.core.strings.clear +import org.meshtastic.core.strings.heading +import org.meshtastic.core.strings.latitude +import org.meshtastic.core.strings.longitude +import org.meshtastic.core.strings.sats +import org.meshtastic.core.strings.save +import org.meshtastic.core.strings.speed +import org.meshtastic.core.strings.timestamp import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.theme.AppTheme import org.meshtastic.core.ui.util.formatPositionTime import org.meshtastic.proto.ConfigProtos.Config.DisplayConfig.DisplayUnits import org.meshtastic.proto.MeshProtos import java.text.DateFormat -import org.meshtastic.core.strings.R as Res @Composable private fun RowScope.PositionText(text: String, weight: Float) { diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt index f0ffdc188..e5f4b3899 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/PowerMetrics.kt @@ -17,7 +17,6 @@ package org.meshtastic.feature.node.metrics -import androidx.annotation.StringRes import androidx.compose.foundation.Canvas import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement @@ -54,12 +53,19 @@ import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalWindowInfo -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.channel_1 +import org.meshtastic.core.strings.channel_2 +import org.meshtastic.core.strings.channel_3 +import org.meshtastic.core.strings.current +import org.meshtastic.core.strings.voltage import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.component.OptionLabel import org.meshtastic.core.ui.component.SlidingSelector @@ -72,7 +78,6 @@ import org.meshtastic.feature.node.model.TimeFrame import org.meshtastic.proto.TelemetryProtos.Telemetry import kotlin.math.ceil import kotlin.math.floor -import org.meshtastic.core.strings.R as Res @Suppress("MagicNumber") private enum class Power(val color: Color, val min: Float, val max: Float) { @@ -83,7 +88,7 @@ private enum class Power(val color: Color, val min: Float, val max: Float) { fun difference() = max - min } -private enum class PowerChannel(@StringRes val strRes: Int) { +private enum class PowerChannel(val strRes: StringResource) { ONE(Res.string.channel_1), TWO(Res.string.channel_2), THREE(Res.string.channel_3), @@ -349,7 +354,7 @@ private fun PowerMetricsCard(telemetry: Telemetry) { } @Composable -private fun PowerChannelColumn(@StringRes titleRes: Int, voltage: Float, current: Float) { +private fun PowerChannelColumn(titleRes: StringResource, voltage: Float, current: Float) { Column { Text( text = stringResource(titleRes), diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt index 5ee2bb08c..fa3832276 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/SignalMetrics.kt @@ -51,12 +51,17 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalWindowInfo -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.rssi +import org.meshtastic.core.strings.rssi_definition +import org.meshtastic.core.strings.snr +import org.meshtastic.core.strings.snr_definition import org.meshtastic.core.ui.component.LoraSignalIndicator import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.component.OptionLabel @@ -67,7 +72,6 @@ import org.meshtastic.feature.node.metrics.CommonCharts.MS_PER_SEC import org.meshtastic.feature.node.metrics.GraphUtil.plotPoint import org.meshtastic.feature.node.model.TimeFrame import org.meshtastic.proto.MeshProtos.MeshPacket -import org.meshtastic.core.strings.R as Res @Suppress("MagicNumber") private enum class Metric(val color: Color, val min: Float, val max: Float) { diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/TracerouteLog.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/TracerouteLog.kt index f3abc6410..6d7ade487 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/TracerouteLog.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/TracerouteLog.kt @@ -52,7 +52,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.pluralStringResource -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString @@ -62,8 +61,17 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.pluralStringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.fullRouteDiscovery import org.meshtastic.core.model.getTracerouteResponse +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.delete +import org.meshtastic.core.strings.routing_error_no_response +import org.meshtastic.core.strings.traceroute +import org.meshtastic.core.strings.traceroute_diff +import org.meshtastic.core.strings.traceroute_direct +import org.meshtastic.core.strings.traceroute_hops import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.component.SNR_FAIR_THRESHOLD import org.meshtastic.core.ui.component.SNR_GOOD_THRESHOLD @@ -75,7 +83,6 @@ import org.meshtastic.core.ui.theme.StatusColors.StatusYellow import org.meshtastic.feature.node.metrics.CommonCharts.MS_PER_SEC import org.meshtastic.proto.MeshProtos import java.text.DateFormat -import org.meshtastic.core.strings.R as Res @OptIn(ExperimentalFoundationApi::class) @Suppress("LongMethod") diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/model/LogsType.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/model/LogsType.kt index 9a2a39234..51a7fff9a 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/model/LogsType.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/model/LogsType.kt @@ -17,7 +17,6 @@ package org.meshtastic.feature.node.model -import androidx.annotation.StringRes import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ChargingStation import androidx.compose.material.icons.filled.LocationOn @@ -29,11 +28,21 @@ import androidx.compose.material.icons.filled.Route import androidx.compose.material.icons.filled.SignalCellularAlt import androidx.compose.material.icons.filled.Thermostat import androidx.compose.ui.graphics.vector.ImageVector +import org.jetbrains.compose.resources.StringResource import org.meshtastic.core.navigation.NodeDetailRoutes import org.meshtastic.core.navigation.Route -import org.meshtastic.core.strings.R as Res +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.device_metrics_log +import org.meshtastic.core.strings.env_metrics_log +import org.meshtastic.core.strings.host_metrics_log +import org.meshtastic.core.strings.node_map +import org.meshtastic.core.strings.pax_metrics_log +import org.meshtastic.core.strings.position_log +import org.meshtastic.core.strings.power_metrics_log +import org.meshtastic.core.strings.sig_metrics_log +import org.meshtastic.core.strings.traceroute_log -enum class LogsType(@StringRes val titleRes: Int, val icon: ImageVector, val route: Route) { +enum class LogsType(val titleRes: StringResource, val icon: ImageVector, val route: Route) { DEVICE(Res.string.device_metrics_log, Icons.Default.ChargingStation, NodeDetailRoutes.DeviceMetrics), NODE_MAP(Res.string.node_map, Icons.Default.Map, NodeDetailRoutes.NodeMap), POSITIONS(Res.string.position_log, Icons.Default.LocationOn, NodeDetailRoutes.PositionLog), diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/model/MetricInfo.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/model/MetricInfo.kt index 69a8332ba..fd612abcd 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/model/MetricInfo.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/model/MetricInfo.kt @@ -18,18 +18,18 @@ package org.meshtastic.feature.node.model import androidx.annotation.DrawableRes -import androidx.annotation.StringRes import androidx.compose.ui.graphics.vector.ImageVector +import org.jetbrains.compose.resources.StringResource internal data class VectorMetricInfo( - @StringRes val label: Int, + val label: StringResource, val value: String, val icon: ImageVector, val rotateIcon: Float = 0f, ) internal data class DrawableMetricInfo( - @StringRes val label: Int, + val label: StringResource, val value: String, @DrawableRes val icon: Int, val rotateIcon: Float = 0f, diff --git a/feature/node/src/main/kotlin/org/meshtastic/feature/node/model/MetricsState.kt b/feature/node/src/main/kotlin/org/meshtastic/feature/node/model/MetricsState.kt index 106c8f34b..ef7adab00 100644 --- a/feature/node/src/main/kotlin/org/meshtastic/feature/node/model/MetricsState.kt +++ b/feature/node/src/main/kotlin/org/meshtastic/feature/node/model/MetricsState.kt @@ -17,18 +17,24 @@ package org.meshtastic.feature.node.model -import androidx.annotation.StringRes import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.StringResource import org.meshtastic.core.database.entity.FirmwareRelease import org.meshtastic.core.database.entity.MeshLog import org.meshtastic.core.database.model.Node import org.meshtastic.core.model.DeviceHardware +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.forty_eight_hours +import org.meshtastic.core.strings.four_weeks +import org.meshtastic.core.strings.max +import org.meshtastic.core.strings.one_week +import org.meshtastic.core.strings.twenty_four_hours +import org.meshtastic.core.strings.two_weeks import org.meshtastic.proto.ConfigProtos import org.meshtastic.proto.MeshProtos import org.meshtastic.proto.TelemetryProtos import java.util.concurrent.TimeUnit -import org.meshtastic.core.strings.R as Res data class MetricsState( val isLocal: Boolean = false, @@ -87,7 +93,7 @@ data class MetricsState( /** Supported time frames used to display data. */ @Suppress("MagicNumber") -enum class TimeFrame(val seconds: Long, @StringRes val strRes: Int) { +enum class TimeFrame(val seconds: Long, val strRes: StringResource) { TWENTY_FOUR_HOURS(TimeUnit.DAYS.toSeconds(1), Res.string.twenty_four_hours), FORTY_EIGHT_HOURS(TimeUnit.DAYS.toSeconds(2), Res.string.forty_eight_hours), ONE_WEEK(TimeUnit.DAYS.toSeconds(7), Res.string.one_week), diff --git a/feature/settings/src/androidTest/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreferenceTest.kt b/feature/settings/src/androidTest/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreferenceTest.kt index 477548725..860282b4f 100644 --- a/feature/settings/src/androidTest/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreferenceTest.kt +++ b/feature/settings/src/androidTest/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreferenceTest.kt @@ -29,7 +29,6 @@ import org.junit.Assert import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.meshtastic.core.strings.R as Res @RunWith(AndroidJUnit4::class) class MapReportingPreferenceTest { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/SettingsScreen.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/SettingsScreen.kt index aa9c8d893..441df33b4 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/SettingsScreen.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/SettingsScreen.kt @@ -54,18 +54,44 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalResources -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.core.net.toUri import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.rememberMultiplePermissionsState +import com.meshtastic.core.strings.getString import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.common.gpsDisabled import org.meshtastic.core.database.DatabaseConstants import org.meshtastic.core.navigation.Route +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.analytics_okay +import org.meshtastic.core.strings.app_settings +import org.meshtastic.core.strings.app_version +import org.meshtastic.core.strings.bottom_nav_settings +import org.meshtastic.core.strings.choose_theme +import org.meshtastic.core.strings.device_db_cache_limit +import org.meshtastic.core.strings.device_db_cache_limit_summary +import org.meshtastic.core.strings.dynamic +import org.meshtastic.core.strings.export_configuration +import org.meshtastic.core.strings.export_data_csv +import org.meshtastic.core.strings.import_configuration +import org.meshtastic.core.strings.intro_show +import org.meshtastic.core.strings.location_disabled +import org.meshtastic.core.strings.modules_already_unlocked +import org.meshtastic.core.strings.modules_unlocked +import org.meshtastic.core.strings.preferences_language +import org.meshtastic.core.strings.provide_location_to_mesh +import org.meshtastic.core.strings.remotely_administrating +import org.meshtastic.core.strings.save_rangetest +import org.meshtastic.core.strings.system_settings +import org.meshtastic.core.strings.theme +import org.meshtastic.core.strings.theme_dark +import org.meshtastic.core.strings.theme_light +import org.meshtastic.core.strings.theme_system import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.ListItem import org.meshtastic.core.ui.component.MainAppBar @@ -86,7 +112,6 @@ import java.text.SimpleDateFormat import java.util.Date import java.util.Locale import kotlin.time.Duration.Companion.seconds -import org.meshtastic.core.strings.R as Res @OptIn(ExperimentalPermissionsApi::class) @Suppress("LongMethod", "CyclomaticComplexMethod") diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/debugging/Debug.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/debugging/Debug.kt index 32fed894f..e50bbbad1 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/debugging/Debug.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/debugging/Debug.kt @@ -63,7 +63,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.TextStyle @@ -80,6 +79,16 @@ import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.debug_clear +import org.meshtastic.core.strings.debug_clear_logs_confirm +import org.meshtastic.core.strings.debug_decoded_payload +import org.meshtastic.core.strings.debug_export_failed +import org.meshtastic.core.strings.debug_export_success +import org.meshtastic.core.strings.debug_filters +import org.meshtastic.core.strings.debug_logs_export +import org.meshtastic.core.strings.debug_panel import org.meshtastic.core.ui.component.CopyIconButton import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.component.SimpleAlertDialog @@ -94,7 +103,6 @@ import java.nio.charset.StandardCharsets import java.text.SimpleDateFormat import java.util.Date import java.util.Locale -import org.meshtastic.core.strings.R as Res private val REGEX_ANNOTATED_NODE_ID = Regex("\\(![0-9a-fA-F]{8}\\)$", RegexOption.MULTILINE) diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/debugging/DebugFilters.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/debugging/DebugFilters.kt index e7bfec9f0..c4c72cc62 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/debugging/DebugFilters.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/debugging/DebugFilters.kt @@ -50,14 +50,21 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.debug_active_filters +import org.meshtastic.core.strings.debug_filter_add +import org.meshtastic.core.strings.debug_filter_clear +import org.meshtastic.core.strings.debug_filter_included +import org.meshtastic.core.strings.debug_filters +import org.meshtastic.core.strings.match_all +import org.meshtastic.core.strings.match_any import org.meshtastic.feature.settings.debugging.DebugViewModel.UiMeshLog -import org.meshtastic.core.strings.R as Res @Composable fun DebugCustomFilterInput( diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/debugging/DebugSearch.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/debugging/DebugSearch.kt index d5eaa6f59..734ac5743 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/debugging/DebugSearch.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/debugging/DebugSearch.kt @@ -46,18 +46,23 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.debug_default_search +import org.meshtastic.core.strings.debug_logs_export +import org.meshtastic.core.strings.debug_search_clear +import org.meshtastic.core.strings.debug_search_next +import org.meshtastic.core.strings.debug_search_prev import org.meshtastic.core.ui.theme.AppTheme import org.meshtastic.feature.settings.debugging.DebugViewModel.UiMeshLog import org.meshtastic.feature.settings.debugging.LogSearchManager.SearchMatch import org.meshtastic.feature.settings.debugging.LogSearchManager.SearchState -import org.meshtastic.core.strings.R as Res @Composable internal fun DebugSearchNavigation( diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/navigation/ConfigRoute.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/navigation/ConfigRoute.kt index 8c382365e..768fb4696 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/navigation/ConfigRoute.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/navigation/ConfigRoute.kt @@ -17,7 +17,6 @@ package org.meshtastic.feature.settings.navigation -import androidx.annotation.StringRes import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.List import androidx.compose.material.icons.filled.Bluetooth @@ -30,13 +29,24 @@ import androidx.compose.material.icons.filled.Router import androidx.compose.material.icons.filled.Security import androidx.compose.material.icons.filled.Wifi import androidx.compose.ui.graphics.vector.ImageVector +import org.jetbrains.compose.resources.StringResource import org.meshtastic.core.navigation.Route import org.meshtastic.core.navigation.SettingsRoutes +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.bluetooth +import org.meshtastic.core.strings.channels +import org.meshtastic.core.strings.device +import org.meshtastic.core.strings.display +import org.meshtastic.core.strings.lora +import org.meshtastic.core.strings.network +import org.meshtastic.core.strings.position +import org.meshtastic.core.strings.power +import org.meshtastic.core.strings.security +import org.meshtastic.core.strings.user import org.meshtastic.proto.AdminProtos import org.meshtastic.proto.MeshProtos.DeviceMetadata -import org.meshtastic.core.strings.R as Res -enum class ConfigRoute(@StringRes val title: Int, val route: Route, val icon: ImageVector?, val type: Int = 0) { +enum class ConfigRoute(val title: StringResource, val route: Route, val icon: ImageVector?, val type: Int = 0) { USER(Res.string.user, SettingsRoutes.User, Icons.Default.Person, 0), CHANNELS(Res.string.channels, SettingsRoutes.ChannelConfig, Icons.AutoMirrored.Default.List, 0), DEVICE( diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/navigation/ModuleRoute.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/navigation/ModuleRoute.kt index cb4603ddb..86ccda526 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/navigation/ModuleRoute.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/navigation/ModuleRoute.kt @@ -17,7 +17,6 @@ package org.meshtastic.feature.settings.navigation -import androidx.annotation.StringRes import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.Forward import androidx.compose.material.icons.automirrored.filled.Message @@ -33,13 +32,27 @@ import androidx.compose.material.icons.filled.SettingsRemote import androidx.compose.material.icons.filled.Speed import androidx.compose.material.icons.filled.Usb import androidx.compose.ui.graphics.vector.ImageVector +import org.jetbrains.compose.resources.StringResource import org.meshtastic.core.navigation.Route import org.meshtastic.core.navigation.SettingsRoutes +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.ambient_lighting +import org.meshtastic.core.strings.audio +import org.meshtastic.core.strings.canned_message +import org.meshtastic.core.strings.detection_sensor +import org.meshtastic.core.strings.external_notification +import org.meshtastic.core.strings.mqtt +import org.meshtastic.core.strings.neighbor_info +import org.meshtastic.core.strings.paxcounter +import org.meshtastic.core.strings.range_test +import org.meshtastic.core.strings.remote_hardware +import org.meshtastic.core.strings.serial +import org.meshtastic.core.strings.store_forward +import org.meshtastic.core.strings.telemetry import org.meshtastic.proto.AdminProtos import org.meshtastic.proto.MeshProtos.DeviceMetadata -import org.meshtastic.core.strings.R as Res -enum class ModuleRoute(@StringRes val title: Int, val route: Route, val icon: ImageVector?, val type: Int = 0) { +enum class ModuleRoute(val title: StringResource, val route: Route, val icon: ImageVector?, val type: Int = 0) { MQTT( Res.string.mqtt, SettingsRoutes.MQTT, diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/CleanNodeDatabaseScreen.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/CleanNodeDatabaseScreen.kt index 924a31352..cd30b6ab8 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/CleanNodeDatabaseScreen.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/CleanNodeDatabaseScreen.kt @@ -43,12 +43,21 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.entity.NodeEntity +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.are_you_sure +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.clean_node_database_confirmation +import org.meshtastic.core.strings.clean_node_database_description +import org.meshtastic.core.strings.clean_node_database_title +import org.meshtastic.core.strings.clean_nodes_older_than +import org.meshtastic.core.strings.clean_now +import org.meshtastic.core.strings.clean_unknown_nodes +import org.meshtastic.core.strings.nodes_queued_for_deletion import org.meshtastic.core.ui.component.NodeChip -import org.meshtastic.core.strings.R as Res /** * Composable screen for cleaning the node database. Allows users to specify criteria for deleting nodes. The list of diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/RadioConfig.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/RadioConfig.kt index 2168d4243..ddce1b378 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/RadioConfig.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/RadioConfig.kt @@ -17,7 +17,6 @@ package org.meshtastic.feature.settings.radio -import androidx.annotation.StringRes import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons @@ -39,11 +38,28 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.navigation.Route import org.meshtastic.core.navigation.SettingsRoutes +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.administration +import org.meshtastic.core.strings.advanced_title +import org.meshtastic.core.strings.backup_restore +import org.meshtastic.core.strings.clean_node_database_title +import org.meshtastic.core.strings.debug_panel +import org.meshtastic.core.strings.device_configuration +import org.meshtastic.core.strings.export_configuration +import org.meshtastic.core.strings.factory_reset +import org.meshtastic.core.strings.import_configuration +import org.meshtastic.core.strings.message_device_managed +import org.meshtastic.core.strings.module_settings +import org.meshtastic.core.strings.nodedb_reset +import org.meshtastic.core.strings.radio_configuration +import org.meshtastic.core.strings.reboot +import org.meshtastic.core.strings.shutdown import org.meshtastic.core.ui.component.ListItem import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.core.ui.theme.AppTheme @@ -51,7 +67,6 @@ import org.meshtastic.core.ui.theme.StatusColors.StatusRed import org.meshtastic.feature.settings.navigation.ConfigRoute import org.meshtastic.feature.settings.navigation.ModuleRoute import org.meshtastic.feature.settings.radio.component.WarningDialog -import org.meshtastic.core.strings.R as Res @Suppress("LongMethod", "CyclomaticComplexMethod") @Composable @@ -169,7 +184,7 @@ fun RadioConfigItemList( } } -enum class AdminRoute(val icon: ImageVector, @StringRes val title: Int) { +enum class AdminRoute(val icon: ImageVector, val title: StringResource) { REBOOT(Icons.Rounded.RestartAlt, Res.string.reboot), SHUTDOWN(Icons.Rounded.PowerSettingsNew, Res.string.shutdown), FACTORY_RESET(Icons.Rounded.Restore, Res.string.factory_reset), diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/RadioConfigViewModel.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/RadioConfigViewModel.kt index abea3f7bc..573f6830f 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/RadioConfigViewModel.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/RadioConfigViewModel.kt @@ -25,7 +25,6 @@ import android.net.Uri import android.os.RemoteException import android.util.Base64 import androidx.annotation.RequiresPermission -import androidx.annotation.StringRes import androidx.core.content.ContextCompat import androidx.core.net.toUri import androidx.lifecycle.SavedStateHandle @@ -46,6 +45,7 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.jetbrains.compose.resources.StringResource import org.json.JSONObject import org.meshtastic.core.data.repository.LocationRepository import org.meshtastic.core.data.repository.NodeRepository @@ -62,6 +62,8 @@ import org.meshtastic.core.prefs.map.MapConsentPrefs import org.meshtastic.core.service.ConnectionState import org.meshtastic.core.service.IMeshService import org.meshtastic.core.service.ServiceRepository +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.cant_shutdown import org.meshtastic.core.ui.util.getChannelList import org.meshtastic.feature.settings.navigation.ConfigRoute import org.meshtastic.feature.settings.navigation.ModuleRoute @@ -81,7 +83,6 @@ import org.meshtastic.proto.moduleConfig import timber.log.Timber import java.io.FileOutputStream import javax.inject.Inject -import org.meshtastic.core.strings.R as Res /** Data class that represents the current RadioConfig state. */ data class RadioConfigState( @@ -606,7 +607,7 @@ constructor( private fun sendError(error: String) = setResponseStateError(UiText.DynamicString(error)) - private fun sendError(@StringRes id: Int) = setResponseStateError(UiText.StringResource(id)) + private fun sendError(id: StringResource) = setResponseStateError(UiText.StringResource(id)) private fun setResponseStateError(error: UiText) { _radioConfigState.update { it.copy(responseState = ResponseState.Error(error)) } diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/ChannelConfigScreen.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/ChannelConfigScreen.kt index 9847e1759..65a57c2e8 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/ChannelConfigScreen.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/ChannelConfigScreen.kt @@ -48,13 +48,20 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.Channel import org.meshtastic.core.model.DeviceVersion +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.add +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.channel_name +import org.meshtastic.core.strings.channels +import org.meshtastic.core.strings.press_and_drag +import org.meshtastic.core.strings.send import org.meshtastic.core.ui.component.PreferenceFooter import org.meshtastic.core.ui.component.dragContainer import org.meshtastic.core.ui.component.dragDropItemsIndexed @@ -70,7 +77,6 @@ import org.meshtastic.feature.settings.radio.component.PacketResponseStateDialog import org.meshtastic.proto.ChannelProtos.ChannelSettings import org.meshtastic.proto.ConfigProtos.Config.LoRaConfig import org.meshtastic.proto.channelSettings -import org.meshtastic.core.strings.R as Res @Composable fun ChannelConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/ChannelCard.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/ChannelCard.kt index 3aff94c3d..c81e73625 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/ChannelCard.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/ChannelCard.kt @@ -27,9 +27,11 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.delete import org.meshtastic.core.ui.component.ChannelItem import org.meshtastic.core.ui.component.SecurityIcon import org.meshtastic.core.ui.theme.AppTheme @@ -37,7 +39,6 @@ import org.meshtastic.proto.ChannelProtos.ChannelSettings import org.meshtastic.proto.ConfigKt.loRaConfig import org.meshtastic.proto.ConfigProtos.Config.LoRaConfig import org.meshtastic.proto.channelSettings -import org.meshtastic.core.strings.R as Res @Composable internal fun ChannelCard( diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/ChannelConfigHeader.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/ChannelConfigHeader.kt index c6c866eb7..9e7fd028e 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/ChannelConfigHeader.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/ChannelConfigHeader.kt @@ -25,12 +25,15 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.sp +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.channels +import org.meshtastic.core.strings.freq +import org.meshtastic.core.strings.slot import org.meshtastic.core.ui.component.PreferenceCategory import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res @Composable internal fun ChannelConfigHeader(frequency: Float, slot: Int) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/ChannelLegend.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/ChannelLegend.kt index 621560ddb..20c0d3535 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/ChannelLegend.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/ChannelLegend.kt @@ -17,7 +17,6 @@ package org.meshtastic.feature.settings.radio.channel.component -import androidx.annotation.StringRes import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -42,11 +41,28 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.DeviceVersion -import org.meshtastic.core.strings.R as Res +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.channel_features +import org.meshtastic.core.strings.downlink_enabled +import org.meshtastic.core.strings.downlink_feature_description +import org.meshtastic.core.strings.icon_meanings +import org.meshtastic.core.strings.info +import org.meshtastic.core.strings.location_sharing +import org.meshtastic.core.strings.manual_position_request +import org.meshtastic.core.strings.periodic_position_broadcast +import org.meshtastic.core.strings.primary +import org.meshtastic.core.strings.primary_channel_feature +import org.meshtastic.core.strings.secondary +import org.meshtastic.core.strings.secondary_channel_position_feature +import org.meshtastic.core.strings.secondary_no_telemetry +import org.meshtastic.core.strings.security_icon_help_dismiss +import org.meshtastic.core.strings.uplink_enabled +import org.meshtastic.core.strings.uplink_feature_description /** * At this firmware version periodic position sharing on a secondary channel was implemented. To enable this feature the @@ -57,8 +73,8 @@ internal const val SECONDARY_CHANNEL_EPOCH = "2.6.10" internal enum class ChannelIcons( val icon: ImageVector, - @StringRes val descriptionResId: Int, - @StringRes val additionalInfoResId: Int, + val descriptionResId: StringResource, + val additionalInfoResId: StringResource, ) { LOCATION( icon = Icons.Filled.LocationOn, diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/EditChannelDialog.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/EditChannelDialog.kt index 3bb356e04..bf9a5b4f2 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/EditChannelDialog.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/channel/component/EditChannelDialog.kt @@ -37,12 +37,19 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.Channel +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.channel_name +import org.meshtastic.core.strings.default_ +import org.meshtastic.core.strings.downlink_enabled +import org.meshtastic.core.strings.save +import org.meshtastic.core.strings.uplink_enabled import org.meshtastic.core.ui.component.EditBase64Preference import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.PositionPrecisionPreference @@ -50,7 +57,6 @@ import org.meshtastic.core.ui.component.SwitchPreference import org.meshtastic.proto.ChannelProtos import org.meshtastic.proto.channelSettings import org.meshtastic.proto.copy -import org.meshtastic.core.strings.R as Res @Suppress("LongMethod") @Composable diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/AmbientLightingConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/AmbientLightingConfigItemList.kt index 4492297c3..46af00b33 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/AmbientLightingConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/AmbientLightingConfigItemList.kt @@ -23,16 +23,23 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.ambient_lighting +import org.meshtastic.core.strings.ambient_lighting_config +import org.meshtastic.core.strings.blue +import org.meshtastic.core.strings.current +import org.meshtastic.core.strings.green +import org.meshtastic.core.strings.led_state +import org.meshtastic.core.strings.red import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.SwitchPreference import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.proto.copy import org.meshtastic.proto.moduleConfig -import org.meshtastic.core.strings.R as Res @Composable fun AmbientLightingConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/AudioConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/AudioConfigItemList.kt index 9c5846bca..f13aecdaf 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/AudioConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/AudioConfigItemList.kt @@ -23,9 +23,19 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.audio +import org.meshtastic.core.strings.audio_config +import org.meshtastic.core.strings.codec2_sample_rate +import org.meshtastic.core.strings.codec_2_enabled +import org.meshtastic.core.strings.i2s_clock +import org.meshtastic.core.strings.i2s_data_in +import org.meshtastic.core.strings.i2s_data_out +import org.meshtastic.core.strings.i2s_word_select +import org.meshtastic.core.strings.ptt_pin import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.SwitchPreference @@ -34,7 +44,6 @@ import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.proto.ModuleConfigProtos.ModuleConfig.AudioConfig import org.meshtastic.proto.copy import org.meshtastic.proto.moduleConfig -import org.meshtastic.core.strings.R as Res @Composable fun AudioConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/BluetoothConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/BluetoothConfigItemList.kt index 4c09ee082..e200379da 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/BluetoothConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/BluetoothConfigItemList.kt @@ -23,9 +23,15 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.bluetooth +import org.meshtastic.core.strings.bluetooth_config +import org.meshtastic.core.strings.bluetooth_enabled +import org.meshtastic.core.strings.fixed_pin +import org.meshtastic.core.strings.pairing_mode import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.SwitchPreference @@ -34,7 +40,6 @@ import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.proto.ConfigProtos.Config.BluetoothConfig import org.meshtastic.proto.config import org.meshtastic.proto.copy -import org.meshtastic.core.strings.R as Res @Composable fun BluetoothConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/CannedMessageConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/CannedMessageConfigItemList.kt index d6458fbd1..922477f08 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/CannedMessageConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/CannedMessageConfigItemList.kt @@ -27,11 +27,26 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.allow_input_source +import org.meshtastic.core.strings.canned_message +import org.meshtastic.core.strings.canned_message_config +import org.meshtastic.core.strings.canned_message_enabled +import org.meshtastic.core.strings.generate_input_event_on_ccw +import org.meshtastic.core.strings.generate_input_event_on_cw +import org.meshtastic.core.strings.generate_input_event_on_press +import org.meshtastic.core.strings.gpio_pin_for_rotary_encoder_a_port +import org.meshtastic.core.strings.gpio_pin_for_rotary_encoder_b_port +import org.meshtastic.core.strings.gpio_pin_for_rotary_encoder_press_port +import org.meshtastic.core.strings.messages +import org.meshtastic.core.strings.rotary_encoder_1_enabled +import org.meshtastic.core.strings.send_bell +import org.meshtastic.core.strings.up_down_select_input_enabled import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.SwitchPreference @@ -40,7 +55,6 @@ import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.proto.ModuleConfigProtos.ModuleConfig.CannedMessageConfig import org.meshtastic.proto.copy import org.meshtastic.proto.moduleConfig -import org.meshtastic.core.strings.R as Res @Composable fun CannedMessageConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/DetectionSensorConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/DetectionSensorConfigItemList.kt index 99f64b605..4456db3cd 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/DetectionSensorConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/DetectionSensorConfigItemList.kt @@ -25,11 +25,22 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.detection_sensor +import org.meshtastic.core.strings.detection_sensor_config +import org.meshtastic.core.strings.detection_sensor_enabled +import org.meshtastic.core.strings.detection_trigger_type +import org.meshtastic.core.strings.friendly_name +import org.meshtastic.core.strings.gpio_pin_to_monitor +import org.meshtastic.core.strings.minimum_broadcast_seconds +import org.meshtastic.core.strings.send_bell_with_alert_message +import org.meshtastic.core.strings.state_broadcast_seconds +import org.meshtastic.core.strings.use_input_pullup_mode import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.SwitchPreference @@ -41,7 +52,6 @@ import org.meshtastic.feature.settings.util.toDisplayString import org.meshtastic.proto.ModuleConfigProtos.ModuleConfig import org.meshtastic.proto.copy import org.meshtastic.proto.moduleConfig -import org.meshtastic.core.strings.R as Res @Composable fun DetectionSensorConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/DeviceConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/DeviceConfigItemList.kt index 0348473bb..c984cb284 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/DeviceConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/DeviceConfigItemList.kt @@ -56,7 +56,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.TextLinkStyles @@ -66,6 +65,51 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.StringResource +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.accept +import org.meshtastic.core.strings.are_you_sure +import org.meshtastic.core.strings.button_gpio +import org.meshtastic.core.strings.buzzer_gpio +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.config_device_doubleTapAsButtonPress_summary +import org.meshtastic.core.strings.config_device_ledHeartbeatEnabled_summary +import org.meshtastic.core.strings.config_device_tripleClickAsAdHocPing_summary +import org.meshtastic.core.strings.config_device_tzdef_summary +import org.meshtastic.core.strings.config_device_use_phone_tz +import org.meshtastic.core.strings.device +import org.meshtastic.core.strings.double_tap_as_button_press +import org.meshtastic.core.strings.gpio +import org.meshtastic.core.strings.hardware +import org.meshtastic.core.strings.i_know_what_i_m_doing +import org.meshtastic.core.strings.led_heartbeat +import org.meshtastic.core.strings.nodeinfo_broadcast_interval +import org.meshtastic.core.strings.options +import org.meshtastic.core.strings.rebroadcast_mode +import org.meshtastic.core.strings.rebroadcast_mode_all_desc +import org.meshtastic.core.strings.rebroadcast_mode_all_skip_decoding_desc +import org.meshtastic.core.strings.rebroadcast_mode_core_portnums_only_desc +import org.meshtastic.core.strings.rebroadcast_mode_known_only_desc +import org.meshtastic.core.strings.rebroadcast_mode_local_only_desc +import org.meshtastic.core.strings.rebroadcast_mode_none_desc +import org.meshtastic.core.strings.role +import org.meshtastic.core.strings.role_client_desc +import org.meshtastic.core.strings.role_client_hidden_desc +import org.meshtastic.core.strings.role_client_mute_desc +import org.meshtastic.core.strings.role_lost_and_found_desc +import org.meshtastic.core.strings.role_repeater_desc +import org.meshtastic.core.strings.role_router_client_desc +import org.meshtastic.core.strings.role_router_desc +import org.meshtastic.core.strings.role_router_late_desc +import org.meshtastic.core.strings.role_sensor_desc +import org.meshtastic.core.strings.role_tak_desc +import org.meshtastic.core.strings.role_tak_tracker_desc +import org.meshtastic.core.strings.role_tracker_desc +import org.meshtastic.core.strings.router_role_confirmation_text +import org.meshtastic.core.strings.time_zone +import org.meshtastic.core.strings.triple_click_adhoc_ping +import org.meshtastic.core.strings.unrecognized import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.InsetDivider @@ -79,9 +123,8 @@ import org.meshtastic.proto.ConfigProtos.Config.DeviceConfig import org.meshtastic.proto.config import org.meshtastic.proto.copy import java.time.ZoneId -import org.meshtastic.core.strings.R as Res -private val DeviceConfig.Role.description: Int +private val DeviceConfig.Role.description: StringResource get() = when (this) { DeviceConfig.Role.CLIENT -> Res.string.role_client_desc @@ -99,7 +142,7 @@ private val DeviceConfig.Role.description: Int else -> Res.string.unrecognized } -private val DeviceConfig.RebroadcastMode.description: Int +private val DeviceConfig.RebroadcastMode.description: StringResource get() = when (this) { DeviceConfig.RebroadcastMode.ALL -> Res.string.rebroadcast_mode_all_desc diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/DisplayConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/DisplayConfigItemList.kt index 8eb7679d6..a4ccf84be 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/DisplayConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/DisplayConfigItemList.kt @@ -22,9 +22,34 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.advanced +import org.meshtastic.core.strings.always_point_north +import org.meshtastic.core.strings.bold_heading +import org.meshtastic.core.strings.carousel_interval +import org.meshtastic.core.strings.compass_orientation +import org.meshtastic.core.strings.config_display_auto_screen_carousel_secs_summary +import org.meshtastic.core.strings.config_display_compass_north_top_summary +import org.meshtastic.core.strings.config_display_displaymode_summary +import org.meshtastic.core.strings.config_display_flip_screen_summary +import org.meshtastic.core.strings.config_display_heading_bold_summary +import org.meshtastic.core.strings.config_display_oled_summary +import org.meshtastic.core.strings.config_display_screen_on_secs_summary +import org.meshtastic.core.strings.config_display_units_summary +import org.meshtastic.core.strings.config_display_wake_on_tap_or_motion_summary +import org.meshtastic.core.strings.display +import org.meshtastic.core.strings.display_config +import org.meshtastic.core.strings.display_mode +import org.meshtastic.core.strings.display_time_in_12h_format +import org.meshtastic.core.strings.display_units +import org.meshtastic.core.strings.flip_screen +import org.meshtastic.core.strings.oled_type +import org.meshtastic.core.strings.screen_on_for +import org.meshtastic.core.strings.use_12h_format +import org.meshtastic.core.strings.wake_on_tap_or_motion import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.SwitchPreference import org.meshtastic.core.ui.component.TitledCard @@ -34,7 +59,6 @@ import org.meshtastic.feature.settings.util.toDisplayString import org.meshtastic.proto.ConfigProtos.Config.DisplayConfig import org.meshtastic.proto.config import org.meshtastic.proto.copy -import org.meshtastic.core.strings.R as Res @Composable fun DisplayConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/EditDeviceProfileDialog.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/EditDeviceProfileDialog.kt index 35ca92e8f..561e0f042 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/EditDeviceProfileDialog.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/EditDeviceProfileDialog.kt @@ -35,15 +35,17 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.google.protobuf.Descriptors +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.save import org.meshtastic.core.ui.component.SwitchPreference import org.meshtastic.proto.ClientOnlyProtos.DeviceProfile -import org.meshtastic.core.strings.R as Res private const val SUPPORTED_FIELDS = 7 diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/ExternalNotificationConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/ExternalNotificationConfigItemList.kt index 8fc985e28..d43db8eda 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/ExternalNotificationConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/ExternalNotificationConfigItemList.kt @@ -28,11 +28,33 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.advanced +import org.meshtastic.core.strings.alert_bell_buzzer +import org.meshtastic.core.strings.alert_bell_led +import org.meshtastic.core.strings.alert_bell_vibra +import org.meshtastic.core.strings.alert_message_buzzer +import org.meshtastic.core.strings.alert_message_led +import org.meshtastic.core.strings.alert_message_vibra +import org.meshtastic.core.strings.external_notification +import org.meshtastic.core.strings.external_notification_config +import org.meshtastic.core.strings.external_notification_enabled +import org.meshtastic.core.strings.nag_timeout_seconds +import org.meshtastic.core.strings.notifications_on_alert_bell_receipt +import org.meshtastic.core.strings.notifications_on_message_receipt +import org.meshtastic.core.strings.output_buzzer_gpio +import org.meshtastic.core.strings.output_duration_milliseconds +import org.meshtastic.core.strings.output_led_active_high +import org.meshtastic.core.strings.output_led_gpio +import org.meshtastic.core.strings.output_vibra_gpio +import org.meshtastic.core.strings.ringtone +import org.meshtastic.core.strings.use_i2s_as_buzzer +import org.meshtastic.core.strings.use_pwm_buzzer import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.SwitchPreference @@ -43,7 +65,6 @@ import org.meshtastic.feature.settings.util.gpioPins import org.meshtastic.feature.settings.util.toDisplayString import org.meshtastic.proto.copy import org.meshtastic.proto.moduleConfig -import org.meshtastic.core.strings.R as Res @Composable fun ExternalNotificationConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/LoRaConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/LoRaConfigItemList.kt index 78baa481d..d8702e254 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/LoRaConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/LoRaConfigItemList.kt @@ -26,12 +26,35 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.Channel import org.meshtastic.core.model.ChannelOption import org.meshtastic.core.model.RegionInfo import org.meshtastic.core.model.numChannels +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.advanced +import org.meshtastic.core.strings.bandwidth +import org.meshtastic.core.strings.coding_rate +import org.meshtastic.core.strings.config_lora_frequency_slot_summary +import org.meshtastic.core.strings.config_lora_hop_limit_summary +import org.meshtastic.core.strings.config_lora_modem_preset_summary +import org.meshtastic.core.strings.config_lora_region_summary +import org.meshtastic.core.strings.frequency_slot +import org.meshtastic.core.strings.hop_limit +import org.meshtastic.core.strings.ignore_mqtt +import org.meshtastic.core.strings.lora +import org.meshtastic.core.strings.modem_preset +import org.meshtastic.core.strings.ok_to_mqtt +import org.meshtastic.core.strings.options +import org.meshtastic.core.strings.override_frequency_mhz +import org.meshtastic.core.strings.pa_fan_disabled +import org.meshtastic.core.strings.region_frequency_plan +import org.meshtastic.core.strings.spread_factor +import org.meshtastic.core.strings.sx126x_rx_boosted_gain +import org.meshtastic.core.strings.tx_enabled +import org.meshtastic.core.strings.tx_power_dbm +import org.meshtastic.core.strings.use_modem_preset import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.SignedIntegerEditTextPreference @@ -41,7 +64,6 @@ import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.feature.settings.util.hopLimits import org.meshtastic.proto.config import org.meshtastic.proto.copy -import org.meshtastic.core.strings.R as Res @Composable fun LoRaConfigScreen(viewModel: RadioConfigViewModel, onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/MQTTConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/MQTTConfigItemList.kt index 31b9efd27..436de4d28 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/MQTTConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/MQTTConfigItemList.kt @@ -26,11 +26,25 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.address +import org.meshtastic.core.strings.default_mqtt_address +import org.meshtastic.core.strings.encryption_enabled +import org.meshtastic.core.strings.json_output_enabled +import org.meshtastic.core.strings.map_reporting +import org.meshtastic.core.strings.mqtt +import org.meshtastic.core.strings.mqtt_config +import org.meshtastic.core.strings.mqtt_enabled +import org.meshtastic.core.strings.password +import org.meshtastic.core.strings.proxy_to_client_enabled +import org.meshtastic.core.strings.root_topic +import org.meshtastic.core.strings.tls_enabled +import org.meshtastic.core.strings.username import org.meshtastic.core.ui.component.EditPasswordPreference import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.SwitchPreference @@ -38,7 +52,6 @@ import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.proto.copy import org.meshtastic.proto.moduleConfig -import org.meshtastic.core.strings.R as Res @Composable fun MQTTConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreference.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreference.kt index bc1d41d28..30c835860 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreference.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/MapReportingPreference.kt @@ -34,19 +34,26 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.util.DistanceUnit import org.meshtastic.core.model.util.toDistanceString +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.i_agree +import org.meshtastic.core.strings.i_agree_to_share_my_location +import org.meshtastic.core.strings.map_reporting +import org.meshtastic.core.strings.map_reporting_consent_header +import org.meshtastic.core.strings.map_reporting_consent_text +import org.meshtastic.core.strings.map_reporting_interval_seconds +import org.meshtastic.core.strings.map_reporting_summary import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.SwitchPreference import org.meshtastic.core.ui.component.precisionBitsToMeters import org.meshtastic.feature.settings.util.IntervalConfiguration import org.meshtastic.feature.settings.util.toDisplayString import kotlin.math.roundToInt -import org.meshtastic.core.strings.R as Res private const val POSITION_PRECISION_MIN = 12 private const val POSITION_PRECISION_MAX = 15 diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/NeighborInfoConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/NeighborInfoConfigItemList.kt index 633a76d2a..fed1865b3 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/NeighborInfoConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/NeighborInfoConfigItemList.kt @@ -23,16 +23,22 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.config_device_transmitOverLora_summary +import org.meshtastic.core.strings.neighbor_info +import org.meshtastic.core.strings.neighbor_info_config +import org.meshtastic.core.strings.neighbor_info_enabled +import org.meshtastic.core.strings.transmit_over_lora +import org.meshtastic.core.strings.update_interval_seconds import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.SwitchPreference import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.proto.copy import org.meshtastic.proto.moduleConfig -import org.meshtastic.core.strings.R as Res @Composable fun NeighborInfoConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/NetworkConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/NetworkConfigItemList.kt index 6c5167b73..70d4e9ac4 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/NetworkConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/NetworkConfigItemList.kt @@ -34,7 +34,6 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp @@ -42,6 +41,33 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.journeyapps.barcodescanner.ScanContract import com.journeyapps.barcodescanner.ScanOptions +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.advanced +import org.meshtastic.core.strings.config_network_eth_enabled_summary +import org.meshtastic.core.strings.config_network_udp_enabled_summary +import org.meshtastic.core.strings.config_network_wifi_enabled_summary +import org.meshtastic.core.strings.connection_status +import org.meshtastic.core.strings.error +import org.meshtastic.core.strings.ethernet_config +import org.meshtastic.core.strings.ethernet_enabled +import org.meshtastic.core.strings.ethernet_ip +import org.meshtastic.core.strings.gateway +import org.meshtastic.core.strings.ip +import org.meshtastic.core.strings.ipv4_mode +import org.meshtastic.core.strings.network +import org.meshtastic.core.strings.ntp_server +import org.meshtastic.core.strings.password +import org.meshtastic.core.strings.rsyslog_server +import org.meshtastic.core.strings.ssid +import org.meshtastic.core.strings.subnet +import org.meshtastic.core.strings.udp_config +import org.meshtastic.core.strings.udp_enabled +import org.meshtastic.core.strings.wifi_config +import org.meshtastic.core.strings.wifi_enabled +import org.meshtastic.core.strings.wifi_ip +import org.meshtastic.core.strings.wifi_qr_code_error +import org.meshtastic.core.strings.wifi_qr_code_scan import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.EditIPv4Preference import org.meshtastic.core.ui.component.EditPasswordPreference @@ -54,7 +80,6 @@ import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.proto.ConfigProtos.Config.NetworkConfig import org.meshtastic.proto.config import org.meshtastic.proto.copy -import org.meshtastic.core.strings.R as Res @Composable private fun ScanErrorDialog(onDismiss: () -> Unit = {}) = diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PacketResponseStateDialog.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PacketResponseStateDialog.kt index 8dac0c0c4..647afcc84 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PacketResponseStateDialog.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PacketResponseStateDialog.kt @@ -33,11 +33,14 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.close +import org.meshtastic.core.strings.delivery_confirmed +import org.meshtastic.core.strings.error import org.meshtastic.feature.settings.radio.ResponseState -import org.meshtastic.core.strings.R as Res @Composable fun PacketResponseStateDialog(state: ResponseState, onDismiss: () -> Unit = {}, onComplete: () -> Unit = {}) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PaxcounterConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PaxcounterConfigItemList.kt index ed66d2cbc..293ed349d 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PaxcounterConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PaxcounterConfigItemList.kt @@ -24,9 +24,16 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.ble_rssi_threshold_defaults_to_80 +import org.meshtastic.core.strings.paxcounter +import org.meshtastic.core.strings.paxcounter_config +import org.meshtastic.core.strings.paxcounter_enabled +import org.meshtastic.core.strings.update_interval_seconds +import org.meshtastic.core.strings.wifi_rssi_threshold_defaults_to_80 import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.SignedIntegerEditTextPreference import org.meshtastic.core.ui.component.SwitchPreference @@ -36,7 +43,6 @@ import org.meshtastic.feature.settings.util.IntervalConfiguration import org.meshtastic.feature.settings.util.toDisplayString import org.meshtastic.proto.copy import org.meshtastic.proto.moduleConfig -import org.meshtastic.core.strings.R as Res @Composable fun PaxcounterConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PositionConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PositionConfigItemList.kt index 96970194d..2a7c6e2a0 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PositionConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PositionConfigItemList.kt @@ -35,14 +35,39 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.core.location.LocationCompat import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.rememberPermissionState import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.Position +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.advanced_device_gps +import org.meshtastic.core.strings.altitude +import org.meshtastic.core.strings.broadcast_interval +import org.meshtastic.core.strings.config_position_broadcast_secs_summary +import org.meshtastic.core.strings.config_position_broadcast_smart_minimum_distance_summary +import org.meshtastic.core.strings.config_position_broadcast_smart_minimum_interval_secs_summary +import org.meshtastic.core.strings.config_position_flags_summary +import org.meshtastic.core.strings.config_position_gps_update_interval_summary +import org.meshtastic.core.strings.device_gps +import org.meshtastic.core.strings.fixed_position +import org.meshtastic.core.strings.gps_en_gpio +import org.meshtastic.core.strings.gps_mode +import org.meshtastic.core.strings.gps_receive_gpio +import org.meshtastic.core.strings.gps_transmit_gpio +import org.meshtastic.core.strings.latitude +import org.meshtastic.core.strings.longitude +import org.meshtastic.core.strings.minimum_distance +import org.meshtastic.core.strings.minimum_interval +import org.meshtastic.core.strings.position +import org.meshtastic.core.strings.position_config_set_fixed_from_phone +import org.meshtastic.core.strings.position_flags +import org.meshtastic.core.strings.position_packet +import org.meshtastic.core.strings.smart_position +import org.meshtastic.core.strings.update_interval import org.meshtastic.core.ui.component.BitwisePreference import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.EditTextPreference @@ -56,7 +81,6 @@ import org.meshtastic.feature.settings.util.toDisplayString import org.meshtastic.proto.ConfigProtos.Config.PositionConfig import org.meshtastic.proto.config import org.meshtastic.proto.copy -import org.meshtastic.core.strings.R as Res @OptIn(ExperimentalPermissionsApi::class) @Composable diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PowerConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PowerConfigItemList.kt index b3e82f555..c8fee4e2a 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PowerConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/PowerConfigItemList.kt @@ -24,9 +24,21 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.adc_multiplier_override +import org.meshtastic.core.strings.adc_multiplier_override_ratio +import org.meshtastic.core.strings.battery_ina_2xx_i2c_address +import org.meshtastic.core.strings.config_power_is_power_saving_summary +import org.meshtastic.core.strings.enable_power_saving_mode +import org.meshtastic.core.strings.minimum_wake_time_seconds +import org.meshtastic.core.strings.power +import org.meshtastic.core.strings.power_config +import org.meshtastic.core.strings.shutdown_on_power_loss +import org.meshtastic.core.strings.super_deep_sleep_duration_seconds +import org.meshtastic.core.strings.wait_for_bluetooth_duration_seconds import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.SwitchPreference @@ -36,7 +48,6 @@ import org.meshtastic.feature.settings.util.IntervalConfiguration import org.meshtastic.feature.settings.util.toDisplayString import org.meshtastic.proto.config import org.meshtastic.proto.copy -import org.meshtastic.core.strings.R as Res @Composable fun PowerConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RadioConfigScreenList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RadioConfigScreenList.kt index 57bcb030b..16fc3a6ca 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RadioConfigScreenList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RadioConfigScreenList.kt @@ -38,13 +38,15 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.google.protobuf.MessageLite +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.discard_changes +import org.meshtastic.core.strings.save_changes import org.meshtastic.core.ui.component.MainAppBar import org.meshtastic.core.ui.component.PreferenceFooter import org.meshtastic.feature.settings.radio.ResponseState -import org.meshtastic.core.strings.R as Res @Composable fun RadioConfigScreenList( diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RangeTestConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RangeTestConfigItemList.kt index 2723c76ca..59c49092e 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RangeTestConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RangeTestConfigItemList.kt @@ -22,9 +22,15 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.range_test +import org.meshtastic.core.strings.range_test_config +import org.meshtastic.core.strings.range_test_enabled +import org.meshtastic.core.strings.save_csv_in_storage_esp32_only +import org.meshtastic.core.strings.sender_message_interval_seconds import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.SwitchPreference import org.meshtastic.core.ui.component.TitledCard @@ -33,7 +39,6 @@ import org.meshtastic.feature.settings.util.IntervalConfiguration import org.meshtastic.feature.settings.util.toDisplayString import org.meshtastic.proto.copy import org.meshtastic.proto.moduleConfig -import org.meshtastic.core.strings.R as Res @Composable fun RangeTestConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RemoteHardwareConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RemoteHardwareConfigItemList.kt index 38d069560..9b8fe0a73 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RemoteHardwareConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/RemoteHardwareConfigItemList.kt @@ -23,16 +23,21 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.allow_undefined_pin_access +import org.meshtastic.core.strings.available_pins +import org.meshtastic.core.strings.remote_hardware +import org.meshtastic.core.strings.remote_hardware_config +import org.meshtastic.core.strings.remote_hardware_enabled import org.meshtastic.core.ui.component.EditListPreference import org.meshtastic.core.ui.component.SwitchPreference import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.proto.copy import org.meshtastic.proto.moduleConfig -import org.meshtastic.core.strings.R as Res @Composable fun RemoteHardwareConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/SecurityConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/SecurityConfigItemList.kt index 784109a91..07dfd7eb5 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/SecurityConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/SecurityConfigItemList.kt @@ -39,13 +39,38 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.protobuf.ByteString +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.util.encodeToString import org.meshtastic.core.model.util.toByteString +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.admin_key +import org.meshtastic.core.strings.admin_keys +import org.meshtastic.core.strings.administration +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.config_security_admin_key +import org.meshtastic.core.strings.config_security_debug_log_api_enabled +import org.meshtastic.core.strings.config_security_is_managed +import org.meshtastic.core.strings.config_security_private_key +import org.meshtastic.core.strings.config_security_public_key +import org.meshtastic.core.strings.config_security_serial_enabled +import org.meshtastic.core.strings.debug_log_api_enabled +import org.meshtastic.core.strings.direct_message_key +import org.meshtastic.core.strings.export_keys +import org.meshtastic.core.strings.export_keys_confirmation +import org.meshtastic.core.strings.legacy_admin_channel +import org.meshtastic.core.strings.logs +import org.meshtastic.core.strings.managed_mode +import org.meshtastic.core.strings.okay +import org.meshtastic.core.strings.private_key +import org.meshtastic.core.strings.public_key +import org.meshtastic.core.strings.regenerate_keys_confirmation +import org.meshtastic.core.strings.regenerate_private_key +import org.meshtastic.core.strings.security +import org.meshtastic.core.strings.serial_console import org.meshtastic.core.ui.component.CopyIconButton import org.meshtastic.core.ui.component.EditBase64Preference import org.meshtastic.core.ui.component.EditListPreference @@ -56,7 +81,6 @@ import org.meshtastic.proto.ConfigProtos.Config.SecurityConfig import org.meshtastic.proto.config import org.meshtastic.proto.copy import java.security.SecureRandom -import org.meshtastic.core.strings.R as Res @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/SerialConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/SerialConfigItemList.kt index 6225d74a7..159847924 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/SerialConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/SerialConfigItemList.kt @@ -23,9 +23,18 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.echo_enabled +import org.meshtastic.core.strings.override_console_serial_port +import org.meshtastic.core.strings.serial +import org.meshtastic.core.strings.serial_baud_rate +import org.meshtastic.core.strings.serial_config +import org.meshtastic.core.strings.serial_enabled +import org.meshtastic.core.strings.serial_mode +import org.meshtastic.core.strings.timeout import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.SwitchPreference @@ -34,7 +43,6 @@ import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.proto.ModuleConfigProtos.ModuleConfig.SerialConfig import org.meshtastic.proto.copy import org.meshtastic.proto.moduleConfig -import org.meshtastic.core.strings.R as Res @Composable fun SerialConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/StoreForwardConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/StoreForwardConfigItemList.kt index ecfa40435..068629324 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/StoreForwardConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/StoreForwardConfigItemList.kt @@ -23,16 +23,24 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.heartbeat +import org.meshtastic.core.strings.history_return_max +import org.meshtastic.core.strings.history_return_window +import org.meshtastic.core.strings.number_of_records +import org.meshtastic.core.strings.server +import org.meshtastic.core.strings.store_forward +import org.meshtastic.core.strings.store_forward_config +import org.meshtastic.core.strings.store_forward_enabled import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.SwitchPreference import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.proto.copy import org.meshtastic.proto.moduleConfig -import org.meshtastic.core.strings.R as Res @Composable fun StoreForwardConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/TelemetryConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/TelemetryConfigItemList.kt index 6bc8e2e59..321ecb443 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/TelemetryConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/TelemetryConfigItemList.kt @@ -22,10 +22,25 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember -import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.model.DeviceVersion +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.air_quality_metrics_module_enabled +import org.meshtastic.core.strings.air_quality_metrics_update_interval_seconds +import org.meshtastic.core.strings.device_metrics_update_interval_seconds +import org.meshtastic.core.strings.device_telemetry_enabled +import org.meshtastic.core.strings.device_telemetry_enabled_summary +import org.meshtastic.core.strings.environment_metrics_module_enabled +import org.meshtastic.core.strings.environment_metrics_on_screen_enabled +import org.meshtastic.core.strings.environment_metrics_update_interval_seconds +import org.meshtastic.core.strings.environment_metrics_use_fahrenheit +import org.meshtastic.core.strings.power_metrics_module_enabled +import org.meshtastic.core.strings.power_metrics_on_screen_enabled +import org.meshtastic.core.strings.power_metrics_update_interval_seconds +import org.meshtastic.core.strings.telemetry +import org.meshtastic.core.strings.telemetry_config import org.meshtastic.core.ui.component.DropDownPreference import org.meshtastic.core.ui.component.SwitchPreference import org.meshtastic.core.ui.component.TitledCard @@ -34,7 +49,6 @@ import org.meshtastic.feature.settings.util.IntervalConfiguration import org.meshtastic.feature.settings.util.toDisplayString import org.meshtastic.proto.copy import org.meshtastic.proto.moduleConfig -import org.meshtastic.core.strings.R as Res private const val MIN_FW_FOR_TELEMETRY_TOGGLE = "2.7.12" diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/UserConfigItemList.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/UserConfigItemList.kt index 9d45ef826..b1489ddbe 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/UserConfigItemList.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/UserConfigItemList.kt @@ -24,20 +24,30 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import org.jetbrains.compose.resources.stringResource import org.meshtastic.core.database.model.isUnmessageableRole import org.meshtastic.core.model.DeviceVersion +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.hardware_model +import org.meshtastic.core.strings.licensed_amateur_radio +import org.meshtastic.core.strings.licensed_amateur_radio_text +import org.meshtastic.core.strings.long_name +import org.meshtastic.core.strings.node_id +import org.meshtastic.core.strings.short_name +import org.meshtastic.core.strings.unmessageable +import org.meshtastic.core.strings.unmonitored_or_infrastructure +import org.meshtastic.core.strings.user +import org.meshtastic.core.strings.user_config import org.meshtastic.core.ui.component.EditTextPreference import org.meshtastic.core.ui.component.RegularPreference import org.meshtastic.core.ui.component.SwitchPreference import org.meshtastic.core.ui.component.TitledCard import org.meshtastic.feature.settings.radio.RadioConfigViewModel import org.meshtastic.proto.copy -import org.meshtastic.core.strings.R as Res @Composable fun UserConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel(), onBack: () -> Unit) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/WarningDialog.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/WarningDialog.kt index 6ab5fc28a..1e582f72a 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/WarningDialog.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/radio/component/WarningDialog.kt @@ -26,10 +26,12 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.cancel +import org.meshtastic.core.strings.send import org.meshtastic.core.ui.theme.AppTheme -import org.meshtastic.core.strings.R as Res @Composable fun WarningDialog( diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/Formatting.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/Formatting.kt index 34f7c804c..edd6e15cd 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/Formatting.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/Formatting.kt @@ -18,8 +18,9 @@ package org.meshtastic.feature.settings.util import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource -import org.meshtastic.core.strings.R as Res +import org.jetbrains.compose.resources.stringResource +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.unset @Composable fun FixedUpdateIntervals.toDisplayString(): String = if (this == FixedUpdateIntervals.UNSET) { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/LanguageUtils.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/LanguageUtils.kt index 0114b0565..812254f97 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/LanguageUtils.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/LanguageUtils.kt @@ -20,10 +20,16 @@ package org.meshtastic.feature.settings.util import android.content.Context import androidx.appcompat.app.AppCompatDelegate import androidx.core.os.LocaleListCompat +import com.meshtastic.core.strings.getString +import org.meshtastic.core.strings.Res +import org.meshtastic.core.strings.fr_HT +import org.meshtastic.core.strings.preferences_system_default +import org.meshtastic.core.strings.pt_BR +import org.meshtastic.core.strings.zh_CN +import org.meshtastic.core.strings.zh_TW import org.xmlpull.v1.XmlPullParser import timber.log.Timber import java.util.Locale -import org.meshtastic.core.strings.R as Res object LanguageUtils { diff --git a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/UiText.kt b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/UiText.kt index 821b1b151..a894ddfcb 100644 --- a/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/UiText.kt +++ b/feature/settings/src/main/kotlin/org/meshtastic/feature/settings/util/UiText.kt @@ -17,15 +17,14 @@ package org.meshtastic.feature.settings.util -import androidx.annotation.StringRes import androidx.compose.runtime.Composable -import androidx.compose.ui.res.stringResource +import org.jetbrains.compose.resources.stringResource @Suppress("SpreadOperator") sealed class UiText { data class DynamicString(val value: String) : UiText() - class StringResource(@StringRes val resId: Int, vararg val args: Any) : UiText() + class StringResource(val resId: org.jetbrains.compose.resources.StringResource, vararg val args: Any) : UiText() @Composable fun asString(): String = when (this) { diff --git a/feature/settings/src/main/res/xml/locales_config.xml b/feature/settings/src/main/res/xml/locales_config.xml index ec1fe53ec..ebad92964 100644 --- a/feature/settings/src/main/res/xml/locales_config.xml +++ b/feature/settings/src/main/res/xml/locales_config.xml @@ -18,42 +18,42 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + - - - + + + + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ebc9a1035..bedebdfa9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -64,7 +64,7 @@ androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = " androidx-room-testing = { module = "androidx.room:room-testing", version.ref = "room" } androidx-work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version = "2.11.0" } -# Compose +# AndroidX Compose accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" } androidx-compose-bom = { module = "androidx.compose:compose-bom-alpha", version = "2025.11.00" } androidx-compose-material-iconsExtended = { module = "androidx.compose.material:material-icons-extended" } @@ -99,7 +99,7 @@ protobuf-protoc = { module = "com.google.protobuf:protoc", version.ref = "protob zxing-core = { module = "com.google.zxing:core", version = "3.5.3" } truth = { module = "com.google.truth:truth", version = "1.4.5" } -# Kotlin +# Jetbrains kotlin-gradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version = "0.4.0" } kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines-android" } @@ -169,13 +169,16 @@ spotless-gradlePlugin = { module = "com.diffplug.spotless:spotless-plugin-gradle [plugins] # Android android-application = { id = "com.android.application", version.ref = "agp" } +android-kotlin-multiplatform-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } android-lint = { id = "com.android.lint", version.ref = "agp" } -# Kotlin -compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +# Jetbrains +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +compose-multiplatform = { id = "org.jetbrains.compose", version = "1.9.1" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } kover = { id = "org.jetbrains.kotlinx.kover", version = "0.9.3" } @@ -212,4 +215,5 @@ meshtastic-android-test = { id = "meshtastic.android.test" } meshtastic-detekt = { id = "meshtastic.detekt" } meshtastic-hilt = { id = "meshtastic.hilt" } meshtastic-kotlinx-serialization = { id = "meshtastic.kotlinx.serialization" } +meshtastic-kmp-library = { id = "meshtastic.kmp.library" } meshtastic-spotless = { id = "meshtastic.spotless" }