Added button to scroll to bottom

This commit is contained in:
Sylvain Berfini 2023-12-14 10:39:21 +01:00
parent 4ac3649c90
commit 25c2cfc84e
4 changed files with 37 additions and 5 deletions

View file

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

View file

@ -67,6 +67,8 @@ class ConversationViewModel @UiThread constructor() : ViewModel() {
val searchFilter = MutableLiveData<String>()
val isUserScrollingUp = MutableLiveData<Boolean>()
var scrollingPosition: Int = SCROLLING_POSITION_NOT_SET
val focusSearchBarEvent: MutableLiveData<Event<Boolean>> by lazy {
@ -233,6 +235,7 @@ class ConversationViewModel @UiThread constructor() : ViewModel() {
init {
searchBarVisible.value = false
isUserScrollingUp.value = false
}
override fun onCleared() {

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="256"
android:viewportHeight="256">
<path
android:pathData="M213.66,122.34a8,8 0,0 1,0 11.32l-80,80a8,8 0,0 1,-11.32 0l-80,-80a8,8 0,0 1,11.32 -11.32L128,196.69l74.34,-74.35A8,8 0,0 1,213.66 122.34ZM122.34,133.66a8,8 0,0 0,11.32 0l80,-80a8,8 0,0 0,-11.32 -11.32L128,116.69 53.66,42.34A8,8 0,0 0,42.34 53.66Z"
android:fillColor="#4e6074"/>
</vector>

View file

@ -22,6 +22,9 @@
<variable
name="openFilePickerClickListener"
type="View.OnClickListener" />
<variable
name="scrollToBottomClickListener"
type="View.OnClickListener" />
<variable
name="viewModel"
type="org.linphone.ui.main.chat.viewmodel.ConversationViewModel" />
@ -239,6 +242,21 @@
bind:openFilePickerClickListener="@{openFilePickerClickListener}"
bind:viewModel="@{sendMessageViewModel}"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/scroll_to_bottom"
android:onClick="@{scrollToBottomClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:src="@drawable/caret_double_down"
android:visibility="@{viewModel.isUserScrollingUp ? View.VISIBLE : View.GONE}"
app:tint="?attr/color_main2_700"
app:backgroundTint="?attr/color_main2_000"
app:shapeAppearanceOverlay="@style/rounded"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/send_area" />
</androidx.constraintlayout.widget.ConstraintLayout>
<include