From 1e280fb7e141f83f6c08e764bec2ba110221f90e Mon Sep 17 00:00:00 2001 From: Stanislav Dmitrenko <7953703+avently@users.noreply.github.com> Date: Wed, 5 Apr 2023 20:53:35 +0300 Subject: [PATCH] android: prevent possible race in chat items (#2148) * android: prevent possible race in chat items * change --- .../java/chat/simplex/app/model/ChatModel.kt | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt b/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt index e2e1446dad..7646abe8a2 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt @@ -192,10 +192,13 @@ class ChatModel(val controller: ChatController) { // add to current chat if (chatId.value == cInfo.id) { withContext(Dispatchers.Main) { - if (chatItems.lastOrNull()?.id == ChatItem.TEMP_LIVE_CHAT_ITEM_ID) { - chatItems.add(kotlin.math.max(0, chatItems.lastIndex), cItem) - } else { - chatItems.add(cItem) + // Prevent situation when chat item already in the list received from backend + if (chatItems.none { it.id == cItem.id }) { + if (chatItems.lastOrNull()?.id == ChatItem.TEMP_LIVE_CHAT_ITEM_ID) { + chatItems.add(kotlin.math.max(0, chatItems.lastIndex), cItem) + } else { + chatItems.add(cItem) + } } } } @@ -222,19 +225,19 @@ class ChatModel(val controller: ChatController) { res = true } // update current chat - if (chatId.value == cInfo.id) { - val itemIndex = chatItems.indexOfFirst { it.id == cItem.id } - if (itemIndex >= 0) { - chatItems[itemIndex] = cItem - return false - } else { - withContext(Dispatchers.Main) { + return if (chatId.value == cInfo.id) { + withContext(Dispatchers.Main) { + val itemIndex = chatItems.indexOfFirst { it.id == cItem.id } + if (itemIndex >= 0) { + chatItems[itemIndex] = cItem + false + } else { chatItems.add(cItem) + true } - return true } } else { - return res + res } }