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() {
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)
}
}

Wyświetl plik

@ -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)
}