voice-react-native-sdk 1.6.2-fork.4
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/LICENSE +206 -0
- package/README.md +179 -0
- package/android/build.gradle +113 -0
- package/android/gradle.properties +29 -0
- package/android/src/main/AndroidManifest.xml +30 -0
- package/android/src/main/java/com/twiliovoicereactnative/AudioSwitchManager.java +141 -0
- package/android/src/main/java/com/twiliovoicereactnative/CallListenerProxy.java +186 -0
- package/android/src/main/java/com/twiliovoicereactnative/CallMessageListenerProxy.java +103 -0
- package/android/src/main/java/com/twiliovoicereactnative/CallRecordDatabase.java +183 -0
- package/android/src/main/java/com/twiliovoicereactnative/CommonConstants.java +195 -0
- package/android/src/main/java/com/twiliovoicereactnative/ConfigurationProperties.java +41 -0
- package/android/src/main/java/com/twiliovoicereactnative/Constants.java +23 -0
- package/android/src/main/java/com/twiliovoicereactnative/ExpoActivityLifecycleListener.java +27 -0
- package/android/src/main/java/com/twiliovoicereactnative/ExpoApplicationLifecycleListener.java +14 -0
- package/android/src/main/java/com/twiliovoicereactnative/ExpoModule.kt +36 -0
- package/android/src/main/java/com/twiliovoicereactnative/ExpoPackage.java +20 -0
- package/android/src/main/java/com/twiliovoicereactnative/JSEventEmitter.java +98 -0
- package/android/src/main/java/com/twiliovoicereactnative/MediaPlayerManager.java +58 -0
- package/android/src/main/java/com/twiliovoicereactnative/NotificationUtility.java +363 -0
- package/android/src/main/java/com/twiliovoicereactnative/ReactNativeArgumentsSerializer.java +276 -0
- package/android/src/main/java/com/twiliovoicereactnative/SDKLog.java +74 -0
- package/android/src/main/java/com/twiliovoicereactnative/StatsListenerProxy.java +178 -0
- package/android/src/main/java/com/twiliovoicereactnative/TwilioVoiceReactNativeModule.java +778 -0
- package/android/src/main/java/com/twiliovoicereactnative/TwilioVoiceReactNativePackage.java +28 -0
- package/android/src/main/java/com/twiliovoicereactnative/VoiceActivityProxy.java +101 -0
- package/android/src/main/java/com/twiliovoicereactnative/VoiceApplicationProxy.java +133 -0
- package/android/src/main/java/com/twiliovoicereactnative/VoiceFirebaseMessagingService.java +88 -0
- package/android/src/main/java/com/twiliovoicereactnative/VoiceService.java +403 -0
- package/android/src/main/res/drawable/answered_call_small_icon.png +0 -0
- package/android/src/main/res/drawable/ic_launcher_round.png +0 -0
- package/android/src/main/res/drawable/ic_launcher_sdk.png +0 -0
- package/android/src/main/res/drawable/incoming_call_small_icon.png +0 -0
- package/android/src/main/res/drawable/outgoing_call_small_icon.png +0 -0
- package/android/src/main/res/raw/disconnect.wav +0 -0
- package/android/src/main/res/raw/incoming.wav +0 -0
- package/android/src/main/res/raw/outgoing.wav +0 -0
- package/android/src/main/res/raw/ringtone.wav +0 -0
- package/android/src/main/res/raw/silent.wav +0 -0
- package/android/src/main/res/values/colors.xml +11 -0
- package/android/src/main/res/values/config.xml +5 -0
- package/android/src/main/res/values/dimens.xml +7 -0
- package/android/src/main/res/values/strings.xml +25 -0
- package/android/src/main/res/values/styles.xml +10 -0
- package/android/src/main/res/values-night/colors.xml +11 -0
- package/expo-config-plugin/android.js +191 -0
- package/expo-config-plugin/ios.js +22 -0
- package/expo-module.config.json +6 -0
- package/ios/TwilioVoicePushRegistry.h +19 -0
- package/ios/TwilioVoicePushRegistry.m +72 -0
- package/ios/TwilioVoiceReactNative+CallInvite.m +56 -0
- package/ios/TwilioVoiceReactNative+CallKit.m +533 -0
- package/ios/TwilioVoiceReactNative+CallMessage.m +81 -0
- package/ios/TwilioVoiceReactNative.h +74 -0
- package/ios/TwilioVoiceReactNative.m +1046 -0
- package/ios/TwilioVoiceReactNative.xcodeproj/project.pbxproj +328 -0
- package/ios/TwilioVoiceReactNativeConstants.h +200 -0
- package/ios/Utilities/TwilioVoiceStatsReport.h +175 -0
- package/lib/commonjs/AudioDevice.js +101 -0
- package/lib/commonjs/AudioDevice.js.map +1 -0
- package/lib/commonjs/Call.js +765 -0
- package/lib/commonjs/Call.js.map +1 -0
- package/lib/commonjs/CallInvite.js +452 -0
- package/lib/commonjs/CallInvite.js.map +1 -0
- package/lib/commonjs/CallMessage/CallMessage.js +54 -0
- package/lib/commonjs/CallMessage/CallMessage.js.map +1 -0
- package/lib/commonjs/CallMessage/IncomingCallMessage.js +120 -0
- package/lib/commonjs/CallMessage/IncomingCallMessage.js.map +1 -0
- package/lib/commonjs/CallMessage/OutgoingCallMessage.js +148 -0
- package/lib/commonjs/CallMessage/OutgoingCallMessage.js.map +1 -0
- package/lib/commonjs/ExpoModule.js +69 -0
- package/lib/commonjs/ExpoModule.js.map +1 -0
- package/lib/commonjs/Voice.js +611 -0
- package/lib/commonjs/Voice.js.map +1 -0
- package/lib/commonjs/common.js +26 -0
- package/lib/commonjs/common.js.map +1 -0
- package/lib/commonjs/constants.js +158 -0
- package/lib/commonjs/constants.js.map +1 -0
- package/lib/commonjs/error/InvalidArgumentError.js +32 -0
- package/lib/commonjs/error/InvalidArgumentError.js.map +1 -0
- package/lib/commonjs/error/InvalidStateError.js +33 -0
- package/lib/commonjs/error/InvalidStateError.js.map +1 -0
- package/lib/commonjs/error/TwilioError.js +38 -0
- package/lib/commonjs/error/TwilioError.js.map +1 -0
- package/lib/commonjs/error/UnsupportedPlatformError.js +33 -0
- package/lib/commonjs/error/UnsupportedPlatformError.js.map +1 -0
- package/lib/commonjs/error/generated.js +2343 -0
- package/lib/commonjs/error/generated.js.map +1 -0
- package/lib/commonjs/error/index.js +112 -0
- package/lib/commonjs/error/index.js.map +1 -0
- package/lib/commonjs/error/utility.js +37 -0
- package/lib/commonjs/error/utility.js.map +1 -0
- package/lib/commonjs/index.js +95 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/type/AudioDevice.js +6 -0
- package/lib/commonjs/type/AudioDevice.js.map +1 -0
- package/lib/commonjs/type/Call.js +6 -0
- package/lib/commonjs/type/Call.js.map +1 -0
- package/lib/commonjs/type/CallInvite.js +6 -0
- package/lib/commonjs/type/CallInvite.js.map +1 -0
- package/lib/commonjs/type/CallKit.js +30 -0
- package/lib/commonjs/type/CallKit.js.map +1 -0
- package/lib/commonjs/type/CallMessage.js +6 -0
- package/lib/commonjs/type/CallMessage.js.map +1 -0
- package/lib/commonjs/type/Error.js +6 -0
- package/lib/commonjs/type/Error.js.map +1 -0
- package/lib/commonjs/type/NativeModule.js +6 -0
- package/lib/commonjs/type/NativeModule.js.map +1 -0
- package/lib/commonjs/type/RTCStats.js +29 -0
- package/lib/commonjs/type/RTCStats.js.map +1 -0
- package/lib/commonjs/type/Voice.js +6 -0
- package/lib/commonjs/type/Voice.js.map +1 -0
- package/lib/commonjs/type/common.js +2 -0
- package/lib/commonjs/type/common.js.map +1 -0
- package/lib/module/AudioDevice.js +97 -0
- package/lib/module/AudioDevice.js.map +1 -0
- package/lib/module/Call.js +766 -0
- package/lib/module/Call.js.map +1 -0
- package/lib/module/CallInvite.js +450 -0
- package/lib/module/CallInvite.js.map +1 -0
- package/lib/module/CallMessage/CallMessage.js +51 -0
- package/lib/module/CallMessage/CallMessage.js.map +1 -0
- package/lib/module/CallMessage/IncomingCallMessage.js +116 -0
- package/lib/module/CallMessage/IncomingCallMessage.js.map +1 -0
- package/lib/module/CallMessage/OutgoingCallMessage.js +154 -0
- package/lib/module/CallMessage/OutgoingCallMessage.js.map +1 -0
- package/lib/module/ExpoModule.js +58 -0
- package/lib/module/ExpoModule.js.map +1 -0
- package/lib/module/Voice.js +598 -0
- package/lib/module/Voice.js.map +1 -0
- package/lib/module/common.js +11 -0
- package/lib/module/common.js.map +1 -0
- package/lib/module/constants.js +151 -0
- package/lib/module/constants.js.map +1 -0
- package/lib/module/error/InvalidArgumentError.js +23 -0
- package/lib/module/error/InvalidArgumentError.js.map +1 -0
- package/lib/module/error/InvalidStateError.js +24 -0
- package/lib/module/error/InvalidStateError.js.map +1 -0
- package/lib/module/error/TwilioError.js +29 -0
- package/lib/module/error/TwilioError.js.map +1 -0
- package/lib/module/error/UnsupportedPlatformError.js +24 -0
- package/lib/module/error/UnsupportedPlatformError.js.map +1 -0
- package/lib/module/error/generated.js +2315 -0
- package/lib/module/error/generated.js.map +1 -0
- package/lib/module/error/index.js +6 -0
- package/lib/module/error/index.js.map +1 -0
- package/lib/module/error/utility.js +27 -0
- package/lib/module/error/utility.js.map +1 -0
- package/lib/module/index.js +23 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/type/AudioDevice.js +2 -0
- package/lib/module/type/AudioDevice.js.map +1 -0
- package/lib/module/type/Call.js +2 -0
- package/lib/module/type/Call.js.map +1 -0
- package/lib/module/type/CallInvite.js +2 -0
- package/lib/module/type/CallInvite.js.map +1 -0
- package/lib/module/type/CallKit.js +22 -0
- package/lib/module/type/CallKit.js.map +1 -0
- package/lib/module/type/CallMessage.js +2 -0
- package/lib/module/type/CallMessage.js.map +1 -0
- package/lib/module/type/Error.js +2 -0
- package/lib/module/type/Error.js.map +1 -0
- package/lib/module/type/NativeModule.js +2 -0
- package/lib/module/type/NativeModule.js.map +1 -0
- package/lib/module/type/RTCStats.js +21 -0
- package/lib/module/type/RTCStats.js.map +1 -0
- package/lib/module/type/Voice.js +2 -0
- package/lib/module/type/Voice.js.map +1 -0
- package/lib/module/type/common.js +2 -0
- package/lib/module/type/common.js.map +1 -0
- package/lib/typescript/AudioDevice.d.ts +74 -0
- package/lib/typescript/Call.d.ts +874 -0
- package/lib/typescript/CallInvite.d.ts +484 -0
- package/lib/typescript/CallMessage/CallMessage.d.ts +53 -0
- package/lib/typescript/CallMessage/IncomingCallMessage.d.ts +75 -0
- package/lib/typescript/CallMessage/OutgoingCallMessage.d.ts +198 -0
- package/lib/typescript/ExpoModule.d.ts +13 -0
- package/lib/typescript/Voice.d.ts +620 -0
- package/lib/typescript/common.d.ts +11 -0
- package/lib/typescript/constants.d.ts +148 -0
- package/lib/typescript/error/InvalidArgumentError.d.ts +11 -0
- package/lib/typescript/error/InvalidStateError.d.ts +12 -0
- package/lib/typescript/error/TwilioError.d.ts +14 -0
- package/lib/typescript/error/UnsupportedPlatformError.d.ts +12 -0
- package/lib/typescript/error/generated.d.ts +1558 -0
- package/lib/typescript/error/index.d.ts +5 -0
- package/lib/typescript/error/utility.d.ts +12 -0
- package/lib/typescript/index.d.ts +18 -0
- package/lib/typescript/type/AudioDevice.d.ts +15 -0
- package/lib/typescript/type/Call.d.ts +59 -0
- package/lib/typescript/type/CallInvite.d.ts +40 -0
- package/lib/typescript/type/CallKit.d.ts +60 -0
- package/lib/typescript/type/CallMessage.d.ts +20 -0
- package/lib/typescript/type/Error.d.ts +9 -0
- package/lib/typescript/type/NativeModule.d.ts +59 -0
- package/lib/typescript/type/RTCStats.d.ts +91 -0
- package/lib/typescript/type/Voice.d.ts +16 -0
- package/lib/typescript/type/common.d.ts +15 -0
- package/package.json +167 -0
- package/src/AudioDevice.tsx +88 -0
- package/src/Call.tsx +1343 -0
- package/src/CallInvite.tsx +757 -0
- package/src/CallMessage/CallMessage.ts +83 -0
- package/src/CallMessage/IncomingCallMessage.ts +104 -0
- package/src/CallMessage/OutgoingCallMessage.ts +308 -0
- package/src/ExpoModule.ts +59 -0
- package/src/Voice.tsx +1010 -0
- package/src/common.ts +16 -0
- package/src/constants.ts +193 -0
- package/src/error/InvalidArgumentError.ts +19 -0
- package/src/error/InvalidStateError.ts +19 -0
- package/src/error/TwilioError.ts +22 -0
- package/src/error/UnsupportedPlatformError.ts +19 -0
- package/src/error/generated.ts +2277 -0
- package/src/error/index.ts +18 -0
- package/src/error/utility.ts +36 -0
- package/src/index.tsx +24 -0
- package/src/type/AudioDevice.ts +18 -0
- package/src/type/Call.ts +102 -0
- package/src/type/CallInvite.ts +59 -0
- package/src/type/CallKit.ts +61 -0
- package/src/type/CallMessage.ts +31 -0
- package/src/type/Error.ts +11 -0
- package/src/type/NativeModule.ts +93 -0
- package/src/type/RTCStats.ts +99 -0
- package/src/type/Voice.ts +31 -0
- package/src/type/common.ts +16 -0
- package/twilio-voice-react-native.podspec +22 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/* eslint-disable no-shadow */
|
|
2
|
+
const {
|
|
3
|
+
withAppBuildGradle,
|
|
4
|
+
withProjectBuildGradle,
|
|
5
|
+
withAndroidManifest,
|
|
6
|
+
withStringsXml,
|
|
7
|
+
} = require('@expo/config-plugins');
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
|
|
11
|
+
const googleServicesClassPath = 'com.google.gms:google-services';
|
|
12
|
+
const googleServicesVersion = '4.4.1';
|
|
13
|
+
|
|
14
|
+
function withTwilioVoiceAndroid(config, options = {}) {
|
|
15
|
+
const {
|
|
16
|
+
firebaseMessagingServiceEnabled = true,
|
|
17
|
+
googleServicesJsonPath = null,
|
|
18
|
+
} = options;
|
|
19
|
+
|
|
20
|
+
config = withAndroidManifest(config, (config) => {
|
|
21
|
+
const androidManifest = config.modResults;
|
|
22
|
+
|
|
23
|
+
const permissions = [
|
|
24
|
+
'android.permission.RECORD_AUDIO',
|
|
25
|
+
'android.permission.MODIFY_AUDIO_SETTINGS',
|
|
26
|
+
'android.permission.USE_SIP',
|
|
27
|
+
'android.permission.WAKE_LOCK',
|
|
28
|
+
'android.permission.VIBRATE',
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
permissions.forEach((permission) => {
|
|
32
|
+
if (
|
|
33
|
+
!androidManifest.manifest['uses-permission']?.find(
|
|
34
|
+
(p) => p.$['android:name'] === permission
|
|
35
|
+
)
|
|
36
|
+
) {
|
|
37
|
+
if (!androidManifest.manifest['uses-permission']) {
|
|
38
|
+
androidManifest.manifest['uses-permission'] = [];
|
|
39
|
+
}
|
|
40
|
+
androidManifest.manifest['uses-permission'].push({
|
|
41
|
+
$: { 'android:name': permission },
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
return config;
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
config = withStringsXml(config, (config) => {
|
|
50
|
+
const strings = config.modResults;
|
|
51
|
+
|
|
52
|
+
const fcmServiceConfig = {
|
|
53
|
+
$: { name: 'twiliovoicereactnative_firebasemessagingservice_enabled' },
|
|
54
|
+
_: firebaseMessagingServiceEnabled.toString(),
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
strings.resources.bool = strings.resources.bool || [];
|
|
58
|
+
strings.resources.bool = strings.resources.bool.filter(
|
|
59
|
+
(item) =>
|
|
60
|
+
item.$.name !==
|
|
61
|
+
'twiliovoicereactnative_firebasemessagingservice_enabled'
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
strings.resources.bool.push(fcmServiceConfig);
|
|
65
|
+
|
|
66
|
+
return config;
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
config = withAppBuildGradle(config, (config) => {
|
|
70
|
+
let buildGradle = config.modResults.contents;
|
|
71
|
+
|
|
72
|
+
if (!buildGradle.includes('com.google.gms.google-services')) {
|
|
73
|
+
const pluginRegex = /(apply plugin: ['"]com\.android\.application['"])/;
|
|
74
|
+
if (pluginRegex.test(buildGradle)) {
|
|
75
|
+
buildGradle = buildGradle.replace(
|
|
76
|
+
pluginRegex,
|
|
77
|
+
'$1\napply plugin: "com.google.gms.google-services"'
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const firebaseDeps = [
|
|
83
|
+
"implementation 'com.google.firebase:firebase-messaging:23.0.0'",
|
|
84
|
+
"implementation 'com.google.firebase:firebase-core:21.0.0'",
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
const dependenciesRegex = /dependencies\s*\{/;
|
|
88
|
+
if (dependenciesRegex.test(buildGradle)) {
|
|
89
|
+
firebaseDeps.forEach((dep) => {
|
|
90
|
+
if (!buildGradle.includes(dep)) {
|
|
91
|
+
buildGradle = buildGradle.replace(
|
|
92
|
+
dependenciesRegex,
|
|
93
|
+
`dependencies {\n ${dep}`
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
config.modResults.contents = buildGradle;
|
|
100
|
+
return config;
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
config = withAppBuildGradle(config, (config) => {
|
|
104
|
+
let buildGradle = config.modResults.contents;
|
|
105
|
+
|
|
106
|
+
const kotlinVersion = '2.0.21';
|
|
107
|
+
|
|
108
|
+
if (!buildGradle.includes('kotlin-gradle-plugin')) {
|
|
109
|
+
const buildscriptRegex = /buildscript\s*\{[\s\S]*?dependencies\s*\{/;
|
|
110
|
+
if (buildscriptRegex.test(buildGradle)) {
|
|
111
|
+
buildGradle = buildGradle.replace(
|
|
112
|
+
/dependencies\s*\{/,
|
|
113
|
+
`dependencies {\n classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}"`
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (!buildGradle.includes('kotlin-android')) {
|
|
119
|
+
const pluginRegex = /(apply plugin: ['"]com\.android\.application['"])/;
|
|
120
|
+
if (pluginRegex.test(buildGradle)) {
|
|
121
|
+
buildGradle = buildGradle.replace(
|
|
122
|
+
pluginRegex,
|
|
123
|
+
'$1\napply plugin: "kotlin-android"'
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
config.modResults.contents = buildGradle;
|
|
129
|
+
return config;
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
config = withProjectBuildGradle(config, (config) => {
|
|
133
|
+
config.modResults.contents = setClassPath(
|
|
134
|
+
config,
|
|
135
|
+
config.modResults.contents
|
|
136
|
+
);
|
|
137
|
+
return config;
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
if (googleServicesJsonPath && fs.existsSync(googleServicesJsonPath)) {
|
|
141
|
+
config = withAppBuildGradle(config, (config) => {
|
|
142
|
+
console.log(
|
|
143
|
+
'📁 google-services.json will be copied from:',
|
|
144
|
+
googleServicesJsonPath
|
|
145
|
+
);
|
|
146
|
+
return config;
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
config = withGoogleServicesJson(config, googleServicesJsonPath);
|
|
151
|
+
|
|
152
|
+
return config;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function withGoogleServicesJson(config, googleServicesJsonPath) {
|
|
156
|
+
return withAppBuildGradle(config, async (config) => {
|
|
157
|
+
if (googleServicesJsonPath && fs.existsSync(googleServicesJsonPath)) {
|
|
158
|
+
const projectRoot = config.modRequest.projectRoot;
|
|
159
|
+
const targetPath = path.join(
|
|
160
|
+
projectRoot,
|
|
161
|
+
'android',
|
|
162
|
+
'app',
|
|
163
|
+
'google-services.json'
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
try {
|
|
167
|
+
fs.copyFileSync(googleServicesJsonPath, targetPath);
|
|
168
|
+
console.log('✅ google-services.json copied successfully');
|
|
169
|
+
} catch (error) {
|
|
170
|
+
console.warn('⚠️ Failed to copy google-services.json:', error.message);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return config;
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function setClassPath(config, buildGradle) {
|
|
178
|
+
if (buildGradle.includes(googleServicesClassPath)) {
|
|
179
|
+
return buildGradle;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
//
|
|
183
|
+
return buildGradle.replace(
|
|
184
|
+
/dependencies\s?{/,
|
|
185
|
+
`dependencies {
|
|
186
|
+
classpath('${googleServicesClassPath}:${googleServicesVersion}')`
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
module.exports = withTwilioVoiceAndroid;
|
|
191
|
+
module.exports.withGoogleServicesJson = withGoogleServicesJson;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const {
|
|
2
|
+
withInfoPlist,
|
|
3
|
+
withEntitlementsPlist,
|
|
4
|
+
} = require('@expo/config-plugins');
|
|
5
|
+
|
|
6
|
+
function withTwilioVoiceIOS(config) {
|
|
7
|
+
config = withInfoPlist(config, (configuration) => {
|
|
8
|
+
configuration.modResults.NSMicrophoneUsageDescription =
|
|
9
|
+
'This app needs access to the microphone for voice calls and recording voice messages';
|
|
10
|
+
configuration.modResults.UIBackgroundModes = ['audio', 'voip'];
|
|
11
|
+
return configuration;
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
config = withEntitlementsPlist(config, (configuration) => {
|
|
15
|
+
configuration.modResults['aps-environment'] = ['development'];
|
|
16
|
+
return configuration;
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
return config;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = withTwilioVoiceIOS;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//
|
|
2
|
+
// TwilioVoicePushRegistry.h
|
|
3
|
+
// TwilioVoiceReactNative
|
|
4
|
+
//
|
|
5
|
+
// Copyright © 2022 Twilio, Inc. All rights reserved.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
FOUNDATION_EXPORT NSString * const kTwilioVoicePushRegistryNotification;
|
|
9
|
+
FOUNDATION_EXPORT NSString * const kTwilioVoicePushRegistryEventType;
|
|
10
|
+
FOUNDATION_EXPORT NSString * const kTwilioVoicePushRegistryNotificationDeviceTokenUpdated;
|
|
11
|
+
FOUNDATION_EXPORT NSString * const kTwilioVoicePushRegistryNotificationDeviceToken;
|
|
12
|
+
FOUNDATION_EXPORT NSString * const kTwilioVoicePushRegistryNotificationIncomingPushReceived;
|
|
13
|
+
FOUNDATION_EXPORT NSString * const kTwilioVoicePushRegistryNotificationIncomingPushPayload;
|
|
14
|
+
|
|
15
|
+
@interface TwilioVoicePushRegistry : NSObject
|
|
16
|
+
|
|
17
|
+
- (void)updatePushRegistry;
|
|
18
|
+
|
|
19
|
+
@end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//
|
|
2
|
+
// TwilioVoicePushRegistry.m
|
|
3
|
+
// TwilioVoiceReactNative
|
|
4
|
+
//
|
|
5
|
+
// Copyright © 2022 Twilio, Inc. All rights reserved.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
@import PushKit;
|
|
9
|
+
@import Foundation;
|
|
10
|
+
@import TwilioVoice;
|
|
11
|
+
|
|
12
|
+
#import "TwilioVoicePushRegistry.h"
|
|
13
|
+
#import "TwilioVoiceReactNative.h"
|
|
14
|
+
#import "TwilioVoiceReactNativeConstants.h"
|
|
15
|
+
|
|
16
|
+
NSString * const kTwilioVoicePushRegistryNotification = @"TwilioVoicePushRegistryNotification";
|
|
17
|
+
NSString * const kTwilioVoicePushRegistryEventType = @"type";
|
|
18
|
+
NSString * const kTwilioVoicePushRegistryNotificationDeviceTokenUpdated = @"deviceTokenUpdated";
|
|
19
|
+
NSString * const kTwilioVoicePushRegistryNotificationDeviceToken = @"deviceToken";
|
|
20
|
+
NSString * const kTwilioVoicePushRegistryNotificationIncomingPushReceived = @"incomingPushReceived";
|
|
21
|
+
NSString * const kTwilioVoicePushRegistryNotificationIncomingPushPayload = @"incomingPushPayload";
|
|
22
|
+
|
|
23
|
+
@interface TwilioVoicePushRegistry () <PKPushRegistryDelegate>
|
|
24
|
+
|
|
25
|
+
@property (nonatomic, strong) PKPushRegistry *voipRegistry;
|
|
26
|
+
@property (nonatomic, copy) NSString *callInviteUuid;
|
|
27
|
+
|
|
28
|
+
@end
|
|
29
|
+
|
|
30
|
+
@implementation TwilioVoicePushRegistry
|
|
31
|
+
|
|
32
|
+
#pragma mark - TwilioVoicePushRegistry methods
|
|
33
|
+
|
|
34
|
+
- (void)updatePushRegistry {
|
|
35
|
+
self.voipRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
|
|
36
|
+
self.voipRegistry.delegate = self;
|
|
37
|
+
self.voipRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
#pragma mark - PKPushRegistryDelegate
|
|
41
|
+
|
|
42
|
+
- (void)pushRegistry:(PKPushRegistry *)registry
|
|
43
|
+
didUpdatePushCredentials:(PKPushCredentials *)credentials
|
|
44
|
+
forType:(NSString *)type {
|
|
45
|
+
if ([type isEqualToString:PKPushTypeVoIP]) {
|
|
46
|
+
[[NSNotificationCenter defaultCenter] postNotificationName:kTwilioVoicePushRegistryNotification
|
|
47
|
+
object:nil
|
|
48
|
+
userInfo:@{kTwilioVoicePushRegistryEventType: kTwilioVoicePushRegistryNotificationDeviceTokenUpdated,
|
|
49
|
+
kTwilioVoicePushRegistryNotificationDeviceToken: credentials.token}];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
- (void)pushRegistry:(PKPushRegistry *)registry
|
|
54
|
+
didReceiveIncomingPushWithPayload:(PKPushPayload *)payload
|
|
55
|
+
forType:(PKPushType)type
|
|
56
|
+
withCompletionHandler:(void (^)(void))completion {
|
|
57
|
+
if ([type isEqualToString:PKPushTypeVoIP]) {
|
|
58
|
+
[[NSNotificationCenter defaultCenter] postNotificationName:kTwilioVoicePushRegistryNotification
|
|
59
|
+
object:nil
|
|
60
|
+
userInfo:@{kTwilioVoicePushRegistryEventType: kTwilioVoicePushRegistryNotificationIncomingPushReceived,
|
|
61
|
+
kTwilioVoicePushRegistryNotificationIncomingPushPayload: payload.dictionaryPayload}];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
completion();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
- (void)pushRegistry:(PKPushRegistry *)registry
|
|
68
|
+
didInvalidatePushTokenForType:(NSString *)type {
|
|
69
|
+
// TODO: notify view-controller to emit event that the push-registry has been invalidated
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
//
|
|
2
|
+
// TwilioVoiceReactNative+CallInvite.m
|
|
3
|
+
// TwilioVoiceReactNative
|
|
4
|
+
//
|
|
5
|
+
// Copyright © 2023 Twilio, Inc. All rights reserved.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
@import TwilioVoice;
|
|
9
|
+
|
|
10
|
+
#import "TwilioVoiceReactNative.h"
|
|
11
|
+
#import "TwilioVoiceReactNativeConstants.h"
|
|
12
|
+
|
|
13
|
+
@interface TwilioVoiceReactNative (CallInvite) <TVONotificationDelegate>
|
|
14
|
+
|
|
15
|
+
@end
|
|
16
|
+
|
|
17
|
+
@implementation TwilioVoiceReactNative (CallInvite)
|
|
18
|
+
|
|
19
|
+
- (void)callInviteReceived:(TVOCallInvite *)callInvite {
|
|
20
|
+
self.callInviteMap[callInvite.uuid.UUIDString] = callInvite;
|
|
21
|
+
|
|
22
|
+
[self reportNewIncomingCall:callInvite];
|
|
23
|
+
|
|
24
|
+
[self sendEventWithName:kTwilioVoiceReactNativeScopeVoice
|
|
25
|
+
body:@{
|
|
26
|
+
kTwilioVoiceReactNativeVoiceEventType: kTwilioVoiceReactNativeVoiceEventTypeValueIncomingCallInvite,
|
|
27
|
+
kTwilioVoiceReactNativeEventKeyCallInvite: [self callInviteInfo:callInvite]}];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
- (void)cancelledCallInviteReceived:(TVOCancelledCallInvite *)cancelledCallInvite error:(NSError *)error {
|
|
31
|
+
NSString *uuid;
|
|
32
|
+
for (NSString *uuidKey in [self.callInviteMap allKeys]) {
|
|
33
|
+
TVOCallInvite *callInvite = self.callInviteMap[uuidKey];
|
|
34
|
+
if ([callInvite.callSid isEqualToString:cancelledCallInvite.callSid]) {
|
|
35
|
+
uuid = uuidKey;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
NSAssert(uuid, @"No matching call invite");
|
|
40
|
+
self.cancelledCallInviteMap[uuid] = cancelledCallInvite;
|
|
41
|
+
|
|
42
|
+
[self sendEventWithName:kTwilioVoiceReactNativeScopeCallInvite
|
|
43
|
+
body:@{
|
|
44
|
+
kTwilioVoiceReactNativeVoiceEventType: kTwilioVoiceReactNativeCallInviteEventTypeValueCancelled,
|
|
45
|
+
kTwilioVoiceReactNativeCallInviteEventKeyCallSid: cancelledCallInvite.callSid,
|
|
46
|
+
kTwilioVoiceReactNativeEventKeyCancelledCallInvite: [self cancelledCallInviteInfo:cancelledCallInvite],
|
|
47
|
+
kTwilioVoiceReactNativeVoiceErrorKeyError: @{
|
|
48
|
+
kTwilioVoiceReactNativeVoiceErrorKeyCode: @(error.code),
|
|
49
|
+
kTwilioVoiceReactNativeVoiceErrorKeyMessage: [error localizedDescription]}}];
|
|
50
|
+
|
|
51
|
+
[self.callInviteMap removeObjectForKey:uuid];
|
|
52
|
+
|
|
53
|
+
[self endCallWithUuid:[[NSUUID alloc] initWithUUIDString:uuid]];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@end
|