From d2db37e0d4417db81aeb0f307b08a7205ffe32bb Mon Sep 17 00:00:00 2001 From: James Rich <2199651+jamesarich@users.noreply.github.com> Date: Mon, 22 Sep 2025 20:59:39 -0500 Subject: [PATCH] refactor(R): Move R file imports to core UI module (#3159) Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com> --- app/build.gradle.kts | 1 + .../mesh/compose/DebugFiltersTest.kt | 2 +- .../mesh/compose/DebugSearchTest.kt | 2 +- .../compose/EditDeviceProfileDialogTest.kt | 2 +- .../compose/MapReportingPreferenceTest.kt | 2 +- .../mesh/compose/MessageItemTest.kt | 81 +++++---- .../mesh/compose/ScannedQrCodeDialogTest.kt | 2 +- .../com/geeksville/mesh/ui/map/MapView.kt | 10 +- .../mesh/ui/map/components/CacheLayout.kt | 2 +- .../mesh/ui/map/components/DownloadButton.kt | 2 +- .../ui/map/components/EditWaypointDialog.kt | 2 +- .../mesh/ui/map/components/MapButton.kt | 2 +- .../geeksville/mesh/util/MapViewExtensions.kt | 4 +- .../com/geeksville/mesh/ui/map/MapView.kt | 2 +- .../map/components/ClusterItemsListDialog.kt | 2 +- .../ui/map/components/CustomMapLayersSheet.kt | 2 +- .../CustomTileProviderManagerSheet.kt | 2 +- .../ui/map/components/EditWaypointDialog.kt | 2 +- .../ui/map/components/MapControlsOverlay.kt | 2 +- .../ui/map/components/MapFilterDropdown.kt | 2 +- .../mesh/ui/map/components/MapTypeDropdown.kt | 2 +- .../mesh/ui/map/components/WaypointMarkers.kt | 2 +- .../com/geeksville/mesh/model/BTScanModel.kt | 2 +- .../java/com/geeksville/mesh/model/Message.kt | 15 +- .../geeksville/mesh/model/MetricsViewModel.kt | 2 +- .../{SortOption.kt => NodeSortOption.kt} | 2 +- .../java/com/geeksville/mesh/model/UIState.kt | 2 +- .../mesh/navigation/NodesNavigation.kt | 2 +- .../mesh/navigation/SettingsNavigation.kt | 2 +- .../RecentAddressesRepository.kt | 19 +- .../geeksville/mesh/service/MeshService.kt | 2 +- .../mesh/service/MeshServiceNotifications.kt | 10 +- .../main/java/com/geeksville/mesh/ui/Main.kt | 2 +- .../mesh/ui/common/components/AlertDialogs.kt | 58 +++--- .../mesh/ui/common/components/BatteryInfo.kt | 72 +++----- .../ui/common/components/BitwisePreference.kt | 2 +- .../ui/common/components/CopyIconButton.kt | 9 +- .../common/components/EditBase64Preference.kt | 2 +- .../common/components/EditListPreference.kt | 2 +- .../components/EditPasswordPreference.kt | 18 +- .../common/components/EditTextPreference.kt | 2 +- .../ui/common/components/IndoorAirQuality.kt | 2 +- .../common/components/LoraSignalIndicator.kt | 2 +- .../mesh/ui/common/components/MainAppBar.kt | 4 +- .../components/PositionPrecisionPreference.kt | 2 +- .../ui/common/components/PreferenceFooter.kt | 29 +-- .../common/components/ScannedQrCodeDialog.kt | 2 +- .../mesh/ui/common/components/SecurityIcon.kt | 2 +- .../mesh/ui/common/components/SignalInfo.kt | 85 ++++----- .../ui/common/components/SimpleAlertDialog.kt | 55 ++---- .../mesh/ui/connections/ConnectionsScreen.kt | 2 +- .../ui/connections/components/BLEDevices.kt | 2 +- .../components/ConnectionsSegmentedBar.kt | 2 +- .../components/CurrentlyConnectedInfo.kt | 2 +- .../connections/components/DeviceListItem.kt | 2 +- .../connections/components/NetworkDevices.kt | 2 +- .../ui/connections/components/UsbDevices.kt | 2 +- .../geeksville/mesh/ui/contact/ContactItem.kt | 2 +- .../geeksville/mesh/ui/contact/Contacts.kt | 2 +- .../com/geeksville/mesh/ui/debug/Debug.kt | 2 +- .../geeksville/mesh/ui/debug/DebugFilters.kt | 165 ++++++++---------- .../geeksville/mesh/ui/debug/DebugSearch.kt | 4 +- .../mesh/ui/intro/CriticalAlertsScreen.kt | 2 +- .../mesh/ui/intro/LocationScreen.kt | 2 +- .../mesh/ui/intro/NotificationsScreen.kt | 2 +- .../mesh/ui/intro/PermissionScreenLayout.kt | 3 +- .../geeksville/mesh/ui/intro/WelcomeScreen.kt | 2 +- .../com/geeksville/mesh/ui/map/MapScreen.kt | 2 +- .../com/geeksville/mesh/ui/message/Message.kt | 2 +- .../geeksville/mesh/ui/message/MessageList.kt | 2 +- .../geeksville/mesh/ui/message/QuickChat.kt | 2 +- .../ui/message/components/MessageActions.kt | 71 +++----- .../mesh/ui/message/components/MessageItem.kt | 2 +- .../mesh/ui/metrics/CommonCharts.kt | 2 +- .../mesh/ui/metrics/DeviceMetrics.kt | 2 +- .../mesh/ui/metrics/EnvironmentCharts.kt | 2 +- .../mesh/ui/metrics/EnvironmentMetrics.kt | 2 +- .../mesh/ui/metrics/HostMetricsLog.kt | 2 +- .../geeksville/mesh/ui/metrics/PaxMetrics.kt | 2 +- .../geeksville/mesh/ui/metrics/PositionLog.kt | 2 +- .../mesh/ui/metrics/PowerMetrics.kt | 2 +- .../mesh/ui/metrics/SignalMetrics.kt | 2 +- .../mesh/ui/metrics/TracerouteLog.kt | 2 +- .../com/geeksville/mesh/ui/node/NodeDetail.kt | 23 ++- .../com/geeksville/mesh/ui/node/NodeScreen.kt | 2 +- .../mesh/ui/node/components/LastHeardInfo.kt | 16 +- .../ui/node/components/NodeFilterTextField.kt | 2 +- .../mesh/ui/node/components/NodeItem.kt | 2 +- .../ui/node/components/NodeKeyStatusIcon.kt | 6 +- .../mesh/ui/node/components/NodeMenu.kt | 70 ++++---- .../ui/node/components/NodeStatusIcons.kt | 2 +- .../ui/node/components/TracerouteButton.kt | 2 +- .../mesh/ui/settings/SettingsScreen.kt | 2 +- .../settings/radio/CleanNodeDatabaseScreen.kt | 2 +- .../mesh/ui/settings/radio/RadioConfig.kt | 2 +- .../ui/settings/radio/RadioConfigViewModel.kt | 2 +- .../AmbientLightingConfigItemList.kt | 2 +- .../radio/components/AudioConfigItemList.kt | 2 +- .../components/BluetoothConfigItemList.kt | 2 +- .../components/CannedMessageConfigItemList.kt | 2 +- .../radio/components/ChannelLegend.kt | 2 +- .../components/ChannelSettingsItemList.kt | 2 +- .../DetectionSensorConfigItemList.kt | 2 +- .../radio/components/DeviceConfigItemList.kt | 2 +- .../radio/components/DisplayConfigItemList.kt | 2 +- .../radio/components/EditChannelDialog.kt | 2 +- .../components/EditDeviceProfileDialog.kt | 2 +- .../ExternalNotificationConfigItemList.kt | 2 +- .../radio/components/LoRaConfigItemList.kt | 2 +- .../radio/components/MQTTConfigItemList.kt | 2 +- .../components/MapReportingPreference.kt | 2 +- .../components/NeighborInfoConfigItemList.kt | 2 +- .../radio/components/NetworkConfigItemList.kt | 2 +- .../components/PacketResponseStateDialog.kt | 2 +- .../components/PaxcounterConfigItemList.kt | 2 +- .../components/PositionConfigItemList.kt | 2 +- .../radio/components/PowerConfigItemList.kt | 2 +- .../components/RangeTestConfigItemList.kt | 2 +- .../RemoteHardwareConfigItemList.kt | 2 +- .../components/SecurityConfigItemList.kt | 2 +- .../radio/components/SerialConfigItemList.kt | 2 +- .../components/StoreForwardConfigItemList.kt | 2 +- .../components/TelemetryConfigItemList.kt | 2 +- .../radio/components/UserConfigItemList.kt | 2 +- .../radio/components/WarningDialog.kt | 2 +- .../com/geeksville/mesh/ui/sharing/Channel.kt | 4 +- .../mesh/ui/sharing/ContactSharing.kt | 6 +- .../com/geeksville/mesh/ui/sharing/Share.kt | 2 +- .../com/geeksville/mesh/util/LanguageUtils.kt | 4 +- app/src/main/res/drawable/ic_antenna_24.xml | 39 +++-- .../main/res/drawable/ic_power_plug_24.xml | 37 ++-- .../main/res/xml/data_extraction_rules.xml | 30 ++-- app/src/main/res/xml/device_filter.xml | 30 ++-- app/src/main/res/xml/locales_config.xml | 17 ++ core/strings/build.gradle.kts | 20 +++ .../src/main/res/values-ar-rSA/strings.xml | 0 .../src/main/res/values-b+sr+Latn/strings.xml | 0 .../src/main/res/values-bg-rBG/strings.xml | 0 .../src/main/res/values-ca-rES/strings.xml | 0 .../src/main/res/values-cs-rCZ/strings.xml | 0 .../src/main/res/values-de-rDE/strings.xml | 0 .../src/main/res/values-el-rGR/strings.xml | 0 .../src/main/res/values-es-rES/strings.xml | 0 .../src/main/res/values-et-rEE/strings.xml | 0 .../src/main/res/values-fi-rFI/strings.xml | 0 .../src/main/res/values-fr-rFR/strings.xml | 0 .../src/main/res/values-ga-rIE/strings.xml | 0 .../src/main/res/values-gl-rES/strings.xml | 0 .../src/main/res/values-hr-rHR/strings.xml | 0 .../src/main/res/values-ht-rHT/strings.xml | 0 .../src/main/res/values-hu-rHU/strings.xml | 0 .../src/main/res/values-is-rIS/strings.xml | 0 .../src/main/res/values-it-rIT/strings.xml | 0 .../src/main/res/values-iw-rIL/strings.xml | 0 .../src/main/res/values-ja-rJP/strings.xml | 0 .../src/main/res/values-ko-rKR/strings.xml | 0 .../src/main/res/values-lt-rLT/strings.xml | 0 .../src/main/res/values-nl-rNL/strings.xml | 0 .../src/main/res/values-no-rNO/strings.xml | 0 .../src/main/res/values-pl-rPL/strings.xml | 0 .../src/main/res/values-pt-rBR/strings.xml | 0 .../src/main/res/values-pt-rPT/strings.xml | 0 .../src/main/res/values-ro-rRO/strings.xml | 0 .../src/main/res/values-ru-rRU/strings.xml | 0 .../src/main/res/values-sk-rSK/strings.xml | 0 .../src/main/res/values-sl-rSI/strings.xml | 0 .../src/main/res/values-sq-rAL/strings.xml | 0 .../src/main/res/values-srp/strings.xml | 0 .../src/main/res/values-sv-rSE/strings.xml | 0 .../src/main/res/values-tr-rTR/strings.xml | 0 .../src/main/res/values-uk-rUA/strings.xml | 0 .../src/main/res/values-zh-rCN/strings.xml | 0 .../src/main/res/values-zh-rTW/strings.xml | 0 .../strings}/src/main/res/values/strings.xml | 0 crowdin.yml | 2 +- settings.gradle.kts | 3 +- 176 files changed, 579 insertions(+), 647 deletions(-) rename app/src/main/java/com/geeksville/mesh/model/{SortOption.kt => NodeSortOption.kt} (97%) create mode 100644 core/strings/build.gradle.kts rename {app => core/strings}/src/main/res/values-ar-rSA/strings.xml (100%) rename {app => core/strings}/src/main/res/values-b+sr+Latn/strings.xml (100%) rename {app => core/strings}/src/main/res/values-bg-rBG/strings.xml (100%) rename {app => core/strings}/src/main/res/values-ca-rES/strings.xml (100%) rename {app => core/strings}/src/main/res/values-cs-rCZ/strings.xml (100%) rename {app => core/strings}/src/main/res/values-de-rDE/strings.xml (100%) rename {app => core/strings}/src/main/res/values-el-rGR/strings.xml (100%) rename {app => core/strings}/src/main/res/values-es-rES/strings.xml (100%) rename {app => core/strings}/src/main/res/values-et-rEE/strings.xml (100%) rename {app => core/strings}/src/main/res/values-fi-rFI/strings.xml (100%) rename {app => core/strings}/src/main/res/values-fr-rFR/strings.xml (100%) rename {app => core/strings}/src/main/res/values-ga-rIE/strings.xml (100%) rename {app => core/strings}/src/main/res/values-gl-rES/strings.xml (100%) rename {app => core/strings}/src/main/res/values-hr-rHR/strings.xml (100%) rename {app => core/strings}/src/main/res/values-ht-rHT/strings.xml (100%) rename {app => core/strings}/src/main/res/values-hu-rHU/strings.xml (100%) rename {app => core/strings}/src/main/res/values-is-rIS/strings.xml (100%) rename {app => core/strings}/src/main/res/values-it-rIT/strings.xml (100%) rename {app => core/strings}/src/main/res/values-iw-rIL/strings.xml (100%) rename {app => core/strings}/src/main/res/values-ja-rJP/strings.xml (100%) rename {app => core/strings}/src/main/res/values-ko-rKR/strings.xml (100%) rename {app => core/strings}/src/main/res/values-lt-rLT/strings.xml (100%) rename {app => core/strings}/src/main/res/values-nl-rNL/strings.xml (100%) rename {app => core/strings}/src/main/res/values-no-rNO/strings.xml (100%) rename {app => core/strings}/src/main/res/values-pl-rPL/strings.xml (100%) rename {app => core/strings}/src/main/res/values-pt-rBR/strings.xml (100%) rename {app => core/strings}/src/main/res/values-pt-rPT/strings.xml (100%) rename {app => core/strings}/src/main/res/values-ro-rRO/strings.xml (100%) rename {app => core/strings}/src/main/res/values-ru-rRU/strings.xml (100%) rename {app => core/strings}/src/main/res/values-sk-rSK/strings.xml (100%) rename {app => core/strings}/src/main/res/values-sl-rSI/strings.xml (100%) rename {app => core/strings}/src/main/res/values-sq-rAL/strings.xml (100%) rename {app => core/strings}/src/main/res/values-srp/strings.xml (100%) rename {app => core/strings}/src/main/res/values-sv-rSE/strings.xml (100%) rename {app => core/strings}/src/main/res/values-tr-rTR/strings.xml (100%) rename {app => core/strings}/src/main/res/values-uk-rUA/strings.xml (100%) rename {app => core/strings}/src/main/res/values-zh-rCN/strings.xml (100%) rename {app => core/strings}/src/main/res/values-zh-rTW/strings.xml (100%) rename {app => core/strings}/src/main/res/values/strings.xml (100%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 54587f880..22758fe5d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -183,6 +183,7 @@ dependencies { implementation(projects.core.network) implementation(projects.core.prefs) implementation(projects.core.proto) + implementation(projects.core.strings) implementation(projects.feature.map) // Bundles diff --git a/app/src/androidTest/java/com/geeksville/mesh/compose/DebugFiltersTest.kt b/app/src/androidTest/java/com/geeksville/mesh/compose/DebugFiltersTest.kt index e5f210621..a894e69e8 100644 --- a/app/src/androidTest/java/com/geeksville/mesh/compose/DebugFiltersTest.kt +++ b/app/src/androidTest/java/com/geeksville/mesh/compose/DebugFiltersTest.kt @@ -31,11 +31,11 @@ import androidx.compose.ui.test.performTextInput import androidx.compose.ui.unit.dp import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.geeksville.mesh.R import com.geeksville.mesh.ui.debug.FilterMode import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.meshtastic.core.strings.R @RunWith(AndroidJUnit4::class) class DebugFiltersTest { diff --git a/app/src/androidTest/java/com/geeksville/mesh/compose/DebugSearchTest.kt b/app/src/androidTest/java/com/geeksville/mesh/compose/DebugSearchTest.kt index dccc57fa1..3024648cd 100644 --- a/app/src/androidTest/java/com/geeksville/mesh/compose/DebugSearchTest.kt +++ b/app/src/androidTest/java/com/geeksville/mesh/compose/DebugSearchTest.kt @@ -32,13 +32,13 @@ import androidx.compose.ui.test.performTextInput import androidx.compose.ui.unit.dp import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.geeksville.mesh.R import com.geeksville.mesh.model.LogSearchManager.SearchState import com.geeksville.mesh.ui.debug.DebugSearchBar import com.geeksville.mesh.ui.debug.FilterMode import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.meshtastic.core.strings.R @RunWith(AndroidJUnit4::class) class DebugSearchTest { diff --git a/app/src/androidTest/java/com/geeksville/mesh/compose/EditDeviceProfileDialogTest.kt b/app/src/androidTest/java/com/geeksville/mesh/compose/EditDeviceProfileDialogTest.kt index 498762456..a11fadc51 100644 --- a/app/src/androidTest/java/com/geeksville/mesh/compose/EditDeviceProfileDialogTest.kt +++ b/app/src/androidTest/java/com/geeksville/mesh/compose/EditDeviceProfileDialogTest.kt @@ -24,7 +24,6 @@ import androidx.compose.ui.test.performClick import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import com.geeksville.mesh.ClientOnlyProtos.DeviceProfile -import com.geeksville.mesh.R import com.geeksville.mesh.deviceProfile import com.geeksville.mesh.position import com.geeksville.mesh.ui.settings.radio.components.EditDeviceProfileDialog @@ -32,6 +31,7 @@ import org.junit.Assert import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.meshtastic.core.strings.R @RunWith(AndroidJUnit4::class) class EditDeviceProfileDialogTest { diff --git a/app/src/androidTest/java/com/geeksville/mesh/compose/MapReportingPreferenceTest.kt b/app/src/androidTest/java/com/geeksville/mesh/compose/MapReportingPreferenceTest.kt index e02222581..56ff5c707 100644 --- a/app/src/androidTest/java/com/geeksville/mesh/compose/MapReportingPreferenceTest.kt +++ b/app/src/androidTest/java/com/geeksville/mesh/compose/MapReportingPreferenceTest.kt @@ -26,12 +26,12 @@ import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.geeksville.mesh.R import com.geeksville.mesh.ui.settings.radio.components.MapReportingPreference import org.junit.Assert import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.meshtastic.core.strings.R @RunWith(AndroidJUnit4::class) class MapReportingPreferenceTest { diff --git a/app/src/androidTest/java/com/geeksville/mesh/compose/MessageItemTest.kt b/app/src/androidTest/java/com/geeksville/mesh/compose/MessageItemTest.kt index a87243500..dbdba7922 100644 --- a/app/src/androidTest/java/com/geeksville/mesh/compose/MessageItemTest.kt +++ b/app/src/androidTest/java/com/geeksville/mesh/compose/MessageItemTest.kt @@ -22,9 +22,7 @@ import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithContentDescription import androidx.test.ext.junit.runners.AndroidJUnit4 import com.geeksville.mesh.MessageStatus -import com.geeksville.mesh.R import com.geeksville.mesh.model.Message -import com.geeksville.mesh.model.Node import com.geeksville.mesh.ui.common.preview.NodePreviewParameterProvider import com.geeksville.mesh.ui.message.components.MessageItem import org.junit.Rule @@ -34,30 +32,30 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class MessageItemTest { - @get:Rule - val composeTestRule = createComposeRule() + @get:Rule val composeTestRule = createComposeRule() @Test fun mqttIconIsDisplayedWhenViaMqttIsTrue() { val testNode = NodePreviewParameterProvider().minnieMouse - val messageWithMqtt = Message( - text = "Test message via MQTT", - time = "10:00", - fromLocal = false, - status = MessageStatus.RECEIVED, - snr = 2.5f, - rssi = 90, - hopsAway = 0, - uuid = 1L, - receivedTime = System.currentTimeMillis(), - node = testNode, - read = false, - routingError = 0, - packetId = 1234, - emojis = listOf(), - replyId = null, - viaMqtt = true - ) + val messageWithMqtt = + Message( + text = "Test message via MQTT", + time = "10:00", + fromLocal = false, + status = MessageStatus.RECEIVED, + snr = 2.5f, + rssi = 90, + hopsAway = 0, + uuid = 1L, + receivedTime = System.currentTimeMillis(), + node = testNode, + read = false, + routingError = 0, + packetId = 1234, + emojis = listOf(), + replyId = null, + viaMqtt = true, + ) composeTestRule.setContent { MessageItem( @@ -79,24 +77,25 @@ class MessageItemTest { @Test fun mqttIconIsNotDisplayedWhenViaMqttIsFalse() { val testNode = NodePreviewParameterProvider().minnieMouse - val messageWithoutMqtt = Message( - text = "Test message not via MQTT", - time = "10:00", - fromLocal = false, - status = MessageStatus.RECEIVED, - snr = 2.5f, - rssi = 90, - hopsAway = 0, - uuid = 1L, - receivedTime = System.currentTimeMillis(), - node = testNode, - read = false, - routingError = 0, - packetId = 1234, - emojis = listOf(), - replyId = null, - viaMqtt = false - ) + val messageWithoutMqtt = + Message( + text = "Test message not via MQTT", + time = "10:00", + fromLocal = false, + status = MessageStatus.RECEIVED, + snr = 2.5f, + rssi = 90, + hopsAway = 0, + uuid = 1L, + receivedTime = System.currentTimeMillis(), + node = testNode, + read = false, + routingError = 0, + packetId = 1234, + emojis = listOf(), + replyId = null, + viaMqtt = false, + ) composeTestRule.setContent { MessageItem( @@ -114,4 +113,4 @@ class MessageItemTest { // Check that the MQTT icon is not displayed composeTestRule.onNodeWithContentDescription("via MQTT").assertDoesNotExist() } -} \ No newline at end of file +} diff --git a/app/src/androidTest/java/com/geeksville/mesh/compose/ScannedQrCodeDialogTest.kt b/app/src/androidTest/java/com/geeksville/mesh/compose/ScannedQrCodeDialogTest.kt index 96bf082d9..f1c80882d 100644 --- a/app/src/androidTest/java/com/geeksville/mesh/compose/ScannedQrCodeDialogTest.kt +++ b/app/src/androidTest/java/com/geeksville/mesh/compose/ScannedQrCodeDialogTest.kt @@ -25,7 +25,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import com.geeksville.mesh.AppOnlyProtos.ChannelSet import com.geeksville.mesh.ConfigProtos -import com.geeksville.mesh.R import com.geeksville.mesh.channelSet import com.geeksville.mesh.channelSettings import com.geeksville.mesh.copy @@ -35,6 +34,7 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.meshtastic.core.model.Channel +import org.meshtastic.core.strings.R @RunWith(AndroidJUnit4::class) class ScannedQrCodeDialogTest { diff --git a/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapView.kt b/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapView.kt index aa7851763..f70f5be94 100644 --- a/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapView.kt +++ b/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapView.kt @@ -64,7 +64,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import com.geeksville.mesh.DataPacket import com.geeksville.mesh.MeshProtos.Waypoint -import com.geeksville.mesh.R import com.geeksville.mesh.android.BuildUtils.debug import com.geeksville.mesh.android.gpsDisabled import com.geeksville.mesh.android.hasGps @@ -85,6 +84,7 @@ import com.geeksville.mesh.waypoint 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 org.meshtastic.core.strings.R import org.meshtastic.feature.map.cluster.RadiusMarkerClusterer import org.meshtastic.feature.map.model.CustomTileSource import org.meshtastic.feature.map.model.MarkerWithLabel @@ -276,11 +276,11 @@ fun MapView( MyLocationNewOverlay(this).apply { enableMyLocation() enableFollowLocation() - getBitmapFromVectorDrawable(context, R.drawable.ic_map_location_dot_24)?.let { + getBitmapFromVectorDrawable(context, com.geeksville.mesh.R.drawable.ic_map_location_dot_24)?.let { setPersonIcon(it) setPersonAnchor(0.5f, 0.5f) } - getBitmapFromVectorDrawable(context, R.drawable.ic_map_navigation_24)?.let { + getBitmapFromVectorDrawable(context, com.geeksville.mesh.R.drawable.ic_map_navigation_24)?.let { setDirectionIcon(it) setDirectionAnchor(0.5f, 0.5f) } @@ -307,7 +307,9 @@ fun MapView( val nodes by mapViewModel.nodes.collectAsStateWithLifecycle() val waypoints by mapViewModel.waypoints.collectAsStateWithLifecycle(emptyMap()) - val markerIcon = remember { AppCompatResources.getDrawable(context, R.drawable.ic_baseline_location_on_24) } + val markerIcon = remember { + AppCompatResources.getDrawable(context, com.geeksville.mesh.R.drawable.ic_baseline_location_on_24) + } fun MapView.onNodesChanged(nodes: Collection): List { val nodesWithPosition = nodes.filter { it.validPosition != null } diff --git a/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/CacheLayout.kt b/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/CacheLayout.kt index 1315cae91..4b491b098 100644 --- a/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/CacheLayout.kt +++ b/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/CacheLayout.kt @@ -36,7 +36,7 @@ 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 com.geeksville.mesh.R +import org.meshtastic.core.strings.R @OptIn(ExperimentalLayoutApi::class) @Composable diff --git a/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/DownloadButton.kt b/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/DownloadButton.kt index 16e035b4e..d008d0328 100644 --- a/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/DownloadButton.kt +++ b/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/DownloadButton.kt @@ -31,7 +31,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.scale import androidx.compose.ui.res.stringResource -import com.geeksville.mesh.R +import org.meshtastic.core.strings.R @Composable internal fun DownloadButton(enabled: Boolean, onClick: () -> Unit) { diff --git a/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt b/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt index 8525e0349..984c945ab 100644 --- a/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt +++ b/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt @@ -63,12 +63,12 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.geeksville.mesh.MeshProtos.Waypoint -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.ui.common.components.EditTextPreference import com.geeksville.mesh.ui.common.components.EmojiPickerDialog import com.geeksville.mesh.ui.common.theme.AppTheme import com.geeksville.mesh.waypoint +import org.meshtastic.core.strings.R import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale diff --git a/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/MapButton.kt b/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/MapButton.kt index bcc75985f..ed666bb66 100644 --- a/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/MapButton.kt +++ b/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/MapButton.kt @@ -29,8 +29,8 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.ui.common.theme.AppTheme +import org.meshtastic.core.strings.R @Composable fun MapButton( diff --git a/app/src/fdroid/java/com/geeksville/mesh/util/MapViewExtensions.kt b/app/src/fdroid/java/com/geeksville/mesh/util/MapViewExtensions.kt index 0daea339f..24ce2669c 100644 --- a/app/src/fdroid/java/com/geeksville/mesh/util/MapViewExtensions.kt +++ b/app/src/fdroid/java/com/geeksville/mesh/util/MapViewExtensions.kt @@ -26,7 +26,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.content.ContextCompat import com.geeksville.mesh.MeshProtos -import com.geeksville.mesh.R +import org.meshtastic.core.strings.R import org.osmdroid.util.GeoPoint import org.osmdroid.views.MapView import org.osmdroid.views.overlay.CopyrightOverlay @@ -126,7 +126,7 @@ fun MapView.addPolyline(density: Density, geoPoints: List, onClick: () } fun MapView.addPositionMarkers(positions: List, onClick: () -> Unit): List { - val navIcon = ContextCompat.getDrawable(context, R.drawable.ic_map_navigation_24) + val navIcon = ContextCompat.getDrawable(context, com.geeksville.mesh.R.drawable.ic_map_navigation_24) val markers = positions.map { Marker(this).apply { diff --git a/app/src/google/java/com/geeksville/mesh/ui/map/MapView.kt b/app/src/google/java/com/geeksville/mesh/ui/map/MapView.kt index 24b03c1e3..c0f82621d 100644 --- a/app/src/google/java/com/geeksville/mesh/ui/map/MapView.kt +++ b/app/src/google/java/com/geeksville/mesh/ui/map/MapView.kt @@ -68,7 +68,6 @@ import com.geeksville.mesh.ConfigProtos.Config.DisplayConfig.DisplayUnits import com.geeksville.mesh.MeshProtos import com.geeksville.mesh.MeshProtos.Position import com.geeksville.mesh.MeshProtos.Waypoint -import com.geeksville.mesh.R import com.geeksville.mesh.android.BuildUtils.debug import com.geeksville.mesh.android.BuildUtils.warn import com.geeksville.mesh.copy @@ -121,6 +120,7 @@ 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.meshtastic.core.strings.R import timber.log.Timber import java.text.DateFormat diff --git a/app/src/google/java/com/geeksville/mesh/ui/map/components/ClusterItemsListDialog.kt b/app/src/google/java/com/geeksville/mesh/ui/map/components/ClusterItemsListDialog.kt index 1f71db2e3..a37ad918a 100644 --- a/app/src/google/java/com/geeksville/mesh/ui/map/components/ClusterItemsListDialog.kt +++ b/app/src/google/java/com/geeksville/mesh/ui/map/components/ClusterItemsListDialog.kt @@ -31,9 +31,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import com.geeksville.mesh.R import com.geeksville.mesh.ui.map.NodeClusterItem import com.geeksville.mesh.ui.node.components.NodeChip +import org.meshtastic.core.strings.R @Composable fun ClusterItemsListDialog( diff --git a/app/src/google/java/com/geeksville/mesh/ui/map/components/CustomMapLayersSheet.kt b/app/src/google/java/com/geeksville/mesh/ui/map/components/CustomMapLayersSheet.kt index 6f6908c93..79d13d0c5 100644 --- a/app/src/google/java/com/geeksville/mesh/ui/map/components/CustomMapLayersSheet.kt +++ b/app/src/google/java/com/geeksville/mesh/ui/map/components/CustomMapLayersSheet.kt @@ -39,8 +39,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import com.geeksville.mesh.R import com.geeksville.mesh.ui.map.MapLayerItem +import org.meshtastic.core.strings.R @Suppress("LongMethod") @Composable diff --git a/app/src/google/java/com/geeksville/mesh/ui/map/components/CustomTileProviderManagerSheet.kt b/app/src/google/java/com/geeksville/mesh/ui/map/components/CustomTileProviderManagerSheet.kt index 0787d936a..63f0d57e3 100644 --- a/app/src/google/java/com/geeksville/mesh/ui/map/components/CustomTileProviderManagerSheet.kt +++ b/app/src/google/java/com/geeksville/mesh/ui/map/components/CustomTileProviderManagerSheet.kt @@ -51,10 +51,10 @@ 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.R import com.geeksville.mesh.ui.map.CustomTileProviderConfig import com.geeksville.mesh.ui.map.MapViewModel import kotlinx.coroutines.flow.collectLatest +import org.meshtastic.core.strings.R @Suppress("LongMethod") @Composable diff --git a/app/src/google/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt b/app/src/google/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt index 368c1b5dc..72de273f3 100644 --- a/app/src/google/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt +++ b/app/src/google/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt @@ -63,9 +63,9 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.geeksville.mesh.MeshProtos.Waypoint -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.ui.common.components.EmojiPickerDialog +import org.meshtastic.core.strings.R import java.text.SimpleDateFormat import java.util.Calendar import java.util.Locale diff --git a/app/src/google/java/com/geeksville/mesh/ui/map/components/MapControlsOverlay.kt b/app/src/google/java/com/geeksville/mesh/ui/map/components/MapControlsOverlay.kt index faf4b6c0f..73e9b2b8a 100644 --- a/app/src/google/java/com/geeksville/mesh/ui/map/components/MapControlsOverlay.kt +++ b/app/src/google/java/com/geeksville/mesh/ui/map/components/MapControlsOverlay.kt @@ -33,9 +33,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.draw.rotate import androidx.compose.ui.res.stringResource -import com.geeksville.mesh.R import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed import com.geeksville.mesh.ui.map.MapViewModel +import org.meshtastic.core.strings.R @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable diff --git a/app/src/google/java/com/geeksville/mesh/ui/map/components/MapFilterDropdown.kt b/app/src/google/java/com/geeksville/mesh/ui/map/components/MapFilterDropdown.kt index d1b2b4bfe..46b862a6b 100644 --- a/app/src/google/java/com/geeksville/mesh/ui/map/components/MapFilterDropdown.kt +++ b/app/src/google/java/com/geeksville/mesh/ui/map/components/MapFilterDropdown.kt @@ -30,8 +30,8 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.res.stringResource import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.geeksville.mesh.R import com.geeksville.mesh.ui.map.MapViewModel +import org.meshtastic.core.strings.R @Composable internal fun MapFilterDropdown(expanded: Boolean, onDismissRequest: () -> Unit, mapViewModel: MapViewModel) { diff --git a/app/src/google/java/com/geeksville/mesh/ui/map/components/MapTypeDropdown.kt b/app/src/google/java/com/geeksville/mesh/ui/map/components/MapTypeDropdown.kt index e34521936..42150b5e3 100644 --- a/app/src/google/java/com/geeksville/mesh/ui/map/components/MapTypeDropdown.kt +++ b/app/src/google/java/com/geeksville/mesh/ui/map/components/MapTypeDropdown.kt @@ -28,9 +28,9 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.res.stringResource import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.geeksville.mesh.R import com.geeksville.mesh.ui.map.MapViewModel import com.google.maps.android.compose.MapType +import org.meshtastic.core.strings.R @Suppress("LongMethod") @Composable diff --git a/app/src/google/java/com/geeksville/mesh/ui/map/components/WaypointMarkers.kt b/app/src/google/java/com/geeksville/mesh/ui/map/components/WaypointMarkers.kt index 5a19809e3..e1614579e 100644 --- a/app/src/google/java/com/geeksville/mesh/ui/map/components/WaypointMarkers.kt +++ b/app/src/google/java/com/geeksville/mesh/ui/map/components/WaypointMarkers.kt @@ -21,13 +21,13 @@ import android.widget.Toast import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import com.geeksville.mesh.MeshProtos -import com.geeksville.mesh.R import com.geeksville.mesh.ui.map.BaseMapViewModel import com.geeksville.mesh.ui.node.DEG_D import com.google.android.gms.maps.model.BitmapDescriptor import com.google.android.gms.maps.model.LatLng import com.google.maps.android.compose.Marker import com.google.maps.android.compose.rememberUpdatedMarkerState +import org.meshtastic.core.strings.R @Composable fun WaypointMarkers( 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 108c3f724..271c2689d 100644 --- a/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt +++ b/app/src/main/java/com/geeksville/mesh/model/BTScanModel.kt @@ -26,7 +26,6 @@ import android.os.RemoteException import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.geeksville.mesh.R import com.geeksville.mesh.android.Logging import com.geeksville.mesh.repository.bluetooth.BluetoothRepository import com.geeksville.mesh.repository.datastore.recentaddresses.RecentAddress @@ -53,6 +52,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import org.meshtastic.core.strings.R import javax.inject.Inject /** diff --git a/app/src/main/java/com/geeksville/mesh/model/Message.kt b/app/src/main/java/com/geeksville/mesh/model/Message.kt index da2707b7f..7d890fde8 100644 --- a/app/src/main/java/com/geeksville/mesh/model/Message.kt +++ b/app/src/main/java/com/geeksville/mesh/model/Message.kt @@ -20,8 +20,8 @@ package com.geeksville.mesh.model import androidx.annotation.StringRes import com.geeksville.mesh.MeshProtos.Routing import com.geeksville.mesh.MessageStatus -import com.geeksville.mesh.R import com.geeksville.mesh.database.entity.Reaction +import org.meshtastic.core.strings.R @Suppress("CyclomaticComplexMethod") @StringRes @@ -67,12 +67,13 @@ data class Message( ) { fun getStatusStringRes(): Pair { val title = if (routingError > 0) R.string.error else R.string.message_delivery_status - val text = when (status) { - MessageStatus.RECEIVED -> R.string.delivery_confirmed - MessageStatus.QUEUED -> R.string.message_status_queued - MessageStatus.ENROUTE -> R.string.message_status_enroute - else -> getStringResFrom(routingError) - } + val text = + when (status) { + MessageStatus.RECEIVED -> R.string.delivery_confirmed + MessageStatus.QUEUED -> R.string.message_status_queued + MessageStatus.ENROUTE -> R.string.message_status_enroute + else -> getStringResFrom(routingError) + } return title to text } } diff --git a/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt b/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt index e88918e5c..ff325a593 100644 --- a/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt +++ b/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt @@ -34,7 +34,6 @@ import com.geeksville.mesh.MeshProtos.MeshPacket import com.geeksville.mesh.MeshProtos.Position import com.geeksville.mesh.Portnums import com.geeksville.mesh.Portnums.PortNum -import com.geeksville.mesh.R import com.geeksville.mesh.TelemetryProtos.Telemetry import com.geeksville.mesh.android.Logging import com.geeksville.mesh.android.prefs.MapPrefs @@ -63,6 +62,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.meshtastic.core.model.DeviceHardware import org.meshtastic.core.navigation.NodesRoutes +import org.meshtastic.core.strings.R import org.meshtastic.feature.map.model.CustomTileSource import java.io.BufferedWriter import java.io.FileNotFoundException diff --git a/app/src/main/java/com/geeksville/mesh/model/SortOption.kt b/app/src/main/java/com/geeksville/mesh/model/NodeSortOption.kt similarity index 97% rename from app/src/main/java/com/geeksville/mesh/model/SortOption.kt rename to app/src/main/java/com/geeksville/mesh/model/NodeSortOption.kt index 61f596dc3..031f44fa6 100644 --- a/app/src/main/java/com/geeksville/mesh/model/SortOption.kt +++ b/app/src/main/java/com/geeksville/mesh/model/NodeSortOption.kt @@ -18,7 +18,7 @@ package com.geeksville.mesh.model import androidx.annotation.StringRes -import com.geeksville.mesh.R +import org.meshtastic.core.strings.R enum class NodeSortOption(val sqlValue: String, @StringRes val stringRes: Int) { LAST_HEARD("last_heard", R.string.node_sort_last_heard), 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 b5c908b9d..1f4a53907 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -38,7 +38,6 @@ import com.geeksville.mesh.LocalOnlyProtos.LocalConfig import com.geeksville.mesh.LocalOnlyProtos.LocalModuleConfig import com.geeksville.mesh.MeshProtos import com.geeksville.mesh.Position -import com.geeksville.mesh.R import com.geeksville.mesh.android.Logging import com.geeksville.mesh.android.prefs.UiPrefs import com.geeksville.mesh.channel @@ -84,6 +83,7 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import org.meshtastic.core.model.DeviceHardware +import org.meshtastic.core.strings.R import javax.inject.Inject // Given a human name, strip out the first letter of the first three words and return that as the 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 6bb4d809f..c9dcaf0a7 100644 --- a/app/src/main/java/com/geeksville/mesh/navigation/NodesNavigation.kt +++ b/app/src/main/java/com/geeksville/mesh/navigation/NodesNavigation.kt @@ -39,7 +39,6 @@ import androidx.navigation.NavHostController import androidx.navigation.compose.composable import androidx.navigation.compose.navigation import androidx.navigation.navDeepLink -import com.geeksville.mesh.R import com.geeksville.mesh.model.MetricsViewModel import com.geeksville.mesh.model.UIViewModel import com.geeksville.mesh.ui.metrics.DeviceMetricsScreen @@ -58,6 +57,7 @@ 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 fun NavGraphBuilder.nodesGraph(navController: NavHostController, uiViewModel: UIViewModel) { navigation(startDestination = NodesRoutes.Nodes) { diff --git a/app/src/main/java/com/geeksville/mesh/navigation/SettingsNavigation.kt b/app/src/main/java/com/geeksville/mesh/navigation/SettingsNavigation.kt index 54c8ba7cc..0f9e5802a 100644 --- a/app/src/main/java/com/geeksville/mesh/navigation/SettingsNavigation.kt +++ b/app/src/main/java/com/geeksville/mesh/navigation/SettingsNavigation.kt @@ -56,7 +56,6 @@ import androidx.navigation.navDeepLink import androidx.navigation.navigation import com.geeksville.mesh.AdminProtos import com.geeksville.mesh.MeshProtos.DeviceMetadata -import com.geeksville.mesh.R import com.geeksville.mesh.ui.debug.DebugScreen import com.geeksville.mesh.ui.settings.SettingsScreen import com.geeksville.mesh.ui.settings.radio.CleanNodeDatabaseScreen @@ -88,6 +87,7 @@ import org.meshtastic.core.navigation.DEEP_LINK_BASE_URI import org.meshtastic.core.navigation.NodesRoutes import org.meshtastic.core.navigation.Route import org.meshtastic.core.navigation.SettingsRoutes +import org.meshtastic.core.strings.R fun getNavRouteFrom(routeName: String): Route? = ConfigRoute.entries.find { it.name == routeName }?.route ?: ModuleRoute.entries.find { it.name == routeName }?.route diff --git a/app/src/main/java/com/geeksville/mesh/repository/datastore/recentaddresses/RecentAddressesRepository.kt b/app/src/main/java/com/geeksville/mesh/repository/datastore/recentaddresses/RecentAddressesRepository.kt index efd2c6708..10248ad0b 100644 --- a/app/src/main/java/com/geeksville/mesh/repository/datastore/recentaddresses/RecentAddressesRepository.kt +++ b/app/src/main/java/com/geeksville/mesh/repository/datastore/recentaddresses/RecentAddressesRepository.kt @@ -22,11 +22,8 @@ import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey -import com.geeksville.mesh.R import com.geeksville.mesh.android.Logging import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject -import javax.inject.Singleton import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map @@ -34,6 +31,9 @@ import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json import org.json.JSONArray import org.json.JSONObject +import org.meshtastic.core.strings.R +import javax.inject.Inject +import javax.inject.Singleton @Singleton class RecentAddressesRepository @@ -53,15 +53,11 @@ constructor( try { Json.decodeFromString>(jsonString) } catch (e: IllegalArgumentException) { - warn( - "Could not parse recent addresses, falling back to legacy parsing: ${e.message}" - ) + warn("Could not parse recent addresses, falling back to legacy parsing: ${e.message}") // Fallback to legacy parsing parseLegacyRecentAddresses(jsonString) } catch (e: SerializationException) { - warn( - "Could not parse recent addresses, falling back to legacy parsing: ${e.message}" - ) + warn("Could not parse recent addresses, falling back to legacy parsing: ${e.message}") // Fallback to legacy parsing parseLegacyRecentAddresses(jsonString) } @@ -76,10 +72,7 @@ constructor( when (val item = jsonArray.get(i)) { is JSONObject -> { // Modern format: JSONObject with address and name - RecentAddress( - address = item.getString("address"), - name = item.getString("name"), - ) + RecentAddress(address = item.getString("address"), name = item.getString("name")) } is String -> { // Old format: just the address string 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 1e1e7b5d8..b0bc11933 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -50,7 +50,6 @@ import com.geeksville.mesh.NodeInfo import com.geeksville.mesh.PaxcountProtos import com.geeksville.mesh.Portnums import com.geeksville.mesh.Position -import com.geeksville.mesh.R import com.geeksville.mesh.StoreAndForwardProtos import com.geeksville.mesh.TelemetryProtos import com.geeksville.mesh.TelemetryProtos.LocalStats @@ -104,6 +103,7 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.meshtastic.core.model.getFullTracerouteResponse +import org.meshtastic.core.strings.R import java.util.Random import java.util.UUID import java.util.concurrent.ConcurrentHashMap diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotifications.kt b/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotifications.kt index 0bbe0f45c..c85b835ec 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotifications.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshServiceNotifications.kt @@ -22,7 +22,7 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent import android.app.TaskStackBuilder -import android.content.ContentResolver +import android.content.ContentResolver.SCHEME_ANDROID_RESOURCE import android.content.Context import android.content.Intent import android.graphics.Color @@ -36,12 +36,13 @@ import androidx.core.content.getSystemService import androidx.core.net.toUri import com.geeksville.mesh.MainActivity import com.geeksville.mesh.MeshProtos -import com.geeksville.mesh.R +import com.geeksville.mesh.R.raw import com.geeksville.mesh.TelemetryProtos.LocalStats import com.geeksville.mesh.database.entity.NodeEntity import com.geeksville.mesh.service.ReplyReceiver.Companion.KEY_TEXT_REPLY import com.geeksville.mesh.util.formatUptime import org.meshtastic.core.navigation.DEEP_LINK_BASE_URI +import org.meshtastic.core.strings.R /** * Manages the creation and display of all app notifications. @@ -184,8 +185,7 @@ class MeshServiceNotifications(private val context: Context) { enableLights(true) enableVibration(true) setBypassDnd(true) - val alertSoundUri = - "${ContentResolver.SCHEME_ANDROID_RESOURCE}://${context.packageName}/${R.raw.alert}".toUri() + val alertSoundUri = "${SCHEME_ANDROID_RESOURCE}://${context.packageName}/${raw.alert}".toUri() setSound( alertSoundUri, AudioAttributes.Builder() @@ -415,7 +415,7 @@ class MeshServiceNotifications(private val context: Context) { type: NotificationType, contentIntent: PendingIntent? = null, ): NotificationCompat.Builder { - val smallIcon = R.drawable.app_icon + val smallIcon = com.geeksville.mesh.R.drawable.app_icon return NotificationCompat.Builder(context, type.channelId) .setSmallIcon(smallIcon) 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 84155f3f6..5dd84a2f5 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/Main.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/Main.kt @@ -76,7 +76,6 @@ import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController import com.geeksville.mesh.BuildConfig import com.geeksville.mesh.MeshProtos -import com.geeksville.mesh.R import com.geeksville.mesh.android.AddNavigationTracking import com.geeksville.mesh.android.BuildUtils.debug import com.geeksville.mesh.android.setAttributes @@ -120,6 +119,7 @@ import org.meshtastic.core.navigation.NodeDetailRoutes import org.meshtastic.core.navigation.NodesRoutes import org.meshtastic.core.navigation.Route import org.meshtastic.core.navigation.SettingsRoutes +import org.meshtastic.core.strings.R import kotlin.reflect.KClass enum class TopLevelDestination(@StringRes val label: Int, val icon: ImageVector, val route: Route) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/AlertDialogs.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/AlertDialogs.kt index 760e21ba7..4af4bd306 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/AlertDialogs.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/AlertDialogs.kt @@ -37,7 +37,7 @@ 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 com.geeksville.mesh.R +import org.meshtastic.core.strings.R @Composable fun SimpleAlertDialog( @@ -45,40 +45,34 @@ fun SimpleAlertDialog( message: String?, html: String? = null, onDismissRequest: () -> Unit, - onConfirmRequest: () -> Unit = onDismissRequest // Default confirm to dismiss + onConfirmRequest: () -> Unit = onDismissRequest, // Default confirm to dismiss ) { - - val annotatedString = html?.let { - AnnotatedString.fromHtml( - html, - linkStyles = TextLinkStyles( - style = SpanStyle( - textDecoration = TextDecoration.Underline, - fontStyle = FontStyle.Italic, - color = MaterialTheme.colorScheme.primary - ) + val annotatedString = + html?.let { + AnnotatedString.fromHtml( + html, + linkStyles = + TextLinkStyles( + style = + SpanStyle( + textDecoration = TextDecoration.Underline, + fontStyle = FontStyle.Italic, + color = MaterialTheme.colorScheme.primary, + ), + ), ) - ) - } + } AlertDialog( onDismissRequest = onDismissRequest, title = { Text(text = title) }, text = { if (annotatedString != null) { - Text( - text = annotatedString, - ) + Text(text = annotatedString) } else { - Text( - text = message.orEmpty() - ) - } - }, - confirmButton = { - TextButton(onClick = onConfirmRequest) { - Text(stringResource(id = R.string.okay)) + Text(text = message.orEmpty()) } }, + confirmButton = { TextButton(onClick = onConfirmRequest) { Text(stringResource(id = R.string.okay)) } }, ) } @@ -94,15 +88,8 @@ fun MultipleChoiceAlertDialog( onDismissRequest = onDismissRequest, title = { Text(text = title) }, text = { - Column( - modifier = Modifier.verticalScroll(rememberScrollState()) - ) { - message?.let { - Text( - text = it, - modifier = Modifier.padding(bottom = 8.dp) - ) - } + Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + message?.let { Text(text = it, modifier = Modifier.padding(bottom = 8.dp)) } choices.forEach { (choice, action) -> Button( modifier = Modifier.fillMaxWidth().padding(8.dp), @@ -116,7 +103,6 @@ fun MultipleChoiceAlertDialog( } } }, - confirmButton = { - } + confirmButton = {}, ) } diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/BatteryInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/BatteryInfo.kt index f2a176ae9..a2f17c0bf 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/BatteryInfo.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/BatteryInfo.kt @@ -36,26 +36,20 @@ import com.geeksville.mesh.R import com.geeksville.mesh.ui.common.theme.AppTheme @Composable -fun BatteryInfo( - modifier: Modifier = Modifier, - batteryLevel: Int?, - voltage: Float? -) { +fun BatteryInfo(modifier: Modifier = Modifier, batteryLevel: Int?, voltage: Float?) { val infoString = "%d%% %.2fV".format(batteryLevel, voltage) - val (image, level) = when (batteryLevel) { - in 0 .. 4 -> R.drawable.ic_battery_alert to " $infoString" - in 5 .. 14 -> R.drawable.ic_battery_outline to infoString - in 15..34 -> R.drawable.ic_battery_low to infoString - in 35..79 -> R.drawable.ic_battery_medium to infoString - in 80..100 -> R.drawable.ic_battery_high to infoString - 101 -> R.drawable.ic_power_plug_24 to "%.2fV".format(voltage) - else -> R.drawable.ic_battery_unknown to (voltage?.let { "%.2fV".format(it) } ?: "") - } + val (image, level) = + when (batteryLevel) { + in 0..4 -> R.drawable.ic_battery_alert to " $infoString" + in 5..14 -> R.drawable.ic_battery_outline to infoString + in 15..34 -> R.drawable.ic_battery_low to infoString + in 35..79 -> R.drawable.ic_battery_medium to infoString + in 80..100 -> R.drawable.ic_battery_high to infoString + 101 -> R.drawable.ic_power_plug_24 to "%.2fV".format(voltage) + else -> R.drawable.ic_battery_unknown to (voltage?.let { "%.2fV".format(it) } ?: "") + } - Row( - modifier = modifier, - verticalAlignment = Alignment.CenterVertically - ) { + Row(modifier = modifier, verticalAlignment = Alignment.CenterVertically) { Icon( modifier = Modifier.height(18.dp), imageVector = ImageVector.vectorResource(id = image), @@ -65,46 +59,34 @@ fun BatteryInfo( Text( text = level, color = MaterialTheme.colorScheme.onSurface, - fontSize = MaterialTheme.typography.labelLarge.fontSize + fontSize = MaterialTheme.typography.labelLarge.fontSize, ) } } @PreviewLightDark @Composable -fun BatteryInfoPreview( - @PreviewParameter(BatteryInfoPreviewParameterProvider::class) - batteryInfo: Pair -) { - AppTheme { - BatteryInfo( - batteryLevel = batteryInfo.first, - voltage = batteryInfo.second - ) - } +fun BatteryInfoPreview(@PreviewParameter(BatteryInfoPreviewParameterProvider::class) batteryInfo: Pair) { + AppTheme { BatteryInfo(batteryLevel = batteryInfo.first, voltage = batteryInfo.second) } } @Composable @Preview fun BatteryInfoPreviewSimple() { - AppTheme { - BatteryInfo( - batteryLevel = 85, - voltage = 3.7F - ) - } + AppTheme { BatteryInfo(batteryLevel = 85, voltage = 3.7F) } } class BatteryInfoPreviewParameterProvider : PreviewParameterProvider> { override val values: Sequence> - get() = sequenceOf( - 85 to 3.7F, - 2 to 3.7F, - 12 to 3.7F, - 28 to 3.7F, - 50 to 3.7F, - 101 to 4.9F, - null to 4.5F, - null to null - ) + get() = + sequenceOf( + 85 to 3.7F, + 2 to 3.7F, + 12 to 3.7F, + 28 to 3.7F, + 50 to 3.7F, + 101 to 4.9F, + null to 4.5F, + null to null, + ) } diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/BitwisePreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/BitwisePreference.kt index c5aab4368..8b402eb01 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/BitwisePreference.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/BitwisePreference.kt @@ -38,7 +38,7 @@ 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 com.geeksville.mesh.R +import org.meshtastic.core.strings.R @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/CopyIconButton.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/CopyIconButton.kt index 07cdec733..90c795cd5 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/CopyIconButton.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/CopyIconButton.kt @@ -28,8 +28,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ClipEntry import androidx.compose.ui.platform.LocalClipboard import androidx.compose.ui.res.stringResource -import com.geeksville.mesh.R import kotlinx.coroutines.launch +import org.meshtastic.core.strings.R @Composable fun CopyIconButton( @@ -47,11 +47,8 @@ fun CopyIconButton( val clipEntry = ClipEntry(clipData) clipboardManager.setClipEntry(clipEntry) } - } + }, ) { - Icon( - imageVector = Icons.TwoTone.ContentCopy, - contentDescription = label - ) + Icon(imageVector = Icons.TwoTone.ContentCopy, contentDescription = label) } } diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditBase64Preference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditBase64Preference.kt index ebce4ff70..5f430dbb6 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditBase64Preference.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditBase64Preference.kt @@ -44,11 +44,11 @@ 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.geeksville.mesh.R import com.geeksville.mesh.util.encodeToString import com.geeksville.mesh.util.toByteString import com.google.protobuf.ByteString import org.meshtastic.core.model.Channel +import org.meshtastic.core.strings.R @Suppress("LongMethod") @Composable diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditListPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditListPreference.kt index 17c906a94..74c18fea5 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditListPreference.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditListPreference.kt @@ -42,10 +42,10 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.geeksville.mesh.ModuleConfigProtos.RemoteHardwarePin import com.geeksville.mesh.ModuleConfigProtos.RemoteHardwarePinType -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.remoteHardwarePin import com.google.protobuf.ByteString +import org.meshtastic.core.strings.R @Suppress("LongMethod") @Composable diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditPasswordPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditPasswordPreference.kt index 8db19a108..b4a1ee49d 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditPasswordPreference.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditPasswordPreference.kt @@ -35,7 +35,7 @@ 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 com.geeksville.mesh.R +import org.meshtastic.core.strings.R @Composable fun EditPasswordPreference( @@ -55,20 +55,18 @@ fun EditPasswordPreference( maxSize = maxSize, enabled = enabled, isError = false, - keyboardOptions = KeyboardOptions.Default.copy( - keyboardType = KeyboardType.Password, imeAction = ImeAction.Done - ), + keyboardOptions = + KeyboardOptions.Default.copy(keyboardType = KeyboardType.Password, imeAction = ImeAction.Done), keyboardActions = keyboardActions, - onValueChanged = { - onValueChanged(it) - }, + onValueChanged = { onValueChanged(it) }, onFocusChanged = {}, visualTransformation = if (isPasswordVisible) VisualTransformation.None else PasswordVisualTransformation(), trailingIcon = { IconButton(onClick = { isPasswordVisible = !isPasswordVisible }) { Icon( imageVector = if (isPasswordVisible) Icons.TwoTone.VisibilityOff else Icons.TwoTone.VisibilityOff, - contentDescription = if (isPasswordVisible) { + contentDescription = + if (isPasswordVisible) { stringResource(R.string.hide_password) } else { stringResource(R.string.show_password) @@ -76,7 +74,7 @@ fun EditPasswordPreference( ) } }, - modifier = modifier + modifier = modifier, ) } @@ -89,6 +87,6 @@ private fun EditPasswordPreferencePreview() { maxSize = 63, enabled = true, keyboardActions = KeyboardActions {}, - onValueChanged = {} + onValueChanged = {}, ) } diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditTextPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditTextPreference.kt index c1736ea42..ce3e0ed8a 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditTextPreference.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditTextPreference.kt @@ -44,7 +44,7 @@ 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 com.geeksville.mesh.R +import org.meshtastic.core.strings.R @Composable fun SignedIntegerEditTextPreference( diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/IndoorAirQuality.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/IndoorAirQuality.kt index c35be8dc9..ec6f0d73a 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/IndoorAirQuality.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/IndoorAirQuality.kt @@ -57,7 +57,6 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.ui.common.theme.IAQColors.IAQDangerouslyPolluted import com.geeksville.mesh.ui.common.theme.IAQColors.IAQExcellent import com.geeksville.mesh.ui.common.theme.IAQColors.IAQExtremelyPolluted @@ -66,6 +65,7 @@ import com.geeksville.mesh.ui.common.theme.IAQColors.IAQHeavilyPolluted import com.geeksville.mesh.ui.common.theme.IAQColors.IAQLightlyPolluted import com.geeksville.mesh.ui.common.theme.IAQColors.IAQModeratelyPolluted import com.geeksville.mesh.ui.common.theme.IAQColors.IAQSeverelyPolluted +import org.meshtastic.core.strings.R @Suppress("MagicNumber") enum class Iaq(val color: Color, val description: String, val range: IntRange) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/LoraSignalIndicator.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/LoraSignalIndicator.kt index 35722835e..ddfb2ca40 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/LoraSignalIndicator.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/LoraSignalIndicator.kt @@ -47,11 +47,11 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.dp -import com.geeksville.mesh.R import com.geeksville.mesh.ui.common.theme.StatusColors.StatusGreen import com.geeksville.mesh.ui.common.theme.StatusColors.StatusOrange import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed import com.geeksville.mesh.ui.common.theme.StatusColors.StatusYellow +import org.meshtastic.core.strings.R private const val SNR_GOOD_THRESHOLD = -7f private const val SNR_FAIR_THRESHOLD = -15f diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/MainAppBar.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/MainAppBar.kt index f94de5eba..27d528ffd 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/MainAppBar.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/MainAppBar.kt @@ -46,7 +46,6 @@ import androidx.navigation.NavDestination import androidx.navigation.NavDestination.Companion.hasRoute import androidx.navigation.NavHostController import androidx.navigation.compose.currentBackStackEntryAsState -import com.geeksville.mesh.R import com.geeksville.mesh.model.Node import com.geeksville.mesh.model.UIViewModel import com.geeksville.mesh.navigation.isConfigRoute @@ -59,6 +58,7 @@ import com.geeksville.mesh.ui.node.components.NodeMenuAction import org.meshtastic.core.navigation.ContactsRoutes import org.meshtastic.core.navigation.NodesRoutes import org.meshtastic.core.navigation.SettingsRoutes +import org.meshtastic.core.strings.R @Suppress("CyclomaticComplexMethod") @Composable @@ -153,7 +153,7 @@ fun MainAppBar( { IconButton(enabled = false, onClick = {}) { Icon( - imageVector = ImageVector.vectorResource(id = R.drawable.app_icon), + imageVector = ImageVector.vectorResource(id = com.geeksville.mesh.R.drawable.app_icon), contentDescription = stringResource(id = R.string.application_icon), ) } diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/PositionPrecisionPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/PositionPrecisionPreference.kt index 3ae201c76..685b42d7e 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/PositionPrecisionPreference.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/PositionPrecisionPreference.kt @@ -31,9 +31,9 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.util.DistanceUnit import com.geeksville.mesh.util.toDistanceString +import org.meshtastic.core.strings.R import kotlin.math.pow import kotlin.math.roundToInt diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceFooter.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceFooter.kt index 8901930bf..5359a81a4 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceFooter.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceFooter.kt @@ -30,7 +30,7 @@ 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 com.geeksville.mesh.R +import org.meshtastic.core.strings.R @Composable fun PreferenceFooter( @@ -59,32 +59,15 @@ fun PreferenceFooter( modifier: Modifier = Modifier, ) { Row( - modifier = modifier - .fillMaxWidth() - .height(64.dp), + modifier = modifier.fillMaxWidth().height(64.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically, ) { - OutlinedButton( - modifier = modifier - .height(48.dp) - .weight(1f), - onClick = onNegativeClicked, - ) { - Text( - text = stringResource(id = negativeText), - ) + OutlinedButton(modifier = Modifier.height(48.dp).weight(1f), onClick = onNegativeClicked) { + Text(text = stringResource(id = negativeText)) } - OutlinedButton( - modifier = modifier - .height(48.dp) - .weight(1f), - enabled = enabled, - onClick = onPositiveClicked, - ) { - Text( - text = stringResource(id = positiveText), - ) + OutlinedButton(modifier = Modifier.height(48.dp).weight(1f), enabled = enabled, onClick = onPositiveClicked) { + Text(text = stringResource(id = positiveText)) } } } diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/ScannedQrCodeDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/ScannedQrCodeDialog.kt index 940c750d4..b600f1021 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/ScannedQrCodeDialog.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/ScannedQrCodeDialog.kt @@ -52,12 +52,12 @@ import androidx.compose.ui.window.DialogProperties import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.AppOnlyProtos.ChannelSet import com.geeksville.mesh.ConfigProtos.Config.LoRaConfig.ModemPreset -import com.geeksville.mesh.R import com.geeksville.mesh.channelSet import com.geeksville.mesh.copy import com.geeksville.mesh.model.UIViewModel import com.geeksville.mesh.ui.settings.radio.components.ChannelSelection import org.meshtastic.core.model.Channel +import org.meshtastic.core.strings.R @Composable fun ScannedQrCodeDialog(viewModel: UIViewModel, incoming: ChannelSet) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/SecurityIcon.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/SecurityIcon.kt index adee808bf..271fe46b7 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/SecurityIcon.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/SecurityIcon.kt @@ -63,12 +63,12 @@ import androidx.compose.ui.unit.dp import com.geeksville.mesh.AppOnlyProtos import com.geeksville.mesh.ChannelProtos.ChannelSettings import com.geeksville.mesh.ConfigProtos.Config.LoRaConfig -import com.geeksville.mesh.R import com.geeksville.mesh.model.getChannel import com.geeksville.mesh.ui.common.theme.StatusColors.StatusGreen import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed import com.geeksville.mesh.ui.common.theme.StatusColors.StatusYellow import org.meshtastic.core.model.Channel +import org.meshtastic.core.strings.R private const val PRECISE_POSITION_BITS = 32 diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/SignalInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/SignalInfo.kt index 308be12d7..909621563 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/SignalInfo.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/SignalInfo.kt @@ -26,48 +26,46 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.model.Node import com.geeksville.mesh.ui.common.preview.NodePreviewParameterProvider import com.geeksville.mesh.ui.common.theme.AppTheme +import org.meshtastic.core.strings.R const val MAX_VALID_SNR = 100F const val MAX_VALID_RSSI = 0 @Composable -fun SignalInfo( - modifier: Modifier = Modifier, - node: Node, - isThisNode: Boolean -) { - val text = if (isThisNode) { - stringResource(R.string.channel_air_util).format( - node.deviceMetrics.channelUtilization, - node.deviceMetrics.airUtilTx - ) - } else { - buildList { - val hopsString = "%s: %s".format( - stringResource(R.string.hops_away), - if (node.hopsAway == -1) { - "?" - } else { - node.hopsAway.toString() +fun SignalInfo(modifier: Modifier = Modifier, node: Node, isThisNode: Boolean) { + val text = + if (isThisNode) { + stringResource(R.string.channel_air_util) + .format(node.deviceMetrics.channelUtilization, node.deviceMetrics.airUtilTx) + } else { + buildList { + val hopsString = + "%s: %s" + .format( + stringResource(R.string.hops_away), + if (node.hopsAway == -1) { + "?" + } else { + node.hopsAway.toString() + }, + ) + if (node.channel > 0) { + add("ch:${node.channel}") } - ) - if (node.channel > 0) { - add("ch:${node.channel}") + if (node.hopsAway != 0) add(hopsString) } - if (node.hopsAway != 0) add(hopsString) - }.joinToString(" ") - } + .joinToString(" ") + } Column { if (text.isNotEmpty()) { Text( modifier = modifier, text = text, color = MaterialTheme.colorScheme.onSurface, - fontSize = MaterialTheme.typography.bodySmall.fontSize + fontSize = MaterialTheme.typography.bodySmall.fontSize, ) } /* We only know the Signal Quality from direct nodes aka 0 hop. */ @@ -84,43 +82,20 @@ fun SignalInfo( fun SignalInfoSimplePreview() { AppTheme { SignalInfo( - node = Node( - num = 1, - lastHeard = 0, - channel = 0, - snr = 12.5F, - rssi = -42, - hopsAway = 0 - ), - isThisNode = false + node = Node(num = 1, lastHeard = 0, channel = 0, snr = 12.5F, rssi = -42, hopsAway = 0), + isThisNode = false, ) } } @PreviewLightDark @Composable -fun SignalInfoPreview( - @PreviewParameter(NodePreviewParameterProvider::class) - node: Node -) { - AppTheme { - SignalInfo( - node = node, - isThisNode = false - ) - } +fun SignalInfoPreview(@PreviewParameter(NodePreviewParameterProvider::class) node: Node) { + AppTheme { SignalInfo(node = node, isThisNode = false) } } @Composable @PreviewLightDark -fun SignalInfoSelfPreview( - @PreviewParameter(NodePreviewParameterProvider::class) - node: Node -) { - AppTheme { - SignalInfo( - node = node, - isThisNode = true - ) - } +fun SignalInfoSelfPreview(@PreviewParameter(NodePreviewParameterProvider::class) node: Node) { + AppTheme { SignalInfo(node = node, isThisNode = true) } } diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/SimpleAlertDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/SimpleAlertDialog.kt index 666dfcf9c..0e4acf049 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/SimpleAlertDialog.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/SimpleAlertDialog.kt @@ -32,8 +32,8 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.ui.common.theme.AppTheme +import org.meshtastic.core.strings.R @Composable fun SimpleAlertDialog( @@ -48,31 +48,25 @@ fun SimpleAlertDialog( dismissButton = { TextButton( onClick = onDismiss, - modifier = Modifier - .padding(horizontal = 16.dp), - colors = ButtonDefaults.textButtonColors( - contentColor = MaterialTheme.colorScheme.onSurface, - ), - ) { Text(text = dismissText ?: stringResource(id = R.string.cancel)) } + modifier = Modifier.padding(horizontal = 16.dp), + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.onSurface), + ) { + Text(text = dismissText ?: stringResource(id = R.string.cancel)) + } }, confirmButton = { onConfirm?.let { - TextButton( - onClick = onConfirm, - modifier = Modifier - .padding(horizontal = 16.dp), - colors = ButtonDefaults.textButtonColors( - contentColor = MaterialTheme.colorScheme.onSurface, - ), - ) { Text(text = confirmText ?: stringResource(id = R.string.okay)) } + TextButton( + onClick = onConfirm, + modifier = Modifier.padding(horizontal = 16.dp), + colors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.onSurface), + ) { + Text(text = confirmText ?: stringResource(id = R.string.okay)) + } } }, title = { - Text( - text = stringResource(id = title), - modifier = Modifier.fillMaxWidth(), - textAlign = TextAlign.Center, - ) + Text(text = stringResource(id = title), modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center) }, text = text, shape = RoundedCornerShape(16.dp), @@ -89,11 +83,7 @@ fun SimpleAlertDialog( onDismiss = onDismiss, title = title, text = { - Text( - text = stringResource(id = text), - modifier = Modifier.fillMaxWidth(), - textAlign = TextAlign.Center, - ) + Text(text = stringResource(id = text), modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center) }, ) @@ -107,22 +97,11 @@ fun SimpleAlertDialog( onConfirm = onConfirm, onDismiss = onDismiss, title = title, - text = { - Text( - text = text, - modifier = Modifier.fillMaxWidth(), - textAlign = TextAlign.Center, - ) - }, + text = { Text(text = text, modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center) }, ) @PreviewLightDark @Composable private fun SimpleAlertDialogPreview() { - AppTheme { - SimpleAlertDialog( - title = R.string.message, - text = R.string.sample_message, - ) - } + AppTheme { SimpleAlertDialog(title = R.string.message, text = R.string.sample_message) } } 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 f142f6d29..a5fc3832d 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 @@ -60,7 +60,6 @@ import androidx.compose.ui.window.Dialog import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ConfigProtos -import com.geeksville.mesh.R import com.geeksville.mesh.model.BTScanModel import com.geeksville.mesh.model.DeviceListEntry import com.geeksville.mesh.model.Node @@ -83,6 +82,7 @@ import com.google.accompanist.permissions.ExperimentalPermissionsApi import kotlinx.coroutines.delay import org.meshtastic.core.navigation.Route import org.meshtastic.core.navigation.SettingsRoutes +import org.meshtastic.core.strings.R fun String?.isIPAddress(): Boolean = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { @Suppress("DEPRECATION") 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 a478f788c..c93bf2957 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 @@ -46,7 +46,6 @@ 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.R import com.geeksville.mesh.model.BTScanModel import com.geeksville.mesh.model.DeviceListEntry import com.geeksville.mesh.service.ConnectionState @@ -54,6 +53,7 @@ import com.geeksville.mesh.ui.common.components.TitledCard import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.MultiplePermissionsState import com.google.accompanist.permissions.rememberMultiplePermissionsState +import org.meshtastic.core.strings.R /** * 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 dcd87843f..4d1963ab7 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 @@ -33,9 +33,9 @@ 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.R import com.geeksville.mesh.ui.common.theme.AppTheme import com.geeksville.mesh.ui.connections.DeviceType +import org.meshtastic.core.strings.R @Suppress("LambdaParameterEventTrailing") @Composable 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 7ffc41e41..1b7058a30 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 @@ -42,7 +42,6 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import com.geeksville.mesh.MeshProtos import com.geeksville.mesh.PaxcountProtos -import com.geeksville.mesh.R import com.geeksville.mesh.TelemetryProtos import com.geeksville.mesh.model.Node import com.geeksville.mesh.ui.common.components.MaterialBatteryInfo @@ -50,6 +49,7 @@ import com.geeksville.mesh.ui.common.theme.AppTheme import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed import com.geeksville.mesh.ui.node.components.NodeChip import com.geeksville.mesh.ui.node.components.NodeMenuAction +import org.meshtastic.core.strings.R @Composable fun CurrentlyConnectedInfo( 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 ca5f2ed7f..2799baa94 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 @@ -34,8 +34,8 @@ 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.R import com.geeksville.mesh.model.DeviceListEntry +import org.meshtastic.core.strings.R @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 3aa47802a..9a22587de 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 @@ -51,7 +51,6 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp -import com.geeksville.mesh.R import com.geeksville.mesh.model.BTScanModel import com.geeksville.mesh.model.DeviceListEntry import com.geeksville.mesh.repository.network.NetworkRepository @@ -60,6 +59,7 @@ import com.geeksville.mesh.ui.common.components.TitledCard import com.geeksville.mesh.ui.common.theme.AppTheme import com.geeksville.mesh.ui.connections.isIPAddress import kotlinx.coroutines.launch +import org.meshtastic.core.strings.R @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 55b71a79c..4c0b27821 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 @@ -23,12 +23,12 @@ 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.R import com.geeksville.mesh.model.BTScanModel import com.geeksville.mesh.model.DeviceListEntry import com.geeksville.mesh.service.ConnectionState import com.geeksville.mesh.ui.common.components.TitledCard import com.geeksville.mesh.ui.common.theme.AppTheme +import org.meshtastic.core.strings.R @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 65ffa28fb..78ba9a61b 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 @@ -50,10 +50,10 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import com.geeksville.mesh.AppOnlyProtos -import com.geeksville.mesh.R import com.geeksville.mesh.model.Contact import com.geeksville.mesh.ui.common.components.SecurityIcon import com.geeksville.mesh.ui.common.theme.AppTheme +import org.meshtastic.core.strings.R @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 5c362044b..80e2c723f 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 @@ -62,11 +62,11 @@ import androidx.compose.ui.window.DialogProperties import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.AppOnlyProtos -import com.geeksville.mesh.R import com.geeksville.mesh.model.Contact import com.geeksville.mesh.model.UIViewModel import com.geeksville.mesh.ui.common.components.MainAppBar import com.geeksville.mesh.ui.node.components.NodeMenuAction +import org.meshtastic.core.strings.R import java.util.concurrent.TimeUnit @OptIn(ExperimentalMaterial3ExpressiveApi::class) diff --git a/app/src/main/java/com/geeksville/mesh/ui/debug/Debug.kt b/app/src/main/java/com/geeksville/mesh/ui/debug/Debug.kt index dddacb11d..5b39ad889 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/debug/Debug.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/debug/Debug.kt @@ -78,7 +78,6 @@ import androidx.compose.ui.unit.sp import androidx.datastore.core.IOException import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.geeksville.mesh.R import com.geeksville.mesh.android.BuildUtils.warn import com.geeksville.mesh.model.DebugViewModel import com.geeksville.mesh.model.DebugViewModel.UiMeshLog @@ -90,6 +89,7 @@ import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.meshtastic.core.strings.R import java.io.OutputStreamWriter import java.nio.charset.StandardCharsets import java.text.SimpleDateFormat diff --git a/app/src/main/java/com/geeksville/mesh/ui/debug/DebugFilters.kt b/app/src/main/java/com/geeksville/mesh/ui/debug/DebugFilters.kt index 51e5c45c9..5aa6a5e0a 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/debug/DebugFilters.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/debug/DebugFilters.kt @@ -21,6 +21,7 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth @@ -28,7 +29,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.foundation.layout.FlowRow import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Clear @@ -56,8 +56,8 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.model.DebugViewModel.UiMeshLog +import org.meshtastic.core.strings.R @Composable fun DebugCustomFilterInput( @@ -65,14 +65,9 @@ fun DebugCustomFilterInput( onCustomFilterTextChange: (String) -> Unit, filterTexts: List, onFilterTextsChange: (List) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { - Row( - modifier = modifier - .fillMaxWidth() - .padding(bottom = 4.dp), - verticalAlignment = Alignment.CenterVertically - ) { + Row(modifier = modifier.fillMaxWidth().padding(bottom = 4.dp), verticalAlignment = Alignment.CenterVertically) { OutlinedTextField( value = customFilterText, onValueChange = onCustomFilterTextChange, @@ -80,14 +75,15 @@ fun DebugCustomFilterInput( placeholder = { Text("Add custom filter") }, singleLine = true, keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), - keyboardActions = KeyboardActions( + keyboardActions = + KeyboardActions( onDone = { if (customFilterText.isNotBlank()) { onFilterTextsChange(filterTexts + customFilterText) onCustomFilterTextChange("") } - } - ) + }, + ), ) Spacer(modifier = Modifier.padding(horizontal = 8.dp)) IconButton( @@ -97,12 +93,9 @@ fun DebugCustomFilterInput( onCustomFilterTextChange("") } }, - enabled = customFilterText.isNotBlank() + enabled = customFilterText.isNotBlank(), ) { - Icon( - imageVector = Icons.Default.Add, - contentDescription = stringResource(id = R.string.debug_filter_add) - ) + Icon(imageVector = Icons.Default.Add, contentDescription = stringResource(id = R.string.debug_filter_add)) } } } @@ -113,27 +106,26 @@ internal fun DebugPresetFilters( filterTexts: List, logs: List, onFilterTextsChange: (List) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { - val availableFilters = presetFilters.filter { filter -> - logs.any { log -> - log.logMessage.contains(filter, ignoreCase = true) || - log.messageType.contains(filter, ignoreCase = true) || - log.formattedReceivedDate.contains(filter, ignoreCase = true) + val availableFilters = + presetFilters.filter { filter -> + logs.any { log -> + log.logMessage.contains(filter, ignoreCase = true) || + log.messageType.contains(filter, ignoreCase = true) || + log.formattedReceivedDate.contains(filter, ignoreCase = true) + } } - } Column(modifier = modifier) { Text( text = "Preset Filters", style = TextStyle(fontWeight = FontWeight.Bold), - modifier = Modifier.padding(vertical = 4.dp) + modifier = Modifier.padding(vertical = 4.dp), ) FlowRow( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 0.dp), + modifier = Modifier.fillMaxWidth().padding(bottom = 0.dp), horizontalArrangement = Arrangement.spacedBy(2.dp), - verticalArrangement = Arrangement.spacedBy(0.dp) + verticalArrangement = Arrangement.spacedBy(0.dp), ) { for (filter in availableFilters) { FilterChip( @@ -144,17 +136,18 @@ internal fun DebugPresetFilters( filterTexts - filter } else { filterTexts + filter - } + }, ) }, label = { Text(filter) }, - leadingIcon = { if (filter in filterTexts) { - Icon( - imageVector = Icons.Filled.Done, - contentDescription = stringResource(id = R.string.debug_filter_included), - ) + leadingIcon = { + if (filter in filterTexts) { + Icon( + imageVector = Icons.Filled.Done, + contentDescription = stringResource(id = R.string.debug_filter_included), + ) } - } + }, ) } } @@ -169,56 +162,46 @@ internal fun DebugFilterBar( onCustomFilterTextChange: (String) -> Unit, presetFilters: List, logs: List, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { var showFilterMenu by remember { mutableStateOf(false) } Row( modifier = modifier, horizontalArrangement = Arrangement.Start, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Box { - TextButton( - onClick = { showFilterMenu = !showFilterMenu } - ) { - Row( - verticalAlignment = Alignment.CenterVertically - ) { - Text( - text = stringResource(R.string.debug_filters), - style = TextStyle(fontWeight = FontWeight.Bold) - ) + TextButton(onClick = { showFilterMenu = !showFilterMenu }) { + Row(verticalAlignment = Alignment.CenterVertically) { + Text(text = stringResource(R.string.debug_filters), style = TextStyle(fontWeight = FontWeight.Bold)) Icon( - imageVector = if (filterTexts.isNotEmpty()) { + imageVector = + if (filterTexts.isNotEmpty()) { Icons.TwoTone.FilterAlt } else { Icons.TwoTone.FilterAltOff }, - contentDescription = stringResource(id = R.string.debug_filters) + contentDescription = stringResource(id = R.string.debug_filters), ) } } DropdownMenu( expanded = showFilterMenu, onDismissRequest = { showFilterMenu = false }, - offset = DpOffset(0.dp, 8.dp) + offset = DpOffset(0.dp, 8.dp), ) { - Column( - modifier = Modifier - .padding(8.dp) - .width(300.dp) - ) { + Column(modifier = Modifier.padding(8.dp).width(300.dp)) { DebugCustomFilterInput( customFilterText = customFilterText, onCustomFilterTextChange = onCustomFilterTextChange, filterTexts = filterTexts, - onFilterTextsChange = onFilterTextsChange + onFilterTextsChange = onFilterTextsChange, ) DebugPresetFilters( presetFilters = presetFilters, filterTexts = filterTexts, logs = logs, - onFilterTextsChange = onFilterTextsChange + onFilterTextsChange = onFilterTextsChange, ) } } @@ -233,73 +216,62 @@ internal fun DebugActiveFilters( onFilterTextsChange: (List) -> Unit, filterMode: FilterMode, onFilterModeChange: (FilterMode) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { val colorScheme = MaterialTheme.colorScheme if (filterTexts.isNotEmpty()) { Column(modifier = modifier) { Row( - modifier = Modifier - .fillMaxWidth() + modifier = + Modifier.fillMaxWidth() .padding(vertical = 2.dp) .background(colorScheme.background.copy(alpha = 1.0f)), horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Text( text = stringResource(R.string.debug_active_filters), - style = TextStyle(fontWeight = FontWeight.Bold) + style = TextStyle(fontWeight = FontWeight.Bold), ) TextButton( onClick = { onFilterModeChange( - if (filterMode == FilterMode.OR) FilterMode.AND else FilterMode.OR - ) - } - ) { - Text(if (filterMode == FilterMode.OR) { - stringResource(R.string.match_any) + if (filterMode == FilterMode.OR) { + FilterMode.AND } else { - stringResource(R.string.match_all) - } + FilterMode.OR + }, ) - } - IconButton( - onClick = { onFilterTextsChange(emptyList()) } + }, ) { + Text( + if (filterMode == FilterMode.OR) { + stringResource(R.string.match_any) + } else { + stringResource(R.string.match_all) + }, + ) + } + IconButton(onClick = { onFilterTextsChange(emptyList()) }) { Icon( imageVector = Icons.Default.Clear, - contentDescription = stringResource(id = R.string.debug_filter_clear) + contentDescription = stringResource(id = R.string.debug_filter_clear), ) } } FlowRow( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 0.dp), + modifier = Modifier.fillMaxWidth().padding(bottom = 0.dp), horizontalArrangement = Arrangement.spacedBy(2.dp), - verticalArrangement = Arrangement.spacedBy(0.dp) + verticalArrangement = Arrangement.spacedBy(0.dp), ) { for (filter in filterTexts) { FilterChip( selected = true, - onClick = { - onFilterTextsChange(filterTexts - filter) - }, + onClick = { onFilterTextsChange(filterTexts - filter) }, label = { Text(filter) }, - leadingIcon = { - Icon( - imageVector = Icons.TwoTone.FilterAlt, - contentDescription = null - ) - }, - trailingIcon = { - Icon( - imageVector = Icons.Filled.Clear, - contentDescription = null - ) - } + leadingIcon = { Icon(imageVector = Icons.TwoTone.FilterAlt, contentDescription = null) }, + trailingIcon = { Icon(imageVector = Icons.Filled.Clear, contentDescription = null) }, ) } } @@ -307,4 +279,7 @@ internal fun DebugActiveFilters( } } -enum class FilterMode { OR, AND } +enum class FilterMode { + OR, + AND, +} diff --git a/app/src/main/java/com/geeksville/mesh/ui/debug/DebugSearch.kt b/app/src/main/java/com/geeksville/mesh/ui/debug/DebugSearch.kt index 32fe15178..cd4f6f467 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/debug/DebugSearch.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/debug/DebugSearch.kt @@ -53,12 +53,12 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.model.DebugViewModel import com.geeksville.mesh.model.DebugViewModel.UiMeshLog import com.geeksville.mesh.model.LogSearchManager.SearchMatch import com.geeksville.mesh.model.LogSearchManager.SearchState import com.geeksville.mesh.ui.common.theme.AppTheme +import org.meshtastic.core.strings.R @Composable internal fun DebugSearchNavigation( @@ -189,7 +189,7 @@ internal fun DebugSearchState( IconButton(onClick = onExport, modifier = Modifier) { Icon( imageVector = Icons.Outlined.FileDownload, - contentDescription = stringResource(id = com.geeksville.mesh.R.string.debug_logs_export), + contentDescription = stringResource(id = R.string.debug_logs_export), modifier = Modifier.size(24.dp), ) } diff --git a/app/src/main/java/com/geeksville/mesh/ui/intro/CriticalAlertsScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/intro/CriticalAlertsScreen.kt index 58143c51f..5537e0188 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/intro/CriticalAlertsScreen.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/intro/CriticalAlertsScreen.kt @@ -34,7 +34,7 @@ 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 com.geeksville.mesh.R +import org.meshtastic.core.strings.R /** * Screen for explaining and guiding the user to configure critical alert settings. This screen is part of the app diff --git a/app/src/main/java/com/geeksville/mesh/ui/intro/LocationScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/intro/LocationScreen.kt index 97545a80f..46442d80a 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/intro/LocationScreen.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/intro/LocationScreen.kt @@ -26,7 +26,7 @@ import androidx.compose.material.icons.outlined.Router import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext -import com.geeksville.mesh.R +import org.meshtastic.core.strings.R /** * Screen for configuring location permissions during the app introduction. It explains why location permissions are diff --git a/app/src/main/java/com/geeksville/mesh/ui/intro/NotificationsScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/intro/NotificationsScreen.kt index 481990f8c..d7a8a0942 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/intro/NotificationsScreen.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/intro/NotificationsScreen.kt @@ -37,7 +37,7 @@ 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 com.geeksville.mesh.R +import org.meshtastic.core.strings.R /** * Screen for configuring notification permissions during the app introduction. It explains why notification permissions diff --git a/app/src/main/java/com/geeksville/mesh/ui/intro/PermissionScreenLayout.kt b/app/src/main/java/com/geeksville/mesh/ui/intro/PermissionScreenLayout.kt index e0b6b61aa..4ea11d07e 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/intro/PermissionScreenLayout.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/intro/PermissionScreenLayout.kt @@ -43,6 +43,7 @@ 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 /** * A generic layout for screens within the app introduction flow. It typically presents a headline, a descriptive text @@ -92,7 +93,7 @@ internal fun PermissionScreenLayout( onSkip = onSkip, onConfigure = onConfigure, configureButtonText = stringResource(id = configureButtonTextRes), - skipButtonText = stringResource(id = com.geeksville.mesh.R.string.skip), + skipButtonText = stringResource(id = R.string.skip), ) }, ) { innerPadding -> diff --git a/app/src/main/java/com/geeksville/mesh/ui/intro/WelcomeScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/intro/WelcomeScreen.kt index 6cbda246b..4c577f63e 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/intro/WelcomeScreen.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/intro/WelcomeScreen.kt @@ -39,7 +39,7 @@ 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 com.geeksville.mesh.R +import org.meshtastic.core.strings.R /** * The initial welcome screen for the app introduction flow. It displays a brief overview of the app's key features. diff --git a/app/src/main/java/com/geeksville/mesh/ui/map/MapScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/map/MapScreen.kt index 81f013df7..e9504a3e8 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/map/MapScreen.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/map/MapScreen.kt @@ -26,10 +26,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.geeksville.mesh.R import com.geeksville.mesh.model.UIViewModel import com.geeksville.mesh.ui.common.components.MainAppBar import com.geeksville.mesh.ui.node.components.NodeMenuAction +import org.meshtastic.core.strings.R @Composable fun MapScreen( diff --git a/app/src/main/java/com/geeksville/mesh/ui/message/Message.kt b/app/src/main/java/com/geeksville/mesh/ui/message/Message.kt index 6020ddb88..a9cc1c00a 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/message/Message.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/message/Message.kt @@ -96,7 +96,6 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.AppOnlyProtos import com.geeksville.mesh.DataPacket -import com.geeksville.mesh.R import com.geeksville.mesh.database.entity.QuickChatAction import com.geeksville.mesh.model.Message import com.geeksville.mesh.model.Node @@ -109,6 +108,7 @@ import com.geeksville.mesh.ui.node.components.NodeMenuAction import com.geeksville.mesh.ui.sharing.SharedContactDialog import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch +import org.meshtastic.core.strings.R import java.nio.charset.StandardCharsets private const val MESSAGE_CHARACTER_LIMIT_BYTES = 200 diff --git a/app/src/main/java/com/geeksville/mesh/ui/message/MessageList.kt b/app/src/main/java/com/geeksville/mesh/ui/message/MessageList.kt index e8081febc..f94c09f2a 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/message/MessageList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/message/MessageList.kt @@ -48,7 +48,6 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.MessageStatus -import com.geeksville.mesh.R import com.geeksville.mesh.database.entity.Reaction import com.geeksville.mesh.model.Message import com.geeksville.mesh.model.UIViewModel @@ -59,6 +58,7 @@ import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.launch +import org.meshtastic.core.strings.R @Composable fun DeliveryInfo( diff --git a/app/src/main/java/com/geeksville/mesh/ui/message/QuickChat.kt b/app/src/main/java/com/geeksville/mesh/ui/message/QuickChat.kt index 644f48e26..93733c863 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/message/QuickChat.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/message/QuickChat.kt @@ -70,13 +70,13 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.database.entity.QuickChatAction import com.geeksville.mesh.model.UIViewModel import com.geeksville.mesh.ui.common.components.dragContainer import com.geeksville.mesh.ui.common.components.dragDropItemsIndexed import com.geeksville.mesh.ui.common.components.rememberDragDropState import com.geeksville.mesh.ui.common.theme.AppTheme +import org.meshtastic.core.strings.R @Composable internal fun QuickChatScreen(modifier: Modifier = Modifier, viewModel: UIViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/message/components/MessageActions.kt b/app/src/main/java/com/geeksville/mesh/ui/message/components/MessageActions.kt index 65350205b..45fd15f28 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/message/components/MessageActions.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/message/components/MessageActions.kt @@ -40,13 +40,11 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.geeksville.mesh.MessageStatus -import com.geeksville.mesh.R import com.geeksville.mesh.ui.common.components.EmojiPickerDialog +import org.meshtastic.core.strings.R @Composable -fun ReactionButton( - onSendReaction: (String) -> Unit = {}, -) { +fun ReactionButton(onSendReaction: (String) -> Unit = {}) { var showEmojiPickerDialog by remember { mutableStateOf(false) } if (showEmojiPickerDialog) { EmojiPickerDialog( @@ -54,54 +52,40 @@ fun ReactionButton( showEmojiPickerDialog = false onSendReaction(selectedEmoji) }, - onDismiss = { showEmojiPickerDialog = false } + onDismiss = { showEmojiPickerDialog = false }, ) } - IconButton( - onClick = { showEmojiPickerDialog = true }, - ) { - Icon( - imageVector = Icons.Default.EmojiEmotions, - contentDescription = stringResource(R.string.react), - ) + IconButton(onClick = { showEmojiPickerDialog = true }) { + Icon(imageVector = Icons.Default.EmojiEmotions, contentDescription = stringResource(R.string.react)) } } @Composable -fun ReplyButton( - onClick: () -> Unit = {}, -) = IconButton( +fun ReplyButton(onClick: () -> Unit = {}) = IconButton( onClick = onClick, content = { - Icon( - imageVector = Icons.AutoMirrored.Filled.Reply, - contentDescription = stringResource(R.string.reply), - ) - } + Icon(imageVector = Icons.AutoMirrored.Filled.Reply, contentDescription = stringResource(R.string.reply)) + }, ) @Composable -fun MessageStatusButton( - onStatusClick: () -> Unit = {}, - status: MessageStatus, - fromLocal: Boolean, -) = AnimatedVisibility(visible = fromLocal) { - IconButton( - onClick = onStatusClick - ) { - Icon( - imageVector = when (status) { - MessageStatus.RECEIVED -> Icons.TwoTone.HowToReg - MessageStatus.QUEUED -> Icons.TwoTone.CloudUpload - MessageStatus.DELIVERED -> Icons.TwoTone.CloudDone - MessageStatus.ENROUTE -> Icons.TwoTone.Cloud - MessageStatus.ERROR -> Icons.TwoTone.CloudOff - else -> Icons.TwoTone.Warning - }, - contentDescription = stringResource(R.string.message_delivery_status), - ) +fun MessageStatusButton(onStatusClick: () -> Unit = {}, status: MessageStatus, fromLocal: Boolean) = + AnimatedVisibility(visible = fromLocal) { + IconButton(onClick = onStatusClick) { + Icon( + imageVector = + when (status) { + MessageStatus.RECEIVED -> Icons.TwoTone.HowToReg + MessageStatus.QUEUED -> Icons.TwoTone.CloudUpload + MessageStatus.DELIVERED -> Icons.TwoTone.CloudDone + MessageStatus.ENROUTE -> Icons.TwoTone.Cloud + MessageStatus.ERROR -> Icons.TwoTone.CloudOff + else -> Icons.TwoTone.Warning + }, + contentDescription = stringResource(R.string.message_delivery_status), + ) + } } -} @OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable @@ -113,16 +97,13 @@ fun MessageActions( onSendReply: () -> Unit = {}, onStatusClick: () -> Unit = {}, ) { - Row( - modifier = modifier.wrapContentSize(), - ) { - + Row(modifier = modifier.wrapContentSize()) { ReactionButton { onSendReaction(it) } ReplyButton { onSendReply() } MessageStatusButton( onStatusClick = onStatusClick, status = status ?: MessageStatus.UNKNOWN, - fromLocal = isLocal + fromLocal = isLocal, ) } } diff --git a/app/src/main/java/com/geeksville/mesh/ui/message/components/MessageItem.kt b/app/src/main/java/com/geeksville/mesh/ui/message/components/MessageItem.kt index f90bbf8fe..0327a49e6 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/message/components/MessageItem.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/message/components/MessageItem.kt @@ -50,7 +50,6 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import com.geeksville.mesh.MessageStatus -import com.geeksville.mesh.R import com.geeksville.mesh.database.entity.Reaction import com.geeksville.mesh.model.Message import com.geeksville.mesh.model.Node @@ -62,6 +61,7 @@ import com.geeksville.mesh.ui.common.theme.AppTheme import com.geeksville.mesh.ui.common.theme.MessageItemColors import com.geeksville.mesh.ui.node.components.NodeChip import com.geeksville.mesh.ui.node.components.NodeMenuAction +import org.meshtastic.core.strings.R @Suppress("LongMethod", "CyclomaticComplexMethod") @Composable diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/CommonCharts.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/CommonCharts.kt index ab4e03420..46faaddac 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/metrics/CommonCharts.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/CommonCharts.kt @@ -56,11 +56,11 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.model.Environment import com.geeksville.mesh.ui.metrics.CommonCharts.DATE_TIME_MINUTE_FORMAT import com.geeksville.mesh.ui.metrics.CommonCharts.MAX_PERCENT_VALUE import com.geeksville.mesh.ui.metrics.CommonCharts.MS_PER_SEC +import org.meshtastic.core.strings.R import java.text.DateFormat object CommonCharts { diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/DeviceMetrics.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/DeviceMetrics.kt index f2b9f3cf0..5c60a2e95 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/metrics/DeviceMetrics.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/DeviceMetrics.kt @@ -59,7 +59,6 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.TelemetryProtos import com.geeksville.mesh.TelemetryProtos.Telemetry import com.geeksville.mesh.model.MetricsViewModel @@ -78,6 +77,7 @@ import com.geeksville.mesh.ui.metrics.CommonCharts.MS_PER_SEC import com.geeksville.mesh.util.GraphUtil import com.geeksville.mesh.util.GraphUtil.createPath import com.geeksville.mesh.util.GraphUtil.plotPoint +import org.meshtastic.core.strings.R private const val CHART_WEIGHT = 1f private const val Y_AXIS_WEIGHT = 0.1f diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentCharts.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentCharts.kt index 05b5aa4e5..d56c915b5 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentCharts.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentCharts.kt @@ -40,13 +40,13 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.TelemetryProtos.Telemetry import com.geeksville.mesh.model.Environment import com.geeksville.mesh.model.EnvironmentGraphingData import com.geeksville.mesh.model.TimeFrame import com.geeksville.mesh.util.GraphUtil.createPath import com.geeksville.mesh.util.GraphUtil.drawPathWithGradient +import org.meshtastic.core.strings.R private const val CHART_WEIGHT = 1f private const val Y_AXIS_WEIGHT = 0.1f diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentMetrics.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentMetrics.kt index 4c700faa7..84605e57c 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentMetrics.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentMetrics.kt @@ -49,7 +49,6 @@ import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.EnvironmentMetrics -import com.geeksville.mesh.R import com.geeksville.mesh.TelemetryProtos import com.geeksville.mesh.TelemetryProtos.Telemetry import com.geeksville.mesh.copy @@ -62,6 +61,7 @@ import com.geeksville.mesh.ui.common.components.SlidingSelector import com.geeksville.mesh.ui.metrics.CommonCharts.DATE_TIME_FORMAT import com.geeksville.mesh.ui.metrics.CommonCharts.MS_PER_SEC import com.geeksville.mesh.util.UnitConversions.celsiusToFahrenheit +import org.meshtastic.core.strings.R @Composable fun EnvironmentMetricsScreen(viewModel: MetricsViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt index 5cfbb3917..b7a90eba0 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt @@ -53,12 +53,12 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.TelemetryProtos import com.geeksville.mesh.model.MetricsViewModel import com.geeksville.mesh.ui.common.theme.AppTheme import com.geeksville.mesh.ui.metrics.CommonCharts.DATE_TIME_FORMAT import com.geeksville.mesh.util.formatUptime +import org.meshtastic.core.strings.R import java.text.DecimalFormat @OptIn(ExperimentalFoundationApi::class) diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/PaxMetrics.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/PaxMetrics.kt index 8666cf76c..6b9100104 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/metrics/PaxMetrics.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/PaxMetrics.kt @@ -55,13 +55,13 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.PaxcountProtos import com.geeksville.mesh.Portnums.PortNum -import com.geeksville.mesh.R import com.geeksville.mesh.database.entity.MeshLog import com.geeksville.mesh.model.MetricsViewModel import com.geeksville.mesh.model.TimeFrame import com.geeksville.mesh.ui.common.components.OptionLabel import com.geeksville.mesh.ui.common.components.SlidingSelector import com.geeksville.mesh.util.formatUptime +import org.meshtastic.core.strings.R import java.text.DateFormat import java.util.Date diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/PositionLog.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/PositionLog.kt index 5d6329048..ce55d38a1 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/metrics/PositionLog.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/PositionLog.kt @@ -63,11 +63,11 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ConfigProtos.Config.DisplayConfig.DisplayUnits import com.geeksville.mesh.MeshProtos -import com.geeksville.mesh.R import com.geeksville.mesh.model.MetricsViewModel import com.geeksville.mesh.ui.common.theme.AppTheme import com.geeksville.mesh.util.metersIn import com.geeksville.mesh.util.toString +import org.meshtastic.core.strings.R import java.text.DateFormat import kotlin.time.Duration.Companion.days diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/PowerMetrics.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/PowerMetrics.kt index 979ad010f..c1a1cf636 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/metrics/PowerMetrics.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/PowerMetrics.kt @@ -59,7 +59,6 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.TelemetryProtos.Telemetry import com.geeksville.mesh.model.MetricsViewModel import com.geeksville.mesh.model.TimeFrame @@ -71,6 +70,7 @@ import com.geeksville.mesh.ui.metrics.CommonCharts.DATE_TIME_FORMAT import com.geeksville.mesh.ui.metrics.CommonCharts.MS_PER_SEC import com.geeksville.mesh.util.GraphUtil import com.geeksville.mesh.util.GraphUtil.createPath +import org.meshtastic.core.strings.R import kotlin.math.ceil import kotlin.math.floor diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/SignalMetrics.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/SignalMetrics.kt index 66ee97baf..f42883b2e 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/metrics/SignalMetrics.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/SignalMetrics.kt @@ -57,7 +57,6 @@ import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.MeshProtos.MeshPacket -import com.geeksville.mesh.R import com.geeksville.mesh.model.MetricsViewModel import com.geeksville.mesh.model.TimeFrame import com.geeksville.mesh.ui.common.components.LoraSignalIndicator @@ -67,6 +66,7 @@ import com.geeksville.mesh.ui.common.components.SnrAndRssi import com.geeksville.mesh.ui.metrics.CommonCharts.DATE_TIME_FORMAT import com.geeksville.mesh.ui.metrics.CommonCharts.MS_PER_SEC import com.geeksville.mesh.util.GraphUtil.plotPoint +import org.meshtastic.core.strings.R @Suppress("MagicNumber") private enum class Metric(val color: Color, val min: Float, val max: Float) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/TracerouteLog.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/TracerouteLog.kt index cb9f1dbc8..b5fa8ba09 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/metrics/TracerouteLog.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/TracerouteLog.kt @@ -57,13 +57,13 @@ import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.MeshProtos -import com.geeksville.mesh.R import com.geeksville.mesh.model.MetricsViewModel import com.geeksville.mesh.ui.common.components.SimpleAlertDialog import com.geeksville.mesh.ui.common.theme.AppTheme import com.geeksville.mesh.ui.metrics.CommonCharts.MS_PER_SEC import org.meshtastic.core.model.fullRouteDiscovery import org.meshtastic.core.model.getTracerouteResponse +import org.meshtastic.core.strings.R import java.text.DateFormat @OptIn(ExperimentalFoundationApi::class) diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt b/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt index 558cb9fdd..ee2442095 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt @@ -124,7 +124,6 @@ import coil3.request.ImageRequest import com.geeksville.mesh.ConfigProtos import com.geeksville.mesh.DataPacket import com.geeksville.mesh.MeshProtos -import com.geeksville.mesh.R import com.geeksville.mesh.database.entity.FirmwareRelease import com.geeksville.mesh.database.entity.asDeviceVersion import com.geeksville.mesh.model.DeviceVersion @@ -162,6 +161,7 @@ import org.meshtastic.core.model.DeviceHardware import org.meshtastic.core.navigation.NodeDetailRoutes import org.meshtastic.core.navigation.Route import org.meshtastic.core.navigation.SettingsRoutes +import org.meshtastic.core.strings.R private data class VectorMetricInfo( @StringRes val label: Int, @@ -717,7 +717,12 @@ private fun ColumnScope.DeviceDetailsContent(state: MetricsState) { } else { stringResource(R.string.supported_by_community) }, - icon = if (isSupported) Icons.TwoTone.Verified else ImageVector.vectorResource(R.drawable.unverified), + icon = + if (isSupported) { + Icons.TwoTone.Verified + } else { + ImageVector.vectorResource(com.geeksville.mesh.R.drawable.unverified) + }, trailingText = "", iconTint = if (isSupported) colorScheme.StatusGreen else colorScheme.StatusRed, ) @@ -731,9 +736,9 @@ fun DeviceHardwareImage(deviceHardware: DeviceHardware, modifier: Modifier = Mod model = ImageRequest.Builder(LocalContext.current).data(imageUrl).build(), contentScale = ContentScale.Inside, contentDescription = deviceHardware.displayName, - placeholder = painterResource(R.drawable.hw_unknown), - error = painterResource(R.drawable.hw_unknown), - fallback = painterResource(R.drawable.hw_unknown), + placeholder = painterResource(com.geeksville.mesh.R.drawable.hw_unknown), + error = painterResource(com.geeksville.mesh.R.drawable.hw_unknown), + fallback = painterResource(com.geeksville.mesh.R.drawable.hw_unknown), modifier = modifier.padding(16.dp), ) } @@ -982,7 +987,7 @@ private fun EnvironmentMetrics( DrawableMetricInfo( R.string.dew_point, dewPoint.toTempString(isFahrenheit), - R.drawable.ic_outlined_dew_point_24, + com.geeksville.mesh.R.drawable.ic_outlined_dew_point_24, ), ) } @@ -991,7 +996,7 @@ private fun EnvironmentMetrics( DrawableMetricInfo( R.string.soil_temperature, soilTemperature.toTempString(isFahrenheit), - R.drawable.soil_temperature, + com.geeksville.mesh.R.drawable.soil_temperature, ), ) } @@ -1000,7 +1005,7 @@ private fun EnvironmentMetrics( DrawableMetricInfo( R.string.soil_moisture, "%d%%".format(soilMoisture), - R.drawable.soil_moisture, + com.geeksville.mesh.R.drawable.soil_moisture, ), ) } @@ -1009,7 +1014,7 @@ private fun EnvironmentMetrics( DrawableMetricInfo( R.string.radiation, "%.1f µR/h".format(radiation), - R.drawable.ic_filled_radioactive_24, + com.geeksville.mesh.R.drawable.ic_filled_radioactive_24, ), ) } diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/NodeScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/node/NodeScreen.kt index ef3f46786..0f0ea8fbe 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/node/NodeScreen.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/node/NodeScreen.kt @@ -47,7 +47,6 @@ import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.DataPacket -import com.geeksville.mesh.R import com.geeksville.mesh.model.DeviceVersion import com.geeksville.mesh.model.Node import com.geeksville.mesh.model.UIViewModel @@ -60,6 +59,7 @@ import com.geeksville.mesh.ui.node.components.NodeMenuAction import com.geeksville.mesh.ui.sharing.AddContactFAB import com.geeksville.mesh.ui.sharing.SharedContactDialog import com.geeksville.mesh.ui.sharing.supportsQrCodeSharing +import org.meshtastic.core.strings.R @OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3ExpressiveApi::class) @Suppress("LongMethod", "CyclomaticComplexMethod") diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/LastHeardInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/LastHeardInfo.kt index a81c7660b..7f6db6b8d 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/node/components/LastHeardInfo.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/LastHeardInfo.kt @@ -35,26 +35,18 @@ import com.geeksville.mesh.ui.common.theme.AppTheme import com.geeksville.mesh.util.formatAgo @Composable -fun LastHeardInfo( - modifier: Modifier = Modifier, - lastHeard: Int, - currentTimeMillis: Long, -) { - +fun LastHeardInfo(modifier: Modifier = Modifier, lastHeard: Int, currentTimeMillis: Long) { Row( modifier = modifier, verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(2.dp) + horizontalArrangement = Arrangement.spacedBy(2.dp), ) { Icon( modifier = Modifier.height(18.dp), imageVector = ImageVector.vectorResource(id = R.drawable.ic_antenna_24), contentDescription = null, ) - Text( - text = formatAgo(lastHeard, currentTimeMillis), - fontSize = MaterialTheme.typography.labelLarge.fontSize - ) + Text(text = formatAgo(lastHeard, currentTimeMillis), fontSize = MaterialTheme.typography.labelLarge.fontSize) } } @@ -64,7 +56,7 @@ fun LastHeardInfoPreview() { AppTheme { LastHeardInfo( lastHeard = (System.currentTimeMillis() / 1000).toInt() - 8600, - currentTimeMillis = System.currentTimeMillis() + currentTimeMillis = System.currentTimeMillis(), ) } } diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeFilterTextField.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeFilterTextField.kt index 82ac6c42e..185f4691f 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeFilterTextField.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeFilterTextField.kt @@ -56,10 +56,10 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp -import com.geeksville.mesh.R import com.geeksville.mesh.model.NodeSortOption import com.geeksville.mesh.ui.common.preview.LargeFontPreview import com.geeksville.mesh.ui.common.theme.AppTheme +import org.meshtastic.core.strings.R @Suppress("LongParameterList") @Composable diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt index 94960f84c..47558ce5e 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt @@ -51,7 +51,6 @@ import androidx.compose.ui.unit.dp import com.geeksville.mesh.ConfigProtos.Config.DeviceConfig import com.geeksville.mesh.ConfigProtos.Config.DisplayConfig import com.geeksville.mesh.MeshProtos -import com.geeksville.mesh.R import com.geeksville.mesh.model.Node import com.geeksville.mesh.model.isUnmessageableRole import com.geeksville.mesh.ui.common.components.BatteryInfo @@ -59,6 +58,7 @@ import com.geeksville.mesh.ui.common.components.SignalInfo import com.geeksville.mesh.ui.common.preview.NodePreviewParameterProvider import com.geeksville.mesh.ui.common.theme.AppTheme import com.geeksville.mesh.util.toDistanceString +import org.meshtastic.core.strings.R @Suppress("LongMethod", "CyclomaticComplexMethod") @Composable diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeKeyStatusIcon.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeKeyStatusIcon.kt index 557cc4c6f..d2ec9b688 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeKeyStatusIcon.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeKeyStatusIcon.kt @@ -54,7 +54,6 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog -import com.geeksville.mesh.R import com.geeksville.mesh.ui.common.components.CopyIconButton import com.geeksville.mesh.ui.common.theme.AppTheme import com.geeksville.mesh.ui.common.theme.StatusColors.StatusGreen @@ -62,6 +61,7 @@ import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed import com.geeksville.mesh.ui.common.theme.StatusColors.StatusYellow import com.google.protobuf.ByteString import org.meshtastic.core.model.Channel +import org.meshtastic.core.strings.R @Composable private fun KeyStatusDialog(@StringRes title: Int, @StringRes text: Int, key: ByteString?, onDismiss: () -> Unit = {}) = @@ -129,7 +129,9 @@ fun NodeKeyStatusIcon( when { mismatchKey -> Icons.Default.KeyOff to colorScheme.StatusRed hasPKC -> Icons.Default.Lock to colorScheme.StatusGreen - else -> ImageVector.vectorResource(R.drawable.ic_lock_open_right_24) to colorScheme.StatusYellow + else -> + ImageVector.vectorResource(com.geeksville.mesh.R.drawable.ic_lock_open_right_24) to + colorScheme.StatusYellow } IconButton(onClick = { showEncryptionDialog = true }, modifier = modifier) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeMenu.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeMenu.kt index 01f8d0662..a4aa56d4b 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeMenu.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeMenu.kt @@ -38,10 +38,10 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import com.geeksville.mesh.R import com.geeksville.mesh.model.Node import com.geeksville.mesh.model.isUnmessageableRole import com.geeksville.mesh.ui.common.components.SimpleAlertDialog +import org.meshtastic.core.strings.R @Suppress("LongMethod") @Composable @@ -52,12 +52,13 @@ fun NodeMenu( onDismissMenuRequest: () -> Unit, onAction: (NodeMenuAction) -> Unit, ) { - val isUnmessageable = if (node.user.hasIsUnmessagable()) { - node.user.isUnmessagable - } else { - // for older firmwares - node.user.role?.isUnmessageableRole() == true - } + val isUnmessageable = + if (node.user.hasIsUnmessagable()) { + node.user.isUnmessagable + } else { + // for older firmwares + node.user.role?.isUnmessageableRole() == true + } var displayFavoriteDialog by remember { mutableStateOf(false) } var displayIgnoreDialog by remember { mutableStateOf(false) } @@ -79,14 +80,13 @@ fun NodeMenu( displayIgnoreDialog = displayIgnoreDialog, displayRemoveDialog = displayRemoveDialog, onDismissMenuRequest = dialogDismissRequest, - onAction = onMenuAction + onAction = onMenuAction, ) DropdownMenu( modifier = Modifier.background(MaterialTheme.colorScheme.background.copy(alpha = 1f)), expanded = expanded, onDismissRequest = onDismissMenuRequest, ) { - if (showFullMenu) { if (!isUnmessageable) { DropdownMenuItem( @@ -94,7 +94,7 @@ fun NodeMenu( dialogDismissRequest() onMenuAction(NodeMenuAction.DirectMessage(node)) }, - text = { Text(stringResource(R.string.direct_message)) } + text = { Text(stringResource(R.string.direct_message)) }, ) } DropdownMenuItem( @@ -102,21 +102,21 @@ fun NodeMenu( dialogDismissRequest() onMenuAction(NodeMenuAction.RequestUserInfo(node)) }, - text = { Text(stringResource(R.string.exchange_userinfo)) } + text = { Text(stringResource(R.string.exchange_userinfo)) }, ) DropdownMenuItem( onClick = { dialogDismissRequest() onMenuAction(NodeMenuAction.RequestPosition(node)) }, - text = { Text(stringResource(R.string.exchange_position)) } + text = { Text(stringResource(R.string.exchange_position)) }, ) DropdownMenuItem( onClick = { dialogDismissRequest() onMenuAction(NodeMenuAction.TraceRoute(node)) }, - text = { Text(stringResource(R.string.traceroute)) } + text = { Text(stringResource(R.string.traceroute)) }, ) DropdownMenuItem( onClick = { @@ -124,24 +124,20 @@ fun NodeMenu( displayFavoriteDialog = true }, enabled = !node.isIgnored, - text = { - Text(stringResource(R.string.favorite)) - }, + text = { Text(stringResource(R.string.favorite)) }, trailingIcon = { Icon( imageVector = if (node.isFavorite) Icons.Filled.Star else Icons.TwoTone.StarBorder, contentDescription = stringResource(R.string.favorite), ) - } + }, ) DropdownMenuItem( onClick = { dialogDismissRequest() displayIgnoreDialog = true }, - text = { - Text(stringResource(R.string.ignore)) - }, + text = { Text(stringResource(R.string.ignore)) }, trailingIcon = { Checkbox( checked = node.isIgnored, @@ -151,7 +147,7 @@ fun NodeMenu( }, modifier = Modifier.size(24.dp), ) - } + }, ) DropdownMenuItem( onClick = { @@ -159,7 +155,7 @@ fun NodeMenu( displayRemoveDialog = true }, enabled = !node.isIgnored, - text = { Text(stringResource(R.string.remove)) } + text = { Text(stringResource(R.string.remove)) }, ) HorizontalDivider(Modifier.padding(vertical = 8.dp)) } @@ -168,7 +164,7 @@ fun NodeMenu( dialogDismissRequest() onMenuAction(NodeMenuAction.Share(node)) }, - text = { Text(stringResource(R.string.share_contact)) } + text = { Text(stringResource(R.string.share_contact)) }, ) DropdownMenuItem( @@ -176,7 +172,7 @@ fun NodeMenu( dialogDismissRequest() onMenuAction(NodeMenuAction.MoreDetails(node)) }, - text = { Text(stringResource(R.string.more_details)) } + text = { Text(stringResource(R.string.more_details)) }, ) } } @@ -188,34 +184,36 @@ fun NodeActionDialogs( displayIgnoreDialog: Boolean, displayRemoveDialog: Boolean, onDismissMenuRequest: () -> Unit, - onAction: (NodeMenuAction) -> Unit + onAction: (NodeMenuAction) -> Unit, ) { if (displayFavoriteDialog) { SimpleAlertDialog( title = R.string.favorite, - text = stringResource( + text = + stringResource( id = if (node.isFavorite) R.string.favorite_remove else R.string.favorite_add, - node.user.longName + node.user.longName, ), onConfirm = { onDismissMenuRequest() onAction(NodeMenuAction.Favorite(node)) }, - onDismiss = onDismissMenuRequest + onDismiss = onDismissMenuRequest, ) } if (displayIgnoreDialog) { SimpleAlertDialog( title = R.string.ignore, - text = stringResource( + text = + stringResource( id = if (node.isIgnored) R.string.ignore_remove else R.string.ignore_add, - node.user.longName + node.user.longName, ), onConfirm = { onDismissMenuRequest() onAction(NodeMenuAction.Ignore(node)) }, - onDismiss = onDismissMenuRequest + onDismiss = onDismissMenuRequest, ) } if (displayRemoveDialog) { @@ -226,19 +224,27 @@ fun NodeActionDialogs( onDismissMenuRequest() onAction(NodeMenuAction.Remove(node)) }, - onDismiss = onDismissMenuRequest + onDismiss = onDismissMenuRequest, ) } } sealed class NodeMenuAction { data class Remove(val node: Node) : NodeMenuAction() + data class Ignore(val node: Node) : NodeMenuAction() + data class Favorite(val node: Node) : NodeMenuAction() + data class DirectMessage(val node: Node) : NodeMenuAction() + data class RequestUserInfo(val node: Node) : NodeMenuAction() + data class RequestPosition(val node: Node) : NodeMenuAction() + data class TraceRoute(val node: Node) : NodeMenuAction() + data class MoreDetails(val node: Node) : NodeMenuAction() + data class Share(val node: Node) : NodeMenuAction() } diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt index 7f74f62cd..e501318d0 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt @@ -39,10 +39,10 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.ui.common.theme.StatusColors.StatusGreen import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed import com.geeksville.mesh.ui.common.theme.StatusColors.StatusYellow +import org.meshtastic.core.strings.R @Suppress("LongMethod") @OptIn(ExperimentalMaterial3Api::class) diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/TracerouteButton.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/TracerouteButton.kt index ac1f34805..1b906a219 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/node/components/TracerouteButton.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/TracerouteButton.kt @@ -34,9 +34,9 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.ui.common.theme.AppTheme import com.geeksville.mesh.ui.settings.components.SettingsItem +import org.meshtastic.core.strings.R private const val COOL_DOWN_TIME_MS = 30000L diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/SettingsScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/SettingsScreen.kt index 1e6180f7d..b2885e765 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/SettingsScreen.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/SettingsScreen.kt @@ -57,7 +57,6 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.BuildConfig import com.geeksville.mesh.ClientOnlyProtos.DeviceProfile -import com.geeksville.mesh.R import com.geeksville.mesh.android.gpsDisabled import com.geeksville.mesh.navigation.getNavRouteFrom import com.geeksville.mesh.ui.common.components.MainAppBar @@ -78,6 +77,7 @@ import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.rememberMultiplePermissionsState import kotlinx.coroutines.delay import org.meshtastic.core.navigation.Route +import org.meshtastic.core.strings.R import java.text.SimpleDateFormat import java.util.Date import java.util.Locale diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/CleanNodeDatabaseScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/CleanNodeDatabaseScreen.kt index 6de0164e1..c8365d926 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/CleanNodeDatabaseScreen.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/CleanNodeDatabaseScreen.kt @@ -46,9 +46,9 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.database.entity.NodeEntity import com.geeksville.mesh.ui.node.components.NodeChip +import org.meshtastic.core.strings.R /** * Composable screen for cleaning the node database. Allows users to specify criteria for deleting nodes. The list of diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfig.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfig.kt index 1c706cd68..3b4e8a0da 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfig.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfig.kt @@ -42,7 +42,6 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.navigation.ConfigRoute import com.geeksville.mesh.navigation.ModuleRoute import com.geeksville.mesh.ui.common.components.TitledCard @@ -52,6 +51,7 @@ import com.geeksville.mesh.ui.settings.components.SettingsItem import com.geeksville.mesh.ui.settings.radio.components.WarningDialog import org.meshtastic.core.navigation.Route import org.meshtastic.core.navigation.SettingsRoutes +import org.meshtastic.core.strings.R @Suppress("LongMethod", "CyclomaticComplexMethod") @Composable diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfigViewModel.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfigViewModel.kt index 599620390..92a0cf8c0 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfigViewModel.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfigViewModel.kt @@ -42,7 +42,6 @@ import com.geeksville.mesh.MeshProtos import com.geeksville.mesh.ModuleConfigProtos import com.geeksville.mesh.Portnums import com.geeksville.mesh.Position -import com.geeksville.mesh.R import com.geeksville.mesh.android.GeeksvilleApplication import com.geeksville.mesh.android.Logging import com.geeksville.mesh.android.isAnalyticsAvailable @@ -78,6 +77,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.json.JSONObject import org.meshtastic.core.navigation.SettingsRoutes +import org.meshtastic.core.strings.R import java.io.FileOutputStream import javax.inject.Inject diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AmbientLightingConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AmbientLightingConfigItemList.kt index 7cc64116d..03e7d4366 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AmbientLightingConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AmbientLightingConfigItemList.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ModuleConfigProtos -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.moduleConfig import com.geeksville.mesh.ui.common.components.EditTextPreference @@ -41,6 +40,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun AmbientLightingConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AudioConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AudioConfigItemList.kt index 5ea882b1a..aa14696af 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AudioConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AudioConfigItemList.kt @@ -34,7 +34,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig.AudioConfig -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.moduleConfig import com.geeksville.mesh.ui.common.components.DropDownPreference @@ -43,6 +42,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun AudioConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/BluetoothConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/BluetoothConfigItemList.kt index 9b05c3ed0..15723cf1e 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/BluetoothConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/BluetoothConfigItemList.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ConfigProtos.Config.BluetoothConfig -import com.geeksville.mesh.R import com.geeksville.mesh.config import com.geeksville.mesh.copy import com.geeksville.mesh.ui.common.components.DropDownPreference @@ -42,6 +41,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun BluetoothConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/CannedMessageConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/CannedMessageConfigItemList.kt index 04a962137..434ada785 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/CannedMessageConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/CannedMessageConfigItemList.kt @@ -36,7 +36,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig.CannedMessageConfig -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.moduleConfig import com.geeksville.mesh.ui.common.components.DropDownPreference @@ -45,6 +44,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun CannedMessageConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ChannelLegend.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ChannelLegend.kt index 37255780a..802dff3da 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ChannelLegend.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ChannelLegend.kt @@ -45,8 +45,8 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.model.DeviceVersion +import org.meshtastic.core.strings.R /** * At this firmware version periodic position sharing on a secondary channel was implemented. To enable this feature the diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ChannelSettingsItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ChannelSettingsItemList.kt index e82faed7b..b09a7336e 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ChannelSettingsItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ChannelSettingsItemList.kt @@ -70,7 +70,6 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ChannelProtos.ChannelSettings import com.geeksville.mesh.ConfigProtos.Config.LoRaConfig -import com.geeksville.mesh.R import com.geeksville.mesh.channelSettings import com.geeksville.mesh.model.DeviceVersion import com.geeksville.mesh.ui.common.components.PreferenceCategory @@ -81,6 +80,7 @@ import com.geeksville.mesh.ui.common.components.dragDropItemsIndexed import com.geeksville.mesh.ui.common.components.rememberDragDropState import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel import org.meshtastic.core.model.Channel +import org.meshtastic.core.strings.R @Composable private fun ChannelItem( diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DetectionSensorConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DetectionSensorConfigItemList.kt index 1fbc18124..9f6e84365 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DetectionSensorConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DetectionSensorConfigItemList.kt @@ -36,7 +36,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.moduleConfig import com.geeksville.mesh.ui.common.components.DropDownPreference @@ -45,6 +44,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun DetectionSensorConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DeviceConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DeviceConfigItemList.kt index 3003cde8d..3f5ba20e3 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DeviceConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DeviceConfigItemList.kt @@ -50,7 +50,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ConfigProtos.Config.DeviceConfig -import com.geeksville.mesh.R import com.geeksville.mesh.config import com.geeksville.mesh.copy import com.geeksville.mesh.ui.common.components.DropDownPreference @@ -59,6 +58,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R private val DeviceConfig.Role.description: Int get() = diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DisplayConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DisplayConfigItemList.kt index 7deb941e0..b9f915cfc 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DisplayConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DisplayConfigItemList.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ConfigProtos.Config.DisplayConfig -import com.geeksville.mesh.R import com.geeksville.mesh.config import com.geeksville.mesh.copy import com.geeksville.mesh.ui.common.components.DropDownPreference @@ -42,6 +41,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun DisplayConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditChannelDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditChannelDialog.kt index 2eb0941af..72926d5cd 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditChannelDialog.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditChannelDialog.kt @@ -43,7 +43,6 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.geeksville.mesh.ChannelProtos -import com.geeksville.mesh.R import com.geeksville.mesh.channelSettings import com.geeksville.mesh.copy import com.geeksville.mesh.ui.common.components.EditBase64Preference @@ -51,6 +50,7 @@ import com.geeksville.mesh.ui.common.components.EditTextPreference import com.geeksville.mesh.ui.common.components.PositionPrecisionPreference import com.geeksville.mesh.ui.common.components.SwitchPreference import org.meshtastic.core.model.Channel +import org.meshtastic.core.strings.R @Suppress("LongMethod") @Composable diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditDeviceProfileDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditDeviceProfileDialog.kt index a4ff3c928..85ca5957e 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditDeviceProfileDialog.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditDeviceProfileDialog.kt @@ -41,9 +41,9 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.geeksville.mesh.ClientOnlyProtos.DeviceProfile -import com.geeksville.mesh.R import com.geeksville.mesh.ui.common.components.SwitchPreference import com.google.protobuf.Descriptors +import org.meshtastic.core.strings.R private const val SUPPORTED_FIELDS = 7 diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ExternalNotificationConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ExternalNotificationConfigItemList.kt index a613d3b1e..d8ba38ba8 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ExternalNotificationConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ExternalNotificationConfigItemList.kt @@ -36,7 +36,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig.ExternalNotificationConfig -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.moduleConfig import com.geeksville.mesh.ui.common.components.EditTextPreference @@ -45,6 +44,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.common.components.TextDividerPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun ExternalNotificationConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/LoRaConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/LoRaConfigItemList.kt index 49f0b1a0a..028ce1c30 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/LoRaConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/LoRaConfigItemList.kt @@ -35,7 +35,6 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ChannelProtos.ChannelSettings import com.geeksville.mesh.ConfigProtos.Config.LoRaConfig -import com.geeksville.mesh.R import com.geeksville.mesh.config import com.geeksville.mesh.copy import com.geeksville.mesh.ui.common.components.DropDownPreference @@ -48,6 +47,7 @@ import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel import org.meshtastic.core.model.Channel import org.meshtastic.core.model.RegionInfo import org.meshtastic.core.model.numChannels +import org.meshtastic.core.strings.R @Composable fun LoRaConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MQTTConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MQTTConfigItemList.kt index 77e95ca1c..056d5cee7 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MQTTConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MQTTConfigItemList.kt @@ -38,7 +38,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig.MQTTConfig -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.moduleConfig import com.geeksville.mesh.ui.common.components.EditPasswordPreference @@ -47,6 +46,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun MQTTConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MapReportingPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MapReportingPreference.kt index 7cc517953..1e95261ae 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MapReportingPreference.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MapReportingPreference.kt @@ -40,12 +40,12 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.ui.common.components.EditTextPreference import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.common.components.precisionBitsToMeters import com.geeksville.mesh.util.DistanceUnit import com.geeksville.mesh.util.toDistanceString +import org.meshtastic.core.strings.R import kotlin.math.roundToInt private const val POSITION_PRECISION_MIN = 12 diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NeighborInfoConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NeighborInfoConfigItemList.kt index c35042046..997c710c1 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NeighborInfoConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NeighborInfoConfigItemList.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ModuleConfigProtos -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.moduleConfig import com.geeksville.mesh.ui.common.components.EditTextPreference @@ -41,6 +40,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun NeighborInfoConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NetworkConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NetworkConfigItemList.kt index e539c7838..83ba34aec 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NetworkConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NetworkConfigItemList.kt @@ -43,7 +43,6 @@ import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ConfigProtos.Config.NetworkConfig -import com.geeksville.mesh.R import com.geeksville.mesh.config import com.geeksville.mesh.copy import com.geeksville.mesh.ui.common.components.DropDownPreference @@ -57,6 +56,7 @@ import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel import com.journeyapps.barcodescanner.ScanContract import com.journeyapps.barcodescanner.ScanOptions +import org.meshtastic.core.strings.R @Composable private fun ScanErrorDialog(onDismiss: () -> Unit = {}) = diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PacketResponseStateDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PacketResponseStateDialog.kt index 1776d6ba0..e3ad7e26e 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PacketResponseStateDialog.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PacketResponseStateDialog.kt @@ -36,8 +36,8 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.ui.settings.radio.ResponseState +import org.meshtastic.core.strings.R @Composable fun PacketResponseStateDialog(state: ResponseState, onDismiss: () -> Unit = {}, onComplete: () -> Unit = {}) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PaxcounterConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PaxcounterConfigItemList.kt index 0609ac9b0..3b0818840 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PaxcounterConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PaxcounterConfigItemList.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ModuleConfigProtos -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.moduleConfig import com.geeksville.mesh.ui.common.components.EditTextPreference @@ -42,6 +41,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SignedIntegerEditTextPreference import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun PaxcounterConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PositionConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PositionConfigItemList.kt index 813c8d3d4..c174a9bd6 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PositionConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PositionConfigItemList.kt @@ -45,7 +45,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ConfigProtos import com.geeksville.mesh.ConfigProtos.Config.PositionConfig import com.geeksville.mesh.Position -import com.geeksville.mesh.R import com.geeksville.mesh.config import com.geeksville.mesh.copy import com.geeksville.mesh.ui.common.components.BitwisePreference @@ -58,6 +57,7 @@ import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.rememberPermissionState import kotlinx.coroutines.launch +import org.meshtastic.core.strings.R @OptIn(ExperimentalPermissionsApi::class) @Composable diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PowerConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PowerConfigItemList.kt index 10e2249bf..1e93f63d4 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PowerConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PowerConfigItemList.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ConfigProtos.Config.PowerConfig -import com.geeksville.mesh.R import com.geeksville.mesh.config import com.geeksville.mesh.copy import com.geeksville.mesh.ui.common.components.EditTextPreference @@ -41,6 +40,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun PowerConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RangeTestConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RangeTestConfigItemList.kt index d8fd21a65..e5145fdae 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RangeTestConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RangeTestConfigItemList.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig.RangeTestConfig -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.moduleConfig import com.geeksville.mesh.ui.common.components.EditTextPreference @@ -41,6 +40,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun RangeTestConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RemoteHardwareConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RemoteHardwareConfigItemList.kt index 513da7631..1e438a44f 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RemoteHardwareConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RemoteHardwareConfigItemList.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig.RemoteHardwareConfig -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.moduleConfig import com.geeksville.mesh.ui.common.components.EditListPreference @@ -41,6 +40,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun RemoteHardwareConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SecurityConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SecurityConfigItemList.kt index 7e9981eb2..cd6ebab5d 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SecurityConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SecurityConfigItemList.kt @@ -48,7 +48,6 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ConfigProtos.Config.SecurityConfig import com.geeksville.mesh.MeshProtos -import com.geeksville.mesh.R import com.geeksville.mesh.config import com.geeksville.mesh.copy import com.geeksville.mesh.ui.common.components.CopyIconButton @@ -62,6 +61,7 @@ import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel import com.geeksville.mesh.util.encodeToString import com.geeksville.mesh.util.toByteString import com.google.protobuf.ByteString +import org.meshtastic.core.strings.R import java.security.SecureRandom @Composable diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SerialConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SerialConfigItemList.kt index 982091937..1be9e9a36 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SerialConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SerialConfigItemList.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig.SerialConfig -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.moduleConfig import com.geeksville.mesh.ui.common.components.DropDownPreference @@ -42,6 +41,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun SerialConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/StoreForwardConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/StoreForwardConfigItemList.kt index 50f246357..f82f6dc6f 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/StoreForwardConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/StoreForwardConfigItemList.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig.StoreForwardConfig -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.moduleConfig import com.geeksville.mesh.ui.common.components.EditTextPreference @@ -41,6 +40,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun StoreForwardConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/TelemetryConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/TelemetryConfigItemList.kt index de1a2ce53..44167c033 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/TelemetryConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/TelemetryConfigItemList.kt @@ -33,7 +33,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig.TelemetryConfig -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.moduleConfig import com.geeksville.mesh.ui.common.components.EditTextPreference @@ -41,6 +40,7 @@ import com.geeksville.mesh.ui.common.components.PreferenceCategory import com.geeksville.mesh.ui.common.components.PreferenceFooter import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel +import org.meshtastic.core.strings.R @Composable fun TelemetryConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/UserConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/UserConfigItemList.kt index a5e163424..4a149eb8e 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/UserConfigItemList.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/UserConfigItemList.kt @@ -36,7 +36,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.MeshProtos -import com.geeksville.mesh.R import com.geeksville.mesh.copy import com.geeksville.mesh.deviceMetadata import com.geeksville.mesh.model.DeviceVersion @@ -48,6 +47,7 @@ import com.geeksville.mesh.ui.common.components.RegularPreference import com.geeksville.mesh.ui.common.components.SwitchPreference import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel import com.geeksville.mesh.user +import org.meshtastic.core.strings.R @Composable fun UserConfigScreen(viewModel: RadioConfigViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/WarningDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/WarningDialog.kt index a2efa92e5..71f14c8ee 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/WarningDialog.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/WarningDialog.kt @@ -28,8 +28,8 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.ui.common.theme.AppTheme +import org.meshtastic.core.strings.R @Composable fun WarningDialog( 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 7be388b08..213e52e1e 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 @@ -89,7 +89,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.AppOnlyProtos.ChannelSet import com.geeksville.mesh.ChannelProtos import com.geeksville.mesh.ConfigProtos -import com.geeksville.mesh.R import com.geeksville.mesh.analytics.DataPair import com.geeksville.mesh.android.BuildUtils.debug import com.geeksville.mesh.android.BuildUtils.errormsg @@ -116,6 +115,7 @@ import com.journeyapps.barcodescanner.ScanOptions import kotlinx.coroutines.launch import org.meshtastic.core.model.Channel import org.meshtastic.core.navigation.Route +import org.meshtastic.core.strings.R /** * Composable screen for managing and sharing Meshtastic channels. Allows users to view, edit, and share channel @@ -431,7 +431,7 @@ private fun QrCodeImage( ) = Image( painter = channelSet.qrCode(shouldAddChannel)?.let { BitmapPainter(it.asImageBitmap()) } - ?: painterResource(id = R.drawable.qrcode), + ?: painterResource(id = com.geeksville.mesh.R.drawable.qrcode), contentDescription = stringResource(R.string.qr_code), modifier = modifier, contentScale = ContentScale.Inside, diff --git a/app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt b/app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt index ab2e80900..74ad81186 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt @@ -52,7 +52,6 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.geeksville.mesh.AdminProtos import com.geeksville.mesh.MeshProtos -import com.geeksville.mesh.R import com.geeksville.mesh.android.BuildUtils.debug import com.geeksville.mesh.android.BuildUtils.errormsg import com.geeksville.mesh.model.DeviceVersion @@ -71,6 +70,7 @@ import com.google.zxing.WriterException import com.journeyapps.barcodescanner.BarcodeEncoder import com.journeyapps.barcodescanner.ScanContract import com.journeyapps.barcodescanner.ScanOptions +import org.meshtastic.core.strings.R import timber.log.Timber import java.net.MalformedURLException @@ -178,7 +178,9 @@ fun AddContactFAB( @Composable private fun QrCodeImage(uri: Uri, modifier: Modifier = Modifier) = Image( - painter = uri.qrCode?.let { BitmapPainter(it.asImageBitmap()) } ?: painterResource(id = R.drawable.qrcode), + painter = + uri.qrCode?.let { BitmapPainter(it.asImageBitmap()) } + ?: painterResource(id = com.geeksville.mesh.R.drawable.qrcode), contentDescription = stringResource(R.string.qr_code), modifier = modifier, contentScale = ContentScale.Inside, 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 1a65c4c72..f649250d4 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 @@ -39,11 +39,11 @@ 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 com.geeksville.mesh.R import com.geeksville.mesh.model.Contact import com.geeksville.mesh.model.UIViewModel import com.geeksville.mesh.ui.common.theme.AppTheme import com.geeksville.mesh.ui.contact.ContactItem +import org.meshtastic.core.strings.R @Composable fun ShareScreen(viewModel: UIViewModel = hiltViewModel(), onConfirm: (String) -> Unit) { diff --git a/app/src/main/java/com/geeksville/mesh/util/LanguageUtils.kt b/app/src/main/java/com/geeksville/mesh/util/LanguageUtils.kt index 206ea67ec..1af60d741 100644 --- a/app/src/main/java/com/geeksville/mesh/util/LanguageUtils.kt +++ b/app/src/main/java/com/geeksville/mesh/util/LanguageUtils.kt @@ -20,8 +20,8 @@ package com.geeksville.mesh.util import android.content.Context import androidx.appcompat.app.AppCompatDelegate import androidx.core.os.LocaleListCompat -import com.geeksville.mesh.R import com.geeksville.mesh.android.Logging +import org.meshtastic.core.strings.R import org.xmlpull.v1.XmlPullParser import java.util.Locale @@ -46,7 +46,7 @@ object LanguageUtils : Logging { add(SYSTEM_DEFAULT) try { - resources.getXml(R.xml.locales_config).use { parser -> + resources.getXml(com.geeksville.mesh.R.xml.locales_config).use { parser -> while (parser.eventType != XmlPullParser.END_DOCUMENT) { if (parser.eventType == XmlPullParser.START_TAG && parser.name == "locale") { val languageTag = diff --git a/app/src/main/res/drawable/ic_antenna_24.xml b/app/src/main/res/drawable/ic_antenna_24.xml index c806236a9..9e0358300 100644 --- a/app/src/main/res/drawable/ic_antenna_24.xml +++ b/app/src/main/res/drawable/ic_antenna_24.xml @@ -1,12 +1,29 @@ - - + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_power_plug_24.xml b/app/src/main/res/drawable/ic_power_plug_24.xml index 09f2effb9..413062438 100644 --- a/app/src/main/res/drawable/ic_power_plug_24.xml +++ b/app/src/main/res/drawable/ic_power_plug_24.xml @@ -1,11 +1,28 @@ - - + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml index a401f9143..72985e60a 100644 --- a/app/src/main/res/xml/data_extraction_rules.xml +++ b/app/src/main/res/xml/data_extraction_rules.xml @@ -1,20 +1,20 @@ + ~ 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 . + --> diff --git a/app/src/main/res/xml/device_filter.xml b/app/src/main/res/xml/device_filter.xml index b30fe60e7..3da474ba3 100644 --- a/app/src/main/res/xml/device_filter.xml +++ b/app/src/main/res/xml/device_filter.xml @@ -1,20 +1,20 @@ + ~ 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 . + --> diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml index e64422093..ec1fe53ec 100644 --- a/app/src/main/res/xml/locales_config.xml +++ b/app/src/main/res/xml/locales_config.xml @@ -1,4 +1,21 @@ + + diff --git a/core/strings/build.gradle.kts b/core/strings/build.gradle.kts new file mode 100644 index 000000000..6167108e4 --- /dev/null +++ b/core/strings/build.gradle.kts @@ -0,0 +1,20 @@ +/* + * 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 . + */ + +plugins { alias(libs.plugins.meshtastic.android.library) } + +android { namespace = "org.meshtastic.core.strings" } diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/core/strings/src/main/res/values-ar-rSA/strings.xml similarity index 100% rename from app/src/main/res/values-ar-rSA/strings.xml rename to core/strings/src/main/res/values-ar-rSA/strings.xml diff --git a/app/src/main/res/values-b+sr+Latn/strings.xml b/core/strings/src/main/res/values-b+sr+Latn/strings.xml similarity index 100% rename from app/src/main/res/values-b+sr+Latn/strings.xml rename to core/strings/src/main/res/values-b+sr+Latn/strings.xml diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/core/strings/src/main/res/values-bg-rBG/strings.xml similarity index 100% rename from app/src/main/res/values-bg-rBG/strings.xml rename to core/strings/src/main/res/values-bg-rBG/strings.xml diff --git a/app/src/main/res/values-ca-rES/strings.xml b/core/strings/src/main/res/values-ca-rES/strings.xml similarity index 100% rename from app/src/main/res/values-ca-rES/strings.xml rename to core/strings/src/main/res/values-ca-rES/strings.xml diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/core/strings/src/main/res/values-cs-rCZ/strings.xml similarity index 100% rename from app/src/main/res/values-cs-rCZ/strings.xml rename to core/strings/src/main/res/values-cs-rCZ/strings.xml diff --git a/app/src/main/res/values-de-rDE/strings.xml b/core/strings/src/main/res/values-de-rDE/strings.xml similarity index 100% rename from app/src/main/res/values-de-rDE/strings.xml rename to core/strings/src/main/res/values-de-rDE/strings.xml diff --git a/app/src/main/res/values-el-rGR/strings.xml b/core/strings/src/main/res/values-el-rGR/strings.xml similarity index 100% rename from app/src/main/res/values-el-rGR/strings.xml rename to core/strings/src/main/res/values-el-rGR/strings.xml diff --git a/app/src/main/res/values-es-rES/strings.xml b/core/strings/src/main/res/values-es-rES/strings.xml similarity index 100% rename from app/src/main/res/values-es-rES/strings.xml rename to core/strings/src/main/res/values-es-rES/strings.xml diff --git a/app/src/main/res/values-et-rEE/strings.xml b/core/strings/src/main/res/values-et-rEE/strings.xml similarity index 100% rename from app/src/main/res/values-et-rEE/strings.xml rename to core/strings/src/main/res/values-et-rEE/strings.xml diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/core/strings/src/main/res/values-fi-rFI/strings.xml similarity index 100% rename from app/src/main/res/values-fi-rFI/strings.xml rename to core/strings/src/main/res/values-fi-rFI/strings.xml diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/core/strings/src/main/res/values-fr-rFR/strings.xml similarity index 100% rename from app/src/main/res/values-fr-rFR/strings.xml rename to core/strings/src/main/res/values-fr-rFR/strings.xml diff --git a/app/src/main/res/values-ga-rIE/strings.xml b/core/strings/src/main/res/values-ga-rIE/strings.xml similarity index 100% rename from app/src/main/res/values-ga-rIE/strings.xml rename to core/strings/src/main/res/values-ga-rIE/strings.xml diff --git a/app/src/main/res/values-gl-rES/strings.xml b/core/strings/src/main/res/values-gl-rES/strings.xml similarity index 100% rename from app/src/main/res/values-gl-rES/strings.xml rename to core/strings/src/main/res/values-gl-rES/strings.xml diff --git a/app/src/main/res/values-hr-rHR/strings.xml b/core/strings/src/main/res/values-hr-rHR/strings.xml similarity index 100% rename from app/src/main/res/values-hr-rHR/strings.xml rename to core/strings/src/main/res/values-hr-rHR/strings.xml diff --git a/app/src/main/res/values-ht-rHT/strings.xml b/core/strings/src/main/res/values-ht-rHT/strings.xml similarity index 100% rename from app/src/main/res/values-ht-rHT/strings.xml rename to core/strings/src/main/res/values-ht-rHT/strings.xml diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/core/strings/src/main/res/values-hu-rHU/strings.xml similarity index 100% rename from app/src/main/res/values-hu-rHU/strings.xml rename to core/strings/src/main/res/values-hu-rHU/strings.xml diff --git a/app/src/main/res/values-is-rIS/strings.xml b/core/strings/src/main/res/values-is-rIS/strings.xml similarity index 100% rename from app/src/main/res/values-is-rIS/strings.xml rename to core/strings/src/main/res/values-is-rIS/strings.xml diff --git a/app/src/main/res/values-it-rIT/strings.xml b/core/strings/src/main/res/values-it-rIT/strings.xml similarity index 100% rename from app/src/main/res/values-it-rIT/strings.xml rename to core/strings/src/main/res/values-it-rIT/strings.xml diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/core/strings/src/main/res/values-iw-rIL/strings.xml similarity index 100% rename from app/src/main/res/values-iw-rIL/strings.xml rename to core/strings/src/main/res/values-iw-rIL/strings.xml diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/core/strings/src/main/res/values-ja-rJP/strings.xml similarity index 100% rename from app/src/main/res/values-ja-rJP/strings.xml rename to core/strings/src/main/res/values-ja-rJP/strings.xml diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/core/strings/src/main/res/values-ko-rKR/strings.xml similarity index 100% rename from app/src/main/res/values-ko-rKR/strings.xml rename to core/strings/src/main/res/values-ko-rKR/strings.xml diff --git a/app/src/main/res/values-lt-rLT/strings.xml b/core/strings/src/main/res/values-lt-rLT/strings.xml similarity index 100% rename from app/src/main/res/values-lt-rLT/strings.xml rename to core/strings/src/main/res/values-lt-rLT/strings.xml diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/core/strings/src/main/res/values-nl-rNL/strings.xml similarity index 100% rename from app/src/main/res/values-nl-rNL/strings.xml rename to core/strings/src/main/res/values-nl-rNL/strings.xml diff --git a/app/src/main/res/values-no-rNO/strings.xml b/core/strings/src/main/res/values-no-rNO/strings.xml similarity index 100% rename from app/src/main/res/values-no-rNO/strings.xml rename to core/strings/src/main/res/values-no-rNO/strings.xml diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/core/strings/src/main/res/values-pl-rPL/strings.xml similarity index 100% rename from app/src/main/res/values-pl-rPL/strings.xml rename to core/strings/src/main/res/values-pl-rPL/strings.xml diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/core/strings/src/main/res/values-pt-rBR/strings.xml similarity index 100% rename from app/src/main/res/values-pt-rBR/strings.xml rename to core/strings/src/main/res/values-pt-rBR/strings.xml diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/core/strings/src/main/res/values-pt-rPT/strings.xml similarity index 100% rename from app/src/main/res/values-pt-rPT/strings.xml rename to core/strings/src/main/res/values-pt-rPT/strings.xml diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/core/strings/src/main/res/values-ro-rRO/strings.xml similarity index 100% rename from app/src/main/res/values-ro-rRO/strings.xml rename to core/strings/src/main/res/values-ro-rRO/strings.xml diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/core/strings/src/main/res/values-ru-rRU/strings.xml similarity index 100% rename from app/src/main/res/values-ru-rRU/strings.xml rename to core/strings/src/main/res/values-ru-rRU/strings.xml diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/core/strings/src/main/res/values-sk-rSK/strings.xml similarity index 100% rename from app/src/main/res/values-sk-rSK/strings.xml rename to core/strings/src/main/res/values-sk-rSK/strings.xml diff --git a/app/src/main/res/values-sl-rSI/strings.xml b/core/strings/src/main/res/values-sl-rSI/strings.xml similarity index 100% rename from app/src/main/res/values-sl-rSI/strings.xml rename to core/strings/src/main/res/values-sl-rSI/strings.xml diff --git a/app/src/main/res/values-sq-rAL/strings.xml b/core/strings/src/main/res/values-sq-rAL/strings.xml similarity index 100% rename from app/src/main/res/values-sq-rAL/strings.xml rename to core/strings/src/main/res/values-sq-rAL/strings.xml diff --git a/app/src/main/res/values-srp/strings.xml b/core/strings/src/main/res/values-srp/strings.xml similarity index 100% rename from app/src/main/res/values-srp/strings.xml rename to core/strings/src/main/res/values-srp/strings.xml diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/core/strings/src/main/res/values-sv-rSE/strings.xml similarity index 100% rename from app/src/main/res/values-sv-rSE/strings.xml rename to core/strings/src/main/res/values-sv-rSE/strings.xml diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/core/strings/src/main/res/values-tr-rTR/strings.xml similarity index 100% rename from app/src/main/res/values-tr-rTR/strings.xml rename to core/strings/src/main/res/values-tr-rTR/strings.xml diff --git a/app/src/main/res/values-uk-rUA/strings.xml b/core/strings/src/main/res/values-uk-rUA/strings.xml similarity index 100% rename from app/src/main/res/values-uk-rUA/strings.xml rename to core/strings/src/main/res/values-uk-rUA/strings.xml diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/core/strings/src/main/res/values-zh-rCN/strings.xml similarity index 100% rename from app/src/main/res/values-zh-rCN/strings.xml rename to core/strings/src/main/res/values-zh-rCN/strings.xml diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/core/strings/src/main/res/values-zh-rTW/strings.xml similarity index 100% rename from app/src/main/res/values-zh-rTW/strings.xml rename to core/strings/src/main/res/values-zh-rTW/strings.xml diff --git a/app/src/main/res/values/strings.xml b/core/strings/src/main/res/values/strings.xml similarity index 100% rename from app/src/main/res/values/strings.xml rename to core/strings/src/main/res/values/strings.xml diff --git a/crowdin.yml b/crowdin.yml index 5266193b4..1d2d2c097 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/main/res/values/strings.xml translation: /%original_path%-%android_code%/strings.xml translate_attributes: 0 content_segmentation: 0 diff --git a/settings.gradle.kts b/settings.gradle.kts index 159e053c2..251fbc7ac 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,7 +17,8 @@ import org.gradle.kotlin.dsl.maven * along with this program. If not, see . */ -include(":app", ":core:model", ":core:navigation", ":core:network", ":core:prefs", ":core:proto", ":feature:map", ":mesh_service_example") +include(":app", ":core:model", ":core:navigation", ":core:network", ":core:prefs", ":core:proto", + ":core:strings", ":feature:map", ":mesh_service_example") rootProject.name = "MeshtasticAndroid" // https://docs.gradle.org/current/userguide/declaring_dependencies.html#sec:type-safe-project-accessors