From 6b14621ef1e57ebafed320f18107f67643e9a048 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Wed, 2 May 2018 18:41:33 +0200
Subject: [PATCH] Automatically reload messages on reconnect

Signed-off-by: Janne Koschinski <janne@kuschku.de>
---
 .../ui/chat/messages/MessageListFragment.kt   | 39 ++++++++++++-------
 1 file changed, 25 insertions(+), 14 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 d66fb83c7..a059ebbc6 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
@@ -40,9 +40,12 @@ import com.bumptech.glide.Glide
 import com.bumptech.glide.ListPreloader
 import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader
 import com.bumptech.glide.util.FixedPreloadSizeProvider
+import de.kuschku.libquassel.connection.ConnectionState
 import de.kuschku.libquassel.protocol.BufferId
 import de.kuschku.libquassel.protocol.MsgId
 import de.kuschku.libquassel.quassel.syncables.BufferSyncer
+import de.kuschku.libquassel.session.SessionManager
+import de.kuschku.libquassel.util.helpers.mapSwitchMap
 import de.kuschku.libquassel.util.helpers.value
 import de.kuschku.libquassel.util.irc.HostmaskHelper
 import de.kuschku.quasseldroid.GlideApp
@@ -246,23 +249,22 @@ class MessageListFragment : ServiceBoundFragment() {
     }
 
     var isScrolling = false
-    messageList.addOnScrollListener(
-      object : RecyclerView.OnScrollListener() {
-        override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
-          val canScrollDown = recyclerView.canScrollVertically(1)
-          val isScrollingDown = dy > 0
+    messageList.addOnScrollListener(object : RecyclerView.OnScrollListener() {
+      override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
+        val canScrollDown = recyclerView.canScrollVertically(1)
+        val isScrollingDown = dy > 0
 
-          scrollDown.toggle(canScrollDown && isScrollingDown)
-        }
+        scrollDown.toggle(canScrollDown && isScrollingDown)
+      }
 
-        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
-          }
+      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
         }
-      })
+      }
+    })
 
     fun processMessages(list: List<QuasselDatabase.MessageData>, selected: Set<MsgId>,
                         expanded: Set<MsgId>, markerLine: MsgId?): List<DisplayMessage> {
@@ -314,6 +316,15 @@ class MessageListFragment : ServiceBoundFragment() {
       swipeRefreshLayout.isEnabled = (bufferId != null || bufferId != -1)
     })
 
+    viewModel.sessionManager.mapSwitchMap(SessionManager::state).distinctUntilChanged().toLiveData().observe(
+      this, Observer {
+      if (it?.orNull() == ConnectionState.CONNECTED) {
+        runInBackgroundDelayed(16) {
+          loadMore()
+        }
+      }
+    })
+
     var previousVisible = -1L
     viewModel.buffer.toFlowable(BackpressureStrategy.LATEST).switchMap { buffer ->
       database.filtered().listenRx(accountId, buffer).switchMap { filtered ->
-- 
GitLab