Move some repo classes to `:core:data` (#3214)

pull/3216/head
Phil Oliver 2025-09-26 17:45:11 -04:00 zatwierdzone przez GitHub
rodzic af8e1daa5d
commit 3e83e61a1a
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
38 zmienionych plików z 159 dodań i 140 usunięć

Wyświetl plik

@ -124,8 +124,6 @@
<ID>MagicNumber:BluetoothInterface.kt$BluetoothInterface$1000</ID> <ID>MagicNumber:BluetoothInterface.kt$BluetoothInterface$1000</ID>
<ID>MagicNumber:BluetoothInterface.kt$BluetoothInterface$500</ID> <ID>MagicNumber:BluetoothInterface.kt$BluetoothInterface$500</ID>
<ID>MagicNumber:BluetoothInterface.kt$BluetoothInterface$512</ID> <ID>MagicNumber:BluetoothInterface.kt$BluetoothInterface$512</ID>
<ID>MagicNumber:ChannelSet.kt$40</ID>
<ID>MagicNumber:ChannelSet.kt$960</ID>
<ID>MagicNumber:Contacts.kt$7</ID> <ID>MagicNumber:Contacts.kt$7</ID>
<ID>MagicNumber:Contacts.kt$8</ID> <ID>MagicNumber:Contacts.kt$8</ID>
<ID>MagicNumber:Debug.kt$3</ID> <ID>MagicNumber:Debug.kt$3</ID>
@ -150,7 +148,6 @@
<ID>MagicNumber:MetricsViewModel.kt$MetricsViewModel$1000L</ID> <ID>MagicNumber:MetricsViewModel.kt$MetricsViewModel$1000L</ID>
<ID>MagicNumber:MetricsViewModel.kt$MetricsViewModel$1e-5</ID> <ID>MagicNumber:MetricsViewModel.kt$MetricsViewModel$1e-5</ID>
<ID>MagicNumber:MetricsViewModel.kt$MetricsViewModel$1e-7</ID> <ID>MagicNumber:MetricsViewModel.kt$MetricsViewModel$1e-7</ID>
<ID>MagicNumber:PacketRepository.kt$PacketRepository$500</ID>
<ID>MagicNumber:PacketResponseStateDialog.kt$100</ID> <ID>MagicNumber:PacketResponseStateDialog.kt$100</ID>
<ID>MagicNumber:PowerConfigItemList.kt$3600</ID> <ID>MagicNumber:PowerConfigItemList.kt$3600</ID>
<ID>MagicNumber:ProbeTableProvider.kt$ProbeTableProvider$21972</ID> <ID>MagicNumber:ProbeTableProvider.kt$ProbeTableProvider$21972</ID>
@ -355,7 +352,6 @@
<ID>SpacingAroundKeyword:Exceptions.kt$if</ID> <ID>SpacingAroundKeyword:Exceptions.kt$if</ID>
<ID>SpacingAroundKeyword:Exceptions.kt$when</ID> <ID>SpacingAroundKeyword:Exceptions.kt$when</ID>
<ID>SwallowedException:BluetoothInterface.kt$BluetoothInterface$ex: CancellationException</ID> <ID>SwallowedException:BluetoothInterface.kt$BluetoothInterface$ex: CancellationException</ID>
<ID>SwallowedException:ChannelSet.kt$ex: Throwable</ID>
<ID>SwallowedException:Exceptions.kt$ex: Throwable</ID> <ID>SwallowedException:Exceptions.kt$ex: Throwable</ID>
<ID>SwallowedException:MeshService.kt$MeshService$ex: BLEException</ID> <ID>SwallowedException:MeshService.kt$MeshService$ex: BLEException</ID>
<ID>SwallowedException:MeshService.kt$MeshService$ex: CancellationException</ID> <ID>SwallowedException:MeshService.kt$MeshService$ex: CancellationException</ID>
@ -366,7 +362,6 @@
<ID>SwallowedException:TCPInterface.kt$TCPInterface$ex: SocketTimeoutException</ID> <ID>SwallowedException:TCPInterface.kt$TCPInterface$ex: SocketTimeoutException</ID>
<ID>TooGenericExceptionCaught:BTScanModel.kt$BTScanModel$ex: Throwable</ID> <ID>TooGenericExceptionCaught:BTScanModel.kt$BTScanModel$ex: Throwable</ID>
<ID>TooGenericExceptionCaught:BluetoothInterface.kt$BluetoothInterface$ex: Exception</ID> <ID>TooGenericExceptionCaught:BluetoothInterface.kt$BluetoothInterface$ex: Exception</ID>
<ID>TooGenericExceptionCaught:ChannelSet.kt$ex: Throwable</ID>
<ID>TooGenericExceptionCaught:Exceptions.kt$ex: Throwable</ID> <ID>TooGenericExceptionCaught:Exceptions.kt$ex: Throwable</ID>
<ID>TooGenericExceptionCaught:LanguageUtils.kt$LanguageUtils$e: Exception</ID> <ID>TooGenericExceptionCaught:LanguageUtils.kt$LanguageUtils$e: Exception</ID>
<ID>TooGenericExceptionCaught:LocationRepository.kt$LocationRepository$e: Exception</ID> <ID>TooGenericExceptionCaught:LocationRepository.kt$LocationRepository$e: Exception</ID>
@ -391,7 +386,6 @@
<ID>TooManyFunctions:MessageViewModel.kt$MessageViewModel : ViewModel</ID> <ID>TooManyFunctions:MessageViewModel.kt$MessageViewModel : ViewModel</ID>
<ID>TooManyFunctions:NodeDetail.kt$com.geeksville.mesh.ui.node.NodeDetail.kt</ID> <ID>TooManyFunctions:NodeDetail.kt$com.geeksville.mesh.ui.node.NodeDetail.kt</ID>
<ID>TooManyFunctions:NodesViewModel.kt$NodesViewModel : ViewModel</ID> <ID>TooManyFunctions:NodesViewModel.kt$NodesViewModel : ViewModel</ID>
<ID>TooManyFunctions:PacketRepository.kt$PacketRepository</ID>
<ID>TooManyFunctions:RadioConfigViewModel.kt$RadioConfigViewModel : ViewModelLogging</ID> <ID>TooManyFunctions:RadioConfigViewModel.kt$RadioConfigViewModel : ViewModelLogging</ID>
<ID>TooManyFunctions:RadioInterfaceService.kt$RadioInterfaceService : Logging</ID> <ID>TooManyFunctions:RadioInterfaceService.kt$RadioInterfaceService : Logging</ID>
<ID>TooManyFunctions:SafeBluetooth.kt$SafeBluetooth : LoggingCloseable</ID> <ID>TooManyFunctions:SafeBluetooth.kt$SafeBluetooth : LoggingCloseable</ID>

Wyświetl plik

@ -18,21 +18,20 @@
package com.geeksville.mesh package com.geeksville.mesh
import android.net.Uri 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.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest import dagger.hilt.android.testing.HiltAndroidTest
import org.junit.Assert import org.junit.Assert
import org.junit.Before import org.junit.Before
import org.junit.Rule import org.junit.Rule
import org.junit.Test 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 @HiltAndroidTest
class ChannelSetTest { class ChannelSetTest {
@get:Rule @get:Rule var hiltRule = HiltAndroidRule(this)
var hiltRule = HiltAndroidRule(this)
@Before @Before
fun init() { fun init() {

Wyświetl plik

@ -18,14 +18,14 @@
package com.geeksville.mesh package com.geeksville.mesh
import androidx.test.ext.junit.runners.AndroidJUnit4 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.Assert
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.meshtastic.core.model.Channel import org.meshtastic.core.model.Channel
import org.meshtastic.core.model.numChannels 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) @RunWith(AndroidJUnit4::class)
class ChannelTest { class ChannelTest {

Wyświetl plik

@ -19,13 +19,13 @@ package com.geeksville.mesh.ui.map
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.LocalOnlyProtos.LocalConfig 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 com.geeksville.mesh.service.ServiceRepository
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.stateIn 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.model.DataPacket
import org.meshtastic.core.prefs.map.MapPrefs import org.meshtastic.core.prefs.map.MapPrefs
import javax.inject.Inject import javax.inject.Inject

Wyświetl plik

@ -23,9 +23,6 @@ import androidx.core.net.toFile
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.ConfigProtos import com.geeksville.mesh.ConfigProtos
import com.geeksville.mesh.android.BuildUtils.debug 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.geeksville.mesh.service.ServiceRepository
import com.google.android.gms.maps.GoogleMap import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.model.TileProvider import com.google.android.gms.maps.model.TileProvider
@ -52,6 +49,9 @@ import kotlinx.serialization.Serializable
import org.json.JSONObject import org.json.JSONObject
import org.meshtastic.core.data.model.CustomTileProviderConfig import org.meshtastic.core.data.model.CustomTileProviderConfig
import org.meshtastic.core.data.repository.CustomTileProviderRepository 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.datastore.UiPreferencesDataSource
import org.meshtastic.core.prefs.map.GoogleMapsPrefs import org.meshtastic.core.prefs.map.GoogleMapsPrefs
import org.meshtastic.core.prefs.map.MapPrefs import org.meshtastic.core.prefs.map.MapPrefs

Wyświetl plik

@ -27,8 +27,6 @@ import com.geeksville.mesh.Portnums.PortNum
import com.geeksville.mesh.StoreAndForwardProtos import com.geeksville.mesh.StoreAndForwardProtos
import com.geeksville.mesh.TelemetryProtos import com.geeksville.mesh.TelemetryProtos
import com.geeksville.mesh.android.Logging 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.geeksville.mesh.ui.debug.FilterMode
import com.google.protobuf.InvalidProtocolBufferException import com.google.protobuf.InvalidProtocolBufferException
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
@ -44,6 +42,8 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch 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 org.meshtastic.core.database.entity.MeshLog
import java.text.DateFormat import java.text.DateFormat
import java.util.Date import java.util.Date

Wyświetl plik

@ -35,11 +35,6 @@ import com.geeksville.mesh.Portnums
import com.geeksville.mesh.Portnums.PortNum import com.geeksville.mesh.Portnums.PortNum
import com.geeksville.mesh.TelemetryProtos.Telemetry import com.geeksville.mesh.TelemetryProtos.Telemetry
import com.geeksville.mesh.android.Logging 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.ServiceAction
import com.geeksville.mesh.service.ServiceRepository import com.geeksville.mesh.service.ServiceRepository
import com.geeksville.mesh.util.safeNumber import com.geeksville.mesh.util.safeNumber
@ -58,6 +53,11 @@ import kotlinx.coroutines.flow.toList
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext 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.FirmwareRelease
import org.meshtastic.core.database.entity.MeshLog import org.meshtastic.core.database.entity.MeshLog
import org.meshtastic.core.database.model.Node import org.meshtastic.core.database.model.Node

Wyświetl plik

@ -42,13 +42,6 @@ import com.geeksville.mesh.channelSet
import com.geeksville.mesh.channelSettings import com.geeksville.mesh.channelSettings
import com.geeksville.mesh.config import com.geeksville.mesh.config
import com.geeksville.mesh.copy 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.MeshActivity
import com.geeksville.mesh.repository.radio.RadioInterfaceService import com.geeksville.mesh.repository.radio.RadioInterfaceService
import com.geeksville.mesh.service.MeshServiceNotifications import com.geeksville.mesh.service.MeshServiceNotifications
@ -70,6 +63,13 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch 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.MyNodeEntity
import org.meshtastic.core.database.entity.Packet import org.meshtastic.core.database.entity.Packet
import org.meshtastic.core.database.entity.QuickChatAction 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.datastore.UiPreferencesDataSource
import org.meshtastic.core.model.DataPacket import org.meshtastic.core.model.DataPacket
import org.meshtastic.core.model.DeviceHardware 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.getShortDate
import org.meshtastic.core.model.util.toChannelSet
import org.meshtastic.core.strings.R import org.meshtastic.core.strings.R
import javax.inject.Inject import javax.inject.Inject

Wyświetl plik

@ -19,10 +19,7 @@ package com.geeksville.mesh.repository.network
import com.geeksville.mesh.MeshProtos.MqttClientProxyMessage import com.geeksville.mesh.MeshProtos.MqttClientProxyMessage
import com.geeksville.mesh.android.Logging 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.mqttClientProxyMessage
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.util.ignoreException import com.geeksville.mesh.util.ignoreException
import com.google.protobuf.ByteString import com.google.protobuf.ByteString
import kotlinx.coroutines.channels.awaitClose 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.MqttConnectOptions
import org.eclipse.paho.client.mqttv3.MqttMessage import org.eclipse.paho.client.mqttv3.MqttMessage
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence 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.net.URI
import java.security.SecureRandom import java.security.SecureRandom
import javax.inject.Inject import javax.inject.Inject

Wyświetl plik

@ -54,13 +54,9 @@ import com.geeksville.mesh.android.Logging
import com.geeksville.mesh.android.hasLocationPermission import com.geeksville.mesh.android.hasLocationPermission
import com.geeksville.mesh.concurrent.handledLaunch import com.geeksville.mesh.concurrent.handledLaunch
import com.geeksville.mesh.copy 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.fromRadio
import com.geeksville.mesh.model.NO_DEVICE_SELECTED import com.geeksville.mesh.model.NO_DEVICE_SELECTED
import com.geeksville.mesh.position import com.geeksville.mesh.position
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.repository.location.LocationRepository import com.geeksville.mesh.repository.location.LocationRepository
import com.geeksville.mesh.repository.network.MQTTRepository import com.geeksville.mesh.repository.network.MQTTRepository
import com.geeksville.mesh.repository.radio.RadioInterfaceService 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.flowOf
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach 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.MeshLog
import org.meshtastic.core.database.entity.MetadataEntity import org.meshtastic.core.database.entity.MetadataEntity
import org.meshtastic.core.database.entity.MyNodeEntity import org.meshtastic.core.database.entity.MyNodeEntity

Wyświetl plik

@ -24,8 +24,6 @@ import com.geeksville.mesh.android.BuildUtils.debug
import com.geeksville.mesh.android.BuildUtils.errormsg import com.geeksville.mesh.android.BuildUtils.errormsg
import com.geeksville.mesh.android.BuildUtils.info import com.geeksville.mesh.android.BuildUtils.info
import com.geeksville.mesh.concurrent.handledLaunch 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.fromRadio
import com.geeksville.mesh.repository.radio.RadioInterfaceService import com.geeksville.mesh.repository.radio.RadioInterfaceService
import dagger.Lazy import dagger.Lazy
@ -35,6 +33,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.withTimeoutOrNull 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.database.entity.MeshLog
import org.meshtastic.core.model.DataPacket import org.meshtastic.core.model.DataPacket
import org.meshtastic.core.model.MessageStatus import org.meshtastic.core.model.MessageStatus

Wyświetl plik

@ -63,8 +63,8 @@ import androidx.compose.ui.unit.dp
import com.geeksville.mesh.AppOnlyProtos import com.geeksville.mesh.AppOnlyProtos
import com.geeksville.mesh.ChannelProtos.ChannelSettings import com.geeksville.mesh.ChannelProtos.ChannelSettings
import com.geeksville.mesh.ConfigProtos.Config.LoRaConfig import com.geeksville.mesh.ConfigProtos.Config.LoRaConfig
import com.geeksville.mesh.model.getChannel
import org.meshtastic.core.model.Channel import org.meshtastic.core.model.Channel
import org.meshtastic.core.model.util.getChannel
import org.meshtastic.core.strings.R import org.meshtastic.core.strings.R
import org.meshtastic.core.ui.theme.StatusColors.StatusGreen import org.meshtastic.core.ui.theme.StatusColors.StatusGreen
import org.meshtastic.core.ui.theme.StatusColors.StatusRed import org.meshtastic.core.ui.theme.StatusColors.StatusRed

Wyświetl plik

@ -20,9 +20,7 @@ package com.geeksville.mesh.ui.connections
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.LocalOnlyProtos.LocalConfig import com.geeksville.mesh.LocalOnlyProtos.LocalConfig
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.repository.bluetooth.BluetoothRepository import com.geeksville.mesh.repository.bluetooth.BluetoothRepository
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.service.ServiceRepository import com.geeksville.mesh.service.ServiceRepository
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@ -30,6 +28,8 @@ import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.stateIn 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.entity.MyNodeEntity
import org.meshtastic.core.database.model.Node import org.meshtastic.core.database.model.Node
import org.meshtastic.core.prefs.ui.UiPrefs import org.meshtastic.core.prefs.ui.UiPrefs

Wyświetl plik

@ -21,8 +21,6 @@ import android.os.RemoteException
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.MeshProtos import com.geeksville.mesh.MeshProtos
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.database.PacketRepository
import com.geeksville.mesh.service.ServiceRepository import com.geeksville.mesh.service.ServiceRepository
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@ -33,6 +31,8 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch 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.entity.Packet
import org.meshtastic.core.database.model.Node import org.meshtastic.core.database.model.Node
import org.meshtastic.core.model.DataPacket import org.meshtastic.core.model.DataPacket

Wyświetl plik

@ -95,7 +95,6 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.geeksville.mesh.AppOnlyProtos import com.geeksville.mesh.AppOnlyProtos
import com.geeksville.mesh.model.getChannel
import com.geeksville.mesh.ui.common.components.SecurityIcon import com.geeksville.mesh.ui.common.components.SecurityIcon
import com.geeksville.mesh.ui.node.components.NodeKeyStatusIcon import com.geeksville.mesh.ui.node.components.NodeKeyStatusIcon
import com.geeksville.mesh.ui.node.components.NodeMenuAction 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.Message
import org.meshtastic.core.database.model.Node import org.meshtastic.core.database.model.Node
import org.meshtastic.core.model.DataPacket import org.meshtastic.core.model.DataPacket
import org.meshtastic.core.model.util.getChannel
import org.meshtastic.core.strings.R import org.meshtastic.core.strings.R
import org.meshtastic.core.ui.theme.AppTheme import org.meshtastic.core.ui.theme.AppTheme
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets

Wyświetl plik

@ -21,10 +21,6 @@ import android.os.RemoteException
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.channelSet 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.MeshServiceNotifications
import com.geeksville.mesh.service.ServiceAction import com.geeksville.mesh.service.ServiceAction
import com.geeksville.mesh.service.ServiceRepository import com.geeksville.mesh.service.ServiceRepository
@ -40,6 +36,10 @@ import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch 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.Message
import org.meshtastic.core.database.model.Node import org.meshtastic.core.database.model.Node
import org.meshtastic.core.model.DataPacket import org.meshtastic.core.model.DataPacket

Wyświetl plik

@ -20,7 +20,6 @@ package com.geeksville.mesh.ui.node
import android.os.RemoteException import android.os.RemoteException
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.service.ServiceAction import com.geeksville.mesh.service.ServiceAction
import com.geeksville.mesh.service.ServiceRepository import com.geeksville.mesh.service.ServiceRepository
import com.geeksville.mesh.ui.node.components.NodeMenuAction 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.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.meshtastic.core.data.repository.NodeRepository
import org.meshtastic.core.database.model.Node import org.meshtastic.core.database.model.Node
import org.meshtastic.core.model.Position import org.meshtastic.core.model.Position
import timber.log.Timber import timber.log.Timber

Wyświetl plik

@ -21,8 +21,6 @@ import android.os.RemoteException
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.AdminProtos 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.ServiceAction
import com.geeksville.mesh.service.ServiceRepository import com.geeksville.mesh.service.ServiceRepository
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
@ -38,6 +36,8 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch 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.Node
import org.meshtastic.core.database.model.NodeSortOption import org.meshtastic.core.database.model.NodeSortOption
import org.meshtastic.core.model.Position import org.meshtastic.core.model.Position

Wyświetl plik

@ -26,9 +26,6 @@ import com.geeksville.mesh.LocalOnlyProtos.LocalConfig
import com.geeksville.mesh.MeshProtos import com.geeksville.mesh.MeshProtos
import com.geeksville.mesh.Portnums import com.geeksville.mesh.Portnums
import com.geeksville.mesh.android.Logging 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 com.geeksville.mesh.service.ServiceRepository
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@ -44,6 +41,9 @@ import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext 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.entity.MyNodeEntity
import org.meshtastic.core.database.model.Node import org.meshtastic.core.database.model.Node
import org.meshtastic.core.datastore.UiPreferencesDataSource import org.meshtastic.core.datastore.UiPreferencesDataSource

Wyświetl plik

@ -19,12 +19,12 @@ package com.geeksville.mesh.ui.settings.radio
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.service.ServiceRepository import com.geeksville.mesh.service.ServiceRepository
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.meshtastic.core.data.repository.NodeRepository
import org.meshtastic.core.database.entity.NodeEntity import org.meshtastic.core.database.entity.NodeEntity
import javax.inject.Inject import javax.inject.Inject
import kotlin.time.Duration.Companion.days import kotlin.time.Duration.Companion.days

Wyświetl plik

@ -45,14 +45,11 @@ import com.geeksville.mesh.android.GeeksvilleApplication
import com.geeksville.mesh.android.Logging import com.geeksville.mesh.android.Logging
import com.geeksville.mesh.android.isAnalyticsAvailable import com.geeksville.mesh.android.isAnalyticsAvailable
import com.geeksville.mesh.config import com.geeksville.mesh.config
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.deviceProfile import com.geeksville.mesh.deviceProfile
import com.geeksville.mesh.model.getChannelList import com.geeksville.mesh.model.getChannelList
import com.geeksville.mesh.model.toChannelSet
import com.geeksville.mesh.moduleConfig import com.geeksville.mesh.moduleConfig
import com.geeksville.mesh.navigation.ConfigRoute import com.geeksville.mesh.navigation.ConfigRoute
import com.geeksville.mesh.navigation.ModuleRoute import com.geeksville.mesh.navigation.ModuleRoute
import com.geeksville.mesh.repository.datastore.RadioConfigRepository
import com.geeksville.mesh.repository.location.LocationRepository import com.geeksville.mesh.repository.location.LocationRepository
import com.geeksville.mesh.service.ConnectionState import com.geeksville.mesh.service.ConnectionState
import com.geeksville.mesh.service.ServiceRepository import com.geeksville.mesh.service.ServiceRepository
@ -72,10 +69,13 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.json.JSONObject 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.entity.MyNodeEntity
import org.meshtastic.core.database.model.Node import org.meshtastic.core.database.model.Node
import org.meshtastic.core.database.model.getStringResFrom import org.meshtastic.core.database.model.getStringResFrom
import org.meshtastic.core.model.Position import org.meshtastic.core.model.Position
import org.meshtastic.core.model.util.toChannelSet
import org.meshtastic.core.navigation.SettingsRoutes import org.meshtastic.core.navigation.SettingsRoutes
import org.meshtastic.core.prefs.analytics.AnalyticsPrefs import org.meshtastic.core.prefs.analytics.AnalyticsPrefs
import org.meshtastic.core.prefs.map.MapConsentPrefs import org.meshtastic.core.prefs.map.MapConsentPrefs

Wyświetl plik

@ -96,9 +96,6 @@ import com.geeksville.mesh.android.GeeksvilleApplication
import com.geeksville.mesh.channelSet import com.geeksville.mesh.channelSet
import com.geeksville.mesh.copy import com.geeksville.mesh.copy
import com.geeksville.mesh.model.UIViewModel 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.ConfigRoute
import com.geeksville.mesh.navigation.getNavRouteFrom import com.geeksville.mesh.navigation.getNavRouteFrom
import com.geeksville.mesh.service.ConnectionState import com.geeksville.mesh.service.ConnectionState
@ -112,6 +109,9 @@ import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanOptions import com.journeyapps.barcodescanner.ScanOptions
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.meshtastic.core.model.Channel 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.navigation.Route
import org.meshtastic.core.strings.R import org.meshtastic.core.strings.R
import org.meshtastic.core.ui.component.AdaptiveTwoPane import org.meshtastic.core.ui.component.AdaptiveTwoPane

Wyświetl plik

@ -25,8 +25,13 @@ plugins {
android { namespace = "org.meshtastic.core.data" } android { namespace = "org.meshtastic.core.data" }
dependencies { dependencies {
implementation(projects.core.database)
implementation(projects.core.datastore)
implementation(projects.core.di) implementation(projects.core.di)
implementation(projects.core.model)
implementation(projects.core.network)
implementation(projects.core.prefs) implementation(projects.core.prefs)
implementation(projects.core.proto)
implementation(libs.kotlinx.coroutines.android) implementation(libs.kotlinx.coroutines.android)
implementation(libs.kotlinx.serialization.json) implementation(libs.kotlinx.serialization.json)

Wyświetl plik

@ -0,0 +1,8 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues/>
<CurrentIssues>
<ID>MagicNumber:PacketRepository.kt$PacketRepository$500</ID>
<ID>TooManyFunctions:PacketRepository.kt$PacketRepository</ID>
</CurrentIssues>
</SmellBaseline>

Wyświetl plik

@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.geeksville.mesh.repository.api package org.meshtastic.core.data.datasource
import android.app.Application import android.app.Application
import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.ExperimentalSerializationApi

Wyświetl plik

@ -15,8 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.geeksville.mesh.repository.api package org.meshtastic.core.data.datasource
import dagger.Lazy
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.meshtastic.core.database.dao.DeviceHardwareDao 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 org.meshtastic.core.model.NetworkDeviceHardware
import javax.inject.Inject import javax.inject.Inject
class DeviceHardwareLocalDataSource class DeviceHardwareLocalDataSource @Inject constructor(private val deviceHardwareDaoLazy: Lazy<DeviceHardwareDao>) {
@Inject
constructor(
private val deviceHardwareDaoLazy: dagger.Lazy<DeviceHardwareDao>,
) {
private val deviceHardwareDao by lazy { deviceHardwareDaoLazy.get() } private val deviceHardwareDao by lazy { deviceHardwareDaoLazy.get() }
suspend fun insertAllDeviceHardware(deviceHardware: List<NetworkDeviceHardware>) = withContext(Dispatchers.IO) { suspend fun insertAllDeviceHardware(deviceHardware: List<NetworkDeviceHardware>) = withContext(Dispatchers.IO) {

Wyświetl plik

@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.geeksville.mesh.repository.api package org.meshtastic.core.data.datasource
import android.app.Application import android.app.Application
import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.ExperimentalSerializationApi

Wyświetl plik

@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.geeksville.mesh.repository.api package org.meshtastic.core.data.datasource
import dagger.Lazy import dagger.Lazy
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers

Wyświetl plik

@ -15,16 +15,17 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
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.Dispatchers
import kotlinx.coroutines.withContext 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.DeviceHardwareEntity
import org.meshtastic.core.database.entity.asExternalModel import org.meshtastic.core.database.entity.asExternalModel
import org.meshtastic.core.model.DeviceHardware import org.meshtastic.core.model.DeviceHardware
import org.meshtastic.core.network.DeviceHardwareRemoteDataSource import org.meshtastic.core.network.DeviceHardwareRemoteDataSource
import timber.log.Timber
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@ -60,14 +61,14 @@ constructor(
// 1. Attempt to retrieve from cache first // 1. Attempt to retrieve from cache first
val cachedEntity = localDataSource.getByHwModel(hwModel) val cachedEntity = localDataSource.getByHwModel(hwModel)
if (cachedEntity != null && !cachedEntity.isStale()) { 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()) return@withContext Result.success(cachedEntity.asExternalModel())
} }
} }
// 2. Fetch from remote API // 2. Fetch from remote API
runCatching { runCatching {
debug("Fetching device hardware from remote API.") Timber.d("Fetching device hardware from remote API.")
val remoteHardware = remoteDataSource.getAllDeviceHardware() val remoteHardware = remoteDataSource.getAllDeviceHardware()
localDataSource.insertAllDeviceHardware(remoteHardware) localDataSource.insertAllDeviceHardware(remoteHardware)
@ -78,17 +79,17 @@ constructor(
return@withContext Result.success(it) return@withContext Result.success(it)
} }
.onFailure { e -> .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 // 3. Attempt to use stale cache as a fallback
val staleEntity = localDataSource.getByHwModel(hwModel) val staleEntity = localDataSource.getByHwModel(hwModel)
if (staleEntity != null) { 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()) return@withContext Result.success(staleEntity.asExternalModel())
} }
// 4. Fallback to bundled JSON if cache is empty // 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) return@withContext loadFromBundledJson(hwModel)
} }
} }

Wyświetl plik

@ -15,17 +15,18 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
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 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.FirmwareRelease
import org.meshtastic.core.database.entity.FirmwareReleaseEntity import org.meshtastic.core.database.entity.FirmwareReleaseEntity
import org.meshtastic.core.database.entity.FirmwareReleaseType import org.meshtastic.core.database.entity.FirmwareReleaseType
import org.meshtastic.core.database.entity.asExternalModel import org.meshtastic.core.database.entity.asExternalModel
import org.meshtastic.core.network.FirmwareReleaseRemoteDataSource import org.meshtastic.core.network.FirmwareReleaseRemoteDataSource
import timber.log.Timber
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@ -67,7 +68,7 @@ constructor(
// This gives the UI something to show immediately. // This gives the UI something to show immediately.
val cachedRelease = localDataSource.getLatestRelease(releaseType) val cachedRelease = localDataSource.getLatestRelease(releaseType)
cachedRelease?.let { cachedRelease?.let {
debug("Emitting cached firmware for $releaseType (isStale=${it.isStale()})") Timber.d("Emitting cached firmware for $releaseType (isStale=${it.isStale()})")
emit(it.asExternalModel()) emit(it.asExternalModel())
} }
@ -83,7 +84,7 @@ constructor(
// The `distinctUntilChanged()` operator on the collector side will prevent // The `distinctUntilChanged()` operator on the collector side will prevent
// re-emitting the same data if the cache wasn't actually updated. // re-emitting the same data if the cache wasn't actually updated.
val finalRelease = localDataSource.getLatestRelease(releaseType) 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()) emit(finalRelease?.asExternalModel())
} }
@ -97,7 +98,7 @@ constructor(
private suspend fun updateCacheFromSources() { private suspend fun updateCacheFromSources() {
val remoteFetchSuccess = val remoteFetchSuccess =
runCatching { runCatching {
debug("Fetching fresh firmware releases from remote API.") Timber.d("Fetching fresh firmware releases from remote API.")
val networkReleases = remoteDataSource.getFirmwareReleases() val networkReleases = remoteDataSource.getFirmwareReleases()
// The API fetches all release types, so we cache them all at once. // 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 remote fetch failed, try the JSON fallback as a last resort.
if (!remoteFetchSuccess) { if (!remoteFetchSuccess) {
warn("Remote fetch failed, attempting to cache from bundled JSON.") Timber.w("Remote fetch failed, attempting to cache from bundled JSON.")
runCatching { runCatching {
val jsonReleases = jsonDataSource.loadFirmwareReleaseFromJsonAsset() val jsonReleases = jsonDataSource.loadFirmwareReleaseFromJsonAsset()
localDataSource.insertFirmwareReleases(jsonReleases.releases.stable, FirmwareReleaseType.STABLE) localDataSource.insertFirmwareReleases(jsonReleases.releases.stable, FirmwareReleaseType.STABLE)
localDataSource.insertFirmwareReleases(jsonReleases.releases.alpha, FirmwareReleaseType.ALPHA) 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}") }
} }
} }

Wyświetl plik

@ -15,13 +15,14 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
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
import com.geeksville.mesh.MeshProtos.MeshPacket import com.geeksville.mesh.MeshProtos.MeshPacket
import com.geeksville.mesh.Portnums import com.geeksville.mesh.Portnums
import com.geeksville.mesh.TelemetryProtos.Telemetry import com.geeksville.mesh.TelemetryProtos.Telemetry
import dagger.Lazy
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
@ -30,22 +31,23 @@ import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.meshtastic.core.database.dao.MeshLogDao import org.meshtastic.core.database.dao.MeshLogDao
import org.meshtastic.core.database.entity.MeshLog import org.meshtastic.core.database.entity.MeshLog
import org.meshtastic.core.di.annotation.IoDispatcher
import javax.inject.Inject import javax.inject.Inject
@Suppress("TooManyFunctions") @Suppress("TooManyFunctions")
class MeshLogRepository class MeshLogRepository
@Inject @Inject
constructor( constructor(
private val meshLogDaoLazy: dagger.Lazy<MeshLogDao>, private val meshLogDaoLazy: Lazy<MeshLogDao>,
private val dispatchers: CoroutineDispatchers, @IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) { ) {
private val meshLogDao by lazy { meshLogDaoLazy.get() } private val meshLogDao by lazy { meshLogDaoLazy.get() }
fun getAllLogs(maxItems: Int = MAX_ITEMS): Flow<List<MeshLog>> = fun getAllLogs(maxItems: Int = MAX_ITEMS): Flow<List<MeshLog>> =
meshLogDao.getAllLogs(maxItems).flowOn(dispatchers.io).conflate() meshLogDao.getAllLogs(maxItems).flowOn(ioDispatcher).conflate()
fun getAllLogsInReceiveOrder(maxItems: Int = MAX_ITEMS): Flow<List<MeshLog>> = fun getAllLogsInReceiveOrder(maxItems: Int = MAX_ITEMS): Flow<List<MeshLog>> =
meshLogDao.getAllLogsInReceiveOrder(maxItems).flowOn(dispatchers.io).conflate() meshLogDao.getAllLogsInReceiveOrder(maxItems).flowOn(ioDispatcher).conflate()
private fun parseTelemetryLog(log: MeshLog): Telemetry? = runCatching { private fun parseTelemetryLog(log: MeshLog): Telemetry? = runCatching {
Telemetry.parseFrom(log.fromRadio.packet.decoded.payload) Telemetry.parseFrom(log.fromRadio.packet.decoded.payload)
@ -109,34 +111,34 @@ constructor(
.getLogsFrom(nodeNum, Portnums.PortNum.TELEMETRY_APP_VALUE, MAX_MESH_PACKETS) .getLogsFrom(nodeNum, Portnums.PortNum.TELEMETRY_APP_VALUE, MAX_MESH_PACKETS)
.distinctUntilChanged() .distinctUntilChanged()
.mapLatest { list -> list.mapNotNull(::parseTelemetryLog) } .mapLatest { list -> list.mapNotNull(::parseTelemetryLog) }
.flowOn(dispatchers.io) .flowOn(ioDispatcher)
fun getLogsFrom( fun getLogsFrom(
nodeNum: Int, nodeNum: Int,
portNum: Int = Portnums.PortNum.UNKNOWN_APP_VALUE, portNum: Int = Portnums.PortNum.UNKNOWN_APP_VALUE,
maxItem: Int = MAX_MESH_PACKETS, maxItem: Int = MAX_MESH_PACKETS,
): Flow<List<MeshLog>> = ): Flow<List<MeshLog>> =
meshLogDao.getLogsFrom(nodeNum, portNum, maxItem).distinctUntilChanged().flowOn(dispatchers.io) meshLogDao.getLogsFrom(nodeNum, portNum, maxItem).distinctUntilChanged().flowOn(ioDispatcher)
/* /*
* Retrieves MeshPackets matching 'nodeNum' and 'portNum'. * Retrieves MeshPackets matching 'nodeNum' and 'portNum'.
* If 'portNum' is not specified, returns all MeshPackets. Otherwise, filters by '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<List<MeshPacket>> = fun getMeshPacketsFrom(nodeNum: Int, portNum: Int = Portnums.PortNum.UNKNOWN_APP_VALUE): Flow<List<MeshPacket>> =
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<MeshProtos.MyNodeInfo?> = getLogsFrom(0, 0) fun getMyNodeInfo(): Flow<MeshProtos.MyNodeInfo?> = getLogsFrom(0, 0)
.mapLatest { list -> list.firstOrNull { it.myNodeInfo != null }?.myNodeInfo } .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) = suspend fun deleteLogs(nodeNum: Int, portNum: Int) =
withContext(dispatchers.io) { meshLogDao.deleteLogs(nodeNum, portNum) } withContext(ioDispatcher) { meshLogDao.deleteLogs(nodeNum, portNum) }
companion object { companion object {
private const val MAX_ITEMS = 500 private const val MAX_ITEMS = 500

Wyświetl plik

@ -15,12 +15,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.geeksville.mesh.database package org.meshtastic.core.data.repository
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.coroutineScope import androidx.lifecycle.coroutineScope
import com.geeksville.mesh.CoroutineDispatchers
import com.geeksville.mesh.MeshProtos import com.geeksville.mesh.MeshProtos
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted 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.entity.NodeEntity
import org.meshtastic.core.database.model.Node import org.meshtastic.core.database.model.Node
import org.meshtastic.core.database.model.NodeSortOption 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.DataPacket
import org.meshtastic.core.model.util.onlineTimeThreshold import org.meshtastic.core.model.util.onlineTimeThreshold
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
import kotlin.collections.map
@Singleton @Singleton
@Suppress("TooManyFunctions") @Suppress("TooManyFunctions")
@ -50,13 +52,13 @@ class NodeRepository
constructor( constructor(
processLifecycle: Lifecycle, processLifecycle: Lifecycle,
private val nodeInfoDao: NodeInfoDao, private val nodeInfoDao: NodeInfoDao,
private val dispatchers: CoroutineDispatchers, @IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) { ) {
// hardware info about our local device (can be null) // hardware info about our local device (can be null)
val myNodeInfo: StateFlow<MyNodeEntity?> = val myNodeInfo: StateFlow<MyNodeEntity?> =
nodeInfoDao nodeInfoDao
.getMyNodeInfo() .getMyNodeInfo()
.flowOn(dispatchers.io) .flowOn(ioDispatcher)
.stateIn(processLifecycle.coroutineScope, SharingStarted.Eagerly, null) .stateIn(processLifecycle.coroutineScope, SharingStarted.Eagerly, null)
// our node info // our node info
@ -81,7 +83,7 @@ constructor(
_ourNodeInfo.value = ourNodeInfo _ourNodeInfo.value = ourNodeInfo
_myId.value = ourNodeInfo?.user?.id _myId.value = ourNodeInfo?.user?.id
} }
.flowOn(dispatchers.io) .flowOn(ioDispatcher)
.conflate() .conflate()
.stateIn(processLifecycle.coroutineScope, SharingStarted.Eagerly, emptyMap()) .stateIn(processLifecycle.coroutineScope, SharingStarted.Eagerly, emptyMap())
@ -113,43 +115,43 @@ constructor(
lastHeardMin = if (onlyOnline) onlineTimeThreshold() else -1, lastHeardMin = if (onlyOnline) onlineTimeThreshold() else -1,
) )
.mapLatest { list -> list.map { it.toModel() } } .mapLatest { list -> list.map { it.toModel() } }
.flowOn(dispatchers.io) .flowOn(ioDispatcher)
.conflate() .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<NodeEntity>) = suspend fun installConfig(mi: MyNodeEntity, nodes: List<NodeEntity>) =
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.deleteNode(num)
nodeInfoDao.deleteMetadata(num) nodeInfoDao.deleteMetadata(num)
} }
suspend fun deleteNodes(nodeNums: List<Int>) = withContext(dispatchers.io) { suspend fun deleteNodes(nodeNums: List<Int>) = withContext(ioDispatcher) {
nodeInfoDao.deleteNodes(nodeNums) nodeInfoDao.deleteNodes(nodeNums)
nodeNums.forEach { nodeInfoDao.deleteMetadata(it) } nodeNums.forEach { nodeInfoDao.deleteMetadata(it) }
} }
suspend fun getNodesOlderThan(lastHeard: Int): List<NodeEntity> = suspend fun getNodesOlderThan(lastHeard: Int): List<NodeEntity> =
withContext(dispatchers.io) { nodeInfoDao.getNodesOlderThan(lastHeard) } withContext(ioDispatcher) { nodeInfoDao.getNodesOlderThan(lastHeard) }
suspend fun getUnknownNodes(): List<NodeEntity> = withContext(dispatchers.io) { nodeInfoDao.getUnknownNodes() } suspend fun getUnknownNodes(): List<NodeEntity> = 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<Int> = val onlineNodeCount: Flow<Int> =
nodeInfoDao nodeInfoDao
.nodeDBbyNum() .nodeDBbyNum()
.mapLatest { map -> map.values.count { it.node.lastHeard > onlineTimeThreshold() } } .mapLatest { map -> map.values.count { it.node.lastHeard > onlineTimeThreshold() } }
.flowOn(dispatchers.io) .flowOn(ioDispatcher)
.conflate() .conflate()
val totalNodeCount: Flow<Int> = val totalNodeCount: Flow<Int> =
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) = suspend fun setNodeNotes(num: Int, notes: String) =
withContext(dispatchers.io) { nodeInfoDao.setNodeNotes(num, notes) } withContext(ioDispatcher) { nodeInfoDao.setNodeNotes(num, notes) }
} }

Wyświetl plik

@ -15,9 +15,10 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.geeksville.mesh.database package org.meshtastic.core.data.repository
import com.geeksville.mesh.Portnums.PortNum import com.geeksville.mesh.Portnums.PortNum
import dagger.Lazy
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.mapLatest
@ -31,7 +32,7 @@ import org.meshtastic.core.model.DataPacket
import org.meshtastic.core.model.MessageStatus import org.meshtastic.core.model.MessageStatus
import javax.inject.Inject import javax.inject.Inject
class PacketRepository @Inject constructor(private val packetDaoLazy: dagger.Lazy<PacketDao>) { class PacketRepository @Inject constructor(private val packetDaoLazy: Lazy<PacketDao>) {
private val packetDao by lazy { packetDaoLazy.get() } private val packetDao by lazy { packetDaoLazy.get() }
fun getWaypoints(): Flow<List<Packet>> = packetDao.getAllPackets(PortNum.WAYPOINT_APP_VALUE) fun getWaypoints(): Flow<List<Packet>> = packetDao.getAllPackets(PortNum.WAYPOINT_APP_VALUE)

Wyświetl plik

@ -15,31 +15,33 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
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.flow.flowOn
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.meshtastic.core.database.dao.QuickChatActionDao import org.meshtastic.core.database.dao.QuickChatActionDao
import org.meshtastic.core.database.entity.QuickChatAction import org.meshtastic.core.database.entity.QuickChatAction
import org.meshtastic.core.di.annotation.IoDispatcher
import javax.inject.Inject import javax.inject.Inject
class QuickChatActionRepository class QuickChatActionRepository
@Inject @Inject
constructor( constructor(
private val quickChatDaoLazy: dagger.Lazy<QuickChatActionDao>, private val quickChatDaoLazy: Lazy<QuickChatActionDao>,
private val dispatchers: CoroutineDispatchers, @IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) { ) {
private val quickChatActionDao by lazy { quickChatDaoLazy.get() } 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) = suspend fun setItemPosition(uuid: Long, newPos: Int) =
withContext(dispatchers.io) { quickChatActionDao.updateActionPosition(uuid, newPos) } withContext(ioDispatcher) { quickChatActionDao.updateActionPosition(uuid, newPos) }
} }

Wyświetl plik

@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.geeksville.mesh.repository.datastore package org.meshtastic.core.data.repository
import com.geeksville.mesh.AppOnlyProtos.ChannelSet import com.geeksville.mesh.AppOnlyProtos.ChannelSet
import com.geeksville.mesh.ChannelProtos.Channel 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.LocalConfig
import com.geeksville.mesh.LocalOnlyProtos.LocalModuleConfig import com.geeksville.mesh.LocalOnlyProtos.LocalModuleConfig
import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig import com.geeksville.mesh.ModuleConfigProtos.ModuleConfig
import com.geeksville.mesh.database.NodeRepository
import com.geeksville.mesh.deviceProfile import com.geeksville.mesh.deviceProfile
import com.geeksville.mesh.model.getChannelUrl
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
import org.meshtastic.core.datastore.ChannelSetDataSource import org.meshtastic.core.datastore.ChannelSetDataSource
import org.meshtastic.core.datastore.LocalConfigDataSource import org.meshtastic.core.datastore.LocalConfigDataSource
import org.meshtastic.core.datastore.ModuleConfigDataSource import org.meshtastic.core.datastore.ModuleConfigDataSource
import org.meshtastic.core.model.util.getChannelUrl
import javax.inject.Inject import javax.inject.Inject
/** /**

Wyświetl plik

@ -34,4 +34,6 @@ dependencies {
implementation(projects.core.proto) implementation(projects.core.proto)
implementation(projects.core.strings) implementation(projects.core.strings)
implementation(libs.timber) implementation(libs.timber)
implementation(libs.zxing.android.embedded) { isTransitive = false }
implementation(libs.zxing.core)
} }

Wyświetl plik

@ -26,5 +26,9 @@
<ID>MagicNumber:ChannelOption.kt$ChannelOption.SHORT_FAST$.250f</ID> <ID>MagicNumber:ChannelOption.kt$ChannelOption.SHORT_FAST$.250f</ID>
<ID>MagicNumber:ChannelOption.kt$ChannelOption.SHORT_SLOW$.250f</ID> <ID>MagicNumber:ChannelOption.kt$ChannelOption.SHORT_SLOW$.250f</ID>
<ID>MagicNumber:ChannelOption.kt$ChannelOption.VERY_LONG_SLOW$.0625f</ID> <ID>MagicNumber:ChannelOption.kt$ChannelOption.VERY_LONG_SLOW$.0625f</ID>
<ID>MagicNumber:ChannelSet.kt$40</ID>
<ID>MagicNumber:ChannelSet.kt$960</ID>
<ID>SwallowedException:ChannelSet.kt$ex: Throwable</ID>
<ID>TooGenericExceptionCaught:ChannelSet.kt$ex: Throwable</ID>
</CurrentIssues> </CurrentIssues>
</SmellBaseline> </SmellBaseline>

Wyświetl plik

@ -15,23 +15,23 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package com.geeksville.mesh.model package org.meshtastic.core.model.util
import android.graphics.Bitmap import android.graphics.Bitmap
import android.net.Uri import android.net.Uri
import android.util.Base64 import android.util.Base64
import com.geeksville.mesh.AppOnlyProtos.ChannelSet import com.geeksville.mesh.AppOnlyProtos.ChannelSet
import com.geeksville.mesh.android.BuildUtils.errormsg
import com.google.zxing.BarcodeFormat import com.google.zxing.BarcodeFormat
import com.google.zxing.MultiFormatWriter import com.google.zxing.MultiFormatWriter
import com.journeyapps.barcodescanner.BarcodeEncoder import com.journeyapps.barcodescanner.BarcodeEncoder
import org.meshtastic.core.model.Channel import org.meshtastic.core.model.Channel
import timber.log.Timber
import java.net.MalformedURLException import java.net.MalformedURLException
import kotlin.jvm.Throws import kotlin.jvm.Throws
private const val MESHTASTIC_HOST = "meshtastic.org" private const val MESHTASTIC_HOST = "meshtastic.org"
private const val CHANNEL_PATH = "/e/" 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 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() val barcodeEncoder = BarcodeEncoder()
barcodeEncoder.createBitmap(bitMatrix) barcodeEncoder.createBitmap(bitMatrix)
} catch (ex: Throwable) { } catch (ex: Throwable) {
errormsg("URL was too complex to render as barcode") Timber.e("URL was too complex to render as barcode")
null null
} }