From 122581fd68cc1e51db7d2d82b035367fadad4f94 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 11 Apr 2023 17:21:01 +0200 Subject: [PATCH] Fixed chat rooms list cells not updating contacts info --- .../main/chat/adapters/ChatRoomsListAdapter.kt | 14 ++++++++++++++ .../activities/main/chat/data/ChatRoomData.kt | 17 ++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomsListAdapter.kt b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomsListAdapter.kt index 5c01c344f..c16ecd479 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomsListAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatRoomsListAdapter.kt @@ -31,6 +31,7 @@ import org.linphone.activities.main.adapters.SelectionListAdapter import org.linphone.activities.main.chat.data.ChatRoomData import org.linphone.activities.main.viewmodels.ListTopBarViewModel import org.linphone.core.ChatRoom +import org.linphone.core.tools.Log import org.linphone.databinding.ChatRoomListCellBinding import org.linphone.utils.Event @@ -69,6 +70,19 @@ class ChatRoomsListAdapter( chatRoomData.update() data = chatRoomData + chatRoomData.contactNewlyFoundEvent.observe(viewLifecycleOwner) { + it.consume { + // Post to prevent IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling + binding.root.post { + try { + notifyItemChanged(bindingAdapterPosition) + } catch (e: Exception) { + Log.e("[Chat Rooms Adapter] Can't notify item [$bindingAdapterPosition] has changed: $e") + } + } + } + } + lifecycleOwner = viewLifecycleOwner // This is for item selection through ListTopBarFragment diff --git a/app/src/main/java/org/linphone/activities/main/chat/data/ChatRoomData.kt b/app/src/main/java/org/linphone/activities/main/chat/data/ChatRoomData.kt index b3e74dfdd..fb780d534 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/data/ChatRoomData.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/ChatRoomData.kt @@ -35,6 +35,7 @@ import org.linphone.contact.ContactsUpdatedListenerStub import org.linphone.core.* import org.linphone.core.tools.Log import org.linphone.utils.AppUtils +import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils import org.linphone.utils.TimestampUtils @@ -81,12 +82,16 @@ class ChatRoomData(val chatRoom: ChatRoom) : ContactDataInterface { chatRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt()) } + val contactNewlyFoundEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + private val contactsListener = object : ContactsUpdatedListenerStub() { override fun onContactsUpdated() { - if (oneToOneChatRoom && contact.value == null) { + if (contact.value == null && oneToOneChatRoom) { searchMatchingContact() } - if (!oneToOneChatRoom && contact.value != null) { + if (!oneToOneChatRoom) { formatLastMessage(chatRoom.lastMessageInHistory) } } @@ -161,11 +166,17 @@ class ChatRoomData(val chatRoom: ChatRoom) : ContactDataInterface { if (remoteAddress != null) { val friend = coreContext.contactsManager.findContactByAddress(remoteAddress) if (friend != null) { + val newlyFound = contact.value == null + contact.value = friend!! presenceStatus.value = friend.consolidatedPresence friend.addListener { presenceStatus.value = it.consolidatedPresence } + + if (newlyFound) { + contactNewlyFoundEvent.value = Event(true) + } } else { displayName.value = LinphoneUtils.getDisplayName(remoteAddress) } @@ -198,7 +209,7 @@ class ChatRoomData(val chatRoom: ChatRoom) : ContactDataInterface { } computeLastMessageImdnIcon(msg) - if (!chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())) { + if (!oneToOneChatRoom) { val sender: String = coreContext.contactsManager.findContactByAddress(msg.fromAddress)?.name ?: LinphoneUtils.getDisplayName(msg.fromAddress)