diff --git a/app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt b/app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt index abf6a72df..33fbfefa4 100644 --- a/app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt +++ b/app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt @@ -18,6 +18,10 @@ class PacketRepository @Inject constructor(private val packetDaoLazy: dagger.Laz packetDao.getAllPackets() } + suspend fun getQueuedPackets(): List? = withContext(Dispatchers.IO) { + packetDao.getQueuedPackets() + } + suspend fun insert(packet: Packet) = withContext(Dispatchers.IO) { packetDao.insert(packet) } diff --git a/app/src/main/java/com/geeksville/mesh/database/dao/PacketDao.kt b/app/src/main/java/com/geeksville/mesh/database/dao/PacketDao.kt index e98cc3bbe..29625f91b 100644 --- a/app/src/main/java/com/geeksville/mesh/database/dao/PacketDao.kt +++ b/app/src/main/java/com/geeksville/mesh/database/dao/PacketDao.kt @@ -48,11 +48,15 @@ interface PacketDao { findDataPacket(data)?.let { update(it.copy(data = new)) } } - @Query("Select data from packet") + @Query("Select data from packet order by received_time asc") fun getDataPackets(): List @Transaction fun getDataPacketById(requestId: Int): DataPacket? { return getDataPackets().firstOrNull { it.id == requestId } } + + @Transaction + fun getQueuedPackets(): List? = + getDataPackets().filter { it.status in setOf(MessageStatus.ENROUTE, MessageStatus.QUEUED) } } 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 f4a48c83d..48035871e 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -765,12 +765,6 @@ class MeshService : Service(), Logging { } } - /// If packets arrive before we have our node DB, we delay parsing them until the DB is ready - // private val earlyReceivedPackets = mutableListOf() - - /// If apps try to send packets when our radio is sleeping, we queue them here instead - private val offlineSentPackets = mutableListOf() - /// Update our model and resend as needed for a MeshPacket we just received from the radio private fun handleReceivedMeshPacket(packet: MeshPacket) { if (haveNodeDB) { @@ -792,12 +786,16 @@ class MeshService : Service(), Logging { } private fun processQueuedPackets() { - offlineSentPackets.forEach { p -> - // encapsulate our payload in the proper protobufs and fire it off - sendNow(p) - changeStatus(p, MessageStatus.ENROUTE) + serviceScope.handledLaunch { + packetRepository.get().getQueuedPackets()?.forEach { p -> + try { + sendNow(p) + changeStatus(p, MessageStatus.ENROUTE) + } catch (ex: Exception) { + errormsg("Error sending queued message:", ex) + } + } } - offlineSentPackets.clear() } /**