From be908cdf0ef932fa85b343e846572ab16ce5a8be Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 18 Oct 2023 17:05:41 +0200 Subject: [PATCH] Started proto for IMDNs display --- .../chat/adapter/ConversationEventAdapter.kt | 8 ++ .../chat/fragment/ConversationFragment.kt | 10 ++ .../chat/model/ChatMessageDeliveryModel.kt | 14 +++ .../ui/main/chat/model/ChatMessageModel.kt | 40 +++++++- .../ui/main/chat/model/ParticipantModel.kt | 1 - ....xml => shape_bottom_sheet_background.xml} | 0 .../main/res/layout/chat_bubble_incoming.xml | 7 +- .../main/res/layout/chat_bubble_outgoing.xml | 2 - .../res/layout/chat_conversation_fragment.xml | 4 + .../res/layout/chat_delivery_list_cell.xml | 94 +++++++++++++++++++ .../chat_message_delivery_bottom_sheet.xml | 88 +++++++++++++++++ app/src/main/res/layout/start_call_numpad.xml | 2 +- 12 files changed, 260 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageDeliveryModel.kt rename app/src/main/res/drawable/{shape_numpad_background.xml => shape_bottom_sheet_background.xml} (100%) create mode 100644 app/src/main/res/layout/chat_delivery_list_cell.xml create mode 100644 app/src/main/res/layout/chat_message_delivery_bottom_sheet.xml diff --git a/app/src/main/java/org/linphone/ui/main/chat/adapter/ConversationEventAdapter.kt b/app/src/main/java/org/linphone/ui/main/chat/adapter/ConversationEventAdapter.kt index 0ea3bc097..733acd17d 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/adapter/ConversationEventAdapter.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/adapter/ConversationEventAdapter.kt @@ -47,6 +47,10 @@ class ConversationEventAdapter( val chatMessageLongPressEvent = MutableLiveData>() + val showDeliveryForChatMessageModelEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { INCOMING_CHAT_MESSAGE -> createIncomingChatBubble(parent) @@ -116,6 +120,10 @@ class ConversationEventAdapter( true } + setShowDeliveryInfoClickListener { + showDeliveryForChatMessageModelEvent.value = Event(message) + } + lifecycleOwner = viewLifecycleOwner executePendingBindings() } 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 a362c0615..d0ecb681e 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 @@ -177,6 +177,16 @@ class ConversationFragment : GenericFragment() { emojisBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED emojisBottomSheetBehavior.isDraggable = false // To allow scrolling through the emojis + val imdnBottomSheetBehavior = BottomSheetBehavior.from(binding.deliveryBottomSheet.root) + imdnBottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED + + adapter.showDeliveryForChatMessageModelEvent.observe(viewLifecycleOwner) { + it.consume { model -> + binding.deliveryBottomSheet.model = model + imdnBottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED + } + } + binding.setOpenFilePickerClickListener { Log.i("$TAG Opening media picker") pickMedia.launch( diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageDeliveryModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageDeliveryModel.kt new file mode 100644 index 000000000..bb04024bc --- /dev/null +++ b/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageDeliveryModel.kt @@ -0,0 +1,14 @@ +package org.linphone.ui.main.chat.model + +import androidx.annotation.WorkerThread +import org.linphone.core.Friend +import org.linphone.core.ParticipantImdnState +import org.linphone.ui.main.contacts.model.ContactAvatarModel +import org.linphone.utils.TimestampUtils + +class ChatMessageDeliveryModel @WorkerThread constructor( + friend: Friend, + imdnState: ParticipantImdnState +) : ContactAvatarModel(friend) { + val time = TimestampUtils.toString(imdnState.stateChangeTime) +} diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt index 34b4b1b49..b54093edb 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/ChatMessageModel.kt @@ -28,6 +28,7 @@ import org.linphone.core.Address import org.linphone.core.ChatMessage import org.linphone.core.ChatMessageListenerStub import org.linphone.core.ChatMessageReaction +import org.linphone.core.ParticipantImdnState import org.linphone.core.tools.Log import org.linphone.ui.main.contacts.model.ContactAvatarModel import org.linphone.utils.Event @@ -59,6 +60,8 @@ class ChatMessageModel @WorkerThread constructor( val chatRoomIsReadOnly = chatMessage.chatRoom.isReadOnly + val deliveryModels = MutableLiveData>() + val dismissLongPressMenuEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -85,6 +88,8 @@ class ChatMessageModel @WorkerThread constructor( init { chatMessage.addListener(chatMessageListener) computeStatusIcon(chatMessage.state) + + computeDeliveryStatus() } @WorkerThread @@ -102,10 +107,6 @@ class ChatMessageModel @WorkerThread constructor( } } - @UiThread - fun showDeliveryInfo() { - } - @WorkerThread private fun computeStatusIcon(state: ChatMessage.State) { val icon = when (state) { @@ -127,4 +128,35 @@ class ChatMessageModel @WorkerThread constructor( } statusIcon.postValue(icon) } + + @WorkerThread + private fun computeDeliveryStatus() { + val list = arrayListOf() + + for (participant in chatMessage.getParticipantsByImdnState(ChatMessage.State.Displayed)) { + list.add(getDeliveryModelForAddress(participant)) + } + + deliveryModels.postValue(list) + } + + @WorkerThread + private fun getDeliveryModelForAddress(participantImdnState: ParticipantImdnState): ChatMessageDeliveryModel { + val address = participantImdnState.participant.address + Log.i("$TAG Looking for participant model with address [${address.asStringUriOnly()}]") + + val clone = address.clone() + clone.clean() + + val friend = coreContext.contactsManager.findContactByAddress(clone) + val avatar = if (friend != null) { + ChatMessageDeliveryModel(friend, participantImdnState) + } else { + val fakeFriend = coreContext.core.createFriend() + fakeFriend.address = clone + ChatMessageDeliveryModel(fakeFriend, participantImdnState) + } + + return avatar + } } diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/ParticipantModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/ParticipantModel.kt index d91feb56b..61b1c49ec 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/ParticipantModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/ParticipantModel.kt @@ -33,7 +33,6 @@ class ParticipantModel @WorkerThread constructor( val isParticipantAdmin: Boolean, private val onMenuClicked: ((view: View, model: ParticipantModel) -> Unit)? = null ) : ContactAvatarModel(friend) { - val sipUri = address.asStringUriOnly() @UiThread diff --git a/app/src/main/res/drawable/shape_numpad_background.xml b/app/src/main/res/drawable/shape_bottom_sheet_background.xml similarity index 100% rename from app/src/main/res/drawable/shape_numpad_background.xml rename to app/src/main/res/drawable/shape_bottom_sheet_background.xml diff --git a/app/src/main/res/layout/chat_bubble_incoming.xml b/app/src/main/res/layout/chat_bubble_incoming.xml index d41d00e07..b4c3db503 100644 --- a/app/src/main/res/layout/chat_bubble_incoming.xml +++ b/app/src/main/res/layout/chat_bubble_incoming.xml @@ -10,6 +10,9 @@ + @@ -86,7 +89,7 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/chat_delivery_list_cell.xml b/app/src/main/res/layout/chat_delivery_list_cell.xml new file mode 100644 index 000000000..b3d4fb556 --- /dev/null +++ b/app/src/main/res/layout/chat_delivery_list_cell.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file 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 new file mode 100644 index 000000000..ec5ed16e3 --- /dev/null +++ b/app/src/main/res/layout/chat_message_delivery_bottom_sheet.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/start_call_numpad.xml b/app/src/main/res/layout/start_call_numpad.xml index be00a17a8..52721839e 100644 --- a/app/src/main/res/layout/start_call_numpad.xml +++ b/app/src/main/res/layout/start_call_numpad.xml @@ -15,7 +15,7 @@