diff --git a/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt b/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt index 7b4350460..025f1f9f8 100644 --- a/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt +++ b/app/src/main/java/org/linphone/activities/assistant/fragments/AccountLoginFragment.kt @@ -85,6 +85,8 @@ class AccountLoginFragment : AbstractPhoneFragment { + coreContext.contactsManager.updateLocalContacts() + if (coreContext.core.isEchoCancellerCalibrationRequired) { navigateToEchoCancellerCalibration() } else { diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomViewModel.kt index 1496fe14f..eb186efa2 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomViewModel.kt @@ -228,18 +228,9 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf private fun formatLastMessage(msg: ChatMessage?): String { if (msg == null) return "" - val account = coreContext.core.accountList.find { account -> - account.params.identityAddress?.weakEqual(msg.fromAddress) ?: false - } - val localDisplayName = account?.params?.identityAddress?.displayName - val sender: String = - if (msg.isOutgoing && localDisplayName != null) { - localDisplayName - } else { - coreContext.contactsManager.findContactByAddress(msg.fromAddress)?.fullName - ?: LinphoneUtils.getDisplayName(msg.fromAddress) - } + coreContext.contactsManager.findContactByAddress(msg.fromAddress)?.fullName + ?: LinphoneUtils.getDisplayName(msg.fromAddress) var body = "" for (content in msg.contents) { if (content.isFile || content.isFileTransfer) body += content.name + " " diff --git a/app/src/main/java/org/linphone/activities/main/settings/viewmodels/AccountSettingsViewModel.kt b/app/src/main/java/org/linphone/activities/main/settings/viewmodels/AccountSettingsViewModel.kt index 19057172c..b8c770e62 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/viewmodels/AccountSettingsViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/viewmodels/AccountSettingsViewModel.kt @@ -84,6 +84,9 @@ class AccountSettingsViewModel(val account: Account) : GenericSettingsViewModel( deleteAccount(account) } else { update() + if (state == RegistrationState.Ok) { + coreContext.contactsManager.updateLocalContacts() + } } } } diff --git a/app/src/main/java/org/linphone/activities/main/sidemenu/viewmodels/SideMenuViewModel.kt b/app/src/main/java/org/linphone/activities/main/sidemenu/viewmodels/SideMenuViewModel.kt index db3a5cd10..961320ba9 100644 --- a/app/src/main/java/org/linphone/activities/main/sidemenu/viewmodels/SideMenuViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/sidemenu/viewmodels/SideMenuViewModel.kt @@ -101,5 +101,6 @@ class SideMenuViewModel : ViewModel() { fun setPictureFromPath(picturePath: String) { corePreferences.defaultAccountAvatarPath = picturePath defaultAccountAvatar.value = corePreferences.defaultAccountAvatarPath + coreContext.contactsManager.updateLocalContacts() } } diff --git a/app/src/main/java/org/linphone/contact/Contact.kt b/app/src/main/java/org/linphone/contact/Contact.kt index e917f2b66..f7ff508fa 100644 --- a/app/src/main/java/org/linphone/contact/Contact.kt +++ b/app/src/main/java/org/linphone/contact/Contact.kt @@ -51,6 +51,8 @@ open class Contact : Comparable { // Raw SIP addresses are only used for contact edition var rawSipAddresses = arrayListOf() + var thumbnailUri: Uri? = null + var friend: Friend? = null override fun compareTo(other: Contact): Int { @@ -126,7 +128,11 @@ open class Contact : Comparable { } open fun getContactThumbnailPictureUri(): Uri? { - return null + return thumbnailUri + } + + fun setContactThumbnailPictureUri(uri: Uri) { + thumbnailUri = uri } open fun getContactPictureUri(): Uri? { diff --git a/app/src/main/java/org/linphone/contact/ContactDataInterface.kt b/app/src/main/java/org/linphone/contact/ContactDataInterface.kt index a3db9f7c7..224f27445 100644 --- a/app/src/main/java/org/linphone/contact/ContactDataInterface.kt +++ b/app/src/main/java/org/linphone/contact/ContactDataInterface.kt @@ -60,7 +60,8 @@ open class GenericContactData(private val sipAddress: Address) : ContactDataInte private fun contactLookup() { displayName.value = LinphoneUtils.getDisplayName(sipAddress) - contact.value = LinphoneApplication.coreContext.contactsManager.findContactByAddress(sipAddress) + contact.value = + LinphoneApplication.coreContext.contactsManager.findContactByAddress(sipAddress) } } diff --git a/app/src/main/java/org/linphone/contact/ContactsManager.kt b/app/src/main/java/org/linphone/contact/ContactsManager.kt index b2fa8a96d..3e10e7e12 100644 --- a/app/src/main/java/org/linphone/contact/ContactsManager.kt +++ b/app/src/main/java/org/linphone/contact/ContactsManager.kt @@ -31,6 +31,7 @@ import android.os.AsyncTask import android.os.AsyncTask.THREAD_POOL_EXECUTOR import android.provider.ContactsContract import android.util.Patterns +import java.io.File import kotlinx.coroutines.* import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences @@ -78,6 +79,12 @@ class ContactsManager(private val context: Context) { @Synchronized private set + var localAccountsContacts = ArrayList() + @Synchronized + get + @Synchronized + private set + val magicSearch: MagicSearch by lazy { val magicSearch = coreContext.core.createMagicSearch() magicSearch.limitedSearch = false @@ -155,6 +162,26 @@ class ContactsManager(private val context: Context) { contacts.add(contact) } + @Synchronized + fun updateLocalContacts() { + localAccountsContacts.clear() + + for (account in coreContext.core.accountList) { + val localContact = Contact() + localContact.fullName = account.params.identityAddress?.displayName + val pictureUri = corePreferences.defaultAccountAvatarPath + if (pictureUri != null) { + localContact.setContactThumbnailPictureUri(Uri.fromFile(File(pictureUri))) + } + val address = account.params.identityAddress + if (address != null) { + localContact.sipAddresses.add(address) + localContact.rawSipAddresses.add(address.asStringUriOnly()) + } + localAccountsContacts.add(localContact) + } + } + @Synchronized fun updateContacts(all: ArrayList, sip: ArrayList) { contacts.clear() @@ -163,6 +190,8 @@ class ContactsManager(private val context: Context) { contacts.addAll(all) sipContacts.addAll(sip) + updateLocalContacts() + Log.i("[Contacts Manager] Async fetching finished, notifying observers") for (listener in contactsUpdatedListeners) { listener.onContactsUpdated() @@ -208,6 +237,13 @@ class ContactsManager(private val context: Context) { @Synchronized fun findContactByAddress(address: Address): Contact? { + val localContact = localAccountsContacts.find { localContact -> + localContact.sipAddresses.find { localAddress -> + address.weakEqual(localAddress) + } != null + } + if (localContact != null) return localContact + val friend: Friend? = coreContext.core.findFriend(address) val contact: Contact? = friend?.userData as? Contact if (contact != null) return contact @@ -220,10 +256,12 @@ class ContactsManager(private val context: Context) { return null } + @Synchronized fun addListener(listener: ContactsUpdatedListener) { contactsUpdatedListeners.add(listener) } + @Synchronized fun removeListener(listener: ContactsUpdatedListener) { contactsUpdatedListeners.remove(listener) }