From 02c74d5867b51688a7c828f31bb374581ad1d7a8 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Tue, 1 May 2018 21:52:56 +0200
Subject: [PATCH] Improve reconnect handling

Signed-off-by: Janne Koschinski <janne@kuschku.de>
---
 .../quasseldroid/service/QuasselService.kt     | 11 ++---------
 .../libquassel/session/SessionManager.kt       | 18 +++++++++++++++++-
 2 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
index afac73fae..f342635c8 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
@@ -338,15 +338,13 @@ class QuasselService : DaggerLifecycleService(),
       }
     })
 
-    var wasEverConnected = false
     connectivity
       .delay(200, TimeUnit.MILLISECONDS)
       .throttleFirst(1, TimeUnit.SECONDS)
       .toLiveData()
       .observe(this, Observer {
         handlerService.backend {
-          if (wasEverConnected && !sessionManager.hasErrored)
-            sessionManager.reconnect(true)
+          sessionManager.autoReconnect(true)
         }
       })
 
@@ -358,12 +356,7 @@ class QuasselService : DaggerLifecycleService(),
       .observe(
         this, Observer {
         handlerService.backend {
-          if (it == ConnectionState.DISCONNECTED || it == ConnectionState.CLOSED) {
-            if (wasEverConnected && !sessionManager.hasErrored)
-              sessionManager.reconnect()
-          } else {
-            wasEverConnected = true
-          }
+          sessionManager.autoReconnect()
         }
       })
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
index 83d3188ce..ea5edf291 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
@@ -98,9 +98,17 @@ class SessionManager(
     Invokers
   }
 
+  fun ifClosed(closure: (ISession) -> Unit) {
+    state.or(ConnectionState.DISCONNECTED).let {
+      if (it == ConnectionState.CLOSED) {
+        closure(inProgressSession.value)
+      }
+    }
+  }
+
   fun ifDisconnected(closure: (ISession) -> Unit) {
     state.or(ConnectionState.DISCONNECTED).let {
-      if (it == ConnectionState.DISCONNECTED || it == ConnectionState.CLOSED) {
+      if (it == ConnectionState.CLOSED || it == ConnectionState.DISCONNECTED) {
         closure(inProgressSession.value)
       }
     }
@@ -138,6 +146,14 @@ class SessionManager(
     )
   }
 
+  fun autoReconnect(forceReconnect: Boolean = false) {
+    if (!hasErrored) {
+      ifClosed {
+        reconnect(forceReconnect)
+      }
+    }
+  }
+
   fun reconnect(forceReconnect: Boolean = false) {
     if (lastShouldReconnect || forceReconnect) {
       val clientData = lastClientData
-- 
GitLab