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.
- package/LICENSE +206 -0
- package/README.md +179 -0
- package/android/build.gradle +94 -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 +39 -0
- package/android/src/main/java/com/twiliovoicereactnative/ExpoApplicationLifecycleListener.java +14 -0
- package/android/src/main/java/com/twiliovoicereactnative/ExpoModule.kt +41 -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 +103 -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 +24 -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 +19 -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 +25 -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,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
|
+
}
|
package/android/src/main/java/com/twiliovoicereactnative/ExpoApplicationLifecycleListener.java
ADDED
|
@@ -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
|
+
}
|