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.
Files changed (19) hide show
  1. package/README.md +11 -0
  2. package/android/src/main/java/expo/modules/callkittelecom/ExpoCallKitTelecomModule.kt +254 -282
  3. package/android/src/main/java/expo/modules/callkittelecom/IncomingCallActivity.kt +27 -34
  4. package/android/src/main/java/expo/modules/callkittelecom/events/CallEventEmitter.kt +21 -32
  5. package/android/src/main/java/expo/modules/callkittelecom/managers/CallAudioManager.kt +53 -74
  6. package/android/src/main/java/expo/modules/callkittelecom/managers/CallManager.kt +95 -156
  7. package/android/src/main/java/expo/modules/callkittelecom/managers/CallNotificationManager.kt +71 -84
  8. package/android/src/main/java/expo/modules/callkittelecom/managers/CaptureSessionManager.kt +1 -3
  9. package/android/src/main/java/expo/modules/callkittelecom/managers/DialtonePlayer.kt +6 -4
  10. package/android/src/main/java/expo/modules/callkittelecom/managers/FulfillRequestManager.kt +21 -21
  11. package/android/src/main/java/expo/modules/callkittelecom/managers/VoIPPushManager.kt +3 -5
  12. package/android/src/main/java/expo/modules/callkittelecom/models/CallModels.kt +28 -36
  13. package/android/src/main/java/expo/modules/callkittelecom/services/CallNotificationReceiver.kt +7 -8
  14. package/android/src/main/java/expo/modules/callkittelecom/services/ExpoCallKitTelecomMessagingService.kt +9 -16
  15. package/android/src/main/java/expo/modules/callkittelecom/store/CallStore.kt +32 -68
  16. package/android/src/main/java/expo/modules/callkittelecom/utils/CallKitTelecomLog.kt +6 -17
  17. package/android/src/main/java/expo/modules/callkittelecom/utils/PermissionUtils.kt +7 -7
  18. package/ios/Managers/CaptureSessionManager.swift +1 -1
  19. 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
- * to onCreate() — not onNewIntent() — so OnNewIntent never fires.
25
- * This method handles that case by checking the launch intent directly.
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
- ?: return
38
- val callId = try {
39
- UUID.fromString(callIdStr)
40
- } catch (_: IllegalArgumentException) {
41
- return
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
- ModuleDefinition {
52
- Name("ExpoCallKitTelecom")
53
-
54
- // region Events
55
-
56
- Events(
57
- CallEvents.CALL_SESSION_ADDED,
58
- CallEvents.CALL_SESSION_UPDATED,
59
- CallEvents.CALL_SESSION_REMOVED,
60
- CallEvents.AUDIO_SESSION_ACTIVATED,
61
- CallEvents.AUDIO_SESSION_DEACTIVATED,
62
- CallEvents.AUDIO_ROUTE_CHANGED,
63
- CallEvents.INCOMING_CALL_REPORTED,
64
- CallEvents.OUTGOING_CALL_STARTED,
65
- CallEvents.CALL_ANSWERED,
66
- CallEvents.CALL_ENDED,
67
- CallEvents.CALL_REPORTED_ENDED,
68
- CallEvents.SET_MUTED_ACTION,
69
- CallEvents.VIDEO_CHANGED,
70
- CallEvents.SET_HELD_ACTION,
71
- CallEvents.DTMF,
72
- CallEvents.CALL_INTENT_RECEIVED,
73
- CallEvents.VOIP_PUSH_TOKEN_UPDATED,
74
- )
75
-
76
- // endregion
77
-
78
- // region Lifecycle
79
-
80
- OnCreate {
81
- val context = appContext.reactContext ?: return@OnCreate
82
-
83
- CallManager.shared.initialize(context)
84
-
85
- VoIPPushManager.register()
86
-
87
- CallEventEmitter.setSender { eventName, body ->
88
- sendEvent(eventName, body)
89
- }
90
-
91
- // Handle the launch intent for cold-start answer actions.
92
- // OnNewIntent only fires when the activity is already running.
93
- // On cold start the ACTION_ANSWER intent is the launch intent,
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
- // Register per-event observers
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
- OnStartObserving(CallEvents.CALL_SESSION_UPDATED) {
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
- OnStartObserving(CallEvents.CALL_SESSION_REMOVED) {
122
- CallEventEmitter.startObserving(CallEvents.CALL_SESSION_REMOVED)
123
- }
124
- OnStopObserving(CallEvents.CALL_SESSION_REMOVED) {
125
- CallEventEmitter.stopObserving(CallEvents.CALL_SESSION_REMOVED)
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
- OnStartObserving(CallEvents.AUDIO_SESSION_ACTIVATED) {
129
- CallEventEmitter.startObserving(CallEvents.AUDIO_SESSION_ACTIVATED)
130
- }
131
- OnStopObserving(CallEvents.AUDIO_SESSION_ACTIVATED) {
132
- CallEventEmitter.stopObserving(CallEvents.AUDIO_SESSION_ACTIVATED)
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
- OnStartObserving(CallEvents.AUDIO_SESSION_DEACTIVATED) {
136
- CallEventEmitter.startObserving(CallEvents.AUDIO_SESSION_DEACTIVATED)
137
- }
138
- OnStopObserving(CallEvents.AUDIO_SESSION_DEACTIVATED) {
139
- CallEventEmitter.stopObserving(CallEvents.AUDIO_SESSION_DEACTIVATED)
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
- OnStartObserving(CallEvents.AUDIO_ROUTE_CHANGED) {
143
- CallEventEmitter.startObserving(CallEvents.AUDIO_ROUTE_CHANGED)
144
- }
145
- OnStopObserving(CallEvents.AUDIO_ROUTE_CHANGED) {
146
- CallEventEmitter.stopObserving(CallEvents.AUDIO_ROUTE_CHANGED)
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
- OnStartObserving(CallEvents.INCOMING_CALL_REPORTED) {
150
- CallEventEmitter.startObserving(CallEvents.INCOMING_CALL_REPORTED)
151
- }
152
- OnStopObserving(CallEvents.INCOMING_CALL_REPORTED) {
153
- CallEventEmitter.stopObserving(CallEvents.INCOMING_CALL_REPORTED)
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
- OnStartObserving(CallEvents.OUTGOING_CALL_STARTED) {
157
- CallEventEmitter.startObserving(CallEvents.OUTGOING_CALL_STARTED)
158
- }
159
- OnStopObserving(CallEvents.OUTGOING_CALL_STARTED) {
160
- CallEventEmitter.stopObserving(CallEvents.OUTGOING_CALL_STARTED)
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
- OnStartObserving(CallEvents.CALL_ANSWERED) {
164
- CallEventEmitter.startObserving(CallEvents.CALL_ANSWERED)
165
- }
166
- OnStopObserving(CallEvents.CALL_ANSWERED) {
167
- CallEventEmitter.stopObserving(CallEvents.CALL_ANSWERED)
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
- OnStartObserving(CallEvents.CALL_ENDED) {
171
- CallEventEmitter.startObserving(CallEvents.CALL_ENDED)
172
- }
173
- OnStopObserving(CallEvents.CALL_ENDED) {
174
- CallEventEmitter.stopObserving(CallEvents.CALL_ENDED)
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
- OnStartObserving(CallEvents.CALL_REPORTED_ENDED) {
178
- CallEventEmitter.startObserving(CallEvents.CALL_REPORTED_ENDED)
179
- }
180
- OnStopObserving(CallEvents.CALL_REPORTED_ENDED) {
181
- CallEventEmitter.stopObserving(CallEvents.CALL_REPORTED_ENDED)
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
- OnStartObserving(CallEvents.SET_MUTED_ACTION) {
185
- CallEventEmitter.startObserving(CallEvents.SET_MUTED_ACTION)
186
- }
187
- OnStopObserving(CallEvents.SET_MUTED_ACTION) {
188
- CallEventEmitter.stopObserving(CallEvents.SET_MUTED_ACTION)
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
- OnStartObserving(CallEvents.VIDEO_CHANGED) {
192
- CallEventEmitter.startObserving(CallEvents.VIDEO_CHANGED)
193
- }
194
- OnStopObserving(CallEvents.VIDEO_CHANGED) {
195
- CallEventEmitter.stopObserving(CallEvents.VIDEO_CHANGED)
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
- OnStartObserving(CallEvents.SET_HELD_ACTION) {
199
- CallEventEmitter.startObserving(CallEvents.SET_HELD_ACTION)
200
- }
201
- OnStopObserving(CallEvents.SET_HELD_ACTION) {
202
- CallEventEmitter.stopObserving(CallEvents.SET_HELD_ACTION)
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
- OnStartObserving(CallEvents.DTMF) {
206
- CallEventEmitter.startObserving(CallEvents.DTMF)
207
- }
208
- OnStopObserving(CallEvents.DTMF) {
209
- CallEventEmitter.stopObserving(CallEvents.DTMF)
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
- OnStartObserving(CallEvents.CALL_INTENT_RECEIVED) {
213
- CallEventEmitter.startObserving(CallEvents.CALL_INTENT_RECEIVED)
214
- }
215
- OnStopObserving(CallEvents.CALL_INTENT_RECEIVED) {
216
- CallEventEmitter.stopObserving(CallEvents.CALL_INTENT_RECEIVED)
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
- OnStartObserving(CallEvents.VOIP_PUSH_TOKEN_UPDATED) {
220
- CallEventEmitter.startObserving(CallEvents.VOIP_PUSH_TOKEN_UPDATED)
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
- // endregion
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
- // region Call Session
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
- // Returns the first active call session, if present.
231
- AsyncFunction("getActiveCallSession") {
232
- CallStore.firstSession()?.toMap()
233
- }
215
+ // endregion
234
216
 
235
- // endregion
217
+ // region Call Session
236
218
 
237
- // region Audio Session
219
+ // Returns the first active call session, if present.
220
+ AsyncFunction("getActiveCallSession") { CallStore.firstSession()?.toMap() }
238
221
 
239
- // Returns current audio session snapshot for diagnostics/UI state.
240
- Function("getAudioSessionState") {
241
- CallAudioManager.getAudioSessionState()
242
- }
222
+ // endregion
243
223
 
244
- // Prepares audio session state before starting/reporting a call.
245
- Function("prepareAudioSessionForCall") { hasVideo: Boolean ->
246
- CallAudioManager.prepareAudioSessionForCall(hasVideo)
247
- }
224
+ // region Audio Session
248
225
 
249
- // Restores pre-call audio mode/route state.
250
- Function("restoreAudioSession") {
251
- CallAudioManager.restoreAudioSession()
252
- }
226
+ // Returns current audio session snapshot for diagnostics/UI state.
227
+ Function("getAudioSessionState") { CallAudioManager.getAudioSessionState() }
253
228
 
254
- // Overrides route to speaker (true) or clears override (false).
255
- Function("setAudioSessionPortOverride") { enabled: Boolean ->
256
- CallAudioManager.setAudioSessionPortOverride(enabled)
257
- }
229
+ // Prepares audio session state before starting/reporting a call.
230
+ Function("prepareAudioSessionForCall") { hasVideo: Boolean ->
231
+ CallAudioManager.prepareAudioSessionForCall(hasVideo)
232
+ }
258
233
 
259
- // endregion
234
+ // Restores pre-call audio mode/route state.
235
+ Function("restoreAudioSession") { CallAudioManager.restoreAudioSession() }
260
236
 
261
- // region Capture Session
237
+ // Overrides route to speaker (true) or clears override (false).
238
+ Function("setAudioSessionPortOverride") { enabled: Boolean ->
239
+ CallAudioManager.setAudioSessionPortOverride(enabled)
240
+ }
262
241
 
263
- // Returns capture session state (currently camera permission).
264
- Function("getCaptureSessionState") {
265
- CaptureSessionManager.getCaptureSessionState()
266
- }
242
+ // endregion
267
243
 
268
- // endregion
244
+ // region Capture Session
269
245
 
270
- // region Start Outgoing Call
246
+ // Returns capture session state (currently camera permission).
247
+ Function("getCaptureSessionState") { CaptureSessionManager.getCaptureSessionState() }
271
248
 
272
- // Starts a new outgoing call and returns the native call session ID.
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
- // endregion
251
+ // region Start Outgoing Call
283
252
 
284
- // region Report Incoming Call
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
- // Reports an incoming call to Telecom from app/push events.
287
- AsyncFunction("reportIncomingCall") { event: Map<String, Any?> ->
288
- CallManager.shared.reportIncomingCall(IncomingCallEvent.fromMap(event))
289
- }
265
+ // endregion
290
266
 
291
- // endregion
267
+ // region Report Incoming Call
292
268
 
293
- // region Answer Call
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
- // Answers an existing incoming call session.
296
- AsyncFunction("answerCall") { id: String ->
297
- CallManager.shared.answerCall(UUID.fromString(id))
298
- }
274
+ // endregion
299
275
 
300
- // Fulfills pending incoming-call answer once media is connected.
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
- // Reports outgoing call media connection established.
308
- AsyncFunction("reportOutgoingCallConnected") { id: String ->
309
- CallManager.shared.reportOutgoingCallConnected(UUID.fromString(id))
310
- }
288
+ // Reports outgoing call media connection established.
289
+ AsyncFunction("reportOutgoingCallConnected") { id: String ->
290
+ CallManager.shared.reportOutgoingCallConnected(UUID.fromString(id))
291
+ }
311
292
 
312
- // endregion
293
+ // endregion
313
294
 
314
- // region End Call
295
+ // region End Call
315
296
 
316
- // Ends an active call.
317
- AsyncFunction("endCall") { id: String ->
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
- // Reports an externally-ended call with explicit reason.
322
- AsyncFunction("reportCallEnded") { id: String, reason: String ->
323
- CallManager.shared.reportCallEnded(
324
- UUID.fromString(id),
325
- CallEndedReason.fromValue(reason),
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
- // endregion
308
+ // endregion
330
309
 
331
- // region Mute Support
310
+ // region Mute Support
332
311
 
333
- // Sets mute state for a call.
334
- AsyncFunction("setMuted") { id: String, muted: Boolean ->
335
- CallManager.shared.setMuted(UUID.fromString(id), muted)
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
- // endregion
317
+ // endregion
339
318
 
340
- // region Video Support
319
+ // region Video Support
341
320
 
342
- // Reports call video enabled state changes.
343
- AsyncFunction("reportVideo") { id: String, enabled: Boolean ->
344
- CallManager.shared.reportVideo(UUID.fromString(id), enabled)
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
- // endregion
326
+ // endregion
348
327
 
349
- // region Hold Support
328
+ // region Hold Support
350
329
 
351
- // Sets call hold state.
352
- AsyncFunction("setHeld") { id: String, onHold: Boolean ->
353
- CallManager.shared.setHeld(UUID.fromString(id), onHold)
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
- // endregion
335
+ // endregion
357
336
 
358
- // region DTMF Support
337
+ // region DTMF Support
359
338
 
360
- // Sends requested DTMF digits for a call.
361
- AsyncFunction("playDTMF") { id: String, digits: String ->
362
- CallManager.shared.playDTMF(UUID.fromString(id), digits)
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
- // endregion
344
+ // endregion
366
345
 
367
- // region VoIP Push
346
+ // region VoIP Push
368
347
 
369
- // Registers for VoIP push by fetching the FCM token.
370
- Function("registerVoIPPush") {
371
- VoIPPushManager.register()
372
- }
348
+ // Registers for VoIP push by fetching the FCM token.
349
+ Function("registerVoIPPush") { VoIPPushManager.register() }
373
350
 
374
- // Returns the current VoIP push token and its type.
375
- Function("getVoIPPushToken") {
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
- // endregion
383
- }
354
+ // endregion
355
+ }
384
356
  }