Fixed chat rooms list cells not updating contacts info

This commit is contained in:
Sylvain Berfini 2023-04-11 17:21:01 +02:00
parent f3a6480278
commit 122581fd68
2 changed files with 28 additions and 3 deletions

View file

@ -31,6 +31,7 @@ import org.linphone.activities.main.adapters.SelectionListAdapter
import org.linphone.activities.main.chat.data.ChatRoomData import org.linphone.activities.main.chat.data.ChatRoomData
import org.linphone.activities.main.viewmodels.ListTopBarViewModel import org.linphone.activities.main.viewmodels.ListTopBarViewModel
import org.linphone.core.ChatRoom import org.linphone.core.ChatRoom
import org.linphone.core.tools.Log
import org.linphone.databinding.ChatRoomListCellBinding import org.linphone.databinding.ChatRoomListCellBinding
import org.linphone.utils.Event import org.linphone.utils.Event
@ -69,6 +70,19 @@ class ChatRoomsListAdapter(
chatRoomData.update() chatRoomData.update()
data = chatRoomData 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 lifecycleOwner = viewLifecycleOwner
// This is for item selection through ListTopBarFragment // This is for item selection through ListTopBarFragment

View file

@ -35,6 +35,7 @@ import org.linphone.contact.ContactsUpdatedListenerStub
import org.linphone.core.* import org.linphone.core.*
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.utils.AppUtils import org.linphone.utils.AppUtils
import org.linphone.utils.Event
import org.linphone.utils.LinphoneUtils import org.linphone.utils.LinphoneUtils
import org.linphone.utils.TimestampUtils import org.linphone.utils.TimestampUtils
@ -81,12 +82,16 @@ class ChatRoomData(val chatRoom: ChatRoom) : ContactDataInterface {
chatRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt()) chatRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt())
} }
val contactNewlyFoundEvent: MutableLiveData<Event<Boolean>> by lazy {
MutableLiveData<Event<Boolean>>()
}
private val contactsListener = object : ContactsUpdatedListenerStub() { private val contactsListener = object : ContactsUpdatedListenerStub() {
override fun onContactsUpdated() { override fun onContactsUpdated() {
if (oneToOneChatRoom && contact.value == null) { if (contact.value == null && oneToOneChatRoom) {
searchMatchingContact() searchMatchingContact()
} }
if (!oneToOneChatRoom && contact.value != null) { if (!oneToOneChatRoom) {
formatLastMessage(chatRoom.lastMessageInHistory) formatLastMessage(chatRoom.lastMessageInHistory)
} }
} }
@ -161,11 +166,17 @@ class ChatRoomData(val chatRoom: ChatRoom) : ContactDataInterface {
if (remoteAddress != null) { if (remoteAddress != null) {
val friend = coreContext.contactsManager.findContactByAddress(remoteAddress) val friend = coreContext.contactsManager.findContactByAddress(remoteAddress)
if (friend != null) { if (friend != null) {
val newlyFound = contact.value == null
contact.value = friend!! contact.value = friend!!
presenceStatus.value = friend.consolidatedPresence presenceStatus.value = friend.consolidatedPresence
friend.addListener { friend.addListener {
presenceStatus.value = it.consolidatedPresence presenceStatus.value = it.consolidatedPresence
} }
if (newlyFound) {
contactNewlyFoundEvent.value = Event(true)
}
} else { } else {
displayName.value = LinphoneUtils.getDisplayName(remoteAddress) displayName.value = LinphoneUtils.getDisplayName(remoteAddress)
} }
@ -198,7 +209,7 @@ class ChatRoomData(val chatRoom: ChatRoom) : ContactDataInterface {
} }
computeLastMessageImdnIcon(msg) computeLastMessageImdnIcon(msg)
if (!chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())) { if (!oneToOneChatRoom) {
val sender: String = val sender: String =
coreContext.contactsManager.findContactByAddress(msg.fromAddress)?.name coreContext.contactsManager.findContactByAddress(msg.fromAddress)?.name
?: LinphoneUtils.getDisplayName(msg.fromAddress) ?: LinphoneUtils.getDisplayName(msg.fromAddress)