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 3b7deac89..7d15a1ffc 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 @@ -103,8 +103,6 @@ class ConversationFragment : SlidingPaneChildFragment() { private val args: ConversationFragmentArgs by navArgs() - private var isUserScrollingUp: Boolean = false - private val pickMedia = registerForActivityResult( ActivityResultContracts.PickMultipleVisualMedia() ) { list -> @@ -367,6 +365,10 @@ class ConversationFragment : SlidingPaneChildFragment() { } } + binding.setScrollToBottomClickListener { + scrollToFirstUnreadMessageOrBottom(true) + } + sendMessageViewModel.emojiToAddEvent.observe(viewLifecycleOwner) { it.consume { emoji -> binding.sendArea.messageToSend.addCharacterAtPosition(emoji) @@ -518,7 +520,7 @@ class ConversationFragment : SlidingPaneChildFragment() { sendMessageViewModel.isEmojiPickerOpen.value = false // Scroll to bottom if was already at the bottom - if (!isUserScrollingUp) { + if (viewModel.isUserScrollingUp.value == false) { binding.eventsList.scrollToPosition(adapter.itemCount - 1) } } @@ -527,7 +529,7 @@ class ConversationFragment : SlidingPaneChildFragment() { binding.eventsList.addOnScrollListener(object : OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { val layoutManager = binding.eventsList.layoutManager as LinearLayoutManager - isUserScrollingUp = layoutManager.findLastCompletelyVisibleItemPosition() != adapter.itemCount - 1 + viewModel.isUserScrollingUp.value = layoutManager.findLastCompletelyVisibleItemPosition() != adapter.itemCount - 1 } }) } @@ -575,7 +577,7 @@ class ConversationFragment : SlidingPaneChildFragment() { coreContext.notificationsManager.resetCurrentlyDisplayedChatRoomId() val layoutManager = binding.eventsList.layoutManager as LinearLayoutManager - viewModel.scrollingPosition = layoutManager.findFirstVisibleItemPosition() + viewModel.scrollingPosition = layoutManager.findFirstCompletelyVisibleItemPosition() val bottomSheetBehavior = BottomSheetBehavior.from(binding.messageBottomSheet.root) bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallback) 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 08cd51c41..6841f053e 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 @@ -67,6 +67,8 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { val searchFilter = MutableLiveData() + val isUserScrollingUp = MutableLiveData() + var scrollingPosition: Int = SCROLLING_POSITION_NOT_SET val focusSearchBarEvent: MutableLiveData> by lazy { @@ -233,6 +235,7 @@ class ConversationViewModel @UiThread constructor() : ViewModel() { init { searchBarVisible.value = false + isUserScrollingUp.value = false } override fun onCleared() { diff --git a/app/src/main/res/drawable/caret_double_down.xml b/app/src/main/res/drawable/caret_double_down.xml new file mode 100644 index 000000000..ec6333c09 --- /dev/null +++ b/app/src/main/res/drawable/caret_double_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/chat_conversation_fragment.xml b/app/src/main/res/layout/chat_conversation_fragment.xml index c03834aba..544a764b8 100644 --- a/app/src/main/res/layout/chat_conversation_fragment.xml +++ b/app/src/main/res/layout/chat_conversation_fragment.xml @@ -22,6 +22,9 @@ + @@ -239,6 +242,21 @@ bind:openFilePickerClickListener="@{openFilePickerClickListener}" bind:viewModel="@{sendMessageViewModel}"/> + +