Fixed issue with contacts order

This commit is contained in:
Sylvain Berfini 2022-03-03 11:31:03 +01:00
parent 9b69d552aa
commit 8d0b571f38
2 changed files with 52 additions and 5 deletions

View file

@ -119,6 +119,7 @@ class ContactsListViewModel : ViewModel() {
}
private fun processMagicSearchResults(results: Array<SearchResult>) {
Log.i("[Contacts] Processing ${results.size} results")
val list = arrayListOf<ContactViewModel>()
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

View file

@ -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()) {