From c5360086b782e4357a1aa1298fc3e91ffb31de6f Mon Sep 17 00:00:00 2001
From: Phil Oliver <3497406+poliver@users.noreply.github.com>
Date: Thu, 25 Sep 2025 17:01:53 -0400
Subject: [PATCH] Add `:core:ui` (#3203)
---
app/build.gradle.kts | 1 +
app/detekt-baseline.xml | 123 ---------
.../ui/map/components/EditWaypointDialog.kt | 4 +-
.../mesh/ui/map/components/MapButton.kt | 2 +-
.../ui/map/components/MapControlsOverlay.kt | 2 +-
.../java/com/geeksville/mesh/MainActivity.kt | 4 +-
.../mesh/model/EnvironmentMetricsState.kt | 18 +-
.../main/java/com/geeksville/mesh/ui/Main.kt | 18 +-
.../common/components/EditListPreference.kt | 1 +
.../mesh/ui/common/components/EmojiPicker.kt | 1 +
.../mesh/ui/common/components/MainAppBar.kt | 2 +-
.../components/PositionPrecisionPreference.kt | 1 +
.../mesh/ui/common/components/SecurityIcon.kt | 6 +-
.../mesh/ui/common/components/SignalInfo.kt | 3 +-
.../mesh/ui/connections/ConnectionsScreen.kt | 2 +-
.../ui/connections/components/BLEDevices.kt | 2 +-
.../components/ConnectionsSegmentedBar.kt | 2 +-
.../components/CurrentlyConnectedInfo.kt | 6 +-
.../components/EmptyStateContent.kt | 2 +-
.../connections/components/NetworkDevices.kt | 4 +-
.../connections/components/TopLevelNavIcon.kt | 14 +-
.../ui/connections/components/UsbDevices.kt | 4 +-
.../geeksville/mesh/ui/contact/ContactItem.kt | 2 +-
.../com/geeksville/mesh/ui/debug/Debug.kt | 9 +-
.../geeksville/mesh/ui/debug/DebugSearch.kt | 2 +-
.../com/geeksville/mesh/ui/message/Message.kt | 2 +-
.../geeksville/mesh/ui/message/QuickChat.kt | 8 +-
.../mesh/ui/message/components/MessageItem.kt | 10 +-
.../mesh/ui/message/components/Reaction.kt | 4 +-
.../mesh/ui/metrics/DeviceMetrics.kt | 15 +-
.../mesh/ui/metrics/EnvironmentMetrics.kt | 8 +-
.../mesh/ui/metrics/HostMetricsLog.kt | 2 +-
.../geeksville/mesh/ui/metrics/PaxMetrics.kt | 4 +-
.../geeksville/mesh/ui/metrics/PositionLog.kt | 2 +-
.../mesh/ui/metrics/PowerMetrics.kt | 8 +-
.../mesh/ui/metrics/SignalMetrics.kt | 8 +-
.../mesh/ui/metrics/TracerouteLog.kt | 4 +-
.../com/geeksville/mesh/ui/node/NodeDetail.kt | 12 +-
.../com/geeksville/mesh/ui/node/NodeScreen.kt | 2 +-
.../mesh/ui/node/components/LastHeardInfo.kt | 2 +-
.../ui/node/components/LinkedCoordinates.kt | 4 +-
.../ui/node/components/NodeFilterTextField.kt | 2 +-
.../mesh/ui/node/components/NodeItem.kt | 4 +-
.../ui/node/components/NodeKeyStatusIcon.kt | 10 +-
.../mesh/ui/node/components/NodeMenu.kt | 2 +-
.../ui/node/components/NodeStatusIcons.kt | 6 +-
.../ui/node/components/SatelliteCountInfo.kt | 15 +-
.../ui/node/components/TracerouteButton.kt | 2 +-
.../mesh/ui/settings/SettingsScreen.kt | 6 +-
.../ui/settings/components/SettingsItem.kt | 2 +-
.../mesh/ui/settings/radio/RadioConfig.kt | 6 +-
.../AmbientLightingConfigItemList.kt | 6 +-
.../radio/components/AudioConfigItemList.kt | 6 +-
.../components/BluetoothConfigItemList.kt | 6 +-
.../components/CannedMessageConfigItemList.kt | 6 +-
.../components/ChannelSettingsItemList.kt | 10 +-
.../DetectionSensorConfigItemList.kt | 6 +-
.../radio/components/DeviceConfigItemList.kt | 6 +-
.../radio/components/DisplayConfigItemList.kt | 6 +-
.../radio/components/EditChannelDialog.kt | 4 +-
.../components/EditDeviceProfileDialog.kt | 2 +-
.../ExternalNotificationConfigItemList.kt | 8 +-
.../radio/components/LoRaConfigItemList.kt | 8 +-
.../radio/components/MQTTConfigItemList.kt | 8 +-
.../components/MapReportingPreference.kt | 4 +-
.../components/NeighborInfoConfigItemList.kt | 6 +-
.../radio/components/NetworkConfigItemList.kt | 12 +-
.../components/PaxcounterConfigItemList.kt | 8 +-
.../components/PositionConfigItemList.kt | 8 +-
.../radio/components/PowerConfigItemList.kt | 6 +-
.../radio/components/RadioConfigScreenList.kt | 2 +-
.../components/RangeTestConfigItemList.kt | 6 +-
.../RemoteHardwareConfigItemList.kt | 4 +-
.../components/SecurityConfigItemList.kt | 6 +-
.../radio/components/SerialConfigItemList.kt | 6 +-
.../components/StoreForwardConfigItemList.kt | 6 +-
.../components/TelemetryConfigItemList.kt | 6 +-
.../radio/components/UserConfigItemList.kt | 8 +-
.../radio/components/WarningDialog.kt | 2 +-
.../com/geeksville/mesh/ui/sharing/Channel.kt | 4 +-
.../mesh/ui/sharing/ContactSharing.kt | 4 +-
.../com/geeksville/mesh/ui/sharing/Share.kt | 2 +-
core/ui/build.gradle.kts | 28 ++
core/ui/detekt-baseline.xml | 57 ++++
.../core/ui/component}/AdaptiveTwoPane.kt | 32 +--
.../core/ui/component}/AlertDialogs.kt | 2 +-
.../core/ui/component}/BatteryInfo.kt | 6 +-
.../core/ui/component}/BitwisePreference.kt | 2 +-
.../core/ui/component}/BottomSheetDialog.kt | 24 +-
.../core/ui/component}/ClickableTextField.kt | 2 +-
.../core/ui/component}/CopyIconButton.kt | 2 +-
.../core/ui/component}/EditIPv4Preference.kt | 25 +-
.../ui/component}/EditPasswordPreference.kt | 2 +-
.../core/ui/component}/EditTextPreference.kt | 2 +-
.../core/ui/component}/IndoorAirQuality.kt | 18 +-
.../component}/LazyColumnDragAndDropDemo.kt | 139 +++++-----
.../core/ui/component}/LoraSignalIndicator.kt | 10 +-
.../meshtastic/core/ui/component}/MDText.kt | 4 +-
.../core/ui/component}/MaterialBatteryInfo.kt | 20 +-
.../core/ui/component}/PreferenceCategory.kt | 20 +-
.../core/ui/component}/PreferenceFooter.kt | 2 +-
.../core/ui/component}/RegularPreference.kt | 57 ++--
.../core/ui/component}/SimpleAlertDialog.kt | 4 +-
.../core/ui/component}/SlidingSelector.kt | 255 ++++++++----------
.../core/ui/component}/SwitchPreference.kt | 2 +-
.../ui/component}/TextDividerPreference.kt | 23 +-
.../ui/component}/TimeTickWithLifecycle.kt | 10 +-
.../core/ui/component}/TitledCard.kt | 4 +-
.../org/meshtastic/core/ui/icon}/Battery.kt | 2 +-
.../org/meshtastic/core/ui/icon}/Device.kt | 2 +-
.../org/meshtastic/core/ui/icon}/Map.kt | 2 +-
.../core/ui/icon}/MeshtasticIcons.kt | 2 +-
.../org/meshtastic/core/ui/icon}/Messages.kt | 2 +-
.../org/meshtastic/core/ui/icon}/NoDevice.kt | 2 +-
.../org/meshtastic/core/ui/icon}/Nodes.kt | 2 +-
.../org/meshtastic/core/ui/icon}/Settings.kt | 2 +-
.../org/meshtastic/core/ui}/theme/Color.kt | 2 +-
.../meshtastic/core/ui}/theme/CustomColors.kt | 2 +-
.../org/meshtastic/core/ui}/theme/Theme.kt | 2 +-
.../org/meshtastic/core/ui}/theme/Type.kt | 2 +-
.../main/res/drawable/ic_battery_alert.xml | 0
.../src/main/res/drawable/ic_battery_high.xml | 0
.../src/main/res/drawable/ic_battery_low.xml | 0
.../main/res/drawable/ic_battery_medium.xml | 0
.../main/res/drawable/ic_battery_outline.xml | 0
.../main/res/drawable/ic_battery_unknown.xml | 0
.../main/res/drawable/ic_power_plug_24.xml | 0
settings.gradle.kts | 1 +
128 files changed, 594 insertions(+), 750 deletions(-)
create mode 100644 core/ui/build.gradle.kts
create mode 100644 core/ui/detekt-baseline.xml
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/AdaptiveTwoPane.kt (71%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/AlertDialogs.kt (98%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/BatteryInfo.kt (96%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/BitwisePreference.kt (98%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/BottomSheetDialog.kt (85%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/ClickableTextField.kt (97%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/CopyIconButton.kt (97%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/EditIPv4Preference.kt (79%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/EditPasswordPreference.kt (98%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/EditTextPreference.kt (99%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/IndoorAirQuality.kt (95%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/LazyColumnDragAndDropDemo.kt (71%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/LoraSignalIndicator.kt (94%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/MDText.kt (97%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/MaterialBatteryInfo.kt (86%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/PreferenceCategory.kt (80%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/PreferenceFooter.kt (98%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/RegularPreference.kt (71%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/SimpleAlertDialog.kt (97%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/SlidingSelector.kt (64%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/SwitchPreference.kt (98%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/TextDividerPreference.kt (81%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/TimeTickWithLifecycle.kt (90%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/components => core/ui/src/main/kotlin/org/meshtastic/core/ui/component}/TitledCard.kt (95%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/icons => core/ui/src/main/kotlin/org/meshtastic/core/ui/icon}/Battery.kt (99%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/icons => core/ui/src/main/kotlin/org/meshtastic/core/ui/icon}/Device.kt (99%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/icons => core/ui/src/main/kotlin/org/meshtastic/core/ui/icon}/Map.kt (99%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/icons => core/ui/src/main/kotlin/org/meshtastic/core/ui/icon}/MeshtasticIcons.kt (94%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/icons => core/ui/src/main/kotlin/org/meshtastic/core/ui/icon}/Messages.kt (98%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/icons => core/ui/src/main/kotlin/org/meshtastic/core/ui/icon}/NoDevice.kt (99%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/icons => core/ui/src/main/kotlin/org/meshtastic/core/ui/icon}/Nodes.kt (99%)
rename {app/src/main/java/com/geeksville/mesh/ui/common/icons => core/ui/src/main/kotlin/org/meshtastic/core/ui/icon}/Settings.kt (99%)
rename {app/src/main/java/com/geeksville/mesh/ui/common => core/ui/src/main/kotlin/org/meshtastic/core/ui}/theme/Color.kt (99%)
rename {app/src/main/java/com/geeksville/mesh/ui/common => core/ui/src/main/kotlin/org/meshtastic/core/ui}/theme/CustomColors.kt (98%)
rename {app/src/main/java/com/geeksville/mesh/ui/common => core/ui/src/main/kotlin/org/meshtastic/core/ui}/theme/Theme.kt (99%)
rename {app/src/main/java/com/geeksville/mesh/ui/common => core/ui/src/main/kotlin/org/meshtastic/core/ui}/theme/Type.kt (94%)
rename {app => core/ui}/src/main/res/drawable/ic_battery_alert.xml (100%)
rename {app => core/ui}/src/main/res/drawable/ic_battery_high.xml (100%)
rename {app => core/ui}/src/main/res/drawable/ic_battery_low.xml (100%)
rename {app => core/ui}/src/main/res/drawable/ic_battery_medium.xml (100%)
rename {app => core/ui}/src/main/res/drawable/ic_battery_outline.xml (100%)
rename {app => core/ui}/src/main/res/drawable/ic_battery_unknown.xml (100%)
rename {app => core/ui}/src/main/res/drawable/ic_power_plug_24.xml (100%)
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index a91321d46..c7cf64084 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -185,6 +185,7 @@ dependencies {
implementation(projects.core.prefs)
implementation(projects.core.proto)
implementation(projects.core.strings)
+ implementation(projects.core.ui)
implementation(projects.feature.map)
// Bundles
diff --git a/app/detekt-baseline.xml b/app/detekt-baseline.xml
index 31605b0d9..36e1c68ec 100644
--- a/app/detekt-baseline.xml
+++ b/app/detekt-baseline.xml
@@ -12,8 +12,6 @@
CommentSpacing:Exceptions.kt$Exceptions$/// Set in Application.onCreate
CommentWrapping:SignalMetrics.kt$Metric.SNR$/* Selected 12 as the max to get 4 equal vertical sections. */
ComposableNaming:NodeDetail.kt$notesSection
- ComposableParamOrder:AlertDialogs.kt$SimpleAlertDialog
- ComposableParamOrder:BatteryInfo.kt$BatteryInfo
ComposableParamOrder:ChannelSettingsItemList.kt$ChannelSettingsItemList
ComposableParamOrder:Debug.kt$DebugMenuActions
ComposableParamOrder:Debug.kt$DecodedPayloadBlock
@@ -21,7 +19,6 @@
ComposableParamOrder:DebugSearch.kt$DebugSearchStateviewModelDefaults
ComposableParamOrder:DeviceMetrics.kt$DeviceMetricsChart
ComposableParamOrder:EditBase64Preference.kt$EditBase64Preference
- ComposableParamOrder:EditTextPreference.kt$EditTextPreference
ComposableParamOrder:ElevationInfo.kt$ElevationInfo
ComposableParamOrder:EmptyStateContent.kt$EmptyStateContent
ComposableParamOrder:EnvironmentCharts.kt$ChartContent
@@ -33,7 +30,6 @@
ComposableParamOrder:LinkedCoordinates.kt$LinkedCoordinates
ComposableParamOrder:MainAppBar.kt$MainAppBar
ComposableParamOrder:MapReportingPreference.kt$MapReportingPreference
- ComposableParamOrder:MaterialBatteryInfo.kt$MaterialBatteryInfo
ComposableParamOrder:Message.kt$MessageScreen
ComposableParamOrder:Message.kt$QuickChatRow
ComposableParamOrder:MessageActions.kt$MessageActions
@@ -59,23 +55,13 @@
ComposableParamOrder:SettingsItem.kt$SettingsItem
ComposableParamOrder:SignalInfo.kt$SignalInfo
ComposableParamOrder:SignalMetrics.kt$SignalMetricsChart
- ComposableParamOrder:SwitchPreference.kt$SwitchPreference
ComposableParamOrder:TopLevelNavIcon.kt$ConnectionsNavIcon
ComposableParamOrder:TracerouteButton.kt$TracerouteButton
ComposableParamOrder:WarningDialog.kt$WarningDialog
- ConstructorParameterNaming:MeshLog.kt$MeshLog$@ColumnInfo(name = "message") val raw_message: String
- ConstructorParameterNaming:MeshLog.kt$MeshLog$@ColumnInfo(name = "received_date") val received_date: Long
- ConstructorParameterNaming:MeshLog.kt$MeshLog$@ColumnInfo(name = "type") val message_type: String
- ConstructorParameterNaming:Packet.kt$ContactSettings$@PrimaryKey val contact_key: String
- ConstructorParameterNaming:Packet.kt$Packet$@ColumnInfo(name = "contact_key") val contact_key: String
- ConstructorParameterNaming:Packet.kt$Packet$@ColumnInfo(name = "port_num") val port_num: Int
- ConstructorParameterNaming:Packet.kt$Packet$@ColumnInfo(name = "received_time") val received_time: Long
- ContentSlotReused:AdaptiveTwoPane.kt$second
CyclomaticComplexMethod:MeshService.kt$MeshService$private fun handleReceivedData(packet: MeshPacket)
CyclomaticComplexMethod:NetworkConfigItemList.kt$@Composable fun NetworkConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel())
CyclomaticComplexMethod:PositionConfigItemList.kt$@OptIn(ExperimentalPermissionsApi::class) @Composable fun PositionConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel())
CyclomaticComplexMethod:RadioConfigViewModel.kt$RadioConfigViewModel$private fun processPacketResponse(packet: MeshProtos.MeshPacket)
- EmptyCatchBlock:MeshLog.kt$MeshLog${ }
EmptyClassBlock:DebugLogFile.kt$BinaryLogFile${ }
EmptyFunctionBlock:NopInterface.kt$NopInterface${ }
EmptyFunctionBlock:NsdManager.kt$<no name provided>${ }
@@ -89,16 +75,13 @@
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:InterfaceId.kt$com.geeksville.mesh.repository.radio.InterfaceId.kt
FinalNewline:InterfaceSpec.kt$com.geeksville.mesh.repository.radio.InterfaceSpec.kt
FinalNewline:MockInterfaceFactory.kt$com.geeksville.mesh.repository.radio.MockInterfaceFactory.kt
FinalNewline:NopInterface.kt$com.geeksville.mesh.repository.radio.NopInterface.kt
FinalNewline:NopInterfaceFactory.kt$com.geeksville.mesh.repository.radio.NopInterfaceFactory.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:RegularPreference.kt$com.geeksville.mesh.ui.common.components.RegularPreference.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
@@ -107,9 +90,6 @@
FinalNewline:UsbBroadcastReceiver.kt$com.geeksville.mesh.repository.usb.UsbBroadcastReceiver.kt
FinalNewline:UsbRepositoryModule.kt$com.geeksville.mesh.repository.usb.UsbRepositoryModule.kt
ForbiddenComment:SafeBluetooth.kt$SafeBluetooth$// TODO: display some kind of UI about restarting BLE
- FunctionNaming:PacketDao.kt$PacketDao$@Query("DELETE FROM packet WHERE uuid=:uuid") suspend fun _delete(uuid: Long)
- FunctionNaming:QuickChatActionDao.kt$QuickChatActionDao$@Query("Delete from quick_chat where uuid=:uuid") fun _delete(uuid: Long)
- ImplicitDefaultLocale:NodeInfo.kt$NodeInfo$String.format("%d%%", batteryLevel)
LambdaParameterEventTrailing:Channel.kt$onConfirm
LambdaParameterEventTrailing:MainAppBar.kt$onAction
LambdaParameterEventTrailing:Message.kt$onClick
@@ -139,16 +119,6 @@
LongMethod:StoreForwardConfigItemList.kt$@Composable fun StoreForwardConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel())
LongMethod:TelemetryConfigItemList.kt$@Composable fun TelemetryConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel())
LongMethod:UserConfigItemList.kt$@Composable fun UserConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel())
- MagicNumber:BatteryInfo.kt$100
- MagicNumber:BatteryInfo.kt$101
- MagicNumber:BatteryInfo.kt$14
- MagicNumber:BatteryInfo.kt$15
- MagicNumber:BatteryInfo.kt$34
- MagicNumber:BatteryInfo.kt$35
- MagicNumber:BatteryInfo.kt$4
- MagicNumber:BatteryInfo.kt$5
- MagicNumber:BatteryInfo.kt$79
- MagicNumber:BatteryInfo.kt$80
MagicNumber:BluetoothInterface.kt$BluetoothInterface$1000
MagicNumber:BluetoothInterface.kt$BluetoothInterface$500
MagicNumber:BluetoothInterface.kt$BluetoothInterface$512
@@ -156,30 +126,15 @@
MagicNumber:ChannelSet.kt$960
MagicNumber:Contacts.kt$7
MagicNumber:Contacts.kt$8
- MagicNumber:DataPacket.kt$DataPacket.CREATOR$16
MagicNumber:Debug.kt$3
- MagicNumber:DeviceVersion.kt$DeviceVersion$100
- MagicNumber:DeviceVersion.kt$DeviceVersion$10000
MagicNumber:EditChannelDialog.kt$16
MagicNumber:EditChannelDialog.kt$32
- MagicNumber:EditIPv4Preference.kt$0xff
- MagicNumber:EditIPv4Preference.kt$16
- MagicNumber:EditIPv4Preference.kt$24
- MagicNumber:EditIPv4Preference.kt$8
MagicNumber:EditListPreference.kt$12
MagicNumber:EditListPreference.kt$12345
MagicNumber:EditListPreference.kt$67890
- MagicNumber:Extensions.kt$1000
- MagicNumber:Extensions.kt$1440000
- MagicNumber:Extensions.kt$24
- MagicNumber:Extensions.kt$2880
- MagicNumber:Extensions.kt$60
- MagicNumber:LazyColumnDragAndDropDemo.kt$50
MagicNumber:LocationRepository.kt$LocationRepository$1000L
MagicNumber:LocationRepository.kt$LocationRepository$30
MagicNumber:LocationRepository.kt$LocationRepository$31
- MagicNumber:LocationUtils.kt$1e-7
- MagicNumber:LocationUtils.kt$360
MagicNumber:MQTTRepository.kt$MQTTRepository$512
MagicNumber:MeshService.kt$MeshService$0xffffffff
MagicNumber:MeshService.kt$MeshService$1000
@@ -193,28 +148,6 @@
MagicNumber:MetricsViewModel.kt$MetricsViewModel$1000L
MagicNumber:MetricsViewModel.kt$MetricsViewModel$1e-5
MagicNumber:MetricsViewModel.kt$MetricsViewModel$1e-7
- MagicNumber:NodeInfo.kt$DeviceMetrics.Companion$1000
- MagicNumber:NodeInfo.kt$EnvironmentMetrics.Companion$1000
- MagicNumber:NodeInfo.kt$NodeInfo$0.114
- MagicNumber:NodeInfo.kt$NodeInfo$0.299
- MagicNumber:NodeInfo.kt$NodeInfo$0.587
- MagicNumber:NodeInfo.kt$NodeInfo$0x0000FF
- MagicNumber:NodeInfo.kt$NodeInfo$0x00FF00
- MagicNumber:NodeInfo.kt$NodeInfo$0xFF0000
- MagicNumber:NodeInfo.kt$NodeInfo$1000
- MagicNumber:NodeInfo.kt$NodeInfo$1000.0
- MagicNumber:NodeInfo.kt$NodeInfo$16
- MagicNumber:NodeInfo.kt$NodeInfo$1609
- MagicNumber:NodeInfo.kt$NodeInfo$1609.34
- MagicNumber:NodeInfo.kt$NodeInfo$255
- MagicNumber:NodeInfo.kt$NodeInfo$3.281
- MagicNumber:NodeInfo.kt$NodeInfo$8
- MagicNumber:NodeInfo.kt$Position$180
- MagicNumber:NodeInfo.kt$Position$90
- MagicNumber:NodeInfo.kt$Position$90.0
- MagicNumber:NodeInfo.kt$Position.Companion$1000
- MagicNumber:NodeInfo.kt$Position.Companion$1e-7
- MagicNumber:NodeInfo.kt$Position.Companion$1e7
MagicNumber:PacketRepository.kt$PacketRepository$500
MagicNumber:PacketResponseStateDialog.kt$100
MagicNumber:PowerConfigItemList.kt$3600
@@ -239,20 +172,12 @@
MagicNumber:TCPInterface.kt$TCPInterface$500
MagicNumber:UIState.kt$4
MatchingDeclarationName:AnalyticsClient.kt$AnalyticsProvider
- MatchingDeclarationName:DistanceExtensions.kt$DistanceUnit
- MatchingDeclarationName:LocationUtils.kt$GPSFormat
MatchingDeclarationName:MeshServiceStarter.kt$ServiceStarter : Worker
- MatchingDeclarationName:SortOption.kt$NodeSortOption
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:BluetoothState.kt$BluetoothState$"BluetoothState(hasPermissions=$hasPermissions, enabled=$enabled, bondedDevices=${bondedDevices.map { it.anonymize }})"
- MaxLineLength:DataPacket.kt$DataPacket$val dataType: Int
MaxLineLength:LocationRepository.kt$LocationRepository$info("Starting location updates with $providerList intervalMs=${intervalMs}ms and minDistanceM=${minDistanceM}m")
- MaxLineLength:MQTTRepository.kt$MQTTRepository.Companion$*
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
ModifierClickableOrder:Channel.kt$clickable(onClick = onClick)
- ModifierListSpacing:Packet.kt$Packet$@Entity( tableName = "packet", indices = [ Index(value = ["myNodeNum"]), Index(value = ["port_num"]), Index(value = ["contact_key"]), ] ) data
- ModifierMissing:AdaptiveTwoPane.kt$AdaptiveTwoPane
ModifierMissing:BLEDevices.kt$BLEDevices
ModifierMissing:Channel.kt$ChannelScreen
ModifierMissing:ChannelSettingsItemList.kt$ChannelSelection
@@ -270,11 +195,6 @@
ModifierMissing:EmptyStateContent.kt$EmptyStateContent
ModifierMissing:EnvironmentMetrics.kt$EnvironmentMetricsScreen
ModifierMissing:HostMetricsLog.kt$HostMetricsLogScreen
- ModifierMissing:IndoorAirQuality.kt$IndoorAirQuality
- ModifierMissing:LoraSignalIndicator.kt$LoraSignalIndicator
- ModifierMissing:LoraSignalIndicator.kt$Rssi
- ModifierMissing:LoraSignalIndicator.kt$Snr
- ModifierMissing:LoraSignalIndicator.kt$SnrAndRssi
ModifierMissing:Main.kt$MainScreen
ModifierMissing:MapReportingPreference.kt$MapReportingPreference
ModifierMissing:MessageActions.kt$MessageStatusButton
@@ -302,8 +222,6 @@
ModifierMissing:SettingsScreen.kt$SettingsScreen
ModifierMissing:Share.kt$ShareScreen
ModifierMissing:SignalMetrics.kt$SignalMetricsScreen
- ModifierMissing:SimpleAlertDialog.kt$SimpleAlertDialog
- ModifierMissing:SlidingSelector.kt$OptionLabel
ModifierMissing:TopLevelNavIcon.kt$TopLevelNavIcon
ModifierNotUsedAtRoot:DeviceMetrics.kt$modifier = modifier.weight(weight = Y_AXIS_WEIGHT)
ModifierNotUsedAtRoot:DeviceMetrics.kt$modifier = modifier.width(dp)
@@ -317,13 +235,10 @@
ModifierNotUsedAtRoot:PowerMetrics.kt$modifier = modifier.weight(weight = Y_AXIS_WEIGHT)
ModifierNotUsedAtRoot:PowerMetrics.kt$modifier = modifier.width(dp)
ModifierNotUsedAtRoot:PowerMetrics.kt$modifier.width(dp)
- ModifierNotUsedAtRoot:PreferenceFooter.kt$modifier = modifier .height(48.dp) .weight(1f)
ModifierNotUsedAtRoot:SignalInfo.kt$modifier = modifier
ModifierNotUsedAtRoot:SignalMetrics.kt$modifier = modifier.weight(weight = Y_AXIS_WEIGHT)
ModifierNotUsedAtRoot:SignalMetrics.kt$modifier = modifier.width(dp)
ModifierNotUsedAtRoot:SignalMetrics.kt$modifier.width(dp)
- ModifierNotUsedAtRoot:TextDividerPreference.kt$modifier = modifier .fillMaxWidth() .padding(all = 16.dp)
- ModifierNotUsedAtRoot:TextDividerPreference.kt$modifier = modifier .fillMaxWidth() .wrapContentWidth(Alignment.End)
ModifierReused:DeviceMetrics.kt$Canvas(modifier = modifier.width(dp)) { val height = size.height val width = size.width for (i in telemetries.indices) { val telemetry = telemetries[i] /* x-value time */ val xRatio = (telemetry.time - oldest.time).toFloat() / timeDiff val x = xRatio * width /* Channel Utilization */ plotPoint( drawContext = drawContext, color = Device.CH_UTIL.color, x = x, value = telemetry.deviceMetrics.channelUtilization, divisor = MAX_PERCENT_VALUE, ) /* Air Utilization Transmit */ plotPoint( drawContext = drawContext, color = Device.AIR_UTIL.color, x = x, value = telemetry.deviceMetrics.airUtilTx, divisor = MAX_PERCENT_VALUE, ) } /* Battery Line */ var index = 0 while (index < telemetries.size) { val path = Path() index = createPath( telemetries = telemetries, index = index, path = path, oldestTime = oldest.time, timeRange = timeDiff, width = width, timeThreshold = selectedTime.timeThreshold(), ) { i -> val telemetry = telemetries.getOrNull(i) ?: telemetries.last() val ratio = telemetry.deviceMetrics.batteryLevel / MAX_PERCENT_VALUE val y = height - (ratio * height) return@createPath y } drawPath( path = path, color = Device.BATTERY.color, style = Stroke(width = GraphUtil.RADIUS, cap = StrokeCap.Round), ) } }
ModifierReused:DeviceMetrics.kt$HorizontalLinesOverlay( modifier.width(dp), lineColors = listOf(graphColor, Color.Yellow, Color.Red, graphColor, graphColor), )
ModifierReused:DeviceMetrics.kt$TimeAxisOverlay(modifier.width(dp), oldest = oldest.time, newest = newest.time, selectedTime.lineInterval())
@@ -339,19 +254,11 @@
ModifierReused:PowerMetrics.kt$TimeAxisOverlay(modifier.width(dp), oldest = oldest.time, newest = newest.time, selectedTime.lineInterval())
ModifierReused:PowerMetrics.kt$YAxisLabels( modifier = modifier.weight(weight = Y_AXIS_WEIGHT), Power.CURRENT.color, minValue = Power.CURRENT.min, maxValue = Power.CURRENT.max, )
ModifierReused:PowerMetrics.kt$YAxisLabels( modifier = modifier.weight(weight = Y_AXIS_WEIGHT), VOLTAGE_COLOR, minValue = voltageMin, maxValue = voltageMax, )
- ModifierReused:PreferenceCategory.kt$Card( modifier = modifier.padding(bottom = 8.dp), ) { Column( modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 16.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { ProvideTextStyle(MaterialTheme.typography.bodyLarge) { content() } } }
- ModifierReused:PreferenceCategory.kt$Text( text, modifier = modifier.padding(start = 16.dp, top = 24.dp, bottom = 8.dp, end = 16.dp), style = MaterialTheme.typography.titleLarge, )
- ModifierReused:PreferenceFooter.kt$OutlinedButton( modifier = modifier .height(48.dp) .weight(1f), enabled = enabled, onClick = onPositiveClicked, ) { Text( text = stringResource(id = positiveText), ) }
- ModifierReused:PreferenceFooter.kt$OutlinedButton( modifier = modifier .height(48.dp) .weight(1f), onClick = onNegativeClicked, ) { Text( text = stringResource(id = negativeText), ) }
- ModifierReused:PreferenceFooter.kt$Row( modifier = modifier .fillMaxWidth() .height(64.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically, ) { OutlinedButton( modifier = modifier .height(48.dp) .weight(1f), onClick = onNegativeClicked, ) { Text( text = stringResource(id = negativeText), ) } OutlinedButton( modifier = modifier .height(48.dp) .weight(1f), enabled = enabled, onClick = onPositiveClicked, ) { Text( text = stringResource(id = positiveText), ) } }
ModifierReused:SignalMetrics.kt$Canvas(modifier = modifier.width(dp)) { val width = size.width /* Plot */ for (packet in meshPackets) { val xRatio = (packet.rxTime - oldest.rxTime).toFloat() / timeDiff val x = xRatio * width /* SNR */ plotPoint( drawContext = drawContext, color = Metric.SNR.color, x = x, value = packet.rxSnr - Metric.SNR.min, divisor = snrDiff, ) /* RSSI */ plotPoint( drawContext = drawContext, color = Metric.RSSI.color, x = x, value = packet.rxRssi - Metric.RSSI.min, divisor = rssiDiff, ) } }
ModifierReused:SignalMetrics.kt$HorizontalLinesOverlay(modifier.width(dp), lineColors = List(size = 5) { graphColor })
ModifierReused:SignalMetrics.kt$TimeAxisOverlay( modifier.width(dp), oldest = oldest.rxTime, newest = newest.rxTime, selectedTime.lineInterval(), )
ModifierReused:SignalMetrics.kt$YAxisLabels( modifier = modifier.weight(weight = Y_AXIS_WEIGHT), Metric.RSSI.color, minValue = Metric.RSSI.min, maxValue = Metric.RSSI.max, )
ModifierReused:SignalMetrics.kt$YAxisLabels( modifier = modifier.weight(weight = Y_AXIS_WEIGHT), Metric.SNR.color, minValue = Metric.SNR.min, maxValue = Metric.SNR.max, )
- ModifierReused:TextDividerPreference.kt$Card( modifier = modifier.fillMaxWidth(), ) { Row( modifier = modifier .fillMaxWidth() .padding(all = 16.dp), verticalAlignment = Alignment.CenterVertically ) { Text( text = title, style = MaterialTheme.typography.bodyLarge, color = if (!enabled) { MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) } else { Color.Unspecified }, ) if (trailingIcon != null) { Icon( trailingIcon, "trailingIcon", modifier = modifier .fillMaxWidth() .wrapContentWidth(Alignment.End), ) } } }
- ModifierReused:TextDividerPreference.kt$Icon( trailingIcon, "trailingIcon", modifier = modifier .fillMaxWidth() .wrapContentWidth(Alignment.End), )
- ModifierReused:TextDividerPreference.kt$Row( modifier = modifier .fillMaxWidth() .padding(all = 16.dp), verticalAlignment = Alignment.CenterVertically ) { Text( text = title, style = MaterialTheme.typography.bodyLarge, color = if (!enabled) { MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) } else { Color.Unspecified }, ) if (trailingIcon != null) { Icon( trailingIcon, "trailingIcon", modifier = modifier .fillMaxWidth() .wrapContentWidth(Alignment.End), ) } }
ModifierWithoutDefault:CommonCharts.kt$modifier
ModifierWithoutDefault:EnvironmentCharts.kt$modifier
MultiLineIfElse:Exceptions.kt$Exceptions.errormsg("ignoring exception", ex)
@@ -363,7 +270,6 @@
MultipleEmitters:NodeDetail.kt$MetricsSection
MultipleEmitters:PaxMetrics.kt$PaxMetricsChart
MultipleEmitters:PowerMetrics.kt$PowerMetricsChart
- MultipleEmitters:PreferenceCategory.kt$PreferenceCategory
MultipleEmitters:RadioConfig.kt$RadioConfigItemList
MultipleEmitters:SignalMetrics.kt$SignalMetricsChart
MutableStateAutoboxing:Contacts.kt$mutableStateOf(2)
@@ -380,16 +286,13 @@
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:InterfaceId.kt$com.geeksville.mesh.repository.radio.InterfaceId.kt
NewLineAtEndOfFile:InterfaceSpec.kt$com.geeksville.mesh.repository.radio.InterfaceSpec.kt
NewLineAtEndOfFile:MockInterfaceFactory.kt$com.geeksville.mesh.repository.radio.MockInterfaceFactory.kt
NewLineAtEndOfFile:NopInterface.kt$com.geeksville.mesh.repository.radio.NopInterface.kt
NewLineAtEndOfFile:NopInterfaceFactory.kt$com.geeksville.mesh.repository.radio.NopInterfaceFactory.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:RegularPreference.kt$com.geeksville.mesh.ui.common.components.RegularPreference.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
@@ -409,7 +312,6 @@
NoSemicolons:DateUtils.kt$DateUtils$;
NoWildcardImports:UsbRepository.kt$import kotlinx.coroutines.flow.*
OptionalAbstractKeyword:SyncContinuation.kt$Continuation$abstract
- ParameterNaming:BitwisePreference.kt$onItemSelected
ParameterNaming:ChannelSettingsItemList.kt$onPositiveClicked
ParameterNaming:ChannelSettingsItemList.kt$onSelected
ParameterNaming:CleanNodeDatabaseScreen.kt$onCheckedChanged
@@ -417,10 +319,7 @@
ParameterNaming:Contacts.kt$onDeleteSelected
ParameterNaming:Contacts.kt$onMuteSelected
ParameterNaming:DropDownPreference.kt$onItemSelected
- ParameterNaming:EditIPv4Preference.kt$onValueChanged
ParameterNaming:EditListPreference.kt$onValuesChanged
- ParameterNaming:EditPasswordPreference.kt$onValueChanged
- ParameterNaming:EditTextPreference.kt$onValueChanged
ParameterNaming:MapReportingPreference.kt$onMapReportingEnabledChanged
ParameterNaming:MapReportingPreference.kt$onPositionPrecisionChanged
ParameterNaming:MapReportingPreference.kt$onPublishIntervalSecsChanged
@@ -429,25 +328,15 @@
ParameterNaming:NodeDetail.kt$onFirmwareSelected
ParameterNaming:NodeFilterTextField.kt$onToggleShowIgnored
ParameterNaming:PositionPrecisionPreference.kt$onValueChanged
- ParameterNaming:PreferenceFooter.kt$onCancelClicked
- ParameterNaming:PreferenceFooter.kt$onNegativeClicked
- ParameterNaming:PreferenceFooter.kt$onPositiveClicked
- ParameterNaming:PreferenceFooter.kt$onSaveClicked
- ParameterNaming:SlidingSelector.kt$onOptionSelected
ParameterNaming:UsbDevices.kt$onDeviceSelected
ParameterNaming:WelcomeScreen.kt$onGetStarted
PreviewAnnotationNaming:LargeFontPreview.kt$LargeFontPreview$LargeFontPreview
- PreviewPublic:BatteryInfo.kt$BatteryInfoPreview
- PreviewPublic:BatteryInfo.kt$BatteryInfoPreviewSimple
PreviewPublic:Channel.kt$ModemPresetInfoPreview
PreviewPublic:ElevationInfo.kt$ElevationInfoPreview
PreviewPublic:EmptyStateContent.kt$EmptyStateContentPreview
- PreviewPublic:IndoorAirQuality.kt$IAQScalePreview
PreviewPublic:LastHeardInfo.kt$LastHeardInfoPreview
- PreviewPublic:LazyColumnDragAndDropDemo.kt$LazyColumnDragAndDropDemo
PreviewPublic:LinkedCoordinates.kt$LinkedCoordinatesPreview
PreviewPublic:MapReportingPreference.kt$MapReportingPreview
- PreviewPublic:MaterialBatteryInfo.kt$MaterialBatteryInfoPreview
PreviewPublic:NodeChip.kt$NodeChipPreview
PreviewPublic:NodeItem.kt$NodeInfoPreview
PreviewPublic:NodeItem.kt$NodeInfoSimplePreview
@@ -458,17 +347,13 @@
PreviewPublic:SignalInfo.kt$SignalInfoPreview
PreviewPublic:SignalInfo.kt$SignalInfoSelfPreview
PreviewPublic:SignalInfo.kt$SignalInfoSimplePreview
- PreviewPublic:SlidingSelector.kt$SlidingSelectorPreview
RethrowCaughtException:SyncContinuation.kt$Continuation$throw ex
ReturnCount:RadioConfigViewModel.kt$RadioConfigViewModel$private fun processPacketResponse(packet: MeshProtos.MeshPacket)
SpacingAroundKeyword:Exceptions.kt$if
SpacingAroundKeyword:Exceptions.kt$when
- SpacingAroundRangeOperator:BatteryInfo.kt$..
SwallowedException:BluetoothInterface.kt$BluetoothInterface$ex: CancellationException
SwallowedException:ChannelSet.kt$ex: Throwable
- SwallowedException:DeviceVersion.kt$DeviceVersion$e: Exception
SwallowedException:Exceptions.kt$ex: Throwable
- SwallowedException:MeshLog.kt$MeshLog$e: IOException
SwallowedException:MeshService.kt$MeshService$ex: BLEException
SwallowedException:MeshService.kt$MeshService$ex: CancellationException
SwallowedException:NsdManager.kt$ex: IllegalArgumentException
@@ -479,7 +364,6 @@
TooGenericExceptionCaught:BTScanModel.kt$BTScanModel$ex: Throwable
TooGenericExceptionCaught:BluetoothInterface.kt$BluetoothInterface$ex: Exception
TooGenericExceptionCaught:ChannelSet.kt$ex: Throwable
- TooGenericExceptionCaught:DeviceVersion.kt$DeviceVersion$e: Exception
TooGenericExceptionCaught:Exceptions.kt$ex: Throwable
TooGenericExceptionCaught:LanguageUtils.kt$LanguageUtils$e: Exception
TooGenericExceptionCaught:LocationRepository.kt$LocationRepository$e: Exception
@@ -492,7 +376,6 @@
TooGenericExceptionCaught:SafeBluetooth.kt$SafeBluetooth$ex: NullPointerException
TooGenericExceptionCaught:SyncContinuation.kt$Continuation$ex: Throwable
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:ServiceClient.kt$ServiceClient$throw Exception("Haven't called connect")
@@ -503,9 +386,7 @@
TooManyFunctions:MeshService.kt$MeshService : ServiceLogging
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
TooManyFunctions:RadioConfigViewModel.kt$RadioConfigViewModel : ViewModelLogging
TooManyFunctions:RadioInterfaceService.kt$RadioInterfaceService : Logging
TooManyFunctions:SafeBluetooth.kt$SafeBluetooth : LoggingCloseable
@@ -521,15 +402,11 @@
ViewModelForwarding:NodeScreen.kt$AddContactFAB( modifier = Modifier.animateFloatingActionButton( visible = !isScrollInProgress && connectionState == ConnectionState.CONNECTED && shareCapable, alignment = Alignment.BottomEnd, ), model = model, onSharedContactImport = { contact -> model.addSharedContact(contact) }, )
ViewModelInjection:DebugSearch.kt$viewModel
WildcardImport:UsbRepository.kt$import kotlinx.coroutines.flow.*
- Wrapping:DebugFilters.kt$(
- Wrapping:DebugFilters.kt$if (filter in filterTexts) { Icon( imageVector = Icons.Filled.Done, contentDescription = stringResource(id = R.string.debug_filter_included), ) }
- Wrapping:MQTTRepository.kt$MQTTRepository.<no name provided>$(
Wrapping:Message.kt${ event -> when (event) { is MessageScreenEvent.SendMessage -> { viewModel.sendMessage(event.text, contactKey, event.replyingToPacketId) if (event.replyingToPacketId != null) replyingToPacketId = null messageInputState.clearText() } is MessageScreenEvent.SendReaction -> viewModel.sendReaction(event.emoji, event.messageId, contactKey) is MessageScreenEvent.DeleteMessages -> { viewModel.deleteMessages(event.ids) selectedMessageIds.value = emptySet() showDeleteDialog = false } is MessageScreenEvent.ClearUnreadCount -> viewModel.clearUnreadCount(contactKey, event.lastReadMessageId) is MessageScreenEvent.HandleNodeMenuAction -> { when (val action = event.action) { is NodeMenuAction.DirectMessage -> { val hasPKC = ourNode?.hasPKC == true && action.node.hasPKC val targetChannel = if (hasPKC) { DataPacket.PKC_CHANNEL_INDEX } else { action.node.channel } navigateToMessages("$targetChannel${action.node.user.id}") } is NodeMenuAction.MoreDetails -> navigateToNodeDetails(action.node.num) is NodeMenuAction.Share -> sharedContact = action.node else -> viewModel.handleNodeMenuAction(action) } } is MessageScreenEvent.SetTitle -> viewModel.setTitle(event.title) is MessageScreenEvent.NavigateToMessages -> navigateToMessages(event.contactKey) is MessageScreenEvent.NavigateToNodeDetails -> navigateToNodeDetails(event.nodeNum) MessageScreenEvent.NavigateBack -> onNavigateBack() is MessageScreenEvent.CopyToClipboard -> { clipboardManager.nativeClipboard.setPrimaryClip(ClipData.newPlainText(event.text, event.text)) selectedMessageIds.value = emptySet() } } }
Wrapping:SerialConnectionImpl.kt$SerialConnectionImpl$(
Wrapping:SerialConnectionImpl.kt$SerialConnectionImpl$(port, object : SerialInputOutputManager.Listener { override fun onNewData(data: ByteArray) { listener.onDataReceived(data) } override fun onRunError(e: Exception?) { closed.set(true) ignoreException { port.dtr = false port.rts = false port.close() } closedLatch.countDown() listener.onDisconnected(e) } })
Wrapping:SerialInterface.kt$SerialInterface$(
Wrapping:SerialInterface.kt$SerialInterface$(device, object : SerialConnectionListener { override fun onMissingPermission() { errormsg("Need permissions for port") } override fun onConnected() { onConnect.invoke() } override fun onDataReceived(bytes: ByteArray) { debug("Received ${bytes.size} byte(s)") bytes.forEach(::readChar) } override fun onDisconnected(thrown: Exception?) { thrown?.let { e -> errormsg("Serial error: $e") } debug("$device disconnected") onDeviceDisconnect(false) } })
Wrapping:ServiceClient.kt$ServiceClient$Closeable, Logging
- Wrapping:SlidingSelector.kt$;
diff --git a/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt b/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt
index 984c945ab..6eba0ba04 100644
--- a/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt
+++ b/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/EditWaypointDialog.kt
@@ -64,11 +64,11 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.geeksville.mesh.MeshProtos.Waypoint
import com.geeksville.mesh.copy
-import com.geeksville.mesh.ui.common.components.EditTextPreference
import com.geeksville.mesh.ui.common.components.EmojiPickerDialog
-import com.geeksville.mesh.ui.common.theme.AppTheme
import com.geeksville.mesh.waypoint
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.theme.AppTheme
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale
diff --git a/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/MapButton.kt b/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/MapButton.kt
index ed666bb66..2f5e3030a 100644
--- a/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/MapButton.kt
+++ b/app/src/fdroid/java/com/geeksville/mesh/ui/map/components/MapButton.kt
@@ -29,8 +29,8 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.ui.common.theme.AppTheme
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.AppTheme
@Composable
fun MapButton(
diff --git a/app/src/google/java/com/geeksville/mesh/ui/map/components/MapControlsOverlay.kt b/app/src/google/java/com/geeksville/mesh/ui/map/components/MapControlsOverlay.kt
index 73e9b2b8a..79ccbb062 100644
--- a/app/src/google/java/com/geeksville/mesh/ui/map/components/MapControlsOverlay.kt
+++ b/app/src/google/java/com/geeksville/mesh/ui/map/components/MapControlsOverlay.kt
@@ -33,9 +33,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.res.stringResource
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed
import com.geeksville.mesh.ui.map.MapViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.StatusColors.StatusRed
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt
index 7a1eee220..a0e8cf0cf 100644
--- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt
+++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt
@@ -44,14 +44,14 @@ import com.geeksville.mesh.android.GeeksvilleApplication
import com.geeksville.mesh.android.Logging
import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.ui.MainScreen
-import com.geeksville.mesh.ui.common.theme.AppTheme
-import com.geeksville.mesh.ui.common.theme.MODE_DYNAMIC
import com.geeksville.mesh.ui.intro.AppIntroductionScreen
import com.geeksville.mesh.ui.sharing.toSharedContact
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.meshtastic.core.datastore.UiPreferencesDataSource
import org.meshtastic.core.navigation.DEEP_LINK_BASE_URI
+import org.meshtastic.core.ui.theme.AppTheme
+import org.meshtastic.core.ui.theme.MODE_DYNAMIC
import javax.inject.Inject
@AndroidEntryPoint
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 98521632a..27be749c7 100644
--- a/app/src/main/java/com/geeksville/mesh/model/EnvironmentMetricsState.kt
+++ b/app/src/main/java/com/geeksville/mesh/model/EnvironmentMetricsState.kt
@@ -19,16 +19,16 @@ package com.geeksville.mesh.model
import androidx.compose.ui.graphics.Color
import com.geeksville.mesh.TelemetryProtos
-import com.geeksville.mesh.ui.common.theme.GraphColors.Green
-import com.geeksville.mesh.ui.common.theme.GraphColors.InfantryBlue
-import com.geeksville.mesh.ui.common.theme.GraphColors.LightGreen
-import com.geeksville.mesh.ui.common.theme.GraphColors.Magenta
-import com.geeksville.mesh.ui.common.theme.GraphColors.Orange
-import com.geeksville.mesh.ui.common.theme.GraphColors.Pink
-import com.geeksville.mesh.ui.common.theme.GraphColors.Purple
-import com.geeksville.mesh.ui.common.theme.GraphColors.Red
-import com.geeksville.mesh.ui.common.theme.GraphColors.Yellow
import org.meshtastic.core.model.util.UnitConversions
+import org.meshtastic.core.ui.theme.GraphColors.Green
+import org.meshtastic.core.ui.theme.GraphColors.InfantryBlue
+import org.meshtastic.core.ui.theme.GraphColors.LightGreen
+import org.meshtastic.core.ui.theme.GraphColors.Magenta
+import org.meshtastic.core.ui.theme.GraphColors.Orange
+import org.meshtastic.core.ui.theme.GraphColors.Pink
+import org.meshtastic.core.ui.theme.GraphColors.Purple
+import org.meshtastic.core.ui.theme.GraphColors.Red
+import org.meshtastic.core.ui.theme.GraphColors.Yellow
@Suppress("MagicNumber")
enum class Environment(val color: Color) {
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 eb0c08e03..f81a489a6 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/Main.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/Main.kt
@@ -91,16 +91,7 @@ import com.geeksville.mesh.repository.radio.MeshActivity
import com.geeksville.mesh.service.ConnectionState
import com.geeksville.mesh.service.MeshService
import com.geeksville.mesh.ui.common.components.MainAppBar
-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.common.icons.Conversations
-import com.geeksville.mesh.ui.common.icons.Map
-import com.geeksville.mesh.ui.common.icons.MeshtasticIcons
-import com.geeksville.mesh.ui.common.icons.Nodes
-import com.geeksville.mesh.ui.common.icons.Settings
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusBlue
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusGreen
import com.geeksville.mesh.ui.connections.DeviceType
import com.geeksville.mesh.ui.connections.components.TopLevelNavIcon
import com.geeksville.mesh.ui.node.components.NodeMenuAction
@@ -120,6 +111,15 @@ import org.meshtastic.core.navigation.NodesRoutes
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.MultipleChoiceAlertDialog
+import org.meshtastic.core.ui.component.SimpleAlertDialog
+import org.meshtastic.core.ui.icon.Conversations
+import org.meshtastic.core.ui.icon.Map
+import org.meshtastic.core.ui.icon.MeshtasticIcons
+import org.meshtastic.core.ui.icon.Nodes
+import org.meshtastic.core.ui.icon.Settings
+import org.meshtastic.core.ui.theme.StatusColors.StatusBlue
+import org.meshtastic.core.ui.theme.StatusColors.StatusGreen
import kotlin.reflect.KClass
enum class TopLevelDestination(@StringRes val label: Int, val icon: ImageVector, val route: Route) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditListPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditListPreference.kt
index 74c18fea5..8fc3a3575 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditListPreference.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/EditListPreference.kt
@@ -46,6 +46,7 @@ import com.geeksville.mesh.copy
import com.geeksville.mesh.remoteHardwarePin
import com.google.protobuf.ByteString
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
@Suppress("LongMethod")
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/EmojiPicker.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/EmojiPicker.kt
index 0667a70eb..56261e9b9 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/EmojiPicker.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/EmojiPicker.kt
@@ -31,6 +31,7 @@ import androidx.emoji2.emojipicker.RecentEmojiProviderAdapter
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import com.geeksville.mesh.ui.common.EmojiPickerViewModel
import com.geeksville.mesh.util.CustomRecentEmojiProvider
+import org.meshtastic.core.ui.component.BottomSheetDialog
@Composable
fun EmojiPicker(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/MainAppBar.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/MainAppBar.kt
index 5fe4696b3..6a5f425ad 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/MainAppBar.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/MainAppBar.kt
@@ -50,7 +50,6 @@ import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.navigation.isConfigRoute
import com.geeksville.mesh.navigation.isNodeDetailRoute
import com.geeksville.mesh.ui.TopLevelDestination.Companion.isTopLevel
-import com.geeksville.mesh.ui.common.theme.AppTheme
import com.geeksville.mesh.ui.debug.DebugMenuActions
import com.geeksville.mesh.ui.node.components.NodeChip
import com.geeksville.mesh.ui.node.components.NodeMenuAction
@@ -59,6 +58,7 @@ import org.meshtastic.core.navigation.ContactsRoutes
import org.meshtastic.core.navigation.NodesRoutes
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.AppTheme
@Suppress("CyclomaticComplexMethod")
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/PositionPrecisionPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/PositionPrecisionPreference.kt
index b29f06ab2..22133584c 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/PositionPrecisionPreference.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/PositionPrecisionPreference.kt
@@ -34,6 +34,7 @@ import androidx.compose.ui.unit.dp
import org.meshtastic.core.model.util.DistanceUnit
import org.meshtastic.core.model.util.toDistanceString
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.SwitchPreference
import kotlin.math.pow
import kotlin.math.roundToInt
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/SecurityIcon.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/SecurityIcon.kt
index 271fe46b7..b4cb34a36 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/SecurityIcon.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/SecurityIcon.kt
@@ -64,11 +64,11 @@ import com.geeksville.mesh.AppOnlyProtos
import com.geeksville.mesh.ChannelProtos.ChannelSettings
import com.geeksville.mesh.ConfigProtos.Config.LoRaConfig
import com.geeksville.mesh.model.getChannel
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusGreen
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusYellow
import org.meshtastic.core.model.Channel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.StatusColors.StatusGreen
+import org.meshtastic.core.ui.theme.StatusColors.StatusRed
+import org.meshtastic.core.ui.theme.StatusColors.StatusYellow
private const val PRECISE_POSITION_BITS = 32
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/SignalInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/SignalInfo.kt
index e58a89acb..c41958236 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/SignalInfo.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/SignalInfo.kt
@@ -27,9 +27,10 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.tooling.preview.PreviewParameter
import com.geeksville.mesh.ui.common.preview.NodePreviewParameterProvider
-import com.geeksville.mesh.ui.common.theme.AppTheme
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.NodeSignalQuality
+import org.meshtastic.core.ui.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/connections/ConnectionsScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsScreen.kt
index a487893c9..fb8111f21 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsScreen.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsScreen.kt
@@ -66,7 +66,6 @@ import com.geeksville.mesh.navigation.ConfigRoute
import com.geeksville.mesh.navigation.getNavRouteFrom
import com.geeksville.mesh.service.ConnectionState
import com.geeksville.mesh.ui.common.components.MainAppBar
-import com.geeksville.mesh.ui.common.components.TitledCard
import com.geeksville.mesh.ui.connections.components.BLEDevices
import com.geeksville.mesh.ui.connections.components.ConnectionsSegmentedBar
import com.geeksville.mesh.ui.connections.components.CurrentlyConnectedInfo
@@ -83,6 +82,7 @@ import org.meshtastic.core.database.model.Node
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.TitledCard
fun String?.isIPAddress(): Boolean = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
@Suppress("DEPRECATION")
diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/components/BLEDevices.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/components/BLEDevices.kt
index c93bf2957..a7a921b69 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/connections/components/BLEDevices.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/connections/components/BLEDevices.kt
@@ -49,11 +49,11 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.geeksville.mesh.model.BTScanModel
import com.geeksville.mesh.model.DeviceListEntry
import com.geeksville.mesh.service.ConnectionState
-import com.geeksville.mesh.ui.common.components.TitledCard
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.MultiplePermissionsState
import com.google.accompanist.permissions.rememberMultiplePermissionsState
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.TitledCard
/**
* Composable that displays a list of Bluetooth Low Energy (BLE) devices and allows scanning. It handles Bluetooth
diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/components/ConnectionsSegmentedBar.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/components/ConnectionsSegmentedBar.kt
index 4d1963ab7..eaa9dac04 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/connections/components/ConnectionsSegmentedBar.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/connections/components/ConnectionsSegmentedBar.kt
@@ -33,9 +33,9 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
-import com.geeksville.mesh.ui.common.theme.AppTheme
import com.geeksville.mesh.ui.connections.DeviceType
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.AppTheme
@Suppress("LambdaParameterEventTrailing")
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/components/CurrentlyConnectedInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/components/CurrentlyConnectedInfo.kt
index afa31b8c4..b3501859e 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/connections/components/CurrentlyConnectedInfo.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/connections/components/CurrentlyConnectedInfo.kt
@@ -43,13 +43,13 @@ import androidx.compose.ui.unit.dp
import com.geeksville.mesh.MeshProtos
import com.geeksville.mesh.PaxcountProtos
import com.geeksville.mesh.TelemetryProtos
-import com.geeksville.mesh.ui.common.components.MaterialBatteryInfo
-import com.geeksville.mesh.ui.common.theme.AppTheme
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed
import com.geeksville.mesh.ui.node.components.NodeChip
import com.geeksville.mesh.ui.node.components.NodeMenuAction
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.MaterialBatteryInfo
+import org.meshtastic.core.ui.theme.AppTheme
+import org.meshtastic.core.ui.theme.StatusColors.StatusRed
@Composable
fun CurrentlyConnectedInfo(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/components/EmptyStateContent.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/components/EmptyStateContent.kt
index d5fda4727..c25c83b0b 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/connections/components/EmptyStateContent.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/connections/components/EmptyStateContent.kt
@@ -36,7 +36,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.ui.common.theme.AppTheme
+import org.meshtastic.core.ui.theme.AppTheme
@Composable
fun EmptyStateContent(imageVector: ImageVector? = null, text: String, actionButton: @Composable (() -> Unit)? = null) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/components/NetworkDevices.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/components/NetworkDevices.kt
index 9a22587de..394613e72 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/connections/components/NetworkDevices.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/connections/components/NetworkDevices.kt
@@ -55,11 +55,11 @@ import com.geeksville.mesh.model.BTScanModel
import com.geeksville.mesh.model.DeviceListEntry
import com.geeksville.mesh.repository.network.NetworkRepository
import com.geeksville.mesh.service.ConnectionState
-import com.geeksville.mesh.ui.common.components.TitledCard
-import com.geeksville.mesh.ui.common.theme.AppTheme
import com.geeksville.mesh.ui.connections.isIPAddress
import kotlinx.coroutines.launch
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.TitledCard
+import org.meshtastic.core.ui.theme.AppTheme
@OptIn(ExperimentalMaterial3Api::class)
@Suppress("MagicNumber", "LongMethod")
diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/components/TopLevelNavIcon.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/components/TopLevelNavIcon.kt
index 8f6be8e90..a7f17cf5e 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/connections/components/TopLevelNavIcon.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/connections/components/TopLevelNavIcon.kt
@@ -38,14 +38,14 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import com.geeksville.mesh.service.ConnectionState
import com.geeksville.mesh.ui.TopLevelDestination
-import com.geeksville.mesh.ui.common.icons.Device
-import com.geeksville.mesh.ui.common.icons.MeshtasticIcons
-import com.geeksville.mesh.ui.common.icons.NoDevice
-import com.geeksville.mesh.ui.common.theme.AppTheme
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusGreen
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusYellow
import com.geeksville.mesh.ui.connections.DeviceType
+import org.meshtastic.core.ui.icon.Device
+import org.meshtastic.core.ui.icon.MeshtasticIcons
+import org.meshtastic.core.ui.icon.NoDevice
+import org.meshtastic.core.ui.theme.AppTheme
+import org.meshtastic.core.ui.theme.StatusColors.StatusGreen
+import org.meshtastic.core.ui.theme.StatusColors.StatusRed
+import org.meshtastic.core.ui.theme.StatusColors.StatusYellow
@Composable
fun TopLevelNavIcon(destination: TopLevelDestination, connectionState: ConnectionState, deviceType: DeviceType?) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/components/UsbDevices.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/components/UsbDevices.kt
index 4c0b27821..2a1ba8d24 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/connections/components/UsbDevices.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/connections/components/UsbDevices.kt
@@ -26,9 +26,9 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark
import com.geeksville.mesh.model.BTScanModel
import com.geeksville.mesh.model.DeviceListEntry
import com.geeksville.mesh.service.ConnectionState
-import com.geeksville.mesh.ui.common.components.TitledCard
-import com.geeksville.mesh.ui.common.theme.AppTheme
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.TitledCard
+import org.meshtastic.core.ui.theme.AppTheme
@Composable
fun UsbDevices(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/contact/ContactItem.kt b/app/src/main/java/com/geeksville/mesh/ui/contact/ContactItem.kt
index 78ba9a61b..6e729db61 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/contact/ContactItem.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/contact/ContactItem.kt
@@ -52,8 +52,8 @@ import androidx.compose.ui.unit.dp
import com.geeksville.mesh.AppOnlyProtos
import com.geeksville.mesh.model.Contact
import com.geeksville.mesh.ui.common.components.SecurityIcon
-import com.geeksville.mesh.ui.common.theme.AppTheme
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.AppTheme
@Suppress("LongMethod")
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/debug/Debug.kt b/app/src/main/java/com/geeksville/mesh/ui/debug/Debug.kt
index 5b39ad889..afede99bc 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/debug/Debug.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/debug/Debug.kt
@@ -73,7 +73,6 @@ import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.size
import androidx.compose.ui.unit.sp
import androidx.datastore.core.IOException
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
@@ -81,15 +80,15 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.geeksville.mesh.android.BuildUtils.warn
import com.geeksville.mesh.model.DebugViewModel
import com.geeksville.mesh.model.DebugViewModel.UiMeshLog
-import com.geeksville.mesh.ui.common.components.CopyIconButton
-import com.geeksville.mesh.ui.common.components.SimpleAlertDialog
-import com.geeksville.mesh.ui.common.theme.AnnotationColor
-import com.geeksville.mesh.ui.common.theme.AppTheme
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.CopyIconButton
+import org.meshtastic.core.ui.component.SimpleAlertDialog
+import org.meshtastic.core.ui.theme.AnnotationColor
+import org.meshtastic.core.ui.theme.AppTheme
import java.io.OutputStreamWriter
import java.nio.charset.StandardCharsets
import java.text.SimpleDateFormat
diff --git a/app/src/main/java/com/geeksville/mesh/ui/debug/DebugSearch.kt b/app/src/main/java/com/geeksville/mesh/ui/debug/DebugSearch.kt
index cd4f6f467..700f9cf9a 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/debug/DebugSearch.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/debug/DebugSearch.kt
@@ -57,8 +57,8 @@ import com.geeksville.mesh.model.DebugViewModel
import com.geeksville.mesh.model.DebugViewModel.UiMeshLog
import com.geeksville.mesh.model.LogSearchManager.SearchMatch
import com.geeksville.mesh.model.LogSearchManager.SearchState
-import com.geeksville.mesh.ui.common.theme.AppTheme
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.AppTheme
@Composable
internal fun DebugSearchNavigation(
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 779e38bfa..1eb7be061 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
@@ -98,7 +98,6 @@ import com.geeksville.mesh.AppOnlyProtos
import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.model.getChannel
import com.geeksville.mesh.ui.common.components.SecurityIcon
-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
@@ -109,6 +108,7 @@ import org.meshtastic.core.database.model.Message
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.model.DataPacket
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.AppTheme
import java.nio.charset.StandardCharsets
private const val MESSAGE_CHARACTER_LIMIT_BYTES = 200
diff --git a/app/src/main/java/com/geeksville/mesh/ui/message/QuickChat.kt b/app/src/main/java/com/geeksville/mesh/ui/message/QuickChat.kt
index b19c3364e..f1acbb64d 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/message/QuickChat.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/message/QuickChat.kt
@@ -71,12 +71,12 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.geeksville.mesh.model.UIViewModel
-import com.geeksville.mesh.ui.common.components.dragContainer
-import com.geeksville.mesh.ui.common.components.dragDropItemsIndexed
-import com.geeksville.mesh.ui.common.components.rememberDragDropState
-import com.geeksville.mesh.ui.common.theme.AppTheme
import org.meshtastic.core.database.entity.QuickChatAction
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.dragContainer
+import org.meshtastic.core.ui.component.dragDropItemsIndexed
+import org.meshtastic.core.ui.component.rememberDragDropState
+import org.meshtastic.core.ui.theme.AppTheme
@Composable
internal fun QuickChatScreen(modifier: Modifier = Modifier, viewModel: UIViewModel = hiltViewModel()) {
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 3ba1a6f92..816691774 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
@@ -49,12 +49,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.ui.common.components.MDText
-import com.geeksville.mesh.ui.common.components.Rssi
-import com.geeksville.mesh.ui.common.components.Snr
import com.geeksville.mesh.ui.common.preview.NodePreviewParameterProvider
-import com.geeksville.mesh.ui.common.theme.AppTheme
-import com.geeksville.mesh.ui.common.theme.MessageItemColors
import com.geeksville.mesh.ui.node.components.NodeChip
import com.geeksville.mesh.ui.node.components.NodeMenuAction
import org.meshtastic.core.database.entity.Reaction
@@ -62,6 +57,11 @@ import org.meshtastic.core.database.model.Message
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.model.MessageStatus
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.MDText
+import org.meshtastic.core.ui.component.Rssi
+import org.meshtastic.core.ui.component.Snr
+import org.meshtastic.core.ui.theme.AppTheme
+import org.meshtastic.core.ui.theme.MessageItemColors
@Suppress("LongMethod", "CyclomaticComplexMethod")
@Composable
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 4ff95f2f3..952fc2149 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
@@ -52,9 +52,9 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
import com.geeksville.mesh.MeshProtos
-import com.geeksville.mesh.ui.common.components.BottomSheetDialog
-import com.geeksville.mesh.ui.common.theme.AppTheme
import org.meshtastic.core.database.entity.Reaction
+import org.meshtastic.core.ui.component.BottomSheetDialog
+import org.meshtastic.core.ui.theme.AppTheme
@Composable
private fun ReactionItem(emoji: String, emojiCount: Int = 1, onClick: () -> Unit = {}, onLongClick: () -> Unit = {}) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/DeviceMetrics.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/DeviceMetrics.kt
index 5c60a2e95..6e3925af2 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/metrics/DeviceMetrics.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/DeviceMetrics.kt
@@ -63,14 +63,6 @@ import com.geeksville.mesh.TelemetryProtos
import com.geeksville.mesh.TelemetryProtos.Telemetry
import com.geeksville.mesh.model.MetricsViewModel
import com.geeksville.mesh.model.TimeFrame
-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.AppTheme
-import com.geeksville.mesh.ui.common.theme.GraphColors.Cyan
-import com.geeksville.mesh.ui.common.theme.GraphColors.Green
-import com.geeksville.mesh.ui.common.theme.GraphColors.Magenta
-import com.geeksville.mesh.ui.common.theme.GraphColors.Red
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
@@ -78,6 +70,13 @@ import com.geeksville.mesh.util.GraphUtil
import com.geeksville.mesh.util.GraphUtil.createPath
import com.geeksville.mesh.util.GraphUtil.plotPoint
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.BatteryInfo
+import org.meshtastic.core.ui.component.OptionLabel
+import org.meshtastic.core.ui.component.SlidingSelector
+import org.meshtastic.core.ui.theme.AppTheme
+import org.meshtastic.core.ui.theme.GraphColors.Cyan
+import org.meshtastic.core.ui.theme.GraphColors.Green
+import org.meshtastic.core.ui.theme.GraphColors.Magenta
private const val CHART_WEIGHT = 1f
private const val Y_AXIS_WEIGHT = 0.1f
diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentMetrics.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentMetrics.kt
index f40bfeaec..573bd9f74 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentMetrics.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/EnvironmentMetrics.kt
@@ -53,14 +53,14 @@ import com.geeksville.mesh.TelemetryProtos.Telemetry
import com.geeksville.mesh.copy
import com.geeksville.mesh.model.MetricsViewModel
import com.geeksville.mesh.model.TimeFrame
-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 org.meshtastic.core.model.util.UnitConversions.celsiusToFahrenheit
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.IaqDisplayMode
+import org.meshtastic.core.ui.component.IndoorAirQuality
+import org.meshtastic.core.ui.component.OptionLabel
+import org.meshtastic.core.ui.component.SlidingSelector
@Composable
fun EnvironmentMetricsScreen(viewModel: MetricsViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt
index 9b39526c4..93d5eaf3b 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/HostMetricsLog.kt
@@ -55,10 +55,10 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.geeksville.mesh.TelemetryProtos
import com.geeksville.mesh.model.MetricsViewModel
-import com.geeksville.mesh.ui.common.theme.AppTheme
import com.geeksville.mesh.ui.metrics.CommonCharts.DATE_TIME_FORMAT
import org.meshtastic.core.model.util.formatUptime
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.AppTheme
import java.text.DecimalFormat
@OptIn(ExperimentalFoundationApi::class)
diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/PaxMetrics.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/PaxMetrics.kt
index 9b16b99dd..3c67e930b 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/metrics/PaxMetrics.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/PaxMetrics.kt
@@ -57,11 +57,11 @@ import com.geeksville.mesh.PaxcountProtos
import com.geeksville.mesh.Portnums.PortNum
import com.geeksville.mesh.model.MetricsViewModel
import com.geeksville.mesh.model.TimeFrame
-import com.geeksville.mesh.ui.common.components.OptionLabel
-import com.geeksville.mesh.ui.common.components.SlidingSelector
import org.meshtastic.core.database.entity.MeshLog
import org.meshtastic.core.model.util.formatUptime
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.OptionLabel
+import org.meshtastic.core.ui.component.SlidingSelector
import java.text.DateFormat
import java.util.Date
diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/PositionLog.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/PositionLog.kt
index 7b0dec73f..4fad6c5f0 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/metrics/PositionLog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/PositionLog.kt
@@ -64,10 +64,10 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.geeksville.mesh.ConfigProtos.Config.DisplayConfig.DisplayUnits
import com.geeksville.mesh.MeshProtos
import com.geeksville.mesh.model.MetricsViewModel
-import com.geeksville.mesh.ui.common.theme.AppTheme
import org.meshtastic.core.model.util.metersIn
import org.meshtastic.core.model.util.toString
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.AppTheme
import java.text.DateFormat
import kotlin.time.Duration.Companion.days
diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/PowerMetrics.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/PowerMetrics.kt
index c1a1cf636..5c81d3f7e 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/metrics/PowerMetrics.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/PowerMetrics.kt
@@ -62,15 +62,15 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.geeksville.mesh.TelemetryProtos.Telemetry
import com.geeksville.mesh.model.MetricsViewModel
import com.geeksville.mesh.model.TimeFrame
-import com.geeksville.mesh.ui.common.components.OptionLabel
-import com.geeksville.mesh.ui.common.components.SlidingSelector
-import com.geeksville.mesh.ui.common.theme.GraphColors.InfantryBlue
-import com.geeksville.mesh.ui.common.theme.GraphColors.Red
import com.geeksville.mesh.ui.metrics.CommonCharts.DATE_TIME_FORMAT
import com.geeksville.mesh.ui.metrics.CommonCharts.MS_PER_SEC
import com.geeksville.mesh.util.GraphUtil
import com.geeksville.mesh.util.GraphUtil.createPath
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.OptionLabel
+import org.meshtastic.core.ui.component.SlidingSelector
+import org.meshtastic.core.ui.theme.GraphColors.InfantryBlue
+import org.meshtastic.core.ui.theme.GraphColors.Red
import kotlin.math.ceil
import kotlin.math.floor
diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/SignalMetrics.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/SignalMetrics.kt
index f42883b2e..fb1f06128 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/metrics/SignalMetrics.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/SignalMetrics.kt
@@ -59,14 +59,14 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.geeksville.mesh.MeshProtos.MeshPacket
import com.geeksville.mesh.model.MetricsViewModel
import com.geeksville.mesh.model.TimeFrame
-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
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.LoraSignalIndicator
+import org.meshtastic.core.ui.component.OptionLabel
+import org.meshtastic.core.ui.component.SlidingSelector
+import org.meshtastic.core.ui.component.SnrAndRssi
@Suppress("MagicNumber")
private enum class Metric(val color: Color, val min: Float, val max: Float) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/metrics/TracerouteLog.kt b/app/src/main/java/com/geeksville/mesh/ui/metrics/TracerouteLog.kt
index b5fa8ba09..bc3046c1a 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/metrics/TracerouteLog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/metrics/TracerouteLog.kt
@@ -58,12 +58,12 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.geeksville.mesh.MeshProtos
import com.geeksville.mesh.model.MetricsViewModel
-import com.geeksville.mesh.ui.common.components.SimpleAlertDialog
-import com.geeksville.mesh.ui.common.theme.AppTheme
import com.geeksville.mesh.ui.metrics.CommonCharts.MS_PER_SEC
import org.meshtastic.core.model.fullRouteDiscovery
import org.meshtastic.core.model.getTracerouteResponse
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.SimpleAlertDialog
+import org.meshtastic.core.ui.theme.AppTheme
import java.text.DateFormat
@OptIn(ExperimentalFoundationApi::class)
diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt b/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt
index c4da03969..769a1280f 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetail.kt
@@ -134,13 +134,7 @@ import com.geeksville.mesh.model.MetricsViewModel
import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.service.ServiceAction
import com.geeksville.mesh.ui.common.components.MainAppBar
-import com.geeksville.mesh.ui.common.components.TitledCard
import com.geeksville.mesh.ui.common.preview.NodePreviewParameterProvider
-import com.geeksville.mesh.ui.common.theme.AppTheme
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusGreen
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusOrange
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusYellow
import com.geeksville.mesh.ui.node.components.NodeActionDialogs
import com.geeksville.mesh.ui.node.components.NodeMenuAction
import com.geeksville.mesh.ui.node.components.TracerouteButton
@@ -168,6 +162,12 @@ import org.meshtastic.core.navigation.NodeDetailRoutes
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.TitledCard
+import org.meshtastic.core.ui.theme.AppTheme
+import org.meshtastic.core.ui.theme.StatusColors.StatusGreen
+import org.meshtastic.core.ui.theme.StatusColors.StatusOrange
+import org.meshtastic.core.ui.theme.StatusColors.StatusRed
+import org.meshtastic.core.ui.theme.StatusColors.StatusYellow
private data class VectorMetricInfo(
@StringRes val label: Int,
diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/NodeScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/node/NodeScreen.kt
index d4b6a1c4d..1677b92e8 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/node/NodeScreen.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/NodeScreen.kt
@@ -49,7 +49,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.service.ConnectionState
import com.geeksville.mesh.ui.common.components.MainAppBar
-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
@@ -60,6 +59,7 @@ import org.meshtastic.core.database.model.Node
import org.meshtastic.core.model.DataPacket
import org.meshtastic.core.model.DeviceVersion
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.rememberTimeTickWithLifecycle
@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3ExpressiveApi::class)
@Suppress("LongMethod", "CyclomaticComplexMethod")
diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/LastHeardInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/LastHeardInfo.kt
index c7337256c..27aa8adc4 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/node/components/LastHeardInfo.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/LastHeardInfo.kt
@@ -31,8 +31,8 @@ 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.common.theme.AppTheme
import org.meshtastic.core.model.util.formatAgo
+import org.meshtastic.core.ui.theme.AppTheme
@Composable
fun LastHeardInfo(modifier: Modifier = Modifier, lastHeard: Int, currentTimeMillis: Long) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/LinkedCoordinates.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/LinkedCoordinates.kt
index da1f71e95..fd88b65e2 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/node/components/LinkedCoordinates.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/LinkedCoordinates.kt
@@ -41,10 +41,10 @@ import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.core.net.toUri
import com.geeksville.mesh.android.BuildUtils.debug
-import com.geeksville.mesh.ui.common.theme.AppTheme
-import com.geeksville.mesh.ui.common.theme.HyperlinkBlue
import kotlinx.coroutines.launch
import org.meshtastic.core.model.util.GPSFormat
+import org.meshtastic.core.ui.theme.AppTheme
+import org.meshtastic.core.ui.theme.HyperlinkBlue
import java.net.URLEncoder
@OptIn(ExperimentalFoundationApi::class)
diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeFilterTextField.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeFilterTextField.kt
index 6bd2a0ebb..9385719d0 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeFilterTextField.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeFilterTextField.kt
@@ -57,9 +57,9 @@ import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
import com.geeksville.mesh.ui.common.preview.LargeFontPreview
-import com.geeksville.mesh.ui.common.theme.AppTheme
import org.meshtastic.core.database.model.NodeSortOption
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.AppTheme
@Suppress("LongParameterList")
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt
index a6a7e225d..d7cd1dce9 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeItem.kt
@@ -51,14 +51,14 @@ import androidx.compose.ui.unit.dp
import com.geeksville.mesh.ConfigProtos.Config.DeviceConfig
import com.geeksville.mesh.ConfigProtos.Config.DisplayConfig
import com.geeksville.mesh.MeshProtos
-import com.geeksville.mesh.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 org.meshtastic.core.database.model.Node
import org.meshtastic.core.database.model.isUnmessageableRole
import org.meshtastic.core.model.util.toDistanceString
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.BatteryInfo
+import org.meshtastic.core.ui.theme.AppTheme
@Suppress("LongMethod", "CyclomaticComplexMethod")
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeKeyStatusIcon.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeKeyStatusIcon.kt
index d2ec9b688..1b52dd669 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeKeyStatusIcon.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeKeyStatusIcon.kt
@@ -54,14 +54,14 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
-import com.geeksville.mesh.ui.common.components.CopyIconButton
-import com.geeksville.mesh.ui.common.theme.AppTheme
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusGreen
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusYellow
import com.google.protobuf.ByteString
import org.meshtastic.core.model.Channel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.CopyIconButton
+import org.meshtastic.core.ui.theme.AppTheme
+import org.meshtastic.core.ui.theme.StatusColors.StatusGreen
+import org.meshtastic.core.ui.theme.StatusColors.StatusRed
+import org.meshtastic.core.ui.theme.StatusColors.StatusYellow
@Composable
private fun KeyStatusDialog(@StringRes title: Int, @StringRes text: Int, key: ByteString?, onDismiss: () -> Unit = {}) =
diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeMenu.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeMenu.kt
index f06a6e88c..e2d397c3b 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeMenu.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeMenu.kt
@@ -38,10 +38,10 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.ui.common.components.SimpleAlertDialog
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.database.model.isUnmessageableRole
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.SimpleAlertDialog
@Suppress("LongMethod")
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt
index e501318d0..62c85ab3d 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/NodeStatusIcons.kt
@@ -39,10 +39,10 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusGreen
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusYellow
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.StatusColors.StatusGreen
+import org.meshtastic.core.ui.theme.StatusColors.StatusRed
+import org.meshtastic.core.ui.theme.StatusColors.StatusYellow
@Suppress("LongMethod")
@OptIn(ExperimentalMaterial3Api::class)
diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/SatelliteCountInfo.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/SatelliteCountInfo.kt
index cadf0bbde..3f1a87b61 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/node/components/SatelliteCountInfo.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/SatelliteCountInfo.kt
@@ -30,17 +30,14 @@ 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.common.theme.AppTheme
+import org.meshtastic.core.ui.theme.AppTheme
@Composable
-fun SatelliteCountInfo(
- modifier: Modifier = Modifier,
- satCount: Int,
-) {
+fun SatelliteCountInfo(modifier: Modifier = Modifier, satCount: Int) {
Row(
modifier = modifier,
verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.spacedBy(4.dp)
+ horizontalArrangement = Arrangement.spacedBy(4.dp),
) {
Icon(
modifier = Modifier.size(18.dp),
@@ -59,9 +56,5 @@ fun SatelliteCountInfo(
@PreviewLightDark
@Composable
fun SatelliteCountInfoPreview() {
- AppTheme {
- SatelliteCountInfo(
- satCount = 5,
- )
- }
+ AppTheme { SatelliteCountInfo(satCount = 5) }
}
diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/components/TracerouteButton.kt b/app/src/main/java/com/geeksville/mesh/ui/node/components/TracerouteButton.kt
index 1b906a219..0fa4cd49c 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/node/components/TracerouteButton.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/components/TracerouteButton.kt
@@ -34,9 +34,9 @@ import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.ui.common.theme.AppTheme
import com.geeksville.mesh.ui.settings.components.SettingsItem
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.AppTheme
private const val COOL_DOWN_TIME_MS = 30000L
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/SettingsScreen.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/SettingsScreen.kt
index 2191fe922..b652c3379 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/SettingsScreen.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/SettingsScreen.kt
@@ -60,9 +60,6 @@ import com.geeksville.mesh.ClientOnlyProtos.DeviceProfile
import com.geeksville.mesh.android.gpsDisabled
import com.geeksville.mesh.navigation.getNavRouteFrom
import com.geeksville.mesh.ui.common.components.MainAppBar
-import com.geeksville.mesh.ui.common.components.MultipleChoiceAlertDialog
-import com.geeksville.mesh.ui.common.components.TitledCard
-import com.geeksville.mesh.ui.common.theme.MODE_DYNAMIC
import com.geeksville.mesh.ui.node.components.NodeMenuAction
import com.geeksville.mesh.ui.settings.components.SettingsItem
import com.geeksville.mesh.ui.settings.components.SettingsItemDetail
@@ -78,6 +75,9 @@ import com.google.accompanist.permissions.rememberMultiplePermissionsState
import kotlinx.coroutines.delay
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.MultipleChoiceAlertDialog
+import org.meshtastic.core.ui.component.TitledCard
+import org.meshtastic.core.ui.theme.MODE_DYNAMIC
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/components/SettingsItem.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/components/SettingsItem.kt
index 964e2830f..c9f774ea7 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/components/SettingsItem.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/components/SettingsItem.kt
@@ -38,7 +38,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.ui.common.theme.AppTheme
+import org.meshtastic.core.ui.theme.AppTheme
/** A clickable settings button item. */
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfig.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfig.kt
index 3b4e8a0da..9f2f88cb8 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfig.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfig.kt
@@ -44,14 +44,14 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.geeksville.mesh.navigation.ConfigRoute
import com.geeksville.mesh.navigation.ModuleRoute
-import com.geeksville.mesh.ui.common.components.TitledCard
-import com.geeksville.mesh.ui.common.theme.AppTheme
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed
import com.geeksville.mesh.ui.settings.components.SettingsItem
import com.geeksville.mesh.ui.settings.radio.components.WarningDialog
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.TitledCard
+import org.meshtastic.core.ui.theme.AppTheme
+import org.meshtastic.core.ui.theme.StatusColors.StatusRed
@Suppress("LongMethod", "CyclomaticComplexMethod")
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AmbientLightingConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AmbientLightingConfigItemList.kt
index 353e87c38..e0f49b71f 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AmbientLightingConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AmbientLightingConfigItemList.kt
@@ -28,11 +28,11 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.geeksville.mesh.copy
import com.geeksville.mesh.moduleConfig
-import com.geeksville.mesh.ui.common.components.EditTextPreference
-import com.geeksville.mesh.ui.common.components.PreferenceCategory
-import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun AmbientLightingConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AudioConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AudioConfigItemList.kt
index 637bf90a7..837e58240 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AudioConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/AudioConfigItemList.kt
@@ -30,11 +30,11 @@ import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig.AudioConfig
import com.geeksville.mesh.copy
import com.geeksville.mesh.moduleConfig
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.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun AudioConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/BluetoothConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/BluetoothConfigItemList.kt
index 019e34ac5..64d678512 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/BluetoothConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/BluetoothConfigItemList.kt
@@ -30,11 +30,11 @@ import com.geeksville.mesh.ConfigProtos.Config.BluetoothConfig
import com.geeksville.mesh.config
import com.geeksville.mesh.copy
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.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun BluetoothConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/CannedMessageConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/CannedMessageConfigItemList.kt
index dbd2948fa..bb916f935 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/CannedMessageConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/CannedMessageConfigItemList.kt
@@ -36,11 +36,11 @@ import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig.CannedMessageConfig
import com.geeksville.mesh.copy
import com.geeksville.mesh.moduleConfig
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.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun CannedMessageConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ChannelSettingsItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ChannelSettingsItemList.kt
index e76c97a68..32cdd57ef 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ChannelSettingsItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ChannelSettingsItemList.kt
@@ -73,16 +73,16 @@ import androidx.navigation.NavController
import com.geeksville.mesh.ChannelProtos.ChannelSettings
import com.geeksville.mesh.ConfigProtos.Config.LoRaConfig
import com.geeksville.mesh.channelSettings
-import com.geeksville.mesh.ui.common.components.PreferenceCategory
-import com.geeksville.mesh.ui.common.components.PreferenceFooter
import com.geeksville.mesh.ui.common.components.SecurityIcon
-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.settings.radio.RadioConfigViewModel
import org.meshtastic.core.model.Channel
import org.meshtastic.core.model.DeviceVersion
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.PreferenceFooter
+import org.meshtastic.core.ui.component.dragContainer
+import org.meshtastic.core.ui.component.dragDropItemsIndexed
+import org.meshtastic.core.ui.component.rememberDragDropState
@Composable
private fun ChannelItem(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DetectionSensorConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DetectionSensorConfigItemList.kt
index 3e680d42c..77efbb1cc 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DetectionSensorConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DetectionSensorConfigItemList.kt
@@ -33,11 +33,11 @@ import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig
import com.geeksville.mesh.copy
import com.geeksville.mesh.moduleConfig
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.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun DetectionSensorConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DeviceConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DeviceConfigItemList.kt
index 33b3be14c..eb5ac6771 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DeviceConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DeviceConfigItemList.kt
@@ -51,11 +51,11 @@ import com.geeksville.mesh.ConfigProtos.Config.DeviceConfig
import com.geeksville.mesh.config
import com.geeksville.mesh.copy
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.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
private val DeviceConfig.Role.description: Int
get() =
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DisplayConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DisplayConfigItemList.kt
index 15a27f2bd..07c95e42c 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DisplayConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/DisplayConfigItemList.kt
@@ -30,11 +30,11 @@ import com.geeksville.mesh.ConfigProtos.Config.DisplayConfig
import com.geeksville.mesh.config
import com.geeksville.mesh.copy
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.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun DisplayConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditChannelDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditChannelDialog.kt
index 72926d5cd..4927b01cf 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditChannelDialog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditChannelDialog.kt
@@ -46,11 +46,11 @@ import com.geeksville.mesh.ChannelProtos
import com.geeksville.mesh.channelSettings
import com.geeksville.mesh.copy
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
import org.meshtastic.core.model.Channel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.SwitchPreference
@Suppress("LongMethod")
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditDeviceProfileDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditDeviceProfileDialog.kt
index 85ca5957e..b9601e168 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditDeviceProfileDialog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/EditDeviceProfileDialog.kt
@@ -41,9 +41,9 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.geeksville.mesh.ClientOnlyProtos.DeviceProfile
-import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.google.protobuf.Descriptors
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.SwitchPreference
private const val SUPPORTED_FIELDS = 7
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ExternalNotificationConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ExternalNotificationConfigItemList.kt
index 3cbd75eee..c35c3a4c7 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ExternalNotificationConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/ExternalNotificationConfigItemList.kt
@@ -34,12 +34,12 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.geeksville.mesh.copy
import com.geeksville.mesh.moduleConfig
-import com.geeksville.mesh.ui.common.components.EditTextPreference
-import com.geeksville.mesh.ui.common.components.PreferenceCategory
-import com.geeksville.mesh.ui.common.components.SwitchPreference
-import com.geeksville.mesh.ui.common.components.TextDividerPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
+import org.meshtastic.core.ui.component.TextDividerPreference
@Composable
fun ExternalNotificationConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/LoRaConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/LoRaConfigItemList.kt
index 90a9c8cdc..7d195ab81 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/LoRaConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/LoRaConfigItemList.kt
@@ -33,15 +33,15 @@ import com.geeksville.mesh.ConfigProtos.Config.LoRaConfig
import com.geeksville.mesh.config
import com.geeksville.mesh.copy
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.SignedIntegerEditTextPreference
-import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.model.Channel
import org.meshtastic.core.model.RegionInfo
import org.meshtastic.core.model.numChannels
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SignedIntegerEditTextPreference
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun LoRaConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MQTTConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MQTTConfigItemList.kt
index a9eeef776..01cadf8e8 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MQTTConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MQTTConfigItemList.kt
@@ -33,12 +33,12 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.geeksville.mesh.copy
import com.geeksville.mesh.moduleConfig
-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.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditPasswordPreference
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun MQTTConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MapReportingPreference.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MapReportingPreference.kt
index 3f25efd56..b1909ee8c 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MapReportingPreference.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/MapReportingPreference.kt
@@ -40,12 +40,12 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.ui.common.components.EditTextPreference
-import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.geeksville.mesh.ui.common.components.precisionBitsToMeters
import org.meshtastic.core.model.util.DistanceUnit
import org.meshtastic.core.model.util.toDistanceString
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.SwitchPreference
import kotlin.math.roundToInt
private const val POSITION_PRECISION_MIN = 12
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NeighborInfoConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NeighborInfoConfigItemList.kt
index 82f82d51a..d09d870a7 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NeighborInfoConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NeighborInfoConfigItemList.kt
@@ -28,11 +28,11 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.geeksville.mesh.copy
import com.geeksville.mesh.moduleConfig
-import com.geeksville.mesh.ui.common.components.EditTextPreference
-import com.geeksville.mesh.ui.common.components.PreferenceCategory
-import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun NeighborInfoConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NetworkConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NetworkConfigItemList.kt
index 579efb9b6..93a5035e3 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NetworkConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/NetworkConfigItemList.kt
@@ -44,16 +44,16 @@ import com.geeksville.mesh.ConfigProtos.Config.NetworkConfig
import com.geeksville.mesh.config
import com.geeksville.mesh.copy
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.SimpleAlertDialog
-import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanOptions
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditIPv4Preference
+import org.meshtastic.core.ui.component.EditPasswordPreference
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SimpleAlertDialog
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
private fun ScanErrorDialog(onDismiss: () -> Unit = {}) =
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PaxcounterConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PaxcounterConfigItemList.kt
index 458bde52c..d5d635b2f 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PaxcounterConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PaxcounterConfigItemList.kt
@@ -28,12 +28,12 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.geeksville.mesh.copy
import com.geeksville.mesh.moduleConfig
-import com.geeksville.mesh.ui.common.components.EditTextPreference
-import com.geeksville.mesh.ui.common.components.PreferenceCategory
-import com.geeksville.mesh.ui.common.components.SignedIntegerEditTextPreference
-import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SignedIntegerEditTextPreference
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun PaxcounterConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PositionConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PositionConfigItemList.kt
index c01292eec..68e0cb0df 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PositionConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PositionConfigItemList.kt
@@ -43,17 +43,17 @@ import com.geeksville.mesh.ConfigProtos
import com.geeksville.mesh.ConfigProtos.Config.PositionConfig
import com.geeksville.mesh.config
import com.geeksville.mesh.copy
-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.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.rememberPermissionState
import kotlinx.coroutines.launch
import org.meshtastic.core.model.Position
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.BitwisePreference
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@OptIn(ExperimentalPermissionsApi::class)
@Composable
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PowerConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PowerConfigItemList.kt
index 5f538beef..5e18b4a6d 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PowerConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/PowerConfigItemList.kt
@@ -28,11 +28,11 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.geeksville.mesh.config
import com.geeksville.mesh.copy
-import com.geeksville.mesh.ui.common.components.EditTextPreference
-import com.geeksville.mesh.ui.common.components.PreferenceCategory
-import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun PowerConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RadioConfigScreenList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RadioConfigScreenList.kt
index e70c2ff9d..663629128 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RadioConfigScreenList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RadioConfigScreenList.kt
@@ -26,9 +26,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalFocusManager
import com.geeksville.mesh.ui.common.components.MainAppBar
-import com.geeksville.mesh.ui.common.components.PreferenceFooter
import com.geeksville.mesh.ui.settings.radio.ResponseState
import com.google.protobuf.MessageLite
+import org.meshtastic.core.ui.component.PreferenceFooter
@Composable
fun RadioConfigScreenList(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RangeTestConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RangeTestConfigItemList.kt
index 0ba8567bd..11d54dd81 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RangeTestConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RangeTestConfigItemList.kt
@@ -28,11 +28,11 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.geeksville.mesh.copy
import com.geeksville.mesh.moduleConfig
-import com.geeksville.mesh.ui.common.components.EditTextPreference
-import com.geeksville.mesh.ui.common.components.PreferenceCategory
-import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun RangeTestConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RemoteHardwareConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RemoteHardwareConfigItemList.kt
index d641a073d..a0d4b40f1 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RemoteHardwareConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/RemoteHardwareConfigItemList.kt
@@ -29,10 +29,10 @@ import androidx.navigation.NavController
import com.geeksville.mesh.copy
import com.geeksville.mesh.moduleConfig
import com.geeksville.mesh.ui.common.components.EditListPreference
-import com.geeksville.mesh.ui.common.components.PreferenceCategory
-import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun RemoteHardwareConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SecurityConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SecurityConfigItemList.kt
index 41b241c49..afe596b7e 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SecurityConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SecurityConfigItemList.kt
@@ -46,17 +46,17 @@ import androidx.navigation.NavController
import com.geeksville.mesh.ConfigProtos.Config.SecurityConfig
import com.geeksville.mesh.config
import com.geeksville.mesh.copy
-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.SwitchPreference
import com.geeksville.mesh.ui.node.NodeActionButton
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import com.geeksville.mesh.util.encodeToString
import com.geeksville.mesh.util.toByteString
import com.google.protobuf.ByteString
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.CopyIconButton
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
import java.security.SecureRandom
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SerialConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SerialConfigItemList.kt
index 54c619cfd..d306362ee 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SerialConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/SerialConfigItemList.kt
@@ -30,11 +30,11 @@ import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig.SerialConfig
import com.geeksville.mesh.copy
import com.geeksville.mesh.moduleConfig
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.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun SerialConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/StoreForwardConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/StoreForwardConfigItemList.kt
index 4abcdacaa..ad88360a1 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/StoreForwardConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/StoreForwardConfigItemList.kt
@@ -28,11 +28,11 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.geeksville.mesh.copy
import com.geeksville.mesh.moduleConfig
-import com.geeksville.mesh.ui.common.components.EditTextPreference
-import com.geeksville.mesh.ui.common.components.PreferenceCategory
-import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun StoreForwardConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/TelemetryConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/TelemetryConfigItemList.kt
index 778c7b9b4..777714ece 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/TelemetryConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/TelemetryConfigItemList.kt
@@ -28,11 +28,11 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.geeksville.mesh.copy
import com.geeksville.mesh.moduleConfig
-import com.geeksville.mesh.ui.common.components.EditTextPreference
-import com.geeksville.mesh.ui.common.components.PreferenceCategory
-import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun TelemetryConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/UserConfigItemList.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/UserConfigItemList.kt
index b1102879e..9be4f52a8 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/UserConfigItemList.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/UserConfigItemList.kt
@@ -30,14 +30,14 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import com.geeksville.mesh.copy
-import com.geeksville.mesh.ui.common.components.EditTextPreference
-import com.geeksville.mesh.ui.common.components.PreferenceCategory
-import com.geeksville.mesh.ui.common.components.RegularPreference
-import com.geeksville.mesh.ui.common.components.SwitchPreference
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import org.meshtastic.core.database.model.isUnmessageableRole
import org.meshtastic.core.model.DeviceVersion
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.EditTextPreference
+import org.meshtastic.core.ui.component.PreferenceCategory
+import org.meshtastic.core.ui.component.RegularPreference
+import org.meshtastic.core.ui.component.SwitchPreference
@Composable
fun UserConfigScreen(navController: NavController, viewModel: RadioConfigViewModel = hiltViewModel()) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/WarningDialog.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/WarningDialog.kt
index 71f14c8ee..71cc9e527 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/WarningDialog.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/components/WarningDialog.kt
@@ -28,8 +28,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
-import com.geeksville.mesh.ui.common.theme.AppTheme
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.AppTheme
@Composable
fun WarningDialog(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/sharing/Channel.kt b/app/src/main/java/com/geeksville/mesh/ui/sharing/Channel.kt
index 213e52e1e..92441f3be 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/sharing/Channel.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/sharing/Channel.kt
@@ -102,8 +102,6 @@ import com.geeksville.mesh.model.toChannelSet
import com.geeksville.mesh.navigation.ConfigRoute
import com.geeksville.mesh.navigation.getNavRouteFrom
import com.geeksville.mesh.service.ConnectionState
-import com.geeksville.mesh.ui.common.components.AdaptiveTwoPane
-import com.geeksville.mesh.ui.common.components.PreferenceFooter
import com.geeksville.mesh.ui.settings.radio.RadioConfigViewModel
import com.geeksville.mesh.ui.settings.radio.components.ChannelSelection
import com.geeksville.mesh.ui.settings.radio.components.PacketResponseStateDialog
@@ -116,6 +114,8 @@ import kotlinx.coroutines.launch
import org.meshtastic.core.model.Channel
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.AdaptiveTwoPane
+import org.meshtastic.core.ui.component.PreferenceFooter
/**
* Composable screen for managing and sharing Meshtastic channels. Allows users to view, edit, and share channel
diff --git a/app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt b/app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt
index e87053532..e07a6319e 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/sharing/ContactSharing.kt
@@ -55,8 +55,6 @@ import com.geeksville.mesh.MeshProtos
import com.geeksville.mesh.android.BuildUtils.debug
import com.geeksville.mesh.android.BuildUtils.errormsg
import com.geeksville.mesh.model.UIViewModel
-import com.geeksville.mesh.ui.common.components.CopyIconButton
-import com.geeksville.mesh.ui.common.components.SimpleAlertDialog
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.isGranted
import com.google.accompanist.permissions.rememberPermissionState
@@ -71,6 +69,8 @@ import com.journeyapps.barcodescanner.ScanOptions
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.model.DeviceVersion
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.component.CopyIconButton
+import org.meshtastic.core.ui.component.SimpleAlertDialog
import timber.log.Timber
import java.net.MalformedURLException
diff --git a/app/src/main/java/com/geeksville/mesh/ui/sharing/Share.kt b/app/src/main/java/com/geeksville/mesh/ui/sharing/Share.kt
index f649250d4..4681e8d22 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/sharing/Share.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/sharing/Share.kt
@@ -41,9 +41,9 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.geeksville.mesh.model.Contact
import com.geeksville.mesh.model.UIViewModel
-import com.geeksville.mesh.ui.common.theme.AppTheme
import com.geeksville.mesh.ui.contact.ContactItem
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.AppTheme
@Composable
fun ShareScreen(viewModel: UIViewModel = hiltViewModel(), onConfirm: (String) -> Unit) {
diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts
new file mode 100644
index 000000000..a8c2c92ad
--- /dev/null
+++ b/core/ui/build.gradle.kts
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2025 Meshtastic LLC
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+plugins {
+ alias(libs.plugins.meshtastic.android.library)
+ alias(libs.plugins.meshtastic.android.library.compose)
+}
+
+android { namespace = "org.meshtastic.core.ui" }
+
+dependencies {
+ implementation(projects.core.strings)
+ implementation(libs.bundles.markdown)
+}
diff --git a/core/ui/detekt-baseline.xml b/core/ui/detekt-baseline.xml
new file mode 100644
index 000000000..542ca69e7
--- /dev/null
+++ b/core/ui/detekt-baseline.xml
@@ -0,0 +1,57 @@
+
+
+
+
+ ComposableParamOrder:AlertDialogs.kt$SimpleAlertDialog
+ ComposableParamOrder:BatteryInfo.kt$BatteryInfo
+ ComposableParamOrder:EditTextPreference.kt$EditTextPreference
+ ComposableParamOrder:MaterialBatteryInfo.kt$MaterialBatteryInfo
+ ComposableParamOrder:SwitchPreference.kt$SwitchPreference
+ ContentSlotReused:AdaptiveTwoPane.kt$second
+ MagicNumber:BatteryInfo.kt$100
+ MagicNumber:BatteryInfo.kt$101
+ MagicNumber:BatteryInfo.kt$14
+ MagicNumber:BatteryInfo.kt$15
+ MagicNumber:BatteryInfo.kt$34
+ MagicNumber:BatteryInfo.kt$35
+ MagicNumber:BatteryInfo.kt$4
+ MagicNumber:BatteryInfo.kt$5
+ MagicNumber:BatteryInfo.kt$79
+ MagicNumber:BatteryInfo.kt$80
+ MagicNumber:EditIPv4Preference.kt$0xff
+ MagicNumber:EditIPv4Preference.kt$16
+ MagicNumber:EditIPv4Preference.kt$24
+ MagicNumber:EditIPv4Preference.kt$8
+ MagicNumber:LazyColumnDragAndDropDemo.kt$50
+ ModifierMissing:AdaptiveTwoPane.kt$AdaptiveTwoPane
+ ModifierMissing:IndoorAirQuality.kt$IndoorAirQuality
+ ModifierMissing:LoraSignalIndicator.kt$LoraSignalIndicator
+ ModifierMissing:LoraSignalIndicator.kt$Rssi
+ ModifierMissing:LoraSignalIndicator.kt$Snr
+ ModifierMissing:LoraSignalIndicator.kt$SnrAndRssi
+ ModifierMissing:SimpleAlertDialog.kt$SimpleAlertDialog
+ ModifierMissing:SlidingSelector.kt$OptionLabel
+ ModifierNotUsedAtRoot:TextDividerPreference.kt$modifier = modifier.fillMaxWidth().padding(all = 16.dp)
+ ModifierNotUsedAtRoot:TextDividerPreference.kt$modifier = modifier.fillMaxWidth().wrapContentWidth(Alignment.End)
+ ModifierReused:PreferenceCategory.kt$Card(modifier = modifier.padding(bottom = 8.dp)) { Column( modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 16.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { ProvideTextStyle(MaterialTheme.typography.bodyLarge) { content() } } }
+ ModifierReused:PreferenceCategory.kt$Text( text, modifier = modifier.padding(start = 16.dp, top = 24.dp, bottom = 8.dp, end = 16.dp), style = MaterialTheme.typography.titleLarge, )
+ ModifierReused:TextDividerPreference.kt$Card(modifier = modifier.fillMaxWidth()) { Row(modifier = modifier.fillMaxWidth().padding(all = 16.dp), verticalAlignment = Alignment.CenterVertically) { Text( text = title, style = MaterialTheme.typography.bodyLarge, color = if (!enabled) { MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) } else { Color.Unspecified }, ) if (trailingIcon != null) { Icon(trailingIcon, "trailingIcon", modifier = modifier.fillMaxWidth().wrapContentWidth(Alignment.End)) } } }
+ ModifierReused:TextDividerPreference.kt$Icon(trailingIcon, "trailingIcon", modifier = modifier.fillMaxWidth().wrapContentWidth(Alignment.End))
+ ModifierReused:TextDividerPreference.kt$Row(modifier = modifier.fillMaxWidth().padding(all = 16.dp), verticalAlignment = Alignment.CenterVertically) { Text( text = title, style = MaterialTheme.typography.bodyLarge, color = if (!enabled) { MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) } else { Color.Unspecified }, ) if (trailingIcon != null) { Icon(trailingIcon, "trailingIcon", modifier = modifier.fillMaxWidth().wrapContentWidth(Alignment.End)) } }
+ MultipleEmitters:PreferenceCategory.kt$PreferenceCategory
+ ParameterNaming:BitwisePreference.kt$onItemSelected
+ ParameterNaming:EditIPv4Preference.kt$onValueChanged
+ ParameterNaming:EditPasswordPreference.kt$onValueChanged
+ ParameterNaming:EditTextPreference.kt$onValueChanged
+ ParameterNaming:PreferenceFooter.kt$onCancelClicked
+ ParameterNaming:PreferenceFooter.kt$onNegativeClicked
+ ParameterNaming:PreferenceFooter.kt$onPositiveClicked
+ ParameterNaming:PreferenceFooter.kt$onSaveClicked
+ ParameterNaming:SlidingSelector.kt$onOptionSelected
+ PreviewPublic:BatteryInfo.kt$BatteryInfoPreview
+ PreviewPublic:BatteryInfo.kt$BatteryInfoPreviewSimple
+ PreviewPublic:IndoorAirQuality.kt$IAQScalePreview
+ PreviewPublic:LazyColumnDragAndDropDemo.kt$LazyColumnDragAndDropDemo
+ PreviewPublic:MaterialBatteryInfo.kt$MaterialBatteryInfoPreview
+
+
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/AdaptiveTwoPane.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/AdaptiveTwoPane.kt
similarity index 71%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/AdaptiveTwoPane.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/AdaptiveTwoPane.kt
index 6b0211d14..86e7d3bdb 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/AdaptiveTwoPane.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/AdaptiveTwoPane.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column
@@ -26,24 +26,20 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@Composable
-fun AdaptiveTwoPane(
- first: @Composable ColumnScope.() -> Unit,
- second: @Composable ColumnScope.() -> Unit,
-) = BoxWithConstraints {
- val compactWidth = maxWidth < 600.dp
- Row {
- Column(modifier = Modifier.weight(1f)) {
- first()
-
- if (compactWidth) {
- second()
- }
- }
-
- if (!compactWidth) {
+fun AdaptiveTwoPane(first: @Composable ColumnScope.() -> Unit, second: @Composable ColumnScope.() -> Unit) =
+ BoxWithConstraints {
+ val compactWidth = maxWidth < 600.dp
+ Row {
Column(modifier = Modifier.weight(1f)) {
- second()
+ first()
+
+ if (compactWidth) {
+ second()
+ }
+ }
+
+ if (!compactWidth) {
+ Column(modifier = Modifier.weight(1f)) { second() }
}
}
}
-}
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/AlertDialogs.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/AlertDialogs.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/AlertDialogs.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/AlertDialogs.kt
index 4af4bd306..293de6e77 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/AlertDialogs.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/AlertDialogs.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/BatteryInfo.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/BatteryInfo.kt
similarity index 96%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/BatteryInfo.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/BatteryInfo.kt
index a2f17c0bf..845d1560c 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/BatteryInfo.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/BatteryInfo.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.height
@@ -32,8 +32,8 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.R
-import com.geeksville.mesh.ui.common.theme.AppTheme
+import org.meshtastic.core.ui.R
+import org.meshtastic.core.ui.theme.AppTheme
@Composable
fun BatteryInfo(modifier: Modifier = Modifier, batteryLevel: Int?, voltage: Float?) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/BitwisePreference.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/BitwisePreference.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/BitwisePreference.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/BitwisePreference.kt
index 8b402eb01..8e3ac0c1b 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/BitwisePreference.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/BitwisePreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/BottomSheetDialog.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/BottomSheetDialog.kt
similarity index 85%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/BottomSheetDialog.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/BottomSheetDialog.kt
index 321b0a282..427a02653 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/BottomSheetDialog.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/BottomSheetDialog.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
@@ -40,30 +40,28 @@ import androidx.compose.ui.window.DialogProperties
fun BottomSheetDialog(
onDismiss: () -> Unit,
modifier: Modifier = Modifier,
- content: @Composable ColumnScope.() -> Unit
-) = Dialog(
- onDismissRequest = onDismiss,
- properties = DialogProperties(usePlatformDefaultWidth = false),
-) {
+ content: @Composable ColumnScope.() -> Unit,
+) = Dialog(onDismissRequest = onDismiss, properties = DialogProperties(usePlatformDefaultWidth = false)) {
Box(
- modifier = Modifier
- .fillMaxSize()
+ modifier =
+ Modifier.fillMaxSize()
.background(Color.Transparent)
.clickable(
onClick = onDismiss,
indication = null,
- interactionSource = remember { MutableInteractionSource() }
- )
+ interactionSource = remember { MutableInteractionSource() },
+ ),
) {
Column(
- modifier = modifier
+ modifier =
+ modifier
.align(Alignment.BottomCenter)
.background(
color = MaterialTheme.colorScheme.surface.copy(alpha = 1f),
- shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp)
+ shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp),
)
.padding(16.dp),
- content = content
+ content = content,
)
}
}
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/ClickableTextField.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/ClickableTextField.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/ClickableTextField.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/ClickableTextField.kt
index 4ea5e9143..645494269 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/ClickableTextField.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/ClickableTextField.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.annotation.StringRes
import androidx.compose.foundation.interaction.MutableInteractionSource
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/CopyIconButton.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/CopyIconButton.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/CopyIconButton.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/CopyIconButton.kt
index 90c795cd5..e9ba5b624 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/CopyIconButton.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/CopyIconButton.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import android.content.ClipData
import androidx.compose.material.icons.Icons
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditIPv4Preference.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditIPv4Preference.kt
similarity index 79%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/EditIPv4Preference.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditIPv4Preference.kt
index dfc92a198..c4cc47ccb 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditIPv4Preference.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditIPv4Preference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
@@ -40,15 +40,14 @@ fun EditIPv4Preference(
) {
val pattern = """\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b""".toRegex()
- fun convertIntToIpAddress(int: Int): String {
- return "${int and 0xff}.${int shr 8 and 0xff}.${int shr 16 and 0xff}.${int shr 24 and 0xff}"
- }
+ fun convertIntToIpAddress(int: Int): String =
+ "${int and 0xff}.${int shr 8 and 0xff}.${int shr 16 and 0xff}.${int shr 24 and 0xff}"
- fun convertIpAddressToInt(ipAddress: String): Int? = ipAddress.split(".")
- .map { it.toIntOrNull() }.reversed() // little-endian byte order
- .fold(0) { total, next ->
- if (next == null) return null else total shl 8 or next
- }
+ fun convertIpAddressToInt(ipAddress: String): Int? = ipAddress
+ .split(".")
+ .map { it.toIntOrNull() }
+ .reversed() // little-endian byte order
+ .fold(0) { total, next -> if (next == null) return null else total shl 8 or next }
var valueState by remember(value) { mutableStateOf(convertIntToIpAddress(value)) }
@@ -57,16 +56,14 @@ fun EditIPv4Preference(
value = valueState,
enabled = enabled,
isError = convertIntToIpAddress(value) != valueState,
- keyboardOptions = KeyboardOptions.Default.copy(
- keyboardType = KeyboardType.Number, imeAction = ImeAction.Done
- ),
+ keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number, imeAction = ImeAction.Done),
keyboardActions = keyboardActions,
onValueChanged = {
valueState = it
if (pattern.matches(it)) convertIpAddressToInt(it)?.let { int -> onValueChanged(int) }
},
onFocusChanged = {},
- modifier = modifier
+ modifier = modifier,
)
}
@@ -78,6 +75,6 @@ private fun EditIPv4PreferencePreview() {
value = 16820416,
enabled = true,
keyboardActions = KeyboardActions {},
- onValueChanged = {}
+ onValueChanged = {},
)
}
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditPasswordPreference.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditPasswordPreference.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/EditPasswordPreference.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditPasswordPreference.kt
index b4a1ee49d..930ea8f3f 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditPasswordPreference.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditPasswordPreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditTextPreference.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditTextPreference.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/EditTextPreference.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditTextPreference.kt
index ce3e0ed8a..16a292a3f 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/EditTextPreference.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/EditTextPreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/IndoorAirQuality.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/IndoorAirQuality.kt
similarity index 95%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/IndoorAirQuality.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/IndoorAirQuality.kt
index ec6f0d73a..f8d4fbe9b 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/IndoorAirQuality.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/IndoorAirQuality.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
@@ -57,15 +57,15 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
-import com.geeksville.mesh.ui.common.theme.IAQColors.IAQDangerouslyPolluted
-import com.geeksville.mesh.ui.common.theme.IAQColors.IAQExcellent
-import com.geeksville.mesh.ui.common.theme.IAQColors.IAQExtremelyPolluted
-import com.geeksville.mesh.ui.common.theme.IAQColors.IAQGood
-import com.geeksville.mesh.ui.common.theme.IAQColors.IAQHeavilyPolluted
-import com.geeksville.mesh.ui.common.theme.IAQColors.IAQLightlyPolluted
-import com.geeksville.mesh.ui.common.theme.IAQColors.IAQModeratelyPolluted
-import com.geeksville.mesh.ui.common.theme.IAQColors.IAQSeverelyPolluted
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.IAQColors.IAQDangerouslyPolluted
+import org.meshtastic.core.ui.theme.IAQColors.IAQExcellent
+import org.meshtastic.core.ui.theme.IAQColors.IAQExtremelyPolluted
+import org.meshtastic.core.ui.theme.IAQColors.IAQGood
+import org.meshtastic.core.ui.theme.IAQColors.IAQHeavilyPolluted
+import org.meshtastic.core.ui.theme.IAQColors.IAQLightlyPolluted
+import org.meshtastic.core.ui.theme.IAQColors.IAQModeratelyPolluted
+import org.meshtastic.core.ui.theme.IAQColors.IAQSeverelyPolluted
@Suppress("MagicNumber")
enum class Iaq(val color: Color, val description: String, val range: IntRange) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/LazyColumnDragAndDropDemo.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/LazyColumnDragAndDropDemo.kt
similarity index 71%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/LazyColumnDragAndDropDemo.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/LazyColumnDragAndDropDemo.kt
index 0548ef87e..825a9e77e 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/LazyColumnDragAndDropDemo.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/LazyColumnDragAndDropDemo.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.Spring
@@ -60,43 +60,36 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.launch
-// Derived in part from: https://github.com/androidx/androidx/blob/c92ad2941368202b2d78b8d14c71bf81e9525944/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LazyColumnDragAndDropDemo.kt
+// Derived in part from:
+// https://github.com/androidx/androidx/blob/c92ad2941368202b2d78b8d14c71bf81e9525944/compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/LazyColumnDragAndDropDemo.kt
@Preview
@Composable
fun LazyColumnDragAndDropDemo() {
var list by remember { mutableStateOf(List(50) { it }) }
val listState = rememberLazyListState()
- val dragDropState = rememberDragDropState(listState, headerCount = 1) { fromIndex, toIndex ->
- if (fromIndex in list.indices && toIndex in list.indices) {
- list = list.toMutableList().apply { add(toIndex, removeAt(fromIndex)) }
- }
- }
-
- LazyColumn(
- modifier = Modifier.dragContainer(
- dragDropState = dragDropState,
- haptics = LocalHapticFeedback.current,
- ),
- state = listState,
- contentPadding = PaddingValues(16.dp),
- verticalArrangement = Arrangement.spacedBy(16.dp)
- ) {
- item {
- Text("Header", Modifier.fillMaxWidth().padding(20.dp))
- }
-
- itemsIndexed(list, key = { _, item -> item }) { index, item ->
- DraggableItem(dragDropState, index + 1) { isDragging ->
- Card {
- Text("Item $item", Modifier.fillMaxWidth().padding(20.dp))
- }
+ val dragDropState =
+ rememberDragDropState(listState, headerCount = 1) { fromIndex, toIndex ->
+ if (fromIndex in list.indices && toIndex in list.indices) {
+ list = list.toMutableList().apply { add(toIndex, removeAt(fromIndex)) }
}
}
- item {
- Text("Footer", Modifier.fillMaxWidth().padding(20.dp))
+ LazyColumn(
+ modifier = Modifier.dragContainer(dragDropState = dragDropState, haptics = LocalHapticFeedback.current),
+ state = listState,
+ contentPadding = PaddingValues(16.dp),
+ verticalArrangement = Arrangement.spacedBy(16.dp),
+ ) {
+ item { Text("Header", Modifier.fillMaxWidth().padding(20.dp)) }
+
+ itemsIndexed(list, key = { _, item -> item }) { index, item ->
+ DraggableItem(dragDropState, index + 1) { isDragging ->
+ Card { Text("Item $item", Modifier.fillMaxWidth().padding(20.dp)) }
+ }
}
+
+ item { Text("Footer", Modifier.fillMaxWidth().padding(20.dp)) }
}
}
@@ -104,7 +97,7 @@ fun LazyColumnDragAndDropDemo() {
fun rememberDragDropState(
lazyListState: LazyListState,
headerCount: Int = 0,
- onMove: (Int, Int) -> Unit
+ onMove: (Int, Int) -> Unit,
): DragDropState {
val scope = rememberCoroutineScope()
val state = remember(lazyListState) { DragDropState(lazyListState, headerCount, scope, onMove) }
@@ -122,19 +115,20 @@ internal constructor(
private val state: LazyListState,
private val headerCount: Int,
private val scope: CoroutineScope,
- private val onMove: (Int, Int) -> Unit
+ private val onMove: (Int, Int) -> Unit,
) {
private var draggingItemIndex by mutableStateOf(null)
- val adjustedItemIndex get() = draggingItemIndex?.minus(headerCount)
+ val adjustedItemIndex
+ get() = draggingItemIndex?.minus(headerCount)
internal val scrollChannel = Channel()
private var draggingItemDraggedDelta by mutableFloatStateOf(0f)
private var draggingItemInitialOffset by mutableIntStateOf(0)
internal val draggingItemOffset: Float
- get() = draggingItemLayoutInfo?.let { item ->
- draggingItemInitialOffset + draggingItemDraggedDelta - item.offset
- } ?: 0f
+ get() =
+ draggingItemLayoutInfo?.let { item -> draggingItemInitialOffset + draggingItemDraggedDelta - item.offset }
+ ?: 0f
private val draggingItemLayoutInfo: LazyListItemInfo?
get() = state.layoutInfo.visibleItemsInfo.firstOrNull { it.index == draggingItemIndex }
@@ -146,7 +140,7 @@ internal constructor(
private set
internal fun onDragStart(offset: Offset): LazyListItemInfo? = state.layoutInfo.visibleItemsInfo
- .filter { it.contentType == DragDropContentType }
+ .filter { it.contentType == DRAG_DROP_CONTENT_TYPE }
.firstOrNull { item -> offset.y.toInt() in item.offset..(item.offset + item.size) }
?.also {
draggingItemIndex = it.index
@@ -161,7 +155,7 @@ internal constructor(
previousItemOffset.snapTo(startOffset)
previousItemOffset.animateTo(
0f,
- spring(stiffness = Spring.StiffnessMediumLow, visibilityThreshold = 1f)
+ spring(stiffness = Spring.StiffnessMediumLow, visibilityThreshold = 1f),
)
previousIndexOfDraggedItem = null
}
@@ -179,33 +173,26 @@ internal constructor(
val endOffset = startOffset + draggingItem.size
val middleOffset = startOffset + (endOffset - startOffset) / 2f
- val targetItem = state.layoutInfo.visibleItemsInfo
- .find { item ->
- middleOffset.toInt() in item.offset..item.offsetEnd &&
- draggingItem.index != item.index
+ val targetItem =
+ state.layoutInfo.visibleItemsInfo.find { item ->
+ middleOffset.toInt() in item.offset..item.offsetEnd && draggingItem.index != item.index
}
if (targetItem != null) {
- if (
- draggingItem.index == state.firstVisibleItemIndex ||
- targetItem.index == state.firstVisibleItemIndex
- ) {
- state.requestScrollToItem(
- state.firstVisibleItemIndex,
- state.firstVisibleItemScrollOffset
- )
+ if (draggingItem.index == state.firstVisibleItemIndex || targetItem.index == state.firstVisibleItemIndex) {
+ state.requestScrollToItem(state.firstVisibleItemIndex, state.firstVisibleItemScrollOffset)
}
onMove.invoke(draggingItem.index - headerCount, targetItem.index - headerCount)
draggingItemIndex = targetItem.index
} else {
- val overscroll = when {
- draggingItemDraggedDelta > 0 ->
- (endOffset - state.layoutInfo.viewportEndOffset).coerceAtLeast(0f)
+ val overscroll =
+ when {
+ draggingItemDraggedDelta > 0 -> (endOffset - state.layoutInfo.viewportEndOffset).coerceAtLeast(0f)
- draggingItemDraggedDelta < 0 ->
- (startOffset - state.layoutInfo.viewportStartOffset).coerceAtMost(0f)
+ draggingItemDraggedDelta < 0 ->
+ (startOffset - state.layoutInfo.viewportStartOffset).coerceAtMost(0f)
- else -> 0f
- }
+ else -> 0f
+ }
if (overscroll != 0f) {
scrollChannel.trySend(overscroll)
}
@@ -216,10 +203,7 @@ internal constructor(
get() = this.offset + this.size
}
-fun Modifier.dragContainer(
- dragDropState: DragDropState,
- haptics: HapticFeedback,
-): Modifier {
+fun Modifier.dragContainer(dragDropState: DragDropState, haptics: HapticFeedback): Modifier {
return this.pointerInput(dragDropState) {
detectDragGesturesAfterLongPress(
onDrag = { change, offset ->
@@ -231,7 +215,7 @@ fun Modifier.dragContainer(
haptics.performHapticFeedback(HapticFeedbackType.LongPress)
},
onDragEnd = { dragDropState.onDragInterrupted() },
- onDragCancel = { dragDropState.onDragInterrupted() }
+ onDragCancel = { dragDropState.onDragInterrupted() },
)
}
}
@@ -241,45 +225,42 @@ fun LazyItemScope.DraggableItem(
dragDropState: DragDropState,
index: Int,
modifier: Modifier = Modifier,
- content: @Composable ColumnScope.(isDragging: Boolean) -> Unit
+ content: @Composable ColumnScope.(isDragging: Boolean) -> Unit,
) {
val dragging = index == dragDropState.adjustedItemIndex
- val draggingModifier = if (dragging) {
- Modifier
- .zIndex(1f)
- .graphicsLayer { translationY = dragDropState.draggingItemOffset }
- } else if (index == dragDropState.previousIndexOfDraggedItem) {
- Modifier
- .zIndex(1f)
- .graphicsLayer { translationY = dragDropState.previousItemOffset.value }
- } else {
- Modifier.animateItem(fadeInSpec = null, fadeOutSpec = null)
- }
+ val draggingModifier =
+ if (dragging) {
+ Modifier.zIndex(1f).graphicsLayer { translationY = dragDropState.draggingItemOffset }
+ } else if (index == dragDropState.previousIndexOfDraggedItem) {
+ Modifier.zIndex(1f).graphicsLayer { translationY = dragDropState.previousItemOffset.value }
+ } else {
+ Modifier.animateItem(fadeInSpec = null, fadeOutSpec = null)
+ }
Column(modifier = modifier.then(draggingModifier)) { content(dragging) }
}
-const val DragDropContentType = "drag-and-drop"
+const val DRAG_DROP_CONTENT_TYPE = "drag-and-drop"
/**
* Extension function for [LazyListScope] with drag-and-drop functionality for indexed items.
*
- * Wraps [itemsIndexed] function with [detectDragGesturesAfterLongPress] to enable long-press
- * drag gestures and allow items in the list to be reordered using the provided [DragDropState].
+ * Wraps [itemsIndexed] function with [detectDragGesturesAfterLongPress] to enable long-press drag gestures and allow
+ * items in the list to be reordered using the provided [DragDropState].
*/
inline fun LazyListScope.dragDropItemsIndexed(
items: List,
dragDropState: DragDropState,
noinline key: ((index: Int, item: T) -> Any)? = null,
- crossinline itemContent: @Composable LazyItemScope.(index: Int, item: T, isDragging: Boolean) -> Unit
+ crossinline itemContent: @Composable LazyItemScope.(index: Int, item: T, isDragging: Boolean) -> Unit,
) = itemsIndexed(
items = items,
key = key,
- contentType = { _, _ -> DragDropContentType },
+ contentType = { _, _ -> DRAG_DROP_CONTENT_TYPE },
itemContent = { index, item ->
DraggableItem(
dragDropState = dragDropState,
index = index,
- content = { isDragging -> itemContent(index, item, isDragging) }
+ content = { isDragging -> itemContent(index, item, isDragging) },
)
- }
+ },
)
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/LoraSignalIndicator.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/LoraSignalIndicator.kt
similarity index 94%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/LoraSignalIndicator.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/LoraSignalIndicator.kt
index ddfb2ca40..5c3fc3448 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/LoraSignalIndicator.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/LoraSignalIndicator.kt
@@ -17,7 +17,7 @@
@file:Suppress("MagicNumber")
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
@@ -47,11 +47,11 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusGreen
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusOrange
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusYellow
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.StatusColors.StatusGreen
+import org.meshtastic.core.ui.theme.StatusColors.StatusOrange
+import org.meshtastic.core.ui.theme.StatusColors.StatusRed
+import org.meshtastic.core.ui.theme.StatusColors.StatusYellow
private const val SNR_GOOD_THRESHOLD = -7f
private const val SNR_FAIR_THRESHOLD = -15f
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/MDText.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MDText.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/MDText.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MDText.kt
index 43a70f88e..f146400b5 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/MDText.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MDText.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
@@ -27,11 +27,11 @@ import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.tooling.preview.Preview
-import com.geeksville.mesh.ui.common.theme.HyperlinkBlue
import com.mikepenz.markdown.compose.components.markdownComponents
import com.mikepenz.markdown.m3.Markdown
import com.mikepenz.markdown.model.DefaultMarkdownColors
import com.mikepenz.markdown.model.DefaultMarkdownTypography
+import org.meshtastic.core.ui.theme.HyperlinkBlue
@Composable
fun MDText(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/MaterialBatteryInfo.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MaterialBatteryInfo.kt
similarity index 86%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/MaterialBatteryInfo.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MaterialBatteryInfo.kt
index 39908318f..e07084358 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/MaterialBatteryInfo.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/MaterialBatteryInfo.kt
@@ -15,16 +15,12 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.automirrored.rounded.BatteryUnknown
-import androidx.compose.material.icons.rounded.BatteryUnknown
import androidx.compose.material.icons.rounded.Power
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@@ -40,13 +36,13 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.ui.common.icons.BatteryEmpty
-import com.geeksville.mesh.ui.common.icons.BatteryUnknown
-import com.geeksville.mesh.ui.common.icons.MeshtasticIcons
-import com.geeksville.mesh.ui.common.theme.AppTheme
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusGreen
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusOrange
-import com.geeksville.mesh.ui.common.theme.StatusColors.StatusRed
+import org.meshtastic.core.ui.icon.BatteryEmpty
+import org.meshtastic.core.ui.icon.BatteryUnknown
+import org.meshtastic.core.ui.icon.MeshtasticIcons
+import org.meshtastic.core.ui.theme.AppTheme
+import org.meshtastic.core.ui.theme.StatusColors.StatusGreen
+import org.meshtastic.core.ui.theme.StatusColors.StatusOrange
+import org.meshtastic.core.ui.theme.StatusColors.StatusRed
private const val FORMAT = "%d%%"
private const val SIZE_ICON = 20
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceCategory.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PreferenceCategory.kt
similarity index 80%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceCategory.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PreferenceCategory.kt
index 80cd584ed..a0a8124e3 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceCategory.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PreferenceCategory.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
@@ -35,7 +35,7 @@ import androidx.compose.ui.unit.dp
fun PreferenceCategory(
text: String,
modifier: Modifier = Modifier,
- content: (@Composable ColumnScope.() -> Unit)? = null
+ content: (@Composable ColumnScope.() -> Unit)? = null,
) {
Text(
text,
@@ -43,18 +43,12 @@ fun PreferenceCategory(
style = MaterialTheme.typography.titleLarge,
)
if (content != null) {
- Card(
- modifier = modifier.padding(bottom = 8.dp),
- ) {
+ Card(modifier = modifier.padding(bottom = 8.dp)) {
Column(
- modifier = Modifier
- .fillMaxWidth()
- .padding(horizontal = 16.dp, vertical = 16.dp),
+ modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 16.dp),
horizontalAlignment = Alignment.CenterHorizontally,
) {
- ProvideTextStyle(MaterialTheme.typography.bodyLarge) {
- content()
- }
+ ProvideTextStyle(MaterialTheme.typography.bodyLarge) { content() }
}
}
}
@@ -63,7 +57,5 @@ fun PreferenceCategory(
@Preview(showBackground = true)
@Composable
private fun PreferenceCategoryPreview() {
- PreferenceCategory(
- text = "Advanced settings"
- )
+ PreferenceCategory(text = "Advanced settings")
}
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceFooter.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PreferenceFooter.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceFooter.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PreferenceFooter.kt
index 5359a81a4..df0a1bcfe 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/PreferenceFooter.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/PreferenceFooter.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.annotation.StringRes
import androidx.compose.foundation.layout.Arrangement
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/RegularPreference.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/RegularPreference.kt
similarity index 71%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/RegularPreference.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/RegularPreference.kt
index d89300dd6..6d10353ea 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/RegularPreference.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/RegularPreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
@@ -74,50 +74,35 @@ fun RegularPreference(
trailingIcon: ImageVector? = null,
dropdownMenu: @Composable () -> Unit = {},
) {
- val color = if (enabled) {
- MaterialTheme.colorScheme.onSurface
- } else {
- MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f)
- }
+ val color =
+ if (enabled) {
+ MaterialTheme.colorScheme.onSurface
+ } else {
+ MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f)
+ }
- Column(
- modifier = modifier
- .fillMaxWidth()
- .clickable(enabled = enabled, onClick = onClick)
- .padding(all = 16.dp),
- ) {
- Row(
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.SpaceBetween,
- ) {
- FlowRow(
- modifier = Modifier.weight(1f),
- horizontalArrangement = Arrangement.SpaceBetween,
- ) {
+ Column(modifier = modifier.fillMaxWidth().clickable(enabled = enabled, onClick = onClick).padding(all = 16.dp)) {
+ Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween) {
+ FlowRow(modifier = Modifier.weight(1f), horizontalArrangement = Arrangement.SpaceBetween) {
Text(
text = title,
style = MaterialTheme.typography.bodyLarge,
- color = if (enabled) {
+ color =
+ if (enabled) {
Color.Unspecified
} else {
MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f)
},
)
- Text(
- text = subtitle,
- style = MaterialTheme.typography.bodyLarge,
- color = color,
- )
+ Text(text = subtitle, style = MaterialTheme.typography.bodyLarge, color = color)
}
if (trailingIcon != null) {
Box {
Icon(
imageVector = trailingIcon,
contentDescription = "trailingIcon",
- modifier = Modifier
- .padding(start = 8.dp)
- .wrapContentWidth(Alignment.End),
+ modifier = Modifier.padding(start = 8.dp).wrapContentWidth(Alignment.End),
tint = color,
)
dropdownMenu()
@@ -125,11 +110,7 @@ fun RegularPreference(
}
}
if (summary != null) {
- Text(
- text = summary,
- style = MaterialTheme.typography.bodyMedium,
- color = color,
- )
+ Text(text = summary, style = MaterialTheme.typography.bodyMedium, color = color)
}
}
}
@@ -137,9 +118,5 @@ fun RegularPreference(
@Preview(showBackground = true)
@Composable
private fun RegularPreferencePreview() {
- RegularPreference(
- title = "Advanced settings",
- subtitle = "Text2",
- onClick = { },
- )
-}
\ No newline at end of file
+ RegularPreference(title = "Advanced settings", subtitle = "Text2", onClick = {})
+}
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/SimpleAlertDialog.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SimpleAlertDialog.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/SimpleAlertDialog.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SimpleAlertDialog.kt
index 0e4acf049..b361097a6 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/SimpleAlertDialog.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SimpleAlertDialog.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.annotation.StringRes
import androidx.compose.foundation.layout.fillMaxWidth
@@ -32,8 +32,8 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.ui.common.theme.AppTheme
import org.meshtastic.core.strings.R
+import org.meshtastic.core.ui.theme.AppTheme
@Composable
fun SimpleAlertDialog(
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/SlidingSelector.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SlidingSelector.kt
similarity index 64%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/SlidingSelector.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SlidingSelector.kt
index acd72ac1a..32b7c3d39 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/SlidingSelector.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SlidingSelector.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import android.annotation.SuppressLint
import androidx.compose.animation.core.animateDpAsState
@@ -27,7 +27,6 @@ import androidx.compose.foundation.gestures.awaitFirstDown
import androidx.compose.foundation.gestures.horizontalDrag
import androidx.compose.foundation.layout.Arrangement.spacedBy
import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
@@ -37,7 +36,6 @@ import androidx.compose.foundation.selection.selectableGroup
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
@@ -62,7 +60,6 @@ import androidx.compose.ui.input.pointer.PointerInputChange
import androidx.compose.ui.input.pointer.changedToUp
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.Layout
-import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.onClick
import androidx.compose.ui.semantics.role
@@ -72,12 +69,10 @@ import androidx.compose.ui.semantics.stateDescription
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow.Companion.Ellipsis
-import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.model.TimeFrame
private const val NO_OPTION_INDEX = -1
@@ -104,7 +99,7 @@ fun SlidingSelector(
selectedOption: T,
onOptionSelected: (T) -> Unit,
modifier: Modifier = Modifier,
- content: @Composable (T) -> Unit
+ content: @Composable (T) -> Unit,
) {
val state = remember { SelectorState() }
state.optionCount = options.size
@@ -112,10 +107,7 @@ fun SlidingSelector(
state.onOptionSelected = { onOptionSelected(options[it]) }
/* Animate between whole-number indices so we don't need to do pixel calculations. */
- val selectedIndexOffset by animateFloatAsState(
- state.selectedOption.toFloat(),
- label = "Selected Index Offset"
- )
+ val selectedIndexOffset by animateFloatAsState(state.selectedOption.toFloat(), label = "Selected Index Offset")
Layout(
content = {
@@ -123,11 +115,12 @@ fun SlidingSelector(
Dividers(state)
Options(state, options, content)
},
- modifier = modifier
+ modifier =
+ modifier
.fillMaxWidth()
.then(state.inputModifier)
.background(TRACK_COLOR, BACKGROUND_SHAPE)
- .padding(TRACK_PADDING)
+ .padding(TRACK_PADDING),
) { measurables, constraints ->
val (indicatorMeasurable, dividersMeasurable, optionsMeasurable) = measurables
@@ -136,70 +129,57 @@ fun SlidingSelector(
state.updatePressedScale(optionsPlaceable.height, this)
/* Measure the indicator and dividers to be the right size. */
- val indicatorPlaceable = indicatorMeasurable.measure(
- Constraints.fixed(
- width = optionsPlaceable.width / options.size,
- height = optionsPlaceable.height
+ val indicatorPlaceable =
+ indicatorMeasurable.measure(
+ Constraints.fixed(width = optionsPlaceable.width / options.size, height = optionsPlaceable.height),
)
- )
- val dividersPlaceable = dividersMeasurable.measure(
- Constraints.fixed(
- width = optionsPlaceable.width,
- height = optionsPlaceable.height
+ val dividersPlaceable =
+ dividersMeasurable.measure(
+ Constraints.fixed(width = optionsPlaceable.width, height = optionsPlaceable.height),
)
- )
layout(optionsPlaceable.width, optionsPlaceable.height) {
val optionWidth = optionsPlaceable.width / options.size
/* Place the indicator first so that it's below the option labels. */
- indicatorPlaceable.placeRelative(
- x = (selectedIndexOffset * optionWidth).toInt(),
- y = 0
- )
+ indicatorPlaceable.placeRelative(x = (selectedIndexOffset * optionWidth).toInt(), y = 0)
dividersPlaceable.placeRelative(IntOffset.Zero)
optionsPlaceable.placeRelative(IntOffset.Zero)
}
}
}
-/**
- * Visual representation of the option the user may select.
- */
+/** Visual representation of the option the user may select. */
@Composable
fun OptionLabel(text: String) {
Text(text, maxLines = 1, overflow = Ellipsis)
}
-/**
- * Draws the selected indicator on the [SlidingSelector] track.
- */
+/** Draws the selected indicator on the [SlidingSelector] track. */
@Composable
private fun SelectedIndicator(state: SelectorState) {
Box(
- Modifier
- .then(
- state.optionScaleModifier(
- pressed = state.pressedOption == state.selectedOption,
- option = state.selectedOption
- )
- )
+ Modifier.then(
+ state.optionScaleModifier(
+ pressed = state.pressedOption == state.selectedOption,
+ option = state.selectedOption,
+ ),
+ )
.shadow(4.dp, BACKGROUND_SHAPE)
- .background(MaterialTheme.colorScheme.background, BACKGROUND_SHAPE)
+ .background(MaterialTheme.colorScheme.background, BACKGROUND_SHAPE),
)
}
-/**
- * Draws dividers between [OptionLabel]s.
- */
+/** Draws dividers between [OptionLabel]s. */
@Composable
private fun Dividers(state: SelectorState) {
/* Animate each divider independently. */
- val alphas = (0 until state.optionCount).map { i ->
- val selectionAdjacent = i == state.selectedOption || i - 1 == state.selectedOption
- animateFloatAsState(if (selectionAdjacent) 0f else 1f, label = "Dividers")
- }
+ val alphas =
+ (0 until state.optionCount).map { i ->
+ val selectionAdjacent = i == state.selectedOption || i - 1 == state.selectedOption
+ animateFloatAsState(if (selectionAdjacent) 0f else 1f, label = "Dividers")
+ }
Canvas(Modifier.fillMaxSize()) {
val optionWidth = size.width / state.optionCount
@@ -211,46 +191,38 @@ private fun Dividers(state: SelectorState) {
Color.White,
alpha = alpha.value,
start = Offset(x, dividerPadding.toPx()),
- end = Offset(x, size.height - dividerPadding.toPx())
+ end = Offset(x, size.height - dividerPadding.toPx()),
)
}
}
}
-/**
- * Draws the options available to the user.
- */
+/** Draws the options available to the user. */
@Composable
-private fun Options(
- state: SelectorState,
- options: List,
- content: @Composable (T) -> Unit
-) {
- CompositionLocalProvider(
- LocalTextStyle provides TextStyle(fontWeight = FontWeight.Medium)
- ) {
- Row(
- horizontalArrangement = spacedBy(TRACK_PADDING),
- modifier = Modifier
- .fillMaxWidth()
- .selectableGroup()
- ) {
+private fun Options(state: SelectorState, options: List, content: @Composable (T) -> Unit) {
+ CompositionLocalProvider(LocalTextStyle provides TextStyle(fontWeight = FontWeight.Medium)) {
+ Row(horizontalArrangement = spacedBy(TRACK_PADDING), modifier = Modifier.fillMaxWidth().selectableGroup()) {
options.forEachIndexed { i, timeFrame ->
val isSelected = i == state.selectedOption
val isPressed = i == state.pressedOption
/* Unselected presses are represented by fading. */
- val alpha by animateFloatAsState(
- if (!isSelected && isPressed) PRESSED_UNSELECTED_ALPHA else 1f,
- label = "Unselected"
- )
+ val alpha by
+ animateFloatAsState(
+ if (!isSelected && isPressed) PRESSED_UNSELECTED_ALPHA else 1f,
+ label = "Unselected",
+ )
- val semanticsModifier = Modifier.semantics(mergeDescendants = true) {
- selected = isSelected
- role = Role.Button
- onClick { state.onOptionSelected(i); true }
- stateDescription = if (isSelected) "Selected" else "Not selected"
- }
+ val semanticsModifier =
+ Modifier.semantics(mergeDescendants = true) {
+ selected = isSelected
+ role = Role.Button
+ onClick {
+ state.onOptionSelected(i)
+ true
+ }
+ stateDescription = if (isSelected) "Selected" else "Not selected"
+ }
Box(
Modifier
@@ -263,7 +235,7 @@ private fun Options(
/* Selected presses are represented by scaling. */
.then(state.optionScaleModifier(isPressed && isSelected, i))
/* Center the option content. */
- .wrapContentWidth()
+ .wrapContentWidth(),
) {
content(timeFrame)
}
@@ -272,9 +244,7 @@ private fun Options(
}
}
-/**
- * Contains and handles the state necessary to present the [SlidingSelector] to the user.
- */
+/** Contains and handles the state necessary to present the [SlidingSelector] to the user. */
private class SelectorState {
var optionCount by mutableIntStateOf(0)
var selectedOption by mutableIntStateOf(0)
@@ -282,15 +252,13 @@ private class SelectorState {
var pressedOption by mutableIntStateOf(NO_OPTION_INDEX)
/**
- * Scale factor that should be used to scale pressed option. When this scale is applied,
- * exactly [PRESSED_TRACK_PADDING] will be added around the element's usual size.
+ * Scale factor that should be used to scale pressed option. When this scale is applied, exactly
+ * [PRESSED_TRACK_PADDING] will be added around the element's usual size.
*/
var pressedSelectedScale by mutableFloatStateOf(1f)
private set
- /**
- * Calculates the scale factor we need to use for pressed options to get the desired padding.
- */
+ /** Calculates the scale factor we need to use for pressed options to get the desired padding. */
fun updatePressedScale(controlHeight: Int, density: Density) {
with(density) {
val pressedPadding = PRESSED_TRACK_PADDING * 2
@@ -300,93 +268,88 @@ private class SelectorState {
}
/**
- * Returns a [Modifier] that will scale an element so that it gets [PRESSED_TRACK_PADDING] extra
- * padding around it. The scale will be animated.
+ * Returns a [Modifier] that will scale an element so that it gets [PRESSED_TRACK_PADDING] extra padding around it.
+ * The scale will be animated.
*
- * The scale is also performed around either the left or right edge of the element if the option
- * is the first or last option, respectively. In those cases, the scale will also be translated so
- * that [PRESSED_TRACK_PADDING] will be added on the left or right edge.
+ * The scale is also performed around either the left or right edge of the element if the option is the first or
+ * last option, respectively. In those cases, the scale will also be translated so that [PRESSED_TRACK_PADDING] will
+ * be added on the left or right edge.
*/
@SuppressLint("ModifierFactoryExtensionFunction")
- fun optionScaleModifier(
- pressed: Boolean,
- option: Int,
- ): Modifier = Modifier.composed {
+ fun optionScaleModifier(pressed: Boolean, option: Int): Modifier = Modifier.composed {
val scale by animateFloatAsState(if (pressed) pressedSelectedScale else 1f, label = "Scale")
- val xOffset by animateDpAsState(
- if (pressed) PRESSED_TRACK_PADDING else 0.dp,
- label = "x Offset"
- )
+ val xOffset by animateDpAsState(if (pressed) PRESSED_TRACK_PADDING else 0.dp, label = "x Offset")
graphicsLayer {
this.scaleX = scale
this.scaleY = scale
/* Scales on the ends should gravitate to that edge. */
- this.transformOrigin = TransformOrigin(
- pivotFractionX = when (option) {
- 0 -> 0f
- optionCount - 1 -> 1f
- else -> .5f
- },
- pivotFractionY = .5f
- )
+ this.transformOrigin =
+ TransformOrigin(
+ pivotFractionX =
+ when (option) {
+ 0 -> 0f
+ optionCount - 1 -> 1f
+ else -> .5f
+ },
+ pivotFractionY = .5f,
+ )
/* But should still move inwards to keep the pressed padding consistent with top and bottom. */
- this.translationX = when (option) {
- 0 -> xOffset.toPx()
- optionCount - 1 -> -xOffset.toPx()
- else -> 0f
- }
+ this.translationX =
+ when (option) {
+ 0 -> xOffset.toPx()
+ optionCount - 1 -> -xOffset.toPx()
+ else -> 0f
+ }
}
}
/**
- * A [Modifier] that will listen for touch gestures and update the selected and pressed properties
- * of this state appropriately.
+ * A [Modifier] that will listen for touch gestures and update the selected and pressed properties of this state
+ * appropriately.
*/
- val inputModifier = Modifier.pointerInput(optionCount) {
- val optionWidth = size.width / optionCount
+ val inputModifier =
+ Modifier.pointerInput(optionCount) {
+ val optionWidth = size.width / optionCount
- /* Helper to calculate which option an event occurred in. */
- fun optionIndex(change: PointerInputChange): Int =
- ((change.position.x / size.width.toFloat()) * optionCount)
- .toInt()
- .coerceIn(0, optionCount - 1)
+ /* Helper to calculate which option an event occurred in. */
+ fun optionIndex(change: PointerInputChange): Int =
+ ((change.position.x / size.width.toFloat()) * optionCount).toInt().coerceIn(0, optionCount - 1)
- awaitEachGesture {
- val down = awaitFirstDown()
+ awaitEachGesture {
+ val down = awaitFirstDown()
- pressedOption = optionIndex(down)
- val downOnSelected = pressedOption == selectedOption
- val optionBounds = Rect(
- left = pressedOption * optionWidth.toFloat(),
- right = (pressedOption + 1) * optionWidth.toFloat(),
- top = 0f,
- bottom = size.height.toFloat()
- )
+ pressedOption = optionIndex(down)
+ val downOnSelected = pressedOption == selectedOption
+ val optionBounds =
+ Rect(
+ left = pressedOption * optionWidth.toFloat(),
+ right = (pressedOption + 1) * optionWidth.toFloat(),
+ top = 0f,
+ bottom = size.height.toFloat(),
+ )
- if (downOnSelected) {
- horizontalDrag(down.id) { change ->
- pressedOption = optionIndex(change)
+ if (downOnSelected) {
+ horizontalDrag(down.id) { change ->
+ pressedOption = optionIndex(change)
- if (pressedOption != selectedOption) {
- onOptionSelected(pressedOption)
+ if (pressedOption != selectedOption) {
+ onOptionSelected(pressedOption)
+ }
}
+ } else {
+ waitForUpOrCancellation(inBounds = optionBounds)
+ /* Null means the gesture was cancelled (e.g. dragged out of bounds). */
+ ?.let { onOptionSelected(pressedOption) }
}
- } else {
- waitForUpOrCancellation(inBounds = optionBounds)
- /* Null means the gesture was cancelled (e.g. dragged out of bounds). */
- ?.let { onOptionSelected(pressedOption) }
+ pressedOption = NO_OPTION_INDEX
}
- pressedOption = NO_OPTION_INDEX
}
- }
}
-/**
- * Works with bounds that may not be at 0,0.
- */
+/** Works with bounds that may not be at 0,0. */
@Suppress("ReturnCount")
private suspend fun AwaitPointerEventScope.waitForUpOrCancellation(inBounds: Rect): PointerInputChange? {
while (true) {
@@ -408,7 +371,7 @@ private suspend fun AwaitPointerEventScope.waitForUpOrCancellation(inBounds: Rec
}
}
-@Preview
+/*@Preview
@Composable
fun SlidingSelectorPreview() {
MaterialTheme {
@@ -426,4 +389,4 @@ fun SlidingSelectorPreview() {
}
}
}
-}
+}*/
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/SwitchPreference.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SwitchPreference.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/SwitchPreference.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SwitchPreference.kt
index 26445b48a..01ae79bba 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/SwitchPreference.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/SwitchPreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.animation.AnimatedContent
import androidx.compose.foundation.layout.PaddingValues
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/TextDividerPreference.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/TextDividerPreference.kt
similarity index 81%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/TextDividerPreference.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/TextDividerPreference.kt
index 9ca02078b..228ed798c 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/TextDividerPreference.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/TextDividerPreference.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
@@ -56,31 +56,20 @@ fun TextDividerPreference(
enabled: Boolean = true,
trailingIcon: ImageVector? = null,
) {
- Card(
- modifier = modifier.fillMaxWidth(),
- ) {
- Row(
- modifier = modifier
- .fillMaxWidth()
- .padding(all = 16.dp),
- verticalAlignment = Alignment.CenterVertically
- ) {
+ Card(modifier = modifier.fillMaxWidth()) {
+ Row(modifier = modifier.fillMaxWidth().padding(all = 16.dp), verticalAlignment = Alignment.CenterVertically) {
Text(
text = title,
style = MaterialTheme.typography.bodyLarge,
- color = if (!enabled) {
+ color =
+ if (!enabled) {
MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f)
} else {
Color.Unspecified
},
)
if (trailingIcon != null) {
- Icon(
- trailingIcon, "trailingIcon",
- modifier = modifier
- .fillMaxWidth()
- .wrapContentWidth(Alignment.End),
- )
+ Icon(trailingIcon, "trailingIcon", modifier = modifier.fillMaxWidth().wrapContentWidth(Alignment.End))
}
}
}
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/TimeTickWithLifecycle.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt
similarity index 90%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/TimeTickWithLifecycle.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt
index 50d0ac81f..fc3ce41ac 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/TimeTickWithLifecycle.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/TimeTickWithLifecycle.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import android.content.BroadcastReceiver
import android.content.Context
@@ -39,17 +39,13 @@ fun rememberTimeTickWithLifecycle(): Long {
receiver.register(context)
value = System.currentTimeMillis()
- onPauseOrDispose {
- receiver.unregister(context)
- }
+ onPauseOrDispose { receiver.unregister(context) }
}
return value
}
-private class TimeBroadcastReceiver(
- val onTimeChanged: () -> Unit,
-) : BroadcastReceiver() {
+private class TimeBroadcastReceiver(val onTimeChanged: () -> Unit) : BroadcastReceiver() {
private var registered = false
override fun onReceive(context: Context, intent: Intent) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/TitledCard.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/TitledCard.kt
similarity index 95%
rename from app/src/main/java/com/geeksville/mesh/ui/common/components/TitledCard.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/component/TitledCard.kt
index 90573b3c1..5b72284bb 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/TitledCard.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/component/TitledCard.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.components
+package org.meshtastic.core.ui.component
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@@ -32,7 +32,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
-import com.geeksville.mesh.ui.common.theme.AppTheme
+import org.meshtastic.core.ui.theme.AppTheme
@Composable
fun TitledCard(title: String?, modifier: Modifier = Modifier, content: @Composable ColumnScope.() -> Unit) {
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/icons/Battery.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Battery.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/common/icons/Battery.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Battery.kt
index eb1e99618..bc724bdb7 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/icons/Battery.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Battery.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.icons
+package org.meshtastic.core.ui.icon
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/icons/Device.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Device.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/common/icons/Device.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Device.kt
index 5ae2b21e1..3e6b0aebf 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/icons/Device.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Device.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.icons
+package org.meshtastic.core.ui.icon
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/icons/Map.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Map.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/common/icons/Map.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Map.kt
index 62c3d23eb..cc44fe765 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/icons/Map.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Map.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.icons
+package org.meshtastic.core.ui.icon
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/icons/MeshtasticIcons.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/MeshtasticIcons.kt
similarity index 94%
rename from app/src/main/java/com/geeksville/mesh/ui/common/icons/MeshtasticIcons.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/MeshtasticIcons.kt
index 4afd06b93..2f1537eb7 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/icons/MeshtasticIcons.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/MeshtasticIcons.kt
@@ -15,6 +15,6 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.icons
+package org.meshtastic.core.ui.icon
object MeshtasticIcons
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/icons/Messages.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Messages.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/common/icons/Messages.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Messages.kt
index d46c77d06..3d4417121 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/icons/Messages.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Messages.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.icons
+package org.meshtastic.core.ui.icon
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/icons/NoDevice.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/NoDevice.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/common/icons/NoDevice.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/NoDevice.kt
index d06e27724..75d91a328 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/icons/NoDevice.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/NoDevice.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.icons
+package org.meshtastic.core.ui.icon
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/icons/Nodes.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Nodes.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/common/icons/Nodes.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Nodes.kt
index a388cb79c..ac1052f59 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/icons/Nodes.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Nodes.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.icons
+package org.meshtastic.core.ui.icon
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/icons/Settings.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Settings.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/common/icons/Settings.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Settings.kt
index 0defebd43..cfeb18d95 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/icons/Settings.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/icon/Settings.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.icons
+package org.meshtastic.core.ui.icon
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/theme/Color.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/theme/Color.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/common/theme/Color.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/theme/Color.kt
index 092286b60..579d3875f 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/theme/Color.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/theme/Color.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.theme
+package org.meshtastic.core.ui.theme
import androidx.compose.ui.graphics.Color
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/theme/CustomColors.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/theme/CustomColors.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/ui/common/theme/CustomColors.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/theme/CustomColors.kt
index 9d57b8dea..c72c0b2e4 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/theme/CustomColors.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/theme/CustomColors.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.theme
+package org.meshtastic.core.ui.theme
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.ColorScheme
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/theme/Theme.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/theme/Theme.kt
similarity index 99%
rename from app/src/main/java/com/geeksville/mesh/ui/common/theme/Theme.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/theme/Theme.kt
index 5258680b9..ec1d09cdb 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/theme/Theme.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/theme/Theme.kt
@@ -17,7 +17,7 @@
@file:Suppress("UnusedPrivateProperty")
-package com.geeksville.mesh.ui.common.theme
+package org.meshtastic.core.ui.theme
import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme
diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/theme/Type.kt b/core/ui/src/main/kotlin/org/meshtastic/core/ui/theme/Type.kt
similarity index 94%
rename from app/src/main/java/com/geeksville/mesh/ui/common/theme/Type.kt
rename to core/ui/src/main/kotlin/org/meshtastic/core/ui/theme/Type.kt
index 556fd6e92..0bdc0b5c6 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/theme/Type.kt
+++ b/core/ui/src/main/kotlin/org/meshtastic/core/ui/theme/Type.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.ui.common.theme
+package org.meshtastic.core.ui.theme
import androidx.compose.material3.Typography
diff --git a/app/src/main/res/drawable/ic_battery_alert.xml b/core/ui/src/main/res/drawable/ic_battery_alert.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_battery_alert.xml
rename to core/ui/src/main/res/drawable/ic_battery_alert.xml
diff --git a/app/src/main/res/drawable/ic_battery_high.xml b/core/ui/src/main/res/drawable/ic_battery_high.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_battery_high.xml
rename to core/ui/src/main/res/drawable/ic_battery_high.xml
diff --git a/app/src/main/res/drawable/ic_battery_low.xml b/core/ui/src/main/res/drawable/ic_battery_low.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_battery_low.xml
rename to core/ui/src/main/res/drawable/ic_battery_low.xml
diff --git a/app/src/main/res/drawable/ic_battery_medium.xml b/core/ui/src/main/res/drawable/ic_battery_medium.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_battery_medium.xml
rename to core/ui/src/main/res/drawable/ic_battery_medium.xml
diff --git a/app/src/main/res/drawable/ic_battery_outline.xml b/core/ui/src/main/res/drawable/ic_battery_outline.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_battery_outline.xml
rename to core/ui/src/main/res/drawable/ic_battery_outline.xml
diff --git a/app/src/main/res/drawable/ic_battery_unknown.xml b/core/ui/src/main/res/drawable/ic_battery_unknown.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_battery_unknown.xml
rename to core/ui/src/main/res/drawable/ic_battery_unknown.xml
diff --git a/app/src/main/res/drawable/ic_power_plug_24.xml b/core/ui/src/main/res/drawable/ic_power_plug_24.xml
similarity index 100%
rename from app/src/main/res/drawable/ic_power_plug_24.xml
rename to core/ui/src/main/res/drawable/ic_power_plug_24.xml
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 1450cdd61..b091b15e2 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -29,6 +29,7 @@ include(
":core:prefs",
":core:proto",
":core:strings",
+ ":core:ui",
":feature:map",
":mesh_service_example",
)