@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.
- package/CHANGELOG.md +18 -2
- package/android/src/main/java/com/streamvideo/reactnative/audio/AudioDeviceManager.kt +45 -16
- package/android/src/main/java/com/streamvideo/reactnative/callmanager/StreamInCallManagerModule.kt +12 -0
- package/dist/commonjs/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js +1 -1
- package/dist/commonjs/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js.map +1 -1
- package/dist/commonjs/hooks/useAndroidKeepCallAliveEffect.js +36 -4
- package/dist/commonjs/hooks/useAndroidKeepCallAliveEffect.js.map +1 -1
- package/dist/commonjs/modules/call-manager/CallManager.js +133 -1
- package/dist/commonjs/modules/call-manager/CallManager.js.map +1 -1
- package/dist/commonjs/utils/internal/callingx/callingx.js +37 -0
- package/dist/commonjs/utils/internal/callingx/callingx.js.map +1 -1
- package/dist/commonjs/utils/internal/registerSDKGlobals.js +34 -0
- package/dist/commonjs/utils/internal/registerSDKGlobals.js.map +1 -1
- package/dist/commonjs/utils/push/android.js +101 -103
- package/dist/commonjs/utils/push/android.js.map +1 -1
- package/dist/commonjs/utils/push/libs/callingx.js +3 -0
- package/dist/commonjs/utils/push/libs/callingx.js.map +1 -1
- package/dist/commonjs/version.js +1 -1
- package/dist/module/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js +2 -2
- package/dist/module/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.js.map +1 -1
- package/dist/module/hooks/useAndroidKeepCallAliveEffect.js +36 -4
- package/dist/module/hooks/useAndroidKeepCallAliveEffect.js.map +1 -1
- package/dist/module/modules/call-manager/CallManager.js +133 -1
- package/dist/module/modules/call-manager/CallManager.js.map +1 -1
- package/dist/module/utils/internal/callingx/callingx.js +38 -1
- package/dist/module/utils/internal/callingx/callingx.js.map +1 -1
- package/dist/module/utils/internal/registerSDKGlobals.js +34 -0
- package/dist/module/utils/internal/registerSDKGlobals.js.map +1 -1
- package/dist/module/utils/push/android.js +101 -103
- package/dist/module/utils/push/android.js.map +1 -1
- package/dist/module/utils/push/libs/callingx.js +3 -0
- package/dist/module/utils/push/libs/callingx.js.map +1 -1
- package/dist/module/version.js +1 -1
- package/dist/typescript/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.d.ts.map +1 -1
- package/dist/typescript/hooks/useAndroidKeepCallAliveEffect.d.ts.map +1 -1
- package/dist/typescript/modules/call-manager/CallManager.d.ts.map +1 -1
- package/dist/typescript/utils/StreamVideoRN/types.d.ts +5 -0
- package/dist/typescript/utils/StreamVideoRN/types.d.ts.map +1 -1
- package/dist/typescript/utils/internal/callingx/callingx.d.ts.map +1 -1
- package/dist/typescript/utils/internal/registerSDKGlobals.d.ts.map +1 -1
- package/dist/typescript/utils/push/android.d.ts.map +1 -1
- package/dist/typescript/utils/push/libs/callingx.d.ts.map +1 -1
- package/dist/typescript/version.d.ts +1 -1
- package/expo-config-plugin/dist/index.js +0 -2
- package/package.json +6 -10
- package/src/components/Participant/ParticipantView/VideoRenderer/TrackSubscriber.tsx +3 -2
- package/src/hooks/useAndroidKeepCallAliveEffect.ts +54 -10
- package/src/modules/call-manager/CallManager.ts +162 -1
- package/src/modules/call-manager/native-module.d.ts +8 -0
- package/src/utils/StreamVideoRN/types.ts +5 -0
- package/src/utils/internal/callingx/callingx.ts +44 -1
- package/src/utils/internal/registerSDKGlobals.ts +38 -0
- package/src/utils/push/android.ts +141 -140
- package/src/utils/push/libs/callingx.ts +4 -0
- package/src/version.ts +1 -1
- 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
|
-
|
|
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","
|
|
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":"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","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","
|
|
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":";;AACA,SAASA,aAAa,EAAEC,kBAAkB,EAAEC,QAAQ,QAAQ,cAAc;AAC1E,SACEC,iBAAiB,EACjBC,mBAAmB,EACnBC,uBAAuB,QAClB,gCAAgC;AACvC,SAASC,yBAAyB,QAAQ,uBAAuB;AACjE,SACEC,eAAe,EACfC,oBAAoB,EACpBC,gBAAgB,QACX,qBAAqB;AAE5B,MAAMC,+BAA+B,GAAGV,aAAa,CAACW,mBAAmB;AACzE,MAAMC,4BAA4B,GAAGZ,aAAa,CAACa,sBAElD;AAED,MAAMC,cAAc,GAAGR,yBAAyB,CAAC,CAAC;;AAElD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMS,sBAAsB,GAAGA,CAAC;EAC9BC;AAGF,CAAC,KAAc;EACb,IAAId,QAAQ,CAACe,EAAE,KAAK,KAAK,EAAE;IACzB,OAAO,KAAK;EACd;EACA,IAAI,CAACH,cAAc,EAAE;IACnB,OAAO,KAAK;EACd;EACA,MAAMI,MAAM,GACVJ,cAAc,CAACK,OAAO,KACrBH,iBAAiB,IAAIF,cAAc,CAACM,qBAAqB,CAAC;EAC7D,OAAOF,MAAM;AACf,CAAC;AAED,MAAMG,uBAAgD,GAAG;EACvDC,QAAQ,EAAE;IACRC,QAAQ,
|
|
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
|
|
101
|
-
//
|
|
102
|
-
|
|
103
|
-
await callingx.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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
|
-
|
|
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
|