@@ -70,8 +70,6 @@ class VoipNotification(private val context: Context) {
7070 private const val CALLKEEP_CONNECTION_SERVICE_CLASS = " io.wazo.callkeep.VoiceConnectionService"
7171 private const val DISCONNECT_REASON_MISSED = 6
7272
73- private data class VoipMediaCallIdentity (val userId : String , val deviceId : String )
74-
7573 /* * Keep in sync with MediaSessionStore features (audio-only today). */
7674 private val SUPPORTED_VOIP_FEATURES = JSONArray ().apply { put(" audio" ) }
7775 private val timeoutHandler = Handler (Looper .getMainLooper())
@@ -253,7 +251,7 @@ class VoipNotification(private val context: Context) {
253251 answerIncomingCall(payload.callId)
254252 VoipModule .storeInitialEvents(payload)
255253 } else {
256- Log .d(TAG , " Native accept did not succeed over DDP for ${payload.callId} ; opening app for JS recovery" )
254+ Log .d(TAG , " Native accept did not succeed for ${payload.callId} ; opening app for JS recovery" )
257255 disconnectIncomingCall(payload.callId, false )
258256 VoipModule .storeAcceptFailureForJs(payload)
259257 }
@@ -345,146 +343,6 @@ class VoipNotification(private val context: Context) {
345343 }
346344 }
347345
348- private fun sendRejectSignal (context : Context , payload : VoipPayload ) {
349- val client = ddpRegistry.clientFor(payload.callId)
350- if (client == null ) {
351- Log .d(TAG , " Native DDP client unavailable, cannot send reject for ${payload.callId} " )
352- return
353- }
354-
355- val params = buildRejectSignalParams(context, payload) ? : return
356-
357- client.callMethod(" stream-notify-user" , params) { success ->
358- Log .d(TAG , " Native reject signal result for ${payload.callId} : $success " )
359- ddpRegistry.stopClient(payload.callId)
360- }
361- }
362-
363- private fun queueRejectSignal (context : Context , payload : VoipPayload ) {
364- val client = ddpRegistry.clientFor(payload.callId)
365- if (client == null ) {
366- Log .d(TAG , " Native DDP client unavailable, cannot queue reject for ${payload.callId} " )
367- return
368- }
369-
370- val params = buildRejectSignalParams(context, payload) ? : return
371-
372- client.queueMethodCall(" stream-notify-user" , params) { success ->
373- Log .d(TAG , " Queued native reject signal result for ${payload.callId} : $success " )
374- ddpRegistry.stopClient(payload.callId)
375- }
376- Log .d(TAG , " Queued native reject signal for ${payload.callId} " )
377- }
378-
379- private fun flushPendingQueuedSignalsIfNeeded (callId : String ): Boolean {
380- val client = ddpRegistry.clientFor(callId) ? : return false
381- if (! client.hasQueuedMethodCalls()) {
382- return false
383- }
384-
385- client.flushQueuedMethodCalls()
386- return true
387- }
388-
389- private fun sendAcceptSignal (
390- context : Context ,
391- payload : VoipPayload ,
392- onComplete : (Boolean ) -> Unit
393- ) {
394- val client = ddpRegistry.clientFor(payload.callId)
395- if (client == null ) {
396- Log .d(TAG , " Native DDP client unavailable, cannot send accept for ${payload.callId} " )
397- onComplete(false )
398- return
399- }
400-
401- val params = buildAcceptSignalParams(context, payload) ? : run {
402- onComplete(false )
403- return
404- }
405-
406- client.callMethod(" stream-notify-user" , params) { success ->
407- Log .d(TAG , " Native accept signal result for ${payload.callId} : $success " )
408- onComplete(success)
409- }
410- }
411-
412- private fun queueAcceptSignal (
413- context : Context ,
414- payload : VoipPayload ,
415- onComplete : (Boolean ) -> Unit
416- ) {
417- val client = ddpRegistry.clientFor(payload.callId)
418- if (client == null ) {
419- Log .d(TAG , " Native DDP client unavailable, cannot queue accept for ${payload.callId} " )
420- onComplete(false )
421- return
422- }
423-
424- val params = buildAcceptSignalParams(context, payload) ? : run {
425- onComplete(false )
426- return
427- }
428-
429- client.queueMethodCall(" stream-notify-user" , params) { success ->
430- Log .d(TAG , " Queued native accept signal result for ${payload.callId} : $success " )
431- onComplete(success)
432- }
433- Log .d(TAG , " Queued native accept signal for ${payload.callId} " )
434- }
435-
436- /* *
437- * Resolves user id for this host and Android [Settings.Secure.ANDROID_ID] as media-signaling contractId.
438- * Must match JS `getUniqueIdSync()` from react-native-device-info (iOS native code uses `DeviceUID`).
439- */
440- private fun resolveVoipMediaCallIdentity (context : Context , payload : VoipPayload ): VoipMediaCallIdentity ? {
441- val ejson = Ejson ().apply {
442- host = payload.host
443- }
444- val userId = ejson.userId()
445- if (userId.isNullOrEmpty()) {
446- Log .d(TAG , " Missing userId, cannot build stream-notify-user params for ${payload.callId} " )
447- ddpRegistry.stopClient(payload.callId)
448- return null
449- }
450- val deviceId = Settings .Secure .getString(context.contentResolver, Settings .Secure .ANDROID_ID )
451- if (deviceId.isNullOrEmpty()) {
452- Log .d(TAG , " Missing deviceId, cannot build stream-notify-user params for ${payload.callId} " )
453- ddpRegistry.stopClient(payload.callId)
454- return null
455- }
456- return VoipMediaCallIdentity (userId, deviceId)
457- }
458-
459- private fun buildAcceptSignalParams (context : Context , payload : VoipPayload ): JSONArray ? {
460- val ids = resolveVoipMediaCallIdentity(context, payload) ? : return null
461- val signal = JSONObject ().apply {
462- put(" callId" , payload.callId)
463- put(" contractId" , ids.deviceId)
464- put(" type" , " answer" )
465- put(" answer" , " accept" )
466- put(" supportedFeatures" , SUPPORTED_VOIP_FEATURES )
467- }
468- return JSONArray ().apply {
469- put(" ${ids.userId} /media-calls" )
470- put(signal.toString())
471- }
472- }
473-
474- private fun buildRejectSignalParams (context : Context , payload : VoipPayload ): JSONArray ? {
475- val ids = resolveVoipMediaCallIdentity(context, payload) ? : return null
476- val signal = JSONObject ().apply {
477- put(" callId" , payload.callId)
478- put(" contractId" , ids.deviceId)
479- put(" type" , " answer" )
480- put(" answer" , " reject" )
481- }
482- return JSONArray ().apply {
483- put(" ${ids.userId} /media-calls" )
484- put(signal.toString())
485- }
486- }
487-
488346 /* *
489347 * True when the user is already in a call: this app's Telecom connections (ringing, dialing,
490348 * active, hold — same idea as iOS CXCallObserver "any non-ended"), any system in-call state
@@ -534,6 +392,16 @@ class VoipNotification(private val context: Context) {
534392 return false
535393 }
536394
395+ private fun flushPendingQueuedSignalsIfNeeded (callId : String ): Boolean {
396+ val client = ddpRegistry.clientFor(callId) ? : return false
397+ if (! client.hasQueuedMethodCalls()) {
398+ return false
399+ }
400+
401+ client.flushQueuedMethodCalls()
402+ return true
403+ }
404+
537405 /* *
538406 * Rejects an incoming call because the user is already on another call.
539407 *
0 commit comments