From 7e0353cc9183a1508029a349352d3c4634e79c20 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 5 Jan 2026 16:58:08 +0100 Subject: [PATCH] Prevent participants list from blinking if it hasn't changed, using RecyclerView will also improve performances a bit for conversations with a lot of participants --- .../chat/fragment/ConversationFragment.kt | 16 +++++++++++++ .../SendMessageInConversationViewModel.kt | 2 +- .../chat_conversation_participants_area.xml | 24 +++++++------------ app/src/main/res/values/dimen.xml | 2 +- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt index aa18972e6..5ff131e7d 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationFragment.kt @@ -94,6 +94,7 @@ import org.linphone.utils.hideKeyboard import org.linphone.utils.setKeyboardInsetListener import org.linphone.utils.showKeyboard import androidx.core.net.toUri +import org.linphone.ui.main.chat.adapter.ConversationParticipantsAdapter import org.linphone.ui.main.chat.model.MessageDeleteDialogModel @UiThread @@ -114,6 +115,8 @@ open class ConversationFragment : SlidingPaneChildFragment() { private lateinit var adapter: ConversationEventAdapter + private lateinit var participantsAdapter: ConversationParticipantsAdapter + private lateinit var bottomSheetAdapter: MessageBottomSheetAdapter private val args: ConversationFragmentArgs by navArgs() @@ -395,6 +398,7 @@ open class ConversationFragment : SlidingPaneChildFragment() { super.onCreate(savedInstanceState) adapter = ConversationEventAdapter() + participantsAdapter = ConversationParticipantsAdapter() headerItemDecoration = RecyclerViewHeaderDecoration( requireContext(), adapter, @@ -466,6 +470,10 @@ open class ConversationFragment : SlidingPaneChildFragment() { layoutManager.stackFromEnd = true binding.eventsList.layoutManager = layoutManager + binding.sendArea.participants.participants.setHasFixedSize(true) + val participantsLayoutManager = LinearLayoutManager(requireContext()) + binding.sendArea.participants.participants.layoutManager = participantsLayoutManager + val callbacks = RecyclerViewSwipeUtilsCallback( R.drawable.reply, ConversationEventAdapter.EventViewHolder::class.java @@ -764,6 +772,14 @@ open class ConversationFragment : SlidingPaneChildFragment() { } } + sendMessageViewModel.participants.observe(viewLifecycleOwner) { + participantsAdapter.submitList(it) + + if (binding.sendArea.participants.participants.adapter != participantsAdapter) { + binding.sendArea.participants.participants.adapter = participantsAdapter + } + } + viewModel.focusSearchBarEvent.observe(viewLifecycleOwner) { it.consume { show -> if (show) { diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt index 283b13fd2..0b28e186f 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/SendMessageInConversationViewModel.kt @@ -593,7 +593,7 @@ class SendMessageInConversationViewModel participantsListFilter = filter val currentList = participants.value.orEmpty() val newList = currentList.filter { - it.address.asStringUriOnly().contains(filter) || it.avatarModel.contactName?.contains(filter) == true + it.address.username.orEmpty().contains(filter) || it.avatarModel.contactName?.contains(filter) == true } participants.postValue(newList as ArrayList) isComputingParticipantsList.postValue(false) diff --git a/app/src/main/res/layout/chat_conversation_participants_area.xml b/app/src/main/res/layout/chat_conversation_participants_area.xml index f09e15593..7162592ad 100644 --- a/app/src/main/res/layout/chat_conversation_participants_area.xml +++ b/app/src/main/res/layout/chat_conversation_participants_area.xml @@ -31,27 +31,19 @@ android:text="@string/conversation_participants_list_header" android:textSize="12sp" android:textColor="?attr/color_main2_500" - app:layout_constraintTop_toBottomOf="@id/participants_separator" + app:layout_constraintTop_toTopOf="@id/participants_close" + app:layout_constraintBottom_toBottomOf="@id/participants_close" app:layout_constraintStart_toStartOf="parent" /> - - - - - + app:layout_constraintTop_toBottomOf="@id/participants_close" /> 10dp 300dp - 300dp + 200dp 425dp 15dp