fix: always broadcast MessageStatus updates

pull/572/head
andrekir 2023-01-20 19:19:13 -03:00 zatwierdzone przez Andre K
rodzic 31d0249d1c
commit b4e8852961
2 zmienionych plików z 18 dodań i 25 usunięć

Wyświetl plik

@ -846,11 +846,14 @@ class MeshService : Service(), Logging {
} }
private fun processQueuedPackets() { private fun processQueuedPackets() {
val m = MessageStatus.ENROUTE
serviceScope.handledLaunch { serviceScope.handledLaunch {
packetRepository.get().getQueuedPackets()?.forEach { p -> packetRepository.get().getQueuedPackets()?.forEach { p ->
try { try {
sendNow(p) 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) { } catch (ex: Exception) {
errormsg("Error sending queued message:", ex) 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 * 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 { serviceScope.handledLaunch {
val p = packetRepository.get().getDataPacketById(requestId) val p = packetRepository.get().getDataPacketById(requestId)
if (p != null && p.status != MessageStatus.RECEIVED) { // distinguish real ACKs coming from the intended receiver
val m = when { val m = if (isAck && fromId == p?.to) MessageStatus.RECEIVED
isAck && fromId == p.to -> MessageStatus.RECEIVED else if (isAck) MessageStatus.DELIVERED else MessageStatus.ERROR
isAck -> MessageStatus.DELIVERED if (p != null && p.status != MessageStatus.RECEIVED)
else -> MessageStatus.ERROR packetRepository.get().updateMessageStatus(p, m)
} serviceBroadcasts.broadcastMessageStatus(requestId, m)
changeStatus(p, m)
}
} }
} }

Wyświetl plik

@ -4,6 +4,7 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Parcelable import android.os.Parcelable
import com.geeksville.mesh.DataPacket import com.geeksville.mesh.DataPacket
import com.geeksville.mesh.MessageStatus
import com.geeksville.mesh.NodeInfo import com.geeksville.mesh.NodeInfo
class MeshServiceBroadcasts( class MeshServiceBroadcasts(
@ -38,15 +39,17 @@ class MeshServiceBroadcasts(
explicitBroadcast(intent) explicitBroadcast(intent)
} }
fun broadcastMessageStatus(p: DataPacket) { fun broadcastMessageStatus(p: DataPacket) = broadcastMessageStatus(p.id, p.status)
if (p.id == 0) {
fun broadcastMessageStatus(id: Int, status: MessageStatus?) {
if (id == 0) {
MeshService.debug("Ignoring anonymous packet status") MeshService.debug("Ignoring anonymous packet status")
} else { } else {
// Do not log, contains PII possibly // Do not log, contains PII possibly
// MeshService.debug("Broadcasting message status $p") // MeshService.debug("Broadcasting message status $p")
val intent = Intent(MeshService.ACTION_MESSAGE_STATUS).apply { val intent = Intent(MeshService.ACTION_MESSAGE_STATUS).apply {
putExtra(EXTRA_PACKET_ID, p.id) putExtra(EXTRA_PACKET_ID, id)
putExtra(EXTRA_STATUS, p.status as Parcelable) putExtra(EXTRA_STATUS, status as Parcelable)
} }
explicitBroadcast(intent) explicitBroadcast(intent)
} }