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 b80f504c0..3b7deac89 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 @@ -46,7 +46,9 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver +import androidx.recyclerview.widget.RecyclerView.OnScrollListener import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback import com.google.android.material.tabs.TabLayout @@ -101,6 +103,8 @@ class ConversationFragment : SlidingPaneChildFragment() { private val args: ConversationFragmentArgs by navArgs() + private var isUserScrollingUp: Boolean = false + private val pickMedia = registerForActivityResult( ActivityResultContracts.PickMultipleVisualMedia() ) { list -> @@ -512,8 +516,20 @@ class ConversationFragment : SlidingPaneChildFragment() { binding.root.setKeyboardInsetListener { keyboardVisible -> if (keyboardVisible) { sendMessageViewModel.isEmojiPickerOpen.value = false + + // Scroll to bottom if was already at the bottom + if (!isUserScrollingUp) { + binding.eventsList.scrollToPosition(adapter.itemCount - 1) + } } } + + 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 + } + }) } override fun onResume() { diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt index fedc789fa..ae411a40b 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/MessageModel.kt @@ -83,7 +83,7 @@ class MessageModel @WorkerThread constructor( val id = chatMessage.messageId - val isRead = chatMessage.isRead + var isRead = chatMessage.isRead val isOutgoing = chatMessage.isOutgoing @@ -174,6 +174,9 @@ class MessageModel @WorkerThread constructor( downloadingFileModel = null } computeContentsList() + } else if (messageState == ChatMessage.State.Displayed) { + Log.i("$TAG Message was marked as read") + isRead = true } }