diff --git a/app/detekt-baseline.xml b/app/detekt-baseline.xml
index 86f3334e6..10c12068b 100644
--- a/app/detekt-baseline.xml
+++ b/app/detekt-baseline.xml
@@ -124,8 +124,6 @@
MagicNumber:BluetoothInterface.kt$BluetoothInterface$1000
MagicNumber:BluetoothInterface.kt$BluetoothInterface$500
MagicNumber:BluetoothInterface.kt$BluetoothInterface$512
- MagicNumber:ChannelSet.kt$40
- MagicNumber:ChannelSet.kt$960
MagicNumber:Contacts.kt$7
MagicNumber:Contacts.kt$8
MagicNumber:Debug.kt$3
@@ -150,7 +148,6 @@
MagicNumber:MetricsViewModel.kt$MetricsViewModel$1000L
MagicNumber:MetricsViewModel.kt$MetricsViewModel$1e-5
MagicNumber:MetricsViewModel.kt$MetricsViewModel$1e-7
- MagicNumber:PacketRepository.kt$PacketRepository$500
MagicNumber:PacketResponseStateDialog.kt$100
MagicNumber:PowerConfigItemList.kt$3600
MagicNumber:ProbeTableProvider.kt$ProbeTableProvider$21972
@@ -355,7 +352,6 @@
SpacingAroundKeyword:Exceptions.kt$if
SpacingAroundKeyword:Exceptions.kt$when
SwallowedException:BluetoothInterface.kt$BluetoothInterface$ex: CancellationException
- SwallowedException:ChannelSet.kt$ex: Throwable
SwallowedException:Exceptions.kt$ex: Throwable
SwallowedException:MeshService.kt$MeshService$ex: BLEException
SwallowedException:MeshService.kt$MeshService$ex: CancellationException
@@ -366,7 +362,6 @@
SwallowedException:TCPInterface.kt$TCPInterface$ex: SocketTimeoutException
TooGenericExceptionCaught:BTScanModel.kt$BTScanModel$ex: Throwable
TooGenericExceptionCaught:BluetoothInterface.kt$BluetoothInterface$ex: Exception
- TooGenericExceptionCaught:ChannelSet.kt$ex: Throwable
TooGenericExceptionCaught:Exceptions.kt$ex: Throwable
TooGenericExceptionCaught:LanguageUtils.kt$LanguageUtils$e: Exception
TooGenericExceptionCaught:LocationRepository.kt$LocationRepository$e: Exception
@@ -391,7 +386,6 @@
TooManyFunctions:MessageViewModel.kt$MessageViewModel : ViewModel
TooManyFunctions:NodeDetail.kt$com.geeksville.mesh.ui.node.NodeDetail.kt
TooManyFunctions:NodesViewModel.kt$NodesViewModel : ViewModel
- TooManyFunctions:PacketRepository.kt$PacketRepository
TooManyFunctions:RadioConfigViewModel.kt$RadioConfigViewModel : ViewModelLogging
TooManyFunctions:RadioInterfaceService.kt$RadioInterfaceService : Logging
TooManyFunctions:SafeBluetooth.kt$SafeBluetooth : LoggingCloseable
diff --git a/app/src/androidTest/java/com/geeksville/mesh/ChannelSetTest.kt b/app/src/androidTest/java/com/geeksville/mesh/ChannelSetTest.kt
index 83568c460..11b60950b 100644
--- a/app/src/androidTest/java/com/geeksville/mesh/ChannelSetTest.kt
+++ b/app/src/androidTest/java/com/geeksville/mesh/ChannelSetTest.kt
@@ -18,21 +18,20 @@
package com.geeksville.mesh
import android.net.Uri
-import com.geeksville.mesh.model.getChannelUrl
-import com.geeksville.mesh.model.primaryChannel
-import com.geeksville.mesh.model.toChannelSet
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import org.junit.Assert
import org.junit.Before
import org.junit.Rule
import org.junit.Test
+import org.meshtastic.core.model.util.getChannelUrl
+import org.meshtastic.core.model.util.primaryChannel
+import org.meshtastic.core.model.util.toChannelSet
@HiltAndroidTest
class ChannelSetTest {
- @get:Rule
- var hiltRule = HiltAndroidRule(this)
+ @get:Rule var hiltRule = HiltAndroidRule(this)
@Before
fun init() {
diff --git a/app/src/androidTest/java/com/geeksville/mesh/ChannelTest.kt b/app/src/androidTest/java/com/geeksville/mesh/ChannelTest.kt
index a8d5cbd86..120e7d9d3 100644
--- a/app/src/androidTest/java/com/geeksville/mesh/ChannelTest.kt
+++ b/app/src/androidTest/java/com/geeksville/mesh/ChannelTest.kt
@@ -18,14 +18,14 @@
package com.geeksville.mesh
import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.geeksville.mesh.model.URL_PREFIX
-import com.geeksville.mesh.model.getChannelUrl
-import com.geeksville.mesh.model.toChannelSet
import org.junit.Assert
import org.junit.Test
import org.junit.runner.RunWith
import org.meshtastic.core.model.Channel
import org.meshtastic.core.model.numChannels
+import org.meshtastic.core.model.util.URL_PREFIX
+import org.meshtastic.core.model.util.getChannelUrl
+import org.meshtastic.core.model.util.toChannelSet
@RunWith(AndroidJUnit4::class)
class ChannelTest {
diff --git a/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapViewModel.kt b/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapViewModel.kt
index f88b4d4ea..1d9bcfdc2 100644
--- a/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapViewModel.kt
+++ b/app/src/fdroid/java/com/geeksville/mesh/ui/map/MapViewModel.kt
@@ -19,13 +19,13 @@ package com.geeksville.mesh.ui.map
import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.LocalOnlyProtos.LocalConfig
-import com.geeksville.mesh.database.NodeRepository
-import com.geeksville.mesh.database.PacketRepository
-import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.stateIn
+import org.meshtastic.core.data.repository.NodeRepository
+import org.meshtastic.core.data.repository.PacketRepository
+import org.meshtastic.core.data.repository.RadioConfigRepository
import org.meshtastic.core.model.DataPacket
import org.meshtastic.core.prefs.map.MapPrefs
import javax.inject.Inject
diff --git a/app/src/google/java/com/geeksville/mesh/ui/map/MapViewModel.kt b/app/src/google/java/com/geeksville/mesh/ui/map/MapViewModel.kt
index 44002d329..a77723b48 100644
--- a/app/src/google/java/com/geeksville/mesh/ui/map/MapViewModel.kt
+++ b/app/src/google/java/com/geeksville/mesh/ui/map/MapViewModel.kt
@@ -23,9 +23,6 @@ import androidx.core.net.toFile
import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.ConfigProtos
import com.geeksville.mesh.android.BuildUtils.debug
-import com.geeksville.mesh.database.NodeRepository
-import com.geeksville.mesh.database.PacketRepository
-import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceRepository
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.model.TileProvider
@@ -52,6 +49,9 @@ import kotlinx.serialization.Serializable
import org.json.JSONObject
import org.meshtastic.core.data.model.CustomTileProviderConfig
import org.meshtastic.core.data.repository.CustomTileProviderRepository
+import org.meshtastic.core.data.repository.NodeRepository
+import org.meshtastic.core.data.repository.PacketRepository
+import org.meshtastic.core.data.repository.RadioConfigRepository
import org.meshtastic.core.datastore.UiPreferencesDataSource
import org.meshtastic.core.prefs.map.GoogleMapsPrefs
import org.meshtastic.core.prefs.map.MapPrefs
diff --git a/app/src/main/java/com/geeksville/mesh/model/DebugViewModel.kt b/app/src/main/java/com/geeksville/mesh/model/DebugViewModel.kt
index 8b0d2fcef..e9548228e 100644
--- a/app/src/main/java/com/geeksville/mesh/model/DebugViewModel.kt
+++ b/app/src/main/java/com/geeksville/mesh/model/DebugViewModel.kt
@@ -27,8 +27,6 @@ import com.geeksville.mesh.Portnums.PortNum
import com.geeksville.mesh.StoreAndForwardProtos
import com.geeksville.mesh.TelemetryProtos
import com.geeksville.mesh.android.Logging
-import com.geeksville.mesh.database.MeshLogRepository
-import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.ui.debug.FilterMode
import com.google.protobuf.InvalidProtocolBufferException
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -44,6 +42,8 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
+import org.meshtastic.core.data.repository.MeshLogRepository
+import org.meshtastic.core.data.repository.NodeRepository
import org.meshtastic.core.database.entity.MeshLog
import java.text.DateFormat
import java.util.Date
diff --git a/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt b/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt
index 5a7e27e8e..21a39e21b 100644
--- a/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt
+++ b/app/src/main/java/com/geeksville/mesh/model/MetricsViewModel.kt
@@ -35,11 +35,6 @@ import com.geeksville.mesh.Portnums
import com.geeksville.mesh.Portnums.PortNum
import com.geeksville.mesh.TelemetryProtos.Telemetry
import com.geeksville.mesh.android.Logging
-import com.geeksville.mesh.database.MeshLogRepository
-import com.geeksville.mesh.database.NodeRepository
-import com.geeksville.mesh.repository.api.DeviceHardwareRepository
-import com.geeksville.mesh.repository.api.FirmwareReleaseRepository
-import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceAction
import com.geeksville.mesh.service.ServiceRepository
import com.geeksville.mesh.util.safeNumber
@@ -58,6 +53,11 @@ import kotlinx.coroutines.flow.toList
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
+import org.meshtastic.core.data.repository.DeviceHardwareRepository
+import org.meshtastic.core.data.repository.FirmwareReleaseRepository
+import org.meshtastic.core.data.repository.MeshLogRepository
+import org.meshtastic.core.data.repository.NodeRepository
+import org.meshtastic.core.data.repository.RadioConfigRepository
import org.meshtastic.core.database.entity.FirmwareRelease
import org.meshtastic.core.database.entity.MeshLog
import org.meshtastic.core.database.model.Node
diff --git a/app/src/main/java/com/geeksville/mesh/model/UIState.kt b/app/src/main/java/com/geeksville/mesh/model/UIState.kt
index 467720acb..4a6e41de3 100644
--- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt
+++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt
@@ -42,13 +42,6 @@ import com.geeksville.mesh.channelSet
import com.geeksville.mesh.channelSettings
import com.geeksville.mesh.config
import com.geeksville.mesh.copy
-import com.geeksville.mesh.database.MeshLogRepository
-import com.geeksville.mesh.database.NodeRepository
-import com.geeksville.mesh.database.PacketRepository
-import com.geeksville.mesh.database.QuickChatActionRepository
-import com.geeksville.mesh.repository.api.DeviceHardwareRepository
-import com.geeksville.mesh.repository.api.FirmwareReleaseRepository
-import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.repository.radio.MeshActivity
import com.geeksville.mesh.repository.radio.RadioInterfaceService
import com.geeksville.mesh.service.MeshServiceNotifications
@@ -70,6 +63,13 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
+import org.meshtastic.core.data.repository.DeviceHardwareRepository
+import org.meshtastic.core.data.repository.FirmwareReleaseRepository
+import org.meshtastic.core.data.repository.MeshLogRepository
+import org.meshtastic.core.data.repository.NodeRepository
+import org.meshtastic.core.data.repository.PacketRepository
+import org.meshtastic.core.data.repository.QuickChatActionRepository
+import org.meshtastic.core.data.repository.RadioConfigRepository
import org.meshtastic.core.database.entity.MyNodeEntity
import org.meshtastic.core.database.entity.Packet
import org.meshtastic.core.database.entity.QuickChatAction
@@ -78,7 +78,9 @@ import org.meshtastic.core.database.model.Node
import org.meshtastic.core.datastore.UiPreferencesDataSource
import org.meshtastic.core.model.DataPacket
import org.meshtastic.core.model.DeviceHardware
+import org.meshtastic.core.model.util.getChannel
import org.meshtastic.core.model.util.getShortDate
+import org.meshtastic.core.model.util.toChannelSet
import org.meshtastic.core.strings.R
import javax.inject.Inject
diff --git a/app/src/main/java/com/geeksville/mesh/repository/network/MQTTRepository.kt b/app/src/main/java/com/geeksville/mesh/repository/network/MQTTRepository.kt
index f1d88fcd0..129dd6ebe 100644
--- a/app/src/main/java/com/geeksville/mesh/repository/network/MQTTRepository.kt
+++ b/app/src/main/java/com/geeksville/mesh/repository/network/MQTTRepository.kt
@@ -19,10 +19,7 @@ package com.geeksville.mesh.repository.network
import com.geeksville.mesh.MeshProtos.MqttClientProxyMessage
import com.geeksville.mesh.android.Logging
-import com.geeksville.mesh.database.NodeRepository
-import com.geeksville.mesh.model.subscribeList
import com.geeksville.mesh.mqttClientProxyMessage
-import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.util.ignoreException
import com.google.protobuf.ByteString
import kotlinx.coroutines.channels.awaitClose
@@ -37,6 +34,9 @@ import org.eclipse.paho.client.mqttv3.MqttCallbackExtended
import org.eclipse.paho.client.mqttv3.MqttConnectOptions
import org.eclipse.paho.client.mqttv3.MqttMessage
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence
+import org.meshtastic.core.data.repository.NodeRepository
+import org.meshtastic.core.data.repository.RadioConfigRepository
+import org.meshtastic.core.model.util.subscribeList
import java.net.URI
import java.security.SecureRandom
import javax.inject.Inject
diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
index f92d285c1..07a2c005b 100644
--- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
+++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt
@@ -54,13 +54,9 @@ import com.geeksville.mesh.android.Logging
import com.geeksville.mesh.android.hasLocationPermission
import com.geeksville.mesh.concurrent.handledLaunch
import com.geeksville.mesh.copy
-import com.geeksville.mesh.database.MeshLogRepository
-import com.geeksville.mesh.database.NodeRepository
-import com.geeksville.mesh.database.PacketRepository
import com.geeksville.mesh.fromRadio
import com.geeksville.mesh.model.NO_DEVICE_SELECTED
import com.geeksville.mesh.position
-import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.repository.location.LocationRepository
import com.geeksville.mesh.repository.network.MQTTRepository
import com.geeksville.mesh.repository.radio.RadioInterfaceService
@@ -83,6 +79,10 @@ import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
+import org.meshtastic.core.data.repository.MeshLogRepository
+import org.meshtastic.core.data.repository.NodeRepository
+import org.meshtastic.core.data.repository.PacketRepository
+import org.meshtastic.core.data.repository.RadioConfigRepository
import org.meshtastic.core.database.entity.MeshLog
import org.meshtastic.core.database.entity.MetadataEntity
import org.meshtastic.core.database.entity.MyNodeEntity
diff --git a/app/src/main/java/com/geeksville/mesh/service/PacketHandler.kt b/app/src/main/java/com/geeksville/mesh/service/PacketHandler.kt
index 094f48ba7..f29b674b5 100644
--- a/app/src/main/java/com/geeksville/mesh/service/PacketHandler.kt
+++ b/app/src/main/java/com/geeksville/mesh/service/PacketHandler.kt
@@ -24,8 +24,6 @@ import com.geeksville.mesh.android.BuildUtils.debug
import com.geeksville.mesh.android.BuildUtils.errormsg
import com.geeksville.mesh.android.BuildUtils.info
import com.geeksville.mesh.concurrent.handledLaunch
-import com.geeksville.mesh.database.MeshLogRepository
-import com.geeksville.mesh.database.PacketRepository
import com.geeksville.mesh.fromRadio
import com.geeksville.mesh.repository.radio.RadioInterfaceService
import dagger.Lazy
@@ -35,6 +33,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.withTimeoutOrNull
+import org.meshtastic.core.data.repository.MeshLogRepository
+import org.meshtastic.core.data.repository.PacketRepository
import org.meshtastic.core.database.entity.MeshLog
import org.meshtastic.core.model.DataPacket
import org.meshtastic.core.model.MessageStatus
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 b4cb34a36..13dceefe2 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/common/components/SecurityIcon.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/SecurityIcon.kt
@@ -63,8 +63,8 @@ import androidx.compose.ui.unit.dp
import com.geeksville.mesh.AppOnlyProtos
import com.geeksville.mesh.ChannelProtos.ChannelSettings
import com.geeksville.mesh.ConfigProtos.Config.LoRaConfig
-import com.geeksville.mesh.model.getChannel
import org.meshtastic.core.model.Channel
+import org.meshtastic.core.model.util.getChannel
import org.meshtastic.core.strings.R
import org.meshtastic.core.ui.theme.StatusColors.StatusGreen
import org.meshtastic.core.ui.theme.StatusColors.StatusRed
diff --git a/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsViewModel.kt b/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsViewModel.kt
index 0f59f85b3..d988804ca 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsViewModel.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/connections/ConnectionsViewModel.kt
@@ -20,9 +20,7 @@ package com.geeksville.mesh.ui.connections
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.LocalOnlyProtos.LocalConfig
-import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.repository.bluetooth.BluetoothRepository
-import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
@@ -30,6 +28,8 @@ import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.stateIn
+import org.meshtastic.core.data.repository.NodeRepository
+import org.meshtastic.core.data.repository.RadioConfigRepository
import org.meshtastic.core.database.entity.MyNodeEntity
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.prefs.ui.UiPrefs
diff --git a/app/src/main/java/com/geeksville/mesh/ui/map/BaseMapViewModel.kt b/app/src/main/java/com/geeksville/mesh/ui/map/BaseMapViewModel.kt
index 70f7c1cda..af473d967 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/map/BaseMapViewModel.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/map/BaseMapViewModel.kt
@@ -21,8 +21,6 @@ import android.os.RemoteException
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.MeshProtos
-import com.geeksville.mesh.database.NodeRepository
-import com.geeksville.mesh.database.PacketRepository
import com.geeksville.mesh.service.ServiceRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
@@ -33,6 +31,8 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
+import org.meshtastic.core.data.repository.NodeRepository
+import org.meshtastic.core.data.repository.PacketRepository
import org.meshtastic.core.database.entity.Packet
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.model.DataPacket
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 3affaee13..4408e1003 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
@@ -95,7 +95,6 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.geeksville.mesh.AppOnlyProtos
-import com.geeksville.mesh.model.getChannel
import com.geeksville.mesh.ui.common.components.SecurityIcon
import com.geeksville.mesh.ui.node.components.NodeKeyStatusIcon
import com.geeksville.mesh.ui.node.components.NodeMenuAction
@@ -106,6 +105,7 @@ import org.meshtastic.core.database.entity.QuickChatAction
import org.meshtastic.core.database.model.Message
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.model.DataPacket
+import org.meshtastic.core.model.util.getChannel
import org.meshtastic.core.strings.R
import org.meshtastic.core.ui.theme.AppTheme
import java.nio.charset.StandardCharsets
diff --git a/app/src/main/java/com/geeksville/mesh/ui/message/MessageViewModel.kt b/app/src/main/java/com/geeksville/mesh/ui/message/MessageViewModel.kt
index eac3456b7..ebeb49a39 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/message/MessageViewModel.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/message/MessageViewModel.kt
@@ -21,10 +21,6 @@ import android.os.RemoteException
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.channelSet
-import com.geeksville.mesh.database.NodeRepository
-import com.geeksville.mesh.database.PacketRepository
-import com.geeksville.mesh.database.QuickChatActionRepository
-import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.MeshServiceNotifications
import com.geeksville.mesh.service.ServiceAction
import com.geeksville.mesh.service.ServiceRepository
@@ -40,6 +36,10 @@ import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
+import org.meshtastic.core.data.repository.NodeRepository
+import org.meshtastic.core.data.repository.PacketRepository
+import org.meshtastic.core.data.repository.QuickChatActionRepository
+import org.meshtastic.core.data.repository.RadioConfigRepository
import org.meshtastic.core.database.model.Message
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.model.DataPacket
diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetailViewModel.kt b/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetailViewModel.kt
index dd566467d..66297526b 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetailViewModel.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/NodeDetailViewModel.kt
@@ -20,7 +20,6 @@ package com.geeksville.mesh.ui.node
import android.os.RemoteException
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.service.ServiceAction
import com.geeksville.mesh.service.ServiceRepository
import com.geeksville.mesh.ui.node.components.NodeMenuAction
@@ -30,6 +29,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
+import org.meshtastic.core.data.repository.NodeRepository
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.model.Position
import timber.log.Timber
diff --git a/app/src/main/java/com/geeksville/mesh/ui/node/NodesViewModel.kt b/app/src/main/java/com/geeksville/mesh/ui/node/NodesViewModel.kt
index d94df5c2d..c80adffb8 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/node/NodesViewModel.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/node/NodesViewModel.kt
@@ -21,8 +21,6 @@ import android.os.RemoteException
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.AdminProtos
-import com.geeksville.mesh.database.NodeRepository
-import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceAction
import com.geeksville.mesh.service.ServiceRepository
import dagger.hilt.android.lifecycle.HiltViewModel
@@ -38,6 +36,8 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
+import org.meshtastic.core.data.repository.NodeRepository
+import org.meshtastic.core.data.repository.RadioConfigRepository
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.database.model.NodeSortOption
import org.meshtastic.core.model.Position
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/SettingsViewModel.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/SettingsViewModel.kt
index 9fbdaa75a..5a79ba2e1 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/SettingsViewModel.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/SettingsViewModel.kt
@@ -26,9 +26,6 @@ import com.geeksville.mesh.LocalOnlyProtos.LocalConfig
import com.geeksville.mesh.MeshProtos
import com.geeksville.mesh.Portnums
import com.geeksville.mesh.android.Logging
-import com.geeksville.mesh.database.MeshLogRepository
-import com.geeksville.mesh.database.NodeRepository
-import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
@@ -44,6 +41,9 @@ import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
+import org.meshtastic.core.data.repository.MeshLogRepository
+import org.meshtastic.core.data.repository.NodeRepository
+import org.meshtastic.core.data.repository.RadioConfigRepository
import org.meshtastic.core.database.entity.MyNodeEntity
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.datastore.UiPreferencesDataSource
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/CleanNodeDatabaseViewModel.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/CleanNodeDatabaseViewModel.kt
index ce74b45b9..36ea257a1 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/CleanNodeDatabaseViewModel.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/CleanNodeDatabaseViewModel.kt
@@ -19,12 +19,12 @@ package com.geeksville.mesh.ui.settings.radio
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
-import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.service.ServiceRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
+import org.meshtastic.core.data.repository.NodeRepository
import org.meshtastic.core.database.entity.NodeEntity
import javax.inject.Inject
import kotlin.time.Duration.Companion.days
diff --git a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfigViewModel.kt b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfigViewModel.kt
index dbd87b8be..243c56e35 100644
--- a/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfigViewModel.kt
+++ b/app/src/main/java/com/geeksville/mesh/ui/settings/radio/RadioConfigViewModel.kt
@@ -45,14 +45,11 @@ import com.geeksville.mesh.android.GeeksvilleApplication
import com.geeksville.mesh.android.Logging
import com.geeksville.mesh.android.isAnalyticsAvailable
import com.geeksville.mesh.config
-import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.deviceProfile
import com.geeksville.mesh.model.getChannelList
-import com.geeksville.mesh.model.toChannelSet
import com.geeksville.mesh.moduleConfig
import com.geeksville.mesh.navigation.ConfigRoute
import com.geeksville.mesh.navigation.ModuleRoute
-import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.repository.location.LocationRepository
import com.geeksville.mesh.service.ConnectionState
import com.geeksville.mesh.service.ServiceRepository
@@ -72,10 +69,13 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.json.JSONObject
+import org.meshtastic.core.data.repository.NodeRepository
+import org.meshtastic.core.data.repository.RadioConfigRepository
import org.meshtastic.core.database.entity.MyNodeEntity
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.database.model.getStringResFrom
import org.meshtastic.core.model.Position
+import org.meshtastic.core.model.util.toChannelSet
import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.prefs.analytics.AnalyticsPrefs
import org.meshtastic.core.prefs.map.MapConsentPrefs
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 92441f3be..28709d62e 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
@@ -96,9 +96,6 @@ import com.geeksville.mesh.android.GeeksvilleApplication
import com.geeksville.mesh.channelSet
import com.geeksville.mesh.copy
import com.geeksville.mesh.model.UIViewModel
-import com.geeksville.mesh.model.getChannelUrl
-import com.geeksville.mesh.model.qrCode
-import com.geeksville.mesh.model.toChannelSet
import com.geeksville.mesh.navigation.ConfigRoute
import com.geeksville.mesh.navigation.getNavRouteFrom
import com.geeksville.mesh.service.ConnectionState
@@ -112,6 +109,9 @@ import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanOptions
import kotlinx.coroutines.launch
import org.meshtastic.core.model.Channel
+import org.meshtastic.core.model.util.getChannelUrl
+import org.meshtastic.core.model.util.qrCode
+import org.meshtastic.core.model.util.toChannelSet
import org.meshtastic.core.navigation.Route
import org.meshtastic.core.strings.R
import org.meshtastic.core.ui.component.AdaptiveTwoPane
diff --git a/core/data/build.gradle.kts b/core/data/build.gradle.kts
index 76c2256a4..37da5a7ef 100644
--- a/core/data/build.gradle.kts
+++ b/core/data/build.gradle.kts
@@ -25,8 +25,13 @@ plugins {
android { namespace = "org.meshtastic.core.data" }
dependencies {
+ implementation(projects.core.database)
+ implementation(projects.core.datastore)
implementation(projects.core.di)
+ implementation(projects.core.model)
+ implementation(projects.core.network)
implementation(projects.core.prefs)
+ implementation(projects.core.proto)
implementation(libs.kotlinx.coroutines.android)
implementation(libs.kotlinx.serialization.json)
diff --git a/core/data/detekt-baseline.xml b/core/data/detekt-baseline.xml
new file mode 100644
index 000000000..6f500e50a
--- /dev/null
+++ b/core/data/detekt-baseline.xml
@@ -0,0 +1,8 @@
+
+
+
+
+ MagicNumber:PacketRepository.kt$PacketRepository$500
+ TooManyFunctions:PacketRepository.kt$PacketRepository
+
+
diff --git a/app/src/main/java/com/geeksville/mesh/repository/api/DeviceHardwareJsonDataSource.kt b/core/data/src/main/kotlin/org/meshtastic/core/data/datasource/DeviceHardwareJsonDataSource.kt
similarity index 96%
rename from app/src/main/java/com/geeksville/mesh/repository/api/DeviceHardwareJsonDataSource.kt
rename to core/data/src/main/kotlin/org/meshtastic/core/data/datasource/DeviceHardwareJsonDataSource.kt
index 58f2b7245..bcbe416f9 100644
--- a/app/src/main/java/com/geeksville/mesh/repository/api/DeviceHardwareJsonDataSource.kt
+++ b/core/data/src/main/kotlin/org/meshtastic/core/data/datasource/DeviceHardwareJsonDataSource.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.repository.api
+package org.meshtastic.core.data.datasource
import android.app.Application
import kotlinx.serialization.ExperimentalSerializationApi
diff --git a/app/src/main/java/com/geeksville/mesh/repository/api/DeviceHardwareLocalDataSource.kt b/core/data/src/main/kotlin/org/meshtastic/core/data/datasource/DeviceHardwareLocalDataSource.kt
similarity index 89%
rename from app/src/main/java/com/geeksville/mesh/repository/api/DeviceHardwareLocalDataSource.kt
rename to core/data/src/main/kotlin/org/meshtastic/core/data/datasource/DeviceHardwareLocalDataSource.kt
index 8450f87ee..00b36aba0 100644
--- a/app/src/main/java/com/geeksville/mesh/repository/api/DeviceHardwareLocalDataSource.kt
+++ b/core/data/src/main/kotlin/org/meshtastic/core/data/datasource/DeviceHardwareLocalDataSource.kt
@@ -15,8 +15,9 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.repository.api
+package org.meshtastic.core.data.datasource
+import dagger.Lazy
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.meshtastic.core.database.dao.DeviceHardwareDao
@@ -25,11 +26,7 @@ import org.meshtastic.core.database.entity.asEntity
import org.meshtastic.core.model.NetworkDeviceHardware
import javax.inject.Inject
-class DeviceHardwareLocalDataSource
-@Inject
-constructor(
- private val deviceHardwareDaoLazy: dagger.Lazy,
-) {
+class DeviceHardwareLocalDataSource @Inject constructor(private val deviceHardwareDaoLazy: Lazy) {
private val deviceHardwareDao by lazy { deviceHardwareDaoLazy.get() }
suspend fun insertAllDeviceHardware(deviceHardware: List) = withContext(Dispatchers.IO) {
diff --git a/app/src/main/java/com/geeksville/mesh/repository/api/FirmwareReleaseJsonDataSource.kt b/core/data/src/main/kotlin/org/meshtastic/core/data/datasource/FirmwareReleaseJsonDataSource.kt
similarity index 96%
rename from app/src/main/java/com/geeksville/mesh/repository/api/FirmwareReleaseJsonDataSource.kt
rename to core/data/src/main/kotlin/org/meshtastic/core/data/datasource/FirmwareReleaseJsonDataSource.kt
index f2de879a4..c9de3fe67 100644
--- a/app/src/main/java/com/geeksville/mesh/repository/api/FirmwareReleaseJsonDataSource.kt
+++ b/core/data/src/main/kotlin/org/meshtastic/core/data/datasource/FirmwareReleaseJsonDataSource.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.repository.api
+package org.meshtastic.core.data.datasource
import android.app.Application
import kotlinx.serialization.ExperimentalSerializationApi
diff --git a/app/src/main/java/com/geeksville/mesh/repository/api/FirmwareReleaseLocalDataSource.kt b/core/data/src/main/kotlin/org/meshtastic/core/data/datasource/FirmwareReleaseLocalDataSource.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/repository/api/FirmwareReleaseLocalDataSource.kt
rename to core/data/src/main/kotlin/org/meshtastic/core/data/datasource/FirmwareReleaseLocalDataSource.kt
index 471151e8e..b889ecc02 100644
--- a/app/src/main/java/com/geeksville/mesh/repository/api/FirmwareReleaseLocalDataSource.kt
+++ b/core/data/src/main/kotlin/org/meshtastic/core/data/datasource/FirmwareReleaseLocalDataSource.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.repository.api
+package org.meshtastic.core.data.datasource
import dagger.Lazy
import kotlinx.coroutines.Dispatchers
diff --git a/app/src/main/java/com/geeksville/mesh/repository/api/DeviceHardwareRepository.kt b/core/data/src/main/kotlin/org/meshtastic/core/data/repository/DeviceHardwareRepository.kt
similarity index 87%
rename from app/src/main/java/com/geeksville/mesh/repository/api/DeviceHardwareRepository.kt
rename to core/data/src/main/kotlin/org/meshtastic/core/data/repository/DeviceHardwareRepository.kt
index c2d107427..eb687a7da 100644
--- a/app/src/main/java/com/geeksville/mesh/repository/api/DeviceHardwareRepository.kt
+++ b/core/data/src/main/kotlin/org/meshtastic/core/data/repository/DeviceHardwareRepository.kt
@@ -15,16 +15,17 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.repository.api
+package org.meshtastic.core.data.repository
-import com.geeksville.mesh.android.BuildUtils.debug
-import com.geeksville.mesh.android.BuildUtils.warn
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
+import org.meshtastic.core.data.datasource.DeviceHardwareJsonDataSource
+import org.meshtastic.core.data.datasource.DeviceHardwareLocalDataSource
import org.meshtastic.core.database.entity.DeviceHardwareEntity
import org.meshtastic.core.database.entity.asExternalModel
import org.meshtastic.core.model.DeviceHardware
import org.meshtastic.core.network.DeviceHardwareRemoteDataSource
+import timber.log.Timber
import java.util.concurrent.TimeUnit
import javax.inject.Inject
import javax.inject.Singleton
@@ -60,14 +61,14 @@ constructor(
// 1. Attempt to retrieve from cache first
val cachedEntity = localDataSource.getByHwModel(hwModel)
if (cachedEntity != null && !cachedEntity.isStale()) {
- debug("Using fresh cached device hardware for model $hwModel")
+ Timber.d("Using fresh cached device hardware for model $hwModel")
return@withContext Result.success(cachedEntity.asExternalModel())
}
}
// 2. Fetch from remote API
runCatching {
- debug("Fetching device hardware from remote API.")
+ Timber.d("Fetching device hardware from remote API.")
val remoteHardware = remoteDataSource.getAllDeviceHardware()
localDataSource.insertAllDeviceHardware(remoteHardware)
@@ -78,17 +79,17 @@ constructor(
return@withContext Result.success(it)
}
.onFailure { e ->
- warn("Failed to fetch device hardware from server: ${e.message}")
+ Timber.w("Failed to fetch device hardware from server: ${e.message}")
// 3. Attempt to use stale cache as a fallback
val staleEntity = localDataSource.getByHwModel(hwModel)
if (staleEntity != null) {
- debug("Using stale cached device hardware for model $hwModel")
+ Timber.d("Using stale cached device hardware for model $hwModel")
return@withContext Result.success(staleEntity.asExternalModel())
}
// 4. Fallback to bundled JSON if cache is empty
- debug("Cache is empty, falling back to bundled JSON asset.")
+ Timber.d("Cache is empty, falling back to bundled JSON asset.")
return@withContext loadFromBundledJson(hwModel)
}
}
diff --git a/app/src/main/java/com/geeksville/mesh/repository/api/FirmwareReleaseRepository.kt b/core/data/src/main/kotlin/org/meshtastic/core/data/repository/FirmwareReleaseRepository.kt
similarity index 88%
rename from app/src/main/java/com/geeksville/mesh/repository/api/FirmwareReleaseRepository.kt
rename to core/data/src/main/kotlin/org/meshtastic/core/data/repository/FirmwareReleaseRepository.kt
index 2c2efa1c7..ae0d1b389 100644
--- a/app/src/main/java/com/geeksville/mesh/repository/api/FirmwareReleaseRepository.kt
+++ b/core/data/src/main/kotlin/org/meshtastic/core/data/repository/FirmwareReleaseRepository.kt
@@ -15,17 +15,18 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.repository.api
+package org.meshtastic.core.data.repository
-import com.geeksville.mesh.android.BuildUtils.debug
-import com.geeksville.mesh.android.BuildUtils.warn
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
+import org.meshtastic.core.data.datasource.FirmwareReleaseJsonDataSource
+import org.meshtastic.core.data.datasource.FirmwareReleaseLocalDataSource
import org.meshtastic.core.database.entity.FirmwareRelease
import org.meshtastic.core.database.entity.FirmwareReleaseEntity
import org.meshtastic.core.database.entity.FirmwareReleaseType
import org.meshtastic.core.database.entity.asExternalModel
import org.meshtastic.core.network.FirmwareReleaseRemoteDataSource
+import timber.log.Timber
import java.util.concurrent.TimeUnit
import javax.inject.Inject
import javax.inject.Singleton
@@ -67,7 +68,7 @@ constructor(
// This gives the UI something to show immediately.
val cachedRelease = localDataSource.getLatestRelease(releaseType)
cachedRelease?.let {
- debug("Emitting cached firmware for $releaseType (isStale=${it.isStale()})")
+ Timber.d("Emitting cached firmware for $releaseType (isStale=${it.isStale()})")
emit(it.asExternalModel())
}
@@ -83,7 +84,7 @@ constructor(
// The `distinctUntilChanged()` operator on the collector side will prevent
// re-emitting the same data if the cache wasn't actually updated.
val finalRelease = localDataSource.getLatestRelease(releaseType)
- debug("Emitting final firmware for $releaseType from cache.")
+ Timber.d("Emitting final firmware for $releaseType from cache.")
emit(finalRelease?.asExternalModel())
}
@@ -97,7 +98,7 @@ constructor(
private suspend fun updateCacheFromSources() {
val remoteFetchSuccess =
runCatching {
- debug("Fetching fresh firmware releases from remote API.")
+ Timber.d("Fetching fresh firmware releases from remote API.")
val networkReleases = remoteDataSource.getFirmwareReleases()
// The API fetches all release types, so we cache them all at once.
@@ -108,13 +109,13 @@ constructor(
// If remote fetch failed, try the JSON fallback as a last resort.
if (!remoteFetchSuccess) {
- warn("Remote fetch failed, attempting to cache from bundled JSON.")
+ Timber.w("Remote fetch failed, attempting to cache from bundled JSON.")
runCatching {
val jsonReleases = jsonDataSource.loadFirmwareReleaseFromJsonAsset()
localDataSource.insertFirmwareReleases(jsonReleases.releases.stable, FirmwareReleaseType.STABLE)
localDataSource.insertFirmwareReleases(jsonReleases.releases.alpha, FirmwareReleaseType.ALPHA)
}
- .onFailure { warn("Failed to cache from JSON: ${it.message}") }
+ .onFailure { Timber.w("Failed to cache from JSON: ${it.message}") }
}
}
diff --git a/app/src/main/java/com/geeksville/mesh/database/MeshLogRepository.kt b/core/data/src/main/kotlin/org/meshtastic/core/data/repository/MeshLogRepository.kt
similarity index 86%
rename from app/src/main/java/com/geeksville/mesh/database/MeshLogRepository.kt
rename to core/data/src/main/kotlin/org/meshtastic/core/data/repository/MeshLogRepository.kt
index 24255e54a..2047f12af 100644
--- a/app/src/main/java/com/geeksville/mesh/database/MeshLogRepository.kt
+++ b/core/data/src/main/kotlin/org/meshtastic/core/data/repository/MeshLogRepository.kt
@@ -15,13 +15,14 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.database
+package org.meshtastic.core.data.repository
-import com.geeksville.mesh.CoroutineDispatchers
import com.geeksville.mesh.MeshProtos
import com.geeksville.mesh.MeshProtos.MeshPacket
import com.geeksville.mesh.Portnums
import com.geeksville.mesh.TelemetryProtos.Telemetry
+import dagger.Lazy
+import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.distinctUntilChanged
@@ -30,22 +31,23 @@ import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.withContext
import org.meshtastic.core.database.dao.MeshLogDao
import org.meshtastic.core.database.entity.MeshLog
+import org.meshtastic.core.di.annotation.IoDispatcher
import javax.inject.Inject
@Suppress("TooManyFunctions")
class MeshLogRepository
@Inject
constructor(
- private val meshLogDaoLazy: dagger.Lazy,
- private val dispatchers: CoroutineDispatchers,
+ private val meshLogDaoLazy: Lazy,
+ @IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) {
private val meshLogDao by lazy { meshLogDaoLazy.get() }
fun getAllLogs(maxItems: Int = MAX_ITEMS): Flow> =
- meshLogDao.getAllLogs(maxItems).flowOn(dispatchers.io).conflate()
+ meshLogDao.getAllLogs(maxItems).flowOn(ioDispatcher).conflate()
fun getAllLogsInReceiveOrder(maxItems: Int = MAX_ITEMS): Flow> =
- meshLogDao.getAllLogsInReceiveOrder(maxItems).flowOn(dispatchers.io).conflate()
+ meshLogDao.getAllLogsInReceiveOrder(maxItems).flowOn(ioDispatcher).conflate()
private fun parseTelemetryLog(log: MeshLog): Telemetry? = runCatching {
Telemetry.parseFrom(log.fromRadio.packet.decoded.payload)
@@ -109,34 +111,34 @@ constructor(
.getLogsFrom(nodeNum, Portnums.PortNum.TELEMETRY_APP_VALUE, MAX_MESH_PACKETS)
.distinctUntilChanged()
.mapLatest { list -> list.mapNotNull(::parseTelemetryLog) }
- .flowOn(dispatchers.io)
+ .flowOn(ioDispatcher)
fun getLogsFrom(
nodeNum: Int,
portNum: Int = Portnums.PortNum.UNKNOWN_APP_VALUE,
maxItem: Int = MAX_MESH_PACKETS,
): Flow> =
- meshLogDao.getLogsFrom(nodeNum, portNum, maxItem).distinctUntilChanged().flowOn(dispatchers.io)
+ meshLogDao.getLogsFrom(nodeNum, portNum, maxItem).distinctUntilChanged().flowOn(ioDispatcher)
/*
* Retrieves MeshPackets matching 'nodeNum' and 'portNum'.
* If 'portNum' is not specified, returns all MeshPackets. Otherwise, filters by 'portNum'.
*/
fun getMeshPacketsFrom(nodeNum: Int, portNum: Int = Portnums.PortNum.UNKNOWN_APP_VALUE): Flow> =
- getLogsFrom(nodeNum, portNum).mapLatest { list -> list.map { it.fromRadio.packet } }.flowOn(dispatchers.io)
+ getLogsFrom(nodeNum, portNum).mapLatest { list -> list.map { it.fromRadio.packet } }.flowOn(ioDispatcher)
fun getMyNodeInfo(): Flow = getLogsFrom(0, 0)
.mapLatest { list -> list.firstOrNull { it.myNodeInfo != null }?.myNodeInfo }
- .flowOn(dispatchers.io)
+ .flowOn(ioDispatcher)
- suspend fun insert(log: MeshLog) = withContext(dispatchers.io) { meshLogDao.insert(log) }
+ suspend fun insert(log: MeshLog) = withContext(ioDispatcher) { meshLogDao.insert(log) }
- suspend fun deleteAll() = withContext(dispatchers.io) { meshLogDao.deleteAll() }
+ suspend fun deleteAll() = withContext(ioDispatcher) { meshLogDao.deleteAll() }
- suspend fun deleteLog(uuid: String) = withContext(dispatchers.io) { meshLogDao.deleteLog(uuid) }
+ suspend fun deleteLog(uuid: String) = withContext(ioDispatcher) { meshLogDao.deleteLog(uuid) }
suspend fun deleteLogs(nodeNum: Int, portNum: Int) =
- withContext(dispatchers.io) { meshLogDao.deleteLogs(nodeNum, portNum) }
+ withContext(ioDispatcher) { meshLogDao.deleteLogs(nodeNum, portNum) }
companion object {
private const val MAX_ITEMS = 500
diff --git a/app/src/main/java/com/geeksville/mesh/database/NodeRepository.kt b/core/data/src/main/kotlin/org/meshtastic/core/data/repository/NodeRepository.kt
similarity index 82%
rename from app/src/main/java/com/geeksville/mesh/database/NodeRepository.kt
rename to core/data/src/main/kotlin/org/meshtastic/core/data/repository/NodeRepository.kt
index f595a06e6..bb03ce42d 100644
--- a/app/src/main/java/com/geeksville/mesh/database/NodeRepository.kt
+++ b/core/data/src/main/kotlin/org/meshtastic/core/data/repository/NodeRepository.kt
@@ -15,12 +15,12 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.database
+package org.meshtastic.core.data.repository
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.coroutineScope
-import com.geeksville.mesh.CoroutineDispatchers
import com.geeksville.mesh.MeshProtos
+import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
@@ -38,10 +38,12 @@ import org.meshtastic.core.database.entity.MyNodeEntity
import org.meshtastic.core.database.entity.NodeEntity
import org.meshtastic.core.database.model.Node
import org.meshtastic.core.database.model.NodeSortOption
+import org.meshtastic.core.di.annotation.IoDispatcher
import org.meshtastic.core.model.DataPacket
import org.meshtastic.core.model.util.onlineTimeThreshold
import javax.inject.Inject
import javax.inject.Singleton
+import kotlin.collections.map
@Singleton
@Suppress("TooManyFunctions")
@@ -50,13 +52,13 @@ class NodeRepository
constructor(
processLifecycle: Lifecycle,
private val nodeInfoDao: NodeInfoDao,
- private val dispatchers: CoroutineDispatchers,
+ @IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) {
// hardware info about our local device (can be null)
val myNodeInfo: StateFlow =
nodeInfoDao
.getMyNodeInfo()
- .flowOn(dispatchers.io)
+ .flowOn(ioDispatcher)
.stateIn(processLifecycle.coroutineScope, SharingStarted.Eagerly, null)
// our node info
@@ -81,7 +83,7 @@ constructor(
_ourNodeInfo.value = ourNodeInfo
_myId.value = ourNodeInfo?.user?.id
}
- .flowOn(dispatchers.io)
+ .flowOn(ioDispatcher)
.conflate()
.stateIn(processLifecycle.coroutineScope, SharingStarted.Eagerly, emptyMap())
@@ -113,43 +115,43 @@ constructor(
lastHeardMin = if (onlyOnline) onlineTimeThreshold() else -1,
)
.mapLatest { list -> list.map { it.toModel() } }
- .flowOn(dispatchers.io)
+ .flowOn(ioDispatcher)
.conflate()
- suspend fun upsert(node: NodeEntity) = withContext(dispatchers.io) { nodeInfoDao.upsert(node) }
+ suspend fun upsert(node: NodeEntity) = withContext(ioDispatcher) { nodeInfoDao.upsert(node) }
suspend fun installConfig(mi: MyNodeEntity, nodes: List) =
- withContext(dispatchers.io) { nodeInfoDao.installConfig(mi, nodes) }
+ withContext(ioDispatcher) { nodeInfoDao.installConfig(mi, nodes) }
- suspend fun clearNodeDB() = withContext(dispatchers.io) { nodeInfoDao.clearNodeInfo() }
+ suspend fun clearNodeDB() = withContext(ioDispatcher) { nodeInfoDao.clearNodeInfo() }
- suspend fun deleteNode(num: Int) = withContext(dispatchers.io) {
+ suspend fun deleteNode(num: Int) = withContext(ioDispatcher) {
nodeInfoDao.deleteNode(num)
nodeInfoDao.deleteMetadata(num)
}
- suspend fun deleteNodes(nodeNums: List) = withContext(dispatchers.io) {
+ suspend fun deleteNodes(nodeNums: List) = withContext(ioDispatcher) {
nodeInfoDao.deleteNodes(nodeNums)
nodeNums.forEach { nodeInfoDao.deleteMetadata(it) }
}
suspend fun getNodesOlderThan(lastHeard: Int): List =
- withContext(dispatchers.io) { nodeInfoDao.getNodesOlderThan(lastHeard) }
+ withContext(ioDispatcher) { nodeInfoDao.getNodesOlderThan(lastHeard) }
- suspend fun getUnknownNodes(): List = withContext(dispatchers.io) { nodeInfoDao.getUnknownNodes() }
+ suspend fun getUnknownNodes(): List = withContext(ioDispatcher) { nodeInfoDao.getUnknownNodes() }
- suspend fun insertMetadata(metadata: MetadataEntity) = withContext(dispatchers.io) { nodeInfoDao.upsert(metadata) }
+ suspend fun insertMetadata(metadata: MetadataEntity) = withContext(ioDispatcher) { nodeInfoDao.upsert(metadata) }
val onlineNodeCount: Flow =
nodeInfoDao
.nodeDBbyNum()
.mapLatest { map -> map.values.count { it.node.lastHeard > onlineTimeThreshold() } }
- .flowOn(dispatchers.io)
+ .flowOn(ioDispatcher)
.conflate()
val totalNodeCount: Flow =
- nodeInfoDao.nodeDBbyNum().mapLatest { map -> map.values.count() }.flowOn(dispatchers.io).conflate()
+ nodeInfoDao.nodeDBbyNum().mapLatest { map -> map.values.count() }.flowOn(ioDispatcher).conflate()
suspend fun setNodeNotes(num: Int, notes: String) =
- withContext(dispatchers.io) { nodeInfoDao.setNodeNotes(num, notes) }
+ withContext(ioDispatcher) { nodeInfoDao.setNodeNotes(num, notes) }
}
diff --git a/app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt b/core/data/src/main/kotlin/org/meshtastic/core/data/repository/PacketRepository.kt
similarity index 98%
rename from app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt
rename to core/data/src/main/kotlin/org/meshtastic/core/data/repository/PacketRepository.kt
index 685330fd1..730f0515c 100644
--- a/app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt
+++ b/core/data/src/main/kotlin/org/meshtastic/core/data/repository/PacketRepository.kt
@@ -15,9 +15,10 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.database
+package org.meshtastic.core.data.repository
import com.geeksville.mesh.Portnums.PortNum
+import dagger.Lazy
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.mapLatest
@@ -31,7 +32,7 @@ import org.meshtastic.core.model.DataPacket
import org.meshtastic.core.model.MessageStatus
import javax.inject.Inject
-class PacketRepository @Inject constructor(private val packetDaoLazy: dagger.Lazy) {
+class PacketRepository @Inject constructor(private val packetDaoLazy: Lazy) {
private val packetDao by lazy { packetDaoLazy.get() }
fun getWaypoints(): Flow> = packetDao.getAllPackets(PortNum.WAYPOINT_APP_VALUE)
diff --git a/app/src/main/java/com/geeksville/mesh/database/QuickChatActionRepository.kt b/core/data/src/main/kotlin/org/meshtastic/core/data/repository/QuickChatActionRepository.kt
similarity index 58%
rename from app/src/main/java/com/geeksville/mesh/database/QuickChatActionRepository.kt
rename to core/data/src/main/kotlin/org/meshtastic/core/data/repository/QuickChatActionRepository.kt
index 40f136bdd..f05c75453 100644
--- a/app/src/main/java/com/geeksville/mesh/database/QuickChatActionRepository.kt
+++ b/core/data/src/main/kotlin/org/meshtastic/core/data/repository/QuickChatActionRepository.kt
@@ -15,31 +15,33 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.database
+package org.meshtastic.core.data.repository
-import com.geeksville.mesh.CoroutineDispatchers
+import dagger.Lazy
+import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.withContext
import org.meshtastic.core.database.dao.QuickChatActionDao
import org.meshtastic.core.database.entity.QuickChatAction
+import org.meshtastic.core.di.annotation.IoDispatcher
import javax.inject.Inject
class QuickChatActionRepository
@Inject
constructor(
- private val quickChatDaoLazy: dagger.Lazy,
- private val dispatchers: CoroutineDispatchers,
+ private val quickChatDaoLazy: Lazy,
+ @IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) {
private val quickChatActionDao by lazy { quickChatDaoLazy.get() }
- fun getAllActions() = quickChatActionDao.getAll().flowOn(dispatchers.io)
+ fun getAllActions() = quickChatActionDao.getAll().flowOn(ioDispatcher)
- suspend fun upsert(action: QuickChatAction) = withContext(dispatchers.io) { quickChatActionDao.upsert(action) }
+ suspend fun upsert(action: QuickChatAction) = withContext(ioDispatcher) { quickChatActionDao.upsert(action) }
- suspend fun deleteAll() = withContext(dispatchers.io) { quickChatActionDao.deleteAll() }
+ suspend fun deleteAll() = withContext(ioDispatcher) { quickChatActionDao.deleteAll() }
- suspend fun delete(action: QuickChatAction) = withContext(dispatchers.io) { quickChatActionDao.delete(action) }
+ suspend fun delete(action: QuickChatAction) = withContext(ioDispatcher) { quickChatActionDao.delete(action) }
suspend fun setItemPosition(uuid: Long, newPos: Int) =
- withContext(dispatchers.io) { quickChatActionDao.updateActionPosition(uuid, newPos) }
+ withContext(ioDispatcher) { quickChatActionDao.updateActionPosition(uuid, newPos) }
}
diff --git a/app/src/main/java/com/geeksville/mesh/repository/datastore/RadioConfigRepository.kt b/core/data/src/main/kotlin/org/meshtastic/core/data/repository/RadioConfigRepository.kt
similarity index 97%
rename from app/src/main/java/com/geeksville/mesh/repository/datastore/RadioConfigRepository.kt
rename to core/data/src/main/kotlin/org/meshtastic/core/data/repository/RadioConfigRepository.kt
index cf5f1f897..2300aa053 100644
--- a/app/src/main/java/com/geeksville/mesh/repository/datastore/RadioConfigRepository.kt
+++ b/core/data/src/main/kotlin/org/meshtastic/core/data/repository/RadioConfigRepository.kt
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.repository.datastore
+package org.meshtastic.core.data.repository
import com.geeksville.mesh.AppOnlyProtos.ChannelSet
import com.geeksville.mesh.ChannelProtos.Channel
@@ -25,14 +25,13 @@ import com.geeksville.mesh.ConfigProtos.Config
import com.geeksville.mesh.LocalOnlyProtos.LocalConfig
import com.geeksville.mesh.LocalOnlyProtos.LocalModuleConfig
import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig
-import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.deviceProfile
-import com.geeksville.mesh.model.getChannelUrl
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import org.meshtastic.core.datastore.ChannelSetDataSource
import org.meshtastic.core.datastore.LocalConfigDataSource
import org.meshtastic.core.datastore.ModuleConfigDataSource
+import org.meshtastic.core.model.util.getChannelUrl
import javax.inject.Inject
/**
diff --git a/core/model/build.gradle.kts b/core/model/build.gradle.kts
index 725a35c1b..ebb1f23be 100644
--- a/core/model/build.gradle.kts
+++ b/core/model/build.gradle.kts
@@ -34,4 +34,6 @@ dependencies {
implementation(projects.core.proto)
implementation(projects.core.strings)
implementation(libs.timber)
+ implementation(libs.zxing.android.embedded) { isTransitive = false }
+ implementation(libs.zxing.core)
}
diff --git a/core/model/detekt-baseline.xml b/core/model/detekt-baseline.xml
index cc5067da4..3cc9a334d 100644
--- a/core/model/detekt-baseline.xml
+++ b/core/model/detekt-baseline.xml
@@ -26,5 +26,9 @@
MagicNumber:ChannelOption.kt$ChannelOption.SHORT_FAST$.250f
MagicNumber:ChannelOption.kt$ChannelOption.SHORT_SLOW$.250f
MagicNumber:ChannelOption.kt$ChannelOption.VERY_LONG_SLOW$.0625f
+ MagicNumber:ChannelSet.kt$40
+ MagicNumber:ChannelSet.kt$960
+ SwallowedException:ChannelSet.kt$ex: Throwable
+ TooGenericExceptionCaught:ChannelSet.kt$ex: Throwable
diff --git a/app/src/main/java/com/geeksville/mesh/model/ChannelSet.kt b/core/model/src/main/kotlin/org/meshtastic/core/model/util/ChannelSet.kt
similarity index 94%
rename from app/src/main/java/com/geeksville/mesh/model/ChannelSet.kt
rename to core/model/src/main/kotlin/org/meshtastic/core/model/util/ChannelSet.kt
index 56e964624..efcc308e1 100644
--- a/app/src/main/java/com/geeksville/mesh/model/ChannelSet.kt
+++ b/core/model/src/main/kotlin/org/meshtastic/core/model/util/ChannelSet.kt
@@ -15,23 +15,23 @@
* along with this program. If not, see .
*/
-package com.geeksville.mesh.model
+package org.meshtastic.core.model.util
import android.graphics.Bitmap
import android.net.Uri
import android.util.Base64
import com.geeksville.mesh.AppOnlyProtos.ChannelSet
-import com.geeksville.mesh.android.BuildUtils.errormsg
import com.google.zxing.BarcodeFormat
import com.google.zxing.MultiFormatWriter
import com.journeyapps.barcodescanner.BarcodeEncoder
import org.meshtastic.core.model.Channel
+import timber.log.Timber
import java.net.MalformedURLException
import kotlin.jvm.Throws
private const val MESHTASTIC_HOST = "meshtastic.org"
private const val CHANNEL_PATH = "/e/"
-internal const val URL_PREFIX = "https://$MESHTASTIC_HOST$CHANNEL_PATH"
+const val URL_PREFIX = "https://$MESHTASTIC_HOST$CHANNEL_PATH"
private const val BASE64FLAGS = Base64.URL_SAFE + Base64.NO_WRAP + Base64.NO_PADDING
/**
@@ -86,6 +86,6 @@ fun ChannelSet.qrCode(shouldAdd: Boolean): Bitmap? = try {
val barcodeEncoder = BarcodeEncoder()
barcodeEncoder.createBitmap(bitMatrix)
} catch (ex: Throwable) {
- errormsg("URL was too complex to render as barcode")
+ Timber.e("URL was too complex to render as barcode")
null
}