From 6fa0b96cc0d317e53391ef8282e3652e99e55667 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 17 Jun 2021 11:38:51 +0200 Subject: [PATCH] Fixed chat room information not refreshing --- .../chat/data/ChatRoomCreationContactData.kt | 11 ++-- .../main/chat/data/DevicesListGroupData.kt | 4 +- .../activities/main/chat/data/EventData.kt | 2 +- .../chat/data/GroupInfoParticipantData.kt | 5 +- .../main/chat/viewmodels/ChatRoomViewModel.kt | 31 +++++------ .../contact/adapters/ContactsListAdapter.kt | 6 +-- .../viewmodels/ContactEditorViewModel.kt | 15 ++++-- .../contact/viewmodels/ContactViewModel.kt | 11 ++-- .../viewmodels/ContactsListViewModel.kt | 2 +- .../linphone/contact/BigContactAvatarView.kt | 2 +- .../org/linphone/contact/ContactAvatarView.kt | 6 +-- ...ContactData.kt => ContactDataInterface.kt} | 43 ++++++++++++--- .../contact/GenericContactViewModel.kt | 53 ------------------- 13 files changed, 86 insertions(+), 105 deletions(-) rename app/src/main/java/org/linphone/contact/{GenericContactData.kt => ContactDataInterface.kt} (50%) delete mode 100644 app/src/main/java/org/linphone/contact/GenericContactViewModel.kt diff --git a/app/src/main/java/org/linphone/activities/main/chat/data/ChatRoomCreationContactData.kt b/app/src/main/java/org/linphone/activities/main/chat/data/ChatRoomCreationContactData.kt index 6269ee2f5..1c02c2e87 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/data/ChatRoomCreationContactData.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/ChatRoomCreationContactData.kt @@ -27,12 +27,9 @@ import org.linphone.core.* import org.linphone.utils.LinphoneUtils class ChatRoomCreationContactData(private val searchResult: SearchResult) : ContactDataInterface { - override val contact = MutableLiveData() - - override val displayName: String by lazy { - val address = searchResult.address - searchResult.friend?.name ?: if (address != null) LinphoneUtils.getDisplayName(address) else searchResult.phoneNumber.orEmpty() - } + override val contact: MutableLiveData = MutableLiveData() + override val displayName: MutableLiveData = MutableLiveData() + override val securityLevel: MutableLiveData = MutableLiveData() val isDisabled: MutableLiveData by lazy { MutableLiveData() @@ -67,8 +64,10 @@ class ChatRoomCreationContactData(private val searchResult: SearchResult) : Cont val address = searchResult.address if (address != null) { contact.value = coreContext.contactsManager.findContactByAddress(address) + displayName.value = searchResult.friend?.name ?: LinphoneUtils.getDisplayName(address) } else if (searchResult.phoneNumber != null) { contact.value = coreContext.contactsManager.findContactByPhoneNumber(searchResult.phoneNumber.orEmpty()) + displayName.value = searchResult.friend?.name ?: searchResult.phoneNumber.orEmpty() } } } diff --git a/app/src/main/java/org/linphone/activities/main/chat/data/DevicesListGroupData.kt b/app/src/main/java/org/linphone/activities/main/chat/data/DevicesListGroupData.kt index 4b10283bd..3d1e624be 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/data/DevicesListGroupData.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/DevicesListGroupData.kt @@ -28,9 +28,6 @@ import org.linphone.core.Participant import org.linphone.utils.LinphoneUtils class DevicesListGroupData(private val participant: Participant) : GenericContactData(participant.address) { - override val securityLevel: ChatRoomSecurityLevel - get() = participant.securityLevel - private val device = if (participant.devices.isEmpty()) null else participant.devices.first() val securityLevelIcon: Int by lazy { @@ -56,6 +53,7 @@ class DevicesListGroupData(private val participant: Participant) : GenericContac val devices = MutableLiveData>() init { + securityLevel.value = participant.securityLevel isExpanded.value = false val list = arrayListOf() diff --git a/app/src/main/java/org/linphone/activities/main/chat/data/EventData.kt b/app/src/main/java/org/linphone/activities/main/chat/data/EventData.kt index eb0f51f10..b6fb7732d 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/data/EventData.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/EventData.kt @@ -50,7 +50,7 @@ class EventData(private val eventLog: EventLog) : GenericContactData( } private fun getName(): String { - return contact.value?.fullName ?: displayName + return contact.value?.fullName ?: displayName.value ?: "" } private fun updateEventText() { diff --git a/app/src/main/java/org/linphone/activities/main/chat/data/GroupInfoParticipantData.kt b/app/src/main/java/org/linphone/activities/main/chat/data/GroupInfoParticipantData.kt index d87f90437..65db33912 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/data/GroupInfoParticipantData.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/data/GroupInfoParticipantData.kt @@ -22,13 +22,9 @@ package org.linphone.activities.main.chat.data import androidx.lifecycle.MutableLiveData import org.linphone.activities.main.chat.GroupChatRoomMember import org.linphone.contact.GenericContactData -import org.linphone.core.ChatRoomSecurityLevel import org.linphone.utils.LinphoneUtils class GroupInfoParticipantData(val participant: GroupChatRoomMember) : GenericContactData(participant.address) { - override val securityLevel: ChatRoomSecurityLevel - get() = participant.securityLevel - val sipUri: String get() = LinphoneUtils.getDisplayableAddress(participant.address) val isAdmin = MutableLiveData() @@ -39,6 +35,7 @@ class GroupInfoParticipantData(val participant: GroupChatRoomMember) : GenericCo val canBeSetAdmin = MutableLiveData() init { + securityLevel.value = participant.securityLevel isAdmin.value = participant.isAdmin showAdminControls.value = false canBeSetAdmin.value = participant.canBeSetAdmin 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 d5f5cb6fb..da71ded57 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 @@ -43,21 +43,9 @@ class ChatRoomViewModelFactory(private val chatRoom: ChatRoom) : } class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterface { - override val contact = MutableLiveData() - - override val displayName: String = when { - chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt()) -> LinphoneUtils.getDisplayName( - chatRoom.peerAddress - ) - chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) -> LinphoneUtils.getDisplayName( - chatRoom.participants.firstOrNull()?.address ?: chatRoom.peerAddress - ) - chatRoom.hasCapability(ChatRoomCapabilities.Conference.toInt()) -> chatRoom.subject.orEmpty() - else -> chatRoom.peerAddress.asStringUriOnly() - } - - override val securityLevel: ChatRoomSecurityLevel = chatRoom.securityLevel - + override val contact: MutableLiveData = MutableLiveData() + override val displayName: MutableLiveData = MutableLiveData() + override val securityLevel: MutableLiveData = MutableLiveData() override val showGroupChatAvatar: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.Conference.toInt()) && !chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) @@ -219,6 +207,17 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf } fun contactLookup() { + displayName.value = when { + chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt()) -> LinphoneUtils.getDisplayName( + chatRoom.peerAddress + ) + chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) -> LinphoneUtils.getDisplayName( + chatRoom.participants.firstOrNull()?.address ?: chatRoom.peerAddress + ) + chatRoom.hasCapability(ChatRoomCapabilities.Conference.toInt()) -> chatRoom.subject.orEmpty() + else -> chatRoom.peerAddress.asStringUriOnly() + } + if (chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())) { searchMatchingContact() } else { @@ -280,6 +279,8 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf } private fun updateSecurityIcon() { + securityLevel.value = chatRoom.securityLevel + securityLevelIcon.value = when (chatRoom.securityLevel) { ChatRoomSecurityLevel.Safe -> R.drawable.security_2_indicator ChatRoomSecurityLevel.Encrypted -> R.drawable.security_1_indicator diff --git a/app/src/main/java/org/linphone/activities/main/contact/adapters/ContactsListAdapter.kt b/app/src/main/java/org/linphone/activities/main/contact/adapters/ContactsListAdapter.kt index 6d3ebb552..bcc0d5208 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/adapters/ContactsListAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/adapters/ContactsListAdapter.kt @@ -99,17 +99,17 @@ class ContactsListAdapter( override fun displayHeaderForPosition(position: Int): Boolean { if (position >= itemCount) return false val contact = getItem(position) - val firstLetter = contact.displayName.first().toString() + val firstLetter = contact.name.first().toString() val previousPosition = position - 1 return if (previousPosition >= 0) { - val previousItemFirstLetter = getItem(previousPosition).displayName.first().toString() + val previousItemFirstLetter = getItem(previousPosition).name.first().toString() previousItemFirstLetter != firstLetter } else true } override fun getHeaderViewForPosition(context: Context, position: Int): View { val contact = getItem(position) - val firstLetter = AppUtils.getInitials(contact.displayName, 1) + val firstLetter = AppUtils.getInitials(contact.name, 1) val binding: GenericListHeaderBinding = DataBindingUtil.inflate( LayoutInflater.from(context), R.layout.generic_list_header, null, false diff --git a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactEditorViewModel.kt b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactEditorViewModel.kt index e6697eb1e..5350a2e22 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactEditorViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactEditorViewModel.kt @@ -31,6 +31,7 @@ import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.activities.main.contact.data.NumberOrAddressEditorData import org.linphone.contact.* +import org.linphone.core.ChatRoomSecurityLevel import org.linphone.core.tools.Log import org.linphone.utils.ImageUtils import org.linphone.utils.PermissionHelper @@ -45,10 +46,9 @@ class ContactEditorViewModelFactory(private val contact: Contact?) : } class ContactEditorViewModel(val c: Contact?) : ViewModel(), ContactDataInterface { - override val contact = MutableLiveData() - - override val displayName: String - get() = if (c == null) "" else c.fullName ?: c.firstName + " " + c.lastName + override val contact: MutableLiveData = MutableLiveData() + override val displayName: MutableLiveData = MutableLiveData() + override val securityLevel: MutableLiveData = MutableLiveData() val firstName = MutableLiveData() @@ -69,7 +69,12 @@ class ContactEditorViewModel(val c: Contact?) : ViewModel(), ContactDataInterfac var syncAccountType: String? = null init { - if (c != null) contact.value = c!! + if (c != null) { + contact.value = c!! + displayName.value = c.fullName ?: c.firstName + " " + c.lastName + } else { + displayName.value = "" + } firstName.value = c?.firstName ?: "" lastName.value = c?.lastName ?: "" organization.value = c?.organization ?: "" diff --git a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt index d0ba4bebb..e757cf9b4 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/viewmodels/ContactViewModel.kt @@ -49,11 +49,12 @@ class ContactViewModelFactory(private val contact: Contact) : } class ContactViewModel(val contactInternal: Contact) : ErrorReportingViewModel(), ContactDataInterface { - override val contact = MutableLiveData() + override val contact: MutableLiveData = MutableLiveData() + override val displayName: MutableLiveData = MutableLiveData() + override val securityLevel: MutableLiveData = MutableLiveData() - override val displayName: String by lazy { - contactInternal.fullName ?: contactInternal.firstName + " " + contactInternal.lastName - } + val name: String + get() = displayName.value ?: "" val displayOrganization = corePreferences.displayOrganization @@ -125,6 +126,8 @@ class ContactViewModel(val contactInternal: Contact) : ErrorReportingViewModel() init { contact.value = contactInternal + displayName.value = contactInternal.fullName ?: contactInternal.firstName + " " + contactInternal.lastName + updateNumbersAndAddresses(contactInternal) coreContext.contactsManager.addListener(contactsUpdatedListener) waitForChatRoomCreation.value = false 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 cbcf7b0d7..16fcc6de7 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 @@ -74,7 +74,7 @@ class ContactsListViewModel : ViewModel() { val filterValue = filter.value.orEmpty() list = if (filterValue.isNotEmpty()) { getSelectedContactsList().filter { contact -> - contact.displayName.contains(filterValue, true) ?: false + contact.name.contains(filterValue, true) } as ArrayList } else { getSelectedContactsList() diff --git a/app/src/main/java/org/linphone/contact/BigContactAvatarView.kt b/app/src/main/java/org/linphone/contact/BigContactAvatarView.kt index 524eb927d..a608d0c18 100644 --- a/app/src/main/java/org/linphone/contact/BigContactAvatarView.kt +++ b/app/src/main/java/org/linphone/contact/BigContactAvatarView.kt @@ -62,7 +62,7 @@ class BigContactAvatarView : LinearLayout { val initials = if (contact != null) { AppUtils.getInitials(contact.fullName ?: contact.firstName + " " + contact.lastName) } else { - AppUtils.getInitials(viewModel.displayName) + AppUtils.getInitials(viewModel.displayName.value ?: "") } binding.initials = initials diff --git a/app/src/main/java/org/linphone/contact/ContactAvatarView.kt b/app/src/main/java/org/linphone/contact/ContactAvatarView.kt index 669f8b8ef..1078a99ff 100644 --- a/app/src/main/java/org/linphone/contact/ContactAvatarView.kt +++ b/app/src/main/java/org/linphone/contact/ContactAvatarView.kt @@ -56,7 +56,7 @@ class ContactAvatarView : LinearLayout { val initials = if (contact != null) { AppUtils.getInitials(contact.fullName ?: contact.firstName + " " + contact.lastName) } else { - AppUtils.getInitials(data.displayName) + AppUtils.getInitials(data.displayName.value ?: "") } binding.initials = initials @@ -66,12 +66,12 @@ class ContactAvatarView : LinearLayout { binding.imagePath = contact?.getContactThumbnailPictureUri() binding.borderVisibility = corePreferences.showBorderOnContactAvatar - binding.securityIcon = when (data.securityLevel) { + binding.securityIcon = when (data.securityLevel.value) { ChatRoomSecurityLevel.Safe -> R.drawable.security_2_indicator ChatRoomSecurityLevel.Encrypted -> R.drawable.security_1_indicator else -> R.drawable.security_alert_indicator } - binding.securityContentDescription = when (data.securityLevel) { + binding.securityContentDescription = when (data.securityLevel.value) { ChatRoomSecurityLevel.Safe -> R.string.content_description_security_level_safe ChatRoomSecurityLevel.Encrypted -> R.string.content_description_security_level_encrypted else -> R.string.content_description_security_level_unsafe diff --git a/app/src/main/java/org/linphone/contact/GenericContactData.kt b/app/src/main/java/org/linphone/contact/ContactDataInterface.kt similarity index 50% rename from app/src/main/java/org/linphone/contact/GenericContactData.kt rename to app/src/main/java/org/linphone/contact/ContactDataInterface.kt index 8b1b57527..a3db9f7c7 100644 --- a/app/src/main/java/org/linphone/contact/GenericContactData.kt +++ b/app/src/main/java/org/linphone/contact/ContactDataInterface.kt @@ -21,6 +21,7 @@ package org.linphone.contact import androidx.lifecycle.MutableLiveData import org.linphone.LinphoneApplication +import org.linphone.activities.main.viewmodels.ErrorReportingViewModel import org.linphone.core.Address import org.linphone.core.ChatRoomSecurityLevel import org.linphone.utils.LinphoneUtils @@ -28,19 +29,18 @@ import org.linphone.utils.LinphoneUtils interface ContactDataInterface { val contact: MutableLiveData - val displayName: String + val displayName: MutableLiveData - val securityLevel: ChatRoomSecurityLevel - get() = ChatRoomSecurityLevel.ClearText + val securityLevel: MutableLiveData val showGroupChatAvatar: Boolean get() = false } open class GenericContactData(private val sipAddress: Address) : ContactDataInterface { - override val displayName: String = LinphoneUtils.getDisplayName(sipAddress) - - override val contact = MutableLiveData() + final override val contact: MutableLiveData = MutableLiveData() + final override val displayName: MutableLiveData = MutableLiveData() + final override val securityLevel: MutableLiveData = MutableLiveData() private val contactsUpdatedListener = object : ContactsUpdatedListenerStub() { override fun onContactUpdated(contact: Contact) { @@ -49,6 +49,7 @@ open class GenericContactData(private val sipAddress: Address) : ContactDataInte } init { + securityLevel.value = ChatRoomSecurityLevel.ClearText LinphoneApplication.coreContext.contactsManager.addListener(contactsUpdatedListener) contactLookup() } @@ -58,6 +59,36 @@ open class GenericContactData(private val sipAddress: Address) : ContactDataInte } private fun contactLookup() { + displayName.value = LinphoneUtils.getDisplayName(sipAddress) + contact.value = LinphoneApplication.coreContext.contactsManager.findContactByAddress(sipAddress) + } +} + +abstract class GenericContactViewModel(private val sipAddress: Address) : ErrorReportingViewModel(), ContactDataInterface { + final override val contact: MutableLiveData = MutableLiveData() + final override val displayName: MutableLiveData = MutableLiveData() + final override val securityLevel: MutableLiveData = MutableLiveData() + + private val contactsUpdatedListener = object : ContactsUpdatedListenerStub() { + override fun onContactUpdated(contact: Contact) { + contactLookup() + } + } + + init { + securityLevel.value = ChatRoomSecurityLevel.ClearText + LinphoneApplication.coreContext.contactsManager.addListener(contactsUpdatedListener) + contactLookup() + } + + override fun onCleared() { + LinphoneApplication.coreContext.contactsManager.removeListener(contactsUpdatedListener) + + super.onCleared() + } + + private fun contactLookup() { + displayName.value = LinphoneUtils.getDisplayName(sipAddress) contact.value = LinphoneApplication.coreContext.contactsManager.findContactByAddress(sipAddress) } } diff --git a/app/src/main/java/org/linphone/contact/GenericContactViewModel.kt b/app/src/main/java/org/linphone/contact/GenericContactViewModel.kt deleted file mode 100644 index 9b694929d..000000000 --- a/app/src/main/java/org/linphone/contact/GenericContactViewModel.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2010-2020 Belledonne Communications SARL. - * - * This file is part of linphone-android - * (see https://www.linphone.org). - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.linphone.contact - -import androidx.lifecycle.MutableLiveData -import org.linphone.LinphoneApplication.Companion.coreContext -import org.linphone.activities.main.viewmodels.ErrorReportingViewModel -import org.linphone.core.Address -import org.linphone.utils.LinphoneUtils - -abstract class GenericContactViewModel(private val sipAddress: Address) : ErrorReportingViewModel(), ContactDataInterface { - override val displayName: String = LinphoneUtils.getDisplayName(sipAddress) - - override val contact = MutableLiveData() - - private val contactsUpdatedListener = object : ContactsUpdatedListenerStub() { - override fun onContactUpdated(contact: Contact) { - contactLookup() - } - } - - init { - coreContext.contactsManager.addListener(contactsUpdatedListener) - contactLookup() - } - - override fun onCleared() { - coreContext.contactsManager.removeListener(contactsUpdatedListener) - - super.onCleared() - } - - private fun contactLookup() { - contact.value = coreContext.contactsManager.findContactByAddress(sipAddress) - } -}