@@ -38,8 +38,7 @@ internal class WebSocketConnection(
|
|||||||
private lateinit var onMessageCallback: (Message) -> Unit
|
private lateinit var onMessageCallback: (Message) -> Unit
|
||||||
private lateinit var onClose: Runnable
|
private lateinit var onClose: Runnable
|
||||||
private lateinit var onOpen: Runnable
|
private lateinit var onOpen: Runnable
|
||||||
private lateinit var onBadRequest: BadRequestRunnable
|
private lateinit var onFailure: OnNetworkFailureRunnable
|
||||||
private lateinit var onNetworkFailure: OnNetworkFailureRunnable
|
|
||||||
private lateinit var onReconnected: Runnable
|
private lateinit var onReconnected: Runnable
|
||||||
private var state: State? = null
|
private var state: State? = null
|
||||||
|
|
||||||
@@ -71,14 +70,8 @@ internal class WebSocketConnection(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
fun onBadRequest(onBadRequest: BadRequestRunnable): WebSocketConnection {
|
fun onFailure(onFailure: OnNetworkFailureRunnable): WebSocketConnection {
|
||||||
this.onBadRequest = onBadRequest
|
this.onFailure = onFailure
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
@Synchronized
|
|
||||||
fun onNetworkFailure(onNetworkFailure: OnNetworkFailureRunnable): WebSocketConnection {
|
|
||||||
this.onNetworkFailure = onNetworkFailure
|
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,15 +185,11 @@ internal class WebSocketConnection(
|
|||||||
Logger.error(t) { "WebSocket($id): failure $code Message: $message" }
|
Logger.error(t) { "WebSocket($id): failure $code Message: $message" }
|
||||||
syncExec(id) {
|
syncExec(id) {
|
||||||
closed()
|
closed()
|
||||||
if (response != null && response.code >= 400 && response.code <= 499) {
|
|
||||||
onBadRequest.execute(message)
|
|
||||||
return@syncExec
|
|
||||||
}
|
|
||||||
|
|
||||||
errorCount++
|
errorCount++
|
||||||
val minutes = (errorCount * 2 - 1).coerceAtMost(20)
|
val minutes = (errorCount * 2 - 1).coerceAtMost(20)
|
||||||
|
|
||||||
onNetworkFailure.execute(minutes)
|
onFailure.execute(response?.message ?: "unreachable", minutes)
|
||||||
scheduleReconnect(TimeUnit.MINUTES.toSeconds(minutes.toLong()))
|
scheduleReconnect(TimeUnit.MINUTES.toSeconds(minutes.toLong()))
|
||||||
}
|
}
|
||||||
super.onFailure(webSocket, t, response)
|
super.onFailure(webSocket, t, response)
|
||||||
@@ -214,12 +203,8 @@ internal class WebSocketConnection(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun interface BadRequestRunnable {
|
|
||||||
fun execute(message: String)
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun interface OnNetworkFailureRunnable {
|
internal fun interface OnNetworkFailureRunnable {
|
||||||
fun execute(minutes: Int)
|
fun execute(status: String, minutes: Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal enum class State {
|
internal enum class State {
|
||||||
|
|||||||
@@ -111,8 +111,7 @@ internal class WebSocketService : Service() {
|
|||||||
)
|
)
|
||||||
.onOpen { onOpen() }
|
.onOpen { onOpen() }
|
||||||
.onClose { onClose() }
|
.onClose { onClose() }
|
||||||
.onBadRequest { message -> onBadRequest(message) }
|
.onFailure { status, minutes -> onFailure(status, minutes) }
|
||||||
.onNetworkFailure { minutes -> onNetworkFailure(minutes) }
|
|
||||||
.onMessage { message -> onMessage(message) }
|
.onMessage { message -> onMessage(message) }
|
||||||
.onReconnected { notifyMissedNotifications() }
|
.onReconnected { notifyMissedNotifications() }
|
||||||
.start()
|
.start()
|
||||||
@@ -179,16 +178,12 @@ internal class WebSocketService : Service() {
|
|||||||
connection!!.scheduleReconnect(15)
|
connection!!.scheduleReconnect(15)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onBadRequest(message: String) {
|
private fun onFailure(status: String, minutes: Int) {
|
||||||
showForegroundNotification(getString(R.string.websocket_could_not_connect), message)
|
val title = getString(R.string.websocket_error, status)
|
||||||
}
|
|
||||||
|
|
||||||
private fun onNetworkFailure(minutes: Int) {
|
|
||||||
val status = getString(R.string.websocket_not_connected)
|
|
||||||
val intervalUnit = resources
|
val intervalUnit = resources
|
||||||
.getQuantityString(R.plurals.websocket_retry_interval, minutes, minutes)
|
.getQuantityString(R.plurals.websocket_retry_interval, minutes, minutes)
|
||||||
showForegroundNotification(
|
showForegroundNotification(
|
||||||
status,
|
title,
|
||||||
"${getString(R.string.websocket_reconnect)} $intervalUnit"
|
"${getString(R.string.websocket_reconnect)} $intervalUnit"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,7 +64,6 @@
|
|||||||
<string name="missed_messages">Missed messages</string>
|
<string name="missed_messages">Missed messages</string>
|
||||||
<string name="grouped_notification_text">New Messages</string>
|
<string name="grouped_notification_text">New Messages</string>
|
||||||
<string name="websocket_listening">Connected</string>
|
<string name="websocket_listening">Connected</string>
|
||||||
<string name="websocket_could_not_connect">Could not connect</string>
|
|
||||||
<string name="websocket_init">Initializing</string>
|
<string name="websocket_init">Initializing</string>
|
||||||
<string name="versions">gotify/android v%1$s; gotify/server v%2$s</string>
|
<string name="versions">gotify/android v%1$s; gotify/server v%2$s</string>
|
||||||
<string name="advanced_settings">Advanced Settings</string>
|
<string name="advanced_settings">Advanced Settings</string>
|
||||||
@@ -112,7 +111,7 @@
|
|||||||
<string name="action_dialog_button_open">Open</string>
|
<string name="action_dialog_button_open">Open</string>
|
||||||
<string name="action_dialog_button_cancel">Cancel</string>
|
<string name="action_dialog_button_cancel">Cancel</string>
|
||||||
|
|
||||||
<string name="websocket_not_connected">Not connected</string>
|
<string name="websocket_error">Error %s (see logs)</string>
|
||||||
<string name="websocket_reconnect">Trying to reconnect</string>
|
<string name="websocket_reconnect">Trying to reconnect</string>
|
||||||
<plurals name="websocket_retry_interval">
|
<plurals name="websocket_retry_interval">
|
||||||
<item quantity="one">in %d minute</item>
|
<item quantity="one">in %d minute</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user