expo-callkit-telecom 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -0
- package/android/src/main/java/expo/modules/callkittelecom/ExpoCallKitTelecomModule.kt +254 -282
- package/android/src/main/java/expo/modules/callkittelecom/IncomingCallActivity.kt +27 -34
- package/android/src/main/java/expo/modules/callkittelecom/events/CallEventEmitter.kt +21 -32
- package/android/src/main/java/expo/modules/callkittelecom/managers/CallAudioManager.kt +53 -74
- package/android/src/main/java/expo/modules/callkittelecom/managers/CallManager.kt +95 -156
- package/android/src/main/java/expo/modules/callkittelecom/managers/CallNotificationManager.kt +71 -84
- package/android/src/main/java/expo/modules/callkittelecom/managers/CaptureSessionManager.kt +1 -3
- package/android/src/main/java/expo/modules/callkittelecom/managers/DialtonePlayer.kt +6 -4
- package/android/src/main/java/expo/modules/callkittelecom/managers/FulfillRequestManager.kt +21 -21
- package/android/src/main/java/expo/modules/callkittelecom/managers/VoIPPushManager.kt +3 -5
- package/android/src/main/java/expo/modules/callkittelecom/models/CallModels.kt +28 -36
- package/android/src/main/java/expo/modules/callkittelecom/services/CallNotificationReceiver.kt +7 -8
- package/android/src/main/java/expo/modules/callkittelecom/services/ExpoCallKitTelecomMessagingService.kt +9 -16
- package/android/src/main/java/expo/modules/callkittelecom/store/CallStore.kt +32 -68
- package/android/src/main/java/expo/modules/callkittelecom/utils/CallKitTelecomLog.kt +6 -17
- package/android/src/main/java/expo/modules/callkittelecom/utils/PermissionUtils.kt +7 -7
- package/ios/Managers/CaptureSessionManager.swift +1 -1
- package/package.json +1 -1
|
@@ -5,12 +5,12 @@ import expo.modules.callkittelecom.events.CallEvents
|
|
|
5
5
|
import expo.modules.callkittelecom.managers.CallAudioManager
|
|
6
6
|
import expo.modules.callkittelecom.managers.CallManager
|
|
7
7
|
import expo.modules.callkittelecom.managers.CaptureSessionManager
|
|
8
|
-
import expo.modules.callkittelecom.services.CallNotificationReceiver
|
|
9
8
|
import expo.modules.callkittelecom.managers.VoIPPushManager
|
|
10
9
|
import expo.modules.callkittelecom.models.CallEndedReason
|
|
11
10
|
import expo.modules.callkittelecom.models.CallOptions
|
|
12
11
|
import expo.modules.callkittelecom.models.CallParticipant
|
|
13
12
|
import expo.modules.callkittelecom.models.IncomingCallEvent
|
|
13
|
+
import expo.modules.callkittelecom.services.CallNotificationReceiver
|
|
14
14
|
import expo.modules.callkittelecom.store.CallStore
|
|
15
15
|
import expo.modules.kotlin.modules.Module
|
|
16
16
|
import expo.modules.kotlin.modules.ModuleDefinition
|
|
@@ -20,9 +20,9 @@ class ExpoCallKitTelecomModule : Module() {
|
|
|
20
20
|
/**
|
|
21
21
|
* Checks the current activity's launch intent for ACTION_ANSWER.
|
|
22
22
|
*
|
|
23
|
-
* On cold start from a notification answer action, the intent is delivered
|
|
24
|
-
*
|
|
25
|
-
*
|
|
23
|
+
* On cold start from a notification answer action, the intent is delivered to onCreate() — not
|
|
24
|
+
* onNewIntent() — so OnNewIntent never fires. This method handles that case by checking the
|
|
25
|
+
* launch intent directly.
|
|
26
26
|
*/
|
|
27
27
|
private fun handleLaunchIntent() {
|
|
28
28
|
val intent = appContext.currentActivity?.intent ?: return
|
|
@@ -33,13 +33,13 @@ class ExpoCallKitTelecomModule : Module() {
|
|
|
33
33
|
private fun handleAnswerIntent(intent: android.content.Intent) {
|
|
34
34
|
if (intent.action != CallNotificationReceiver.ACTION_ANSWER) return
|
|
35
35
|
|
|
36
|
-
val callIdStr = intent.getStringExtra(CallNotificationReceiver.EXTRA_CALL_ID)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
val callIdStr = intent.getStringExtra(CallNotificationReceiver.EXTRA_CALL_ID) ?: return
|
|
37
|
+
val callId =
|
|
38
|
+
try {
|
|
39
|
+
UUID.fromString(callIdStr)
|
|
40
|
+
} catch (_: IllegalArgumentException) {
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
43
|
|
|
44
44
|
// Clear the action so it isn't re-processed on configuration changes
|
|
45
45
|
intent.action = null
|
|
@@ -47,338 +47,310 @@ class ExpoCallKitTelecomModule : Module() {
|
|
|
47
47
|
CallManager.shared.answerCall(callId)
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
override fun definition() =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
OnCreate
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
// so we must check it here.
|
|
95
|
-
handleLaunchIntent()
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
OnDestroy {
|
|
99
|
-
CallEventEmitter.setSender(null)
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
OnNewIntent { intent ->
|
|
103
|
-
handleAnswerIntent(intent)
|
|
104
|
-
}
|
|
50
|
+
override fun definition() = ModuleDefinition {
|
|
51
|
+
Name("ExpoCallKitTelecom")
|
|
52
|
+
|
|
53
|
+
// region Events
|
|
54
|
+
|
|
55
|
+
Events(
|
|
56
|
+
CallEvents.CALL_SESSION_ADDED,
|
|
57
|
+
CallEvents.CALL_SESSION_UPDATED,
|
|
58
|
+
CallEvents.CALL_SESSION_REMOVED,
|
|
59
|
+
CallEvents.AUDIO_SESSION_ACTIVATED,
|
|
60
|
+
CallEvents.AUDIO_SESSION_DEACTIVATED,
|
|
61
|
+
CallEvents.AUDIO_ROUTE_CHANGED,
|
|
62
|
+
CallEvents.INCOMING_CALL_REPORTED,
|
|
63
|
+
CallEvents.OUTGOING_CALL_STARTED,
|
|
64
|
+
CallEvents.CALL_ANSWERED,
|
|
65
|
+
CallEvents.CALL_ENDED,
|
|
66
|
+
CallEvents.CALL_REPORTED_ENDED,
|
|
67
|
+
CallEvents.SET_MUTED_ACTION,
|
|
68
|
+
CallEvents.VIDEO_CHANGED,
|
|
69
|
+
CallEvents.SET_HELD_ACTION,
|
|
70
|
+
CallEvents.DTMF,
|
|
71
|
+
CallEvents.CALL_INTENT_RECEIVED,
|
|
72
|
+
CallEvents.VOIP_PUSH_TOKEN_UPDATED,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
// endregion
|
|
76
|
+
|
|
77
|
+
// region Lifecycle
|
|
78
|
+
|
|
79
|
+
OnCreate {
|
|
80
|
+
val context = appContext.reactContext ?: return@OnCreate
|
|
81
|
+
|
|
82
|
+
CallManager.shared.initialize(context)
|
|
83
|
+
|
|
84
|
+
VoIPPushManager.register()
|
|
85
|
+
|
|
86
|
+
CallEventEmitter.setSender { eventName, body -> sendEvent(eventName, body) }
|
|
87
|
+
|
|
88
|
+
// Handle the launch intent for cold-start answer actions.
|
|
89
|
+
// OnNewIntent only fires when the activity is already running.
|
|
90
|
+
// On cold start the ACTION_ANSWER intent is the launch intent,
|
|
91
|
+
// so we must check it here.
|
|
92
|
+
handleLaunchIntent()
|
|
93
|
+
}
|
|
105
94
|
|
|
106
|
-
|
|
107
|
-
OnStartObserving(CallEvents.CALL_SESSION_ADDED) {
|
|
108
|
-
CallEventEmitter.startObserving(CallEvents.CALL_SESSION_ADDED)
|
|
109
|
-
}
|
|
110
|
-
OnStopObserving(CallEvents.CALL_SESSION_ADDED) {
|
|
111
|
-
CallEventEmitter.stopObserving(CallEvents.CALL_SESSION_ADDED)
|
|
112
|
-
}
|
|
95
|
+
OnDestroy { CallEventEmitter.setSender(null) }
|
|
113
96
|
|
|
114
|
-
|
|
115
|
-
CallEventEmitter.startObserving(CallEvents.CALL_SESSION_UPDATED)
|
|
116
|
-
}
|
|
117
|
-
OnStopObserving(CallEvents.CALL_SESSION_UPDATED) {
|
|
118
|
-
CallEventEmitter.stopObserving(CallEvents.CALL_SESSION_UPDATED)
|
|
119
|
-
}
|
|
97
|
+
OnNewIntent { intent -> handleAnswerIntent(intent) }
|
|
120
98
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
99
|
+
// Register per-event observers
|
|
100
|
+
OnStartObserving(CallEvents.CALL_SESSION_ADDED) {
|
|
101
|
+
CallEventEmitter.startObserving(CallEvents.CALL_SESSION_ADDED)
|
|
102
|
+
}
|
|
103
|
+
OnStopObserving(CallEvents.CALL_SESSION_ADDED) {
|
|
104
|
+
CallEventEmitter.stopObserving(CallEvents.CALL_SESSION_ADDED)
|
|
105
|
+
}
|
|
127
106
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
107
|
+
OnStartObserving(CallEvents.CALL_SESSION_UPDATED) {
|
|
108
|
+
CallEventEmitter.startObserving(CallEvents.CALL_SESSION_UPDATED)
|
|
109
|
+
}
|
|
110
|
+
OnStopObserving(CallEvents.CALL_SESSION_UPDATED) {
|
|
111
|
+
CallEventEmitter.stopObserving(CallEvents.CALL_SESSION_UPDATED)
|
|
112
|
+
}
|
|
134
113
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
114
|
+
OnStartObserving(CallEvents.CALL_SESSION_REMOVED) {
|
|
115
|
+
CallEventEmitter.startObserving(CallEvents.CALL_SESSION_REMOVED)
|
|
116
|
+
}
|
|
117
|
+
OnStopObserving(CallEvents.CALL_SESSION_REMOVED) {
|
|
118
|
+
CallEventEmitter.stopObserving(CallEvents.CALL_SESSION_REMOVED)
|
|
119
|
+
}
|
|
141
120
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
121
|
+
OnStartObserving(CallEvents.AUDIO_SESSION_ACTIVATED) {
|
|
122
|
+
CallEventEmitter.startObserving(CallEvents.AUDIO_SESSION_ACTIVATED)
|
|
123
|
+
}
|
|
124
|
+
OnStopObserving(CallEvents.AUDIO_SESSION_ACTIVATED) {
|
|
125
|
+
CallEventEmitter.stopObserving(CallEvents.AUDIO_SESSION_ACTIVATED)
|
|
126
|
+
}
|
|
148
127
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
128
|
+
OnStartObserving(CallEvents.AUDIO_SESSION_DEACTIVATED) {
|
|
129
|
+
CallEventEmitter.startObserving(CallEvents.AUDIO_SESSION_DEACTIVATED)
|
|
130
|
+
}
|
|
131
|
+
OnStopObserving(CallEvents.AUDIO_SESSION_DEACTIVATED) {
|
|
132
|
+
CallEventEmitter.stopObserving(CallEvents.AUDIO_SESSION_DEACTIVATED)
|
|
133
|
+
}
|
|
155
134
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
135
|
+
OnStartObserving(CallEvents.AUDIO_ROUTE_CHANGED) {
|
|
136
|
+
CallEventEmitter.startObserving(CallEvents.AUDIO_ROUTE_CHANGED)
|
|
137
|
+
}
|
|
138
|
+
OnStopObserving(CallEvents.AUDIO_ROUTE_CHANGED) {
|
|
139
|
+
CallEventEmitter.stopObserving(CallEvents.AUDIO_ROUTE_CHANGED)
|
|
140
|
+
}
|
|
162
141
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
142
|
+
OnStartObserving(CallEvents.INCOMING_CALL_REPORTED) {
|
|
143
|
+
CallEventEmitter.startObserving(CallEvents.INCOMING_CALL_REPORTED)
|
|
144
|
+
}
|
|
145
|
+
OnStopObserving(CallEvents.INCOMING_CALL_REPORTED) {
|
|
146
|
+
CallEventEmitter.stopObserving(CallEvents.INCOMING_CALL_REPORTED)
|
|
147
|
+
}
|
|
169
148
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
149
|
+
OnStartObserving(CallEvents.OUTGOING_CALL_STARTED) {
|
|
150
|
+
CallEventEmitter.startObserving(CallEvents.OUTGOING_CALL_STARTED)
|
|
151
|
+
}
|
|
152
|
+
OnStopObserving(CallEvents.OUTGOING_CALL_STARTED) {
|
|
153
|
+
CallEventEmitter.stopObserving(CallEvents.OUTGOING_CALL_STARTED)
|
|
154
|
+
}
|
|
176
155
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
156
|
+
OnStartObserving(CallEvents.CALL_ANSWERED) {
|
|
157
|
+
CallEventEmitter.startObserving(CallEvents.CALL_ANSWERED)
|
|
158
|
+
}
|
|
159
|
+
OnStopObserving(CallEvents.CALL_ANSWERED) {
|
|
160
|
+
CallEventEmitter.stopObserving(CallEvents.CALL_ANSWERED)
|
|
161
|
+
}
|
|
183
162
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
163
|
+
OnStartObserving(CallEvents.CALL_ENDED) {
|
|
164
|
+
CallEventEmitter.startObserving(CallEvents.CALL_ENDED)
|
|
165
|
+
}
|
|
166
|
+
OnStopObserving(CallEvents.CALL_ENDED) {
|
|
167
|
+
CallEventEmitter.stopObserving(CallEvents.CALL_ENDED)
|
|
168
|
+
}
|
|
190
169
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
170
|
+
OnStartObserving(CallEvents.CALL_REPORTED_ENDED) {
|
|
171
|
+
CallEventEmitter.startObserving(CallEvents.CALL_REPORTED_ENDED)
|
|
172
|
+
}
|
|
173
|
+
OnStopObserving(CallEvents.CALL_REPORTED_ENDED) {
|
|
174
|
+
CallEventEmitter.stopObserving(CallEvents.CALL_REPORTED_ENDED)
|
|
175
|
+
}
|
|
197
176
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
177
|
+
OnStartObserving(CallEvents.SET_MUTED_ACTION) {
|
|
178
|
+
CallEventEmitter.startObserving(CallEvents.SET_MUTED_ACTION)
|
|
179
|
+
}
|
|
180
|
+
OnStopObserving(CallEvents.SET_MUTED_ACTION) {
|
|
181
|
+
CallEventEmitter.stopObserving(CallEvents.SET_MUTED_ACTION)
|
|
182
|
+
}
|
|
204
183
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
184
|
+
OnStartObserving(CallEvents.VIDEO_CHANGED) {
|
|
185
|
+
CallEventEmitter.startObserving(CallEvents.VIDEO_CHANGED)
|
|
186
|
+
}
|
|
187
|
+
OnStopObserving(CallEvents.VIDEO_CHANGED) {
|
|
188
|
+
CallEventEmitter.stopObserving(CallEvents.VIDEO_CHANGED)
|
|
189
|
+
}
|
|
211
190
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
191
|
+
OnStartObserving(CallEvents.SET_HELD_ACTION) {
|
|
192
|
+
CallEventEmitter.startObserving(CallEvents.SET_HELD_ACTION)
|
|
193
|
+
}
|
|
194
|
+
OnStopObserving(CallEvents.SET_HELD_ACTION) {
|
|
195
|
+
CallEventEmitter.stopObserving(CallEvents.SET_HELD_ACTION)
|
|
196
|
+
}
|
|
218
197
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
}
|
|
222
|
-
OnStopObserving(CallEvents.VOIP_PUSH_TOKEN_UPDATED) {
|
|
223
|
-
CallEventEmitter.stopObserving(CallEvents.VOIP_PUSH_TOKEN_UPDATED)
|
|
224
|
-
}
|
|
198
|
+
OnStartObserving(CallEvents.DTMF) { CallEventEmitter.startObserving(CallEvents.DTMF) }
|
|
199
|
+
OnStopObserving(CallEvents.DTMF) { CallEventEmitter.stopObserving(CallEvents.DTMF) }
|
|
225
200
|
|
|
226
|
-
|
|
201
|
+
OnStartObserving(CallEvents.CALL_INTENT_RECEIVED) {
|
|
202
|
+
CallEventEmitter.startObserving(CallEvents.CALL_INTENT_RECEIVED)
|
|
203
|
+
}
|
|
204
|
+
OnStopObserving(CallEvents.CALL_INTENT_RECEIVED) {
|
|
205
|
+
CallEventEmitter.stopObserving(CallEvents.CALL_INTENT_RECEIVED)
|
|
206
|
+
}
|
|
227
207
|
|
|
228
|
-
|
|
208
|
+
OnStartObserving(CallEvents.VOIP_PUSH_TOKEN_UPDATED) {
|
|
209
|
+
CallEventEmitter.startObserving(CallEvents.VOIP_PUSH_TOKEN_UPDATED)
|
|
210
|
+
}
|
|
211
|
+
OnStopObserving(CallEvents.VOIP_PUSH_TOKEN_UPDATED) {
|
|
212
|
+
CallEventEmitter.stopObserving(CallEvents.VOIP_PUSH_TOKEN_UPDATED)
|
|
213
|
+
}
|
|
229
214
|
|
|
230
|
-
|
|
231
|
-
AsyncFunction("getActiveCallSession") {
|
|
232
|
-
CallStore.firstSession()?.toMap()
|
|
233
|
-
}
|
|
215
|
+
// endregion
|
|
234
216
|
|
|
235
|
-
|
|
217
|
+
// region Call Session
|
|
236
218
|
|
|
237
|
-
|
|
219
|
+
// Returns the first active call session, if present.
|
|
220
|
+
AsyncFunction("getActiveCallSession") { CallStore.firstSession()?.toMap() }
|
|
238
221
|
|
|
239
|
-
|
|
240
|
-
Function("getAudioSessionState") {
|
|
241
|
-
CallAudioManager.getAudioSessionState()
|
|
242
|
-
}
|
|
222
|
+
// endregion
|
|
243
223
|
|
|
244
|
-
|
|
245
|
-
Function("prepareAudioSessionForCall") { hasVideo: Boolean ->
|
|
246
|
-
CallAudioManager.prepareAudioSessionForCall(hasVideo)
|
|
247
|
-
}
|
|
224
|
+
// region Audio Session
|
|
248
225
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
CallAudioManager.restoreAudioSession()
|
|
252
|
-
}
|
|
226
|
+
// Returns current audio session snapshot for diagnostics/UI state.
|
|
227
|
+
Function("getAudioSessionState") { CallAudioManager.getAudioSessionState() }
|
|
253
228
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
229
|
+
// Prepares audio session state before starting/reporting a call.
|
|
230
|
+
Function("prepareAudioSessionForCall") { hasVideo: Boolean ->
|
|
231
|
+
CallAudioManager.prepareAudioSessionForCall(hasVideo)
|
|
232
|
+
}
|
|
258
233
|
|
|
259
|
-
|
|
234
|
+
// Restores pre-call audio mode/route state.
|
|
235
|
+
Function("restoreAudioSession") { CallAudioManager.restoreAudioSession() }
|
|
260
236
|
|
|
261
|
-
|
|
237
|
+
// Overrides route to speaker (true) or clears override (false).
|
|
238
|
+
Function("setAudioSessionPortOverride") { enabled: Boolean ->
|
|
239
|
+
CallAudioManager.setAudioSessionPortOverride(enabled)
|
|
240
|
+
}
|
|
262
241
|
|
|
263
|
-
|
|
264
|
-
Function("getCaptureSessionState") {
|
|
265
|
-
CaptureSessionManager.getCaptureSessionState()
|
|
266
|
-
}
|
|
242
|
+
// endregion
|
|
267
243
|
|
|
268
|
-
|
|
244
|
+
// region Capture Session
|
|
269
245
|
|
|
270
|
-
|
|
246
|
+
// Returns capture session state (currently camera permission).
|
|
247
|
+
Function("getCaptureSessionState") { CaptureSessionManager.getCaptureSessionState() }
|
|
271
248
|
|
|
272
|
-
|
|
273
|
-
AsyncFunction("startOutgoingCall") { recipient: Map<String, Any?>, options: Map<String, Any?> ->
|
|
274
|
-
val callId =
|
|
275
|
-
CallManager.shared.startOutgoingCall(
|
|
276
|
-
recipient = CallParticipant.fromMap(recipient),
|
|
277
|
-
options = CallOptions(hasVideo = options["hasVideo"] as? Boolean ?: false),
|
|
278
|
-
)
|
|
279
|
-
callId
|
|
280
|
-
}
|
|
249
|
+
// endregion
|
|
281
250
|
|
|
282
|
-
|
|
251
|
+
// region Start Outgoing Call
|
|
283
252
|
|
|
284
|
-
|
|
253
|
+
// Starts a new outgoing call and returns the native call session ID.
|
|
254
|
+
AsyncFunction("startOutgoingCall") {
|
|
255
|
+
recipient: Map<String, Any?>,
|
|
256
|
+
options: Map<String, Any?> ->
|
|
257
|
+
val callId =
|
|
258
|
+
CallManager.shared.startOutgoingCall(
|
|
259
|
+
recipient = CallParticipant.fromMap(recipient),
|
|
260
|
+
options = CallOptions(hasVideo = options["hasVideo"] as? Boolean ?: false),
|
|
261
|
+
)
|
|
262
|
+
callId
|
|
263
|
+
}
|
|
285
264
|
|
|
286
|
-
|
|
287
|
-
AsyncFunction("reportIncomingCall") { event: Map<String, Any?> ->
|
|
288
|
-
CallManager.shared.reportIncomingCall(IncomingCallEvent.fromMap(event))
|
|
289
|
-
}
|
|
265
|
+
// endregion
|
|
290
266
|
|
|
291
|
-
|
|
267
|
+
// region Report Incoming Call
|
|
292
268
|
|
|
293
|
-
|
|
269
|
+
// Reports an incoming call to Telecom from app/push events.
|
|
270
|
+
AsyncFunction("reportIncomingCall") { event: Map<String, Any?> ->
|
|
271
|
+
CallManager.shared.reportIncomingCall(IncomingCallEvent.fromMap(event))
|
|
272
|
+
}
|
|
294
273
|
|
|
295
|
-
|
|
296
|
-
AsyncFunction("answerCall") { id: String ->
|
|
297
|
-
CallManager.shared.answerCall(UUID.fromString(id))
|
|
298
|
-
}
|
|
274
|
+
// endregion
|
|
299
275
|
|
|
300
|
-
|
|
301
|
-
AsyncFunction("fulfillIncomingCallAnswered") { requestId: String ->
|
|
302
|
-
CallManager.shared.fulfillIncomingCallConnected(UUID.fromString(requestId))
|
|
303
|
-
}
|
|
276
|
+
// region Answer Call
|
|
304
277
|
|
|
278
|
+
// Answers an existing incoming call session.
|
|
279
|
+
AsyncFunction("answerCall") { id: String ->
|
|
280
|
+
CallManager.shared.answerCall(UUID.fromString(id))
|
|
281
|
+
}
|
|
305
282
|
|
|
283
|
+
// Fulfills pending incoming-call answer once media is connected.
|
|
284
|
+
AsyncFunction("fulfillIncomingCallAnswered") { requestId: String ->
|
|
285
|
+
CallManager.shared.fulfillIncomingCallConnected(UUID.fromString(requestId))
|
|
286
|
+
}
|
|
306
287
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
288
|
+
// Reports outgoing call media connection established.
|
|
289
|
+
AsyncFunction("reportOutgoingCallConnected") { id: String ->
|
|
290
|
+
CallManager.shared.reportOutgoingCallConnected(UUID.fromString(id))
|
|
291
|
+
}
|
|
311
292
|
|
|
312
|
-
|
|
293
|
+
// endregion
|
|
313
294
|
|
|
314
|
-
|
|
295
|
+
// region End Call
|
|
315
296
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
CallManager.shared.endCall(UUID.fromString(id))
|
|
319
|
-
}
|
|
297
|
+
// Ends an active call.
|
|
298
|
+
AsyncFunction("endCall") { id: String -> CallManager.shared.endCall(UUID.fromString(id)) }
|
|
320
299
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
300
|
+
// Reports an externally-ended call with explicit reason.
|
|
301
|
+
AsyncFunction("reportCallEnded") { id: String, reason: String ->
|
|
302
|
+
CallManager.shared.reportCallEnded(
|
|
303
|
+
UUID.fromString(id),
|
|
304
|
+
CallEndedReason.fromValue(reason),
|
|
305
|
+
)
|
|
306
|
+
}
|
|
328
307
|
|
|
329
|
-
|
|
308
|
+
// endregion
|
|
330
309
|
|
|
331
|
-
|
|
310
|
+
// region Mute Support
|
|
332
311
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
312
|
+
// Sets mute state for a call.
|
|
313
|
+
AsyncFunction("setMuted") { id: String, muted: Boolean ->
|
|
314
|
+
CallManager.shared.setMuted(UUID.fromString(id), muted)
|
|
315
|
+
}
|
|
337
316
|
|
|
338
|
-
|
|
317
|
+
// endregion
|
|
339
318
|
|
|
340
|
-
|
|
319
|
+
// region Video Support
|
|
341
320
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
321
|
+
// Reports call video enabled state changes.
|
|
322
|
+
AsyncFunction("reportVideo") { id: String, enabled: Boolean ->
|
|
323
|
+
CallManager.shared.reportVideo(UUID.fromString(id), enabled)
|
|
324
|
+
}
|
|
346
325
|
|
|
347
|
-
|
|
326
|
+
// endregion
|
|
348
327
|
|
|
349
|
-
|
|
328
|
+
// region Hold Support
|
|
350
329
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
330
|
+
// Sets call hold state.
|
|
331
|
+
AsyncFunction("setHeld") { id: String, onHold: Boolean ->
|
|
332
|
+
CallManager.shared.setHeld(UUID.fromString(id), onHold)
|
|
333
|
+
}
|
|
355
334
|
|
|
356
|
-
|
|
335
|
+
// endregion
|
|
357
336
|
|
|
358
|
-
|
|
337
|
+
// region DTMF Support
|
|
359
338
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
339
|
+
// Sends requested DTMF digits for a call.
|
|
340
|
+
AsyncFunction("playDTMF") { id: String, digits: String ->
|
|
341
|
+
CallManager.shared.playDTMF(UUID.fromString(id), digits)
|
|
342
|
+
}
|
|
364
343
|
|
|
365
|
-
|
|
344
|
+
// endregion
|
|
366
345
|
|
|
367
|
-
|
|
346
|
+
// region VoIP Push
|
|
368
347
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
VoIPPushManager.register()
|
|
372
|
-
}
|
|
348
|
+
// Registers for VoIP push by fetching the FCM token.
|
|
349
|
+
Function("registerVoIPPush") { VoIPPushManager.register() }
|
|
373
350
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
mapOf(
|
|
377
|
-
"token" to VoIPPushManager.token,
|
|
378
|
-
"type" to "FCM",
|
|
379
|
-
)
|
|
380
|
-
}
|
|
351
|
+
// Returns the current VoIP push token and its type.
|
|
352
|
+
Function("getVoIPPushToken") { mapOf("token" to VoIPPushManager.token, "type" to "FCM") }
|
|
381
353
|
|
|
382
|
-
|
|
383
|
-
|
|
354
|
+
// endregion
|
|
355
|
+
}
|
|
384
356
|
}
|