Fixed crash related to deleting messages
This commit is contained in:
@@ -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())
|
||||||
|
|||||||
Reference in New Issue
Block a user