mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-21 00:59:49 +01:00
Detect and recycle WebSockets stuck in connecting state.
This commit is contained in:
@@ -60,7 +60,11 @@ import kotlin.time.Duration.Companion.seconds
|
||||
* This class is responsible for keeping the authenticated websocket open based on the app's state for incoming messages and
|
||||
* observing new inbound messages received over the websocket.
|
||||
*/
|
||||
class IncomingMessageObserver(private val context: Application, private val authWebSocket: SignalWebSocket.AuthenticatedWebSocket) {
|
||||
class IncomingMessageObserver(
|
||||
private val context: Application,
|
||||
private val authWebSocket: SignalWebSocket.AuthenticatedWebSocket,
|
||||
private val unauthWebSocket: SignalWebSocket.UnauthenticatedWebSocket
|
||||
) {
|
||||
|
||||
companion object {
|
||||
private val TAG = Log.tag(IncomingMessageObserver::class.java)
|
||||
@@ -89,18 +93,21 @@ class IncomingMessageObserver(private val context: Application, private val auth
|
||||
private val connectionNecessarySemaphore = Semaphore(0)
|
||||
private var previousProxyInfo: ProxyInfo? = null
|
||||
private val networkConnectionListener = NetworkConnectionListener(
|
||||
context,
|
||||
{ isNetworkUnavailable ->
|
||||
context = context,
|
||||
onNetworkLost = { isNetworkUnavailable ->
|
||||
lock.withLock {
|
||||
AppDependencies.libsignalNetwork.onNetworkChange()
|
||||
if (isNetworkUnavailable()) {
|
||||
Log.w(TAG, "Lost network connection. Resetting the drained state.")
|
||||
decryptionDrained = false
|
||||
authWebSocket.disconnect()
|
||||
// TODO [no-more-rest] Move the connection listener to a neutral location so this isn't passed in
|
||||
unauthWebSocket.disconnect()
|
||||
}
|
||||
connectionNecessarySemaphore.release()
|
||||
}
|
||||
},
|
||||
{ proxyInfo ->
|
||||
onProxySettingsChanged = { proxyInfo ->
|
||||
if (proxyInfo != previousProxyInfo) {
|
||||
val networkReset = AppDependencies.onSystemHttpProxyChange(proxyInfo?.host, proxyInfo?.port)
|
||||
if (networkReset) {
|
||||
|
||||
@@ -42,25 +42,25 @@ class NetworkConnectionListener(private val context: Context, private val onNetw
|
||||
|
||||
override fun onBlockedStatusChanged(network: Network, blocked: Boolean) {
|
||||
super.onBlockedStatusChanged(network, blocked)
|
||||
Log.d(TAG, "ConnectivityManager.NetworkCallback onBlockedStatusChanged()")
|
||||
Log.d(TAG, "ConnectivityManager.NetworkCallback onBlockedStatusChanged($network, $blocked)")
|
||||
onNetworkLost { blocked }
|
||||
}
|
||||
|
||||
override fun onAvailable(network: Network) {
|
||||
super.onAvailable(network)
|
||||
Log.d(TAG, "ConnectivityManager.NetworkCallback onAvailable()")
|
||||
Log.d(TAG, "ConnectivityManager.NetworkCallback onAvailable($network)")
|
||||
onNetworkLost { false }
|
||||
}
|
||||
|
||||
override fun onLost(network: Network) {
|
||||
super.onLost(network)
|
||||
Log.d(TAG, "ConnectivityManager.NetworkCallback onLost()")
|
||||
Log.d(TAG, "ConnectivityManager.NetworkCallback onLost($network)")
|
||||
onNetworkLost { true }
|
||||
}
|
||||
|
||||
override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
|
||||
super.onLinkPropertiesChanged(network, linkProperties)
|
||||
Log.d(TAG, "ConnectivityManager.NetworkCallback onLinkPropertiesChanged()")
|
||||
Log.d(TAG, "ConnectivityManager.NetworkCallback onLinkPropertiesChanged($network)")
|
||||
onProxySettingsChanged(linkProperties.httpProxy)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user