@stream-io/video-react-native-sdk 1.31.1 → 1.32.0
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 +14 -0
- package/android/src/main/AndroidManifest.xml +8 -1
- package/android/src/main/AndroidManifestNew.xml +11 -0
- package/android/src/main/java/com/streamvideo/reactnative/StreamVideoReactNativeModule.kt +42 -5
- package/android/src/main/java/com/streamvideo/reactnative/audio/utils/WebRtcAudioUtils.kt +70 -6
- package/android/src/main/java/com/streamvideo/reactnative/callmanager/StreamInCallManagerModule.kt +6 -4
- package/android/src/main/java/com/streamvideo/reactnative/keepalive/KeepAliveNotification.kt +83 -0
- package/android/src/main/java/com/streamvideo/reactnative/keepalive/StreamCallKeepAliveHeadlessService.kt +149 -0
- package/dist/commonjs/hooks/push/index.js +0 -2
- package/dist/commonjs/hooks/push/index.js.map +1 -1
- package/dist/commonjs/hooks/push/useCallingExpWithCallingStateEffect.js +146 -0
- package/dist/commonjs/hooks/push/useCallingExpWithCallingStateEffect.js.map +1 -0
- package/dist/commonjs/hooks/push/useIosVoipPushEventsSetupEffect.js +18 -31
- package/dist/commonjs/hooks/push/useIosVoipPushEventsSetupEffect.js.map +1 -1
- package/dist/commonjs/hooks/useAndroidKeepCallAliveEffect.js +41 -106
- package/dist/commonjs/hooks/useAndroidKeepCallAliveEffect.js.map +1 -1
- package/dist/commonjs/index.js +1 -0
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/modules/call-manager/CallManager.js +26 -0
- package/dist/commonjs/modules/call-manager/CallManager.js.map +1 -1
- package/dist/commonjs/providers/StreamCall/index.js +6 -6
- package/dist/commonjs/providers/StreamCall/index.js.map +1 -1
- package/dist/commonjs/utils/StreamVideoRN/index.js +35 -21
- package/dist/commonjs/utils/StreamVideoRN/index.js.map +1 -1
- package/dist/commonjs/utils/internal/callingx/audioSessionPromise.js +68 -0
- package/dist/commonjs/utils/internal/callingx/audioSessionPromise.js.map +1 -0
- package/dist/commonjs/utils/internal/callingx/callingx.js +150 -0
- package/dist/commonjs/utils/internal/callingx/callingx.js.map +1 -0
- package/dist/commonjs/utils/internal/registerSDKGlobals.js +53 -3
- package/dist/commonjs/utils/internal/registerSDKGlobals.js.map +1 -1
- package/dist/commonjs/utils/keepCallAliveHeadlessTask.js +48 -0
- package/dist/commonjs/utils/keepCallAliveHeadlessTask.js.map +1 -0
- package/dist/commonjs/utils/push/android.js +135 -202
- package/dist/commonjs/utils/push/android.js.map +1 -1
- package/dist/commonjs/utils/push/internal/ios.js +17 -34
- package/dist/commonjs/utils/push/internal/ios.js.map +1 -1
- package/dist/commonjs/utils/push/internal/rxSubjects.js +1 -45
- package/dist/commonjs/utils/push/internal/rxSubjects.js.map +1 -1
- package/dist/commonjs/utils/push/internal/utils.js +71 -53
- package/dist/commonjs/utils/push/internal/utils.js.map +1 -1
- package/dist/commonjs/utils/push/ios.js.map +1 -1
- package/dist/commonjs/utils/push/libs/callingx.js +75 -0
- package/dist/commonjs/utils/push/libs/callingx.js.map +1 -0
- package/dist/commonjs/utils/push/libs/index.js +8 -19
- package/dist/commonjs/utils/push/libs/index.js.map +1 -1
- package/dist/commonjs/utils/push/libs/notifee/index.js +0 -23
- package/dist/commonjs/utils/push/libs/notifee/index.js.map +1 -1
- package/dist/commonjs/utils/push/setupCallingExpEvents.js +105 -0
- package/dist/commonjs/utils/push/setupCallingExpEvents.js.map +1 -0
- package/dist/commonjs/utils/push/setupIosVoipPushEvents.js +7 -6
- package/dist/commonjs/utils/push/setupIosVoipPushEvents.js.map +1 -1
- package/dist/commonjs/version.js +1 -1
- package/dist/module/hooks/push/index.js +0 -2
- package/dist/module/hooks/push/index.js.map +1 -1
- package/dist/module/hooks/push/useCallingExpWithCallingStateEffect.js +139 -0
- package/dist/module/hooks/push/useCallingExpWithCallingStateEffect.js.map +1 -0
- package/dist/module/hooks/push/useIosVoipPushEventsSetupEffect.js +18 -31
- package/dist/module/hooks/push/useIosVoipPushEventsSetupEffect.js.map +1 -1
- package/dist/module/hooks/useAndroidKeepCallAliveEffect.js +42 -107
- package/dist/module/hooks/useAndroidKeepCallAliveEffect.js.map +1 -1
- package/dist/module/index.js +1 -0
- package/dist/module/index.js.map +1 -1
- package/dist/module/modules/call-manager/CallManager.js +26 -0
- package/dist/module/modules/call-manager/CallManager.js.map +1 -1
- package/dist/module/providers/StreamCall/index.js +6 -6
- package/dist/module/providers/StreamCall/index.js.map +1 -1
- package/dist/module/utils/StreamVideoRN/index.js +35 -21
- package/dist/module/utils/StreamVideoRN/index.js.map +1 -1
- package/dist/module/utils/internal/callingx/audioSessionPromise.js +61 -0
- package/dist/module/utils/internal/callingx/audioSessionPromise.js.map +1 -0
- package/dist/module/utils/internal/callingx/callingx.js +140 -0
- package/dist/module/utils/internal/callingx/callingx.js.map +1 -0
- package/dist/module/utils/internal/registerSDKGlobals.js +53 -3
- package/dist/module/utils/internal/registerSDKGlobals.js.map +1 -1
- package/dist/module/utils/keepCallAliveHeadlessTask.js +42 -0
- package/dist/module/utils/keepCallAliveHeadlessTask.js.map +1 -0
- package/dist/module/utils/push/android.js +137 -204
- package/dist/module/utils/push/android.js.map +1 -1
- package/dist/module/utils/push/internal/ios.js +17 -34
- package/dist/module/utils/push/internal/ios.js.map +1 -1
- package/dist/module/utils/push/internal/rxSubjects.js +0 -44
- package/dist/module/utils/push/internal/rxSubjects.js.map +1 -1
- package/dist/module/utils/push/internal/utils.js +67 -50
- package/dist/module/utils/push/internal/utils.js.map +1 -1
- package/dist/module/utils/push/ios.js.map +1 -1
- package/dist/module/utils/push/libs/callingx.js +67 -0
- package/dist/module/utils/push/libs/callingx.js.map +1 -0
- package/dist/module/utils/push/libs/index.js +1 -2
- package/dist/module/utils/push/libs/index.js.map +1 -1
- package/dist/module/utils/push/libs/notifee/index.js +0 -21
- package/dist/module/utils/push/libs/notifee/index.js.map +1 -1
- package/dist/module/utils/push/setupCallingExpEvents.js +99 -0
- package/dist/module/utils/push/setupCallingExpEvents.js.map +1 -0
- package/dist/module/utils/push/setupIosVoipPushEvents.js +7 -6
- package/dist/module/utils/push/setupIosVoipPushEvents.js.map +1 -1
- package/dist/module/version.js +1 -1
- package/dist/typescript/hooks/push/index.d.ts.map +1 -1
- package/dist/typescript/hooks/push/useCallingExpWithCallingStateEffect.d.ts +5 -0
- package/dist/typescript/hooks/push/useCallingExpWithCallingStateEffect.d.ts.map +1 -0
- package/dist/typescript/hooks/push/useIosVoipPushEventsSetupEffect.d.ts.map +1 -1
- package/dist/typescript/hooks/useAndroidKeepCallAliveEffect.d.ts.map +1 -1
- package/dist/typescript/index.d.ts +1 -0
- package/dist/typescript/index.d.ts.map +1 -1
- package/dist/typescript/modules/call-manager/CallManager.d.ts +5 -0
- package/dist/typescript/modules/call-manager/CallManager.d.ts.map +1 -1
- package/dist/typescript/utils/StreamVideoRN/index.d.ts +22 -2
- package/dist/typescript/utils/StreamVideoRN/index.d.ts.map +1 -1
- package/dist/typescript/utils/StreamVideoRN/types.d.ts +59 -25
- package/dist/typescript/utils/StreamVideoRN/types.d.ts.map +1 -1
- package/dist/typescript/utils/internal/callingx/audioSessionPromise.d.ts +16 -0
- package/dist/typescript/utils/internal/callingx/audioSessionPromise.d.ts.map +1 -0
- package/dist/typescript/utils/internal/callingx/callingx.d.ts +18 -0
- package/dist/typescript/utils/internal/callingx/callingx.d.ts.map +1 -0
- package/dist/typescript/utils/internal/registerSDKGlobals.d.ts.map +1 -1
- package/dist/typescript/utils/keepCallAliveHeadlessTask.d.ts +10 -0
- package/dist/typescript/utils/keepCallAliveHeadlessTask.d.ts.map +1 -0
- package/dist/typescript/utils/push/android.d.ts +1 -2
- package/dist/typescript/utils/push/android.d.ts.map +1 -1
- package/dist/typescript/utils/push/internal/ios.d.ts.map +1 -1
- package/dist/typescript/utils/push/internal/rxSubjects.d.ts +0 -33
- package/dist/typescript/utils/push/internal/rxSubjects.d.ts.map +1 -1
- package/dist/typescript/utils/push/internal/utils.d.ts +14 -8
- package/dist/typescript/utils/push/internal/utils.d.ts.map +1 -1
- package/dist/typescript/utils/push/ios.d.ts +1 -2
- package/dist/typescript/utils/push/ios.d.ts.map +1 -1
- package/dist/typescript/utils/push/libs/callingx.d.ts +9 -0
- package/dist/typescript/utils/push/libs/callingx.d.ts.map +1 -0
- package/dist/typescript/utils/push/libs/index.d.ts +1 -2
- package/dist/typescript/utils/push/libs/index.d.ts.map +1 -1
- package/dist/typescript/utils/push/libs/notifee/index.d.ts +0 -2
- package/dist/typescript/utils/push/libs/notifee/index.d.ts.map +1 -1
- package/dist/typescript/utils/push/setupCallingExpEvents.d.ts +8 -0
- package/dist/typescript/utils/push/setupCallingExpEvents.d.ts.map +1 -0
- package/dist/typescript/utils/push/setupIosVoipPushEvents.d.ts.map +1 -1
- package/dist/typescript/version.d.ts +1 -1
- package/expo-config-plugin/dist/withAndroidManifest.js +1 -33
- package/expo-config-plugin/dist/withAndroidPermissions.js +2 -7
- package/expo-config-plugin/dist/withAppDelegate.js +19 -197
- package/expo-config-plugin/dist/withMainActivity.js +1 -1
- package/expo-config-plugin/dist/withiOSInfoPlist.js +2 -3
- package/ios/StreamInCallManager.m +2 -0
- package/ios/StreamInCallManager.swift +19 -7
- package/ios/StreamVideoReactNative-Bridging-Header.h +3 -1
- package/ios/StreamVideoReactNative.h +7 -4
- package/ios/StreamVideoReactNative.m +199 -84
- package/package.json +11 -16
- package/src/hooks/push/index.ts +0 -2
- package/src/hooks/push/useCallingExpWithCallingStateEffect.ts +193 -0
- package/src/hooks/push/useIosVoipPushEventsSetupEffect.ts +21 -34
- package/src/hooks/useAndroidKeepCallAliveEffect.ts +63 -129
- package/src/index.ts +1 -0
- package/src/modules/call-manager/CallManager.ts +36 -0
- package/src/modules/call-manager/native-module.d.ts +7 -0
- package/src/providers/StreamCall/index.tsx +6 -6
- package/src/utils/StreamVideoRN/index.ts +42 -30
- package/src/utils/StreamVideoRN/types.ts +61 -25
- package/src/utils/internal/callingx/audioSessionPromise.ts +65 -0
- package/src/utils/internal/callingx/callingx.ts +197 -0
- package/src/utils/internal/registerSDKGlobals.ts +52 -4
- package/src/utils/keepCallAliveHeadlessTask.ts +54 -0
- package/src/utils/push/android.ts +198 -311
- package/src/utils/push/internal/ios.ts +28 -44
- package/src/utils/push/internal/rxSubjects.ts +0 -61
- package/src/utils/push/internal/utils.ts +108 -64
- package/src/utils/push/ios.ts +1 -6
- package/src/utils/push/libs/callingx.ts +89 -0
- package/src/utils/push/libs/index.ts +1 -2
- package/src/utils/push/libs/notifee/index.ts +0 -31
- package/src/utils/push/setupCallingExpEvents.ts +135 -0
- package/src/utils/push/setupIosVoipPushEvents.ts +11 -7
- package/src/version.ts +1 -1
- package/android/src/main/java/com/streamvideo/reactnative/util/CallAliveServiceChecker.kt +0 -95
- package/dist/commonjs/hooks/push/useIosCallkeepWithCallingStateEffect.js +0 -160
- package/dist/commonjs/hooks/push/useIosCallkeepWithCallingStateEffect.js.map +0 -1
- package/dist/commonjs/hooks/push/useProcessPushCallEffect.js +0 -67
- package/dist/commonjs/hooks/push/useProcessPushCallEffect.js.map +0 -1
- package/dist/commonjs/utils/push/libs/callkeep.js +0 -17
- package/dist/commonjs/utils/push/libs/callkeep.js.map +0 -1
- package/dist/commonjs/utils/push/libs/voipPushNotification.js +0 -17
- package/dist/commonjs/utils/push/libs/voipPushNotification.js.map +0 -1
- package/dist/commonjs/utils/push/setupIosCallKeepEvents.js +0 -205
- package/dist/commonjs/utils/push/setupIosCallKeepEvents.js.map +0 -1
- package/dist/module/hooks/push/useIosCallkeepWithCallingStateEffect.js +0 -153
- package/dist/module/hooks/push/useIosCallkeepWithCallingStateEffect.js.map +0 -1
- package/dist/module/hooks/push/useProcessPushCallEffect.js +0 -60
- package/dist/module/hooks/push/useProcessPushCallEffect.js.map +0 -1
- package/dist/module/utils/push/libs/callkeep.js +0 -11
- package/dist/module/utils/push/libs/callkeep.js.map +0 -1
- package/dist/module/utils/push/libs/voipPushNotification.js +0 -11
- package/dist/module/utils/push/libs/voipPushNotification.js.map +0 -1
- package/dist/module/utils/push/setupIosCallKeepEvents.js +0 -199
- package/dist/module/utils/push/setupIosCallKeepEvents.js.map +0 -1
- package/dist/typescript/hooks/push/useIosCallkeepWithCallingStateEffect.d.ts +0 -5
- package/dist/typescript/hooks/push/useIosCallkeepWithCallingStateEffect.d.ts.map +0 -1
- package/dist/typescript/hooks/push/useProcessPushCallEffect.d.ts +0 -8
- package/dist/typescript/hooks/push/useProcessPushCallEffect.d.ts.map +0 -1
- package/dist/typescript/utils/push/libs/callkeep.d.ts +0 -3
- package/dist/typescript/utils/push/libs/callkeep.d.ts.map +0 -1
- package/dist/typescript/utils/push/libs/voipPushNotification.d.ts +0 -3
- package/dist/typescript/utils/push/libs/voipPushNotification.d.ts.map +0 -1
- package/dist/typescript/utils/push/setupIosCallKeepEvents.d.ts +0 -6
- package/dist/typescript/utils/push/setupIosCallKeepEvents.d.ts.map +0 -1
- package/src/hooks/push/useIosCallkeepWithCallingStateEffect.ts +0 -235
- package/src/hooks/push/useProcessPushCallEffect.ts +0 -108
- package/src/utils/push/libs/callkeep.ts +0 -16
- package/src/utils/push/libs/voipPushNotification.ts +0 -17
- package/src/utils/push/setupIosCallKeepEvents.ts +0 -252
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { type MutableRefObject, useEffect, useRef, useState } from 'react';
|
|
2
|
-
import { getVoipPushNotificationLib } from '../../utils/push/libs';
|
|
3
|
-
|
|
4
2
|
import { Platform } from 'react-native';
|
|
5
3
|
import { StreamVideoRN } from '../../utils';
|
|
6
4
|
import { onVoipNotificationReceived } from '../../utils/push/internal/ios';
|
|
@@ -10,6 +8,7 @@ import {
|
|
|
10
8
|
} from '@stream-io/video-react-bindings';
|
|
11
9
|
import { setPushLogoutCallback } from '../../utils/internal/pushLogoutCallback';
|
|
12
10
|
import { StreamVideoClient, videoLoggerSystem } from '@stream-io/video-client';
|
|
11
|
+
import { getCallingxLibIfAvailable } from '../../utils/push/libs';
|
|
13
12
|
|
|
14
13
|
const logger = videoLoggerSystem.getLogger('useIosVoipPushEventsSetupEffect');
|
|
15
14
|
|
|
@@ -28,6 +27,7 @@ function setLogoutCallback(
|
|
|
28
27
|
lastVoipTokenRef.current = { token: '', userId: '' };
|
|
29
28
|
try {
|
|
30
29
|
await client.removeDevice(token);
|
|
30
|
+
logger.debug('PushLogoutCallback - Removed voip token', token);
|
|
31
31
|
} catch (err) {
|
|
32
32
|
logger.warn('PushLogoutCallback - Failed to remove voip token', err);
|
|
33
33
|
}
|
|
@@ -89,24 +89,12 @@ export const useIosVoipPushEventsSetupEffect = () => {
|
|
|
89
89
|
useEffect(() => {
|
|
90
90
|
const pushConfig = StreamVideoRN.getConfig().push;
|
|
91
91
|
const pushProviderName = pushConfig?.ios.pushProviderName;
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
if (!pushConfig.android.incomingCallChannel) {
|
|
96
|
-
// TODO: remove this check and find a better way once we have telecom integration for android
|
|
97
|
-
logger.debug(
|
|
98
|
-
'android incomingCallChannel is not defined, so skipping the useIosVoipPushEventsSetupEffect',
|
|
99
|
-
);
|
|
92
|
+
const callingx = getCallingxLibIfAvailable();
|
|
93
|
+
|
|
94
|
+
if (Platform.OS !== 'ios' || !client || !pushProviderName || !callingx) {
|
|
100
95
|
return;
|
|
101
96
|
}
|
|
102
97
|
|
|
103
|
-
const voipPushNotification = getVoipPushNotificationLib();
|
|
104
|
-
|
|
105
|
-
// even though we do this natively, we have to still register here again
|
|
106
|
-
// natively this will make sure "register" event for JS is sent with the last push token
|
|
107
|
-
// Necessary if client changed before we got the event here or user logged out and logged in again
|
|
108
|
-
voipPushNotification.registerVoipToken();
|
|
109
|
-
|
|
110
98
|
const onTokenReceived = (token: string) => {
|
|
111
99
|
const userId = client.streamClient._user?.id ?? '';
|
|
112
100
|
if (client.streamClient.anonymous || !token || !userId) {
|
|
@@ -145,24 +133,24 @@ export const useIosVoipPushEventsSetupEffect = () => {
|
|
|
145
133
|
});
|
|
146
134
|
};
|
|
147
135
|
// fired when PushKit give us the latest token
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
136
|
+
const voipRegisterListener = callingx.addEventListener(
|
|
137
|
+
'voipNotificationsRegistered',
|
|
138
|
+
({ token }) => {
|
|
139
|
+
onTokenReceived(token);
|
|
140
|
+
},
|
|
141
|
+
);
|
|
151
142
|
|
|
152
|
-
// this will
|
|
153
|
-
|
|
154
|
-
if (
|
|
155
|
-
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
const { name, data } = voipPushEvent;
|
|
159
|
-
if (name === 'RNVoipPushRemoteNotificationsRegisteredEvent') {
|
|
160
|
-
onTokenReceived(data);
|
|
161
|
-
} else if (name === 'RNVoipPushRemoteNotificationReceivedEvent') {
|
|
162
|
-
onVoipNotificationReceived(data, pushConfig);
|
|
163
|
-
}
|
|
143
|
+
// this will return events that were fired before js bridge initialized
|
|
144
|
+
callingx.getInitialVoipEvents().forEach(({ eventName, params }) => {
|
|
145
|
+
if (eventName === 'voipNotificationsRegistered' && 'token' in params) {
|
|
146
|
+
onTokenReceived(params.token);
|
|
147
|
+
} else if (eventName === 'voipNotificationReceived') {
|
|
148
|
+
onVoipNotificationReceived(params, pushConfig);
|
|
164
149
|
}
|
|
165
150
|
});
|
|
151
|
+
|
|
152
|
+
callingx.registerVoipToken();
|
|
153
|
+
|
|
166
154
|
lastListener.count += 1;
|
|
167
155
|
const currentListenerCount = lastListener.count;
|
|
168
156
|
|
|
@@ -175,8 +163,7 @@ export const useIosVoipPushEventsSetupEffect = () => {
|
|
|
175
163
|
return;
|
|
176
164
|
}
|
|
177
165
|
logger.debug(`Voip event listeners are removed for user: ${userId}`);
|
|
178
|
-
|
|
179
|
-
voipPushNotification.removeEventListener('register');
|
|
166
|
+
voipRegisterListener.remove();
|
|
180
167
|
};
|
|
181
168
|
}, [client]);
|
|
182
169
|
};
|
|
@@ -5,76 +5,45 @@ import {
|
|
|
5
5
|
AppState,
|
|
6
6
|
type AppStateStatus,
|
|
7
7
|
NativeModules,
|
|
8
|
+
PermissionsAndroid,
|
|
8
9
|
Platform,
|
|
9
10
|
} from 'react-native';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
getNotifeeLibNoThrowForKeepCallAlive,
|
|
14
|
-
} from '../utils/push/libs/notifee';
|
|
15
|
-
|
|
16
|
-
const notifeeLib = getNotifeeLibNoThrowForKeepCallAlive();
|
|
17
|
-
const callToPassToForegroundService: { current: Call | undefined } = {
|
|
18
|
-
current: undefined,
|
|
19
|
-
};
|
|
11
|
+
import { CallingState, videoLoggerSystem } from '@stream-io/video-client';
|
|
12
|
+
import { keepCallAliveCallRef } from '../utils/keepCallAliveHeadlessTask';
|
|
13
|
+
import { getCallingxLibIfAvailable } from '../utils/push/libs';
|
|
20
14
|
|
|
21
|
-
function
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
);
|
|
29
|
-
logger.info(
|
|
30
|
-
'KeepCallAlive is not configured. Skipping foreground service setup.',
|
|
31
|
-
);
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
notifeeLib.default.registerForegroundService(() => {
|
|
35
|
-
const task = new Promise((resolve) => {
|
|
36
|
-
const logger = videoLoggerSystem.getLogger(
|
|
37
|
-
'setForegroundService method',
|
|
38
|
-
);
|
|
39
|
-
logger.info('Foreground service running for call in progress');
|
|
40
|
-
// any task to run from SDK in the foreground service must be added
|
|
41
|
-
resolve(true);
|
|
42
|
-
});
|
|
43
|
-
const videoConfig = StreamVideoRN.getConfig();
|
|
44
|
-
const foregroundServiceConfig = videoConfig.foregroundService;
|
|
45
|
-
const { taskToRun } = foregroundServiceConfig.android;
|
|
46
|
-
const call = callToPassToForegroundService.current;
|
|
47
|
-
if (!call) {
|
|
48
|
-
const logger = videoLoggerSystem.getLogger(
|
|
49
|
-
'setForegroundService method',
|
|
50
|
-
);
|
|
51
|
-
logger.warn('No call to pass to foreground service');
|
|
52
|
-
return task.then(() => new Promise(() => {}));
|
|
53
|
-
}
|
|
54
|
-
callToPassToForegroundService.current = undefined;
|
|
55
|
-
return task.then(() => taskToRun(call));
|
|
56
|
-
});
|
|
57
|
-
},
|
|
58
|
-
);
|
|
15
|
+
async function stopForegroundServiceNoThrow() {
|
|
16
|
+
const logger = videoLoggerSystem.getLogger('stopForegroundServiceNoThrow');
|
|
17
|
+
try {
|
|
18
|
+
await NativeModules.StreamVideoReactNative.stopKeepCallAliveService();
|
|
19
|
+
} catch (e) {
|
|
20
|
+
logger.warn('Failed to stop keep-call-alive foreground service', e);
|
|
21
|
+
}
|
|
59
22
|
}
|
|
60
23
|
|
|
61
24
|
async function startForegroundService(call_cid: string) {
|
|
62
|
-
const
|
|
63
|
-
|
|
25
|
+
const logger = videoLoggerSystem.getLogger('startForegroundService');
|
|
26
|
+
const isCallAliveConfigured = await (async () => {
|
|
27
|
+
try {
|
|
28
|
+
return await NativeModules.StreamVideoReactNative.isCallAliveConfigured();
|
|
29
|
+
} catch (e) {
|
|
30
|
+
logger.warn('Failed to check whether KeepCallAlive is configured', e);
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
})();
|
|
64
34
|
if (!isCallAliveConfigured) {
|
|
65
|
-
const logger = videoLoggerSystem.getLogger('startForegroundService');
|
|
66
35
|
logger.info(
|
|
67
36
|
'KeepCallAlive is not configured. Skipping foreground service setup.',
|
|
68
37
|
);
|
|
69
38
|
return;
|
|
70
39
|
}
|
|
71
|
-
//
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
40
|
+
// Check for notification permission (Android 13+) before starting the service.
|
|
41
|
+
const hasPostNotificationsPermission =
|
|
42
|
+
Number(Platform.Version) < 33 ||
|
|
43
|
+
(await PermissionsAndroid.check(
|
|
44
|
+
PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS,
|
|
45
|
+
));
|
|
46
|
+
if (!hasPostNotificationsPermission) {
|
|
78
47
|
logger.info(
|
|
79
48
|
'Notification permission not granted, can not start foreground service to keep the call alive',
|
|
80
49
|
);
|
|
@@ -83,38 +52,28 @@ async function startForegroundService(call_cid: string) {
|
|
|
83
52
|
const videoConfig = StreamVideoRN.getConfig();
|
|
84
53
|
const foregroundServiceConfig = videoConfig.foregroundService;
|
|
85
54
|
const notificationTexts = foregroundServiceConfig.android.notificationTexts;
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
);
|
|
90
|
-
const foregroundServiceTypes = await getKeepCallAliveForegroundServiceTypes();
|
|
55
|
+
const channel = foregroundServiceConfig.android.channel;
|
|
56
|
+
const smallIconName = videoConfig.push?.android.smallIcon;
|
|
57
|
+
|
|
91
58
|
// NOTE: we use requestAnimationFrame to ensure that the foreground service is started after all the current UI operations are done
|
|
92
59
|
// this is a workaround for the crash - android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException: Context.startForegroundService() did not then call Service.startForeground()
|
|
93
60
|
// this crash was reproducible only in some android devices
|
|
94
|
-
requestAnimationFrame(() => {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
id: 'default',
|
|
108
|
-
launchActivity: 'default', // open the app when the notification is pressed
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
});
|
|
61
|
+
requestAnimationFrame(async () => {
|
|
62
|
+
try {
|
|
63
|
+
await NativeModules.StreamVideoReactNative.startKeepCallAliveService(
|
|
64
|
+
call_cid,
|
|
65
|
+
channel.id,
|
|
66
|
+
channel.name,
|
|
67
|
+
notificationTexts.title,
|
|
68
|
+
notificationTexts.body,
|
|
69
|
+
smallIconName ?? null,
|
|
70
|
+
);
|
|
71
|
+
} catch (e) {
|
|
72
|
+
logger.warn('Failed to start keep-call-alive foreground service', e);
|
|
73
|
+
}
|
|
112
74
|
});
|
|
113
75
|
}
|
|
114
76
|
|
|
115
|
-
// flag to check if setForegroundService has already been run once
|
|
116
|
-
let isSetForegroundServiceRan = false;
|
|
117
|
-
|
|
118
77
|
/**
|
|
119
78
|
* This hook is used to keep the call alive in the background for Android.
|
|
120
79
|
* It starts a foreground service to keep the call alive as soon as the call is joined
|
|
@@ -125,7 +84,7 @@ export const useAndroidKeepCallAliveEffect = () => {
|
|
|
125
84
|
const foregroundServiceStartedRef = useRef(false);
|
|
126
85
|
|
|
127
86
|
const call = useCall();
|
|
128
|
-
|
|
87
|
+
keepCallAliveCallRef.current = call;
|
|
129
88
|
const activeCallCid = call?.cid;
|
|
130
89
|
const { useCallCallingState } = useCallStateHooks();
|
|
131
90
|
const callingState = useCallCallingState();
|
|
@@ -133,6 +92,7 @@ export const useAndroidKeepCallAliveEffect = () => {
|
|
|
133
92
|
const isOutgoingCall =
|
|
134
93
|
callingState === CallingState.RINGING && call?.isCreatedByMe;
|
|
135
94
|
const isCallJoined = callingState === CallingState.JOINED;
|
|
95
|
+
const isRingingCall = call?.ringing;
|
|
136
96
|
|
|
137
97
|
const shouldStartForegroundService =
|
|
138
98
|
!foregroundServiceStartedRef.current && (isOutgoingCall || isCallJoined);
|
|
@@ -141,7 +101,14 @@ export const useAndroidKeepCallAliveEffect = () => {
|
|
|
141
101
|
if (Platform.OS === 'ios' || !activeCallCid) {
|
|
142
102
|
return undefined;
|
|
143
103
|
}
|
|
144
|
-
|
|
104
|
+
|
|
105
|
+
const callingx = getCallingxLibIfAvailable();
|
|
106
|
+
if (
|
|
107
|
+
callingx?.isSetup &&
|
|
108
|
+
(isRingingCall || (!isRingingCall && callingx?.isOngoingCallsEnabled))
|
|
109
|
+
) {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
145
112
|
|
|
146
113
|
// start foreground service as soon as the call is joined
|
|
147
114
|
if (shouldStartForegroundService) {
|
|
@@ -149,23 +116,6 @@ export const useAndroidKeepCallAliveEffect = () => {
|
|
|
149
116
|
if (foregroundServiceStartedRef.current) {
|
|
150
117
|
return;
|
|
151
118
|
}
|
|
152
|
-
if (!isSetForegroundServiceRan) {
|
|
153
|
-
isSetForegroundServiceRan = true;
|
|
154
|
-
setForegroundService();
|
|
155
|
-
}
|
|
156
|
-
const notifee = notifeeLib.default;
|
|
157
|
-
const displayedNotifications =
|
|
158
|
-
await notifee.getDisplayedNotifications();
|
|
159
|
-
const activeCallNotification = displayedNotifications.find(
|
|
160
|
-
(notification) => notification.id === activeCallCid,
|
|
161
|
-
);
|
|
162
|
-
if (activeCallNotification) {
|
|
163
|
-
callToPassToForegroundService.current = undefined;
|
|
164
|
-
// this means that we have a incoming call notification shown as foreground service and we must stop it
|
|
165
|
-
notifee.stopForegroundService();
|
|
166
|
-
notifee.cancelDisplayedNotification(activeCallCid);
|
|
167
|
-
}
|
|
168
|
-
// check for notification permission and then start the foreground service
|
|
169
119
|
|
|
170
120
|
await startForegroundService(activeCallCid);
|
|
171
121
|
foregroundServiceStartedRef.current = true;
|
|
@@ -174,7 +124,6 @@ export const useAndroidKeepCallAliveEffect = () => {
|
|
|
174
124
|
// ensure that app is active before running the function
|
|
175
125
|
if (AppState.currentState === 'active') {
|
|
176
126
|
run();
|
|
177
|
-
return undefined;
|
|
178
127
|
}
|
|
179
128
|
const sub = AppState.addEventListener(
|
|
180
129
|
'change',
|
|
@@ -188,46 +137,31 @@ export const useAndroidKeepCallAliveEffect = () => {
|
|
|
188
137
|
return () => {
|
|
189
138
|
sub.remove();
|
|
190
139
|
};
|
|
191
|
-
} else if (callingState === CallingState.RINGING) {
|
|
192
|
-
return () => {
|
|
193
|
-
// cancel any notifee displayed notification when the call has transitioned out of ringing
|
|
194
|
-
// NOTE: cancels only the non fg service notifications
|
|
195
|
-
notifeeLib.default.cancelDisplayedNotification(activeCallCid);
|
|
196
|
-
};
|
|
197
140
|
} else if (
|
|
198
141
|
callingState === CallingState.IDLE ||
|
|
199
142
|
callingState === CallingState.LEFT
|
|
200
143
|
) {
|
|
201
144
|
if (foregroundServiceStartedRef.current) {
|
|
202
|
-
|
|
145
|
+
keepCallAliveCallRef.current = undefined;
|
|
203
146
|
// stop foreground service when the call is not active
|
|
204
|
-
|
|
147
|
+
stopForegroundServiceNoThrow();
|
|
205
148
|
foregroundServiceStartedRef.current = false;
|
|
206
|
-
} else {
|
|
207
|
-
notifeeLib.default
|
|
208
|
-
.getDisplayedNotifications()
|
|
209
|
-
.then((displayedNotifications) => {
|
|
210
|
-
const activeCallNotification = displayedNotifications.find(
|
|
211
|
-
(notification) => notification.id === activeCallCid,
|
|
212
|
-
);
|
|
213
|
-
if (activeCallNotification) {
|
|
214
|
-
callToPassToForegroundService.current = undefined;
|
|
215
|
-
// this means that we have a incoming call notification shown as foreground service and we must stop it
|
|
216
|
-
notifeeLib.default.stopForegroundService();
|
|
217
|
-
}
|
|
218
|
-
});
|
|
219
149
|
}
|
|
220
150
|
}
|
|
221
151
|
return undefined;
|
|
222
|
-
}, [
|
|
152
|
+
}, [
|
|
153
|
+
activeCallCid,
|
|
154
|
+
callingState,
|
|
155
|
+
shouldStartForegroundService,
|
|
156
|
+
isRingingCall,
|
|
157
|
+
]);
|
|
223
158
|
|
|
224
159
|
useEffect(() => {
|
|
225
160
|
return () => {
|
|
226
161
|
// stop foreground service when this effect is unmounted
|
|
227
162
|
if (foregroundServiceStartedRef.current) {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
notifeeLib.default.stopForegroundService();
|
|
163
|
+
keepCallAliveCallRef.current = undefined;
|
|
164
|
+
stopForegroundServiceNoThrow();
|
|
231
165
|
foregroundServiceStartedRef.current = false;
|
|
232
166
|
}
|
|
233
167
|
};
|
package/src/index.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { registerGlobals } from '@stream-io/react-native-webrtc';
|
|
|
9
9
|
import Logger from '@stream-io/react-native-webrtc/src/Logger';
|
|
10
10
|
import { Platform } from 'react-native';
|
|
11
11
|
import { registerSDKGlobals } from './utils/internal/registerSDKGlobals';
|
|
12
|
+
import './utils/keepCallAliveHeadlessTask';
|
|
12
13
|
|
|
13
14
|
// We're registering globals, because our video JS client is serving SDKs that use browser based webRTC functions.
|
|
14
15
|
// This will result in creation of 2 global objects: `window` and `navigator`
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { NativeEventEmitter, NativeModules, Platform } from 'react-native';
|
|
2
2
|
import { AudioDeviceStatus, StreamInCallManagerConfig } from './types';
|
|
3
|
+
import { getCallingxLibIfAvailable } from '../../utils/push/libs/callingx';
|
|
4
|
+
import { videoLoggerSystem } from '@stream-io/video-client';
|
|
3
5
|
|
|
4
6
|
const NativeManager = NativeModules.StreamInCallManager;
|
|
7
|
+
const CallingxModule = getCallingxLibIfAvailable();
|
|
5
8
|
|
|
6
9
|
const invariant = (condition: boolean, message: string) => {
|
|
7
10
|
if (!condition) throw new Error(message);
|
|
@@ -72,6 +75,19 @@ class SpeakerManager {
|
|
|
72
75
|
};
|
|
73
76
|
}
|
|
74
77
|
|
|
78
|
+
const shouldBypassForCallKit = (): boolean => {
|
|
79
|
+
if (Platform.OS !== 'ios') {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
if (!CallingxModule) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
return (
|
|
86
|
+
CallingxModule.isSetup &&
|
|
87
|
+
(CallingxModule.hasRegisteredCall() || CallingxModule.isOngoingCallsEnabled)
|
|
88
|
+
);
|
|
89
|
+
};
|
|
90
|
+
|
|
75
91
|
export class CallManager {
|
|
76
92
|
android = new AndroidCallManager();
|
|
77
93
|
ios = new IOSCallManager();
|
|
@@ -95,6 +111,14 @@ export class CallManager {
|
|
|
95
111
|
* @param config.enableStereoAudioOutput Whether to enable stereo audio output. Only supported for listener audio role.
|
|
96
112
|
*/
|
|
97
113
|
start = (config?: StreamInCallManagerConfig): void => {
|
|
114
|
+
if (shouldBypassForCallKit()) {
|
|
115
|
+
videoLoggerSystem
|
|
116
|
+
.getLogger('CallManager')
|
|
117
|
+
.debug(
|
|
118
|
+
'start: skipping start as callkit is handling the audio session',
|
|
119
|
+
);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
98
122
|
NativeManager.setAudioRole(config?.audioRole ?? 'communicator');
|
|
99
123
|
if (config?.audioRole === 'communicator') {
|
|
100
124
|
const type = config.deviceEndpointType ?? 'speaker';
|
|
@@ -110,6 +134,12 @@ export class CallManager {
|
|
|
110
134
|
* Stops the in call manager.
|
|
111
135
|
*/
|
|
112
136
|
stop = (): void => {
|
|
137
|
+
if (shouldBypassForCallKit()) {
|
|
138
|
+
videoLoggerSystem
|
|
139
|
+
.getLogger('CallManager')
|
|
140
|
+
.debug('stop: skipping stop as callkit is handling the audio session');
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
113
143
|
NativeManager.stop();
|
|
114
144
|
};
|
|
115
145
|
|
|
@@ -118,4 +148,10 @@ export class CallManager {
|
|
|
118
148
|
* in the native layer.
|
|
119
149
|
*/
|
|
120
150
|
logAudioState = (): void => NativeManager.logAudioState();
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* For debugging purposes, returns the current audio state as a string.
|
|
154
|
+
* @returns A string containing the current audio state information.
|
|
155
|
+
*/
|
|
156
|
+
getAudioStateLog = (): string => NativeManager.getAudioStateLog();
|
|
121
157
|
}
|
|
@@ -82,6 +82,13 @@ export interface CallManager extends NativeModule {
|
|
|
82
82
|
* Meant for debugging purposes.
|
|
83
83
|
*/
|
|
84
84
|
logAudioState: () => void;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Get the current audio state as a string.
|
|
88
|
+
* Meant for debugging purposes.
|
|
89
|
+
* @returns A string containing the current audio state information.
|
|
90
|
+
*/
|
|
91
|
+
getAudioStateLog: () => string;
|
|
85
92
|
}
|
|
86
93
|
|
|
87
94
|
declare module 'react-native' {
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { StreamCallProvider } from '@stream-io/video-react-bindings';
|
|
2
2
|
import React, { type PropsWithChildren, useEffect } from 'react';
|
|
3
3
|
import { Call } from '@stream-io/video-client';
|
|
4
|
-
import { useIosCallkeepWithCallingStateEffect } from '../../hooks/push/useIosCallkeepWithCallingStateEffect';
|
|
5
4
|
import { canAddPushWSSubscriptionsRef } from '../../utils/push/internal/utils';
|
|
6
5
|
import { useAndroidKeepCallAliveEffect } from '../../hooks/useAndroidKeepCallAliveEffect';
|
|
7
6
|
import { useScreenShareAudioMixing } from '../../hooks/useScreenShareAudioMixing';
|
|
8
7
|
import { AppStateListener } from './AppStateListener';
|
|
9
8
|
import { DeviceStats } from './DeviceStats';
|
|
10
9
|
import { pushUnsubscriptionCallbacks } from '../../utils/push/internal/constants';
|
|
10
|
+
import { useCallingExpWithCallingStateEffect } from '../../hooks/push/useCallingExpWithCallingStateEffect';
|
|
11
11
|
|
|
12
12
|
// const PIP_CHANGE_EVENT = 'StreamVideoReactNative_PIP_CHANGE_EVENT';
|
|
13
13
|
|
|
@@ -35,7 +35,7 @@ export const StreamCall = ({
|
|
|
35
35
|
<StreamCallProvider call={call}>
|
|
36
36
|
<AppStateListener />
|
|
37
37
|
<AndroidKeepCallAlive />
|
|
38
|
-
<
|
|
38
|
+
<CallingExpWithCallingState />
|
|
39
39
|
<ClearPushWSSubscriptions />
|
|
40
40
|
<ScreenShareAudioMixer />
|
|
41
41
|
<DeviceStats />
|
|
@@ -54,11 +54,11 @@ const AndroidKeepCallAlive = () => {
|
|
|
54
54
|
};
|
|
55
55
|
|
|
56
56
|
/**
|
|
57
|
-
* This is a renderless component to
|
|
58
|
-
*
|
|
57
|
+
* This is a renderless component to sync state between stream call and CallKit/Telecom.
|
|
58
|
+
* useCallingExpWithCallingStateEffect needs to called inside a child of StreamCallProvider.
|
|
59
59
|
*/
|
|
60
|
-
const
|
|
61
|
-
|
|
60
|
+
const CallingExpWithCallingState = () => {
|
|
61
|
+
useCallingExpWithCallingStateEffect();
|
|
62
62
|
return null;
|
|
63
63
|
};
|
|
64
64
|
|
|
@@ -3,9 +3,14 @@ import pushLogoutCallbacks from '../internal/pushLogoutCallback';
|
|
|
3
3
|
import newNotificationCallbacks, {
|
|
4
4
|
type NewCallNotificationCallback,
|
|
5
5
|
} from '../internal/newNotificationCallbacks';
|
|
6
|
-
import { setupIosCallKeepEvents } from '../push/setupIosCallKeepEvents';
|
|
7
6
|
import { setupIosVoipPushEvents } from '../push/setupIosVoipPushEvents';
|
|
7
|
+
import { setupCallingExpEvents } from '../push/setupCallingExpEvents';
|
|
8
|
+
import {
|
|
9
|
+
extractCallingExpOptions,
|
|
10
|
+
getCallingxLib,
|
|
11
|
+
} from '../push/libs/callingx';
|
|
8
12
|
import { NativeModules, Platform } from 'react-native';
|
|
13
|
+
import { videoLoggerSystem } from '@stream-io/video-client';
|
|
9
14
|
|
|
10
15
|
// Utility type for deep partial
|
|
11
16
|
type DeepPartial<T> = {
|
|
@@ -47,10 +52,7 @@ const DEFAULT_STREAM_VIDEO_CONFIG: StreamVideoConfig = {
|
|
|
47
52
|
android: {
|
|
48
53
|
channel: {
|
|
49
54
|
id: 'stream_call_foreground_service',
|
|
50
|
-
name: '
|
|
51
|
-
lights: false,
|
|
52
|
-
vibration: false,
|
|
53
|
-
importance: 3,
|
|
55
|
+
name: 'Ongoing calls',
|
|
54
56
|
},
|
|
55
57
|
notificationTexts: {
|
|
56
58
|
title: 'Call in progress',
|
|
@@ -76,20 +78,6 @@ export class StreamVideoRN {
|
|
|
76
78
|
this.config = deepMerge(this.config, updateConfig);
|
|
77
79
|
}
|
|
78
80
|
|
|
79
|
-
static updateAndroidIncomingCallChannel(
|
|
80
|
-
updateChannel: Partial<
|
|
81
|
-
NonNullable<StreamVideoConfig['push']>['android']['incomingCallChannel']
|
|
82
|
-
>,
|
|
83
|
-
) {
|
|
84
|
-
const prevChannel = this.config.push?.android?.incomingCallChannel;
|
|
85
|
-
if (prevChannel) {
|
|
86
|
-
this.config.push!.android.incomingCallChannel = {
|
|
87
|
-
...prevChannel,
|
|
88
|
-
...updateChannel,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
81
|
/**
|
|
94
82
|
* Set the push config for StreamVideoRN.
|
|
95
83
|
* This method must be called **outside** of your application lifecycle, e.g. alongside your
|
|
@@ -102,7 +90,28 @@ export class StreamVideoRN {
|
|
|
102
90
|
* import App from './App';
|
|
103
91
|
* // Set push config
|
|
104
92
|
* const pushConfig = {}; // construct your config
|
|
105
|
-
*
|
|
93
|
+
* // Set CallKit/Android Telecom API integration options. All params are optional. If not provided, the default values will be used.
|
|
94
|
+
* const callingExpOptions = {
|
|
95
|
+
* ios: {
|
|
96
|
+
* callsHistory: true,
|
|
97
|
+
* displayCallTimeout: 60000,
|
|
98
|
+
* sound: 'ringtone',
|
|
99
|
+
* imageName: 'callkit_icon',
|
|
100
|
+
* },
|
|
101
|
+
* android: {
|
|
102
|
+
* incomingChannel: {
|
|
103
|
+
* id: 'stream_incoming_call_notifications',
|
|
104
|
+
* name: 'Call notifications',
|
|
105
|
+
* vibration: true,
|
|
106
|
+
* sound: 'default',
|
|
107
|
+
* },
|
|
108
|
+
* titleTransformer: (memberName: string, incoming: boolean) =>
|
|
109
|
+
* incoming
|
|
110
|
+
* ? `${memberName} is calling you`
|
|
111
|
+
* : `You are calling ${memberName}`,
|
|
112
|
+
* },
|
|
113
|
+
* };
|
|
114
|
+
* StreamVideoRN.setPushConfig(pushConfig, callingExpOptions);
|
|
106
115
|
* AppRegistry.registerComponent('app', () => App);
|
|
107
116
|
*/
|
|
108
117
|
static setPushConfig(pushConfig: NonNullable<StreamVideoConfig['push']>) {
|
|
@@ -110,20 +119,23 @@ export class StreamVideoRN {
|
|
|
110
119
|
// Ignoring this config as push config was already set
|
|
111
120
|
return;
|
|
112
121
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
122
|
+
|
|
123
|
+
this.config.push = pushConfig;
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
const callingx = getCallingxLib();
|
|
127
|
+
videoLoggerSystem
|
|
128
|
+
.getLogger('StreamVideoRN.setPushConfig')
|
|
129
|
+
.info(JSON.stringify(this.config));
|
|
130
|
+
const options = extractCallingExpOptions(this.config);
|
|
131
|
+
callingx.setup(options);
|
|
132
|
+
} catch {
|
|
117
133
|
throw new Error(
|
|
118
|
-
|
|
119
|
-
Please watch for incoming and outgoing calls in the root component of your app.
|
|
120
|
-
Please see https://getstream.io/video/docs/react-native/advanced/ringing-calls/#watch-for-incoming-and-outgoing-calls for more information.`,
|
|
134
|
+
'react-native-callingx library is not installed. Please check our migration instructions: https://getstream.io/video/docs/react-native/migration-guides/1.32.0/.',
|
|
121
135
|
);
|
|
122
136
|
}
|
|
123
137
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
setupIosCallKeepEvents(pushConfig);
|
|
138
|
+
setupCallingExpEvents(pushConfig);
|
|
127
139
|
setupIosVoipPushEvents(pushConfig);
|
|
128
140
|
}
|
|
129
141
|
|