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") }