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 6b16a4f3b..d47da8486 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 @@ -493,21 +493,47 @@ class DetailChatRoomFragment : MasterFragment - val events = listViewModel.events.value.orEmpty() - val eventLog = events.find { eventLog -> - if (eventLog.eventLog.type == EventLog.Type.ConferenceChatMessage) { - (eventLog.data as ChatMessageData).chatMessage.messageId == chatMessage.messageId - } else false - } - val index = events.indexOf(eventLog) - try { - if (corePreferences.enableAnimations) { - binding.chatMessagesList.smoothScrollToPosition(index) - } else { - binding.chatMessagesList.scrollToPosition(index) + var index = 0 + var retryCount = 0 + var expectedChildCount = 0 + do { + val events = listViewModel.events.value.orEmpty() + expectedChildCount = events.size + Log.e("[Chat Room] expectedChildCount : $expectedChildCount") + val eventLog = events.find { eventLog -> + if (eventLog.eventLog.type == EventLog.Type.ConferenceChatMessage) { + (eventLog.data as ChatMessageData).chatMessage.messageId == chatMessage.messageId + } else false } - } catch (iae: IllegalArgumentException) { - Log.e("[Chat Room] Can't scroll to position $index") + index = events.indexOf(eventLog) + if (index == -1) { + retryCount += 1 + listViewModel.loadMoreData(events.size) + } + } while (index == -1 && retryCount < 5) + + if (index != -1) { + if (retryCount == 0) { + scrollTo(index, true) + } else { + lifecycleScope.launch { + withContext(Dispatchers.Default) { + val layoutManager = binding.chatMessagesList.layoutManager as LinearLayoutManager + var retryCount = 0 + do { + // We have to wait for newly loaded items to be added to list before being able to scroll + delay(500) + retryCount += 1 + } while (layoutManager.itemCount != expectedChildCount && retryCount < 5) + + withContext(Dispatchers.Main) { + scrollTo(index, true) + } + } + } + } + } else { + Log.w("[Chat Room] Failed to find matching event!") } } } @@ -1041,11 +1067,7 @@ class DetailChatRoomFragment : MasterFragment