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