From c2eccd23a8e091ea9b9ad73d8a3b33ca9ff9cbe1 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 20 Nov 2023 11:21:54 +0100 Subject: [PATCH] Open keyboard on reply, scroll to latest message when keyboard is opened, removed onNewEvents causing duplicated messages, fixed latest message display when adding new ones that should be grouped with it --- .../chat/fragment/ConversationFragment.kt | 6 ++ .../chat/viewmodel/ConversationViewModel.kt | 85 +++++++++---------- 2 files changed, 46 insertions(+), 45 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 e3fd7d8da..f1ab9aa33 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 @@ -451,6 +451,9 @@ class ConversationFragment : GenericFragment() { binding.root.setKeyboardInsetListener { keyboardVisible -> if (keyboardVisible) { sendMessageViewModel.isEmojiPickerOpen.value = false + + // Scroll to bottom when keyboard is opened so latest message is visible + binding.eventsList.scrollToPosition(adapter.itemCount - 1) } } } @@ -549,6 +552,9 @@ class ConversationFragment : GenericFragment() { Log.i("$TAG Updating sending area to reply to selected message") sendMessageViewModel.replyToMessage(chatMessageModel) dialog.dismiss() + + // Open keyboard & focus edit text + binding.sendArea.messageToSend.showKeyboard() } layout.model = chatMessageModel diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt index f36e24de1..6977c11a6 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt @@ -99,34 +99,26 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { val list = arrayListOf() list.addAll(events.value.orEmpty()) - - val avatarModel = coreContext.contactsManager.getContactAvatarModelForAddress( - message?.localAddress - ) val lastEvent = events.value.orEmpty().lastOrNull() - val group = if (lastEvent != null) { - shouldWeGroupTwoEvents(eventLog, lastEvent.eventLog) - } else { - false - } - list.add( - EventLogModel( - eventLog, - avatarModel, - LinphoneUtils.isChatRoomAGroup(chatRoom), - group, - true, - { file -> - fileToDisplayEvent.postValue(Event(file)) - }, - { conferenceUri -> - conferenceToJoinEvent.postValue(Event(conferenceUri)) - }, - { url -> - openWebBrowserEvent.postValue(Event(url)) - } + if (lastEvent != null && shouldWeGroupTwoEvents(eventLog, lastEvent.eventLog)) { + list.remove(lastEvent) + + val eventsLogsArray = arrayOf() + eventsLogsArray[0] = lastEvent.eventLog + eventsLogsArray[1] = eventLog + + val newList = getEventsListFromHistory( + eventsLogsArray, + searchFilter.value.orEmpty().trim() ) - ) + list.addAll(newList) + } else { + val newList = getEventsListFromHistory( + arrayOf(eventLog), + searchFilter.value.orEmpty().trim() + ) + list.addAll(newList) + } events.postValue(list) } @@ -157,29 +149,32 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { val list = arrayListOf() list.addAll(events.value.orEmpty()) + val lastEvent = list.lastOrNull() - val newList = getEventsListFromHistory( - eventLogs, - searchFilter.value.orEmpty().trim() - ) - list.addAll(newList) + if (lastEvent != null && shouldWeGroupTwoEvents(eventLogs.first(), lastEvent.eventLog)) { + list.remove(lastEvent) - // TODO: handle case when first one of the newly received messages should be grouped with last one of the current list + val eventsLogsArray = arrayOf() + eventsLogsArray[0] = lastEvent.eventLog + var index = 1 + for (eventLog in eventLogs) { + eventsLogsArray[index] = eventLog + index += 1 + } - events.postValue(list) - } - - @WorkerThread - override fun onNewEvents(chatRoom: ChatRoom, eventLogs: Array) { - Log.i("$TAG Adding [${eventLogs.size}] new events") - val list = arrayListOf() - list.addAll(events.value.orEmpty()) - val fakeFriend = chatRoom.core.createFriend() - val avatarModel = ContactAvatarModel(fakeFriend) - for (eventLog in eventLogs) { - Log.i("$TAG New event [${eventLog.type}] added") - list.add(EventLogModel(eventLog, avatarModel)) + val newList = getEventsListFromHistory( + eventsLogsArray, + searchFilter.value.orEmpty().trim() + ) + list.addAll(newList) + } else { + val newList = getEventsListFromHistory( + eventLogs, + searchFilter.value.orEmpty().trim() + ) + list.addAll(newList) } + events.postValue(list) }