diff --git a/README.md b/README.md index f2305377..b76b0722 100644 --- a/README.md +++ b/README.md @@ -386,6 +386,15 @@ const options = { RNCallKeep.hasDefaultPhoneAccount(options); ``` +### backToForeground +_This feature is available only on Android._ + +Use this to display the application in foreground if the application was in background state. +This method will open the application if it was closed. + +```js +RNCallKeep.backToForeground(); +``` ## Events diff --git a/actions.js b/actions.js index 2e5ff59e..a3f85026 100644 --- a/actions.js +++ b/actions.js @@ -12,6 +12,7 @@ const RNCallKeepDidDisplayIncomingCall = 'RNCallKeepDidDisplayIncomingCall'; const RNCallKeepDidPerformSetMutedCallAction = 'RNCallKeepDidPerformSetMutedCallAction'; const RNCallKeepDidToggleHoldAction = 'RNCallKeepDidToggleHoldAction'; const RNCallKeepDidPerformDTMFAction = 'RNCallKeepDidPerformDTMFAction'; +const RNCallKeepPerformShowIncomingCallAction = 'RNCallKeepPerformShowIncomingCallAction'; const RNCallKeepProviderReset = 'RNCallKeepProviderReset'; const RNCallKeepCheckReachability = 'RNCallKeepCheckReachability'; const isIOS = Platform.OS === 'ios'; @@ -49,6 +50,9 @@ const didToggleHoldCallAction = handler => const didPerformDTMFAction = handler => eventEmitter.addListener(RNCallKeepDidPerformDTMFAction, (data) => handler(data)); +const showIncomingCall = handler => + eventEmitter.addListener(RNCallKeepPerformShowIncomingCallAction, (data) => handler(data)); + const didResetProvider = handler => eventEmitter.addListener(RNCallKeepProviderReset, handler); @@ -66,5 +70,6 @@ export const listeners = { didToggleHoldCallAction, didPerformDTMFAction, didResetProvider, + showIncomingCall, checkReachability, }; diff --git a/android/src/main/java/io/wazo/callkeep/Constants.java b/android/src/main/java/io/wazo/callkeep/Constants.java new file mode 100644 index 00000000..6efdf81c --- /dev/null +++ b/android/src/main/java/io/wazo/callkeep/Constants.java @@ -0,0 +1,20 @@ +package io.wazo.callkeep; + +public class Constants { + public static final String ACTION_ANSWER_CALL = "ACTION_ANSWER_CALL"; + public static final String ACTION_AUDIO_SESSION = "ACTION_AUDIO_SESSION"; + public static final String ACTION_CHECK_REACHABILITY = "ACTION_CHECK_REACHABILITY"; + public static final String ACTION_SHOW_INCOMING_CALL = "ACTION_SHOW_INCOMING_CALL"; + public static final String ACTION_DTMF_TONE = "ACTION_DTMF_TONE"; + public static final String ACTION_END_CALL = "ACTION_END_CALL"; + public static final String ACTION_HOLD_CALL = "ACTION_HOLD_CALL"; + public static final String ACTION_MUTE_CALL = "ACTION_MUTE_CALL"; + public static final String ACTION_ONGOING_CALL = "ACTION_ONGOING_CALL"; + public static final String ACTION_UNHOLD_CALL = "ACTION_UNHOLD_CALL"; + public static final String ACTION_UNMUTE_CALL = "ACTION_UNMUTE_CALL"; + public static final String ACTION_WAKE_APP = "ACTION_WAKE_APP"; + + public static final String EXTRA_CALL_IDENTIFIER = "EXTRA_CALL_IDENTIFIER"; + public static final String EXTRA_CALL_UUID = "EXTRA_CALL_UUID"; + public static final String EXTRA_CALLER_NAME = "EXTRA_CALLER_NAME"; +} diff --git a/android/src/main/java/io/wazo/callkeep/RNCallKeepBackgroundMessagingService.java b/android/src/main/java/io/wazo/callkeep/RNCallKeepBackgroundMessagingService.java index 9ca417dd..a1e49cec 100644 --- a/android/src/main/java/io/wazo/callkeep/RNCallKeepBackgroundMessagingService.java +++ b/android/src/main/java/io/wazo/callkeep/RNCallKeepBackgroundMessagingService.java @@ -26,9 +26,9 @@ import com.facebook.react.bridge.Arguments; import com.facebook.react.jstasks.HeadlessJsTaskConfig; -import static io.wazo.callkeep.RNCallKeepModule.EXTRA_CALLER_NAME; -import static io.wazo.callkeep.RNCallKeepModule.EXTRA_CALL_IDENTIFIER; -import static io.wazo.callkeep.RNCallKeepModule.EXTRA_CALL_UUID; +import static io.wazo.callkeep.Constants.EXTRA_CALLER_NAME; +import static io.wazo.callkeep.Constants.EXTRA_CALL_IDENTIFIER; +import static io.wazo.callkeep.Constants.EXTRA_CALL_UUID; import javax.annotation.Nullable; diff --git a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java index ef477cce..884d62f9 100644 --- a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java +++ b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java @@ -32,6 +32,7 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.view.WindowManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; @@ -56,6 +57,7 @@ import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; +import com.facebook.react.HeadlessJsTaskService; import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter; import java.lang.reflect.Array; @@ -68,26 +70,27 @@ import static android.support.v4.app.ActivityCompat.requestPermissions; +import static io.wazo.callkeep.Constants.EXTRA_CALLER_NAME; +import static io.wazo.callkeep.Constants.EXTRA_CALL_UUID; +import static io.wazo.callkeep.Constants.EXTRA_CALL_IDENTIFIER; +import static io.wazo.callkeep.Constants.ACTION_END_CALL; +import static io.wazo.callkeep.Constants.ACTION_ANSWER_CALL; +import static io.wazo.callkeep.Constants.ACTION_MUTE_CALL; +import static io.wazo.callkeep.Constants.ACTION_UNMUTE_CALL; +import static io.wazo.callkeep.Constants.ACTION_SHOW_INCOMING_CALL; +import static io.wazo.callkeep.Constants.ACTION_DTMF_TONE; +import static io.wazo.callkeep.Constants.ACTION_HOLD_CALL; +import static io.wazo.callkeep.Constants.ACTION_UNHOLD_CALL; +import static io.wazo.callkeep.Constants.ACTION_ONGOING_CALL; +import static io.wazo.callkeep.Constants.ACTION_AUDIO_SESSION; +import static io.wazo.callkeep.Constants.ACTION_CHECK_REACHABILITY; +import static io.wazo.callkeep.Constants.ACTION_WAKE_APP; + // @see https://github.com/kbagchiGWC/voice-quickstart-android/blob/9a2aff7fbe0d0a5ae9457b48e9ad408740dfb968/exampleConnectionService/src/main/java/com/twilio/voice/examples/connectionservice/VoiceConnectionServiceActivity.java public class RNCallKeepModule extends ReactContextBaseJavaModule { public static final int REQUEST_READ_PHONE_STATE = 1337; public static final int REQUEST_REGISTER_CALL_PROVIDER = 394859; - public static final String CHECKING_PERMS = "CHECKING_PERMS"; - public static final String EXTRA_CALLER_NAME = "EXTRA_CALLER_NAME"; - public static final String EXTRA_CALL_UUID = "EXTRA_CALL_UUID"; - public static final String EXTRA_CALL_IDENTIFIER = "EXTRA_CALL_IDENTIFIER"; - public static final String ACTION_END_CALL = "ACTION_END_CALL"; - public static final String ACTION_ANSWER_CALL = "ACTION_ANSWER_CALL"; - public static final String ACTION_MUTE_CALL = "ACTION_MUTE_CALL"; - public static final String ACTION_UNMUTE_CALL = "ACTION_UNMUTE_CALL"; - public static final String ACTION_DTMF_TONE = "ACTION_DTMF_TONE"; - public static final String ACTION_HOLD_CALL = "ACTION_HOLD_CALL"; - public static final String ACTION_UNHOLD_CALL = "ACTION_UNHOLD_CALL"; - public static final String ACTION_ONGOING_CALL = "ACTION_ONGOING_CALL"; - public static final String ACTION_AUDIO_SESSION = "ACTION_AUDIO_SESSION"; - public static final String ACTION_CHECK_REACHABILITY = "ACTION_CHECK_REACHABILITY"; - private static final String E_ACTIVITY_DOES_NOT_EXIST = "E_ACTIVITY_DOES_NOT_EXIST"; private static final String REACT_NATIVE_MODULE_NAME = "RNCallKeep"; private static final String[] permissions = { Manifest.permission.READ_PHONE_STATE, @@ -119,10 +122,11 @@ public void setup(ReadableMap options) { VoiceConnectionService.setAvailable(false); this._settings = options; - if (isConnectionServiceAvailable()) { + if (isConnectionServiceAvailable(_settings)) { this.registerPhoneAccount(this.getAppContext()); voiceBroadcastReceiver = new VoiceBroadcastReceiver(); registerReceiver(); + VoiceConnectionService.setPhoneAccountHandle(handle); VoiceConnectionService.setAvailable(true); } } @@ -422,16 +426,37 @@ public static Boolean isConnectionServiceAvailable() { return Build.VERSION.SDK_INT >= 23; } + @ReactMethod + public static Boolean isConnectionServiceAvailable(ReadableMap options) { + if (options != null && options.hasKey("selfManaged") && options.getBoolean("selfManaged")) { + // Self managed connection is available since api level 26 + return Build.VERSION.SDK_INT >= 26; + } else { + return isConnectionServiceAvailable(); + } + } + @ReactMethod public void backToForeground() { Context context = getAppContext(); String packageName = context.getApplicationContext().getPackageName(); Intent focusIntent = context.getPackageManager().getLaunchIntentForPackage(packageName).cloneFilter(); + Activity activity = getCurrentActivity(); + boolean isOpened = activity != null; + Log.d(TAG, "backToForeground, app isOpened ?" + (isOpened ? "true" : "false")); - focusIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + if (isOpened) { + focusIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + activity.startActivity(focusIntent); + } else { - Activity activity = getCurrentActivity(); - activity.startActivity(focusIntent); + focusIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK + + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD + + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); + + getReactApplicationContext().startActivity(focusIntent); + } } private void registerPhoneAccount(Context appContext) { @@ -445,8 +470,13 @@ private void registerPhoneAccount(Context appContext) { handle = new PhoneAccountHandle(cName, appName); PhoneAccount.Builder builder = new PhoneAccount.Builder(handle, appName) - .addSupportedUriScheme(PhoneAccount.SCHEME_SIP) - .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER | PhoneAccount.CAPABILITY_VIDEO_CALLING); + .addSupportedUriScheme(PhoneAccount.SCHEME_SIP); + + if (_settings != null && _settings.hasKey("selfManaged") && _settings.getBoolean("selfManaged")) { + builder.setCapabilities(PhoneAccount.CAPABILITY_SELF_MANAGED | PhoneAccount.CAPABILITY_VIDEO_CALLING); + } else { + builder.setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER | PhoneAccount.CAPABILITY_VIDEO_CALLING); + } if (_settings != null && _settings.hasKey("imageName")) { int identifier = appContext.getResources().getIdentifier(_settings.getString("imageName"), "drawable", appContext.getPackageName()); @@ -498,6 +528,7 @@ private void registerReceiver() { intentFilter.addAction(ACTION_ANSWER_CALL); intentFilter.addAction(ACTION_MUTE_CALL); intentFilter.addAction(ACTION_UNMUTE_CALL); + intentFilter.addAction(ACTION_SHOW_INCOMING_CALL); intentFilter.addAction(ACTION_DTMF_TONE); intentFilter.addAction(ACTION_UNHOLD_CALL); intentFilter.addAction(ACTION_HOLD_CALL); @@ -566,6 +597,12 @@ public void onReceive(Context context, Intent intent) { args.putString("callUUID", attributeMap.get(EXTRA_CALL_UUID)); sendEventToJS("RNCallKeepDidPerformDTMFAction", args); break; + case ACTION_SHOW_INCOMING_CALL: + args.putString("handle", attributeMap.get(EXTRA_CALL_IDENTIFIER)); + args.putString("callUUID", attributeMap.get(EXTRA_CALL_UUID)); + args.putString("name", attributeMap.get(EXTRA_CALLER_NAME)); + sendEventToJS("RNCallKeepPerformShowIncomingCallAction", args); + break; case ACTION_ONGOING_CALL: args.putString("handle", attributeMap.get(EXTRA_CALL_IDENTIFIER)); args.putString("callUUID", attributeMap.get(EXTRA_CALL_UUID)); @@ -578,6 +615,18 @@ public void onReceive(Context context, Intent intent) { case ACTION_CHECK_REACHABILITY: sendEventToJS("RNCallKeepCheckReachability", null); break; + case ACTION_WAKE_APP: + Intent headlessIntent = new Intent(reactContext, RNCallKeepBackgroundMessagingService.class); + headlessIntent.putExtra("callUUID", attributeMap.get(EXTRA_CALL_UUID)); + headlessIntent.putExtra("name", attributeMap.get(EXTRA_CALLER_NAME)); + headlessIntent.putExtra("handle", attributeMap.get(EXTRA_CALL_IDENTIFIER)); + Log.d(TAG, "wakeUpApplication: " + attributeMap.get(EXTRA_CALL_UUID) + ", identifier : " + attributeMap.get(EXTRA_CALL_IDENTIFIER) + ", displayName:" + attributeMap.get(EXTRA_CALLER_NAME)); + + ComponentName name = reactContext.startService(headlessIntent); + if (name != null) { + HeadlessJsTaskService.acquireWakeLockNow(reactContext); + } + break; } } } diff --git a/android/src/main/java/io/wazo/callkeep/VoiceConnection.java b/android/src/main/java/io/wazo/callkeep/VoiceConnection.java index 7c6272b0..2dab1a6e 100644 --- a/android/src/main/java/io/wazo/callkeep/VoiceConnection.java +++ b/android/src/main/java/io/wazo/callkeep/VoiceConnection.java @@ -37,17 +37,18 @@ import java.util.HashMap; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_ANSWER_CALL; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_AUDIO_SESSION; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_DTMF_TONE; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_END_CALL; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_HOLD_CALL; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_MUTE_CALL; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_UNHOLD_CALL; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_UNMUTE_CALL; -import static io.wazo.callkeep.RNCallKeepModule.EXTRA_CALLER_NAME; -import static io.wazo.callkeep.RNCallKeepModule.EXTRA_CALL_IDENTIFIER; -import static io.wazo.callkeep.RNCallKeepModule.EXTRA_CALL_UUID; +import static io.wazo.callkeep.Constants.ACTION_ANSWER_CALL; +import static io.wazo.callkeep.Constants.ACTION_AUDIO_SESSION; +import static io.wazo.callkeep.Constants.ACTION_SHOW_INCOMING_CALL; +import static io.wazo.callkeep.Constants.ACTION_DTMF_TONE; +import static io.wazo.callkeep.Constants.ACTION_END_CALL; +import static io.wazo.callkeep.Constants.ACTION_HOLD_CALL; +import static io.wazo.callkeep.Constants.ACTION_MUTE_CALL; +import static io.wazo.callkeep.Constants.ACTION_UNHOLD_CALL; +import static io.wazo.callkeep.Constants.ACTION_UNMUTE_CALL; +import static io.wazo.callkeep.Constants.EXTRA_CALLER_NAME; +import static io.wazo.callkeep.Constants.EXTRA_CALL_IDENTIFIER; +import static io.wazo.callkeep.Constants.EXTRA_CALL_UUID; @TargetApi(Build.VERSION_CODES.M) public class VoiceConnection extends Connection { @@ -72,6 +73,14 @@ public class VoiceConnection extends Connection { } } + @Override + public void onShowIncomingCallUi() { + super.onShowIncomingCallUi(); + Log.d(TAG, "onShowIncomingCallUi called"); + + sendCallRequestToActivity(ACTION_SHOW_INCOMING_CALL, handle); + } + @Override public void onExtrasChanged(Bundle extras) { super.onExtrasChanged(extras); diff --git a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java index 3ab7af7e..3c5e4c9d 100644 --- a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java +++ b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java @@ -33,6 +33,7 @@ import android.telecom.ConnectionRequest; import android.telecom.ConnectionService; import android.telecom.DisconnectCause; +import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; import android.telecom.TelecomManager; import android.util.Log; @@ -40,10 +41,6 @@ import android.app.ActivityManager; import android.app.ActivityManager.RunningTaskInfo; -import com.facebook.react.HeadlessJsTaskService; -import com.facebook.react.bridge.ReactContext; -import com.facebook.react.common.LifecycleState; - import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -53,20 +50,13 @@ import java.util.UUID; import java.util.stream.Collectors; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_ANSWER_CALL; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_AUDIO_SESSION; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_DTMF_TONE; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_END_CALL; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_HOLD_CALL; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_MUTE_CALL; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_ONGOING_CALL; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_UNHOLD_CALL; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_UNMUTE_CALL; -import static io.wazo.callkeep.RNCallKeepModule.ACTION_CHECK_REACHABILITY; -import static io.wazo.callkeep.RNCallKeepModule.EXTRA_CALLER_NAME; -import static io.wazo.callkeep.RNCallKeepModule.EXTRA_CALL_IDENTIFIER; -import static io.wazo.callkeep.RNCallKeepModule.EXTRA_CALL_UUID; -import static io.wazo.callkeep.RNCallKeepModule.handle; +import static io.wazo.callkeep.Constants.ACTION_AUDIO_SESSION; +import static io.wazo.callkeep.Constants.ACTION_ONGOING_CALL; +import static io.wazo.callkeep.Constants.ACTION_CHECK_REACHABILITY; +import static io.wazo.callkeep.Constants.ACTION_WAKE_APP; +import static io.wazo.callkeep.Constants.EXTRA_CALLER_NAME; +import static io.wazo.callkeep.Constants.EXTRA_CALL_IDENTIFIER; +import static io.wazo.callkeep.Constants.EXTRA_CALL_UUID; // @see https://github.com/kbagchiGWC/voice-quickstart-android/blob/9a2aff7fbe0d0a5ae9457b48e9ad408740dfb968/exampleConnectionService/src/main/java/com/twilio/voice/examples/connectionservice/VoiceConnectionService.java @TargetApi(Build.VERSION_CODES.M) @@ -76,6 +66,7 @@ public class VoiceConnectionService extends ConnectionService { private static Boolean isReachable; private static String notReachableCallUuid; private static ConnectionRequest currentConnectionRequest; + private static PhoneAccountHandle phoneAccountHandle; private static String TAG = "RNCK:VoiceConnectionService"; public static Map currentConnections = new HashMap<>(); public static Boolean hasOutgoingCall = false; @@ -98,6 +89,10 @@ public VoiceConnectionService() { currentConnectionService = this; } + public static void setPhoneAccountHandle(PhoneAccountHandle phoneAccountHandle) { + VoiceConnectionService.phoneAccountHandle = phoneAccountHandle; + } + public static void setAvailable(Boolean value) { Log.d(TAG, "setAvailable: " + (value ? "true" : "false")); if (value) { @@ -196,19 +191,11 @@ private Connection makeOutgoingCall(ConnectionRequest request, String uuid, Bool } private void wakeUpApplication(String uuid, String identifier, String displayName) { - Intent headlessIntent = new Intent( - this.getApplicationContext(), - RNCallKeepBackgroundMessagingService.class - ); - headlessIntent.putExtra("callUUID", uuid); - headlessIntent.putExtra("name", displayName); - headlessIntent.putExtra("handle", identifier); - Log.d(TAG, "wakeUpApplication: " + uuid + ", identifier : " + identifier + ", displayName:" + displayName); - - ComponentName name = this.getApplicationContext().startService(headlessIntent); - if (name != null) { - HeadlessJsTaskService.acquireWakeLockNow(this.getApplicationContext()); - } + HashMap extrasMap = new HashMap(); + extrasMap.put(EXTRA_CALL_UUID, uuid); + extrasMap.put(EXTRA_CALLER_NAME, displayName); + extrasMap.put(EXTRA_CALL_IDENTIFIER, identifier); + sendCallRequestToActivity(ACTION_WAKE_APP, extrasMap); } private void wakeUpAfterReachabilityTimeout(ConnectionRequest request) { @@ -248,6 +235,13 @@ private Connection createConnection(ConnectionRequest request) { extrasMap.put(EXTRA_CALL_IDENTIFIER, request.getAddress().toString()); VoiceConnection connection = new VoiceConnection(this, extrasMap); connection.setConnectionCapabilities(Connection.CAPABILITY_MUTE); + + TelecomManager telecomManager = (TelecomManager) this.getApplicationContext().getSystemService(Context.TELECOM_SERVICE); + PhoneAccount phoneAccount = telecomManager.getPhoneAccount(request.getAccountHandle()); + if ((phoneAccount.getCapabilities() & PhoneAccount.CAPABILITY_SELF_MANAGED) != 0) { + connection.setConnectionProperties(Connection.PROPERTY_SELF_MANAGED); + } + connection.setInitializing(); connection.setExtras(extras); currentConnections.put(extras.getString(EXTRA_CALL_UUID), connection); @@ -271,9 +265,7 @@ public void onConference(Connection connection1, Connection connection2) { VoiceConnection voiceConnection1 = (VoiceConnection) connection1; VoiceConnection voiceConnection2 = (VoiceConnection) connection2; - PhoneAccountHandle phoneAccountHandle = RNCallKeepModule.handle; - - VoiceConference voiceConference = new VoiceConference(handle); + VoiceConference voiceConference = new VoiceConference(phoneAccountHandle); voiceConference.addConnection(voiceConnection1); voiceConference.addConnection(voiceConnection2); diff --git a/example/App.js b/example/App.js index 82feed7c..2e8b216d 100644 --- a/example/App.js +++ b/example/App.js @@ -45,6 +45,7 @@ RNCallKeep.setup({ alertDescription: 'This application needs to access your phone accounts', cancelButton: 'Cancel', okButton: 'ok', + selfManaged: true, }, }); @@ -163,6 +164,10 @@ export default function App() { removeCall(callUUID); }; + const showIncomingCall = ({ handle }) => { + log('show your incoming call ui') + } + const hangup = (callUUID) => { RNCallKeep.endCall(callUUID); removeCall(callUUID); @@ -203,6 +208,7 @@ export default function App() { RNCallKeep.addEventListener('didPerformSetMutedCallAction', didPerformSetMutedCallAction); RNCallKeep.addEventListener('didToggleHoldCallAction', didToggleHoldCallAction); RNCallKeep.addEventListener('endCall', endCall); + RNCallKeep.addEventListener('showIncomingCall', showIncomingCall); return () => { RNCallKeep.removeEventListener('answerCall', answerCall); @@ -211,6 +217,7 @@ export default function App() { RNCallKeep.removeEventListener('didPerformSetMutedCallAction', didPerformSetMutedCallAction); RNCallKeep.removeEventListener('didToggleHoldCallAction', didToggleHoldCallAction); RNCallKeep.removeEventListener('endCall', endCall); + RNCallKeep.removeEventListener('showIncomingCall', showIncomingCall); } }, []); diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index fe45aa1e..354c242e 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ + diff --git a/example/package.json b/example/package.json index 3924f2ad..7f1482f8 100644 --- a/example/package.json +++ b/example/package.json @@ -11,7 +11,7 @@ "react-dom": "^16.8.6", "react-native": "0.59.8", "react-native-background-timer": "^2.1.1", - "react-native-callkeep": "3.0.7", + "react-native-callkeep": "https://github.com/luxil/react-native-callkeep.git#allow-non-numbers-and-android-video", "react-native-device-info": "^2.3.2", "react-native-gesture-handler": "~1.3.0", "react-native-reanimated": "~1.1.0", diff --git a/index.d.ts b/index.d.ts index 449db32d..43cb4f94 100644 --- a/index.d.ts +++ b/index.d.ts @@ -28,6 +28,7 @@ interface IOptions { cancelButton: string, okButton: string, imageName?: string, + selfManaged?: boolean, additionalPermissions: string[], }, } @@ -53,6 +54,10 @@ export default class RNCallKeep { static hasDefaultPhoneAccount(): boolean { + } + + static answerIncomingCall(uuid: string) { + } static displayIncomingCall( diff --git a/package.json b/package.json index 8d6e5072..43388ee4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-callkeep", - "version": "3.0.13", + "version": "3.0.15", "description": "iOS 10 CallKit and Android ConnectionService Framework For React Native", "main": "index.js", "scripts": {},