From 29c187c6a04edc017958fbafb12d1507fe5e97a5 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 9 Nov 2021 17:25:25 +1100 Subject: [PATCH] add a notification on incoming call + an audio playing --- fixtures/ringing.mp3 | Bin 0 -> 31426 bytes ts/models/conversation.ts | 30 +++++++++++++++++++++++++++++ ts/session/utils/CallManager.ts | 20 +++++++++++++++++-- ts/session/utils/RingingManager.ts | 29 ++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 fixtures/ringing.mp3 create mode 100644 ts/session/utils/RingingManager.ts diff --git a/fixtures/ringing.mp3 b/fixtures/ringing.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..acc7fc274018610b973f355a3b6958ba0ab82b08 GIT binary patch literal 31426 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 literal 0 HcmV?d00001 diff --git a/ts/models/conversation.ts b/ts/models/conversation.ts index 6cf622e35..d7fc0d8cf 100644 --- a/ts/models/conversation.ts +++ b/ts/models/conversation.ts @@ -1529,6 +1529,36 @@ export class ConversationModel extends Backbone.Model { }); } + public async notifyIncomingCall() { + if (!this.isPrivate()) { + window?.log?.info('notifyIncomingCall: not a private convo', this.idForLogging()); + return; + } + const conversationId = this.id; + + // make sure the notifications are not muted for this convo (and not the source convo) + const convNotif = this.get('triggerNotificationsFor'); + if (convNotif === 'disabled') { + window?.log?.info( + 'notifyIncomingCall: notifications disabled for convo', + this.idForLogging() + ); + return; + } + + const now = Date.now(); + const iconUrl = await this.getNotificationIcon(); + + window.Whisper.Notifications.add({ + conversationId, + iconUrl, + isExpiringMessage: false, + message: window.i18n('incomingCallFrom', this.getTitle()), + messageSentAt: now, + title: this.getTitle(), + }); + } + public async notifyTyping({ isTyping, sender }: any) { // We don't do anything with typing messages from our other devices if (UserUtils.isUsFromCache(sender)) { diff --git a/ts/session/utils/CallManager.ts b/ts/session/utils/CallManager.ts index cf45136a8..683314471 100644 --- a/ts/session/utils/CallManager.ts +++ b/ts/session/utils/CallManager.ts @@ -22,6 +22,8 @@ import { PubKey } from '../types'; import { v4 as uuidv4 } from 'uuid'; import { PnServer } from '../../pushnotification'; +// import { SoundMeter } from '../../../ts/components/session/calling/SoundMeter'; +import { setIsRinging } from './RingingManager'; export type InputItem = { deviceId: string; label: string }; @@ -385,9 +387,10 @@ export async function USER_callRecipient(recipient: string) { window.log.info('Sending preOffer message to ', ed25519Str(recipient)); const rawMessage = await MessageUtils.toRawMessage(PubKey.cast(recipient), preOfferMsg); const { wrappedEnvelope } = await MessageSender.send(rawMessage); - await PnServer.notifyPnServer(wrappedEnvelope, recipient); + void PnServer.notifyPnServer(wrappedEnvelope, recipient); await openMediaDevicesAndAddTracks(); + setIsRinging(true); } const iceCandidates: Array = new Array(); @@ -593,6 +596,7 @@ function createOrGetPeerConnection(withPubkey: string, createDataChannel: boolea // tslint:disable-next-line: function-name export async function USER_acceptIncomingCallRequest(fromSender: string) { window.log.info('USER_acceptIncomingCallRequest'); + setIsRinging(false); if (currentCallUUID) { window.log.warn( 'Looks like we are already in a call as in USER_acceptIncomingCallRequest is not undefined' @@ -658,6 +662,7 @@ export async function USER_acceptIncomingCallRequest(fromSender: string) { // tslint:disable-next-line: function-name export async function USER_rejectIncomingCallRequest(fromSender: string) { + setIsRinging(false); const endCallMessage = new CallMessage({ type: SignalService.CallMessage.Type.END_CALL, timestamp: Date.now(), @@ -819,6 +824,16 @@ export async function handleCallTypeOffer( } window.inboxStore?.dispatch(incomingCall({ pubkey: sender })); + // show a notification + const callerConvo = getConversationController().get(sender); + const convNotif = callerConvo?.get('triggerNotificationsFor') || 'disabled'; + if (convNotif === 'disabled') { + window?.log?.info('notifications disabled for convo', ed25519Str(sender)); + } else if (callerConvo) { + await callerConvo.notifyIncomingCall(); + } + setIsRinging(true); + pushCallMessageToCallCache(sender, remoteCallUUID, callMessage); } catch (err) { window.log?.error(`Error handling offer message ${err}`); @@ -831,7 +846,7 @@ export async function handleMissedCall( isBecauseOfCallPermission: boolean ) { const incomingCallConversation = await getConversationById(sender); - + setIsRinging(false); if (!isBecauseOfCallPermission) { ToastUtils.pushedMissedCall( incomingCallConversation?.getNickname() || @@ -857,6 +872,7 @@ export async function handleMissedCall( unread: 1, }); incomingCallConversation?.updateLastMessage(); + return; } diff --git a/ts/session/utils/RingingManager.ts b/ts/session/utils/RingingManager.ts new file mode 100644 index 000000000..5e9d88f61 --- /dev/null +++ b/ts/session/utils/RingingManager.ts @@ -0,0 +1,29 @@ +const sound = './fixtures/ringing.mp3'; + +let currentlyRinging = false; + +let ringingAudio: HTMLAudioElement | undefined; + +function stopRinging() { + if (ringingAudio) { + ringingAudio.pause(); + } +} + +function startRinging() { + if (!ringingAudio) { + ringingAudio = new Audio(sound); + ringingAudio.loop = true; + } + void ringingAudio.play(); +} + +export function setIsRinging(isRinging: boolean) { + if (!currentlyRinging && isRinging) { + startRinging(); + currentlyRinging = true; + } else if (currentlyRinging && !isRinging) { + stopRinging(); + currentlyRinging = false; + } +}