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 ce8406d44..728f77095 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -846,11 +846,14 @@ class MeshService : Service(), Logging { } private fun processQueuedPackets() { + val m = MessageStatus.ENROUTE serviceScope.handledLaunch { packetRepository.get().getQueuedPackets()?.forEach { p -> try { sendNow(p) - changeStatus(p, MessageStatus.ENROUTE) + if (p.status == m) return@forEach + packetRepository.get().updateMessageStatus(p, m) + serviceBroadcasts.broadcastMessageStatus(p.id, m) } catch (ex: Exception) { errormsg("Error sending queued message:", ex) } @@ -858,31 +861,18 @@ class MeshService : Service(), Logging { } } - /** - * Change the status on a data packet and update watchers - */ - private fun changeStatus(p: DataPacket, m: MessageStatus) { - if (p.status == m) return - serviceScope.handledLaunch { - packetRepository.get().updateMessageStatus(p, m) - serviceBroadcasts.broadcastMessageStatus(p.copy(status = m)) - } - } - /** * Handle an ack/nak packet by updating sent message status */ - private fun handleAckNak(isAck: Boolean, fromId: String?, requestId: Int) { + private fun handleAckNak(isAck: Boolean, fromId: String, requestId: Int) { serviceScope.handledLaunch { val p = packetRepository.get().getDataPacketById(requestId) - if (p != null && p.status != MessageStatus.RECEIVED) { - val m = when { - isAck && fromId == p.to -> MessageStatus.RECEIVED - isAck -> MessageStatus.DELIVERED - else -> MessageStatus.ERROR - } - changeStatus(p, m) - } + // distinguish real ACKs coming from the intended receiver + val m = if (isAck && fromId == p?.to) MessageStatus.RECEIVED + else if (isAck) MessageStatus.DELIVERED else MessageStatus.ERROR + if (p != null && p.status != MessageStatus.RECEIVED) + packetRepository.get().updateMessageStatus(p, m) + serviceBroadcasts.broadcastMessageStatus(requestId, m) } } diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshServiceBroadcasts.kt b/app/src/main/java/com/geeksville/mesh/service/MeshServiceBroadcasts.kt index 05ed747be..411115842 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshServiceBroadcasts.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshServiceBroadcasts.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.Intent import android.os.Parcelable import com.geeksville.mesh.DataPacket +import com.geeksville.mesh.MessageStatus import com.geeksville.mesh.NodeInfo class MeshServiceBroadcasts( @@ -38,15 +39,17 @@ class MeshServiceBroadcasts( explicitBroadcast(intent) } - fun broadcastMessageStatus(p: DataPacket) { - if (p.id == 0) { + fun broadcastMessageStatus(p: DataPacket) = broadcastMessageStatus(p.id, p.status) + + fun broadcastMessageStatus(id: Int, status: MessageStatus?) { + if (id == 0) { MeshService.debug("Ignoring anonymous packet status") } else { // Do not log, contains PII possibly // MeshService.debug("Broadcasting message status $p") val intent = Intent(MeshService.ACTION_MESSAGE_STATUS).apply { - putExtra(EXTRA_PACKET_ID, p.id) - putExtra(EXTRA_STATUS, p.status as Parcelable) + putExtra(EXTRA_PACKET_ID, id) + putExtra(EXTRA_STATUS, status as Parcelable) } explicitBroadcast(intent) }