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

This commit is contained in:
Sylvain Berfini 2026-01-05 16:58:08 +01:00
parent a897c127e5
commit 7e0353cc91
4 changed files with 26 additions and 18 deletions

View file

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

View file

@ -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<ParticipantModel>)
isComputingParticipantsList.postValue(false)

View file

@ -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" />
<androidx.core.widget.NestedScrollView
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/participants"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintHeight_max="@dimen/chat_room_participants_list_max_height"
android:layout_width="match_parent"
android:layout_height="@dimen/chat_room_participants_list_max_height"
android:layout_marginTop="5dp"
android:scrollbars="vertical"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/participants_header">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical"
entries="@{viewModel.participants}"
layout="@{@layout/chat_participant_list_cell}"/>
</androidx.core.widget.NestedScrollView>
app:layout_constraintTop_toBottomOf="@id/participants_close" />
<com.google.android.material.progressindicator.CircularProgressIndicator
android:id="@+id/fetch_in_progress"

View file

@ -102,7 +102,7 @@
<dimen name="chat_documents_list_padding_start_end">10dp</dimen>
<dimen name="chat_room_emoji_picker_height">300dp</dimen>
<dimen name="chat_room_participants_list_max_height">300dp</dimen>
<dimen name="chat_room_participants_list_max_height">200dp</dimen>
<dimen name="chat_bubble_emoji_picker_height">425dp</dimen>
<dimen name="spinner_start_padding">15dp</dimen>