diff --git a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactsListViewModel.kt b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactsListViewModel.kt index 44d65a981..d0d42f919 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactsListViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactsListViewModel.kt @@ -119,6 +119,7 @@ class ContactsListViewModel : ViewModel() { } private fun processMagicSearchResults(results: Array) { + Log.i("[Contacts] Processing ${results.size} results") val list = arrayListOf() for (result in results) { val contact = searchMatchingContact(result) ?: Contact(searchResult = result) @@ -212,8 +213,16 @@ class ContactsListViewModel : ViewModel() { } private fun searchMatchingContact(searchResult: SearchResult): Contact? { - val address = searchResult.address + val friend = searchResult.friend + if (friend != null) { + val contact: Contact? = friend.userData as? Contact + if (contact != null) return contact + val friendContact = coreContext.contactsManager.findContactByFriend(friend) + if (friendContact != null) return friendContact + } + + val address = searchResult.address if (address != null) { val contact = coreContext.contactsManager.findContactByAddress(address, ignoreLocalContact = true) if (contact != null) return contact diff --git a/app/src/main/java/org/linphone/contact/ContactsManager.kt b/app/src/main/java/org/linphone/contact/ContactsManager.kt index 94006ceaf..16837e676 100644 --- a/app/src/main/java/org/linphone/contact/ContactsManager.kt +++ b/app/src/main/java/org/linphone/contact/ContactsManager.kt @@ -237,6 +237,31 @@ class ContactsManager(private val context: Context) { return friend?.userData as? Contact } + @Synchronized + fun findContactByFriend(friend: Friend): Contact? { + val address = friend.address + if (address != null) { + val friends = coreContext.core.findFriends(address) + for (f in friends) { + if (f.name == friend.name) { + val contact: Contact? = f.userData as? Contact + if (contact != null) return contact + } + } + } + + for (list in coreContext.core.friendsLists) { + for (f in list.friends) { + if (f.name == friend.name) { + val contact: Contact? = f.userData as? Contact + if (contact != null) return contact + } + } + } + + return null + } + @Synchronized fun findContactByAddress(address: Address, ignoreLocalContact: Boolean = false): Contact? { if (!ignoreLocalContact) { @@ -253,10 +278,23 @@ class ContactsManager(private val context: Context) { val cleanStringAddress = cleanAddress.asStringUriOnly() val cacheFriend = friendsMap[cleanStringAddress] - val friend: Friend? = coreContext.core.findFriend(address) - val contact: Contact? = friend?.userData as? Contact - if (cacheFriend == null && friend != null) friendsMap[cleanStringAddress] = friend - if (contact != null) return contact + if (cacheFriend != null) { + val contact: Contact? = cacheFriend.userData as? Contact + if (contact != null) { + Log.i("[Contacts Manager] Found contact $contact from friend in cache: $cacheFriend") + return contact + } + } + + val friends = coreContext.core.findFriends(address) + for (friend in friends) { + val contact: Contact? = friend?.userData as? Contact + if (contact != null) { + Log.i("[Contacts Manager] Found contact $contact from friend in Core: $friend") + friendsMap[cleanStringAddress] = friend + return contact + } + } val username = address.username if (username != null && Patterns.PHONE.matcher(username).matches()) {