From e045e6daad56a452de1c4f4c2cc0a33fc5703723 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 7 Jun 2021 10:52:43 +0200 Subject: [PATCH] Chat room scrolling optimizations --- .../chat/fragments/DetailChatRoomFragment.kt | 15 +++- .../chat/fragments/MasterChatRoomsFragment.kt | 1 + .../main/chat/viewmodels/ChatRoomViewModel.kt | 82 ++++++++++--------- .../fragments/MasterContactsFragment.kt | 1 + .../fragments/MasterCallLogsFragment.kt | 1 + .../fragments/RecordingsFragment.kt | 1 + 6 files changed, 59 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt index 198cb0d9a..50971971b 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt @@ -325,7 +325,10 @@ class DetailChatRoomFragment : MasterFragment if (doNotAskAgain) corePreferences.limeSecurityPopupEnabled = false + val address = viewModel.onlyParticipantOnlyDeviceAddress if (viewModel.oneParticipantOneDevice) { - coreContext.startCall(viewModel.onlyParticipantOnlyDeviceAddress, true) + if (address != null) { + coreContext.startCall(address, true) + } } else { navigateToDevices() } @@ -443,8 +449,11 @@ class DetailChatRoomFragment : MasterFragment() - override val displayName: String - get() { - return 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 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 - get() = chatRoom.securityLevel + override val securityLevel: ChatRoomSecurityLevel = chatRoom.securityLevel - override val showGroupChatAvatar: Boolean - get() = chatRoom.hasCapability(ChatRoomCapabilities.Conference.toInt()) && !chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) + override val showGroupChatAvatar: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.Conference.toInt()) && + !chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) val subject = MutableLiveData() @@ -81,38 +81,19 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf val securityLevelContentDescription = MutableLiveData() - val oneToOneChatRoom: Boolean - get() = chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) + val peerSipUri = MutableLiveData() - val encryptedChatRoom: Boolean - get() = chatRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt()) + val oneToOneChatRoom: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) - val basicChatRoom: Boolean - get() = chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt()) + val encryptedChatRoom: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt()) - val peerSipUri: String - get() = if (oneToOneChatRoom && !basicChatRoom) - chatRoom.participants.firstOrNull()?.address?.asStringUriOnly() - ?: chatRoom.peerAddress.asStringUriOnly() - else chatRoom.peerAddress.asStringUriOnly() + val basicChatRoom: Boolean = chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt()) - val oneParticipantOneDevice: Boolean - get() { - return chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) && - chatRoom.me?.devices?.size == 1 && - chatRoom.participants.first().devices.size == 1 - } + var oneParticipantOneDevice: Boolean = false - val addressToCall: Address - get() { - return if (chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt())) - chatRoom.peerAddress - else - chatRoom.participants.first().address - } + var addressToCall: Address? = null - val onlyParticipantOnlyDeviceAddress: Address - get() = chatRoom.participants.first().devices.first().address + var onlyParticipantOnlyDeviceAddress: Address? = null private val contactsUpdatedListener = object : ContactsUpdatedListenerStub() { override fun onContactsUpdated() { @@ -164,11 +145,13 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf override fun onParticipantAdded(chatRoom: ChatRoom, eventLog: EventLog) { contactLookup() updateSecurityIcon() + updateParticipants() } override fun onParticipantRemoved(chatRoom: ChatRoom, eventLog: EventLog) { contactLookup() updateSecurityIcon() + updateParticipants() } override fun onIsComposingReceived( @@ -191,10 +174,12 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf override fun onParticipantDeviceAdded(chatRoom: ChatRoom, eventLog: EventLog) { updateSecurityIcon() + updateParticipants() } override fun onParticipantDeviceRemoved(chatRoom: ChatRoom, eventLog: EventLog) { updateSecurityIcon() + updateParticipants() } override fun onEphemeralMessageDeleted(chatRoom: ChatRoom, eventLog: EventLog) { @@ -216,6 +201,7 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf updateSecurityIcon() contactLookup() + updateParticipants() callInProgress.value = chatRoom.core.callsNb > 0 updateRemotesComposing() @@ -317,4 +303,22 @@ class ChatRoomViewModel(val chatRoom: ChatRoom) : ViewModel(), ContactDataInterf } composingList.value = AppUtils.getStringWithPlural(R.plurals.chat_room_remote_composing, chatRoom.composingAddresses.size, composing) } + + private fun updateParticipants() { + peerSipUri.value = if (oneToOneChatRoom && !basicChatRoom) + chatRoom.participants.firstOrNull()?.address?.asStringUriOnly() + ?: chatRoom.peerAddress.asStringUriOnly() + else chatRoom.peerAddress.asStringUriOnly() + + oneParticipantOneDevice = chatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) && + chatRoom.me?.devices?.size == 1 && + chatRoom.participants.firstOrNull()?.devices?.size == 1 + + addressToCall = if (chatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt())) + chatRoom.peerAddress + else + chatRoom.participants.firstOrNull()?.address + + onlyParticipantOnlyDeviceAddress = chatRoom.participants.firstOrNull()?.devices?.firstOrNull()?.address + } } diff --git a/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt b/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt index 17fcad228..212df266c 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/fragments/MasterContactsFragment.kt @@ -74,6 +74,7 @@ class MasterContactsFragment : MasterFragment