diff --git a/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt index c00bb7ff3..83240803e 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/MessagesFragment.kt @@ -101,19 +101,32 @@ class MessagesFragment : Fragment(), Logging { fun scrollToFirstUnreadMessage() { val position = messages.indexOfFirst { !it.read } - if (position > 0) { + if (position >= 0) { val rect = Rect() binding.toolbar.getGlobalVisibleRect(rect) val toolbarOffset = rect.bottom val offset = binding.messageListView.height - toolbarOffset layoutManager.scrollToPositionWithOffset(position, offset) - messages[position].apply { model.clearUnreadCount(contact_key, received_time) } } else { scrollToBottom() } } + fun clearUnreadCount() { + val firstUnreadItem = messages.firstOrNull { !it.read } ?: return + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + if (lastVisibleItemPosition != RecyclerView.NO_POSITION) { + val lastVisibleItem = messages[lastVisibleItemPosition] + val contactKey = lastVisibleItem.contact_key + val timestamp = lastVisibleItem.received_time + + if (timestamp >= firstUnreadItem.received_time) { + model.clearUnreadCount(contactKey, timestamp) + } + } + } + override fun getItemCount(): Int = messages.size override fun onBindViewHolder(holder: ViewHolder, position: Int) { @@ -301,20 +314,19 @@ class MessagesFragment : Fragment(), Logging { binding.messageListView.layoutManager = layoutManager binding.messageListView.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + super.onScrollStateChanged(recyclerView, newState) + + if (newState == RecyclerView.SCROLL_STATE_IDLE) { + messagesAdapter.clearUnreadCount() + } + } + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) - val firstUnreadItem = messagesAdapter.messages.firstOrNull { !it.read } - if (firstUnreadItem != null && dy > 0) { - val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() - if (lastVisibleItemPosition != RecyclerView.NO_POSITION) { - val lastVisibleItem = messagesAdapter.messages[lastVisibleItemPosition] - val timestamp = lastVisibleItem.received_time - - if (timestamp > firstUnreadItem.received_time) { - model.clearUnreadCount(contactKey, timestamp) - } - } + if (dy == 0) { + messagesAdapter.clearUnreadCount() } } })