sforkowany z mirror/meshtastic-android
fix: always broadcast MessageStatus updates
rodzic
31d0249d1c
commit
b4e8852961
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue