From 76ba9e5e359829a85f09d07a83484ef387e78317 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 20 Oct 2023 08:35:33 +0200 Subject: [PATCH] Using recyclerview to improve delivery status list performances --- .../adapter/ChatMessageDeliveryAdapter.kt | 65 +++++++++++++++++++ .../chat/fragment/ConversationFragment.kt | 14 ++++ .../ChatMessageParticipantDeliveryModel.kt | 2 + .../chat_message_delivery_bottom_sheet.xml | 18 ++--- ...ml => chat_message_delivery_list_cell.xml} | 0 5 files changed, 86 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/org/linphone/ui/main/chat/adapter/ChatMessageDeliveryAdapter.kt rename app/src/main/res/layout/{chat_delivery_list_cell.xml => chat_message_delivery_list_cell.xml} (100%) diff --git a/app/src/main/java/org/linphone/ui/main/chat/adapter/ChatMessageDeliveryAdapter.kt b/app/src/main/java/org/linphone/ui/main/chat/adapter/ChatMessageDeliveryAdapter.kt new file mode 100644 index 000000000..283bdd850 --- /dev/null +++ b/app/src/main/java/org/linphone/ui/main/chat/adapter/ChatMessageDeliveryAdapter.kt @@ -0,0 +1,65 @@ +package org.linphone.ui.main.chat.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.annotation.UiThread +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.LifecycleOwner +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import org.linphone.R +import org.linphone.databinding.ChatMessageDeliveryListCellBinding +import org.linphone.ui.main.chat.model.ChatMessageParticipantDeliveryModel + +class ChatMessageDeliveryAdapter( + private val viewLifecycleOwner: LifecycleOwner +) : ListAdapter( + ChatDeliveryDiffCallback() +) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val binding: ChatMessageDeliveryListCellBinding = DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.chat_message_delivery_list_cell, + parent, + false + ) + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + (holder as ViewHolder).bind(getItem(position)) + } + + inner class ViewHolder( + val binding: ChatMessageDeliveryListCellBinding + ) : RecyclerView.ViewHolder(binding.root) { + @UiThread + fun bind(deliveryModel: ChatMessageParticipantDeliveryModel) { + with(binding) { + model = deliveryModel + + lifecycleOwner = viewLifecycleOwner + + executePendingBindings() + } + } + } + + private class ChatDeliveryDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame( + oldItem: ChatMessageParticipantDeliveryModel, + newItem: ChatMessageParticipantDeliveryModel + ): Boolean { + return oldItem.sipUri == newItem.sipUri + } + + override fun areContentsTheSame( + oldItem: ChatMessageParticipantDeliveryModel, + newItem: ChatMessageParticipantDeliveryModel + ): Boolean { + return oldItem.time == newItem.time + } + } +} 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 a40a7de31..cd77ffea3 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 @@ -52,6 +52,7 @@ import org.linphone.core.ChatMessage import org.linphone.core.tools.Log import org.linphone.databinding.ChatConversationFragmentBinding import org.linphone.databinding.ChatConversationLongPressMenuBinding +import org.linphone.ui.main.chat.adapter.ChatMessageDeliveryAdapter import org.linphone.ui.main.chat.adapter.ConversationEventAdapter import org.linphone.ui.main.chat.model.ChatMessageDeliveryModel import org.linphone.ui.main.chat.model.ChatMessageModel @@ -78,6 +79,8 @@ class ConversationFragment : GenericFragment() { private lateinit var adapter: ConversationEventAdapter + private lateinit var deliveryAdapter: ChatMessageDeliveryAdapter + private val pickMedia = registerForActivityResult( ActivityResultContracts.PickMultipleVisualMedia() ) { list -> @@ -151,9 +154,16 @@ class ConversationFragment : GenericFragment() { binding.eventsList.setHasFixedSize(true) binding.eventsList.adapter = adapter + deliveryAdapter = ChatMessageDeliveryAdapter(viewLifecycleOwner) + binding.messageDelivery.deliveryList.setHasFixedSize(true) + binding.messageDelivery.deliveryList.adapter = deliveryAdapter + val layoutManager = LinearLayoutManager(requireContext()) binding.eventsList.layoutManager = layoutManager + val deliveryLayoutManager = LinearLayoutManager(requireContext()) + binding.messageDelivery.deliveryList.layoutManager = deliveryLayoutManager + adapter.chatMessageLongPressEvent.observe(viewLifecycleOwner) { it.consume { model -> showChatMessageLongPressMenu(model) @@ -323,6 +333,10 @@ class ConversationFragment : GenericFragment() { val model = ChatMessageDeliveryModel(chatMessageModel.chatMessage) coreContext.postOnMainThread { + model.deliveryModels.observe(viewLifecycleOwner) { + deliveryAdapter.submitList(it) + } + binding.messageDelivery.tabs.removeAllTabs() binding.messageDelivery.tabs.addTab( binding.messageDelivery.tabs.newTab().setText(model.readLabel.value).setId( diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageParticipantDeliveryModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageParticipantDeliveryModel.kt index 33690a7eb..5c9583567 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageParticipantDeliveryModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageParticipantDeliveryModel.kt @@ -9,6 +9,8 @@ class ChatMessageParticipantDeliveryModel @WorkerThread constructor( address: Address, timestamp: Long ) { + val sipUri = address.asStringUriOnly() + val avatarModel = coreContext.contactsManager.getContactAvatarModelForAddress(address) val time = TimestampUtils.toString(timestamp) diff --git a/app/src/main/res/layout/chat_message_delivery_bottom_sheet.xml b/app/src/main/res/layout/chat_message_delivery_bottom_sheet.xml index 5f2caceb1..17e4e2c91 100644 --- a/app/src/main/res/layout/chat_message_delivery_bottom_sheet.xml +++ b/app/src/main/res/layout/chat_message_delivery_bottom_sheet.xml @@ -40,7 +40,7 @@ android:background="@color/transparent_color" android:layout_marginBottom="16dp" app:layout_constraintTop_toBottomOf="@id/handle" - app:layout_constraintBottom_toTopOf="@id/scrollview" + app:layout_constraintBottom_toTopOf="@id/deliveryList" app:tabMode="fixed" app:tabUnboundedRipple="true" app:tabRippleColor="@color/orange_main_100" @@ -51,21 +51,13 @@ app:tabTextColor="@color/gray_main2_400" app:tabSelectedTextColor="@color/gray_main2_600" /> - - - - - + app:layout_constraintBottom_toBottomOf="parent" /> diff --git a/app/src/main/res/layout/chat_delivery_list_cell.xml b/app/src/main/res/layout/chat_message_delivery_list_cell.xml similarity index 100% rename from app/src/main/res/layout/chat_delivery_list_cell.xml rename to app/src/main/res/layout/chat_message_delivery_list_cell.xml