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.
Files changed (227) hide show
  1. package/LICENSE +206 -0
  2. package/README.md +179 -0
  3. package/android/build.gradle +113 -0
  4. package/android/gradle.properties +29 -0
  5. package/android/src/main/AndroidManifest.xml +30 -0
  6. package/android/src/main/java/com/twiliovoicereactnative/AudioSwitchManager.java +141 -0
  7. package/android/src/main/java/com/twiliovoicereactnative/CallListenerProxy.java +186 -0
  8. package/android/src/main/java/com/twiliovoicereactnative/CallMessageListenerProxy.java +103 -0
  9. package/android/src/main/java/com/twiliovoicereactnative/CallRecordDatabase.java +183 -0
  10. package/android/src/main/java/com/twiliovoicereactnative/CommonConstants.java +195 -0
  11. package/android/src/main/java/com/twiliovoicereactnative/ConfigurationProperties.java +41 -0
  12. package/android/src/main/java/com/twiliovoicereactnative/Constants.java +23 -0
  13. package/android/src/main/java/com/twiliovoicereactnative/ExpoActivityLifecycleListener.java +27 -0
  14. package/android/src/main/java/com/twiliovoicereactnative/ExpoApplicationLifecycleListener.java +14 -0
  15. package/android/src/main/java/com/twiliovoicereactnative/ExpoModule.kt +36 -0
  16. package/android/src/main/java/com/twiliovoicereactnative/ExpoPackage.java +20 -0
  17. package/android/src/main/java/com/twiliovoicereactnative/JSEventEmitter.java +98 -0
  18. package/android/src/main/java/com/twiliovoicereactnative/MediaPlayerManager.java +58 -0
  19. package/android/src/main/java/com/twiliovoicereactnative/NotificationUtility.java +363 -0
  20. package/android/src/main/java/com/twiliovoicereactnative/ReactNativeArgumentsSerializer.java +276 -0
  21. package/android/src/main/java/com/twiliovoicereactnative/SDKLog.java +74 -0
  22. package/android/src/main/java/com/twiliovoicereactnative/StatsListenerProxy.java +178 -0
  23. package/android/src/main/java/com/twiliovoicereactnative/TwilioVoiceReactNativeModule.java +778 -0
  24. package/android/src/main/java/com/twiliovoicereactnative/TwilioVoiceReactNativePackage.java +28 -0
  25. package/android/src/main/java/com/twiliovoicereactnative/VoiceActivityProxy.java +101 -0
  26. package/android/src/main/java/com/twiliovoicereactnative/VoiceApplicationProxy.java +133 -0
  27. package/android/src/main/java/com/twiliovoicereactnative/VoiceFirebaseMessagingService.java +88 -0
  28. package/android/src/main/java/com/twiliovoicereactnative/VoiceService.java +403 -0
  29. package/android/src/main/res/drawable/answered_call_small_icon.png +0 -0
  30. package/android/src/main/res/drawable/ic_launcher_round.png +0 -0
  31. package/android/src/main/res/drawable/ic_launcher_sdk.png +0 -0
  32. package/android/src/main/res/drawable/incoming_call_small_icon.png +0 -0
  33. package/android/src/main/res/drawable/outgoing_call_small_icon.png +0 -0
  34. package/android/src/main/res/raw/disconnect.wav +0 -0
  35. package/android/src/main/res/raw/incoming.wav +0 -0
  36. package/android/src/main/res/raw/outgoing.wav +0 -0
  37. package/android/src/main/res/raw/ringtone.wav +0 -0
  38. package/android/src/main/res/raw/silent.wav +0 -0
  39. package/android/src/main/res/values/colors.xml +11 -0
  40. package/android/src/main/res/values/config.xml +5 -0
  41. package/android/src/main/res/values/dimens.xml +7 -0
  42. package/android/src/main/res/values/strings.xml +25 -0
  43. package/android/src/main/res/values/styles.xml +10 -0
  44. package/android/src/main/res/values-night/colors.xml +11 -0
  45. package/expo-config-plugin/android.js +191 -0
  46. package/expo-config-plugin/ios.js +22 -0
  47. package/expo-module.config.json +6 -0
  48. package/ios/TwilioVoicePushRegistry.h +19 -0
  49. package/ios/TwilioVoicePushRegistry.m +72 -0
  50. package/ios/TwilioVoiceReactNative+CallInvite.m +56 -0
  51. package/ios/TwilioVoiceReactNative+CallKit.m +533 -0
  52. package/ios/TwilioVoiceReactNative+CallMessage.m +81 -0
  53. package/ios/TwilioVoiceReactNative.h +74 -0
  54. package/ios/TwilioVoiceReactNative.m +1046 -0
  55. package/ios/TwilioVoiceReactNative.xcodeproj/project.pbxproj +328 -0
  56. package/ios/TwilioVoiceReactNativeConstants.h +200 -0
  57. package/ios/Utilities/TwilioVoiceStatsReport.h +175 -0
  58. package/lib/commonjs/AudioDevice.js +101 -0
  59. package/lib/commonjs/AudioDevice.js.map +1 -0
  60. package/lib/commonjs/Call.js +765 -0
  61. package/lib/commonjs/Call.js.map +1 -0
  62. package/lib/commonjs/CallInvite.js +452 -0
  63. package/lib/commonjs/CallInvite.js.map +1 -0
  64. package/lib/commonjs/CallMessage/CallMessage.js +54 -0
  65. package/lib/commonjs/CallMessage/CallMessage.js.map +1 -0
  66. package/lib/commonjs/CallMessage/IncomingCallMessage.js +120 -0
  67. package/lib/commonjs/CallMessage/IncomingCallMessage.js.map +1 -0
  68. package/lib/commonjs/CallMessage/OutgoingCallMessage.js +148 -0
  69. package/lib/commonjs/CallMessage/OutgoingCallMessage.js.map +1 -0
  70. package/lib/commonjs/ExpoModule.js +69 -0
  71. package/lib/commonjs/ExpoModule.js.map +1 -0
  72. package/lib/commonjs/Voice.js +611 -0
  73. package/lib/commonjs/Voice.js.map +1 -0
  74. package/lib/commonjs/common.js +26 -0
  75. package/lib/commonjs/common.js.map +1 -0
  76. package/lib/commonjs/constants.js +158 -0
  77. package/lib/commonjs/constants.js.map +1 -0
  78. package/lib/commonjs/error/InvalidArgumentError.js +32 -0
  79. package/lib/commonjs/error/InvalidArgumentError.js.map +1 -0
  80. package/lib/commonjs/error/InvalidStateError.js +33 -0
  81. package/lib/commonjs/error/InvalidStateError.js.map +1 -0
  82. package/lib/commonjs/error/TwilioError.js +38 -0
  83. package/lib/commonjs/error/TwilioError.js.map +1 -0
  84. package/lib/commonjs/error/UnsupportedPlatformError.js +33 -0
  85. package/lib/commonjs/error/UnsupportedPlatformError.js.map +1 -0
  86. package/lib/commonjs/error/generated.js +2343 -0
  87. package/lib/commonjs/error/generated.js.map +1 -0
  88. package/lib/commonjs/error/index.js +112 -0
  89. package/lib/commonjs/error/index.js.map +1 -0
  90. package/lib/commonjs/error/utility.js +37 -0
  91. package/lib/commonjs/error/utility.js.map +1 -0
  92. package/lib/commonjs/index.js +95 -0
  93. package/lib/commonjs/index.js.map +1 -0
  94. package/lib/commonjs/type/AudioDevice.js +6 -0
  95. package/lib/commonjs/type/AudioDevice.js.map +1 -0
  96. package/lib/commonjs/type/Call.js +6 -0
  97. package/lib/commonjs/type/Call.js.map +1 -0
  98. package/lib/commonjs/type/CallInvite.js +6 -0
  99. package/lib/commonjs/type/CallInvite.js.map +1 -0
  100. package/lib/commonjs/type/CallKit.js +30 -0
  101. package/lib/commonjs/type/CallKit.js.map +1 -0
  102. package/lib/commonjs/type/CallMessage.js +6 -0
  103. package/lib/commonjs/type/CallMessage.js.map +1 -0
  104. package/lib/commonjs/type/Error.js +6 -0
  105. package/lib/commonjs/type/Error.js.map +1 -0
  106. package/lib/commonjs/type/NativeModule.js +6 -0
  107. package/lib/commonjs/type/NativeModule.js.map +1 -0
  108. package/lib/commonjs/type/RTCStats.js +29 -0
  109. package/lib/commonjs/type/RTCStats.js.map +1 -0
  110. package/lib/commonjs/type/Voice.js +6 -0
  111. package/lib/commonjs/type/Voice.js.map +1 -0
  112. package/lib/commonjs/type/common.js +2 -0
  113. package/lib/commonjs/type/common.js.map +1 -0
  114. package/lib/module/AudioDevice.js +97 -0
  115. package/lib/module/AudioDevice.js.map +1 -0
  116. package/lib/module/Call.js +766 -0
  117. package/lib/module/Call.js.map +1 -0
  118. package/lib/module/CallInvite.js +450 -0
  119. package/lib/module/CallInvite.js.map +1 -0
  120. package/lib/module/CallMessage/CallMessage.js +51 -0
  121. package/lib/module/CallMessage/CallMessage.js.map +1 -0
  122. package/lib/module/CallMessage/IncomingCallMessage.js +116 -0
  123. package/lib/module/CallMessage/IncomingCallMessage.js.map +1 -0
  124. package/lib/module/CallMessage/OutgoingCallMessage.js +154 -0
  125. package/lib/module/CallMessage/OutgoingCallMessage.js.map +1 -0
  126. package/lib/module/ExpoModule.js +58 -0
  127. package/lib/module/ExpoModule.js.map +1 -0
  128. package/lib/module/Voice.js +598 -0
  129. package/lib/module/Voice.js.map +1 -0
  130. package/lib/module/common.js +11 -0
  131. package/lib/module/common.js.map +1 -0
  132. package/lib/module/constants.js +151 -0
  133. package/lib/module/constants.js.map +1 -0
  134. package/lib/module/error/InvalidArgumentError.js +23 -0
  135. package/lib/module/error/InvalidArgumentError.js.map +1 -0
  136. package/lib/module/error/InvalidStateError.js +24 -0
  137. package/lib/module/error/InvalidStateError.js.map +1 -0
  138. package/lib/module/error/TwilioError.js +29 -0
  139. package/lib/module/error/TwilioError.js.map +1 -0
  140. package/lib/module/error/UnsupportedPlatformError.js +24 -0
  141. package/lib/module/error/UnsupportedPlatformError.js.map +1 -0
  142. package/lib/module/error/generated.js +2315 -0
  143. package/lib/module/error/generated.js.map +1 -0
  144. package/lib/module/error/index.js +6 -0
  145. package/lib/module/error/index.js.map +1 -0
  146. package/lib/module/error/utility.js +27 -0
  147. package/lib/module/error/utility.js.map +1 -0
  148. package/lib/module/index.js +23 -0
  149. package/lib/module/index.js.map +1 -0
  150. package/lib/module/type/AudioDevice.js +2 -0
  151. package/lib/module/type/AudioDevice.js.map +1 -0
  152. package/lib/module/type/Call.js +2 -0
  153. package/lib/module/type/Call.js.map +1 -0
  154. package/lib/module/type/CallInvite.js +2 -0
  155. package/lib/module/type/CallInvite.js.map +1 -0
  156. package/lib/module/type/CallKit.js +22 -0
  157. package/lib/module/type/CallKit.js.map +1 -0
  158. package/lib/module/type/CallMessage.js +2 -0
  159. package/lib/module/type/CallMessage.js.map +1 -0
  160. package/lib/module/type/Error.js +2 -0
  161. package/lib/module/type/Error.js.map +1 -0
  162. package/lib/module/type/NativeModule.js +2 -0
  163. package/lib/module/type/NativeModule.js.map +1 -0
  164. package/lib/module/type/RTCStats.js +21 -0
  165. package/lib/module/type/RTCStats.js.map +1 -0
  166. package/lib/module/type/Voice.js +2 -0
  167. package/lib/module/type/Voice.js.map +1 -0
  168. package/lib/module/type/common.js +2 -0
  169. package/lib/module/type/common.js.map +1 -0
  170. package/lib/typescript/AudioDevice.d.ts +74 -0
  171. package/lib/typescript/Call.d.ts +874 -0
  172. package/lib/typescript/CallInvite.d.ts +484 -0
  173. package/lib/typescript/CallMessage/CallMessage.d.ts +53 -0
  174. package/lib/typescript/CallMessage/IncomingCallMessage.d.ts +75 -0
  175. package/lib/typescript/CallMessage/OutgoingCallMessage.d.ts +198 -0
  176. package/lib/typescript/ExpoModule.d.ts +13 -0
  177. package/lib/typescript/Voice.d.ts +620 -0
  178. package/lib/typescript/common.d.ts +11 -0
  179. package/lib/typescript/constants.d.ts +148 -0
  180. package/lib/typescript/error/InvalidArgumentError.d.ts +11 -0
  181. package/lib/typescript/error/InvalidStateError.d.ts +12 -0
  182. package/lib/typescript/error/TwilioError.d.ts +14 -0
  183. package/lib/typescript/error/UnsupportedPlatformError.d.ts +12 -0
  184. package/lib/typescript/error/generated.d.ts +1558 -0
  185. package/lib/typescript/error/index.d.ts +5 -0
  186. package/lib/typescript/error/utility.d.ts +12 -0
  187. package/lib/typescript/index.d.ts +18 -0
  188. package/lib/typescript/type/AudioDevice.d.ts +15 -0
  189. package/lib/typescript/type/Call.d.ts +59 -0
  190. package/lib/typescript/type/CallInvite.d.ts +40 -0
  191. package/lib/typescript/type/CallKit.d.ts +60 -0
  192. package/lib/typescript/type/CallMessage.d.ts +20 -0
  193. package/lib/typescript/type/Error.d.ts +9 -0
  194. package/lib/typescript/type/NativeModule.d.ts +59 -0
  195. package/lib/typescript/type/RTCStats.d.ts +91 -0
  196. package/lib/typescript/type/Voice.d.ts +16 -0
  197. package/lib/typescript/type/common.d.ts +15 -0
  198. package/package.json +167 -0
  199. package/src/AudioDevice.tsx +88 -0
  200. package/src/Call.tsx +1343 -0
  201. package/src/CallInvite.tsx +757 -0
  202. package/src/CallMessage/CallMessage.ts +83 -0
  203. package/src/CallMessage/IncomingCallMessage.ts +104 -0
  204. package/src/CallMessage/OutgoingCallMessage.ts +308 -0
  205. package/src/ExpoModule.ts +59 -0
  206. package/src/Voice.tsx +1010 -0
  207. package/src/common.ts +16 -0
  208. package/src/constants.ts +193 -0
  209. package/src/error/InvalidArgumentError.ts +19 -0
  210. package/src/error/InvalidStateError.ts +19 -0
  211. package/src/error/TwilioError.ts +22 -0
  212. package/src/error/UnsupportedPlatformError.ts +19 -0
  213. package/src/error/generated.ts +2277 -0
  214. package/src/error/index.ts +18 -0
  215. package/src/error/utility.ts +36 -0
  216. package/src/index.tsx +24 -0
  217. package/src/type/AudioDevice.ts +18 -0
  218. package/src/type/Call.ts +102 -0
  219. package/src/type/CallInvite.ts +59 -0
  220. package/src/type/CallKit.ts +61 -0
  221. package/src/type/CallMessage.ts +31 -0
  222. package/src/type/Error.ts +11 -0
  223. package/src/type/NativeModule.ts +93 -0
  224. package/src/type/RTCStats.ts +99 -0
  225. package/src/type/Voice.ts +31 -0
  226. package/src/type/common.ts +16 -0
  227. 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,6 @@
1
+ {
2
+ "platforms": ["android", "ios"],
3
+ "android": {
4
+ "modules": ["com.twiliovoicereactnative.ExpoModule"]
5
+ }
6
+ }
@@ -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