From fb90a69bba60a2b1a9a55794cc50ecb0efcfc253 Mon Sep 17 00:00:00 2001
From: Pierre Nicolas <pierre.nicolas@savoirfairelinux.com>
Date: Wed, 19 Jun 2024 11:53:13 -0400
Subject: [PATCH] contact: fix race-condition

Fix a race-condition which was leading to a loadMore and a swarmLoaded called between setMode and conversationStarted.
GitLab: #1682

Change-Id: Ie75ddd880808213b7abff7ee6ab3cbe740c9cebe
---
 .../src/main/kotlin/net/jami/model/Account.kt             | 8 ++++++--
 .../src/main/kotlin/net/jami/services/AccountService.kt   | 4 +---
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/jami-android/libjamiclient/src/main/kotlin/net/jami/model/Account.kt b/jami-android/libjamiclient/src/main/kotlin/net/jami/model/Account.kt
index dc4bcc956..765a1eb3e 100644
--- a/jami-android/libjamiclient/src/main/kotlin/net/jami/model/Account.kt
+++ b/jami-android/libjamiclient/src/main/kotlin/net/jami/model/Account.kt
@@ -95,7 +95,7 @@ class Account(
 
     fun isContact(uri: Uri): Boolean = getContact(uri) != null
 
-    fun conversationStarted(conversation: Conversation) {
+    fun conversationStarted(conversation: Conversation, newMode: Conversation.Mode? = null) {
         //Log.w(TAG, "conversationStarted ${conversation.accountId} ${conversation.uri} ${conversation.isSwarm} ${conversation.contacts.size} ${conversation.mode.blockingFirst()}")
         synchronized(conversations) {
             if (conversation.isSwarm) {
@@ -103,7 +103,11 @@ class Account(
                 swarmConversations[conversation.uri.rawRingId] = conversation
             }
             conversations[conversation.uri.uri] = conversation
-            if (conversation.isSwarm && conversation.mode.blockingFirst() === Conversation.Mode.OneToOne) {
+
+            if (newMode != null) conversation.setMode(newMode)
+
+            val mode = newMode ?: conversation.mode.blockingFirst()
+            if (conversation.isSwarm && mode === Conversation.Mode.OneToOne) {
                 try {
                     val contact = conversation.contact!!
                     val key = contact.uri.uri
diff --git a/jami-android/libjamiclient/src/main/kotlin/net/jami/services/AccountService.kt b/jami-android/libjamiclient/src/main/kotlin/net/jami/services/AccountService.kt
index 6a7a0c0e2..727f32144 100644
--- a/jami-android/libjamiclient/src/main/kotlin/net/jami/services/AccountService.kt
+++ b/jami-android/libjamiclient/src/main/kotlin/net/jami/services/AccountService.kt
@@ -1448,10 +1448,8 @@ class AccountService(
             }
             if (!conversation.lastElementLoadedSubject.hasValue())
                 conversation.lastElementLoadedSubject.onSuccess(loadMore(conversation, 8).ignoreElement().cache())
-            if (setMode)
-                conversation.setMode(mode)
         }
-        account.conversationStarted(conversation)
+        account.conversationStarted(conversation, if (setMode) mode else null)
         loadMore(conversation, 2)
     }
 
-- 
GitLab