From 30cb7c128e1bf7494960e49493282790fb8d413d Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sun, 25 Mar 2018 18:31:33 +0200
Subject: [PATCH] Finally reliably fix the scroll issue

---
 .../ui/chat/messages/MessageListFragment.kt   | 29 ++++++++++++-------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
index de44cff2b..bf0625c4b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
@@ -83,6 +83,7 @@ class MessageListFragment : ServiceBoundFragment() {
     messageList.itemAnimator = null
     messageList.setItemViewCacheSize(20)
 
+    var isScrolling = false
     messageList.addOnScrollListener(
       object : RecyclerView.OnScrollListener() {
         override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
@@ -93,7 +94,13 @@ class MessageListFragment : ServiceBoundFragment() {
           scrollDown.toggle(canScrollDown && isScrollingDown)
         }
 
-        override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) = Unit
+        override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
+          isScrolling = when (newState) {
+            RecyclerView.SCROLL_STATE_SETTLING, RecyclerView.SCROLL_STATE_IDLE -> false
+            RecyclerView.SCROLL_STATE_DRAGGING                                 -> true
+            else                                                               -> isScrolling
+          }
+        }
       })
 
     val data = viewModel.buffer_liveData.switchMapNotNull { buffer ->
@@ -124,15 +131,6 @@ class MessageListFragment : ServiceBoundFragment() {
         if (message != null && bufferSyncer != null && previousMessageId != message.messageId) {
           markAsRead(bufferSyncer, message.bufferId, message.messageId)
           previousMessageId = message.messageId
-
-          if (firstVisibleItemPosition < 2) {
-            activity?.runOnUiThread { messageList.scrollToPosition(0) }
-            runInBackgroundDelayed(16) {
-              activity?.runOnUiThread {
-                messageList.scrollToPosition(0)
-              }
-            }
-          }
         }
       }
     })
@@ -144,6 +142,17 @@ class MessageListFragment : ServiceBoundFragment() {
       }
     })
 
+    fun checkScroll() {
+      if (linearLayoutManager.findFirstVisibleItemPosition() < 2 && !isScrolling) {
+        messageList.scrollToPosition(0)
+      }
+    }
+
+    adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
+      override fun onChanged() = checkScroll()
+      override fun onItemRangeInserted(positionStart: Int, itemCount: Int) = checkScroll()
+    })
+
     var lastBuffer = -1
     data.observe(this, Observer { list ->
       val firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition()
-- 
GitLab