From 935d5bfdd63afdfaf80d7c8dae147d12c9a6e676 Mon Sep 17 00:00:00 2001 From: JRoberts <8711996+jr-simplex@users.noreply.github.com> Date: Tue, 5 Jul 2022 15:25:29 +0400 Subject: [PATCH] android: use RcvCallInvitation type in CallInvitation event (#778) --- .../main/java/chat/simplex/app/model/ChatModel.kt | 4 ++-- .../main/java/chat/simplex/app/model/NtfManager.kt | 4 ++-- .../main/java/chat/simplex/app/model/SimpleXAPI.kt | 10 ++++------ .../chat/simplex/app/views/call/CallManager.kt | 14 +++++++------- .../simplex/app/views/call/IncomingCallActivity.kt | 8 ++++---- .../app/views/call/IncomingCallAlertView.kt | 12 ++++++------ .../java/chat/simplex/app/views/call/WebRTC.kt | 6 +++--- 7 files changed, 28 insertions(+), 30 deletions(-) diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt b/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt index 8f27073ca4..25276fc6bf 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/ChatModel.kt @@ -45,8 +45,8 @@ class ChatModel(val controller: ChatController) { // current WebRTC call val callManager = CallManager(this) - val callInvitations = mutableStateMapOf() - val activeCallInvitation = mutableStateOf(null) + val callInvitations = mutableStateMapOf() + val activeCallInvitation = mutableStateOf(null) val activeCall = mutableStateOf(null) val callCommand = mutableStateOf(null) val showCallView = mutableStateOf(false) diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/NtfManager.kt b/apps/android/app/src/main/java/chat/simplex/app/model/NtfManager.kt index dc9ebe5127..c64b1c8d24 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/NtfManager.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/NtfManager.kt @@ -102,7 +102,7 @@ class NtfManager(val context: Context, private val appPreferences: AppPreference } } - fun notifyCallInvitation(invitation: CallInvitation) { + fun notifyCallInvitation(invitation: RcvCallInvitation) { if (isAppOnForeground(context)) return val contactId = invitation.contact.id Log.d(TAG, "notifyCallInvitation $contactId") @@ -124,7 +124,7 @@ class NtfManager(val context: Context, private val appPreferences: AppPreference .setSound(soundUri) } val text = generalGetString( - if (invitation.peerMedia == CallMediaType.Video) { + if (invitation.callType.media == CallMediaType.Video) { if (invitation.sharedKey == null) R.string.video_call_no_encryption else R.string.encrypted_video_call } else { if (invitation.sharedKey == null) R.string.audio_call_no_encryption else R.string.encrypted_audio_call diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt b/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt index f1f66fbeba..10e40f30da 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/SimpleXAPI.kt @@ -566,10 +566,8 @@ open class ChatController(private val ctrl: ChatCtrl, val ntfManager: NtfManager removeFile(appContext, fileName) } } - is CR.CallInvitation -> { - val invitation = CallInvitation(r.contact, r.callType.media, r.sharedKey, r.callTs) - chatModel.callManager.reportNewIncomingCall(invitation) - } + is CR.CallInvitation -> + chatModel.callManager.reportNewIncomingCall(r.callInvitation) is CR.CallOffer -> { // TODO askConfirmation? // TODO check encryption is compatible @@ -1022,7 +1020,7 @@ sealed class CR { @Serializable @SerialName("sndFileCancelled") class SndFileCancelled(val chatItem: AChatItem, val sndFileTransfer: SndFileTransfer): CR() @Serializable @SerialName("sndFileRcvCancelled") class SndFileRcvCancelled(val chatItem: AChatItem, val sndFileTransfer: SndFileTransfer): CR() @Serializable @SerialName("sndGroupFileCancelled") class SndGroupFileCancelled(val chatItem: AChatItem, val fileTransferMeta: FileTransferMeta, val sndFileTransfers: List): CR() - @Serializable @SerialName("callInvitation") class CallInvitation(val contact: Contact, val callType: CallType, val sharedKey: String? = null, val callTs: Instant): CR() + @Serializable @SerialName("callInvitation") class CallInvitation(val callInvitation: RcvCallInvitation): CR() @Serializable @SerialName("callOffer") class CallOffer(val contact: Contact, val callType: CallType, val offer: WebRTCSession, val sharedKey: String? = null, val askConfirmation: Boolean): CR() @Serializable @SerialName("callAnswer") class CallAnswer(val contact: Contact, val answer: WebRTCSession): CR() @Serializable @SerialName("callExtraInfo") class CallExtraInfo(val contact: Contact, val extraInfo: WebRTCExtraInfo): CR() @@ -1139,7 +1137,7 @@ sealed class CR { is SndFileRcvCancelled -> json.encodeToString(chatItem) is SndFileStart -> json.encodeToString(chatItem) is SndGroupFileCancelled -> json.encodeToString(chatItem) - is CallInvitation -> "contact: ${contact.id}\ncallType: $callType\nsharedKey: ${sharedKey ?: ""}" + is CallInvitation -> "contact: ${callInvitation.contact.id}\ncallType: $callInvitation.callType\nsharedKey: ${callInvitation.sharedKey ?: ""}" is CallOffer -> "contact: ${contact.id}\ncallType: $callType\nsharedKey: ${sharedKey ?: ""}\naskConfirmation: $askConfirmation\noffer: ${json.encodeToString(offer)}" is CallAnswer -> "contact: ${contact.id}\nanswer: ${json.encodeToString(answer)}" is CallExtraInfo -> "contact: ${contact.id}\nextraInfo: ${json.encodeToString(extraInfo)}" diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/call/CallManager.kt b/apps/android/app/src/main/java/chat/simplex/app/views/call/CallManager.kt index 78f60ab1e8..226bb708fe 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/call/CallManager.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/call/CallManager.kt @@ -9,7 +9,7 @@ import kotlinx.datetime.Clock import kotlin.time.Duration.Companion.minutes class CallManager(val chatModel: ChatModel) { - fun reportNewIncomingCall(invitation: CallInvitation) { + fun reportNewIncomingCall(invitation: RcvCallInvitation) { Log.d(TAG, "CallManager.reportNewIncomingCall") with (chatModel) { callInvitations[invitation.contact.id] = invitation @@ -24,7 +24,7 @@ class CallManager(val chatModel: ChatModel) { } } - fun acceptIncomingCall(invitation: CallInvitation) { + fun acceptIncomingCall(invitation: RcvCallInvitation) { ModalManager.shared.closeModals() val call = chatModel.activeCall.value if (call == null) { @@ -42,17 +42,17 @@ class CallManager(val chatModel: ChatModel) { } } - private fun justAcceptIncomingCall(invitation: CallInvitation) { + private fun justAcceptIncomingCall(invitation: RcvCallInvitation) { with (chatModel) { activeCall.value = Call( contact = invitation.contact, callState = CallState.InvitationAccepted, - localMedia = invitation.peerMedia, + localMedia = invitation.callType.media, sharedKey = invitation.sharedKey ) showCallView.value = true val useRelay = controller.appPrefs.webrtcPolicyRelay.get() - callCommand.value = WCallCommand.Start (media = invitation.peerMedia, aesKey = invitation.sharedKey, relay = useRelay) + callCommand.value = WCallCommand.Start (media = invitation.callType.media, aesKey = invitation.sharedKey, relay = useRelay) callInvitations.remove(invitation.contact.id) if (invitation.contact.id == activeCallInvitation.value?.contact?.id) { activeCallInvitation.value = null @@ -77,7 +77,7 @@ class CallManager(val chatModel: ChatModel) { } } - fun endCall(invitation: CallInvitation) { + fun endCall(invitation: RcvCallInvitation) { with (chatModel) { callInvitations.remove(invitation.contact.id) if (invitation.contact.id == activeCallInvitation.value?.contact?.id) { @@ -92,7 +92,7 @@ class CallManager(val chatModel: ChatModel) { } } - fun reportCallRemoteEnded(invitation: CallInvitation) { + fun reportCallRemoteEnded(invitation: RcvCallInvitation) { if (chatModel.activeCallInvitation.value?.contact?.id == invitation.contact.id) { chatModel.activeCallInvitation.value = null chatModel.controller.ntfManager.cancelCallNotification() diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/call/IncomingCallActivity.kt b/apps/android/app/src/main/java/chat/simplex/app/views/call/IncomingCallActivity.kt index ff1b424f34..283b6be684 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/call/IncomingCallActivity.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/call/IncomingCallActivity.kt @@ -112,7 +112,7 @@ fun IncomingCallActivityView(m: ChatModel, activity: IncomingCallActivity) { } @Composable -fun IncomingCallLockScreenAlert(invitation: CallInvitation, chatModel: ChatModel, activity: IncomingCallActivity) { +fun IncomingCallLockScreenAlert(invitation: RcvCallInvitation, chatModel: ChatModel, activity: IncomingCallActivity) { val cm = chatModel.callManager val cxt = LocalContext.current val scope = rememberCoroutineScope() @@ -141,7 +141,7 @@ fun IncomingCallLockScreenAlert(invitation: CallInvitation, chatModel: ChatModel @Composable fun IncomingCallLockScreenAlertLayout( - invitation: CallInvitation, + invitation: RcvCallInvitation, callOnLockScreen: CallOnLockScreen?, rejectCall: () -> Unit, ignoreCall: () -> Unit, @@ -210,9 +210,9 @@ fun PreviewIncomingCallLockScreenAlert() { .background(MaterialTheme.colors.background) .fillMaxSize()) { IncomingCallLockScreenAlertLayout( - invitation = CallInvitation( + invitation = RcvCallInvitation( contact = Contact.sampleData, - peerMedia = CallMediaType.Audio, + callType = CallType(media = CallMediaType.Audio, capabilities = CallCapabilities(encryption = false)), sharedKey = null, callTs = Clock.System.now() ), diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/call/IncomingCallAlertView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/call/IncomingCallAlertView.kt index c0960220cf..631649211c 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/call/IncomingCallAlertView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/call/IncomingCallAlertView.kt @@ -24,7 +24,7 @@ import chat.simplex.app.views.usersettings.ProfilePreview import kotlinx.datetime.Clock @Composable -fun IncomingCallAlertView(invitation: CallInvitation, chatModel: ChatModel) { +fun IncomingCallAlertView(invitation: RcvCallInvitation, chatModel: ChatModel) { val cm = chatModel.callManager val cxt = LocalContext.current val scope = rememberCoroutineScope() @@ -40,7 +40,7 @@ fun IncomingCallAlertView(invitation: CallInvitation, chatModel: ChatModel) { @Composable fun IncomingCallAlertLayout( - invitation: CallInvitation, + invitation: RcvCallInvitation, rejectCall: () -> Unit, ignoreCall: () -> Unit, acceptCall: () -> Unit @@ -60,10 +60,10 @@ fun IncomingCallAlertLayout( } @Composable -fun IncomingCallInfo(invitation: CallInvitation) { +fun IncomingCallInfo(invitation: RcvCallInvitation) { @Composable fun CallIcon(icon: ImageVector, descr: String) = Icon(icon, descr, tint = SimplexGreen) Row { - if (invitation.peerMedia == CallMediaType.Video) CallIcon(Icons.Filled.Videocam, stringResource(R.string.icon_descr_video_call)) + if (invitation.callType.media == CallMediaType.Video) CallIcon(Icons.Filled.Videocam, stringResource(R.string.icon_descr_video_call)) else CallIcon(Icons.Filled.Phone, stringResource(R.string.icon_descr_audio_call)) Spacer(Modifier.width(4.dp)) Text(invitation.callTypeText) @@ -94,9 +94,9 @@ private fun CallButton(text: String, icon: ImageVector, color: Color, action: () fun PreviewIncomingCallAlertLayout() { SimpleXTheme { IncomingCallAlertLayout( - invitation = CallInvitation( + invitation = RcvCallInvitation( contact = Contact.sampleData, - peerMedia = CallMediaType.Audio, + callType = CallType(media = CallMediaType.Audio, capabilities = CallCapabilities(encryption = false)), sharedKey = null, callTs = Clock.System.now() ), diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/call/WebRTC.kt b/apps/android/app/src/main/java/chat/simplex/app/views/call/WebRTC.kt index 2c8919f3b8..afef4ca823 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/call/WebRTC.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/call/WebRTC.kt @@ -90,12 +90,12 @@ sealed class WCallResponse { @Serializable class WebRTCSession(val rtcSession: String, val rtcIceCandidates: String) @Serializable class WebRTCExtraInfo(val rtcIceCandidates: String) @Serializable class CallType(val media: CallMediaType, val capabilities: CallCapabilities) -@Serializable class CallInvitation(val contact: Contact, val peerMedia: CallMediaType, val sharedKey: String?, val callTs: Instant) { - val callTypeText: String get() = generalGetString(when(peerMedia) { +@Serializable class RcvCallInvitation(val contact: Contact, val callType: CallType, val sharedKey: String?, val callTs: Instant) { + val callTypeText: String get() = generalGetString(when(callType.media) { CallMediaType.Video -> if (sharedKey == null) R.string.video_call_no_encryption else R.string.encrypted_video_call CallMediaType.Audio -> if (sharedKey == null) R.string.audio_call_no_encryption else R.string.encrypted_audio_call }) - val callTitle: String get() = generalGetString(when(peerMedia) { + val callTitle: String get() = generalGetString(when(callType.media) { CallMediaType.Video -> R.string.incoming_video_call CallMediaType.Audio -> R.string.incoming_audio_call })