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

This commit is contained in:
Sylvain Berfini 2023-11-20 11:21:54 +01:00
parent ed23268672
commit c2eccd23a8
2 changed files with 46 additions and 45 deletions

View file

@ -451,6 +451,9 @@ class ConversationFragment : GenericFragment() {
binding.root.setKeyboardInsetListener { keyboardVisible -> binding.root.setKeyboardInsetListener { keyboardVisible ->
if (keyboardVisible) { if (keyboardVisible) {
sendMessageViewModel.isEmojiPickerOpen.value = false 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") Log.i("$TAG Updating sending area to reply to selected message")
sendMessageViewModel.replyToMessage(chatMessageModel) sendMessageViewModel.replyToMessage(chatMessageModel)
dialog.dismiss() dialog.dismiss()
// Open keyboard & focus edit text
binding.sendArea.messageToSend.showKeyboard()
} }
layout.model = chatMessageModel layout.model = chatMessageModel

View file

@ -99,34 +99,26 @@ class ConversationViewModel @UiThread constructor() : ViewModel() {
val list = arrayListOf<EventLogModel>() val list = arrayListOf<EventLogModel>()
list.addAll(events.value.orEmpty()) list.addAll(events.value.orEmpty())
val avatarModel = coreContext.contactsManager.getContactAvatarModelForAddress(
message?.localAddress
)
val lastEvent = events.value.orEmpty().lastOrNull() val lastEvent = events.value.orEmpty().lastOrNull()
val group = if (lastEvent != null) { if (lastEvent != null && shouldWeGroupTwoEvents(eventLog, lastEvent.eventLog)) {
shouldWeGroupTwoEvents(eventLog, lastEvent.eventLog) list.remove(lastEvent)
} else {
false val eventsLogsArray = arrayOf<EventLog>()
} eventsLogsArray[0] = lastEvent.eventLog
list.add( eventsLogsArray[1] = eventLog
EventLogModel(
eventLog, val newList = getEventsListFromHistory(
avatarModel, eventsLogsArray,
LinphoneUtils.isChatRoomAGroup(chatRoom), searchFilter.value.orEmpty().trim()
group,
true,
{ file ->
fileToDisplayEvent.postValue(Event(file))
},
{ conferenceUri ->
conferenceToJoinEvent.postValue(Event(conferenceUri))
},
{ url ->
openWebBrowserEvent.postValue(Event(url))
}
) )
) list.addAll(newList)
} else {
val newList = getEventsListFromHistory(
arrayOf(eventLog),
searchFilter.value.orEmpty().trim()
)
list.addAll(newList)
}
events.postValue(list) events.postValue(list)
} }
@ -157,29 +149,32 @@ class ConversationViewModel @UiThread constructor() : ViewModel() {
val list = arrayListOf<EventLogModel>() val list = arrayListOf<EventLogModel>()
list.addAll(events.value.orEmpty()) list.addAll(events.value.orEmpty())
val lastEvent = list.lastOrNull()
val newList = getEventsListFromHistory( if (lastEvent != null && shouldWeGroupTwoEvents(eventLogs.first(), lastEvent.eventLog)) {
eventLogs, list.remove(lastEvent)
searchFilter.value.orEmpty().trim()
)
list.addAll(newList)
// TODO: handle case when first one of the newly received messages should be grouped with last one of the current list val eventsLogsArray = arrayOf<EventLog>()
eventsLogsArray[0] = lastEvent.eventLog
var index = 1
for (eventLog in eventLogs) {
eventsLogsArray[index] = eventLog
index += 1
}
events.postValue(list) val newList = getEventsListFromHistory(
} eventsLogsArray,
searchFilter.value.orEmpty().trim()
@WorkerThread )
override fun onNewEvents(chatRoom: ChatRoom, eventLogs: Array<out EventLog>) { list.addAll(newList)
Log.i("$TAG Adding [${eventLogs.size}] new events") } else {
val list = arrayListOf<EventLogModel>() val newList = getEventsListFromHistory(
list.addAll(events.value.orEmpty()) eventLogs,
val fakeFriend = chatRoom.core.createFriend() searchFilter.value.orEmpty().trim()
val avatarModel = ContactAvatarModel(fakeFriend) )
for (eventLog in eventLogs) { list.addAll(newList)
Log.i("$TAG New event [${eventLog.type}] added")
list.add(EventLogModel(eventLog, avatarModel))
} }
events.postValue(list) events.postValue(list)
} }