diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.kt index 3efd305c1a..15f9eea32b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.kt @@ -155,11 +155,11 @@ class IncomingMessageObserver( AppForegroundObserver.addListener(object : AppForegroundObserver.Listener { override fun onForeground() { - onAppForegrounded() + SignalExecutors.BOUNDED.execute { onAppForegrounded() } } override fun onBackground() { - onAppBackgrounded() + SignalExecutors.BOUNDED.execute { onAppBackgrounded() } } }) @@ -177,8 +177,10 @@ class IncomingMessageObserver( } authWebSocket.addKeepAliveChangeListener { - lock.withLock { - connectionNecessarySemaphore.release() + SignalExecutors.BOUNDED.execute { + lock.withLock { + connectionNecessarySemaphore.release() + } } } } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/websocket/SignalWebSocket.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/websocket/SignalWebSocket.kt index 2807c16c9f..f59de0eb3d 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/websocket/SignalWebSocket.kt +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/websocket/SignalWebSocket.kt @@ -56,7 +56,7 @@ sealed class SignalWebSocket( private val _state: BehaviorSubject = BehaviorSubject.createDefault(WebSocketConnectionState.DISCONNECTED) protected var disposable: CompositeDisposable = CompositeDisposable() - private val keepAliveTokens: MutableSet = mutableSetOf() + private val keepAliveTokens: MutableSet = CopyOnWriteArraySet() private val keepAliveChangeListeners: MutableSet = CopyOnWriteArraySet() private var delayedDisconnectThread: DelayedDisconnectThread? = null @@ -100,29 +100,29 @@ sealed class SignalWebSocket( } } - @Synchronized fun shouldSendKeepAlives(): Boolean { return keepAliveTokens.isNotEmpty() } - @Synchronized fun registerKeepAliveToken(token: String) { - delayedDisconnectThread?.abort() - delayedDisconnectThread = null - val changed = keepAliveTokens.add(token) if (changed) { Log.v(TAG, "$connectionName Adding keepAliveToken: $token, current: $keepAliveTokens") } - if (canConnect.canConnect()) { - try { - connect() - } catch (e: WebSocketUnavailableException) { - Log.w(TAG, "$connectionName Keep alive requested, but connection not available", e) + synchronized(this) { + delayedDisconnectThread?.abort() + delayedDisconnectThread = null + + if (canConnect.canConnect()) { + try { + connect() + } catch (e: WebSocketUnavailableException) { + Log.w(TAG, "$connectionName Keep alive requested, but connection not available", e) + } + } else { + Log.w(TAG, "$connectionName Keep alive requested, but connection not available") } - } else { - Log.w(TAG, "$connectionName Keep alive requested, but connection not available") } if (changed) { @@ -130,13 +130,15 @@ sealed class SignalWebSocket( } } - @Synchronized fun removeKeepAliveToken(token: String) { if (keepAliveTokens.remove(token)) { Log.v(TAG, "$connectionName Removing keepAliveToken: $token, remaining: $keepAliveTokens") - startDelayedDisconnectIfNecessary() - keepAliveChangeListeners.forEach { it() } + synchronized(this) { + startDelayedDisconnectIfNecessary() + } } + + keepAliveChangeListeners.forEach { it() } } fun addKeepAliveChangeListener(listener: Listener) {