desktop, android: pass remote host to API from the loaded objects, to prevent race conditions (#3397)

* desktop, android: pass remote host explicitely to API calls

* use remote host ID in model updates

* add remote host to chat console

* add remote host to notifications functions
This commit is contained in:
Evgeny Poberezkin
2023-11-20 10:20:10 +00:00
committed by GitHub
parent 68cbc605be
commit 5b7de8f8c1
60 changed files with 853 additions and 776 deletions
@@ -50,22 +50,23 @@ actual fun ActiveCallView() {
val call = chatModel.activeCall.value
if (call != null) {
Log.d(TAG, "has active call $call")
val callRh = call.remoteHostId
when (val r = apiMsg.resp) {
is WCallResponse.Capabilities -> withBGApi {
val callType = CallType(call.localMedia, r.capabilities)
chatModel.controller.apiSendCallInvitation(call.contact, callType)
chatModel.controller.apiSendCallInvitation(callRh, call.contact, callType)
chatModel.activeCall.value = call.copy(callState = CallState.InvitationSent, localCapabilities = r.capabilities)
}
is WCallResponse.Offer -> withBGApi {
chatModel.controller.apiSendCallOffer(call.contact, r.offer, r.iceCandidates, call.localMedia, r.capabilities)
chatModel.controller.apiSendCallOffer(callRh, call.contact, r.offer, r.iceCandidates, call.localMedia, r.capabilities)
chatModel.activeCall.value = call.copy(callState = CallState.OfferSent, localCapabilities = r.capabilities)
}
is WCallResponse.Answer -> withBGApi {
chatModel.controller.apiSendCallAnswer(call.contact, r.answer, r.iceCandidates)
chatModel.controller.apiSendCallAnswer(callRh, call.contact, r.answer, r.iceCandidates)
chatModel.activeCall.value = call.copy(callState = CallState.Negotiated)
}
is WCallResponse.Ice -> withBGApi {
chatModel.controller.apiSendCallExtraInfo(call.contact, r.iceCandidates)
chatModel.controller.apiSendCallExtraInfo(callRh, call.contact, r.iceCandidates)
}
is WCallResponse.Connection ->
try {
@@ -73,7 +74,7 @@ actual fun ActiveCallView() {
if (callStatus == WebRTCCallStatus.Connected) {
chatModel.activeCall.value = call.copy(callState = CallState.Connected, connectedAt = Clock.System.now())
}
withBGApi { chatModel.controller.apiCallStatus(call.contact, callStatus) }
withBGApi { chatModel.controller.apiCallStatus(callRh, call.contact, callStatus) }
} catch (e: Error) {
Log.d(TAG, "call status ${r.state.connectionState} not used")
}
@@ -44,7 +44,7 @@ actual fun DesktopActiveCallOverlayLayout(newChatSheetState: MutableStateFlow<An
val chat = chatModel.getChat(call.contact.id)
if (chat != null) {
withApi {
openChat(chat.chatInfo, chatModel)
openChat(chat.remoteHostId, chat.chatInfo, chatModel)
}
}
},
@@ -4,6 +4,7 @@ import androidx.compose.runtime.*
import chat.simplex.common.model.ChatModel
@Composable
actual fun ConnectViaLinkView(m: ChatModel, close: () -> Unit) {
PasteToConnectView(m, close)
actual fun ConnectViaLinkView(m: ChatModel, rhId: Long?, close: () -> Unit) {
// TODO this should close if remote host changes in model
PasteToConnectView(m, rhId, close)
}
@@ -4,9 +4,10 @@ import androidx.compose.runtime.Composable
import chat.simplex.common.model.ChatModel
@Composable
actual fun ScanToConnectView(chatModel: ChatModel, close: () -> Unit) {
actual fun ScanToConnectView(chatModel: ChatModel, rhId: Long?, close: () -> Unit) {
ConnectContactLayout(
chatModel = chatModel,
rhId = rhId,
incognitoPref = chatModel.controller.appPrefs.incognito,
close = close
)
@@ -4,6 +4,6 @@ import androidx.compose.runtime.Composable
import chat.simplex.common.model.ServerCfg
@Composable
actual fun ScanProtocolServer(onNext: (ServerCfg) -> Unit) {
ScanProtocolServerLayout(onNext)
actual fun ScanProtocolServer(rhId: Long?, onNext: (ServerCfg) -> Unit) {
ScanProtocolServerLayout(rhId, onNext)
}