From ad1897c5642ce596c9a2bf664630f2c1cc36937a Mon Sep 17 00:00:00 2001
From: James Rich <2199651+jamesarich@users.noreply.github.com>
Date: Thu, 29 May 2025 18:18:45 -0500
Subject: [PATCH] Refactor: organize ui screens to separate packages (#1982)
---
.../mesh/compose/ScannedQrCodeDialogTest.kt | 2 +-
.../java/com/geeksville/mesh/MainActivity.kt | 4 +-
.../mesh/model/EnvironmentMetricsState.kt | 4 +-
.../java/com/geeksville/mesh/model/UIState.kt | 2 +-
.../geeksville/mesh/navigation/NavGraph.kt | 31 +---
.../mesh/navigation/NodeDetailGraph.kt | 20 +--
.../main/java/com/geeksville/mesh/ui/Main.kt | 7 +-
.../components/AdaptiveTwoPane.kt | 2 +-
.../{ => common}/components/AlertDialogs.kt | 2 +-
.../{ => common}/components/AutoLinkText.kt | 4 +-
.../ui/{ => common/components}/BatteryInfo.kt | 4 +-
.../components/BitwisePreference.kt | 2 +-
.../components/BottomSheetDialog.kt | 2 +-
.../components/ClickableTextField.kt | 2 +-
.../{ => common}/components/CopyIconButton.kt | 2 +-
.../components/DropDownPreference.kt | 2 +-
.../components/EditBase64Preference.kt | 2 +-
.../components/EditIPv4Preference.kt | 2 +-
.../components/EditListPreference.kt | 2 +-
.../components/EditPasswordPreference.kt | 2 +-
.../components/EditTextPreference.kt | 2 +-
.../ui/{ => common}/components/EmojiPicker.kt | 2 +-
.../components/IndoorAirQuality.kt | 2 +-
.../components/LazyColumnDragAndDropDemo.kt | 23 +--
.../components/LoraSignalIndicator.kt | 3 +-
.../components/PositionPrecisionPreference.kt | 2 +-
.../components/PreferenceCategory.kt | 2 +-
.../components/PreferenceFooter.kt | 2 +-
.../components/RegularPreference.kt | 2 +-
.../components/ScannedQrCodeDialog.kt | 2 +-
.../ui/{ => common}/components/SignalInfo.kt | 6 +-
.../components/SimpleAlertDialog.kt | 4 +-
.../components/SlidingSelector.kt | 2 +-
.../components/SwitchPreference.kt | 2 +-
.../components/TextDividerPreference.kt | 2 +-
.../components/TimeTickWithLifecycle.kt | 2 +-
.../preview/LargeFontPreview.kt | 2 +-
.../preview/NodePreviewParameterProvider.kt | 2 +-
.../mesh/ui/{ => common}/theme/Color.kt | 2 +-
.../mesh/ui/{ => common}/theme/Theme.kt | 2 +-
.../mesh/ui/{ => common}/theme/Type.kt | 2 +-
.../mesh/ui/{ => contact}/ContactItem.kt | 4 +-
.../mesh/ui/{ => contact}/Contacts.kt | 2 +-
.../geeksville/mesh/ui/{ => debug}/Debug.kt | 4 +-
.../com/geeksville/mesh/ui/map/MapView.kt | 4 +
.../ui/map/{ => components}/CacheLayout.kt | 2 +-
.../ui/map/{ => components}/DownloadButton.kt | 2 +-
.../{ => components}/EditWaypointDialog.kt | 8 +-
.../mesh/ui/map/{ => components}/MapButton.kt | 4 +-
.../com/geeksville/mesh/ui/message/Message.kt | 9 +-
.../message/{components => }/MessageList.kt | 7 +-
.../mesh/ui/{ => message}/QuickChat.kt | 10 +-
.../mesh/ui/message/components/MessageItem.kt | 10 +-
.../mesh/ui/message/components/Reaction.kt | 6 +-
.../{components => metrics}/CommonCharts.kt | 13 +-
.../{components => metrics}/DeviceMetrics.kt | 19 +-
.../EnvironmentMetrics.kt | 10 +-
.../{components => metrics}/HostMetricsLog.kt | 6 +-
.../ui/{components => metrics}/PositionLog.kt | 4 +-
.../{components => metrics}/PowerMetrics.kt | 23 ++-
.../{components => metrics}/SignalMetrics.kt | 10 +-
.../{components => metrics}/TracerouteLog.kt | 10 +-
.../mesh/ui/{ => node}/NodeDetail.kt | 13 +-
.../mesh/ui/{components => node}/NodeMap.kt | 2 +-
.../mesh/ui/{ => node}/NodeScreen.kt | 27 +--
.../components}/ElevationInfo.kt | 4 +-
.../ui/{ => node/components}/LastHeardInfo.kt | 4 +-
.../components}/LinkedCoordinates.kt | 10 +-
.../mesh/ui/{ => node/components}/NodeChip.kt | 4 +-
.../components/NodeFilterTextField.kt | 6 +-
.../mesh/ui/{ => node/components}/NodeItem.kt | 14 +-
.../components/NodeKeyStatusIcon.kt | 4 +-
.../mesh/ui/{ => node}/components/NodeMenu.kt | 3 +-
.../{ => node}/components/NodeStatusIcons.kt | 6 +-
.../components}/SatelliteCountInfo.kt | 6 +-
.../ui/preview/PreviewParameterProviders.kt | 131 --------------
.../mesh/ui/radioconfig/RadioConfig.kt | 4 +-
.../AmbientLightingConfigItemList.kt | 8 +-
.../components/AudioConfigItemList.kt | 10 +-
.../components/BluetoothConfigItemList.kt | 10 +-
.../components/CannedMessageConfigItemList.kt | 10 +-
.../components/ChannelSettingsItemList.kt | 10 +-
.../DetectionSensorConfigItemList.kt | 10 +-
.../components/DeviceConfigItemList.kt | 10 +-
.../components/DisplayConfigItemList.kt | 10 +-
.../components/EditChannelDialog.kt | 8 +-
.../components/EditDeviceProfileDialog.kt | 2 +-
.../ExternalNotificationConfigItemList.kt | 10 +-
.../components/LoRaConfigItemList.kt | 14 +-
.../components/MQTTConfigItemList.kt | 12 +-
.../components/NeighborInfoConfigItemList.kt | 8 +-
.../components/NetworkConfigItemList.kt | 16 +-
.../components/PaxcounterConfigItemList.kt | 8 +-
.../components/PositionConfigItemList.kt | 12 +-
.../components/PowerConfigItemList.kt | 8 +-
.../components/RangeTestConfigItemList.kt | 8 +-
.../RemoteHardwareConfigItemList.kt | 8 +-
.../components/SecurityConfigItemList.kt | 12 +-
.../components/SerialConfigItemList.kt | 10 +-
.../components/StoreForwardConfigItemList.kt | 8 +-
.../components/TelemetryConfigItemList.kt | 8 +-
.../components/UserConfigItemList.kt | 10 +-
.../mesh/ui/{ => settings}/Settings.kt | 6 +-
.../mesh/ui/{ => sharing}/Channel.kt | 14 +-
.../mesh/ui/{ => sharing}/ContactSharing.kt | 15 +-
.../geeksville/mesh/ui/{ => sharing}/Share.kt | 5 +-
config/detekt/detekt-baseline.xml | 170 +++++++++---------
network/build.gradle.kts | 19 +-
108 files changed, 475 insertions(+), 569 deletions(-)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/AdaptiveTwoPane.kt (96%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/AlertDialogs.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/AutoLinkText.kt (96%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common/components}/BatteryInfo.kt (97%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/BitwisePreference.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/BottomSheetDialog.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/ClickableTextField.kt (97%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/CopyIconButton.kt (97%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/DropDownPreference.kt (99%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/EditBase64Preference.kt (99%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/EditIPv4Preference.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/EditListPreference.kt (99%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/EditPasswordPreference.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/EditTextPreference.kt (99%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/EmojiPicker.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/IndoorAirQuality.kt (99%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/LazyColumnDragAndDropDemo.kt (93%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/LoraSignalIndicator.kt (99%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/PositionPrecisionPreference.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/PreferenceCategory.kt (97%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/PreferenceFooter.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/RegularPreference.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/ScannedQrCodeDialog.kt (99%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/SignalInfo.kt (95%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/SimpleAlertDialog.kt (97%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/SlidingSelector.kt (99%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/SwitchPreference.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/TextDividerPreference.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/components/TimeTickWithLifecycle.kt (97%)
rename app/src/main/java/com/geeksville/mesh/ui/{compose => common}/preview/LargeFontPreview.kt (94%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/preview/NodePreviewParameterProvider.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/theme/Color.kt (99%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/theme/Theme.kt (99%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => common}/theme/Type.kt (94%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => contact}/ContactItem.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => contact}/Contacts.kt (99%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => debug}/Debug.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/map/{ => components}/CacheLayout.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/map/{ => components}/DownloadButton.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/map/{ => components}/EditWaypointDialog.kt (97%)
rename app/src/main/java/com/geeksville/mesh/ui/map/{ => components}/MapButton.kt (95%)
rename app/src/main/java/com/geeksville/mesh/ui/message/{components => }/MessageList.kt (96%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => message}/QuickChat.kt (97%)
rename app/src/main/java/com/geeksville/mesh/ui/{components => metrics}/CommonCharts.kt (96%)
rename app/src/main/java/com/geeksville/mesh/ui/{components => metrics}/DeviceMetrics.kt (95%)
rename app/src/main/java/com/geeksville/mesh/ui/{components => metrics}/EnvironmentMetrics.kt (97%)
rename app/src/main/java/com/geeksville/mesh/ui/{components => metrics}/HostMetricsLog.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{components => metrics}/PositionLog.kt (99%)
rename app/src/main/java/com/geeksville/mesh/ui/{components => metrics}/PowerMetrics.kt (95%)
rename app/src/main/java/com/geeksville/mesh/ui/{components => metrics}/SignalMetrics.kt (95%)
rename app/src/main/java/com/geeksville/mesh/ui/{components => metrics}/TracerouteLog.kt (97%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => node}/NodeDetail.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{components => node}/NodeMap.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => node}/NodeScreen.kt (88%)
rename app/src/main/java/com/geeksville/mesh/ui/{compose => node/components}/ElevationInfo.kt (97%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => node/components}/LastHeardInfo.kt (95%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => node/components}/LinkedCoordinates.kt (94%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => node/components}/NodeChip.kt (96%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => node}/components/NodeFilterTextField.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => node/components}/NodeItem.kt (96%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => node}/components/NodeKeyStatusIcon.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => node}/components/NodeMenu.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => node}/components/NodeStatusIcons.kt (94%)
rename app/src/main/java/com/geeksville/mesh/ui/{compose => node/components}/SatelliteCountInfo.kt (95%)
delete mode 100644 app/src/main/java/com/geeksville/mesh/ui/preview/PreviewParameterProviders.kt
rename app/src/main/java/com/geeksville/mesh/ui/{ => settings}/Settings.kt (99%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => sharing}/Channel.kt (98%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => sharing}/ContactSharing.kt (97%)
rename app/src/main/java/com/geeksville/mesh/ui/{ => sharing}/Share.kt (96%)
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 769101598..d9ce55676 100644
--- a/app/src/androidTest/java/com/geeksville/mesh/compose/ScannedQrCodeDialogTest.kt
+++ b/app/src/androidTest/java/com/geeksville/mesh/compose/ScannedQrCodeDialogTest.kt
@@ -30,7 +30,7 @@ import com.geeksville.mesh.channelSet
import com.geeksville.mesh.channelSettings
import com.geeksville.mesh.copy
import com.geeksville.mesh.model.Channel
-import com.geeksville.mesh.ui.components.ScannedQrCodeDialog
+import com.geeksville.mesh.ui.common.components.ScannedQrCodeDialog
import org.junit.Assert
import org.junit.Rule
import org.junit.Test
diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt
index 66a3d0428..88960fc47 100644
--- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt
+++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt
@@ -71,8 +71,8 @@ import com.geeksville.mesh.service.ServiceRepository
import com.geeksville.mesh.service.startService
import com.geeksville.mesh.ui.MainMenuAction
import com.geeksville.mesh.ui.MainScreen
-import com.geeksville.mesh.ui.theme.AppTheme
-import com.geeksville.mesh.ui.theme.MODE_DYNAMIC
+import com.geeksville.mesh.ui.common.theme.AppTheme
+import com.geeksville.mesh.ui.common.theme.MODE_DYNAMIC
import com.geeksville.mesh.util.Exceptions
import com.geeksville.mesh.util.LanguageUtils
import com.geeksville.mesh.util.getPackageInfoCompat
diff --git a/app/src/main/java/com/geeksville/mesh/model/EnvironmentMetricsState.kt b/app/src/main/java/com/geeksville/mesh/model/EnvironmentMetricsState.kt
index 6c0ef9ac7..c32a52d02 100644
--- a/app/src/main/java/com/geeksville/mesh/model/EnvironmentMetricsState.kt
+++ b/app/src/main/java/com/geeksville/mesh/model/EnvironmentMetricsState.kt
@@ -19,8 +19,8 @@ package com.geeksville.mesh.model
import androidx.compose.ui.graphics.Color
import com.geeksville.mesh.TelemetryProtos.Telemetry
-import com.geeksville.mesh.ui.theme.InfantryBlue
-import com.geeksville.mesh.ui.theme.Orange
+import com.geeksville.mesh.ui.common.theme.InfantryBlue
+import com.geeksville.mesh.ui.common.theme.Orange
enum class Environment(val color: Color) {
TEMPERATURE(Color.Red) {
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 01a9fdccb..612c7ee75 100644
--- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt
+++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt
@@ -60,8 +60,8 @@ import com.geeksville.mesh.repository.location.LocationRepository
import com.geeksville.mesh.repository.radio.RadioInterfaceService
import com.geeksville.mesh.service.MeshService
import com.geeksville.mesh.service.ServiceAction
-import com.geeksville.mesh.ui.components.NodeMenuAction
import com.geeksville.mesh.ui.map.MAP_STYLE_ID
+import com.geeksville.mesh.ui.node.components.NodeMenuAction
import com.geeksville.mesh.util.getShortDate
import com.geeksville.mesh.util.positionToMeter
import dagger.hilt.android.lifecycle.HiltViewModel
diff --git a/app/src/main/java/com/geeksville/mesh/navigation/NavGraph.kt b/app/src/main/java/com/geeksville/mesh/navigation/NavGraph.kt
index 1be05827a..b06d5e25f 100644
--- a/app/src/main/java/com/geeksville/mesh/navigation/NavGraph.kt
+++ b/app/src/main/java/com/geeksville/mesh/navigation/NavGraph.kt
@@ -15,23 +15,6 @@
* along with this program. If not, see .
*/
-/*
- * Copyright (c) 2025 Meshtastic LLC
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
package com.geeksville.mesh.navigation
import androidx.annotation.StringRes
@@ -48,16 +31,16 @@ import androidx.navigation.navDeepLink
import androidx.navigation.toRoute
import com.geeksville.mesh.R
import com.geeksville.mesh.model.UIViewModel
-import com.geeksville.mesh.ui.ChannelScreen
-import com.geeksville.mesh.ui.ContactsScreen
-import com.geeksville.mesh.ui.DebugScreen
-import com.geeksville.mesh.ui.NodeScreen
-import com.geeksville.mesh.ui.QuickChatScreen
-import com.geeksville.mesh.ui.SettingsScreen
-import com.geeksville.mesh.ui.ShareScreen
import com.geeksville.mesh.ui.TopLevelDestination.Companion.isTopLevel
+import com.geeksville.mesh.ui.contact.ContactsScreen
+import com.geeksville.mesh.ui.debug.DebugScreen
import com.geeksville.mesh.ui.map.MapView
import com.geeksville.mesh.ui.message.MessageScreen
+import com.geeksville.mesh.ui.message.QuickChatScreen
+import com.geeksville.mesh.ui.node.NodeScreen
+import com.geeksville.mesh.ui.settings.SettingsScreen
+import com.geeksville.mesh.ui.sharing.ChannelScreen
+import com.geeksville.mesh.ui.sharing.ShareScreen
import kotlinx.serialization.Serializable
enum class AdminRoute(@StringRes val title: Int) {
diff --git a/app/src/main/java/com/geeksville/mesh/navigation/NodeDetailGraph.kt b/app/src/main/java/com/geeksville/mesh/navigation/NodeDetailGraph.kt
index f93a323ab..40f28e9cd 100644
--- a/app/src/main/java/com/geeksville/mesh/navigation/NodeDetailGraph.kt
+++ b/app/src/main/java/com/geeksville/mesh/navigation/NodeDetailGraph.kt
@@ -35,15 +35,15 @@ import androidx.navigation.compose.composable
import androidx.navigation.navigation
import com.geeksville.mesh.R
import com.geeksville.mesh.model.UIViewModel
-import com.geeksville.mesh.ui.NodeDetailScreen
-import com.geeksville.mesh.ui.components.DeviceMetricsScreen
-import com.geeksville.mesh.ui.components.EnvironmentMetricsScreen
-import com.geeksville.mesh.ui.components.HostMetricsLogScreen
-import com.geeksville.mesh.ui.components.NodeMapScreen
-import com.geeksville.mesh.ui.components.PositionLogScreen
-import com.geeksville.mesh.ui.components.PowerMetricsScreen
-import com.geeksville.mesh.ui.components.SignalMetricsScreen
-import com.geeksville.mesh.ui.components.TracerouteLogScreen
+import com.geeksville.mesh.ui.metrics.DeviceMetricsScreen
+import com.geeksville.mesh.ui.metrics.EnvironmentMetricsScreen
+import com.geeksville.mesh.ui.metrics.HostMetricsLogScreen
+import com.geeksville.mesh.ui.metrics.PositionLogScreen
+import com.geeksville.mesh.ui.metrics.PowerMetricsScreen
+import com.geeksville.mesh.ui.metrics.SignalMetricsScreen
+import com.geeksville.mesh.ui.metrics.TracerouteLogScreen
+import com.geeksville.mesh.ui.node.NodeDetailScreen
+import com.geeksville.mesh.ui.node.NodeMapScreen
fun NavGraphBuilder.nodeDetailGraph(
navController: NavHostController,
@@ -83,7 +83,7 @@ fun NavGraphBuilder.nodeDetailGraph(
)
NodeDetailRoute.SIGNAL -> SignalMetricsScreen(hiltViewModel(parentEntry))
- NodeDetailRoute.TRACEROUTE -> TracerouteLogScreen(hiltViewModel(parentEntry))
+ NodeDetailRoute.TRACEROUTE -> TracerouteLogScreen(viewModel = hiltViewModel(parentEntry))
NodeDetailRoute.POWER -> PowerMetricsScreen(hiltViewModel(parentEntry))
NodeDetailRoute.HOST -> HostMetricsLogScreen(hiltViewModel(parentEntry))
}
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 d88ac0c39..45588e81b 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/Main.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/Main.kt
@@ -77,9 +77,10 @@ import com.geeksville.mesh.navigation.Route
import com.geeksville.mesh.navigation.showLongNameTitle
import com.geeksville.mesh.service.MeshService
import com.geeksville.mesh.ui.TopLevelDestination.Companion.isTopLevel
-import com.geeksville.mesh.ui.components.MultipleChoiceAlertDialog
-import com.geeksville.mesh.ui.components.ScannedQrCodeDialog
-import com.geeksville.mesh.ui.components.SimpleAlertDialog
+import com.geeksville.mesh.ui.common.components.MultipleChoiceAlertDialog
+import com.geeksville.mesh.ui.common.components.ScannedQrCodeDialog
+import com.geeksville.mesh.ui.common.components.SimpleAlertDialog
+import com.geeksville.mesh.ui.debug.DebugMenuActions
enum class TopLevelDestination(val label: String, val icon: ImageVector, val route: Route) {
Contacts("Contacts", Icons.AutoMirrored.TwoTone.Chat, Route.Contacts),
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/AdaptiveTwoPane.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/AdaptiveTwoPane.kt
similarity index 96%
rename from app/src/main/java/com/geeksville/mesh/ui/components/AdaptiveTwoPane.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/AdaptiveTwoPane.kt
index 568a0291a..6b0211d14 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/AdaptiveTwoPane.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/AdaptiveTwoPane.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/AlertDialogs.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/AlertDialogs.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/AlertDialogs.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/AlertDialogs.kt
index e5f2fe9af..6573395e5 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/AlertDialogs.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/AlertDialogs.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/AutoLinkText.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/AutoLinkText.kt
similarity index 96%
rename from app/src/main/java/com/geeksville/mesh/ui/components/AutoLinkText.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/AutoLinkText.kt
index 1b551a26b..70e6317ee 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/AutoLinkText.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/AutoLinkText.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import android.text.Spannable
import android.text.Spannable.Factory
@@ -35,7 +35,7 @@ import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.withLink
import androidx.compose.ui.tooling.preview.Preview
import androidx.core.text.util.LinkifyCompat
-import com.geeksville.mesh.ui.theme.HyperlinkBlue
+import com.geeksville.mesh.ui.common.theme.HyperlinkBlue
private val DefaultTextLinkStyles = TextLinkStyles(
style = SpanStyle(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/BatteryInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/BatteryInfo.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/BatteryInfo.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/BatteryInfo.kt
index c1f009c35..f2a176ae9 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/BatteryInfo.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/BatteryInfo.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.height
@@ -33,7 +33,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp
import com.geeksville.mesh.R
-import com.geeksville.mesh.ui.theme.AppTheme
+import com.geeksville.mesh.ui.common.theme.AppTheme
@Composable
fun BatteryInfo(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/BitwisePreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/BitwisePreference.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/BitwisePreference.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/BitwisePreference.kt
index 1e66013ea..0cde88f73 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/BitwisePreference.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/BitwisePreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/BottomSheetDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/BottomSheetDialog.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/BottomSheetDialog.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/BottomSheetDialog.kt
index d67903eac..321b0a282 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/BottomSheetDialog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/BottomSheetDialog.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/ClickableTextField.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/ClickableTextField.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/components/ClickableTextField.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/ClickableTextField.kt
index 4d38ceaab..4ea5e9143 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/ClickableTextField.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/ClickableTextField.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.annotation.StringRes
import androidx.compose.foundation.interaction.MutableInteractionSource
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/CopyIconButton.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/CopyIconButton.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/components/CopyIconButton.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/CopyIconButton.kt
index 375b51c66..07cdec733 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/CopyIconButton.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/CopyIconButton.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import android.content.ClipData
import androidx.compose.material.icons.Icons
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/DropDownPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/DropDownPreference.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/components/DropDownPreference.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/DropDownPreference.kt
index ef3be8d09..01b4fa811 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/DropDownPreference.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/DropDownPreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/EditBase64Preference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditBase64Preference.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/components/EditBase64Preference.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/EditBase64Preference.kt
index 8424a8d7f..64e3f27a9 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/EditBase64Preference.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditBase64Preference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/EditIPv4Preference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditIPv4Preference.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/EditIPv4Preference.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/EditIPv4Preference.kt
index 3b69f5d3a..dfc92a198 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/EditIPv4Preference.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditIPv4Preference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/EditListPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditListPreference.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/components/EditListPreference.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/EditListPreference.kt
index 72a5134ce..9071c9bd1 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/EditListPreference.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditListPreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/EditPasswordPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditPasswordPreference.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/EditPasswordPreference.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/EditPasswordPreference.kt
index 3520805eb..8db19a108 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/EditPasswordPreference.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditPasswordPreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/EditTextPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditTextPreference.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/components/EditTextPreference.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/EditTextPreference.kt
index de5ca65c4..4621be6da 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/EditTextPreference.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditTextPreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/EmojiPicker.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/EmojiPicker.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/EmojiPicker.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/EmojiPicker.kt
index 3ef31430b..e6c6dbe7c 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/EmojiPicker.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/EmojiPicker.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.background
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/IndoorAirQuality.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/IndoorAirQuality.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/components/IndoorAirQuality.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/IndoorAirQuality.kt
index f8339418a..6a0f6b7da 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/IndoorAirQuality.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/IndoorAirQuality.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/LazyColumnDragAndDropDemo.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/LazyColumnDragAndDropDemo.kt
similarity index 93%
rename from app/src/main/java/com/geeksville/mesh/ui/components/LazyColumnDragAndDropDemo.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/LazyColumnDragAndDropDemo.kt
index 771b32def..0548ef87e 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/LazyColumnDragAndDropDemo.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/LazyColumnDragAndDropDemo.kt
@@ -1,20 +1,21 @@
/*
- * Copyright 2021 The Android Open Source Project
+ * Copyright (c) 2025 Meshtastic LLC
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * 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.
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * 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.
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.Spring
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/LoraSignalIndicator.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/LoraSignalIndicator.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/components/LoraSignalIndicator.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/LoraSignalIndicator.kt
index 8f0373bfb..ce8a3a0e5 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/LoraSignalIndicator.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/LoraSignalIndicator.kt
@@ -16,7 +16,8 @@
*/
@file:Suppress("MagicNumber")
-package com.geeksville.mesh.ui.components
+
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/PositionPrecisionPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/PositionPrecisionPreference.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/PositionPrecisionPreference.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/PositionPrecisionPreference.kt
index 2e135720e..d1c23955e 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/PositionPrecisionPreference.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/PositionPrecisionPreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.layout.Column
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/PreferenceCategory.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceCategory.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/components/PreferenceCategory.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceCategory.kt
index 7110c77f8..80cd584ed 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/PreferenceCategory.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceCategory.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/PreferenceFooter.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceFooter.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/PreferenceFooter.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceFooter.kt
index 822a1dffb..df20f1e25 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/PreferenceFooter.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceFooter.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.annotation.StringRes
import androidx.compose.foundation.layout.Arrangement
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/RegularPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/RegularPreference.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/RegularPreference.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/RegularPreference.kt
index 03848f881..fe206fcc2 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/RegularPreference.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/RegularPreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/ScannedQrCodeDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/ScannedQrCodeDialog.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/components/ScannedQrCodeDialog.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/ScannedQrCodeDialog.kt
index 2ade7d227..41aeebc65 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/ScannedQrCodeDialog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/ScannedQrCodeDialog.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.ExperimentalLayoutApi
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/SignalInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/SignalInfo.kt
similarity index 95%
rename from app/src/main/java/com/geeksville/mesh/ui/components/SignalInfo.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/SignalInfo.kt
index 47bfed155..308be12d7 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/SignalInfo.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/SignalInfo.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.MaterialTheme
@@ -28,8 +28,8 @@ 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.preview.NodePreviewParameterProvider
-import com.geeksville.mesh.ui.theme.AppTheme
+import com.geeksville.mesh.ui.common.preview.NodePreviewParameterProvider
+import com.geeksville.mesh.ui.common.theme.AppTheme
const val MAX_VALID_SNR = 100F
const val MAX_VALID_RSSI = 0
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/SimpleAlertDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/SimpleAlertDialog.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/components/SimpleAlertDialog.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/SimpleAlertDialog.kt
index 829ecef55..666dfcf9c 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/SimpleAlertDialog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/SimpleAlertDialog.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.annotation.StringRes
import androidx.compose.foundation.layout.fillMaxWidth
@@ -33,7 +33,7 @@ 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.theme.AppTheme
+import com.geeksville.mesh.ui.common.theme.AppTheme
@Composable
fun SimpleAlertDialog(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/SlidingSelector.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/SlidingSelector.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/components/SlidingSelector.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/SlidingSelector.kt
index 6f4c94083..acd72ac1a 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/SlidingSelector.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/SlidingSelector.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import android.annotation.SuppressLint
import androidx.compose.animation.core.animateDpAsState
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/SwitchPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/SwitchPreference.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/SwitchPreference.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/SwitchPreference.kt
index 6c7460fc9..e13f188e3 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/SwitchPreference.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/SwitchPreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/TextDividerPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/TextDividerPreference.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/TextDividerPreference.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/TextDividerPreference.kt
index 5c888dbbe..9ca02078b 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/TextDividerPreference.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/TextDividerPreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/TimeTickWithLifecycle.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/TimeTickWithLifecycle.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/components/TimeTickWithLifecycle.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/components/TimeTickWithLifecycle.kt
index 45cc0f15a..50d0ac81f 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/TimeTickWithLifecycle.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/TimeTickWithLifecycle.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.common.components
import android.content.BroadcastReceiver
import android.content.Context
diff --git a/app/src/main/java/com/geeksville/mesh/ui/compose/preview/LargeFontPreview.kt b/app/src/main/java/com/geeksville/mesh/ui/common/preview/LargeFontPreview.kt
similarity index 94%
rename from app/src/main/java/com/geeksville/mesh/ui/compose/preview/LargeFontPreview.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/preview/LargeFontPreview.kt
index 92041ad46..9ebf6db99 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/compose/preview/LargeFontPreview.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/preview/LargeFontPreview.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.compose.preview
+package com.geeksville.mesh.ui.common.preview
import androidx.compose.ui.tooling.preview.Preview
diff --git a/app/src/main/java/com/geeksville/mesh/ui/preview/NodePreviewParameterProvider.kt b/app/src/main/java/com/geeksville/mesh/ui/common/preview/NodePreviewParameterProvider.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/preview/NodePreviewParameterProvider.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/preview/NodePreviewParameterProvider.kt
index f986163f6..4aca0d80e 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/preview/NodePreviewParameterProvider.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/preview/NodePreviewParameterProvider.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.preview
+package com.geeksville.mesh.ui.common.preview
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import com.geeksville.mesh.ConfigProtos
diff --git a/app/src/main/java/com/geeksville/mesh/ui/theme/Color.kt b/app/src/main/java/com/geeksville/mesh/ui/common/theme/Color.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/theme/Color.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/theme/Color.kt
index e1d83e0f1..003aef688 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/theme/Color.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/theme/Color.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.theme
+package com.geeksville.mesh.ui.common.theme
import androidx.compose.ui.graphics.Color
val MeshtasticGreen = Color(0xFF67EA94)
diff --git a/app/src/main/java/com/geeksville/mesh/ui/theme/Theme.kt b/app/src/main/java/com/geeksville/mesh/ui/common/theme/Theme.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/theme/Theme.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/theme/Theme.kt
index 3153ddcf3..458f7c418 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/theme/Theme.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/theme/Theme.kt
@@ -17,7 +17,7 @@
@file:Suppress("UnusedPrivateProperty")
-package com.geeksville.mesh.ui.theme
+package com.geeksville.mesh.ui.common.theme
import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme
diff --git a/app/src/main/java/com/geeksville/mesh/ui/theme/Type.kt b/app/src/main/java/com/geeksville/mesh/ui/common/theme/Type.kt
similarity index 94%
rename from app/src/main/java/com/geeksville/mesh/ui/theme/Type.kt
rename to app/src/main/java/com/geeksville/mesh/ui/common/theme/Type.kt
index 1e84a7449..556fd6e92 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/theme/Type.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/theme/Type.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.theme
+package com.geeksville.mesh.ui.common.theme
import androidx.compose.material3.Typography
diff --git a/app/src/main/java/com/geeksville/mesh/ui/ContactItem.kt b/app/src/main/java/com/geeksville/mesh/ui/contact/ContactItem.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/ContactItem.kt
rename to app/src/main/java/com/geeksville/mesh/ui/contact/ContactItem.kt
index b2251c88f..99404dc4d 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/ContactItem.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/contact/ContactItem.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.contact
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.background
@@ -48,7 +48,7 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
import com.geeksville.mesh.R
import com.geeksville.mesh.model.Contact
-import com.geeksville.mesh.ui.theme.AppTheme
+import com.geeksville.mesh.ui.common.theme.AppTheme
@Suppress("LongMethod")
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/Contacts.kt b/app/src/main/java/com/geeksville/mesh/ui/contact/Contacts.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/Contacts.kt
rename to app/src/main/java/com/geeksville/mesh/ui/contact/Contacts.kt
index ef6608536..d5c5e3930 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/Contacts.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/contact/Contacts.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.contact
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
diff --git a/app/src/main/java/com/geeksville/mesh/ui/Debug.kt b/app/src/main/java/com/geeksville/mesh/ui/debug/Debug.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/Debug.kt
rename to app/src/main/java/com/geeksville/mesh/ui/debug/Debug.kt
index b4f176422..86373e334 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/Debug.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/debug/Debug.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.debug
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
@@ -58,7 +58,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.geeksville.mesh.R
import com.geeksville.mesh.model.DebugViewModel
import com.geeksville.mesh.model.DebugViewModel.UiMeshLog
-import com.geeksville.mesh.ui.theme.AppTheme
+import com.geeksville.mesh.ui.common.theme.AppTheme
private val REGEX_ANNOTATED_NODE_ID = Regex("\\(![0-9a-fA-F]{8}\\)$", RegexOption.MULTILINE)
diff --git a/app/src/main/java/com/geeksville/mesh/ui/map/MapView.kt b/app/src/main/java/com/geeksville/mesh/ui/map/MapView.kt
index 411ed24a9..39d5cc1c6 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/map/MapView.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/map/MapView.kt
@@ -64,6 +64,10 @@ import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.model.map.CustomTileSource
import com.geeksville.mesh.model.map.MarkerWithLabel
import com.geeksville.mesh.model.map.clustering.RadiusMarkerClusterer
+import com.geeksville.mesh.ui.map.components.CacheLayout
+import com.geeksville.mesh.ui.map.components.DownloadButton
+import com.geeksville.mesh.ui.map.components.EditWaypointDialog
+import com.geeksville.mesh.ui.map.components.MapButton
import com.geeksville.mesh.util.SqlTileWriterExt
import com.geeksville.mesh.util.addCopyright
import com.geeksville.mesh.util.addScaleBarOverlay
diff --git a/app/src/main/java/com/geeksville/mesh/ui/map/CacheLayout.kt b/app/src/main/java/com/geeksville/mesh/ui/map/components/CacheLayout.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/map/CacheLayout.kt
rename to app/src/main/java/com/geeksville/mesh/ui/map/components/CacheLayout.kt
index 1159d99d6..64e613d5e 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/map/CacheLayout.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/map/components/CacheLayout.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.map
+package com.geeksville.mesh.ui.map.components
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
diff --git a/app/src/main/java/com/geeksville/mesh/ui/map/DownloadButton.kt b/app/src/main/java/com/geeksville/mesh/ui/map/components/DownloadButton.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/map/DownloadButton.kt
rename to app/src/main/java/com/geeksville/mesh/ui/map/components/DownloadButton.kt
index fc71e0a13..a6f3b1e8d 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/map/DownloadButton.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/map/components/DownloadButton.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.map
+package com.geeksville.mesh.ui.map.components
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.FastOutSlowInEasing
diff --git a/app/src/main/java/com/geeksville/mesh/ui/map/EditWaypointDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/map/EditWaypointDialog.kt
rename to app/src/main/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt
index f965c6716..b454e2dfe 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/map/EditWaypointDialog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.map
+package com.geeksville.mesh.ui.map.components
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
@@ -60,9 +60,9 @@ 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.components.EditTextPreference
-import com.geeksville.mesh.ui.components.EmojiPickerDialog
-import com.geeksville.mesh.ui.theme.AppTheme
+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
@Suppress("LongMethod")
diff --git a/app/src/main/java/com/geeksville/mesh/ui/map/MapButton.kt b/app/src/main/java/com/geeksville/mesh/ui/map/components/MapButton.kt
similarity index 95%
rename from app/src/main/java/com/geeksville/mesh/ui/map/MapButton.kt
rename to app/src/main/java/com/geeksville/mesh/ui/map/components/MapButton.kt
index 7cb1f4e32..ada617162 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/map/MapButton.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/map/components/MapButton.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.map
+package com.geeksville.mesh.ui.map.components
import androidx.annotation.StringRes
import androidx.compose.foundation.layout.size
@@ -31,7 +31,7 @@ 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.theme.AppTheme
+import com.geeksville.mesh.ui.common.theme.AppTheme
@Composable
fun MapButton(
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 bffbdb775..b3178398e 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
@@ -77,11 +77,10 @@ import com.geeksville.mesh.database.entity.QuickChatAction
import com.geeksville.mesh.model.Node
import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.model.getChannel
-import com.geeksville.mesh.ui.SharedContactDialog
-import com.geeksville.mesh.ui.components.NodeKeyStatusIcon
-import com.geeksville.mesh.ui.components.NodeMenuAction
-import com.geeksville.mesh.ui.message.components.MessageList
-import com.geeksville.mesh.ui.theme.AppTheme
+import com.geeksville.mesh.ui.common.theme.AppTheme
+import com.geeksville.mesh.ui.node.components.NodeKeyStatusIcon
+import com.geeksville.mesh.ui.node.components.NodeMenuAction
+import com.geeksville.mesh.ui.sharing.SharedContactDialog
import kotlinx.coroutines.launch
private const val MESSAGE_CHARACTER_LIMIT = 200
diff --git a/app/src/main/java/com/geeksville/mesh/ui/message/components/MessageList.kt b/app/src/main/java/com/geeksville/mesh/ui/message/MessageList.kt
similarity index 96%
rename from app/src/main/java/com/geeksville/mesh/ui/message/components/MessageList.kt
rename to app/src/main/java/com/geeksville/mesh/ui/message/MessageList.kt
index 8689c1e1f..c8b493aae 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/message/components/MessageList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/message/MessageList.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.message.components
+package com.geeksville.mesh.ui.message
import androidx.annotation.StringRes
import androidx.compose.foundation.layout.Box
@@ -55,7 +55,10 @@ import com.geeksville.mesh.R
import com.geeksville.mesh.database.entity.Reaction
import com.geeksville.mesh.model.Message
import com.geeksville.mesh.model.UIViewModel
-import com.geeksville.mesh.ui.components.NodeMenuAction
+import com.geeksville.mesh.ui.message.components.MessageItem
+import com.geeksville.mesh.ui.message.components.ReactionDialog
+import com.geeksville.mesh.ui.message.components.ReactionRow
+import com.geeksville.mesh.ui.node.components.NodeMenuAction
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.debounce
diff --git a/app/src/main/java/com/geeksville/mesh/ui/QuickChat.kt b/app/src/main/java/com/geeksville/mesh/ui/message/QuickChat.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/QuickChat.kt
rename to app/src/main/java/com/geeksville/mesh/ui/message/QuickChat.kt
index e602b0a7a..7c70bf0fc 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/QuickChat.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/message/QuickChat.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.message
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@@ -73,10 +73,10 @@ 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.components.dragContainer
-import com.geeksville.mesh.ui.components.dragDropItemsIndexed
-import com.geeksville.mesh.ui.components.rememberDragDropState
-import com.geeksville.mesh.ui.theme.AppTheme
+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
@Composable
internal fun QuickChatScreen(
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 1004e9b70..aa5006b7b 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
@@ -52,11 +52,11 @@ import com.geeksville.mesh.DataPacket
import com.geeksville.mesh.MessageStatus
import com.geeksville.mesh.R
import com.geeksville.mesh.model.Node
-import com.geeksville.mesh.ui.NodeChip
-import com.geeksville.mesh.ui.components.AutoLinkText
-import com.geeksville.mesh.ui.components.NodeMenuAction
-import com.geeksville.mesh.ui.preview.NodePreviewParameterProvider
-import com.geeksville.mesh.ui.theme.AppTheme
+import com.geeksville.mesh.ui.common.components.AutoLinkText
+import com.geeksville.mesh.ui.common.preview.NodePreviewParameterProvider
+import com.geeksville.mesh.ui.common.theme.AppTheme
+import com.geeksville.mesh.ui.node.components.NodeChip
+import com.geeksville.mesh.ui.node.components.NodeMenuAction
@Suppress("LongMethod", "CyclomaticComplexMethod")
@OptIn(ExperimentalFoundationApi::class)
diff --git a/app/src/main/java/com/geeksville/mesh/ui/message/components/Reaction.kt b/app/src/main/java/com/geeksville/mesh/ui/message/components/Reaction.kt
index 7fffc831a..283152c8f 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/message/components/Reaction.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/message/components/Reaction.kt
@@ -58,9 +58,9 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
import com.geeksville.mesh.MeshProtos
import com.geeksville.mesh.database.entity.Reaction
-import com.geeksville.mesh.ui.components.BottomSheetDialog
-import com.geeksville.mesh.ui.components.EmojiPickerDialog
-import com.geeksville.mesh.ui.theme.AppTheme
+import com.geeksville.mesh.ui.common.components.BottomSheetDialog
+import com.geeksville.mesh.ui.common.components.EmojiPickerDialog
+import com.geeksville.mesh.ui.common.theme.AppTheme
@Composable
fun ReactionButton(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/CommonCharts.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/CommonCharts.kt
similarity index 96%
rename from app/src/main/java/com/geeksville/mesh/ui/components/CommonCharts.kt
rename to app/src/main/java/com/geeksville/mesh/ui/metrics/CommonCharts.kt
index 72fe51a72..1813e5869 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/CommonCharts.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/CommonCharts.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.metrics
import android.graphics.Paint
import android.graphics.Typeface
@@ -57,13 +57,14 @@ 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.components.CommonCharts.DATE_TIME_FORMAT
-import com.geeksville.mesh.ui.components.CommonCharts.MAX_PERCENT_VALUE
-import com.geeksville.mesh.ui.components.CommonCharts.MS_PER_SEC
+import com.geeksville.mesh.ui.metrics.CommonCharts.DATE_TIME_FORMAT
+import com.geeksville.mesh.ui.metrics.CommonCharts.MAX_PERCENT_VALUE
+import com.geeksville.mesh.ui.metrics.CommonCharts.MS_PER_SEC
import java.text.DateFormat
object CommonCharts {
- val DATE_TIME_FORMAT: DateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM)
+ val DATE_TIME_FORMAT: DateFormat =
+ DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM)
const val MS_PER_SEC = 1000L
const val MAX_PERCENT_VALUE = 100f
}
@@ -157,7 +158,7 @@ fun YAxisLabels(
drawContext.canvas.nativeCanvas.apply {
var label = minValue
- for (i in 0..LINE_LIMIT) {
+ repeat(LINE_LIMIT + 1) {
val ratio = (label - minValue) / range
val y = height - (ratio * height)
drawText(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/DeviceMetrics.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/DeviceMetrics.kt
similarity index 95%
rename from app/src/main/java/com/geeksville/mesh/ui/components/DeviceMetrics.kt
rename to app/src/main/java/com/geeksville/mesh/ui/metrics/DeviceMetrics.kt
index 6cd4703ee..8aee0fcc4 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/DeviceMetrics.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/DeviceMetrics.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.metrics
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.horizontalScroll
@@ -50,7 +50,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Path
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.graphics.drawscope.Stroke
-import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalWindowInfo
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
@@ -61,11 +61,13 @@ import com.geeksville.mesh.R
import com.geeksville.mesh.TelemetryProtos.Telemetry
import com.geeksville.mesh.model.MetricsViewModel
import com.geeksville.mesh.model.TimeFrame
-import com.geeksville.mesh.ui.BatteryInfo
-import com.geeksville.mesh.ui.components.CommonCharts.DATE_TIME_FORMAT
-import com.geeksville.mesh.ui.components.CommonCharts.MAX_PERCENT_VALUE
-import com.geeksville.mesh.ui.components.CommonCharts.MS_PER_SEC
-import com.geeksville.mesh.ui.theme.Orange
+import com.geeksville.mesh.ui.common.components.BatteryInfo
+import com.geeksville.mesh.ui.common.components.OptionLabel
+import com.geeksville.mesh.ui.common.components.SlidingSelector
+import com.geeksville.mesh.ui.common.theme.Orange
+import com.geeksville.mesh.ui.metrics.CommonCharts.DATE_TIME_FORMAT
+import com.geeksville.mesh.ui.metrics.CommonCharts.MAX_PERCENT_VALUE
+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
@@ -75,6 +77,7 @@ private enum class Device(val color: Color) {
CH_UTIL(Color.Magenta),
AIR_UTIL(Color.Cyan)
}
+
private val LEGEND_DATA = listOf(
LegendData(nameRes = R.string.battery, color = Device.BATTERY.color, isLine = true),
LegendData(nameRes = R.string.channel_utilization, color = Device.CH_UTIL.color),
@@ -158,7 +161,7 @@ private fun DeviceMetricsChart(
val graphColor = MaterialTheme.colorScheme.onSurface
val scrollState = rememberScrollState()
- val screenWidth = LocalConfiguration.current.screenWidthDp
+ val screenWidth = LocalWindowInfo.current.containerSize.width
val dp by remember(key1 = selectedTime) {
mutableStateOf(selectedTime.dp(screenWidth, time = timeDiff.toLong()))
}
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/EnvironmentMetrics.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentMetrics.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/components/EnvironmentMetrics.kt
rename to app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentMetrics.kt
index b134cabff..6585dacf6 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/EnvironmentMetrics.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentMetrics.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.metrics
import android.annotation.SuppressLint
import androidx.compose.foundation.Canvas
@@ -62,8 +62,12 @@ import com.geeksville.mesh.model.Environment
import com.geeksville.mesh.model.EnvironmentGraphingData
import com.geeksville.mesh.model.MetricsViewModel
import com.geeksville.mesh.model.TimeFrame
-import com.geeksville.mesh.ui.components.CommonCharts.DATE_TIME_FORMAT
-import com.geeksville.mesh.ui.components.CommonCharts.MS_PER_SEC
+import com.geeksville.mesh.ui.common.components.IaqDisplayMode
+import com.geeksville.mesh.ui.common.components.IndoorAirQuality
+import com.geeksville.mesh.ui.common.components.OptionLabel
+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.GraphUtil.createPath
import com.geeksville.mesh.util.GraphUtil.drawPathWithGradient
import com.geeksville.mesh.util.UnitConversions.celsiusToFahrenheit
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/HostMetricsLog.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/HostMetricsLog.kt
rename to app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt
index c5fb25aea..db977f731 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/HostMetricsLog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.metrics
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.combinedClickable
@@ -55,8 +55,8 @@ 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.components.CommonCharts.DATE_TIME_FORMAT
-import com.geeksville.mesh.ui.theme.AppTheme
+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 java.text.DecimalFormat
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/PositionLog.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/PositionLog.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/components/PositionLog.kt
rename to app/src/main/java/com/geeksville/mesh/ui/metrics/PositionLog.kt
index 54bdfc96d..bc8e316b0 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/PositionLog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/PositionLog.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.metrics
import android.app.Activity
import android.content.Intent
@@ -65,7 +65,7 @@ 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.theme.AppTheme
+import com.geeksville.mesh.ui.common.theme.AppTheme
import com.geeksville.mesh.util.metersIn
import com.geeksville.mesh.util.toString
import java.text.DateFormat
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/PowerMetrics.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/PowerMetrics.kt
similarity index 95%
rename from app/src/main/java/com/geeksville/mesh/ui/components/PowerMetrics.kt
rename to app/src/main/java/com/geeksville/mesh/ui/metrics/PowerMetrics.kt
index 3ce0dbfde..1b3ac360d 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/PowerMetrics.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/PowerMetrics.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.metrics
import androidx.annotation.StringRes
import androidx.compose.foundation.Canvas
@@ -51,7 +51,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Path
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.graphics.drawscope.Stroke
-import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.platform.LocalWindowInfo
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
@@ -62,9 +62,11 @@ import com.geeksville.mesh.R
import com.geeksville.mesh.TelemetryProtos.Telemetry
import com.geeksville.mesh.model.MetricsViewModel
import com.geeksville.mesh.model.TimeFrame
-import com.geeksville.mesh.ui.components.CommonCharts.DATE_TIME_FORMAT
-import com.geeksville.mesh.ui.components.CommonCharts.MS_PER_SEC
-import com.geeksville.mesh.ui.theme.InfantryBlue
+import com.geeksville.mesh.ui.common.components.OptionLabel
+import com.geeksville.mesh.ui.common.components.SlidingSelector
+import com.geeksville.mesh.ui.common.theme.InfantryBlue
+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
@@ -72,16 +74,19 @@ import com.geeksville.mesh.util.GraphUtil.createPath
private enum class Power(val color: Color, val min: Float, val max: Float) {
CURRENT(InfantryBlue, -500f, 500f),
VOLTAGE(Color.Red, 0f, 20f);
+
/**
* Difference between the metrics `max` and `min` values.
*/
fun difference() = max - min
}
+
private enum class PowerChannel(@StringRes val strRes: Int) {
ONE(R.string.channel_1),
TWO(R.string.channel_2),
THREE(R.string.channel_3)
}
+
private val LEGEND_DATA = listOf(
LegendData(nameRes = R.string.current, color = Power.CURRENT.color, isLine = true),
LegendData(nameRes = R.string.voltage, color = Power.VOLTAGE.color, isLine = true),
@@ -164,8 +169,7 @@ private fun PowerMetricsChart(
val voltageDiff = Power.VOLTAGE.difference()
val scrollState = rememberScrollState()
- val configuration = LocalConfiguration.current
- val screenWidth = configuration.screenWidthDp
+ val screenWidth = LocalWindowInfo.current.containerSize.width
val dp by remember(key1 = selectedTime) {
mutableStateOf(selectedTime.dp(screenWidth, time = (newest.time - oldest.time).toLong()))
}
@@ -240,7 +244,10 @@ private fun PowerMetricsChart(
timeThreshold = selectedTime.timeThreshold()
) { i ->
val telemetry = telemetries.getOrNull(i) ?: telemetries.last()
- val ratio = (retrieveCurrent(selectedChannel, telemetry) - Power.CURRENT.min) / currentDiff
+ val ratio = (retrieveCurrent(
+ selectedChannel,
+ telemetry
+ ) - Power.CURRENT.min) / currentDiff
val y = height - (ratio * height)
return@createPath y
}
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/SignalMetrics.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/SignalMetrics.kt
similarity index 95%
rename from app/src/main/java/com/geeksville/mesh/ui/components/SignalMetrics.kt
rename to app/src/main/java/com/geeksville/mesh/ui/metrics/SignalMetrics.kt
index 0646e3025..8b9d88b82 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/SignalMetrics.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/SignalMetrics.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.metrics
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.horizontalScroll
@@ -59,8 +59,12 @@ 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.components.CommonCharts.DATE_TIME_FORMAT
-import com.geeksville.mesh.ui.components.CommonCharts.MS_PER_SEC
+import com.geeksville.mesh.ui.common.components.LoraSignalIndicator
+import com.geeksville.mesh.ui.common.components.OptionLabel
+import com.geeksville.mesh.ui.common.components.SlidingSelector
+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
@Suppress("MagicNumber")
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/TracerouteLog.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/TracerouteLog.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/components/TracerouteLog.kt
rename to app/src/main/java/com/geeksville/mesh/ui/metrics/TracerouteLog.kt
index bbf8cc2ba..dc73bae22 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/TracerouteLog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/TracerouteLog.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.metrics
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.combinedClickable
@@ -61,14 +61,15 @@ import com.geeksville.mesh.R
import com.geeksville.mesh.model.MetricsViewModel
import com.geeksville.mesh.model.fullRouteDiscovery
import com.geeksville.mesh.model.getTracerouteResponse
-import com.geeksville.mesh.ui.theme.AppTheme
+import com.geeksville.mesh.ui.common.components.SimpleAlertDialog
+import com.geeksville.mesh.ui.common.theme.AppTheme
import java.text.DateFormat
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun TracerouteLogScreen(
- viewModel: MetricsViewModel = hiltViewModel(),
modifier: Modifier = Modifier,
+ viewModel: MetricsViewModel = hiltViewModel(),
) {
val state by viewModel.state.collectAsStateWithLifecycle()
val dateFormat = remember {
@@ -148,7 +149,8 @@ private fun DeleteItem(onClick: () -> Unit) {
text = stringResource(id = R.string.delete),
color = MaterialTheme.colorScheme.error,
)
- })
+ }
+ )
}
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/NodeDetail.kt b/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/NodeDetail.kt
rename to app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt
index bc86c5111..d44c31961 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/NodeDetail.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.node
import androidx.compose.foundation.background
import androidx.compose.foundation.interaction.MutableInteractionSource
@@ -117,12 +117,13 @@ import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.model.isUnmessageableRole
import com.geeksville.mesh.navigation.Route
import com.geeksville.mesh.service.ServiceAction
-import com.geeksville.mesh.ui.components.NodeActionDialogs
-import com.geeksville.mesh.ui.components.NodeMenuAction
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.preview.NodePreviewParameterProvider
+import com.geeksville.mesh.ui.common.components.PreferenceCategory
+import com.geeksville.mesh.ui.common.preview.NodePreviewParameterProvider
+import com.geeksville.mesh.ui.common.theme.AppTheme
+import com.geeksville.mesh.ui.node.components.NodeActionDialogs
+import com.geeksville.mesh.ui.node.components.NodeMenuAction
import com.geeksville.mesh.ui.radioconfig.NavCard
-import com.geeksville.mesh.ui.theme.AppTheme
+import com.geeksville.mesh.ui.sharing.SharedContactDialog
import com.geeksville.mesh.util.UnitConversions.calculateDewPoint
import com.geeksville.mesh.util.UnitConversions.toTempString
import com.geeksville.mesh.util.formatAgo
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/NodeMap.kt b/app/src/main/java/com/geeksville/mesh/ui/node/NodeMap.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/NodeMap.kt
rename to app/src/main/java/com/geeksville/mesh/ui/node/NodeMap.kt
index f283c66b9..758e93b47 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/NodeMap.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/NodeMap.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.node
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/NodeScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/node/NodeScreen.kt
similarity index 88%
rename from app/src/main/java/com/geeksville/mesh/ui/NodeScreen.kt
rename to app/src/main/java/com/geeksville/mesh/ui/node/NodeScreen.kt
index e250e9f8d..330ac68c6 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/NodeScreen.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/NodeScreen.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.node
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.animateContentSize
@@ -35,6 +35,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.unit.dp
@@ -44,9 +45,13 @@ import com.geeksville.mesh.DataPacket
import com.geeksville.mesh.model.DeviceVersion
import com.geeksville.mesh.model.Node
import com.geeksville.mesh.model.UIViewModel
-import com.geeksville.mesh.ui.components.NodeFilterTextField
-import com.geeksville.mesh.ui.components.NodeMenuAction
-import com.geeksville.mesh.ui.components.rememberTimeTickWithLifecycle
+import com.geeksville.mesh.ui.common.components.rememberTimeTickWithLifecycle
+import com.geeksville.mesh.ui.node.components.NodeFilterTextField
+import com.geeksville.mesh.ui.node.components.NodeItem
+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
@OptIn(ExperimentalFoundationApi::class)
@Suppress("LongMethod", "CyclomaticComplexMethod")
@@ -142,17 +147,19 @@ fun NodeScreen(
val shareCapable = firmwareVersion.supportsQrCodeSharing()
AnimatedVisibility(
- modifier = Modifier.align(androidx.compose.ui.Alignment.BottomEnd),
+ modifier = Modifier.align(Alignment.BottomEnd),
visible = !listState.isScrollInProgress &&
connectionState.isConnected() &&
shareCapable
) {
@Suppress("NewApi")
- AddContactFAB(
- model = model,
- onSharedContactImport = { contact ->
- model.addSharedContact(contact)
- }
+ (
+ AddContactFAB(
+ model = model,
+ onSharedContactImport = { contact ->
+ model.addSharedContact(contact)
+ }
+ )
)
}
}
diff --git a/app/src/main/java/com/geeksville/mesh/ui/compose/ElevationInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/ElevationInfo.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/compose/ElevationInfo.kt
rename to app/src/main/java/com/geeksville/mesh/ui/node/components/ElevationInfo.kt
index 9609b6151..1db3a962e 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/compose/ElevationInfo.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/ElevationInfo.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.compose
+package com.geeksville.mesh.ui.node.components
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -61,4 +61,4 @@ fun ElevationInfoPreview() {
suffix = "ASL"
)
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/geeksville/mesh/ui/LastHeardInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/LastHeardInfo.kt
similarity index 95%
rename from app/src/main/java/com/geeksville/mesh/ui/LastHeardInfo.kt
rename to app/src/main/java/com/geeksville/mesh/ui/node/components/LastHeardInfo.kt
index 4eb75ecaf..a81c7660b 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/LastHeardInfo.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/LastHeardInfo.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.node.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
@@ -31,7 +31,7 @@ import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
import com.geeksville.mesh.R
-import com.geeksville.mesh.ui.theme.AppTheme
+import com.geeksville.mesh.ui.common.theme.AppTheme
import com.geeksville.mesh.util.formatAgo
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/LinkedCoordinates.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/LinkedCoordinates.kt
similarity index 94%
rename from app/src/main/java/com/geeksville/mesh/ui/LinkedCoordinates.kt
rename to app/src/main/java/com/geeksville/mesh/ui/node/components/LinkedCoordinates.kt
index b07bb07c6..686b05b05 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/LinkedCoordinates.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/LinkedCoordinates.kt
@@ -15,10 +15,11 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.node.components
import android.content.ActivityNotFoundException
import android.content.ClipData
+import android.content.Context
import android.content.Intent
import android.widget.Toast
import androidx.compose.foundation.ExperimentalFoundationApi
@@ -32,6 +33,7 @@ import androidx.compose.ui.platform.ClipEntry
import androidx.compose.ui.platform.Clipboard
import androidx.compose.ui.platform.LocalClipboard
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextDecoration
@@ -42,8 +44,8 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.core.net.toUri
import com.geeksville.mesh.ConfigProtos.Config.DisplayConfig.GpsCoordinateFormat
import com.geeksville.mesh.android.BuildUtils.debug
-import com.geeksville.mesh.ui.theme.AppTheme
-import com.geeksville.mesh.ui.theme.HyperlinkBlue
+import com.geeksville.mesh.ui.common.theme.AppTheme
+import com.geeksville.mesh.ui.common.theme.HyperlinkBlue
import com.geeksville.mesh.util.GPSFormat
import kotlinx.coroutines.launch
import java.net.URLEncoder
@@ -115,7 +117,7 @@ private fun rememberAnnotatedString(
pop()
}
-private fun handleClick(context: android.content.Context, annotatedString: androidx.compose.ui.text.AnnotatedString) {
+private fun handleClick(context: Context, annotatedString: AnnotatedString) {
annotatedString.getStringAnnotations(
tag = "gps",
start = 0,
diff --git a/app/src/main/java/com/geeksville/mesh/ui/NodeChip.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeChip.kt
similarity index 96%
rename from app/src/main/java/com/geeksville/mesh/ui/NodeChip.kt
rename to app/src/main/java/com/geeksville/mesh/ui/node/components/NodeChip.kt
index faed1c4f8..1358a3f52 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/NodeChip.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeChip.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.node.components
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.interaction.MutableInteractionSource
@@ -39,8 +39,6 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.dp
import com.geeksville.mesh.model.Node
-import com.geeksville.mesh.ui.components.NodeMenu
-import com.geeksville.mesh.ui.components.NodeMenuAction
@Composable
fun NodeChip(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/NodeFilterTextField.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeFilterTextField.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/NodeFilterTextField.kt
rename to app/src/main/java/com/geeksville/mesh/ui/node/components/NodeFilterTextField.kt
index e10ce5585..e65699954 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/NodeFilterTextField.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeFilterTextField.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.node.components
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.background
@@ -56,8 +56,8 @@ 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.compose.preview.LargeFontPreview
-import com.geeksville.mesh.ui.theme.AppTheme
+import com.geeksville.mesh.ui.common.preview.LargeFontPreview
+import com.geeksville.mesh.ui.common.theme.AppTheme
@Composable
fun NodeFilterTextField(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/NodeItem.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt
similarity index 96%
rename from app/src/main/java/com/geeksville/mesh/ui/NodeItem.kt
rename to app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt
index 1d35f7a48..1768b9903 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/NodeItem.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.node.components
import android.content.res.Configuration
import androidx.compose.foundation.layout.Arrangement
@@ -52,14 +52,10 @@ import com.geeksville.mesh.R
import com.geeksville.mesh.model.DeviceVersion
import com.geeksville.mesh.model.Node
import com.geeksville.mesh.model.isUnmessageableRole
-import com.geeksville.mesh.ui.components.NodeKeyStatusIcon
-import com.geeksville.mesh.ui.components.NodeMenuAction
-import com.geeksville.mesh.ui.components.NodeStatusIcons
-import com.geeksville.mesh.ui.components.SignalInfo
-import com.geeksville.mesh.ui.compose.ElevationInfo
-import com.geeksville.mesh.ui.compose.SatelliteCountInfo
-import com.geeksville.mesh.ui.preview.NodePreviewParameterProvider
-import com.geeksville.mesh.ui.theme.AppTheme
+import com.geeksville.mesh.ui.common.components.BatteryInfo
+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
@Suppress("LongMethod", "CyclomaticComplexMethod")
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/NodeKeyStatusIcon.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeKeyStatusIcon.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/NodeKeyStatusIcon.kt
rename to app/src/main/java/com/geeksville/mesh/ui/node/components/NodeKeyStatusIcon.kt
index 5f1186f98..d16bf221b 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/NodeKeyStatusIcon.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeKeyStatusIcon.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.node.components
import android.util.Base64
import androidx.annotation.StringRes
@@ -55,7 +55,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import com.geeksville.mesh.R
import com.geeksville.mesh.model.Channel
-import com.geeksville.mesh.ui.theme.AppTheme
+import com.geeksville.mesh.ui.common.theme.AppTheme
import com.google.protobuf.ByteString
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/NodeMenu.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeMenu.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/components/NodeMenu.kt
rename to app/src/main/java/com/geeksville/mesh/ui/node/components/NodeMenu.kt
index 854adc54c..01f8d0662 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/NodeMenu.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeMenu.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.node.components
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.padding
@@ -41,6 +41,7 @@ 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
@Suppress("LongMethod")
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/components/NodeStatusIcons.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt
similarity index 94%
rename from app/src/main/java/com/geeksville/mesh/ui/components/NodeStatusIcons.kt
rename to app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt
index c8002c3a3..d46176fa6 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/components/NodeStatusIcons.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.components
+package com.geeksville.mesh.ui.node.components
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
@@ -52,7 +52,7 @@ fun NodeStatusIcons(
) {
if (isUnmessageable) {
TooltipBox(
- positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
+ positionProvider = TooltipDefaults.rememberTooltipPositionProvider(),
tooltip = {
PlainTooltip {
Text(stringResource(R.string.unmonitored_or_infrastructure))
@@ -77,7 +77,7 @@ fun NodeStatusIcons(
}
if (isFavorite && !isThisNode) {
TooltipBox(
- positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),
+ positionProvider = TooltipDefaults.rememberTooltipPositionProvider(),
tooltip = {
PlainTooltip {
Text(stringResource(R.string.favorite))
diff --git a/app/src/main/java/com/geeksville/mesh/ui/compose/SatelliteCountInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/SatelliteCountInfo.kt
similarity index 95%
rename from app/src/main/java/com/geeksville/mesh/ui/compose/SatelliteCountInfo.kt
rename to app/src/main/java/com/geeksville/mesh/ui/node/components/SatelliteCountInfo.kt
index 0d276a2c6..cadf0bbde 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/compose/SatelliteCountInfo.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/SatelliteCountInfo.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.compose
+package com.geeksville.mesh.ui.node.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
@@ -30,7 +30,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.ui.theme.AppTheme
+import com.geeksville.mesh.ui.common.theme.AppTheme
@Composable
fun SatelliteCountInfo(
@@ -64,4 +64,4 @@ fun SatelliteCountInfoPreview() {
satCount = 5,
)
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/geeksville/mesh/ui/preview/PreviewParameterProviders.kt b/app/src/main/java/com/geeksville/mesh/ui/preview/PreviewParameterProviders.kt
deleted file mode 100644
index 748a2cfb3..000000000
--- a/app/src/main/java/com/geeksville/mesh/ui/preview/PreviewParameterProviders.kt
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (c) 2025 Meshtastic LLC
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package com.geeksville.mesh.ui.preview
-
-import androidx.compose.ui.tooling.preview.PreviewParameterProvider
-import com.geeksville.mesh.DeviceMetrics
-import com.geeksville.mesh.DeviceMetrics.Companion.currentTime
-import com.geeksville.mesh.EnvironmentMetrics
-import com.geeksville.mesh.MeshProtos
-import com.geeksville.mesh.MeshUser
-import com.geeksville.mesh.NodeInfo
-import com.geeksville.mesh.Position
-import kotlin.random.Random
-
-
-class NodeInfoPreviewParameterProvider: PreviewParameterProvider {
-
- val mickeyMouse = NodeInfo(
- num = 1955,
- position = Position(
- latitude = 33.812511,
- longitude = -117.918976,
- altitude = 138,
- satellitesInView = 4,
- ),
- lastHeard = currentTime(),
- channel = 0,
- snr = 12.5F,
- rssi = -42,
- deviceMetrics = DeviceMetrics(
- channelUtilization = 2.4F,
- airUtilTx = 3.5F,
- batteryLevel = 85,
- voltage = 3.7F,
- uptimeSeconds = 3600,
- ),
- user = MeshUser(
- longName = "Micky Mouse",
- shortName = "MM",
- id = "mickeyMouseId",
- hwModel = MeshProtos.HardwareModel.TBEAM,
- role = 0,
- ),
- hopsAway = 0
- )
-
- private val minnieMouse = mickeyMouse.copy(
- num = Random.nextInt(),
- user = MeshUser(
- longName = "Minnie Mouse",
- shortName = "MiMo",
- id = "minnieMouseId",
- hwModel = MeshProtos.HardwareModel.HELTEC_V3
- ),
- snr = 12.5F,
- rssi = -42,
- position = null,
- hopsAway = 1
- )
-
- private val donaldDuck = NodeInfo(
- num = Random.nextInt(),
- position = Position(
- latitude = 33.80523471893125,
- longitude = -117.92084605996297,
- altitude = 121,
- satellitesInView = 66,
- ),
- lastHeard = currentTime() - 300,
- channel = 0,
- snr = 12.5F,
- rssi = -42,
- deviceMetrics = DeviceMetrics(
- channelUtilization = 2.4F,
- airUtilTx = 3.5F,
- batteryLevel = 85,
- voltage = 3.7F,
- uptimeSeconds = 3600,
- ),
- user = MeshUser(
- longName = "Donald Duck, the Grand Duck of the Ducks",
- shortName = "DoDu",
- id = "donaldDuckId",
- hwModel = MeshProtos.HardwareModel.HELTEC_V3,
- ),
- environmentMetrics = EnvironmentMetrics(
- temperature = 28.0F,
- relativeHumidity = 50.0F,
- barometricPressure = 1013.25F,
- gasResistance = 0.0F,
- voltage = 3.7F,
- current = 0.0F,
- iaq = 100,
- ),
- hopsAway = 2
- )
-
- private val unknown = donaldDuck.copy(
- user = null,
- environmentMetrics = null
- )
-
- private val almostNothing = NodeInfo(
- num = Random.nextInt(),
- )
-
- override val values: Sequence
- get() = sequenceOf(
- mickeyMouse, // "this" node
- unknown,
- almostNothing,
- minnieMouse,
- donaldDuck
- )
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/RadioConfig.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/RadioConfig.kt
index 0c4b6b0e3..2c5faf836 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/RadioConfig.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/RadioConfig.kt
@@ -68,10 +68,10 @@ import com.geeksville.mesh.navigation.AdminRoute
import com.geeksville.mesh.navigation.ConfigRoute
import com.geeksville.mesh.navigation.ModuleRoute
import com.geeksville.mesh.navigation.Route
-import com.geeksville.mesh.ui.components.PreferenceCategory
+import com.geeksville.mesh.ui.common.components.PreferenceCategory
+import com.geeksville.mesh.ui.common.theme.AppTheme
import com.geeksville.mesh.ui.radioconfig.components.EditDeviceProfileDialog
import com.geeksville.mesh.ui.radioconfig.components.PacketResponseStateDialog
-import com.geeksville.mesh.ui.theme.AppTheme
private fun getNavRouteFrom(routeName: String): Route? {
return ConfigRoute.entries.find { it.name == routeName }?.route
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/AmbientLightingConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/AmbientLightingConfigItemList.kt
index 8075ff2fa..c6e91537c 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/AmbientLightingConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/AmbientLightingConfigItemList.kt
@@ -36,10 +36,10 @@ 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.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/AudioConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/AudioConfigItemList.kt
index 18f580c6d..37313a441 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/AudioConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/AudioConfigItemList.kt
@@ -37,11 +37,11 @@ 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.components.DropDownPreference
-import com.geeksville.mesh.ui.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.DropDownPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/BluetoothConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/BluetoothConfigItemList.kt
index 0bcf7f805..c394ec702 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/BluetoothConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/BluetoothConfigItemList.kt
@@ -36,11 +36,11 @@ 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.components.DropDownPreference
-import com.geeksville.mesh.ui.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.DropDownPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/CannedMessageConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/CannedMessageConfigItemList.kt
index ac83d533c..169abc934 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/CannedMessageConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/CannedMessageConfigItemList.kt
@@ -39,11 +39,11 @@ 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.components.DropDownPreference
-import com.geeksville.mesh.ui.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.DropDownPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/ChannelSettingsItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/ChannelSettingsItemList.kt
index 59d2d8570..354cbca3c 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/ChannelSettingsItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/ChannelSettingsItemList.kt
@@ -72,11 +72,11 @@ import com.geeksville.mesh.ConfigProtos.Config.LoRaConfig
import com.geeksville.mesh.R
import com.geeksville.mesh.channelSettings
import com.geeksville.mesh.model.Channel
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.dragContainer
-import com.geeksville.mesh.ui.components.dragDropItemsIndexed
-import com.geeksville.mesh.ui.components.rememberDragDropState
+import com.geeksville.mesh.ui.common.components.PreferenceCategory
+import com.geeksville.mesh.ui.common.components.PreferenceFooter
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/DetectionSensorConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/DetectionSensorConfigItemList.kt
index 380279667..dfb425fa6 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/DetectionSensorConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/DetectionSensorConfigItemList.kt
@@ -39,11 +39,11 @@ 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.components.DropDownPreference
-import com.geeksville.mesh.ui.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.DropDownPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/DeviceConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/DeviceConfigItemList.kt
index f518c684f..2f04f18df 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/DeviceConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/DeviceConfigItemList.kt
@@ -53,11 +53,11 @@ 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.components.DropDownPreference
-import com.geeksville.mesh.ui.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.DropDownPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
private val DeviceConfig.Role.stringRes: Int
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/DisplayConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/DisplayConfigItemList.kt
index 602b9cb2a..41fa7fe86 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/DisplayConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/DisplayConfigItemList.kt
@@ -36,11 +36,11 @@ 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.components.DropDownPreference
-import com.geeksville.mesh.ui.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.DropDownPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/EditChannelDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/EditChannelDialog.kt
index 1388ef61b..39870ac36 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/EditChannelDialog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/EditChannelDialog.kt
@@ -47,10 +47,10 @@ import com.geeksville.mesh.R
import com.geeksville.mesh.channelSettings
import com.geeksville.mesh.copy
import com.geeksville.mesh.model.Channel
-import com.geeksville.mesh.ui.components.EditBase64Preference
-import com.geeksville.mesh.ui.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PositionPrecisionPreference
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.EditBase64Preference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+import com.geeksville.mesh.ui.common.components.PositionPrecisionPreference
+import com.geeksville.mesh.ui.common.components.SwitchPreference
@Suppress("LongMethod")
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/EditDeviceProfileDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/EditDeviceProfileDialog.kt
index 393ed9e24..903f2ec6e 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/EditDeviceProfileDialog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/EditDeviceProfileDialog.kt
@@ -42,7 +42,7 @@ 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.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.google.protobuf.Descriptors
private const val SupportedFields = 7
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/ExternalNotificationConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/ExternalNotificationConfigItemList.kt
index a1c0531d6..f84909944 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/ExternalNotificationConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/ExternalNotificationConfigItemList.kt
@@ -39,11 +39,11 @@ import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig.ExternalNotificationC
import com.geeksville.mesh.R
import com.geeksville.mesh.copy
import com.geeksville.mesh.moduleConfig
-import com.geeksville.mesh.ui.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
-import com.geeksville.mesh.ui.components.TextDividerPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.common.components.TextDividerPreference
import com.geeksville.mesh.ui.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/LoRaConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/LoRaConfigItemList.kt
index 6eb2bb023..76710f89d 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/LoRaConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/LoRaConfigItemList.kt
@@ -41,13 +41,13 @@ import com.geeksville.mesh.copy
import com.geeksville.mesh.model.Channel
import com.geeksville.mesh.model.RegionInfo
import com.geeksville.mesh.model.numChannels
-import com.geeksville.mesh.ui.components.DropDownPreference
-import com.geeksville.mesh.ui.components.EditListPreference
-import com.geeksville.mesh.ui.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SignedIntegerEditTextPreference
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.DropDownPreference
+import com.geeksville.mesh.ui.common.components.EditListPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+import com.geeksville.mesh.ui.common.components.PreferenceCategory
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/MQTTConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/MQTTConfigItemList.kt
index 2cbeb8bf7..609fb8cac 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/MQTTConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/MQTTConfigItemList.kt
@@ -41,12 +41,12 @@ 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.components.EditPasswordPreference
-import com.geeksville.mesh.ui.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PositionPrecisionPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.EditPasswordPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+import com.geeksville.mesh.ui.common.components.PositionPrecisionPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/NeighborInfoConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/NeighborInfoConfigItemList.kt
index b4b02f754..45b6c8f69 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/NeighborInfoConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/NeighborInfoConfigItemList.kt
@@ -36,10 +36,10 @@ 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.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/NetworkConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/NetworkConfigItemList.kt
index 1c7ed071a..2827ebbf9 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/NetworkConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/NetworkConfigItemList.kt
@@ -46,14 +46,14 @@ 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.components.DropDownPreference
-import com.geeksville.mesh.ui.components.EditIPv4Preference
-import com.geeksville.mesh.ui.components.EditPasswordPreference
-import com.geeksville.mesh.ui.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SimpleAlertDialog
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.DropDownPreference
+import com.geeksville.mesh.ui.common.components.EditIPv4Preference
+import com.geeksville.mesh.ui.common.components.EditPasswordPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+import com.geeksville.mesh.ui.common.components.PreferenceCategory
+import com.geeksville.mesh.ui.common.components.PreferenceFooter
+import com.geeksville.mesh.ui.common.components.SimpleAlertDialog
+import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.geeksville.mesh.ui.radioconfig.RadioConfigViewModel
import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanOptions
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/PaxcounterConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/PaxcounterConfigItemList.kt
index 6c0602375..ede0da156 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/PaxcounterConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/PaxcounterConfigItemList.kt
@@ -36,10 +36,10 @@ 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.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/PositionConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/PositionConfigItemList.kt
index d170041fd..1b7da67b3 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/PositionConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/PositionConfigItemList.kt
@@ -38,12 +38,12 @@ 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.components.BitwisePreference
-import com.geeksville.mesh.ui.components.DropDownPreference
-import com.geeksville.mesh.ui.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.BitwisePreference
+import com.geeksville.mesh.ui.common.components.DropDownPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/PowerConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/PowerConfigItemList.kt
index de9899245..4cc97432d 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/PowerConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/PowerConfigItemList.kt
@@ -36,10 +36,10 @@ 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.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/RangeTestConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/RangeTestConfigItemList.kt
index 6618d9f5c..e5c7a62f7 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/RangeTestConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/RangeTestConfigItemList.kt
@@ -36,10 +36,10 @@ 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.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/RemoteHardwareConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/RemoteHardwareConfigItemList.kt
index 63bcb8640..bd72cb460 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/RemoteHardwareConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/RemoteHardwareConfigItemList.kt
@@ -36,10 +36,10 @@ 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.components.EditListPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.EditListPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/SecurityConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/SecurityConfigItemList.kt
index 87cf0a776..2c5c6c939 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/SecurityConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/SecurityConfigItemList.kt
@@ -36,12 +36,12 @@ import com.geeksville.mesh.ConfigProtos.Config.SecurityConfig
import com.geeksville.mesh.R
import com.geeksville.mesh.config
import com.geeksville.mesh.copy
-import com.geeksville.mesh.ui.components.CopyIconButton
-import com.geeksville.mesh.ui.components.EditBase64Preference
-import com.geeksville.mesh.ui.components.EditListPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.CopyIconButton
+import com.geeksville.mesh.ui.common.components.EditBase64Preference
+import com.geeksville.mesh.ui.common.components.EditListPreference
+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.radioconfig.RadioConfigViewModel
import com.geeksville.mesh.util.encodeToString
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/SerialConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/SerialConfigItemList.kt
index af3e852b6..b846f7580 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/SerialConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/SerialConfigItemList.kt
@@ -36,11 +36,11 @@ 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.components.DropDownPreference
-import com.geeksville.mesh.ui.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.DropDownPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/StoreForwardConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/StoreForwardConfigItemList.kt
index da579aa08..e0f9e3f3d 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/StoreForwardConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/StoreForwardConfigItemList.kt
@@ -36,10 +36,10 @@ 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.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/TelemetryConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/TelemetryConfigItemList.kt
index 1049e805e..deed92f0f 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/TelemetryConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/TelemetryConfigItemList.kt
@@ -36,10 +36,10 @@ 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.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+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.radioconfig.RadioConfigViewModel
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/UserConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/UserConfigItemList.kt
index 74cd458d3..1e13254a3 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/UserConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/radioconfig/components/UserConfigItemList.kt
@@ -40,11 +40,11 @@ import com.geeksville.mesh.R
import com.geeksville.mesh.copy
import com.geeksville.mesh.deviceMetadata
import com.geeksville.mesh.model.DeviceVersion
-import com.geeksville.mesh.ui.components.EditTextPreference
-import com.geeksville.mesh.ui.components.PreferenceCategory
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.RegularPreference
-import com.geeksville.mesh.ui.components.SwitchPreference
+import com.geeksville.mesh.ui.common.components.EditTextPreference
+import com.geeksville.mesh.ui.common.components.PreferenceCategory
+import com.geeksville.mesh.ui.common.components.PreferenceFooter
+import com.geeksville.mesh.ui.common.components.RegularPreference
+import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.geeksville.mesh.ui.radioconfig.RadioConfigViewModel
import com.geeksville.mesh.user
diff --git a/app/src/main/java/com/geeksville/mesh/ui/Settings.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/Settings.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/Settings.kt
rename to app/src/main/java/com/geeksville/mesh/ui/settings/Settings.kt
index 914412e06..b53400776 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/Settings.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/Settings.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.settings
import android.app.Activity
import android.content.Context
@@ -94,7 +94,9 @@ import com.geeksville.mesh.model.Node
import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.repository.network.NetworkRepository
import com.geeksville.mesh.service.MeshService
-import com.geeksville.mesh.ui.components.NodeMenuAction
+import com.geeksville.mesh.ui.node.components.NodeChip
+import com.geeksville.mesh.ui.node.components.NodeMenuAction
+import com.geeksville.mesh.ui.sharing.SharedContactDialog
import kotlinx.coroutines.delay
fun String?.isIPAddress(): Boolean {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/Channel.kt b/app/src/main/java/com/geeksville/mesh/ui/sharing/Channel.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/Channel.kt
rename to app/src/main/java/com/geeksville/mesh/ui/sharing/Channel.kt
index 05e3cd616..8a4703697 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/Channel.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/sharing/Channel.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.sharing
import android.content.ClipData
import android.net.Uri
@@ -94,12 +94,12 @@ import com.geeksville.mesh.model.getChannelUrl
import com.geeksville.mesh.model.qrCode
import com.geeksville.mesh.model.toChannelSet
import com.geeksville.mesh.service.MeshService
-import com.geeksville.mesh.ui.components.AdaptiveTwoPane
-import com.geeksville.mesh.ui.components.DropDownPreference
-import com.geeksville.mesh.ui.components.PreferenceFooter
-import com.geeksville.mesh.ui.components.dragContainer
-import com.geeksville.mesh.ui.components.dragDropItemsIndexed
-import com.geeksville.mesh.ui.components.rememberDragDropState
+import com.geeksville.mesh.ui.common.components.AdaptiveTwoPane
+import com.geeksville.mesh.ui.common.components.DropDownPreference
+import com.geeksville.mesh.ui.common.components.PreferenceFooter
+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.radioconfig.components.ChannelCard
import com.geeksville.mesh.ui.radioconfig.components.ChannelSelection
import com.geeksville.mesh.ui.radioconfig.components.EditChannelDialog
diff --git a/app/src/main/java/com/geeksville/mesh/ui/ContactSharing.kt b/app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/ContactSharing.kt
rename to app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt
index 80b19ff5b..86b7cd1b2 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/ContactSharing.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt
@@ -15,16 +15,14 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.sharing
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.net.Uri
-import android.os.Build
import android.util.Base64
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
-import androidx.annotation.RequiresApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -43,6 +41,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.graphics.painter.BitmapPainter
@@ -63,8 +62,9 @@ import com.geeksville.mesh.android.getCameraPermissions
import com.geeksville.mesh.model.DeviceVersion
import com.geeksville.mesh.model.Node
import com.geeksville.mesh.model.UIViewModel
-import com.geeksville.mesh.ui.components.CopyIconButton
-import com.geeksville.mesh.ui.components.SimpleAlertDialog
+import com.geeksville.mesh.ui.common.components.CopyIconButton
+import com.geeksville.mesh.ui.common.components.SimpleAlertDialog
+import com.google.protobuf.ByteString
import com.google.protobuf.Descriptors
import com.google.zxing.BarcodeFormat
import com.google.zxing.MultiFormatWriter
@@ -74,7 +74,6 @@ import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanOptions
import java.net.MalformedURLException
-@RequiresApi(Build.VERSION_CODES.M)
@Suppress("LongMethod", "CyclomaticComplexMethod")
@Composable
fun AddContactFAB(
@@ -227,7 +226,7 @@ private fun SharedContact(
modifier = Modifier
.fillMaxWidth()
.padding(4.dp),
- verticalAlignment = androidx.compose.ui.Alignment.CenterVertically
+ verticalAlignment = Alignment.CenterVertically
) {
Text(
text = contactUri.toString(),
@@ -386,7 +385,7 @@ private fun valueToString(value: Any?, fieldDescriptor: Descriptors.FieldDescrip
Descriptors.FieldDescriptor.Type.BYTES -> {
// For ByteString, you might want to display it as hex or Base64
// For simplicity, here we'll just show its size.
- if (value is com.google.protobuf.ByteString) {
+ if (value is ByteString) {
Base64.encodeToString(value.toByteArray(), Base64.DEFAULT).trim()
} else {
value.toString().trim()
diff --git a/app/src/main/java/com/geeksville/mesh/ui/Share.kt b/app/src/main/java/com/geeksville/mesh/ui/sharing/Share.kt
similarity index 96%
rename from app/src/main/java/com/geeksville/mesh/ui/Share.kt
rename to app/src/main/java/com/geeksville/mesh/ui/sharing/Share.kt
index 2bd1ba065..b25000557 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/Share.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/sharing/Share.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui
+package com.geeksville.mesh.ui.sharing
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
@@ -42,7 +42,8 @@ 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.theme.AppTheme
+import com.geeksville.mesh.ui.common.theme.AppTheme
+import com.geeksville.mesh.ui.contact.ContactItem
@Composable
fun ShareScreen(
diff --git a/config/detekt/detekt-baseline.xml b/config/detekt/detekt-baseline.xml
index 880b55f84..19b5accac 100644
--- a/config/detekt/detekt-baseline.xml
+++ b/config/detekt/detekt-baseline.xml
@@ -1,17 +1,32 @@
-
+
+
+
TooManyFunctions:ContactSharing.kt$com.geeksville.mesh.ui.ContactSharing.kt
TooManyFunctions:NodeDetail.kt$com.geeksville.mesh.ui.NodeDetail.kt
- AbsentOrWrongFileLicense:LazyColumnDragAndDropDemo.kt$com.geeksville.mesh.ui.components.LazyColumnDragAndDropDemo.kt
ChainWrapping:Channel.kt$Channel$&&
- ChainWrapping:CustomTileSource.kt$CustomTileSource.Companion.<no name provided>$+
+ ChainWrapping:CustomTileSource.kt$CustomTileSource.Companion.<no name provided>$+
ChainWrapping:SqlTileWriterExt.kt$SqlTileWriterExt$+
CommentSpacing:AppIntroduction.kt$AppIntroduction$//addSlide(SlideTwoFragment())
CommentSpacing:BLEException.kt$BLEConnectionClosing$/// Our interface is being shut down
- CommentSpacing:BTScanModel.kt$BTScanModel$/// Use the string for the NopInterface
CommentSpacing:BluetoothInterface.kt$BluetoothInterface$/// Attempt to read from the fromRadio mailbox, if data is found broadcast it to android apps
CommentSpacing:BluetoothInterface.kt$BluetoothInterface$/// For testing
CommentSpacing:BluetoothInterface.kt$BluetoothInterface$/// Our BLE device
@@ -65,7 +80,7 @@
CommentSpacing:SafeBluetooth.kt$SafeBluetooth$/// helper glue to make sync continuations and then wait for the result
CommentSpacing:SafeBluetooth.kt$SafeBluetooth$/// if we are in the first non-automated lowLevel connect.
CommentSpacing:SafeBluetooth.kt$SafeBluetooth$//com.geeksville.mesh.service.SafeBluetooth.closeGatt
- CommentSpacing:SafeBluetooth.kt$SafeBluetooth.<no name provided>$//throw Exception("Mystery bluetooth failure - debug me")
+ CommentSpacing:SafeBluetooth.kt$SafeBluetooth.<no name provided>$//throw Exception("Mystery bluetooth failure - debug me")
CommentSpacing:SafeBluetooth.kt$SafeBluetooth.BluetoothContinuation$/// Connection work items are treated specially
CommentSpacing:SafeBluetooth.kt$SafeBluetooth.BluetoothContinuation$/// Start running a queued bit of work, return true for success or false for fatal bluetooth error
ConstructorParameterNaming:MeshLog.kt$MeshLog$@ColumnInfo(name = "message") val raw_message: String
@@ -84,7 +99,7 @@
EmptyDefaultConstructor:SqlTileWriterExt.kt$SqlTileWriterExt$()
EmptyDefaultConstructor:SqlTileWriterExt.kt$SqlTileWriterExt.SourceCount$()
EmptyFunctionBlock:NopInterface.kt$NopInterface${ }
- EmptyFunctionBlock:NsdManager.kt$<no name provided>${ }
+ EmptyFunctionBlock:NsdManager.kt$<no name provided>${ }
EmptyFunctionBlock:TrustAllX509TrustManager.kt$TrustAllX509TrustManager${}
FinalNewline:AppIntroduction.kt$com.geeksville.mesh.AppIntroduction.kt
FinalNewline:AppPrefs.kt$com.geeksville.mesh.android.AppPrefs.kt
@@ -97,13 +112,11 @@
FinalNewline:CoroutineDispatchers.kt$com.geeksville.mesh.CoroutineDispatchers.kt
FinalNewline:Coroutines.kt$com.geeksville.mesh.concurrent.Coroutines.kt
FinalNewline:CustomTileSource.kt$com.geeksville.mesh.model.map.CustomTileSource.kt
- FinalNewline:DatabaseModule.kt$com.geeksville.mesh.database.DatabaseModule.kt
FinalNewline:DateUtils.kt$com.geeksville.mesh.android.DateUtils.kt
FinalNewline:DebugLogFile.kt$com.geeksville.mesh.android.DebugLogFile.kt
FinalNewline:DeferredExecution.kt$com.geeksville.mesh.concurrent.DeferredExecution.kt
FinalNewline:DeviceVersion.kt$com.geeksville.mesh.model.DeviceVersion.kt
FinalNewline:DeviceVersionTest.kt$com.geeksville.mesh.model.DeviceVersionTest.kt
- FinalNewline:ElevationInfo.kt$com.geeksville.mesh.ui.compose.ElevationInfo.kt
FinalNewline:ExpireChecker.kt$com.geeksville.mesh.android.ExpireChecker.kt
FinalNewline:InterfaceId.kt$com.geeksville.mesh.repository.radio.InterfaceId.kt
FinalNewline:InterfaceSpec.kt$com.geeksville.mesh.repository.radio.InterfaceSpec.kt
@@ -113,14 +126,12 @@
FinalNewline:NopInterface.kt$com.geeksville.mesh.repository.radio.NopInterface.kt
FinalNewline:NopInterfaceFactory.kt$com.geeksville.mesh.repository.radio.NopInterfaceFactory.kt
FinalNewline:OnlineTileSourceAuth.kt$com.geeksville.mesh.model.map.OnlineTileSourceAuth.kt
- FinalNewline:PreviewParameterProviders.kt$com.geeksville.mesh.ui.preview.PreviewParameterProviders.kt
FinalNewline:ProbeTableProvider.kt$com.geeksville.mesh.repository.usb.ProbeTableProvider.kt
FinalNewline:QuickChatActionRepository.kt$com.geeksville.mesh.database.QuickChatActionRepository.kt
FinalNewline:RadioNotConnectedException.kt$com.geeksville.mesh.service.RadioNotConnectedException.kt
FinalNewline:RadioRepositoryModule.kt$com.geeksville.mesh.repository.radio.RadioRepositoryModule.kt
- FinalNewline:RegularPreference.kt$com.geeksville.mesh.ui.components.RegularPreference.kt
+ FinalNewline:RegularPreference.kt$com.geeksville.mesh.ui.common.components.RegularPreference.kt
FinalNewline:SafeBluetooth.kt$com.geeksville.mesh.service.SafeBluetooth.kt
- FinalNewline:SatelliteCountInfo.kt$com.geeksville.mesh.ui.compose.SatelliteCountInfo.kt
FinalNewline:SerialConnection.kt$com.geeksville.mesh.repository.usb.SerialConnection.kt
FinalNewline:SerialConnectionListener.kt$com.geeksville.mesh.repository.usb.SerialConnectionListener.kt
FinalNewline:SerialInterface.kt$com.geeksville.mesh.repository.radio.SerialInterface.kt
@@ -144,29 +155,27 @@
ImplicitDefaultLocale:LocationUtils.kt$GPSFormat$String.format("%s°%s'%.5s\"%s", a[0], a[1], a[2], a[3])
ImplicitDefaultLocale:NodeInfo.kt$NodeInfo$String.format("%d%%", batteryLevel)
LargeClass:MeshService.kt$MeshService : ServiceLogging
- LongMethod:AmbientLightingConfigItemList.kt$@Composable fun AmbientLightingConfigItemList( ambientLightingConfig: ModuleConfigProtos.ModuleConfig.AmbientLightingConfig, enabled: Boolean, onSaveClicked: (ModuleConfigProtos.ModuleConfig.AmbientLightingConfig) -> Unit, )
- LongMethod:AudioConfigItemList.kt$@Composable fun AudioConfigItemList( audioConfig: AudioConfig, enabled: Boolean, onSaveClicked: (AudioConfig) -> Unit, )
- LongMethod:CannedMessageConfigItemList.kt$@Composable fun CannedMessageConfigItemList( messages: String, cannedMessageConfig: CannedMessageConfig, enabled: Boolean, onSaveClicked: (messages: String, config: CannedMessageConfig) -> Unit, )
- LongMethod:Contacts.kt$@Composable fun ContactsScreen( uiViewModel: UIViewModel = hiltViewModel(), onNavigate: (String) -> Unit = {} )
- LongMethod:Contacts.kt$@OptIn(ExperimentalMaterialApi::class) // Required for AlertDialog in some cases, though often not strictly necessary now @Composable fun MuteNotificationsDialog( showDialog: Boolean, onDismiss: () -> Unit, onConfirm: (Long) -> Unit // Lambda to handle the confirmed mute duration )
- LongMethod:DeviceConfigItemList.kt$@Composable fun DeviceConfigItemList( deviceConfig: DeviceConfig, enabled: Boolean, onSaveClicked: (DeviceConfig) -> Unit, )
- LongMethod:DisplayConfigItemList.kt$@Composable fun DisplayConfigItemList( displayConfig: DisplayConfig, enabled: Boolean, onSaveClicked: (DisplayConfig) -> Unit, )
- LongMethod:DropDownPreference.kt$@Composable fun <T> DropDownPreference( title: String, enabled: Boolean, items: List<Pair<T, String>>, selectedItem: T, onItemSelected: (T) -> Unit, modifier: Modifier = Modifier, summary: String? = null, )
- LongMethod:EditListPreference.kt$@Composable inline fun <reified T> EditListPreference( title: String, list: List<T>, maxCount: Int, enabled: Boolean, keyboardActions: KeyboardActions, crossinline onValuesChanged: (List<T>) -> Unit, modifier: Modifier = Modifier, )
- LongMethod:ExternalNotificationConfigItemList.kt$@Composable fun ExternalNotificationConfigItemList( ringtone: String, extNotificationConfig: ExternalNotificationConfig, enabled: Boolean, onSaveClicked: (ringtone: String, config: ExternalNotificationConfig) -> Unit, )
- LongMethod:MQTTConfigItemList.kt$@Composable fun MQTTConfigItemList( mqttConfig: MQTTConfig, enabled: Boolean, onSaveClicked: (MQTTConfig) -> Unit, )
+ LongMethod:AmbientLightingConfigItemList.kt$@Composable fun AmbientLightingConfigItemList( ambientLightingConfig: ModuleConfigProtos.ModuleConfig.AmbientLightingConfig, enabled: Boolean, onSaveClicked: (ModuleConfigProtos.ModuleConfig.AmbientLightingConfig) -> Unit, )
+ LongMethod:AudioConfigItemList.kt$@Composable fun AudioConfigItemList( audioConfig: AudioConfig, enabled: Boolean, onSaveClicked: (AudioConfig) -> Unit, )
+ LongMethod:CannedMessageConfigItemList.kt$@Composable fun CannedMessageConfigItemList( messages: String, cannedMessageConfig: CannedMessageConfig, enabled: Boolean, onSaveClicked: (messages: String, config: CannedMessageConfig) -> Unit, )
+ LongMethod:Contacts.kt$@Composable fun ContactsScreen( uiViewModel: UIViewModel = hiltViewModel(), onNavigate: (String) -> Unit = {} )
+ LongMethod:DeviceConfigItemList.kt$@Composable fun DeviceConfigItemList( deviceConfig: DeviceConfig, enabled: Boolean, onSaveClicked: (DeviceConfig) -> Unit, )
+ LongMethod:DisplayConfigItemList.kt$@Composable fun DisplayConfigItemList( displayConfig: DisplayConfig, enabled: Boolean, onSaveClicked: (DisplayConfig) -> Unit, )
+ LongMethod:DropDownPreference.kt$@Composable fun <T> DropDownPreference( title: String, enabled: Boolean, items: List<Pair<T, String>>, selectedItem: T, onItemSelected: (T) -> Unit, modifier: Modifier = Modifier, summary: String? = null, )
+ LongMethod:EditListPreference.kt$@Composable inline fun <reified T> EditListPreference( title: String, list: List<T>, maxCount: Int, enabled: Boolean, keyboardActions: KeyboardActions, crossinline onValuesChanged: (List<T>) -> Unit, modifier: Modifier = Modifier, )
+ LongMethod:ExternalNotificationConfigItemList.kt$@Composable fun ExternalNotificationConfigItemList( ringtone: String, extNotificationConfig: ExternalNotificationConfig, enabled: Boolean, onSaveClicked: (ringtone: String, config: ExternalNotificationConfig) -> Unit, )
+ LongMethod:MQTTConfigItemList.kt$@Composable fun MQTTConfigItemList( mqttConfig: MQTTConfig, enabled: Boolean, onSaveClicked: (MQTTConfig) -> Unit, )
LongMethod:MapView.kt$@Composable fun MapView( model: UIViewModel = viewModel(), )
LongMethod:MeshService.kt$MeshService$private fun handleReceivedData(packet: MeshPacket)
- LongMethod:PowerConfigItemList.kt$@Composable fun PowerConfigItemList( powerConfig: PowerConfig, enabled: Boolean, onSaveClicked: (PowerConfig) -> Unit, )
+ LongMethod:PowerConfigItemList.kt$@Composable fun PowerConfigItemList( powerConfig: PowerConfig, enabled: Boolean, onSaveClicked: (PowerConfig) -> Unit, )
LongMethod:RadioConfigViewModel.kt$RadioConfigViewModel$private fun processPacketResponse(packet: MeshProtos.MeshPacket)
- LongMethod:SerialConfigItemList.kt$@Composable fun SerialConfigItemList( serialConfig: SerialConfig, enabled: Boolean, onSaveClicked: (SerialConfig) -> Unit, )
- LongMethod:StoreForwardConfigItemList.kt$@Composable fun StoreForwardConfigItemList( storeForwardConfig: StoreForwardConfig, enabled: Boolean, onSaveClicked: (StoreForwardConfig) -> Unit, )
- LongMethod:TelemetryConfigItemList.kt$@Composable fun TelemetryConfigItemList( telemetryConfig: TelemetryConfig, enabled: Boolean, onSaveClicked: (TelemetryConfig) -> Unit, )
+ LongMethod:SerialConfigItemList.kt$@Composable fun SerialConfigItemList( serialConfig: SerialConfig, enabled: Boolean, onSaveClicked: (SerialConfig) -> Unit, )
+ LongMethod:StoreForwardConfigItemList.kt$@Composable fun StoreForwardConfigItemList( storeForwardConfig: StoreForwardConfig, enabled: Boolean, onSaveClicked: (StoreForwardConfig) -> Unit, )
+ LongMethod:TelemetryConfigItemList.kt$@Composable fun TelemetryConfigItemList( telemetryConfig: TelemetryConfig, enabled: Boolean, onSaveClicked: (TelemetryConfig) -> Unit, )
LongMethod:UIState.kt$UIViewModel$fun saveMessagesCSV(uri: Uri)
- LongMethod:UserConfigItemList.kt$@Composable fun UserConfigItemList( userConfig: MeshProtos.User, enabled: Boolean, onSaveClicked: (MeshProtos.User) -> Unit, )
- LongParameterList:BTScanModel.kt$BTScanModel$( private val application: Application, private val serviceRepository: ServiceRepository, private val bluetoothRepository: BluetoothRepository, private val usbRepository: UsbRepository, private val usbManagerLazy: dagger.Lazy<UsbManager>, private val networkRepository: NetworkRepository, private val radioInterfaceService: RadioInterfaceService, )
- LongParameterList:NOAAWmsTileSource.kt$NOAAWmsTileSource$( aName: String, aBaseUrl: Array<String>, layername: String, version: String, time: String?, srs: String, style: String?, format: String, )
- LongParameterList:OnlineTileSourceAuth.kt$OnlineTileSourceAuth$( aName: String, aZoomLevel: Int, aZoomMaxLevel: Int, aTileSizePixels: Int, aImageFileNameEnding: String, aBaseUrl: Array<String>, pCopyright: String, tileSourcePolicy: TileSourcePolicy, layerName: String?, apiKey: String )
+ LongParameterList:BTScanModel.kt$BTScanModel$( private val application: Application, private val serviceRepository: ServiceRepository, private val bluetoothRepository: BluetoothRepository, private val usbRepository: UsbRepository, private val usbManagerLazy: dagger.Lazy<UsbManager>, private val networkRepository: NetworkRepository, private val radioInterfaceService: RadioInterfaceService, )
+ LongParameterList:NOAAWmsTileSource.kt$NOAAWmsTileSource$( aName: String, aBaseUrl: Array<String>, layername: String, version: String, time: String?, srs: String, style: String?, format: String, )
+ LongParameterList:OnlineTileSourceAuth.kt$OnlineTileSourceAuth$( aName: String, aZoomLevel: Int, aZoomMaxLevel: Int, aTileSizePixels: Int, aImageFileNameEnding: String, aBaseUrl: Array<String>, pCopyright: String, tileSourcePolicy: TileSourcePolicy, layerName: String?, apiKey: String )
LongParameterList:RadioInterfaceService.kt$RadioInterfaceService$( private val context: Application, private val dispatchers: CoroutineDispatchers, private val bluetoothRepository: BluetoothRepository, private val networkRepository: NetworkRepository, private val processLifecycle: Lifecycle, @RadioRepositoryQualifier private val prefs: SharedPreferences, private val interfaceFactory: InterfaceFactory, )
MagicNumber:BatteryInfo.kt$100
MagicNumber:BatteryInfo.kt$101
@@ -257,7 +266,7 @@
MagicNumber:MapView.kt$128205
MagicNumber:MapView.kt$12F
MagicNumber:MapView.kt$1e-7
- MagicNumber:MapView.kt$<no name provided>$1e7
+ MagicNumber:MapView.kt$<no name provided>$1e7
MagicNumber:MapViewExtensions.kt$1e-5
MagicNumber:MapViewExtensions.kt$1e-7
MagicNumber:MapViewExtensions.kt$3.0f
@@ -325,7 +334,7 @@
MagicNumber:SafeBluetooth.kt$SafeBluetooth$100
MagicNumber:SafeBluetooth.kt$SafeBluetooth$1000
MagicNumber:SafeBluetooth.kt$SafeBluetooth$2500
- MagicNumber:SafeBluetooth.kt$SafeBluetooth.<no name provided>$2500
+ MagicNumber:SafeBluetooth.kt$SafeBluetooth.<no name provided>$2500
MagicNumber:SerialConnectionImpl.kt$SerialConnectionImpl$115200
MagicNumber:SerialConnectionImpl.kt$SerialConnectionImpl$200
MagicNumber:ServiceClient.kt$ServiceClient$500
@@ -341,11 +350,10 @@
MatchingDeclarationName:DistanceExtensions.kt$DistanceUnit
MatchingDeclarationName:LocationUtils.kt$GPSFormat
MatchingDeclarationName:MeshServiceStarter.kt$ServiceStarter : Worker
- MatchingDeclarationName:PreviewParameterProviders.kt$NodeInfoPreviewParameterProvider : PreviewParameterProvider
MatchingDeclarationName:SortOption.kt$NodeSortOption
- MaxLineLength:AppPrefs.kt$FloatPref$fun get(thisRef: AppPrefs, prop: KProperty<Float>): Float
- MaxLineLength:AppPrefs.kt$StringPref$fun get(thisRef: AppPrefs, prop: KProperty<String>): String
- MaxLineLength:BluetoothInterface.kt$/* Info for the esp32 device side code. See that source for the 'gold' standard docs on this interface. MeshBluetoothService UUID 6ba1b218-15a8-461f-9fa8-5dcae273eafd FIXME - notify vs indication for fromradio output. Using notify for now, not sure if that is best FIXME - in the esp32 mesh management code, occasionally mirror the current net db to flash, so that if we reboot we still have a good guess of users who are out there. FIXME - make sure this protocol is guaranteed robust and won't drop packets "According to the BLE specification the notification length can be max ATT_MTU - 3. The 3 bytes subtracted is the 3-byte header(OP-code (operation, 1 byte) and the attribute handle (2 bytes)). In BLE 4.1 the ATT_MTU is 23 bytes (20 bytes for payload), but in BLE 4.2 the ATT_MTU can be negotiated up to 247 bytes." MAXPACKET is 256? look into what the lora lib uses. FIXME Characteristics: UUID properties description 8ba2bcc2-ee02-4a55-a531-c525c5e454d5 read fromradio - contains a newly received packet destined towards the phone (up to MAXPACKET bytes? per packet). After reading the esp32 will put the next packet in this mailbox. If the FIFO is empty it will put an empty packet in this mailbox. f75c76d2-129e-4dad-a1dd-7866124401e7 write toradio - write ToRadio protobufs to this charstic to send them (up to MAXPACKET len) ed9da18c-a800-4f66-a670-aa7547e34453 read|notify|write fromnum - the current packet # in the message waiting inside fromradio, if the phone sees this notify it should read messages until it catches up with this number. The phone can write to this register to go backwards up to FIXME packets, to handle the rare case of a fromradio packet was dropped after the esp32 callback was called, but before it arrives at the phone. If the phone writes to this register the esp32 will discard older packets and put the next packet >= fromnum in fromradio. When the esp32 advances fromnum, it will delay doing the notify by 100ms, in the hopes that the notify will never actally need to be sent if the phone is already pulling from fromradio. Note: that if the phone ever sees this number decrease, it means the esp32 has rebooted. Re: queue management Not all messages are kept in the fromradio queue (filtered based on SubPacket): * only the most recent Position and User messages for a particular node are kept * all Data SubPackets are kept * No WantNodeNum / DenyNodeNum messages are kept A variable keepAllPackets, if set to true will suppress this behavior and instead keep everything for forwarding to the phone (for debugging) */
+ MaxLineLength:AppPrefs.kt$FloatPref$fun get(thisRef: AppPrefs, prop: KProperty<Float>): Float
+ MaxLineLength:AppPrefs.kt$StringPref$fun get(thisRef: AppPrefs, prop: KProperty<String>): String
+ MaxLineLength:BluetoothInterface.kt$/* Info for the esp32 device side code. See that source for the 'gold' standard docs on this interface. MeshBluetoothService UUID 6ba1b218-15a8-461f-9fa8-5dcae273eafd FIXME - notify vs indication for fromradio output. Using notify for now, not sure if that is best FIXME - in the esp32 mesh management code, occasionally mirror the current net db to flash, so that if we reboot we still have a good guess of users who are out there. FIXME - make sure this protocol is guaranteed robust and won't drop packets "According to the BLE specification the notification length can be max ATT_MTU - 3. The 3 bytes subtracted is the 3-byte header(OP-code (operation, 1 byte) and the attribute handle (2 bytes)). In BLE 4.1 the ATT_MTU is 23 bytes (20 bytes for payload), but in BLE 4.2 the ATT_MTU can be negotiated up to 247 bytes." MAXPACKET is 256? look into what the lora lib uses. FIXME Characteristics: UUID properties description 8ba2bcc2-ee02-4a55-a531-c525c5e454d5 read fromradio - contains a newly received packet destined towards the phone (up to MAXPACKET bytes? per packet). After reading the esp32 will put the next packet in this mailbox. If the FIFO is empty it will put an empty packet in this mailbox. f75c76d2-129e-4dad-a1dd-7866124401e7 write toradio - write ToRadio protobufs to this charstic to send them (up to MAXPACKET len) ed9da18c-a800-4f66-a670-aa7547e34453 read|notify|write fromnum - the current packet # in the message waiting inside fromradio, if the phone sees this notify it should read messages until it catches up with this number. The phone can write to this register to go backwards up to FIXME packets, to handle the rare case of a fromradio packet was dropped after the esp32 callback was called, but before it arrives at the phone. If the phone writes to this register the esp32 will discard older packets and put the next packet >= fromnum in fromradio. When the esp32 advances fromnum, it will delay doing the notify by 100ms, in the hopes that the notify will never actally need to be sent if the phone is already pulling from fromradio. Note: that if the phone ever sees this number decrease, it means the esp32 has rebooted. Re: queue management Not all messages are kept in the fromradio queue (filtered based on SubPacket): * only the most recent Position and User messages for a particular node are kept * all Data SubPackets are kept * No WantNodeNum / DenyNodeNum messages are kept A variable keepAllPackets, if set to true will suppress this behavior and instead keep everything for forwarding to the phone (for debugging) */
MaxLineLength:BluetoothInterface.kt$BluetoothInterface$*
MaxLineLength:BluetoothInterface.kt$BluetoothInterface$// BLE handles stable. So turn the hack off for these devices. FIXME - find a better way to know that the board is NRF52 based
MaxLineLength:BluetoothInterface.kt$BluetoothInterface$// The following optimization is not currently correct - because the device might be sleeping and come back with different BLE handles
@@ -359,7 +367,6 @@
MaxLineLength:BluetoothInterface.kt$BluetoothInterface$null
MaxLineLength:BluetoothState.kt$BluetoothState$"BluetoothState(hasPermissions=$hasPermissions, enabled=$enabled, bondedDevices=${bondedDevices.map { it.anonymize }})"
MaxLineLength:Channel.kt$Channel$// We have a new style 'empty' channel name. Use the same logic from the device to convert that to a human readable name
- MaxLineLength:Contacts.kt$@OptIn(ExperimentalMaterialApi::class)
MaxLineLength:ContextServices.kt$val Context.locationManager: LocationManager get() = requireNotNull(getSystemService(Context.LOCATION_SERVICE) as? LocationManager?)
MaxLineLength:ContextServices.kt$val Context.notificationManager: NotificationManager get() = requireNotNull(getSystemService(Context.NOTIFICATION_SERVICE) as? NotificationManager?)
MaxLineLength:CustomTileSource.kt$CustomTileSource.Companion$arrayOf("https://new.nowcoast.noaa.gov/arcgis/services/nowcoast/radar_meteo_imagery_nexrad_time/MapServer/WmsServer?")
@@ -369,8 +376,6 @@
MaxLineLength:MQTTRepository.kt$MQTTRepository.Companion$*
MaxLineLength:MainActivity.kt$MainActivity$/* This problem can occur if we unbind, but there is already an onConnected job waiting to run. That job runs and then makes meshService != null again I think I've fixed this by cancelling connectionJob. We'll see! */
MaxLineLength:MainActivity.kt$MainActivity$// Old samsung phones have a race condition andthis might rarely fail. Which is probably find because the bind will be sufficient most of the time
- MaxLineLength:MainActivity.kt$MainActivity$// We now wait for the device to connect, once connected, we ask the user if they want to switch to the new channel
- MaxLineLength:MainActivity.kt$MainActivity$debug("Asked to open a channel URL - ask user if they want to switch to that channel. If so send the config to the radio")
MaxLineLength:MeshService.kt$MeshService$*
MaxLineLength:MeshService.kt$MeshService$* Send a mesh packet to the radio, if the radio is not currently connected this function will throw NotConnectedException
MaxLineLength:MeshService.kt$MeshService$// If we've received our initial config, our radio settings and all of our channels, send any queued packets and broadcast connected to clients
@@ -385,17 +390,17 @@
MaxLineLength:MeshService.kt$MeshService$// causes the phone to try and reconnect. If we fail downloading our initial radio state we don't want to
MaxLineLength:MeshService.kt$MeshService$// logAssert(earlyReceivedPackets.size < 128) // The max should normally be about 32, but if the device is messed up it might try to send forever
MaxLineLength:MeshService.kt$MeshService$// note: no need to call startDeviceSleep(), because this exception could only have reached us if it was already called
- MaxLineLength:MeshService.kt$MeshService$MeshProtos.FromRadio.MQTTCLIENTPROXYMESSAGE_FIELD_NUMBER -> handleMqttProxyMessage(proto.mqttClientProxyMessage)
+ MaxLineLength:MeshService.kt$MeshService$MeshProtos.FromRadio.MQTTCLIENTPROXYMESSAGE_FIELD_NUMBER -> handleMqttProxyMessage(proto.mqttClientProxyMessage)
MaxLineLength:MeshService.kt$MeshService$debug("Received nodeinfo num=${info.num}, hasUser=${info.hasUser()}, hasPosition=${info.hasPosition()}, hasDeviceMetrics=${info.hasDeviceMetrics()}")
MaxLineLength:MeshService.kt$MeshService.Companion$// generate a RECEIVED action filter string that includes either the portnumber as an int, or preferably a symbolic name from portnums.proto
MaxLineLength:MeshServiceBroadcasts.kt$MeshServiceBroadcasts$context.sendBroadcast(intent)
MaxLineLength:MeshServiceNotifications.kt$MeshServiceNotifications$// If running on really old versions of android (<= 5.1.1) (possibly only cyanogen) we might encounter a bug with setting application specific icons
MaxLineLength:MetricsViewModel.kt$MetricsViewModel$writer.appendLine("$rxDateTime,\"$latitude\",\"$longitude\",\"$altitude\",\"$satsInView\",\"$speed\",\"$heading\"")
MaxLineLength:MetricsViewModel.kt$MetricsViewModel$writer.appendLine("\"date\",\"time\",\"latitude\",\"longitude\",\"altitude\",\"satsInView\",\"speed\",\"heading\"")
- MaxLineLength:NodeInfo.kt$NodeInfo$prefUnits == ConfigProtos.Config.DisplayConfig.DisplayUnits.IMPERIAL_VALUE && dist < 1609 -> "%.0f ft".format(dist.toDouble()*3.281)
- MaxLineLength:NodeInfo.kt$NodeInfo$prefUnits == ConfigProtos.Config.DisplayConfig.DisplayUnits.IMPERIAL_VALUE && dist >= 1609 -> "%.1f mi".format(dist / 1609.34)
- MaxLineLength:NodeInfo.kt$NodeInfo$prefUnits == ConfigProtos.Config.DisplayConfig.DisplayUnits.METRIC_VALUE && dist < 1000 -> "%.0f m".format(dist.toDouble())
- MaxLineLength:NodeInfo.kt$NodeInfo$prefUnits == ConfigProtos.Config.DisplayConfig.DisplayUnits.METRIC_VALUE && dist >= 1000 -> "%.1f km".format(dist / 1000.0)
+ MaxLineLength:NodeInfo.kt$NodeInfo$prefUnits == ConfigProtos.Config.DisplayConfig.DisplayUnits.IMPERIAL_VALUE && dist < 1609 -> "%.0f ft".format(dist.toDouble()*3.281)
+ MaxLineLength:NodeInfo.kt$NodeInfo$prefUnits == ConfigProtos.Config.DisplayConfig.DisplayUnits.IMPERIAL_VALUE && dist >= 1609 -> "%.1f mi".format(dist / 1609.34)
+ MaxLineLength:NodeInfo.kt$NodeInfo$prefUnits == ConfigProtos.Config.DisplayConfig.DisplayUnits.METRIC_VALUE && dist < 1000 -> "%.0f m".format(dist.toDouble())
+ MaxLineLength:NodeInfo.kt$NodeInfo$prefUnits == ConfigProtos.Config.DisplayConfig.DisplayUnits.METRIC_VALUE && dist >= 1000 -> "%.1f km".format(dist / 1000.0)
MaxLineLength:NodeInfo.kt$Position$/**
MaxLineLength:NodeInfo.kt$Position$return "Position(lat=${latitude.anonymize}, lon=${longitude.anonymize}, alt=${altitude.anonymize}, time=${time})"
MaxLineLength:PositionConfigItemList.kt$.
@@ -412,12 +417,12 @@
MaxLineLength:SafeBluetooth.kt$SafeBluetooth$if
MaxLineLength:SafeBluetooth.kt$SafeBluetooth$if (enable) BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE else BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE
MaxLineLength:SafeBluetooth.kt$SafeBluetooth$java.lang.NullPointerException: Attempt to invoke virtual method 'void android.bluetooth.BluetoothGattCallback.onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)' on a null object reference
- MaxLineLength:SafeBluetooth.kt$SafeBluetooth.<no name provided>$// After this execute reliable completes - we can continue with normal operations (see onReliableWriteCompleted)
- MaxLineLength:SafeBluetooth.kt$SafeBluetooth.<no name provided>$// Note: if no work is pending (likely) we also just totally teardown and restart the connection, because we won't be
- MaxLineLength:SafeBluetooth.kt$SafeBluetooth.<no name provided>$// We were not previously connected and we just failed with our non-auto connection attempt. Therefore we now need
- MaxLineLength:SafeBluetooth.kt$SafeBluetooth.<no name provided>$// to do an autoconnection attempt. When that attempt succeeds/fails the normal callbacks will be called
+ MaxLineLength:SafeBluetooth.kt$SafeBluetooth.<no name provided>$// After this execute reliable completes - we can continue with normal operations (see onReliableWriteCompleted)
+ MaxLineLength:SafeBluetooth.kt$SafeBluetooth.<no name provided>$// Note: if no work is pending (likely) we also just totally teardown and restart the connection, because we won't be
+ MaxLineLength:SafeBluetooth.kt$SafeBluetooth.<no name provided>$// We were not previously connected and we just failed with our non-auto connection attempt. Therefore we now need
+ MaxLineLength:SafeBluetooth.kt$SafeBluetooth.<no name provided>$// to do an autoconnection attempt. When that attempt succeeds/fails the normal callbacks will be called
MaxLineLength:ServiceClient.kt$ServiceClient$// Some phones seem to ahve a race where if you unbind and quickly rebind bindService returns false. Try
- MaxLineLength:ServiceClient.kt$ServiceClient.<no name provided>$// If we start to close a service, it seems that there is a possibility a onServiceConnected event is the queue
+ MaxLineLength:ServiceClient.kt$ServiceClient.<no name provided>$// If we start to close a service, it seems that there is a possibility a onServiceConnected event is the queue
MaxLineLength:SqlTileWriterExt.kt$SqlTileWriterExt$"select " + DatabaseFileArchive.COLUMN_KEY + "," + COLUMN_EXPIRES + "," + DatabaseFileArchive.COLUMN_PROVIDER + " from " + DatabaseFileArchive.TABLE + " limit ? offset ?"
MaxLineLength:StreamInterface.kt$StreamInterface$*
MaxLineLength:StreamInterface.kt$StreamInterface$* An interface that assumes we are talking to a meshtastic device over some sort of stream connection (serial or TCP probably)
@@ -430,8 +435,8 @@
MaxLineLength:UIState.kt$UIViewModel$writer.appendLine("\"date\",\"time\",\"from\",\"sender name\",\"sender lat\",\"sender long\",\"rx lat\",\"rx long\",\"rx elevation\",\"rx snr\",\"distance\",\"hop limit\",\"payload\"")
MayBeConst:AppPrefs.kt$AppPrefs.Companion$private val baseName = "appPrefs_"
MultiLineIfElse:BluetoothInterface.kt$BluetoothInterface$doDiscoverServicesAndInit()
- MultiLineIfElse:BluetoothInterface.kt$BluetoothInterface$s.asyncDiscoverServices { discRes -> try { discRes.getOrThrow() service.serviceScope.handledLaunch { try { debug("Discovered services!") delay(1000) // android BLE is buggy and needs a 500ms sleep before calling getChracteristic, or you might get back null /* if (isFirstTime) { isFirstTime = false throw BLEException("Faking a BLE failure") } */ fromNum = getCharacteristic(BTM_FROMNUM_CHARACTER) // We treat the first send by a client as special isFirstSend = true // Now tell clients they can (finally use the api) service.onConnect() // Immediately broadcast any queued packets sitting on the device doReadFromRadio(true) } catch (ex: BLEException) { scheduleReconnect( "Unexpected error in initial device enumeration, forcing disconnect $ex" ) } } } catch (ex: BLEException) { if (s.gatt == null) warn("GATT was closed while discovering, assume we are shutting down") else scheduleReconnect( "Unexpected error discovering services, forcing disconnect $ex" ) } }
- MultiLineIfElse:BluetoothInterface.kt$BluetoothInterface$safe?.asyncRequestMtu(512) { mtuRes -> try { mtuRes.getOrThrow() debug("MTU change attempted") // throw BLEException("Test MTU set failed") doDiscoverServicesAndInit() } catch (ex: BLEException) { shouldSetMtu = false scheduleReconnect( "Giving up on setting MTUs, forcing disconnect $ex" ) } }
+ MultiLineIfElse:BluetoothInterface.kt$BluetoothInterface$s.asyncDiscoverServices { discRes -> try { discRes.getOrThrow() service.serviceScope.handledLaunch { try { debug("Discovered services!") delay(1000) // android BLE is buggy and needs a 500ms sleep before calling getChracteristic, or you might get back null /* if (isFirstTime) { isFirstTime = false throw BLEException("Faking a BLE failure") } */ fromNum = getCharacteristic(BTM_FROMNUM_CHARACTER) // We treat the first send by a client as special isFirstSend = true // Now tell clients they can (finally use the api) service.onConnect() // Immediately broadcast any queued packets sitting on the device doReadFromRadio(true) } catch (ex: BLEException) { scheduleReconnect( "Unexpected error in initial device enumeration, forcing disconnect $ex" ) } } } catch (ex: BLEException) { if (s.gatt == null) warn("GATT was closed while discovering, assume we are shutting down") else scheduleReconnect( "Unexpected error discovering services, forcing disconnect $ex" ) } }
+ MultiLineIfElse:BluetoothInterface.kt$BluetoothInterface$safe?.asyncRequestMtu(512) { mtuRes -> try { mtuRes.getOrThrow() debug("MTU change attempted") // throw BLEException("Test MTU set failed") doDiscoverServicesAndInit() } catch (ex: BLEException) { shouldSetMtu = false scheduleReconnect( "Giving up on setting MTUs, forcing disconnect $ex" ) } }
MultiLineIfElse:BluetoothInterface.kt$BluetoothInterface$scheduleReconnect( "Unexpected error discovering services, forcing disconnect $ex" )
MultiLineIfElse:BluetoothInterface.kt$BluetoothInterface$startConnect()
MultiLineIfElse:BluetoothInterface.kt$BluetoothInterface$startWatchingFromNum()
@@ -441,15 +446,15 @@
MultiLineIfElse:BluetoothRepository.kt$BluetoothRepository$bondedDevices.filter { it.name?.matches(Regex(BLE_NAME_PATTERN)) == true }
MultiLineIfElse:BluetoothRepository.kt$BluetoothRepository$emptyList()
MultiLineIfElse:Channel.kt$Channel$"Custom"
- MultiLineIfElse:Channel.kt$Channel$when (loraConfig.modemPreset) { ModemPreset.SHORT_TURBO -> "ShortTurbo" ModemPreset.SHORT_FAST -> "ShortFast" ModemPreset.SHORT_SLOW -> "ShortSlow" ModemPreset.MEDIUM_FAST -> "MediumFast" ModemPreset.MEDIUM_SLOW -> "MediumSlow" ModemPreset.LONG_FAST -> "LongFast" ModemPreset.LONG_SLOW -> "LongSlow" ModemPreset.LONG_MODERATE -> "LongMod" ModemPreset.VERY_LONG_SLOW -> "VLongSlow" else -> "Invalid" }
- MultiLineIfElse:ChannelOption.kt$when (bandwidth) { 31 -> .03125f 62 -> .0625f 200 -> .203125f 400 -> .40625f 800 -> .8125f 1600 -> 1.6250f else -> bandwidth / 1000f }
- MultiLineIfElse:ContextServices.kt$MaterialAlertDialogBuilder(this) .setTitle(title) .setMessage(rationale) .setNeutralButton(R.string.cancel) { _, _ -> } .setPositiveButton(R.string.accept) { _, _ -> invokeFun() } .show()
+ MultiLineIfElse:Channel.kt$Channel$when (loraConfig.modemPreset) { ModemPreset.SHORT_TURBO -> "ShortTurbo" ModemPreset.SHORT_FAST -> "ShortFast" ModemPreset.SHORT_SLOW -> "ShortSlow" ModemPreset.MEDIUM_FAST -> "MediumFast" ModemPreset.MEDIUM_SLOW -> "MediumSlow" ModemPreset.LONG_FAST -> "LongFast" ModemPreset.LONG_SLOW -> "LongSlow" ModemPreset.LONG_MODERATE -> "LongMod" ModemPreset.VERY_LONG_SLOW -> "VLongSlow" else -> "Invalid" }
+ MultiLineIfElse:ChannelOption.kt$when (bandwidth) { 31 -> .03125f 62 -> .0625f 200 -> .203125f 400 -> .40625f 800 -> .8125f 1600 -> 1.6250f else -> bandwidth / 1000f }
+ MultiLineIfElse:ContextServices.kt$MaterialAlertDialogBuilder(this) .setTitle(title) .setMessage(rationale) .setNeutralButton(R.string.cancel) { _, _ -> } .setPositiveButton(R.string.accept) { _, _ -> invokeFun() } .show()
MultiLineIfElse:ContextServices.kt$invokeFun()
MultiLineIfElse:EditListPreference.kt$EditBase64Preference( title = "${index + 1}/$maxCount", value = value, enabled = enabled, keyboardActions = keyboardActions, onValueChange = { listState[index] = it as T onValuesChanged(listState) }, modifier = modifier.fillMaxWidth(), trailingIcon = trailingIcon, )
MultiLineIfElse:EditListPreference.kt$EditTextPreference( title = "${index + 1}/$maxCount", value = value, enabled = enabled, keyboardActions = keyboardActions, onValueChanged = { listState[index] = it as T onValuesChanged(listState) }, modifier = modifier.fillMaxWidth(), trailingIcon = trailingIcon, )
- MultiLineIfElse:EditTextPreference.kt$it.toDoubleOrNull()?.let { double -> valueState = it onValueChanged(double) }
- MultiLineIfElse:EditTextPreference.kt$it.toFloatOrNull()?.let { float -> valueState = it onValueChanged(float) }
- MultiLineIfElse:EditTextPreference.kt$it.toUIntOrNull()?.toInt()?.let { int -> valueState = it onValueChanged(int) }
+ MultiLineIfElse:EditTextPreference.kt$it.toDoubleOrNull()?.let { double -> valueState = it onValueChanged(double) }
+ MultiLineIfElse:EditTextPreference.kt$it.toFloatOrNull()?.let { float -> valueState = it onValueChanged(float) }
+ MultiLineIfElse:EditTextPreference.kt$it.toUIntOrNull()?.toInt()?.let { int -> valueState = it onValueChanged(int) }
MultiLineIfElse:EditTextPreference.kt$onValueChanged(it)
MultiLineIfElse:EditTextPreference.kt$valueState = it
MultiLineIfElse:Exceptions.kt$Exceptions.errormsg("ignoring exception", ex)
@@ -458,8 +463,8 @@
MultiLineIfElse:Logging.kt$Logging$printlog(Log.ERROR, tag(), "$msg")
MultiLineIfElse:MapViewWithLifecycle.kt$try { acquire() } catch (e: SecurityException) { errormsg("WakeLock permission exception: ${e.message}") } catch (e: IllegalStateException) { errormsg("WakeLock acquire() exception: ${e.message}") }
MultiLineIfElse:MapViewWithLifecycle.kt$try { release() } catch (e: IllegalStateException) { errormsg("WakeLock release() exception: ${e.message}") }
- MultiLineIfElse:MeshService.kt$MeshService$getDataPacketById(packetId)?.let { p -> if (p.status == m) return@handledLaunch packetRepository.get().updateMessageStatus(p, m) serviceBroadcasts.broadcastMessageStatus(packetId, m) }
- MultiLineIfElse:MeshService.kt$MeshService.<no name provided>$try { sendNow(p) } catch (ex: Exception) { errormsg("Error sending message, so enqueueing", ex) enqueueForSending(p) }
+ MultiLineIfElse:MeshService.kt$MeshService$getDataPacketById(packetId)?.let { p -> if (p.status == m) return@handledLaunch packetRepository.get().updateMessageStatus(p, m) serviceBroadcasts.broadcastMessageStatus(packetId, m) }
+ MultiLineIfElse:MeshService.kt$MeshService.<no name provided>$try { sendNow(p) } catch (ex: Exception) { errormsg("Error sending message, so enqueueing", ex) enqueueForSending(p) }
MultiLineIfElse:NOAAWmsTileSource.kt$NOAAWmsTileSource$sb.append("service=WMS")
MultiLineIfElse:NodeInfo.kt$MeshUser$hwModel.name.replace('_', '-').replace('p', '.').lowercase()
MultiLineIfElse:NodeInfo.kt$MeshUser$null
@@ -470,16 +475,16 @@
MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth$startNewWork()
MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth$throw AssertionError("currentWork was not null: $currentWork")
MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth$warn("wor completed, but we already killed it via failsafetimer? status=$status, res=$res")
- MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth$work.completion.resume(Result.success(res) as Result<Nothing>)
+ MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth$work.completion.resume(Result.success(res) as Result<Nothing>)
MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth$work.completion.resumeWithException( BLEStatusException( status, "Bluetooth status=$status while doing ${work.tag}" ) )
- MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth.<no name provided>$completeWork(status, Unit)
- MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth.<no name provided>$completeWork(status, characteristic)
- MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth.<no name provided>$dropAndReconnect()
- MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth.<no name provided>$errormsg("Ignoring bogus onMtuChanged")
- MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth.<no name provided>$if (!characteristic.value.contentEquals(reliable)) { errormsg("A reliable write failed!") gatt.abortReliableWrite() completeWork( STATUS_RELIABLE_WRITE_FAILED, characteristic ) // skanky code to indicate failure } else { logAssert(gatt.executeReliableWrite()) // After this execute reliable completes - we can continue with normal operations (see onReliableWriteCompleted) }
- MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth.<no name provided>$lostConnection("lost connection")
- MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth.<no name provided>$warn("Received notification from $characteristic, but no handler registered")
- NestedBlockDepth:LanguageUtils.kt$LanguageUtils$fun getLanguageTags(context: Context): Map<String, String>
+ MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth.<no name provided>$completeWork(status, Unit)
+ MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth.<no name provided>$completeWork(status, characteristic)
+ MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth.<no name provided>$dropAndReconnect()
+ MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth.<no name provided>$errormsg("Ignoring bogus onMtuChanged")
+ MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth.<no name provided>$if (!characteristic.value.contentEquals(reliable)) { errormsg("A reliable write failed!") gatt.abortReliableWrite() completeWork( STATUS_RELIABLE_WRITE_FAILED, characteristic ) // skanky code to indicate failure } else { logAssert(gatt.executeReliableWrite()) // After this execute reliable completes - we can continue with normal operations (see onReliableWriteCompleted) }
+ MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth.<no name provided>$lostConnection("lost connection")
+ MultiLineIfElse:SafeBluetooth.kt$SafeBluetooth.<no name provided>$warn("Received notification from $characteristic, but no handler registered")
+ NestedBlockDepth:LanguageUtils.kt$LanguageUtils$fun getLanguageTags(context: Context): Map<String, String>
NestedBlockDepth:MainActivity.kt$MainActivity$private fun onMeshConnectionChanged(newConnection: MeshService.ConnectionState)
NestedBlockDepth:MeshService.kt$MeshService$private fun handleReceivedAdmin(fromNodeNum: Int, a: AdminProtos.AdminMessage)
NestedBlockDepth:MeshService.kt$MeshService$private fun handleReceivedData(packet: MeshPacket)
@@ -495,13 +500,11 @@
NewLineAtEndOfFile:CoroutineDispatchers.kt$com.geeksville.mesh.CoroutineDispatchers.kt
NewLineAtEndOfFile:Coroutines.kt$com.geeksville.mesh.concurrent.Coroutines.kt
NewLineAtEndOfFile:CustomTileSource.kt$com.geeksville.mesh.model.map.CustomTileSource.kt
- NewLineAtEndOfFile:DatabaseModule.kt$com.geeksville.mesh.database.DatabaseModule.kt
NewLineAtEndOfFile:DateUtils.kt$com.geeksville.mesh.android.DateUtils.kt
NewLineAtEndOfFile:DebugLogFile.kt$com.geeksville.mesh.android.DebugLogFile.kt
NewLineAtEndOfFile:DeferredExecution.kt$com.geeksville.mesh.concurrent.DeferredExecution.kt
NewLineAtEndOfFile:DeviceVersion.kt$com.geeksville.mesh.model.DeviceVersion.kt
NewLineAtEndOfFile:DeviceVersionTest.kt$com.geeksville.mesh.model.DeviceVersionTest.kt
- NewLineAtEndOfFile:ElevationInfo.kt$com.geeksville.mesh.ui.compose.ElevationInfo.kt
NewLineAtEndOfFile:ExpireChecker.kt$com.geeksville.mesh.android.ExpireChecker.kt
NewLineAtEndOfFile:InterfaceId.kt$com.geeksville.mesh.repository.radio.InterfaceId.kt
NewLineAtEndOfFile:InterfaceSpec.kt$com.geeksville.mesh.repository.radio.InterfaceSpec.kt
@@ -511,14 +514,12 @@
NewLineAtEndOfFile:NopInterface.kt$com.geeksville.mesh.repository.radio.NopInterface.kt
NewLineAtEndOfFile:NopInterfaceFactory.kt$com.geeksville.mesh.repository.radio.NopInterfaceFactory.kt
NewLineAtEndOfFile:OnlineTileSourceAuth.kt$com.geeksville.mesh.model.map.OnlineTileSourceAuth.kt
- NewLineAtEndOfFile:PreviewParameterProviders.kt$com.geeksville.mesh.ui.preview.PreviewParameterProviders.kt
NewLineAtEndOfFile:ProbeTableProvider.kt$com.geeksville.mesh.repository.usb.ProbeTableProvider.kt
NewLineAtEndOfFile:QuickChatActionRepository.kt$com.geeksville.mesh.database.QuickChatActionRepository.kt
NewLineAtEndOfFile:RadioNotConnectedException.kt$com.geeksville.mesh.service.RadioNotConnectedException.kt
NewLineAtEndOfFile:RadioRepositoryModule.kt$com.geeksville.mesh.repository.radio.RadioRepositoryModule.kt
- NewLineAtEndOfFile:RegularPreference.kt$com.geeksville.mesh.ui.components.RegularPreference.kt
+ NewLineAtEndOfFile:RegularPreference.kt$com.geeksville.mesh.ui.common.components.RegularPreference.kt
NewLineAtEndOfFile:SafeBluetooth.kt$com.geeksville.mesh.service.SafeBluetooth.kt
- NewLineAtEndOfFile:SatelliteCountInfo.kt$com.geeksville.mesh.ui.compose.SatelliteCountInfo.kt
NewLineAtEndOfFile:SerialConnection.kt$com.geeksville.mesh.repository.usb.SerialConnection.kt
NewLineAtEndOfFile:SerialConnectionListener.kt$com.geeksville.mesh.repository.usb.SerialConnectionListener.kt
NewLineAtEndOfFile:SerialInterface.kt$com.geeksville.mesh.repository.radio.SerialInterface.kt
@@ -534,7 +535,6 @@
NoBlankLineBeforeRbrace:NopInterface.kt$NopInterface$
NoBlankLineBeforeRbrace:OnlineTileSourceAuth.kt$OnlineTileSourceAuth$
NoBlankLineBeforeRbrace:PositionTest.kt$PositionTest$
- NoBlankLineBeforeRbrace:PreviewParameterProviders.kt$NodeInfoPreviewParameterProvider$
NoConsecutiveBlankLines:AppIntroduction.kt$AppIntroduction$
NoConsecutiveBlankLines:AppPrefs.kt$
NoConsecutiveBlankLines:BluetoothInterface.kt$
@@ -549,7 +549,6 @@
NoConsecutiveBlankLines:IRadioInterface.kt$
NoConsecutiveBlankLines:NOAAWmsTileSource.kt$NOAAWmsTileSource$
NoConsecutiveBlankLines:NodeInfo.kt$
- NoConsecutiveBlankLines:PreviewParameterProviders.kt$
NoConsecutiveBlankLines:SafeBluetooth.kt$
NoConsecutiveBlankLines:SafeBluetooth.kt$SafeBluetooth$
NoConsecutiveBlankLines:SqlTileWriterExt.kt$
@@ -563,16 +562,15 @@
NoWildcardImports:SafeBluetooth.kt$import kotlinx.coroutines.*
NoWildcardImports:UsbRepository.kt$import kotlinx.coroutines.flow.*
OptionalAbstractKeyword:SyncContinuation.kt$Continuation$abstract
- ParameterListWrapping:AppPrefs.kt$FloatPref$(thisRef: AppPrefs, prop: KProperty<Float>)
- ParameterListWrapping:AppPrefs.kt$StringPref$(thisRef: AppPrefs, prop: KProperty<String>)
- ParameterListWrapping:SafeBluetooth.kt$SafeBluetooth$( c: BluetoothGattCharacteristic, cont: Continuation<BluetoothGattCharacteristic>, timeout: Long = 0 )
- ParameterListWrapping:SafeBluetooth.kt$SafeBluetooth$( c: BluetoothGattCharacteristic, cont: Continuation<Unit>, timeout: Long = 0 )
- ParameterListWrapping:SafeBluetooth.kt$SafeBluetooth$( c: BluetoothGattCharacteristic, v: ByteArray, cont: Continuation<BluetoothGattCharacteristic>, timeout: Long = 0 )
- ParameterListWrapping:SafeBluetooth.kt$SafeBluetooth$( c: BluetoothGattDescriptor, cont: Continuation<BluetoothGattDescriptor>, timeout: Long = 0 )
+ ParameterListWrapping:AppPrefs.kt$FloatPref$(thisRef: AppPrefs, prop: KProperty<Float>)
+ ParameterListWrapping:AppPrefs.kt$StringPref$(thisRef: AppPrefs, prop: KProperty<String>)
+ ParameterListWrapping:SafeBluetooth.kt$SafeBluetooth$( c: BluetoothGattCharacteristic, cont: Continuation<BluetoothGattCharacteristic>, timeout: Long = 0 )
+ ParameterListWrapping:SafeBluetooth.kt$SafeBluetooth$( c: BluetoothGattCharacteristic, cont: Continuation<Unit>, timeout: Long = 0 )
+ ParameterListWrapping:SafeBluetooth.kt$SafeBluetooth$( c: BluetoothGattCharacteristic, v: ByteArray, cont: Continuation<BluetoothGattCharacteristic>, timeout: Long = 0 )
+ ParameterListWrapping:SafeBluetooth.kt$SafeBluetooth$( c: BluetoothGattDescriptor, cont: Continuation<BluetoothGattDescriptor>, timeout: Long = 0 )
RethrowCaughtException:SyncContinuation.kt$Continuation$throw ex
ReturnCount:ChannelOption.kt$internal fun LoRaConfig.radioFreq(channelNum: Int): Float
ReturnCount:RadioConfigViewModel.kt$RadioConfigViewModel$private fun processPacketResponse(packet: MeshProtos.MeshPacket)
- SpacingAroundColon:PreviewParameterProviders.kt$NodeInfoPreviewParameterProvider$:
SpacingAroundCurly:AppPrefs.kt$FloatPref$}
SpacingAroundKeyword:AppPrefs.kt$AppPrefs$if
SpacingAroundKeyword:Exceptions.kt$if
@@ -609,7 +607,7 @@
TooGenericExceptionCaught:MapView.kt$ex: Exception
TooGenericExceptionCaught:MeshService.kt$MeshService$e: Exception
TooGenericExceptionCaught:MeshService.kt$MeshService$ex: Exception
- TooGenericExceptionCaught:MeshService.kt$MeshService.<no name provided>$ex: Exception
+ TooGenericExceptionCaught:MeshService.kt$MeshService.<no name provided>$ex: Exception
TooGenericExceptionCaught:MeshServiceStarter.kt$ServiceStarter$ex: Exception
TooGenericExceptionCaught:RadioConfigViewModel.kt$RadioConfigViewModel$ex: Exception
TooGenericExceptionCaught:SafeBluetooth.kt$SafeBluetooth$ex: Exception
@@ -619,18 +617,20 @@
TooGenericExceptionCaught:TCPInterface.kt$TCPInterface$ex: Throwable
TooGenericExceptionThrown:DeviceVersion.kt$DeviceVersion$throw Exception("Can't parse version $s")
TooGenericExceptionThrown:MeshService.kt$MeshService$throw Exception("Can't set user without a NodeInfo")
- TooGenericExceptionThrown:MeshService.kt$MeshService.<no name provided>$throw Exception("Port numbers must be non-zero!")
+ TooGenericExceptionThrown:MeshService.kt$MeshService.<no name provided>$throw Exception("Port numbers must be non-zero!")
TooGenericExceptionThrown:ServiceClient.kt$ServiceClient$throw Exception("Haven't called connect")
TooGenericExceptionThrown:ServiceClient.kt$ServiceClient$throw Exception("Service not bound")
TooGenericExceptionThrown:SyncContinuation.kt$SyncContinuation$throw Exception("SyncContinuation timeout")
TooGenericExceptionThrown:SyncContinuation.kt$SyncContinuation$throw Exception("This shouldn't happen")
TooManyFunctions:AppPrefs.kt$AppPrefs
TooManyFunctions:BluetoothInterface.kt$BluetoothInterface : IRadioInterfaceLogging
+ TooManyFunctions:ContactSharing.kt$com.geeksville.mesh.ui.sharing.ContactSharing.kt
TooManyFunctions:ContextServices.kt$com.geeksville.mesh.android.ContextServices.kt
TooManyFunctions:LocationUtils.kt$com.geeksville.mesh.util.LocationUtils.kt
TooManyFunctions:MainActivity.kt$MainActivity : AppCompatActivityLogging
TooManyFunctions:MeshService.kt$MeshService : ServiceLogging
- TooManyFunctions:MeshService.kt$MeshService$<no name provided> : Stub
+ TooManyFunctions:MeshService.kt$MeshService$<no name provided> : Stub
+ TooManyFunctions:NodeDetail.kt$com.geeksville.mesh.ui.node.NodeDetail.kt
TooManyFunctions:PacketDao.kt$PacketDao
TooManyFunctions:PacketRepository.kt$PacketRepository
TooManyFunctions:RadioConfigRepository.kt$RadioConfigRepository
diff --git a/network/build.gradle.kts b/network/build.gradle.kts
index 3f0f4343b..f07f330c4 100644
--- a/network/build.gradle.kts
+++ b/network/build.gradle.kts
@@ -1,3 +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 .
+ */
+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
@@ -52,5 +69,5 @@ dependencies {
detekt {
config.setFrom("../config/detekt/detekt.yml")
- baseline = file("../config/detekt/detekt-baseline.xml")
+ baseline = file("../config/detekt/detekt-baseline-network.xml")
}