From 77d418cb35066d5dad1fd33dca4fdd6a3800daa7 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Mon, 17 Jun 2019 09:59:19 +0200 Subject: [PATCH] Fixes #204 --- .../quasseldroid/service/QuasselService.kt | 2 +- .../libquassel/session/SessionManager.kt | 33 +++++++++++++++---- 2 files changed, 27 insertions(+), 8 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 d5061da51..b7bd8c148 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt @@ -449,7 +449,7 @@ class QuasselService : DaggerLifecycleService(), private var backoff = BACKOFF_MIN private var scheduled = false private fun scheduleReconnect() { - if (!scheduled) { + if (!scheduled && sessionManager.canAutoReconnect(ignoreSetting = true)) { log(INFO, "QuasselService", "Reconnect: Scheduling backoff in ${backoff / 1_000} seconds") scheduled = true handlerService.backendDelayed(backoff) { 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 ffc95d9dd..1896fea3a 100644 --- a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt +++ b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt @@ -45,6 +45,7 @@ class SessionManager( // Stateful fields private var lastConnectionInfo: ConnectionInfo? = null private var hasErrored: Boolean = false + private var hasBeenDisconnected: Boolean = false private val disposables = mutableListOf<Disposable>() @@ -117,19 +118,24 @@ class SessionManager( hasErrored = true } - fun autoConnect( + fun canAutoReconnect( ignoreConnectionState: Boolean = false, ignoreSetting: Boolean = false, ignoreErrors: Boolean = false, connectionInfo: ConnectionInfo? = lastConnectionInfo ): Boolean { + if (hasBeenDisconnected) { + log(DEBUG, "SessionManager", "Reconnect not possible: manually disconnected") + return false + } + if (connectionInfo == null) { - log(INFO, "SessionManager", "Reconnect failed: not enough data available") + log(DEBUG, "SessionManager", "Reconnect not possible: not enough data available") return false } if (!connectionInfo.shouldReconnect && !ignoreSetting) { - log(INFO, "SessionManager", "Reconnect failed: reconnect not allowed") + log(DEBUG, "SessionManager", "Reconnect not possible: reconnect not allowed") return false } @@ -137,21 +143,34 @@ class SessionManager( if (connectionState != ConnectionState.DISCONNECTED && connectionState != ConnectionState.CLOSED && !ignoreConnectionState) { - log(INFO, "SessionManager", "Reconnect failed: connection state is $connectionState") + log(DEBUG, "SessionManager", "Reconnect not possible: connection state is $connectionState") return false } if (hasErrored && !ignoreErrors) { - log(INFO, "SessionManager", "Reconnect failed: errors have been thrown") + log(DEBUG, "SessionManager", "Reconnect not possible: errors have been thrown") return false } - log(INFO, "SessionManager", "Reconnect successful") - connect(connectionInfo) + return true + } + + fun autoConnect( + ignoreConnectionState: Boolean = false, + ignoreSetting: Boolean = false, + ignoreErrors: Boolean = false, + connectionInfo: ConnectionInfo? = lastConnectionInfo + ): Boolean { + if (!canAutoReconnect(ignoreConnectionState, ignoreSetting, ignoreErrors, connectionInfo)) + return false + + log(DEBUG, "SessionManager", "Reconnect successful") + connect(connectionInfo!!) return true } fun disconnect(forever: Boolean) { + hasBeenDisconnected = true if (forever) backlogStorage.clearMessages() updateStateOffline() } -- GitLab