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,28 @@
1
+ package com.twiliovoicereactnative;
2
+
3
+ import androidx.annotation.NonNull;
4
+
5
+ import com.facebook.react.ReactPackage;
6
+ import com.facebook.react.bridge.NativeModule;
7
+ import com.facebook.react.bridge.ReactApplicationContext;
8
+ import com.facebook.react.uimanager.ViewManager;
9
+
10
+ import java.util.ArrayList;
11
+ import java.util.Collections;
12
+ import java.util.List;
13
+
14
+ public class TwilioVoiceReactNativePackage implements ReactPackage {
15
+ @NonNull
16
+ @Override
17
+ public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
18
+ List<NativeModule> modules = new ArrayList<>();
19
+ modules.add(new TwilioVoiceReactNativeModule(reactContext));
20
+ return modules;
21
+ }
22
+
23
+ @NonNull
24
+ @Override
25
+ public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {
26
+ return Collections.emptyList();
27
+ }
28
+ }
@@ -0,0 +1,101 @@
1
+ package com.twiliovoicereactnative;
2
+
3
+ import java.util.List;
4
+ import java.util.Vector;
5
+
6
+ import android.Manifest;
7
+ import android.app.Activity;
8
+ import android.content.Intent;
9
+ import android.content.pm.PackageManager;
10
+ import android.os.Build;
11
+ import android.os.Bundle;
12
+ import android.view.Window;
13
+ import android.view.WindowManager;
14
+
15
+ import androidx.annotation.NonNull;
16
+ import androidx.core.app.ActivityCompat;
17
+ import androidx.core.content.ContextCompat;
18
+
19
+ public class VoiceActivityProxy {
20
+ private static final SDKLog logger = new SDKLog(VoiceActivityProxy.class);
21
+ private static final int PERMISSION_REQUEST_CODE = 101;
22
+ private static final String[] permissionList;
23
+ private final Activity context;
24
+ private final PermissionsRationaleNotifier notifier;
25
+
26
+ public interface PermissionsRationaleNotifier {
27
+ void displayRationale(final String permission);
28
+ }
29
+
30
+ public VoiceActivityProxy(@NonNull Activity activity,
31
+ @NonNull PermissionsRationaleNotifier notifier) {
32
+ this.context = activity;
33
+ this.notifier = notifier;
34
+ }
35
+ public void onCreate(Bundle ignoredSavedInstanceState) {
36
+ logger.debug("onCreate(): invoked");
37
+ // Ensure the microphone permission is enabled
38
+ if (!checkPermissions()) {
39
+ requestPermissions();
40
+ }
41
+ // These flags ensure that the activity can be launched when the screen is locked.
42
+ Window window = context.getWindow();
43
+ window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
44
+ | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
45
+ | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
46
+ // handle any incoming intents
47
+ handleIntent(context.getIntent());
48
+ }
49
+ public void onDestroy() {
50
+ logger.debug("onDestroy(): invoked");
51
+ }
52
+ public void onNewIntent(Intent intent) {
53
+ logger.debug("onNewIntent(...): invoked");
54
+ handleIntent(intent);
55
+ }
56
+ private void requestPermissions() {
57
+ List<String> permissionsRequestList = new Vector<>();
58
+ for (final String permission: VoiceActivityProxy.permissionList) {
59
+ permissionsRequestList.add(permission);
60
+ if (ActivityCompat.shouldShowRequestPermissionRationale(context, permission)) {
61
+ notifier.displayRationale(permission);
62
+ }
63
+ }
64
+ ActivityCompat.requestPermissions(
65
+ context,
66
+ permissionsRequestList.toArray(new String[0]),
67
+ PERMISSION_REQUEST_CODE);
68
+ }
69
+ private boolean checkPermissions() {
70
+ for (String permission: VoiceActivityProxy.permissionList) {
71
+ if (PackageManager.PERMISSION_GRANTED !=
72
+ ContextCompat.checkSelfPermission(context, permission)) {
73
+ return false;
74
+ }
75
+ }
76
+ return true;
77
+ }
78
+ private void handleIntent(Intent intent) {
79
+ String action = intent.getAction();
80
+ if ((null != action) && (!action.equals(Constants.ACTION_PUSH_APP_TO_FOREGROUND))) {
81
+ Intent copiedIntent = new Intent(intent);
82
+ copiedIntent.setClass(context.getApplicationContext(), VoiceService.class);
83
+ copiedIntent.setFlags(0);
84
+ context.getApplicationContext().startService(copiedIntent);
85
+ }
86
+ }
87
+
88
+ static {
89
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S_V2) {
90
+ permissionList = new String[] {
91
+ Manifest.permission.RECORD_AUDIO,
92
+ Manifest.permission.BLUETOOTH_CONNECT,
93
+ Manifest.permission.POST_NOTIFICATIONS };
94
+ } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) {
95
+ permissionList = new String[] {
96
+ Manifest.permission.RECORD_AUDIO, Manifest.permission.BLUETOOTH_CONNECT };
97
+ } else {
98
+ permissionList = new String[] { Manifest.permission.RECORD_AUDIO };
99
+ }
100
+ }
101
+ }
@@ -0,0 +1,133 @@
1
+ package com.twiliovoicereactnative;
2
+
3
+ import static com.twiliovoicereactnative.CallRecordDatabase.CallRecord;
4
+
5
+ import java.util.List;
6
+ import java.util.Objects;
7
+
8
+ import android.app.Application;
9
+ import android.content.ComponentName;
10
+ import android.content.Context;
11
+ import android.content.Intent;
12
+ import android.content.ServiceConnection;
13
+ import android.os.IBinder;
14
+
15
+ import com.facebook.react.ReactNativeHost;
16
+ import com.facebook.react.ReactPackage;
17
+
18
+ public class VoiceApplicationProxy {
19
+ private static final SDKLog logger = new SDKLog(VoiceApplicationProxy.class);
20
+ private static VoiceApplicationProxy instance = null;
21
+ private Application context = null;
22
+ private final CallRecordDatabase callRecordDatabase = new CallRecordDatabase();
23
+ private AudioSwitchManager audioSwitchManager;
24
+ private MediaPlayerManager mediaPlayerManager;
25
+ private JSEventEmitter jsEventEmitter;
26
+ private VoiceService.VoiceServiceAPI voiceServiceApi = null;
27
+ private final ServiceConnection voiceServiceObserver = new ServiceConnection() {
28
+ @Override
29
+ public void onServiceConnected(ComponentName name, IBinder service) {
30
+ if (name.getClassName().equals(VoiceService.class.getName()))
31
+ voiceServiceApi = (VoiceService.VoiceServiceAPI)service;
32
+ }
33
+ @Override
34
+ public void onServiceDisconnected(ComponentName name) {
35
+ voiceServiceApi = null;
36
+ }
37
+ };
38
+ public abstract static class VoiceReactNativeHost extends ReactNativeHost {
39
+ public VoiceReactNativeHost(Application application) {
40
+ super(application);
41
+ }
42
+ @Override
43
+ protected List<ReactPackage> getPackages() {
44
+ return List.of(new TwilioVoiceReactNativePackage());
45
+ }
46
+ public Application getAssociatedApplication() {
47
+ return super.getApplication();
48
+ }
49
+ }
50
+
51
+ public VoiceApplicationProxy(Application application) {
52
+ if (null != instance) {
53
+ logger.error("Voice application proxy already created!");
54
+ }
55
+ instance = this;
56
+ context = application;
57
+ }
58
+ public VoiceApplicationProxy(VoiceReactNativeHost reactNativeHost) {
59
+ if (null != instance) {
60
+ logger.error("Voice application proxy already created!");
61
+ }
62
+ instance = this;
63
+ context = reactNativeHost.getAssociatedApplication();
64
+ }
65
+ public void onCreate() {
66
+ logger.debug("onCreate(..) invoked");
67
+ // construct JS event engine
68
+ jsEventEmitter = new JSEventEmitter();
69
+ // construct notification channels
70
+ NotificationUtility.createNotificationChannels(context);
71
+ // launch and bind to voice call service
72
+ context.bindService(
73
+ new Intent(context, VoiceService.class),
74
+ voiceServiceObserver,
75
+ Context.BIND_AUTO_CREATE);
76
+ // Activate audio engine
77
+ audioSwitchManager = new AudioSwitchManager(context);
78
+ mediaPlayerManager = new MediaPlayerManager(context);
79
+ audioSwitchManager.start();
80
+ }
81
+ public void onTerminate() {
82
+ logger.debug("onTerminate(..) invoked");
83
+ // shutdown notificaiton channels
84
+ NotificationUtility.destroyNotificationChannels(context);
85
+ // shutdown audioswitch & media manager
86
+ audioSwitchManager.stop();
87
+ // verify that no call records are leaked
88
+ for (CallRecord callRecord: callRecordDatabase.getCollection()) {
89
+ logger.warning(
90
+ String.format(
91
+ "Call Record leaked: { uuid: %s callSid: %s }",
92
+ (null != callRecord.getUuid()) ? callRecord.getUuid() : "null",
93
+ (null != callRecord.getCallSid()) ? callRecord.getCallSid() : "null"));
94
+ }
95
+ callRecordDatabase.clear();
96
+ }
97
+ static CallRecordDatabase getCallRecordDatabase() {
98
+ return VoiceApplicationProxy.instance.callRecordDatabase;
99
+ }
100
+ static AudioSwitchManager getAudioSwitchManager() {
101
+ return VoiceApplicationProxy.instance.audioSwitchManager;
102
+ }
103
+ static MediaPlayerManager getMediaPlayerManager() {
104
+ return VoiceApplicationProxy.instance.mediaPlayerManager;
105
+ }
106
+ static JSEventEmitter getJSEventEmitter() {
107
+ return VoiceApplicationProxy.instance.jsEventEmitter;
108
+ }
109
+
110
+ static Context getApplicationContext() {
111
+ return VoiceApplicationProxy.instance.context;
112
+ }
113
+
114
+ static Class<?> getMainActivityClass() {
115
+ Context context = VoiceApplicationProxy.instance.context;
116
+ String packageName = context.getPackageName();
117
+ Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(packageName);
118
+ ComponentName componentName = Objects.requireNonNull(launchIntent).getComponent();
119
+ try {
120
+ return Class.forName(Objects.requireNonNull(componentName).getClassName());
121
+ } catch (ClassNotFoundException e) {
122
+ e.printStackTrace();
123
+ return null;
124
+ }
125
+ }
126
+
127
+ static VoiceService.VoiceServiceAPI getVoiceServiceApi() {
128
+ if (null == VoiceApplicationProxy.instance.voiceServiceApi) {
129
+ logger.error("Voice Service not bound!");
130
+ }
131
+ return VoiceApplicationProxy.instance.voiceServiceApi;
132
+ }
133
+ }
@@ -0,0 +1,88 @@
1
+ package com.twiliovoicereactnative;
2
+
3
+ import static com.twiliovoicereactnative.VoiceApplicationProxy.getCallRecordDatabase;
4
+ import static com.twiliovoicereactnative.VoiceApplicationProxy.getVoiceServiceApi;
5
+
6
+ import com.twiliovoicereactnative.CallRecordDatabase.CallRecord;
7
+
8
+ import android.os.PowerManager;
9
+ import androidx.annotation.NonNull;
10
+ import androidx.annotation.Nullable;
11
+
12
+ import com.google.firebase.messaging.FirebaseMessagingService;
13
+ import com.google.firebase.messaging.RemoteMessage;
14
+ import com.twilio.voice.CallException;
15
+ import com.twilio.voice.CallInvite;
16
+ import com.twilio.voice.CancelledCallInvite;
17
+ import com.twilio.voice.MessageListener;
18
+ import com.twilio.voice.Voice;
19
+
20
+ import java.util.Objects;
21
+ import java.util.UUID;
22
+
23
+ public class VoiceFirebaseMessagingService extends FirebaseMessagingService {
24
+ private static final SDKLog logger = new SDKLog(VoiceFirebaseMessagingService.class);
25
+
26
+ public static class MessageHandler implements MessageListener {
27
+ @Override
28
+ public void onCallInvite(@NonNull CallInvite callInvite) {
29
+ logger.log(String.format("onCallInvite %s", callInvite.getCallSid()));
30
+
31
+ final CallRecord callRecord = new CallRecord(UUID.randomUUID(), callInvite);
32
+
33
+ getCallRecordDatabase().add(callRecord);
34
+ getVoiceServiceApi().incomingCall(callRecord);
35
+ }
36
+
37
+ @Override
38
+ public void onCancelledCallInvite(@NonNull CancelledCallInvite cancelledCallInvite,
39
+ @Nullable CallException callException) {
40
+ logger.log(String.format("onCancelledCallInvite %s", cancelledCallInvite.getCallSid()));
41
+
42
+ CallRecord callRecord = Objects.requireNonNull(
43
+ getCallRecordDatabase().remove(new CallRecord(cancelledCallInvite.getCallSid())));
44
+
45
+ callRecord.setCancelledCallInvite(cancelledCallInvite);
46
+ callRecord.setCallException(callException);
47
+ getVoiceServiceApi().cancelCall(callRecord);
48
+ }
49
+ }
50
+
51
+ @Override
52
+ public void onNewToken(@NonNull String token) {
53
+ logger.log("Refreshed FCM token: " + token);
54
+ }
55
+
56
+ /**
57
+ * Called when message is received.
58
+ *
59
+ * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
60
+ */
61
+ @Override
62
+ public void onMessageReceived(RemoteMessage remoteMessage) {
63
+ logger.debug("onMessageReceived remoteMessage: " + remoteMessage.toString());
64
+ logger.debug("Bundle data: " + remoteMessage.getData());
65
+ logger.debug("From: " + remoteMessage.getFrom());
66
+
67
+ PowerManager pm = (PowerManager)getSystemService(POWER_SERVICE);
68
+ boolean isScreenOn = pm.isInteractive(); // check if screen is on
69
+ if (!isScreenOn) {
70
+ PowerManager.WakeLock wl = pm.newWakeLock(
71
+ PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP,
72
+ "VoiceFirebaseMessagingService:notificationLock");
73
+ wl.acquire(30000); //set your time in milliseconds
74
+ }
75
+
76
+ // Check if message contains a data payload.
77
+ if (!remoteMessage.getData().isEmpty()) {
78
+ if (!Voice.handleMessage(
79
+ this,
80
+ remoteMessage.getData(),
81
+ new MessageHandler(),
82
+ new CallMessageListenerProxy())) {
83
+ logger.error("The message was not a valid Twilio Voice SDK payload: " +
84
+ remoteMessage.getData());
85
+ }
86
+ }
87
+ }
88
+ }