Merge pull request #4448 from nextcloud/bugfix/noid/fixWebsocketConnectionForChat

Bugfix/noid/fix websocket connection for chat
This commit is contained in:
Marcel Hibbe 2024-11-14 15:54:53 +01:00 committed by GitHub
commit 89964c0725
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 65 additions and 55 deletions

View File

@ -184,7 +184,9 @@ import com.stfalcon.chatkit.messages.MessageHolders.ContentChecker
import com.stfalcon.chatkit.messages.MessagesListAdapter import com.stfalcon.chatkit.messages.MessagesListAdapter
import com.stfalcon.chatkit.utils.DateFormatter import com.stfalcon.chatkit.utils.DateFormatter
import io.reactivex.Observer import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@ -702,14 +704,8 @@ class ChatActivity :
logConversationInfos("joinRoomWithPassword#onNext") logConversationInfos("joinRoomWithPassword#onNext")
setupWebsocket() setupWebsocket()
if (webSocketInstance != null) {
webSocketInstance?.joinRoomWithRoomTokenAndSession( if (startCallFromNotification) {
roomToken,
sessionIdAfterRoomJoined,
externalSignalingServer?.federation
)
}
if (startCallFromNotification != null && startCallFromNotification) {
startCallFromNotification = false startCallFromNotification = false
startACall(voiceOnly, false) startACall(voiceOnly, false)
} }
@ -2452,7 +2448,7 @@ class ChatActivity :
currentlyPlayedVoiceMessage?.let { stopMediaPlayer(it) } // FIXME, mediaplayer can sometimes be null here currentlyPlayedVoiceMessage?.let { stopMediaPlayer(it) } // FIXME, mediaplayer can sometimes be null here
adapter = null adapter = null
Log.d(TAG, "inConversation was set to false!") disposables.dispose()
} }
private fun joinRoomWithPassword() { private fun joinRoomWithPassword() {
@ -2477,13 +2473,6 @@ class ChatActivity :
Log.d(TAG, "sessionID was valid -> skip joinRoom") Log.d(TAG, "sessionID was valid -> skip joinRoom")
setupWebsocket() setupWebsocket()
if (webSocketInstance != null) {
webSocketInstance?.joinRoomWithRoomTokenAndSession(
roomToken,
sessionIdAfterRoomJoined,
externalSignalingServer?.federation
)
}
} }
} }
@ -2514,57 +2503,78 @@ class ChatActivity :
return return
} }
if (currentConversation!!.remoteServer != null) { if (currentConversation!!.remoteServer?.isNotEmpty() == true) {
val apiVersion = ApiUtils.getSignalingApiVersion(conversationUser!!, intArrayOf(ApiUtils.API_V3, 2, 1)) val apiVersion = ApiUtils.getSignalingApiVersion(conversationUser!!, intArrayOf(ApiUtils.API_V3, 2, 1))
ncApi.getSignalingSettings( ncApi.getSignalingSettings(
credentials, credentials,
ApiUtils.getUrlForSignalingSettings(apiVersion, conversationUser!!.baseUrl, roomToken) ApiUtils.getUrlForSignalingSettings(apiVersion, conversationUser!!.baseUrl, roomToken)
).blockingSubscribe(object : Observer<SignalingSettingsOverall> { )
override fun onSubscribe(d: Disposable) { .subscribeOn(Schedulers.io())
// unused atm ?.observeOn(AndroidSchedulers.mainThread())
} ?.subscribe(object : Observer<SignalingSettingsOverall> {
override fun onSubscribe(d: Disposable) {
override fun onNext(signalingSettingsOverall: SignalingSettingsOverall) { disposables.add(d)
if (signalingSettingsOverall.ocs!!.settings!!.externalSignalingServer == null ||
signalingSettingsOverall.ocs!!.settings!!.externalSignalingServer?.isEmpty() == true
) {
return
} }
externalSignalingServer = ExternalSignalingServer() override fun onNext(signalingSettingsOverall: SignalingSettingsOverall) {
externalSignalingServer!!.externalSignalingServer = signalingSettingsOverall.ocs!!.settings!! if (signalingSettingsOverall.ocs!!.settings!!.externalSignalingServer == null ||
.externalSignalingServer signalingSettingsOverall.ocs!!.settings!!.externalSignalingServer?.isEmpty() == true
externalSignalingServer!!.externalSignalingTicket = signalingSettingsOverall.ocs!!.settings!! ) {
.externalSignalingTicket return
externalSignalingServer!!.federation = signalingSettingsOverall.ocs!!.settings!!.federation }
webSocketInstance = WebSocketConnectionHelper.getExternalSignalingInstanceForServer( externalSignalingServer = ExternalSignalingServer()
externalSignalingServer!!.externalSignalingServer, externalSignalingServer!!.externalSignalingServer = signalingSettingsOverall.ocs!!.settings!!
conversationUser, .externalSignalingServer
externalSignalingServer!!.externalSignalingTicket, externalSignalingServer!!.externalSignalingTicket = signalingSettingsOverall.ocs!!.settings!!
TextUtils.isEmpty(credentials) .externalSignalingTicket
) externalSignalingServer!!.federation = signalingSettingsOverall.ocs!!.settings!!.federation
}
override fun onError(e: Throwable) { webSocketInstance = WebSocketConnectionHelper.getExternalSignalingInstanceForServer(
Log.e(CallActivity.TAG, e.message, e) externalSignalingServer!!.externalSignalingServer,
} conversationUser,
externalSignalingServer!!.externalSignalingTicket,
TextUtils.isEmpty(credentials)
)
override fun onComplete() { if (webSocketInstance != null) {
// unused atm webSocketInstance?.joinRoomWithRoomTokenAndSession(
} roomToken,
}) sessionIdAfterRoomJoined,
externalSignalingServer?.federation
)
}
signalingMessageSender = webSocketInstance?.signalingMessageSender
webSocketInstance?.getSignalingMessageReceiver()?.addListener(localParticipantMessageListener)
webSocketInstance?.getSignalingMessageReceiver()?.addListener(conversationMessageListener)
}
override fun onError(e: Throwable) {
Log.e(TAG, e.message, e)
}
override fun onComplete() {
// unused atm
}
})
} else { } else {
webSocketInstance = WebSocketConnectionHelper.getWebSocketInstanceForUser(conversationUser!!) webSocketInstance = WebSocketConnectionHelper.getWebSocketInstanceForUser(conversationUser!!)
}
if (webSocketInstance == null) { if (webSocketInstance != null) {
Log.d(TAG, "webSocketInstance not set up. This should only happen when not using the HPB") webSocketInstance?.joinRoomWithRoomTokenAndSession(
} roomToken,
sessionIdAfterRoomJoined,
null
)
signalingMessageSender = webSocketInstance?.signalingMessageSender signalingMessageSender = webSocketInstance?.signalingMessageSender
webSocketInstance?.getSignalingMessageReceiver()?.addListener(localParticipantMessageListener) webSocketInstance?.getSignalingMessageReceiver()?.addListener(localParticipantMessageListener)
webSocketInstance?.getSignalingMessageReceiver()?.addListener(conversationMessageListener) webSocketInstance?.getSignalingMessageReceiver()?.addListener(conversationMessageListener)
} else {
Log.d(TAG, "webSocketInstance not set up. This is only expected when not using the HPB")
}
}
} }
private fun processCallStartedMessages(chatMessageList: List<ChatMessage>) { private fun processCallStartedMessages(chatMessageList: List<ChatMessage>) {

View File

@ -391,7 +391,7 @@ class WebSocketInstance internal constructor(
roomToken == currentRoomToken && roomToken == currentRoomToken &&
normalBackendSession == currentNormalBackendSession && normalBackendSession == currentNormalBackendSession &&
federation?.roomId == currentFederation?.roomId && federation?.roomId == currentFederation?.roomId &&
federation?.nextcloudServer == federation?.nextcloudServer federation?.nextcloudServer == currentFederation?.nextcloudServer
) { ) {
Log.d(TAG, "roomToken & session are unchanged. Joining locally without to send websocket message") Log.d(TAG, "roomToken & session are unchanged. Joining locally without to send websocket message")
sendRoomJoinedEvent() sendRoomJoinedEvent()