voice-react-native-sdk 1.6.2-fork.10

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 +94 -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 +39 -0
  14. package/android/src/main/java/com/twiliovoicereactnative/ExpoApplicationLifecycleListener.java +14 -0
  15. package/android/src/main/java/com/twiliovoicereactnative/ExpoModule.kt +41 -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 +103 -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 +24 -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 +19 -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 +25 -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,41 @@
1
+ package com.twiliovoicereactnative;
2
+
3
+ import android.content.Context;
4
+ import android.content.SharedPreferences;
5
+
6
+ class ConfigurationProperties {
7
+ public static void setIncomingCallContactHandleTemplate(Context ctx, String template) {
8
+ SharedPreferences sharedPreferences = ctx.getSharedPreferences(Constants.PREFERENCES_FILE, Context.MODE_PRIVATE);
9
+ sharedPreferences
10
+ .edit()
11
+ .putString(Constants.INCOMING_CALL_CONTACT_HANDLE_TEMPLATE_PREFERENCES_KEY, template)
12
+ .apply();
13
+ }
14
+
15
+ public static String getIncomingCallContactHandleTemplate(Context ctx) {
16
+ SharedPreferences sharedPreferences = ctx.getSharedPreferences(Constants.PREFERENCES_FILE, Context.MODE_PRIVATE);
17
+ return sharedPreferences.getString(Constants.INCOMING_CALL_CONTACT_HANDLE_TEMPLATE_PREFERENCES_KEY, null);
18
+ }
19
+
20
+ /**
21
+ * Get configuration boolean, used to determine if the built-in Firebase service should be enabled
22
+ * or not.
23
+ * @param context the application context
24
+ * @return a boolean read from the application resources
25
+ */
26
+ public static boolean isFirebaseServiceEnabled(Context context) {
27
+ return context.getResources()
28
+ .getBoolean(R.bool.twiliovoicereactnative_firebasemessagingservice_enabled);
29
+ }
30
+
31
+ /**
32
+ * Get configuration boolean, used to determine if full screen notifications are enabled
33
+ * or not.
34
+ * @param context the application context
35
+ * @return a boolean read from the application resources
36
+ */
37
+ public static boolean isFullScreenNotificationEnabled(Context context) {
38
+ return context.getResources()
39
+ .getBoolean(R.bool.twiliovoicereactnative_fullscreennotification_enabled);
40
+ }
41
+ }
@@ -0,0 +1,23 @@
1
+ package com.twiliovoicereactnative;
2
+
3
+ class Constants {
4
+ public static final String VOICE_CHANNEL_GROUP = "notification-group";
5
+ public static final String VOICE_CHANNEL_LOW_IMPORTANCE = "notification-channel-low-importance";
6
+ public static final String VOICE_CHANNEL_HIGH_IMPORTANCE = "notification-channel-high-importance";
7
+ public static final String VOICE_CHANNEL_DEFAULT_IMPORTANCE = "notification-channel-normal-importance";
8
+ public static final String ACTION_ACCEPT_CALL = "ACTION_ACCEPT_CALL";
9
+ public static final String ACTION_REJECT_CALL = "ACTION_REJECT_CALL";
10
+ public static final String ACTION_CANCEL_ACTIVE_CALL_NOTIFICATION = "ACTION_CANCEL_ACTIVE_CALL_NOTIFICATION";
11
+ public static final String ACTION_INCOMING_CALL = "ACTION_INCOMING_CALL";
12
+ public static final String ACTION_CANCEL_CALL = "ACTION_CANCEL_CALL";
13
+ public static final String ACTION_CALL_DISCONNECT = "ACTION_CALL_DISCONNECT";
14
+ public static final String ACTION_RAISE_OUTGOING_CALL_NOTIFICATION = "ACTION_RAISE_OUTGOING_CALL_NOTIFICATION";
15
+ public static final String ACTION_PUSH_APP_TO_FOREGROUND = "ACTION_PUSH_APP_TO_FOREGROUND";
16
+ public static final String ACTION_FOREGROUND_AND_DEPRIORITIZE_INCOMING_CALL_NOTIFICATION = "ACTION_FOREGROUND_AND_DEPRIORITIZE_INCOMING_CALL_NOTIFICATION";
17
+ public static final String MSG_KEY_UUID = "UUID";
18
+ public static final String JS_EVENT_KEY_CALL_INFO = "call";
19
+ public static final String JS_EVENT_KEY_CALL_INVITE_INFO = "callInvite";
20
+ public static final String JS_EVENT_KEY_CANCELLED_CALL_INVITE_INFO = "cancelledCallInvite";
21
+ public static final String PREFERENCES_FILE = "com.twilio.twiliovoicereactnative.preferences";
22
+ public static final String INCOMING_CALL_CONTACT_HANDLE_TEMPLATE_PREFERENCES_KEY = "incomingCallContactHandleTemplatePreferenceKey";
23
+ }
@@ -0,0 +1,39 @@
1
+ package com.twiliovoicereactnative;
2
+
3
+ import android.app.Activity;
4
+ import android.content.Intent;
5
+ import android.os.Bundle;
6
+ import expo.modules.core.interfaces.ReactActivityLifecycleListener;
7
+
8
+ public class ExpoActivityLifecycleListener implements ReactActivityLifecycleListener {
9
+ VoiceActivityProxy voiceActivityProxy;
10
+
11
+ @Override
12
+ public void onCreate(Activity activity, Bundle savedInstanceState) {
13
+ // Create a PermissionsRationaleNotifier implementation
14
+ VoiceActivityProxy.PermissionsRationaleNotifier notifier = new VoiceActivityProxy.PermissionsRationaleNotifier() {
15
+ @Override
16
+ public void displayRationale(String permission) {
17
+ // Log the permission rationale for debugging
18
+ SDKLog logger = new SDKLog(ExpoActivityLifecycleListener.class);
19
+ logger.debug("Permission rationale needed for: " + permission);
20
+ // You can add additional logic here to show a dialog or notification
21
+ // to the user explaining why the permission is needed
22
+ }
23
+ };
24
+
25
+ this.voiceActivityProxy = new VoiceActivityProxy(activity, notifier);
26
+ this.voiceActivityProxy.onCreate(savedInstanceState);
27
+ }
28
+
29
+ @Override
30
+ public boolean onNewIntent(Intent intent) {
31
+ this.voiceActivityProxy.onNewIntent(intent);
32
+ return false;
33
+ }
34
+
35
+ @Override
36
+ public void onDestroy(Activity activity) {
37
+ this.voiceActivityProxy.onDestroy();
38
+ }
39
+ }
@@ -0,0 +1,14 @@
1
+ package com.twiliovoicereactnative;
2
+
3
+ import android.app.Application;
4
+ import expo.modules.core.interfaces.ApplicationLifecycleListener;
5
+
6
+ public class ExpoApplicationLifecycleListener implements ApplicationLifecycleListener {
7
+ VoiceApplicationProxy voiceApplicationProxy;
8
+
9
+ @Override
10
+ public void onCreate(Application application) {
11
+ this.voiceApplicationProxy = new VoiceApplicationProxy(application);
12
+ this.voiceApplicationProxy.onCreate();
13
+ }
14
+ }
@@ -0,0 +1,41 @@
1
+ package com.twiliovoicereactnative
2
+
3
+ import expo.modules.kotlin.modules.Module
4
+ import expo.modules.kotlin.modules.ModuleDefinition
5
+ import com.twilio.voice.ConnectOptions
6
+ import java.util.UUID
7
+ import com.twiliovoicereactnative.ReactNativeArgumentsSerializer.serializeCall
8
+
9
+ class ExpoModule : Module() {
10
+ private val log = SDKLog(this.javaClass)
11
+
12
+ override fun definition() = ModuleDefinition {
13
+ Name("TwilioVoiceExpo")
14
+
15
+ Function("voice_connect") { accessToken: String ->
16
+ val context = appContext.reactContext ?: return@Function
17
+
18
+ val connectOptions = ConnectOptions.Builder(accessToken).build()
19
+ val uuid = UUID.randomUUID()
20
+ val callListenerProxy = CallListenerProxy(uuid, context)
21
+
22
+ val call = VoiceApplicationProxy.getVoiceServiceApi().connect(
23
+ connectOptions,
24
+ callListenerProxy
25
+ )
26
+
27
+ val callRecord = CallRecordDatabase.CallRecord(
28
+ uuid,
29
+ call,
30
+ "Callee", // provide a mechanism for determining the name of the callee
31
+ HashMap(), // provide a mechanism for passing custom TwiML parameters
32
+ CallRecordDatabase.CallRecord.Direction.OUTGOING,
33
+ "Display Name" // provide a mechanism for determining the notification display name of the callee
34
+ )
35
+
36
+ VoiceApplicationProxy.getCallRecordDatabase().add(callRecord)
37
+
38
+ serializeCall(callRecord)
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,20 @@
1
+ package com.twiliovoicereactnative;
2
+
3
+ import android.content.Context;
4
+ import expo.modules.core.interfaces.Package;
5
+ import expo.modules.core.interfaces.ReactActivityLifecycleListener;
6
+ import expo.modules.core.interfaces.ApplicationLifecycleListener;
7
+ import java.util.Collections;
8
+ import java.util.List;
9
+
10
+ public class ExpoPackage implements Package {
11
+ @Override
12
+ public List<? extends ReactActivityLifecycleListener> createReactActivityLifecycleListeners(Context activityContext) {
13
+ return Collections.singletonList(new ExpoActivityLifecycleListener());
14
+ }
15
+
16
+ @Override
17
+ public List<? extends ApplicationLifecycleListener> createApplicationLifecycleListeners(Context applicationContext) {
18
+ return Collections.singletonList(new ExpoApplicationLifecycleListener());
19
+ }
20
+ }
@@ -0,0 +1,98 @@
1
+ package com.twiliovoicereactnative;
2
+
3
+ import android.util.Pair;
4
+
5
+ import androidx.annotation.NonNull;
6
+ import androidx.annotation.Nullable;
7
+
8
+ import com.facebook.react.bridge.Arguments;
9
+ import com.facebook.react.bridge.ReactApplicationContext;
10
+ import com.facebook.react.bridge.ReadableArray;
11
+ import com.facebook.react.bridge.ReadableMap;
12
+ import com.facebook.react.bridge.WritableArray;
13
+ import com.facebook.react.bridge.WritableMap;
14
+ import com.facebook.react.modules.core.DeviceEventManagerModule;
15
+
16
+ import java.lang.ref.WeakReference;
17
+
18
+ class JSEventEmitter {
19
+ private static final SDKLog logger = new SDKLog(JSEventEmitter.class);
20
+ private WeakReference<ReactApplicationContext> context = new WeakReference<>(null);
21
+
22
+ public void setContext(ReactApplicationContext context) {
23
+ this.context = new WeakReference<>(context);
24
+ }
25
+ public void sendEvent(String eventName, @Nullable WritableMap params) {
26
+ logger.debug("sendEvent " + eventName + " params " + params);
27
+ if ((null != context.get()) &&
28
+ context.get().hasActiveReactInstance()) {
29
+ context.get()
30
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
31
+ .emit(eventName, params);
32
+ } else {
33
+ logger.warning(
34
+ String.format(
35
+ "attempt to sendEvent without context {%s} or Catalyst instance not active",
36
+ context.get()));
37
+ }
38
+ }
39
+
40
+ public static WritableArray constructJSArray(@NonNull Object...entries) {
41
+ WritableArray params = Arguments.createArray();
42
+ for (Object entry: entries) {
43
+ if ((entry instanceof String)) {
44
+ params.pushString((String)entry);
45
+ } else if (entry instanceof ReadableMap) {
46
+ params.pushMap((ReadableMap) entry);
47
+ } else if (entry instanceof ReadableArray) {
48
+ params.pushArray((ReadableArray) entry);
49
+ } else if (entry instanceof Boolean) {
50
+ params.pushBoolean((Boolean) entry);
51
+ } else if (entry instanceof Integer) {
52
+ params.pushInt((Integer) entry);
53
+ } else if (entry instanceof Float) {
54
+ params.pushDouble((Float) entry);
55
+ } else if (entry instanceof Double) {
56
+ params.pushDouble((Double) entry);
57
+ } else if (entry instanceof Long) {
58
+ params.pushDouble((Long) entry);
59
+ } else if (entry == null) {
60
+ logger.debug("constructJSArray: filtering null value");
61
+ } else {
62
+ logger.debug(String.format("constructJSArray: unexpected type %s", entry.getClass()));
63
+ }
64
+ }
65
+ return params;
66
+ }
67
+ @SafeVarargs
68
+ public static WritableMap constructJSMap(@NonNull Pair<String, Object>...entries) {
69
+ WritableMap params = Arguments.createMap();
70
+ for (Pair<String, Object> entry: entries) {
71
+ if ((entry.second instanceof String)) {
72
+ params.putString(entry.first, (String) entry.second);
73
+ } else if (entry.second instanceof ReadableMap) {
74
+ params.putMap(entry.first, (ReadableMap) entry.second);
75
+ } else if (entry.second instanceof ReadableArray) {
76
+ params.putArray(entry.first, (ReadableArray) entry.second);
77
+ } else if (entry.second instanceof Boolean) {
78
+ params.putBoolean(entry.first, (Boolean) entry.second);
79
+ } else if (entry.second instanceof Integer) {
80
+ params.putInt(entry.first, (Integer) entry.second);
81
+ } else if (entry.second instanceof Float) {
82
+ params.putDouble(entry.first, (Float) entry.second);
83
+ } else if (entry.second instanceof Double) {
84
+ params.putDouble(entry.first, (Double) entry.second);
85
+ } else if (entry.second instanceof Long) {
86
+ params.putDouble(entry.first, (Long) entry.second);
87
+ } else if (entry.second == null) {
88
+ logger.debug("constructJSMap: filtering null value");
89
+ } else {
90
+ logger.debug(String.format(
91
+ "constructJSMap: unexpected type %s",
92
+ entry.second.getClass()
93
+ ));
94
+ }
95
+ }
96
+ return params;
97
+ }
98
+ }
@@ -0,0 +1,58 @@
1
+ package com.twiliovoicereactnative;
2
+
3
+ import android.content.Context;
4
+ import android.media.AudioAttributes;
5
+ import android.media.SoundPool;
6
+
7
+ import java.util.HashMap;
8
+ import java.util.Map;
9
+
10
+ class MediaPlayerManager {
11
+ public enum SoundTable {
12
+ INCOMING,
13
+ OUTGOING,
14
+ DISCONNECT,
15
+ RINGTONE
16
+ }
17
+ private final SoundPool soundPool;
18
+ private final Map<SoundTable, Integer> soundMap;
19
+ private int activeStream;
20
+
21
+ MediaPlayerManager(Context context) {
22
+ soundPool = (new SoundPool.Builder())
23
+ .setMaxStreams(2)
24
+ .setAudioAttributes(
25
+ new AudioAttributes.Builder()
26
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
27
+ .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
28
+ .build())
29
+ .build();
30
+ activeStream = 0;
31
+ soundMap = new HashMap<>();
32
+ soundMap.put(SoundTable.INCOMING, soundPool.load(context, R.raw.incoming, 1));
33
+ soundMap.put(SoundTable.OUTGOING, soundPool.load(context, R.raw.outgoing, 1));
34
+ soundMap.put(SoundTable.DISCONNECT, soundPool.load(context, R.raw.disconnect, 1));
35
+ soundMap.put(SoundTable.RINGTONE, soundPool.load(context, R.raw.ringtone, 1));
36
+ }
37
+
38
+ public void play(final SoundTable sound) {
39
+ activeStream = soundPool.play(
40
+ soundMap.get(sound),
41
+ 1.f,
42
+ 1.f,
43
+ 1,
44
+ (SoundTable.DISCONNECT== sound) ? 0 : -1,
45
+ 1.f);
46
+ }
47
+
48
+ public void stop() {
49
+ soundPool.stop(activeStream);
50
+ activeStream = 0;
51
+ }
52
+
53
+ @Override
54
+ protected void finalize() throws Throwable {
55
+ soundPool.release();
56
+ super.finalize();
57
+ }
58
+ }