Fixed crash related to deleting messages

This commit is contained in:
Juha Heinanen
2026-02-04 01:09:53 +02:00
parent da1627bf72
commit 3884aee4cb
2 changed files with 26 additions and 27 deletions
@@ -54,6 +54,7 @@ import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
@@ -106,18 +107,24 @@ fun NavGraphBuilder.chatsScreenRoute(navController: NavController) {
@Composable @Composable
private fun ChatsScreen(navController: NavController, aor: String) { private fun ChatsScreen(navController: NavController, aor: String) {
val account = Account.ofAor(aor)!!
val ctx = LocalContext.current val ctx = LocalContext.current
val account = Account.ofAor(aor)!!
val uaMessages: MutableState<List<Message>> = remember { mutableStateOf(emptyList()) }
var areMessagesLoaded by remember { mutableStateOf(false) }
var refreshTrigger by remember { mutableIntStateOf(0) }
val lifecycleOwner = LocalLifecycleOwner.current val lifecycleOwner = LocalLifecycleOwner.current
val uaMessages: MutableState<List<Message>> = remember { mutableStateOf(emptyList()) } LaunchedEffect(aor, refreshTrigger) {
uaMessages.value = loadMessages(account)
areMessagesLoaded = true
}
DisposableEffect(lifecycleOwner) { DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME)
Log.d(TAG, "Resumed to ChatsScreen for AOR: $aor") refreshTrigger++
uaMessages.value = loadMessages(account)
}
} }
lifecycleOwner.lifecycle.addObserver(observer) lifecycleOwner.lifecycle.addObserver(observer)
onDispose { onDispose {
@@ -125,12 +132,6 @@ private fun ChatsScreen(navController: NavController, aor: String) {
} }
} }
var areMessagesLoaded by remember { mutableStateOf(false) }
LaunchedEffect(aor) {
uaMessages.value = loadMessages(account)
areMessagesLoaded = true
}
Scaffold( Scaffold(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
@@ -212,9 +213,7 @@ private fun TopAppBar(
when (selectedItem) { when (selectedItem) {
delete -> { delete -> {
positiveAction.value = { positiveAction.value = {
Message.clearMessagesOfAor(account.aor) deleteMessages(uaMessages, account, "")
Message.save()
uaMessages.value = listOf()
account.unreadMessages = false account.unreadMessages = false
} }
showDialog.value = true showDialog.value = true
@@ -362,8 +361,7 @@ private fun Chats(
) )
positiveButtonText.value = ctx.getString(R.string.delete) positiveButtonText.value = ctx.getString(R.string.delete)
positiveAction.value = { positiveAction.value = {
Message.deleteAorPeerMessages(aor, message.peerUri) deleteMessages(uaMessages, account, message.peerUri)
uaMessages.value = loadMessages(account)
} }
neutralButtonText.value = "" neutralButtonText.value = ""
} else { } else {
@@ -375,7 +373,7 @@ private fun Chats(
} }
neutralButtonText.value = ctx.getString(R.string.delete) neutralButtonText.value = ctx.getString(R.string.delete)
neutralAction.value = { neutralAction.value = {
Message.deleteAorPeerMessages(aor, message.peerUri) deleteMessages(uaMessages, account, message.peerUri)
} }
} }
showDialog.value = true showDialog.value = true
@@ -645,3 +643,13 @@ private fun loadMessages(account: Account) : List<Message> {
} }
return res.toList() return res.toList()
} }
private fun deleteMessages(uaMessages: MutableState<List<Message>>, account: Account, peerUri: String) {
val updatedMessages = BaresipService.messages.toMutableList()
updatedMessages.removeAll {
it.aor == account.aor && (peerUri == "" || it.peerUri == peerUri)
}
BaresipService.messages = updatedMessages.toList()
Message.save()
uaMessages.value = loadMessages(account)
}
@@ -61,15 +61,6 @@ class Message(val aor: String, val peerUri: String, val message: String, val tim
} }
} }
fun deleteAorPeerMessages(aor: String, peerUri: String) {
val updatedMessages = BaresipService.messages.toMutableList()
for (message in updatedMessages)
if (message.aor == aor && message.peerUri == peerUri)
updatedMessages.remove(message)
BaresipService.messages = updatedMessages.toList()
save()
}
fun updateAorMessage(aor: String, time: Long) { fun updateAorMessage(aor: String, time: Long) {
val updatedMessages = BaresipService.messages.toMutableList() val updatedMessages = BaresipService.messages.toMutableList()
for (message in updatedMessages.reversed()) for (message in updatedMessages.reversed())