@stream-io/video-react-native-sdk 1.40.1 → 1.40.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 (56) hide show
  1. package/CHANGELOG.md +18 -2
  2. package/android/src/main/java/com/streamvideo/reactnative/audio/AudioDeviceManager.kt +45 -16
  3. package/android/src/main/java/com/streamvideo/reactnative/callmanager/StreamInCallManagerModule.kt +12 -0
  4. package/dist/commonjs/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js +1 -1
  5. package/dist/commonjs/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js.map +1 -1
  6. package/dist/commonjs/hooks/useAndroidKeepCallAliveEffect.js +36 -4
  7. package/dist/commonjs/hooks/useAndroidKeepCallAliveEffect.js.map +1 -1
  8. package/dist/commonjs/modules/call-manager/CallManager.js +133 -1
  9. package/dist/commonjs/modules/call-manager/CallManager.js.map +1 -1
  10. package/dist/commonjs/utils/internal/callingx/callingx.js +37 -0
  11. package/dist/commonjs/utils/internal/callingx/callingx.js.map +1 -1
  12. package/dist/commonjs/utils/internal/registerSDKGlobals.js +34 -0
  13. package/dist/commonjs/utils/internal/registerSDKGlobals.js.map +1 -1
  14. package/dist/commonjs/utils/push/android.js +101 -103
  15. package/dist/commonjs/utils/push/android.js.map +1 -1
  16. package/dist/commonjs/utils/push/libs/callingx.js +3 -0
  17. package/dist/commonjs/utils/push/libs/callingx.js.map +1 -1
  18. package/dist/commonjs/version.js +1 -1
  19. package/dist/module/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js +2 -2
  20. package/dist/module/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js.map +1 -1
  21. package/dist/module/hooks/useAndroidKeepCallAliveEffect.js +36 -4
  22. package/dist/module/hooks/useAndroidKeepCallAliveEffect.js.map +1 -1
  23. package/dist/module/modules/call-manager/CallManager.js +133 -1
  24. package/dist/module/modules/call-manager/CallManager.js.map +1 -1
  25. package/dist/module/utils/internal/callingx/callingx.js +38 -1
  26. package/dist/module/utils/internal/callingx/callingx.js.map +1 -1
  27. package/dist/module/utils/internal/registerSDKGlobals.js +34 -0
  28. package/dist/module/utils/internal/registerSDKGlobals.js.map +1 -1
  29. package/dist/module/utils/push/android.js +101 -103
  30. package/dist/module/utils/push/android.js.map +1 -1
  31. package/dist/module/utils/push/libs/callingx.js +3 -0
  32. package/dist/module/utils/push/libs/callingx.js.map +1 -1
  33. package/dist/module/version.js +1 -1
  34. package/dist/typescript/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.d.ts.map +1 -1
  35. package/dist/typescript/hooks/useAndroidKeepCallAliveEffect.d.ts.map +1 -1
  36. package/dist/typescript/modules/call-manager/CallManager.d.ts.map +1 -1
  37. package/dist/typescript/utils/StreamVideoRN/types.d.ts +5 -0
  38. package/dist/typescript/utils/StreamVideoRN/types.d.ts.map +1 -1
  39. package/dist/typescript/utils/internal/callingx/callingx.d.ts.map +1 -1
  40. package/dist/typescript/utils/internal/registerSDKGlobals.d.ts.map +1 -1
  41. package/dist/typescript/utils/push/android.d.ts.map +1 -1
  42. package/dist/typescript/utils/push/libs/callingx.d.ts.map +1 -1
  43. package/dist/typescript/version.d.ts +1 -1
  44. package/expo-config-plugin/dist/index.js +0 -2
  45. package/package.json +6 -10
  46. package/src/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.tsx +3 -2
  47. package/src/hooks/useAndroidKeepCallAliveEffect.ts +54 -10
  48. package/src/modules/call-manager/CallManager.ts +162 -1
  49. package/src/modules/call-manager/native-module.d.ts +8 -0
  50. package/src/utils/StreamVideoRN/types.ts +5 -0
  51. package/src/utils/internal/callingx/callingx.ts +44 -1
  52. package/src/utils/internal/registerSDKGlobals.ts +38 -0
  53. package/src/utils/push/android.ts +141 -140
  54. package/src/utils/push/libs/callingx.ts +4 -0
  55. package/src/version.ts +1 -1
  56. package/expo-config-plugin/dist/withBuildProperties.js +0 -13
@@ -9,12 +9,71 @@ const AUDIO_INTERRUPTION_EVENT = 'StreamInCallManagerAudioInterruption';
9
9
  const invariant = (condition, message) => {
10
10
  if (!condition) throw new Error(message);
11
11
  };
12
+
13
+ /**
14
+ * On Android, whether the current call is managed by Telecom (via callingx).
15
+ * In that mode, audio routing/mode is owned by Telecom and StreamInCallManager audio methods should not be used
16
+ */
17
+ const isAndroidTelecomManaged = () => {
18
+ if (Platform.OS !== 'android' || !CallingxModule) {
19
+ return false;
20
+ }
21
+ return CallingxModule.isSetup && CallingxModule.isTelecomBacked && (CallingxModule.hasRegisteredCall() || CallingxModule.isOngoingCallsEnabled);
22
+ };
23
+
24
+ /**
25
+ * When the current call is Telecom-managed, returns the callingx module and the
26
+ * registered callId. Centralizes the guard so call sites don't repeat the module /
27
+ * callId checks — `isAndroidTelecomManaged()` already implies the module exists, but
28
+ * the extra narrowing here is what makes that provable to the type-checker.
29
+ */
30
+ const getTelecomContext = () => {
31
+ if (!isAndroidTelecomManaged() || !CallingxModule) {
32
+ return undefined;
33
+ }
34
+ const callId = CallingxModule.getRegisteredCallIds()[0];
35
+ if (!callId) {
36
+ return undefined;
37
+ }
38
+ return {
39
+ cx: CallingxModule,
40
+ callId
41
+ };
42
+ };
43
+
44
+ /** Map a generic Telecom endpoint type to the SDK's endpoint display name. */
45
+ const endpointTypeToDisplayName = type => {
46
+ switch (type) {
47
+ case 'earpiece':
48
+ return 'Earpiece';
49
+ case 'speaker':
50
+ return 'Speaker';
51
+ case 'wired_headset':
52
+ return 'Wired Headset';
53
+ case 'bluetooth':
54
+ return 'Bluetooth Device';
55
+ default:
56
+ return 'Unknown';
57
+ }
58
+ };
59
+
60
+ /** Adapt a callingx endpoints snapshot to the SDK's {@link AudioDeviceStatus}. */
61
+ const snapshotToStatus = snapshot => ({
62
+ devices: snapshot.endpoints.map(e => e.name),
63
+ currentEndpointType: snapshot.currentEndpoint ? endpointTypeToDisplayName(snapshot.currentEndpoint.type) : 'Unknown',
64
+ selectedDevice: snapshot.currentEndpoint?.name ?? ''
65
+ });
12
66
  class AndroidCallManager {
13
67
  /**
14
68
  * Get the current audio device status.
15
69
  */
16
70
  getAudioDeviceStatus = async () => {
17
71
  invariant(Platform.OS === 'android', 'Supported only on Android');
72
+ const tc = getTelecomContext();
73
+ if (tc) {
74
+ const snapshot = await tc.cx.getAvailableAudioEndpoints(tc.callId);
75
+ return snapshotToStatus(snapshot);
76
+ }
18
77
  return NativeManager.getAudioDeviceStatus();
19
78
  };
20
79
 
@@ -25,6 +84,24 @@ class AndroidCallManager {
25
84
  */
26
85
  selectAudioDevice = endpointName => {
27
86
  invariant(Platform.OS === 'android', 'Supported only on Android');
87
+ const tc = getTelecomContext();
88
+ if (tc) {
89
+ const {
90
+ cx,
91
+ callId
92
+ } = tc;
93
+ // Resolve name -> endpoint id from the current Telecom snapshot, then route via Telecom.
94
+ cx.getAvailableAudioEndpoints(callId).then(snapshot => {
95
+ const target = snapshot.endpoints.find(e => e.name === endpointName);
96
+ if (target) {
97
+ return cx.requestAudioEndpointChange(callId, target.id);
98
+ }
99
+ return undefined;
100
+ }).catch(error => {
101
+ videoLoggerSystem.getLogger('CallManager').warn(`selectAudioDevice: failed to route to "${endpointName}" for call ${callId} via Telecom`, error);
102
+ });
103
+ return;
104
+ }
28
105
  NativeManager.chooseAudioDeviceEndpoint(endpointName);
29
106
  };
30
107
 
@@ -34,9 +111,22 @@ class AndroidCallManager {
34
111
  */
35
112
  addAudioDeviceChangeListener = onChange => {
36
113
  invariant(Platform.OS === 'android', 'Supported only on Android');
114
+ const cleanups = [];
115
+
116
+ // Telecom (callingx) route changes.
117
+ if (CallingxModule?.isSetup && CallingxModule.isTelecomBacked) {
118
+ const sub = CallingxModule.addEventListener('didChangeAudioEndpoints', params => onChange(snapshotToStatus(params)));
119
+ cleanups.push(() => sub.remove());
120
+ }
121
+
122
+ // StreamInCallManager route changes (non-Telecom calls). Native
123
+ // suppresses these while in telecom-managed mode, and callingx emits no
124
+ // endpoint events for non-Telecom calls, so the two sources never overlap
125
+ // at runtime — safe to keep both subscribed in parallel.
37
126
  this.eventEmitter ??= new NativeEventEmitter(NativeManager);
38
127
  const s = this.eventEmitter.addListener('onAudioDeviceChanged', onChange);
39
- return () => s.remove();
128
+ cleanups.push(() => s.remove());
129
+ return () => cleanups.forEach(cleanup => cleanup());
40
130
  };
41
131
  }
42
132
  class IOSCallManager {
@@ -76,6 +166,34 @@ class SpeakerManager {
76
166
  * Forces speakerphone on/off.
77
167
  */
78
168
  setForceSpeakerphoneOn = force => {
169
+ const tc = getTelecomContext();
170
+ if (tc) {
171
+ const {
172
+ cx,
173
+ callId
174
+ } = tc;
175
+ // Telecom owns routing: map on -> speaker endpoint, off -> highest-priority
176
+ // non-speaker endpoint (wired > bluetooth > earpiece), mirroring classic behavior.
177
+ cx.getAvailableAudioEndpoints(callId).then(snapshot => {
178
+ let target;
179
+ if (force) {
180
+ target = snapshot.endpoints.find(e => e.type === 'speaker');
181
+ } else {
182
+ // Priority for the "speakerphone off" fallback: prefer wired, then bluetooth, then earpiece.
183
+ for (const type of ['wired_headset', 'bluetooth', 'earpiece']) {
184
+ target = snapshot.endpoints.find(e => e.type === type);
185
+ if (target) break;
186
+ }
187
+ }
188
+ if (target) {
189
+ return cx.requestAudioEndpointChange(callId, target.id);
190
+ }
191
+ return undefined;
192
+ }).catch(error => {
193
+ videoLoggerSystem.getLogger('CallManager').warn(`setForceSpeakerphoneOn(${force}): failed to route for call ${callId} via Telecom`, error);
194
+ });
195
+ return;
196
+ }
79
197
  NativeManager.setForceSpeakerphoneOn(force);
80
198
  };
81
199
  }
@@ -121,6 +239,20 @@ export class CallManager {
121
239
  videoLoggerSystem.getLogger('CallManager').debug('start: skipping start as callkit is handling the audio session');
122
240
  return;
123
241
  }
242
+ if (isAndroidTelecomManaged()) {
243
+ // Telecom owns routing/focus; forward the sticky preference to callingx and run in
244
+ // telecom-managed mode (StreamInCallManager keeps proximity/keep-screen-on only).
245
+ if (config?.audioRole !== 'listener' && CallingxModule) {
246
+ CallingxModule.setDefaultAudioDeviceEndpointType(config?.deviceEndpointType ?? 'speaker');
247
+ }
248
+ NativeManager.setTelecomManagedMode(true);
249
+ NativeManager.setAudioRole(config?.audioRole ?? 'communicator');
250
+ NativeManager.start();
251
+ return;
252
+ }
253
+ if (Platform.OS === 'android') {
254
+ NativeManager.setTelecomManagedMode(false);
255
+ }
124
256
  NativeManager.setAudioRole(config?.audioRole ?? 'communicator');
125
257
  if (config?.audioRole === 'communicator') {
126
258
  const type = config.deviceEndpointType ?? 'speaker';
@@ -1 +1 @@
1
- {"version":3,"names":["NativeEventEmitter","NativeModules","Platform","getCallingxLibIfAvailable","videoLoggerSystem","NativeManager","StreamInCallManager","CallingxModule","AUDIO_INTERRUPTION_EVENT","invariant","condition","message","Error","AndroidCallManager","getAudioDeviceStatus","OS","selectAudioDevice","endpointName","chooseAudioDeviceEndpoint","addAudioDeviceChangeListener","onChange","eventEmitter","s","addListener","remove","IOSCallManager","showDeviceSelector","showAudioRoutePicker","addAudioInterruptionListener","onInterruption","SpeakerManager","setMute","mute","muteAudioOutput","unmuteAudioOutput","setForceSpeakerphoneOn","force","shouldBypassForCallKit","isSetup","hasRegisteredCall","isOngoingCallsEnabled","CallManager","android","ios","speaker","start","config","audioRole","type","deviceEndpointType","setDefaultAudioDeviceEndpointType","getLogger","debug","setAudioRole","enableStereoAudioOutput","setEnableStereoAudioOutput","stop","logAudioState","getAudioStateLog"],"sourceRoot":"../../../../src","sources":["modules/call-manager/CallManager.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["NativeEventEmitter","NativeModules","Platform","getCallingxLibIfAvailable","videoLoggerSystem","NativeManager","StreamInCallManager","CallingxModule","AUDIO_INTERRUPTION_EVENT","invariant","condition","message","Error","isAndroidTelecomManaged","OS","isSetup","isTelecomBacked","hasRegisteredCall","isOngoingCallsEnabled","getTelecomContext","undefined","callId","getRegisteredCallIds","cx","endpointTypeToDisplayName","type","snapshotToStatus","snapshot","devices","endpoints","map","e","name","currentEndpointType","currentEndpoint","selectedDevice","AndroidCallManager","getAudioDeviceStatus","tc","getAvailableAudioEndpoints","selectAudioDevice","endpointName","then","target","find","requestAudioEndpointChange","id","catch","error","getLogger","warn","chooseAudioDeviceEndpoint","addAudioDeviceChangeListener","onChange","cleanups","sub","addEventListener","params","push","remove","eventEmitter","s","addListener","forEach","cleanup","IOSCallManager","showDeviceSelector","showAudioRoutePicker","addAudioInterruptionListener","onInterruption","SpeakerManager","setMute","mute","muteAudioOutput","unmuteAudioOutput","setForceSpeakerphoneOn","force","shouldBypassForCallKit","CallManager","android","ios","speaker","start","config","audioRole","deviceEndpointType","setDefaultAudioDeviceEndpointType","debug","setTelecomManagedMode","setAudioRole","enableStereoAudioOutput","setEnableStereoAudioOutput","stop","logAudioState","getAudioStateLog"],"sourceRoot":"../../../../src","sources":["modules/call-manager/CallManager.ts"],"mappings":";;AAAA,SAASA,kBAAkB,EAAEC,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAU1E,SAASC,yBAAyB,QAAQ,gCAAgC;AAC1E,SAASC,iBAAiB,QAAQ,yBAAyB;AAE3D,MAAMC,aAAa,GAAGJ,aAAa,CAACK,mBAAmB;AACvD,MAAMC,cAAc,GAAGJ,yBAAyB,CAAC,CAAC;AAClD,MAAMK,wBAAwB,GAAG,sCAAsC;AAEvE,MAAMC,SAAS,GAAGA,CAACC,SAAkB,EAAEC,OAAe,KAAK;EACzD,IAAI,CAACD,SAAS,EAAE,MAAM,IAAIE,KAAK,CAACD,OAAO,CAAC;AAC1C,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAME,uBAAuB,GAAGA,CAAA,KAAe;EAC7C,IAAIX,QAAQ,CAACY,EAAE,KAAK,SAAS,IAAI,CAACP,cAAc,EAAE;IAChD,OAAO,KAAK;EACd;EACA,OACEA,cAAc,CAACQ,OAAO,IACtBR,cAAc,CAACS,eAAe,KAC7BT,cAAc,CAACU,iBAAiB,CAAC,CAAC,IAAIV,cAAc,CAACW,qBAAqB,CAAC;AAEhF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,iBAAiB,GAAGA,CAAA,KAET;EACf,IAAI,CAACN,uBAAuB,CAAC,CAAC,IAAI,CAACN,cAAc,EAAE;IACjD,OAAOa,SAAS;EAClB;EACA,MAAMC,MAAM,GAAGd,cAAc,CAACe,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;EACvD,IAAI,CAACD,MAAM,EAAE;IACX,OAAOD,SAAS;EAClB;EACA,OAAO;IAAEG,EAAE,EAAEhB,cAAc;IAAEc;EAAO,CAAC;AACvC,CAAC;;AAED;AACA,MAAMG,yBAAyB,GAC7BC,IAAY,IACiC;EAC7C,QAAQA,IAAI;IACV,KAAK,UAAU;MACb,OAAO,UAAU;IACnB,KAAK,SAAS;MACZ,OAAO,SAAS;IAClB,KAAK,eAAe;MAClB,OAAO,eAAe;IACxB,KAAK,WAAW;MACd,OAAO,kBAAkB;IAC3B;MACE,OAAO,SAAS;EACpB;AACF,CAAC;;AAED;AACA,MAAMC,gBAAgB,GACpBC,QAA+B,KACR;EACvBC,OAAO,EAAED,QAAQ,CAACE,SAAS,CAACC,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,IAAI,CAAC;EAC9CC,mBAAmB,EAAEN,QAAQ,CAACO,eAAe,GACzCV,yBAAyB,CAACG,QAAQ,CAACO,eAAe,CAACT,IAAI,CAAC,GACxD,SAAS;EACbU,cAAc,EAAER,QAAQ,CAACO,eAAe,EAAEF,IAAI,IAAI;AACpD,CAAC,CAAC;AAEF,MAAMI,kBAAkB,CAAC;EAGvB;AACF;AACA;EACEC,oBAAoB,GAAG,MAAAA,CAAA,KAAwC;IAC7D5B,SAAS,CAACP,QAAQ,CAACY,EAAE,KAAK,SAAS,EAAE,2BAA2B,CAAC;IACjE,MAAMwB,EAAE,GAAGnB,iBAAiB,CAAC,CAAC;IAC9B,IAAImB,EAAE,EAAE;MACN,MAAMX,QAAQ,GAAG,MAAMW,EAAE,CAACf,EAAE,CAACgB,0BAA0B,CAACD,EAAE,CAACjB,MAAM,CAAC;MAClE,OAAOK,gBAAgB,CAACC,QAAQ,CAAC;IACnC;IACA,OAAOtB,aAAa,CAACgC,oBAAoB,CAAC,CAAC;EAC7C,CAAC;;EAED;AACF;AACA;AACA;AACA;EACEG,iBAAiB,GAAIC,YAAoB,IAAW;IAClDhC,SAAS,CAACP,QAAQ,CAACY,EAAE,KAAK,SAAS,EAAE,2BAA2B,CAAC;IACjE,MAAMwB,EAAE,GAAGnB,iBAAiB,CAAC,CAAC;IAC9B,IAAImB,EAAE,EAAE;MACN,MAAM;QAAEf,EAAE;QAAEF;MAAO,CAAC,GAAGiB,EAAE;MACzB;MACAf,EAAE,CAACgB,0BAA0B,CAAClB,MAAM,CAAC,CAClCqB,IAAI,CAAEf,QAAQ,IAAK;QAClB,MAAMgB,MAAM,GAAGhB,QAAQ,CAACE,SAAS,CAACe,IAAI,CACnCb,CAAC,IAAKA,CAAC,CAACC,IAAI,KAAKS,YACpB,CAAC;QACD,IAAIE,MAAM,EAAE;UACV,OAAOpB,EAAE,CAACsB,0BAA0B,CAACxB,MAAM,EAAEsB,MAAM,CAACG,EAAE,CAAC;QACzD;QACA,OAAO1B,SAAS;MAClB,CAAC,CAAC,CACD2B,KAAK,CAAEC,KAAK,IAAK;QAChB5C,iBAAiB,CACd6C,SAAS,CAAC,aAAa,CAAC,CACxBC,IAAI,CACH,0CAA0CT,YAAY,cAAcpB,MAAM,cAAc,EACxF2B,KACF,CAAC;MACL,CAAC,CAAC;MACJ;IACF;IACA3C,aAAa,CAAC8C,yBAAyB,CAACV,YAAY,CAAC;EACvD,CAAC;;EAED;AACF;AACA;AACA;EACEW,4BAA4B,GAC1BC,QAAwD,IACvC;IACjB5C,SAAS,CAACP,QAAQ,CAACY,EAAE,KAAK,SAAS,EAAE,2BAA2B,CAAC;IACjE,MAAMwC,QAA2B,GAAG,EAAE;;IAEtC;IACA,IAAI/C,cAAc,EAAEQ,OAAO,IAAIR,cAAc,CAACS,eAAe,EAAE;MAC7D,MAAMuC,GAAG,GAAGhD,cAAc,CAACiD,gBAAgB,CACzC,yBAAyB,EACxBC,MAAM,IAAKJ,QAAQ,CAAC3B,gBAAgB,CAAC+B,MAAM,CAAC,CAC/C,CAAC;MACDH,QAAQ,CAACI,IAAI,CAAC,MAAMH,GAAG,CAACI,MAAM,CAAC,CAAC,CAAC;IACnC;;IAEA;IACA;IACA;IACA;IACA,IAAI,CAACC,YAAY,KAAK,IAAI5D,kBAAkB,CAACK,aAAa,CAAC;IAC3D,MAAMwD,CAAC,GAAG,IAAI,CAACD,YAAY,CAACE,WAAW,CAAC,sBAAsB,EAAET,QAAQ,CAAC;IACzEC,QAAQ,CAACI,IAAI,CAAC,MAAMG,CAAC,CAACF,MAAM,CAAC,CAAC,CAAC;IAE/B,OAAO,MAAML,QAAQ,CAACS,OAAO,CAAEC,OAAO,IAAKA,OAAO,CAAC,CAAC,CAAC;EACvD,CAAC;AACH;AAEA,MAAMC,cAAc,CAAC;EAGnB;AACF;AACA;EACEC,kBAAkB,GAAGA,CAAA,KAAY;IAC/BzD,SAAS,CAACP,QAAQ,CAACY,EAAE,KAAK,KAAK,EAAE,uBAAuB,CAAC;IACzDT,aAAa,CAAC8D,oBAAoB,CAAC,CAAC;EACtC,CAAC;;EAED;AACF;AACA;AACA;AACA;EACEC,4BAA4B,GAC1BC,cAA0D,IACzC;IACjB5D,SAAS,CAACP,QAAQ,CAACY,EAAE,KAAK,KAAK,EAAE,uBAAuB,CAAC;IACzD,IAAI,CAAC8C,YAAY,KAAK,IAAI5D,kBAAkB,CAACK,aAAa,CAAC;IAC3D,MAAMwD,CAAC,GAAG,IAAI,CAACD,YAAY,CAACE,WAAW,CACrCtD,wBAAwB,EACxB6D,cACF,CAAC;IACD,OAAO,MAAMR,CAAC,CAACF,MAAM,CAAC,CAAC;EACzB,CAAC;AACH;AAEA,MAAMW,cAAc,CAAC;EACnB;AACF;AACA;EACEC,OAAO,GAAIC,IAAa,IAAW;IACjC,IAAIA,IAAI,EAAE;MACRnE,aAAa,CAACoE,eAAe,CAAC,CAAC;IACjC,CAAC,MAAM;MACLpE,aAAa,CAACqE,iBAAiB,CAAC,CAAC;IACnC;EACF,CAAC;;EAED;AACF;AACA;EACEC,sBAAsB,GAAIC,KAAc,IAAW;IACjD,MAAMtC,EAAE,GAAGnB,iBAAiB,CAAC,CAAC;IAC9B,IAAImB,EAAE,EAAE;MACN,MAAM;QAAEf,EAAE;QAAEF;MAAO,CAAC,GAAGiB,EAAE;MACzB;MACA;MACAf,EAAE,CAACgB,0BAA0B,CAAClB,MAAM,CAAC,CAClCqB,IAAI,CAAEf,QAAQ,IAAK;QAClB,IAAIgB,MAAyC;QAC7C,IAAIiC,KAAK,EAAE;UACTjC,MAAM,GAAGhB,QAAQ,CAACE,SAAS,CAACe,IAAI,CAAEb,CAAC,IAAKA,CAAC,CAACN,IAAI,KAAK,SAAS,CAAC;QAC/D,CAAC,MAAM;UACL;UACA,KAAK,MAAMA,IAAI,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE;YAC7DkB,MAAM,GAAGhB,QAAQ,CAACE,SAAS,CAACe,IAAI,CAAEb,CAAC,IAAKA,CAAC,CAACN,IAAI,KAAKA,IAAI,CAAC;YACxD,IAAIkB,MAAM,EAAE;UACd;QACF;QACA,IAAIA,MAAM,EAAE;UACV,OAAOpB,EAAE,CAACsB,0BAA0B,CAACxB,MAAM,EAAEsB,MAAM,CAACG,EAAE,CAAC;QACzD;QACA,OAAO1B,SAAS;MAClB,CAAC,CAAC,CACD2B,KAAK,CAAEC,KAAK,IAAK;QAChB5C,iBAAiB,CACd6C,SAAS,CAAC,aAAa,CAAC,CACxBC,IAAI,CACH,0BAA0B0B,KAAK,+BAA+BvD,MAAM,cAAc,EAClF2B,KACF,CAAC;MACL,CAAC,CAAC;MACJ;IACF;IACA3C,aAAa,CAACsE,sBAAsB,CAACC,KAAK,CAAC;EAC7C,CAAC;AACH;AAEA,MAAMC,sBAAsB,GAAGA,CAAA,KAAe;EAC5C,IAAI3E,QAAQ,CAACY,EAAE,KAAK,KAAK,EAAE;IACzB,OAAO,KAAK;EACd;EACA,IAAI,CAACP,cAAc,EAAE;IACnB,OAAO,KAAK;EACd;EACA,OACEA,cAAc,CAACQ,OAAO,KACrBR,cAAc,CAACU,iBAAiB,CAAC,CAAC,IAAIV,cAAc,CAACW,qBAAqB,CAAC;AAEhF,CAAC;AAED,OAAO,MAAM4D,WAAW,CAAC;EACvBC,OAAO,GAAG,IAAI3C,kBAAkB,CAAC,CAAC;EAClC4C,GAAG,GAAG,IAAIf,cAAc,CAAC,CAAC;EAC1BgB,OAAO,GAAG,IAAIX,cAAc,CAAC,CAAC;;EAE9B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEY,KAAK,GAAIC,MAAkC,IAAW;IACpD,IAAIN,sBAAsB,CAAC,CAAC,EAAE;MAC5B;MACA;MACA,IAAIM,MAAM,EAAEC,SAAS,KAAK,cAAc,IAAI7E,cAAc,EAAE;QAC1D,MAAMkB,IAAI,GAAG0D,MAAM,CAACE,kBAAkB,IAAI,SAAS;QACnD9E,cAAc,CAAC+E,iCAAiC,CAAC7D,IAAI,CAAC;MACxD;MACArB,iBAAiB,CACd6C,SAAS,CAAC,aAAa,CAAC,CACxBsC,KAAK,CACJ,gEACF,CAAC;MACH;IACF;IACA,IAAI1E,uBAAuB,CAAC,CAAC,EAAE;MAC7B;MACA;MACA,IAAIsE,MAAM,EAAEC,SAAS,KAAK,UAAU,IAAI7E,cAAc,EAAE;QACtDA,cAAc,CAAC+E,iCAAiC,CAC9CH,MAAM,EAAEE,kBAAkB,IAAI,SAChC,CAAC;MACH;MACAhF,aAAa,CAACmF,qBAAqB,CAAC,IAAI,CAAC;MACzCnF,aAAa,CAACoF,YAAY,CAACN,MAAM,EAAEC,SAAS,IAAI,cAAc,CAAC;MAC/D/E,aAAa,CAAC6E,KAAK,CAAC,CAAC;MACrB;IACF;IACA,IAAIhF,QAAQ,CAACY,EAAE,KAAK,SAAS,EAAE;MAC7BT,aAAa,CAACmF,qBAAqB,CAAC,KAAK,CAAC;IAC5C;IACAnF,aAAa,CAACoF,YAAY,CAACN,MAAM,EAAEC,SAAS,IAAI,cAAc,CAAC;IAC/D,IAAID,MAAM,EAAEC,SAAS,KAAK,cAAc,EAAE;MACxC,MAAM3D,IAAI,GAAG0D,MAAM,CAACE,kBAAkB,IAAI,SAAS;MACnDhF,aAAa,CAACiF,iCAAiC,CAAC7D,IAAI,CAAC;IACvD;IACA,IAAI0D,MAAM,EAAEC,SAAS,KAAK,UAAU,IAAID,MAAM,CAACO,uBAAuB,EAAE;MACtErF,aAAa,CAACsF,0BAA0B,CAAC,IAAI,CAAC;IAChD;IACAtF,aAAa,CAAC6E,KAAK,CAAC,CAAC;EACvB,CAAC;;EAED;AACF;AACA;EACEU,IAAI,GAAGA,CAAA,KAAY;IACjB,IAAIf,sBAAsB,CAAC,CAAC,EAAE;MAC5BzE,iBAAiB,CACd6C,SAAS,CAAC,aAAa,CAAC,CACxBsC,KAAK,CAAC,8DAA8D,CAAC;MACxE;IACF;IACAlF,aAAa,CAACuF,IAAI,CAAC,CAAC;EACtB,CAAC;;EAED;AACF;AACA;AACA;EACEC,aAAa,GAAGA,CAAA,KAAYxF,aAAa,CAACwF,aAAa,CAAC,CAAC;;EAEzD;AACF;AACA;AACA;EACEC,gBAAgB,GAAGA,CAAA,KAAczF,aAAa,CAACyF,gBAAgB,CAAC,CAAC;AACnE","ignoreList":[]}
@@ -4,12 +4,46 @@
4
4
  * Internal utils for callingx library usage from video-client.
5
5
  * See @./registerSDKGlobals.ts for more usage details.
6
6
  */
7
- import { Platform } from 'react-native';
7
+ import { NativeModules, Platform } from 'react-native';
8
8
  import { getCallingxLibIfAvailable } from '../../push/libs/callingx';
9
9
  import { waitForAudioSessionActivation } from './audioSessionPromise';
10
10
  import { CallingState, videoLoggerSystem } from '@stream-io/video-client';
11
11
  const CallingxModule = getCallingxLibIfAvailable();
12
12
 
13
+ /**
14
+ * Fallback when Telecom registration fails/times out on Android: no component would own audio
15
+ * (Telecom never took over), so re-establish StreamInCallManager in its classic (non-telecom)
16
+ * mode to keep the call audible.
17
+ */
18
+ function recoverAudioToClassicMode() {
19
+ if (Platform.OS !== 'android') {
20
+ return;
21
+ }
22
+ if (!CallingxModule?.isSetup || !CallingxModule.isTelecomBacked) {
23
+ return;
24
+ }
25
+ // If a call is already registered, Telecom owns audio for it (the registration
26
+ // partially succeeded). Switching to classic mode here would fight Telecom's
27
+ // routing/focus — leave ownership intact.
28
+ if (CallingxModule.hasRegisteredCall()) {
29
+ videoLoggerSystem.getLogger('callingx').debug('recoverAudioToClassicMode: Telecom already owns a registered call; skipping classic fallback');
30
+ return;
31
+ }
32
+ const StreamInCallManagerNativeModule = NativeModules.StreamInCallManager;
33
+ if (!StreamInCallManagerNativeModule) {
34
+ return;
35
+ }
36
+ const logger = videoLoggerSystem.getLogger('callingx');
37
+ logger.warn('Telecom registration failed; falling back to classic StreamInCallManager audio');
38
+ try {
39
+ StreamInCallManagerNativeModule.stop();
40
+ StreamInCallManagerNativeModule.setTelecomManagedMode(false);
41
+ StreamInCallManagerNativeModule.start();
42
+ } catch (error) {
43
+ logger.error('recoverAudioToClassicMode: failed to recover audio', error);
44
+ }
45
+ }
46
+
13
47
  /**
14
48
  * Gets the call display name. To be used for display in native call screen.
15
49
  */
@@ -57,6 +91,7 @@ export async function registerOutgoingCall(call) {
57
91
  );
58
92
  } catch (error) {
59
93
  logger.error(`registerOutgoingCall: Error registering outgoing call in callingx: ${call.cid}`, error);
94
+ recoverAudioToClassicMode();
60
95
  }
61
96
  }
62
97
 
@@ -95,6 +130,7 @@ export async function joinCallingxCall(call, activeCalls) {
95
130
  await startCallInCallingx();
96
131
  } catch (error) {
97
132
  logger.error(`startCallingxCall: Error starting call in callingx: ${call.cid}`, error);
133
+ recoverAudioToClassicMode();
98
134
  }
99
135
  } else if (isIncomingCall) {
100
136
  logger.debug(`joinCallingxCall: Joining incoming call ${call.cid}`);
@@ -127,6 +163,7 @@ export async function joinCallingxCall(call, activeCalls) {
127
163
  }
128
164
  } catch (error) {
129
165
  logger.error(`Error joining incoming call in callingx: ${call.cid}`, error);
166
+ recoverAudioToClassicMode();
130
167
  }
131
168
  }
132
169
  }
@@ -1 +1 @@
1
- {"version":3,"names":["Platform","getCallingxLibIfAvailable","waitForAudioSessionActivation","CallingState","videoLoggerSystem","CallingxModule","getCallDisplayName","callMembers","participants","currentUserId","names","length","flatMap","member","user","id","name","participant","userId","find","sort","join","getCallDisplayNameFromCall","call","state","custom","display_name","members","registerOutgoingCall","isSetup","isOwnTracksLoopbackAllowed","isOutcomingCall","ringing","isCreatedByMe","logger","getLogger","debug","cid","callDisplayName","startCall","createdBy","settings","video","enabled","error","joinCallingxCall","activeCalls","isIncomingCall","startCallInCallingx","OS","isOngoingCallsEnabled","activeCallsToLeave","filter","c","callingState","LEFT","activeCall","leave","reason","catch","e","displayIncomingCall","answerIncomingCall","endCallingxCall","isCallTracked","endCallWithReason"],"sourceRoot":"../../../../../src","sources":["utils/internal/callingx/callingx.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["NativeModules","Platform","getCallingxLibIfAvailable","waitForAudioSessionActivation","CallingState","videoLoggerSystem","CallingxModule","recoverAudioToClassicMode","OS","isSetup","isTelecomBacked","hasRegisteredCall","getLogger","debug","StreamInCallManagerNativeModule","StreamInCallManager","logger","warn","stop","setTelecomManagedMode","start","error","getCallDisplayName","callMembers","participants","currentUserId","names","length","flatMap","member","user","id","name","participant","userId","find","sort","join","getCallDisplayNameFromCall","call","state","custom","display_name","members","registerOutgoingCall","isOwnTracksLoopbackAllowed","isOutcomingCall","ringing","isCreatedByMe","cid","callDisplayName","startCall","createdBy","settings","video","enabled","joinCallingxCall","activeCalls","isIncomingCall","startCallInCallingx","isOngoingCallsEnabled","activeCallsToLeave","filter","c","callingState","LEFT","activeCall","leave","reason","catch","e","displayIncomingCall","answerIncomingCall","endCallingxCall","isCallTracked","endCallWithReason"],"sourceRoot":"../../../../../src","sources":["utils/internal/callingx/callingx.ts"],"mappings":"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","ignoreList":[]}
@@ -29,6 +29,25 @@ const shouldBypassForCallKit = ({
29
29
  const bypass = CallingxModule.isSetup && (isRingingTypeCall || CallingxModule.isOngoingCallsEnabled);
30
30
  return bypass;
31
31
  };
32
+
33
+ /**
34
+ * On Android, when the call is registered with the Telecom stack (via CallingX),
35
+ * routing/focus/mode must be owned by Telecom (per Android guidance we must not use
36
+ * AudioManager.setCommunicationDevice / startBluetoothSco). Unlike iOS, we do NOT skip
37
+ * StreamInCallManager entirely — Telecom provides no proximity/keep-screen-on — instead we
38
+ * run it in "telecom-managed" mode where it only keeps proximity/keep-screen-on/mute.
39
+ */
40
+ const isAndroidTelecomManaged = ({
41
+ isRingingTypeCall
42
+ }) => {
43
+ if (Platform.OS !== 'android') {
44
+ return false;
45
+ }
46
+ if (!CallingxModule) {
47
+ return false;
48
+ }
49
+ return CallingxModule.isSetup && CallingxModule.isTelecomBacked && (isRingingTypeCall || CallingxModule.isOngoingCallsEnabled);
50
+ };
32
51
  const streamRNVideoSDKGlobals = {
33
52
  callingX: {
34
53
  joinCall: joinCallingxCall,
@@ -47,6 +66,19 @@ const streamRNVideoSDKGlobals = {
47
66
  CallingxModule?.setDefaultAudioDeviceEndpointType(defaultDevice);
48
67
  return;
49
68
  }
69
+ if (isAndroidTelecomManaged({
70
+ isRingingTypeCall
71
+ })) {
72
+ // Telecom owns routing; forward the sticky preference to callingx and run the
73
+ // in-call manager in telecom-managed mode (proximity/keep-screen-on only).
74
+ CallingxModule?.setDefaultAudioDeviceEndpointType(defaultDevice);
75
+ StreamInCallManagerNativeModule.setTelecomManagedMode(true);
76
+ StreamInCallManagerNativeModule.setup();
77
+ return;
78
+ }
79
+ if (Platform.OS === 'android') {
80
+ StreamInCallManagerNativeModule.setTelecomManagedMode(false);
81
+ }
50
82
  StreamInCallManagerNativeModule.setDefaultAudioDeviceEndpointType(defaultDevice);
51
83
  StreamInCallManagerNativeModule.setup();
52
84
  },
@@ -58,6 +90,8 @@ const streamRNVideoSDKGlobals = {
58
90
  })) {
59
91
  return;
60
92
  }
93
+ // Android telecom-managed calls still start (for proximity/keep-screen-on);
94
+ // the native side skips routing/focus internally.
61
95
  StreamInCallManagerNativeModule.start();
62
96
  },
63
97
  stop: ({
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","PermissionsAndroid","Platform","AudioDeviceModule","AudioEngineMuteMode","audioDeviceModuleEvents","getCallingxLibIfAvailable","endCallingxCall","registerOutgoingCall","joinCallingxCall","StreamInCallManagerNativeModule","StreamInCallManager","StreamVideoReactNativeModule","StreamVideoReactNative","CallingxModule","shouldBypassForCallKit","isRingingTypeCall","OS","bypass","isSetup","isOngoingCallsEnabled","streamRNVideoSDKGlobals","callingX","joinCall","endCall","callManager","setup","defaultDevice","setDefaultAudioDeviceEndpointType","start","stop","setMutedRecordingPrepared","enabled","setMuteMode","VoiceProcessing","catch","setRecordingAlwaysPreparedMode","permissions","check","permission","nativeAndroidPermission","PERMISSIONS","CAMERA","RECORD_AUDIO","Boolean","checkPermission","nativeEvents","speechActivity","subscribe","cb","subscription","addSpeechActivityListener","data","isSoundDetected","event","remove","registerSDKGlobals","globalThis","streamRNVideoSDK"],"sourceRoot":"../../../../src","sources":["utils/internal/registerSDKGlobals.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["NativeModules","PermissionsAndroid","Platform","AudioDeviceModule","AudioEngineMuteMode","audioDeviceModuleEvents","getCallingxLibIfAvailable","endCallingxCall","registerOutgoingCall","joinCallingxCall","StreamInCallManagerNativeModule","StreamInCallManager","StreamVideoReactNativeModule","StreamVideoReactNative","CallingxModule","shouldBypassForCallKit","isRingingTypeCall","OS","bypass","isSetup","isOngoingCallsEnabled","isAndroidTelecomManaged","isTelecomBacked","streamRNVideoSDKGlobals","callingX","joinCall","endCall","callManager","setup","defaultDevice","setDefaultAudioDeviceEndpointType","setTelecomManagedMode","start","stop","setMutedRecordingPrepared","enabled","setMuteMode","VoiceProcessing","catch","setRecordingAlwaysPreparedMode","permissions","check","permission","nativeAndroidPermission","PERMISSIONS","CAMERA","RECORD_AUDIO","Boolean","checkPermission","nativeEvents","speechActivity","subscribe","cb","subscription","addSpeechActivityListener","data","isSoundDetected","event","remove","registerSDKGlobals","globalThis","streamRNVideoSDK"],"sourceRoot":"../../../../src","sources":["utils/internal/registerSDKGlobals.ts"],"mappings":"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","ignoreList":[]}
@@ -97,116 +97,114 @@ export const firebaseDataHandler = async data => {
97
97
  }
98
98
  const asForegroundService = canListenToWS();
99
99
  if (asForegroundService) {
100
- // Listen to call events from WS through fg service
101
- // note: this will replace the current empty fg service runner
102
- //we need to start service (e.g. by calling display incoming call) and than launch bg task, consider making those steps independent
103
- await callingx.startBackgroundTask((_, stopTask) => {
104
- return new Promise(resolve => {
105
- const finishBackgroundTask = () => {
106
- callingx.log(`Finishing background task for callCid: ${call_cid}`, 'debug');
107
- resolve(undefined);
108
- stopTask();
109
- };
110
- (async () => {
111
- try {
112
- const _client = await pushConfig.createStreamVideoClient();
113
- if (!_client) {
114
- logger.debug(`Closing fg service as there is no client to create from push config`);
115
- finishBackgroundTask();
116
- return;
117
- }
118
- const callFromPush = await _client.onRingingCall(call_cid);
119
- const {
120
- mustEndCall,
121
- endCallReason
122
- } = shouldCallBeClosed(callFromPush, data);
123
- if (mustEndCall) {
124
- logger.debug(`Closing fg service callCid: ${call_cid} endCallReason: ${endCallReason}`);
125
- callingx.log(`Ending call with callCid: ${call_cid} endCallReason: ${endCallReason}`, 'debug');
126
- callingx.endCallWithReason(call_cid, endCallReason);
127
- callFromPush.leave({
128
- reject: false
129
- }).catch(error => {
130
- logger.error(`Failed to leave already-ended ringing call ${call_cid}: ${error}`);
131
- });
132
- resolve(undefined);
133
- return;
134
- }
135
- const unsubscribeFunctions = [];
136
- // check if service needs to be closed if accept/decline event was done on another device
137
- const unsubscribe = callFromPush.on('all', event => {
138
- const _canListenToWS = canListenToWS();
139
- if (!_canListenToWS) {
140
- logger.debug(`Closing fg service from event callCid: ${call_cid} canListenToWS: ${_canListenToWS}`, {
141
- event
142
- });
143
- unsubscribeFunctions.forEach(fn => fn());
144
- finishBackgroundTask();
145
- return;
146
- }
147
- const {
148
- mustEndCall: mustEndCallFromEvent,
149
- endCallReason: endCallReasonFromEvent
150
- } = shouldCallBeClosed(callFromPush, data);
151
- if (mustEndCallFromEvent) {
152
- logger.debug(`Closing fg service from event callCid: ${call_cid} canListenToWS: ${_canListenToWS} shouldCallBeClosed`, {
153
- event
154
- });
155
- unsubscribeFunctions.forEach(fn => fn());
156
- callingx.endCallWithReason(call_cid, endCallReasonFromEvent);
157
- resolve(undefined);
158
- }
159
- });
160
-
161
- // check if service needs to be closed if call was left
162
- const stateSubscription = callFromPush.state.callingState$.subscribe(callingState => {
163
- if (callingState === CallingState.IDLE || callingState === CallingState.LEFT) {
164
- logger.debug(`Closing fg service from callingState callCid: ${call_cid} callingState: ${callingState}`);
165
- unsubscribeFunctions.forEach(fn => fn());
166
- callingx.log(`Ending call with callCid: ${call_cid} callingState: ${callingState}`, 'debug');
167
- resolve(undefined);
168
- }
100
+ // Listen to call events from WS with headless task, bound to call service.
101
+ // By this moment the call service is already running, so we can acquire the background task.
102
+ const backgroundTaskOwner = `push:${call_cid}`;
103
+ await callingx.acquireBackgroundTask(backgroundTaskOwner).catch(e => {
104
+ logger.error(`Failed to acquire background task for callCid: ${call_cid} error: ${e}`);
105
+ });
106
+ const finishBackgroundTask = () => {
107
+ callingx.log(`Finishing background task for callCid: ${call_cid}`, 'debug');
108
+ callingx.releaseBackgroundTask(backgroundTaskOwner);
109
+ };
110
+ (async () => {
111
+ try {
112
+ const _client = await pushConfig.createStreamVideoClient();
113
+ if (!_client) {
114
+ logger.debug(`Closing fg service as there is no client to create from push config`);
115
+ finishBackgroundTask();
116
+ return;
117
+ }
118
+ const callFromPush = await _client.onRingingCall(call_cid);
119
+ const {
120
+ mustEndCall,
121
+ endCallReason
122
+ } = shouldCallBeClosed(callFromPush, data);
123
+ if (mustEndCall) {
124
+ logger.debug(`Closing fg service callCid: ${call_cid} endCallReason: ${endCallReason}`);
125
+ callingx.log(`Ending call with callCid: ${call_cid} endCallReason: ${endCallReason}`, 'debug');
126
+ callingx.endCallWithReason(call_cid, endCallReason);
127
+ callFromPush.leave({
128
+ reject: false
129
+ }).catch(error => {
130
+ logger.error(`Failed to leave already-ended ringing call ${call_cid}: ${error}`);
131
+ });
132
+ finishBackgroundTask();
133
+ return;
134
+ }
135
+ const unsubscribeFunctions = [];
136
+ // check if service needs to be closed if accept/decline event was done on another device
137
+ const unsubscribe = callFromPush.on('all', event => {
138
+ const _canListenToWS = canListenToWS();
139
+ if (!_canListenToWS) {
140
+ logger.debug(`Closing fg service from event callCid: ${call_cid} canListenToWS: ${_canListenToWS}`, {
141
+ event
169
142
  });
170
- const endCallSubscription = callingx.addEventListener('endCall', async ({
171
- callId
172
- }) => {
173
- unsubscribeFunctions.forEach(fn => fn());
174
- try {
175
- await callFromPush.leave({
176
- reject: callFromPush.state.callingState === CallingState.RINGING,
177
- reason: 'decline'
178
- });
179
- } catch (error) {
180
- logger.error(`Failed to leave call with callCid: ${call_cid} error: ${error}`);
181
- } finally {
182
- callingx.log(`Ending call with callCid: ${call_cid} callId: ${callId}`, 'debug');
183
- resolve(undefined);
184
- }
143
+ unsubscribeFunctions.forEach(fn => fn());
144
+ finishBackgroundTask();
145
+ return;
146
+ }
147
+ const {
148
+ mustEndCall: mustEndCallFromEvent,
149
+ endCallReason: endCallReasonFromEvent
150
+ } = shouldCallBeClosed(callFromPush, data);
151
+ if (mustEndCallFromEvent) {
152
+ logger.debug(`Closing fg service from event callCid: ${call_cid} canListenToWS: ${_canListenToWS} shouldCallBeClosed`, {
153
+ event
185
154
  });
155
+ unsubscribeFunctions.forEach(fn => fn());
156
+ callingx.endCallWithReason(call_cid, endCallReasonFromEvent);
157
+ finishBackgroundTask();
158
+ }
159
+ });
186
160
 
187
- //stop background task when app comes to foreground
188
- const appStateSubscription = AppState.addEventListener('change', nextAppState => {
189
- const _canListenToWS = canListenToWS();
190
- callingx.log(`AppState changed to: ${nextAppState} for callCid: ${call_cid} canListenToWS: ${_canListenToWS}`, 'debug');
191
- if (!_canListenToWS) {
192
- unsubscribeFunctions.forEach(fn => fn());
193
- finishBackgroundTask();
194
- return;
195
- }
161
+ // check if service needs to be closed if call was left
162
+ const stateSubscription = callFromPush.state.callingState$.subscribe(callingState => {
163
+ if (callingState === CallingState.IDLE || callingState === CallingState.LEFT) {
164
+ logger.debug(`Closing fg service from callingState callCid: ${call_cid} callingState: ${callingState}`);
165
+ unsubscribeFunctions.forEach(fn => fn());
166
+ callingx.log(`Ending call with callCid: ${call_cid} callingState: ${callingState}`, 'debug');
167
+ finishBackgroundTask();
168
+ }
169
+ });
170
+ const endCallSubscription = callingx.addEventListener('endCall', async ({
171
+ callId
172
+ }) => {
173
+ unsubscribeFunctions.forEach(fn => fn());
174
+ try {
175
+ await callFromPush.leave({
176
+ reject: callFromPush.state.callingState === CallingState.RINGING,
177
+ reason: 'decline'
196
178
  });
197
- unsubscribeFunctions.push(unsubscribe);
198
- unsubscribeFunctions.push(() => stateSubscription.unsubscribe());
199
- unsubscribeFunctions.push(() => endCallSubscription.remove());
200
- unsubscribeFunctions.push(() => appStateSubscription.remove());
201
- pushUnsubscriptionCallbacks.get(call_cid)?.forEach(cb => cb());
202
- pushUnsubscriptionCallbacks.set(call_cid, unsubscribeFunctions);
203
179
  } catch (error) {
204
- callingx.log(`Failed to start background task with callCid: ${call_cid} error: ${error}`, 'error');
180
+ logger.error(`Failed to leave call with callCid: ${call_cid} error: ${error}`);
181
+ } finally {
182
+ callingx.log(`Ending call with callCid: ${call_cid} callId: ${callId}`, 'debug');
205
183
  finishBackgroundTask();
206
184
  }
207
- })();
208
- });
209
- });
185
+ });
186
+
187
+ //stop background task when app comes to foreground
188
+ const appStateSubscription = AppState.addEventListener('change', nextAppState => {
189
+ const _canListenToWS = canListenToWS();
190
+ callingx.log(`AppState changed to: ${nextAppState} for callCid: ${call_cid} canListenToWS: ${_canListenToWS}`, 'debug');
191
+ if (!_canListenToWS) {
192
+ unsubscribeFunctions.forEach(fn => fn());
193
+ finishBackgroundTask();
194
+ return;
195
+ }
196
+ });
197
+ unsubscribeFunctions.push(unsubscribe);
198
+ unsubscribeFunctions.push(() => stateSubscription.unsubscribe());
199
+ unsubscribeFunctions.push(() => endCallSubscription.remove());
200
+ unsubscribeFunctions.push(() => appStateSubscription.remove());
201
+ pushUnsubscriptionCallbacks.get(call_cid)?.forEach(cb => cb());
202
+ pushUnsubscriptionCallbacks.set(call_cid, unsubscribeFunctions);
203
+ } catch (error) {
204
+ callingx.log(`Failed to start background task with callCid: ${call_cid} error: ${error}`, 'error');
205
+ finishBackgroundTask();
206
+ }
207
+ })();
210
208
  }
211
209
  if (asForegroundService) {
212
210
  // no need to check if call has be closed as that will be handled by the fg service