From db45a2bb78fd9618fe65eb32387f1b1c709b6ef0 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 27 Oct 2021 10:49:52 +0200 Subject: [PATCH] Scroll to first unread message instead of bottom + load enough events to have all unread messages --- .../chat/adapters/ChatMessagesListAdapter.kt | 4 ++ .../chat/fragments/DetailChatRoomFragment.kt | 69 +++++++++++++------ .../viewmodels/ChatMessagesListViewModel.kt | 21 +++++- 3 files changed, 72 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt index 2451aff01..676be21b0 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/adapters/ChatMessagesListAdapter.kt @@ -173,6 +173,10 @@ class ChatMessagesListAdapter( firstUnreadMessagePosition = -1 } + fun getFirstUnreadMessagePosition(): Int { + return firstUnreadMessagePosition + } + private fun computeFirstUnreadMessagePosition() { if (unreadMessagesCount > 0) { var messageCount = 0 diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt index e0dd99620..3a05b5ff5 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt @@ -27,6 +27,7 @@ import android.os.Bundle import android.os.Parcelable import android.provider.MediaStore import android.view.* +import android.view.ViewTreeObserver.OnGlobalLayoutListener import android.widget.PopupWindow import androidx.core.content.FileProvider import androidx.core.view.doOnPreDraw @@ -75,13 +76,18 @@ class DetailChatRoomFragment : MasterFragment 0) { - binding.chatMessagesList.scrollToPosition(adapter.itemCount - 1) - } - } - - private fun smoothScrollToPosition() { - if (_adapter != null && adapter.itemCount > 0) { - if (corePreferences.enableAnimations) { - binding.chatMessagesList.smoothScrollToPosition(adapter.itemCount - 1) + // Scroll to first unread message if any + val firstUnreadMessagePosition = adapter.getFirstUnreadMessagePosition() + val indexToScrollTo = if (firstUnreadMessagePosition != -1) { + firstUnreadMessagePosition } else { - binding.chatMessagesList.scrollToPosition(adapter.itemCount - 1) + adapter.itemCount - 1 + } + + Log.i("[Chat Room] Scrolling to position $indexToScrollTo, first unread message is at $firstUnreadMessagePosition") + if (smooth && corePreferences.enableAnimations) { + binding.chatMessagesList.smoothScrollToPosition(indexToScrollTo) + } else { + binding.chatMessagesList.scrollToPosition(indexToScrollTo) } } } diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessagesListViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessagesListViewModel.kt index b030e600b..b97b5ecac 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessagesListViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatMessagesListViewModel.kt @@ -214,12 +214,31 @@ class ChatMessagesListViewModel(private val chatRoom: ChatRoom) : ViewModel() { private fun getEvents(): ArrayList { val list = arrayListOf() val unreadCount = chatRoom.unreadMessagesCount - val loadCount = max(MESSAGES_PER_PAGE, unreadCount) + var loadCount = max(MESSAGES_PER_PAGE, unreadCount) Log.i("[Chat Messages] $unreadCount unread messages in this chat room, loading $loadCount from history") + val history = chatRoom.getHistoryEvents(loadCount) + var messageCount = 0 for (eventLog in history) { list.add(EventLogData(eventLog)) + if (eventLog.type == EventLog.Type.ConferenceChatMessage) { + messageCount += 1 + } } + + // Load enough events to have at least all unread messages + while (unreadCount > 0 && messageCount < unreadCount) { + Log.w("[Chat Messages] There is only $messageCount messages in the last $loadCount events, loading $MESSAGES_PER_PAGE more") + val moreHistory = chatRoom.getHistoryRangeEvents(loadCount, loadCount + MESSAGES_PER_PAGE) + loadCount += MESSAGES_PER_PAGE + for (eventLog in moreHistory) { + list.add(EventLogData(eventLog)) + if (eventLog.type == EventLog.Type.ConferenceChatMessage) { + messageCount += 1 + } + } + } + return list }