Synched message handling

This commit is contained in:
Juha Heinanen
2026-05-25 08:58:46 +03:00
parent a1fdcf802a
commit fa71f0e63c

View File

@ -7,12 +7,13 @@ class Message(val aor: String, val peerUri: String, val message: String, val tim
var new: Boolean): Serializable { var new: Boolean): Serializable {
fun add() { fun add() {
val updatedMessages = BaresipService.messages.toMutableList() val updatedMessages = synchronized(BaresipService.messages) {
BaresipService.messages.toMutableList()
}
updatedMessages.add(this) updatedMessages.add(this)
BaresipService.messages = updatedMessages.toList()
var count = 0 var count = 0
var remove: Message? = null var remove: Message? = null
for (message in BaresipService.messages) for (message in updatedMessages)
if (message.aor == this.aor) { if (message.aor == this.aor) {
count++ count++
if (count > MESSAGE_HISTORY_SIZE) { if (count > MESSAGE_HISTORY_SIZE) {
@ -22,14 +23,20 @@ class Message(val aor: String, val peerUri: String, val message: String, val tim
} }
if (remove != null) if (remove != null)
updatedMessages.remove(remove) updatedMessages.remove(remove)
synchronized(BaresipService.messages) {
BaresipService.messages = updatedMessages.toList() BaresipService.messages = updatedMessages.toList()
}
save() save()
} }
fun delete() { fun delete() {
val updatedMessages = BaresipService.messages.toMutableList() val updatedMessages = synchronized(BaresipService.messages) {
BaresipService.messages.toMutableList()
}
updatedMessages.remove(this) updatedMessages.remove(this)
synchronized(BaresipService.messages) {
BaresipService.messages = updatedMessages.toList() BaresipService.messages = updatedMessages.toList()
}
save() save()
} }
@ -42,51 +49,69 @@ class Message(val aor: String, val peerUri: String, val message: String, val tim
} }
fun clearMessagesOfAor(aor: String) { fun clearMessagesOfAor(aor: String) {
val updatedMessages = BaresipService.messages.toMutableList() val updatedMessages = synchronized(BaresipService.messages) {
BaresipService.messages.toMutableList()
}
val it = updatedMessages.iterator() val it = updatedMessages.iterator()
while (it.hasNext()) if (it.next().aor == aor) it.remove() while (it.hasNext()) if (it.next().aor == aor) it.remove()
synchronized(BaresipService.messages) {
BaresipService.messages = updatedMessages.toList() BaresipService.messages = updatedMessages.toList()
}
save() save()
} }
fun deleteAorMessage(aor: String, time: Long) { fun deleteAorMessage(aor: String, time: Long) {
val updatedMessages = BaresipService.messages.toMutableList() val updatedMessages = synchronized(BaresipService.messages) {
BaresipService.messages.toMutableList()
}
for (message in updatedMessages.reversed()) for (message in updatedMessages.reversed())
if (message.aor == aor && message.timeStamp == time) { if (message.aor == aor && message.timeStamp == time) {
updatedMessages.remove(message) updatedMessages.remove(message)
synchronized(BaresipService.messages) {
BaresipService.messages = updatedMessages.toList() BaresipService.messages = updatedMessages.toList()
}
save() save()
return return
} }
} }
fun updateAorMessage(aor: String, time: Long) { fun updateAorMessage(aor: String, time: Long) {
val updatedMessages = BaresipService.messages.toMutableList() val updatedMessages = synchronized(BaresipService.messages) {
BaresipService.messages.toMutableList()
}
for (message in updatedMessages.reversed()) for (message in updatedMessages.reversed())
if (message.aor == aor && message.timeStamp == time) { if (message.aor == aor && message.timeStamp == time) {
message.new = false message.new = false
synchronized(BaresipService.messages) {
BaresipService.messages = updatedMessages.toList() BaresipService.messages = updatedMessages.toList()
}
save() save()
return return
} }
} }
fun unreadMessages(aor: String): Boolean { fun unreadMessages(aor: String): Boolean {
synchronized(BaresipService.messages) {
for (message in BaresipService.messages.reversed()) for (message in BaresipService.messages.reversed())
if (message.aor == aor && message.new) if (message.aor == aor && message.new)
return true return true
}
return false return false
} }
fun unreadMessagesFromPeer(aor: String, peerUri: String): Boolean { fun unreadMessagesFromPeer(aor: String, peerUri: String): Boolean {
synchronized(BaresipService.messages) {
for (message in BaresipService.messages.reversed()) for (message in BaresipService.messages.reversed())
if (message.aor == aor && message.peerUri == peerUri && message.new) if (message.aor == aor && message.peerUri == peerUri && message.new)
return true return true
}
return false return false
} }
fun updateMessagesFromPearRead(aor: String, peerUri: String): Boolean { fun updateMessagesFromPearRead(aor: String, peerUri: String): Boolean {
val updatedMessages = BaresipService.messages.toMutableList() val updatedMessages = synchronized(BaresipService.messages) {
BaresipService.messages.toMutableList()
}
var updated = false var updated = false
for (message in updatedMessages) for (message in updatedMessages)
if (message.aor == aor && message.peerUri == peerUri && message.new) { if (message.aor == aor && message.peerUri == peerUri && message.new) {
@ -94,21 +119,26 @@ class Message(val aor: String, val peerUri: String, val message: String, val tim
updated = true updated = true
} }
if (updated) { if (updated) {
synchronized(BaresipService.messages) {
BaresipService.messages = updatedMessages.toList() BaresipService.messages = updatedMessages.toList()
}
save() save()
} }
return updated return updated
} }
fun save() { fun save() {
val messagesCopy = synchronized(BaresipService.messages) {
BaresipService.messages.toList()
}
val file = File(BaresipService.filesPath, "messages") val file = File(BaresipService.filesPath, "messages")
try { try {
val fos = FileOutputStream(file) val fos = FileOutputStream(file)
val oos = ObjectOutputStream(fos) val oos = ObjectOutputStream(fos)
oos.writeObject(BaresipService.messages) oos.writeObject(messagesCopy)
oos.close() oos.close()
fos.close() fos.close()
Log.d(TAG, "Saved ${BaresipService.messages.size} messages") Log.d(TAG, "Saved ${messagesCopy.size} messages")
} catch (e: IOException) { } catch (e: IOException) {
Log.e(TAG, "OutputStream exception", e) Log.e(TAG, "OutputStream exception", e)
} }