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 }