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) }