From 9d8f656ceaa8a0b43891b8a5f70076952dd6ae22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Mon, 9 Dec 2019 17:15:12 +0000 Subject: [PATCH 01/10] Remove dependency on RN* part from other part of Android code --- .../main/java/io/wazo/callkeep/Constants.java | 19 ++++++++++++ .../RNCallKeepBackgroundMessagingService.java | 6 ++-- .../io/wazo/callkeep/RNCallKeepModule.java | 30 +++++++++---------- .../io/wazo/callkeep/VoiceConnection.java | 22 +++++++------- .../wazo/callkeep/VoiceConnectionService.java | 29 ++++++++---------- 5 files changed, 60 insertions(+), 46 deletions(-) create mode 100644 android/src/main/java/io/wazo/callkeep/Constants.java 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..57bcf3ff --- /dev/null +++ b/android/src/main/java/io/wazo/callkeep/Constants.java @@ -0,0 +1,19 @@ +package io.wazo.callkeep; + +public class Constants { + 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_NUMBER = "EXTRA_CALL_NUMBER"; + 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"; + public static final String ACTION_WAKE_APP = "ACTION_WAKE_APP"; +} diff --git a/android/src/main/java/io/wazo/callkeep/RNCallKeepBackgroundMessagingService.java b/android/src/main/java/io/wazo/callkeep/RNCallKeepBackgroundMessagingService.java index 8770342f..c0690727 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_NUMBER; -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_NUMBER; +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 15b9cce2..a5600831 100644 --- a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java +++ b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java @@ -67,26 +67,25 @@ 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_NUMBER; +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_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; + // @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_NUMBER = "EXTRA_CALL_NUMBER"; - 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, @@ -122,6 +121,7 @@ public void setup(ReadableMap options) { this.registerPhoneAccount(this.getAppContext()); voiceBroadcastReceiver = new VoiceBroadcastReceiver(); registerReceiver(); + VoiceConnectionService.setPhoneAccountHandle(handle); VoiceConnectionService.setAvailable(true); } } diff --git a/android/src/main/java/io/wazo/callkeep/VoiceConnection.java b/android/src/main/java/io/wazo/callkeep/VoiceConnection.java index bb19b369..db788d54 100644 --- a/android/src/main/java/io/wazo/callkeep/VoiceConnection.java +++ b/android/src/main/java/io/wazo/callkeep/VoiceConnection.java @@ -37,17 +37,17 @@ 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_NUMBER; -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_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_NUMBER; +import static io.wazo.callkeep.Constants.EXTRA_CALL_UUID; @TargetApi(Build.VERSION_CODES.M) public class VoiceConnection extends Connection { diff --git a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java index f6480da7..bec4d29f 100644 --- a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java +++ b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java @@ -53,20 +53,12 @@ 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_NUMBER; -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.EXTRA_CALLER_NAME; +import static io.wazo.callkeep.Constants.EXTRA_CALL_NUMBER; +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 +68,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 +91,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) { @@ -271,9 +268,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); From b4213dcc6769020ab2119d9477768a1bcc92340b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Mon, 9 Dec 2019 17:28:04 +0000 Subject: [PATCH 02/10] Remove unused imports --- .../src/main/java/io/wazo/callkeep/VoiceConnectionService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java index bec4d29f..545d8602 100644 --- a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java +++ b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java @@ -41,8 +41,6 @@ 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; From 4ee21f796a0788fdb686935ae4c372456fa51055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Mon, 9 Dec 2019 17:41:44 +0000 Subject: [PATCH 03/10] Remove dependency on com.facebook.* from non-RN part of Android code --- .../io/wazo/callkeep/RNCallKeepModule.java | 14 +++++++++++++ .../wazo/callkeep/VoiceConnectionService.java | 21 ++++++------------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java index a5600831..f1c86816 100644 --- a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java +++ b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java @@ -55,6 +55,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; @@ -80,6 +81,7 @@ 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 { @@ -568,6 +570,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_NUMBER)); + Log.d(TAG, "wakeUpApplication: " + attributeMap.get(EXTRA_CALL_UUID) + ", number : " + attributeMap.get(EXTRA_CALL_NUMBER) + ", 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/VoiceConnectionService.java b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java index 545d8602..533cb321 100644 --- a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java +++ b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java @@ -40,8 +40,6 @@ import android.app.ActivityManager; import android.app.ActivityManager.RunningTaskInfo; -import com.facebook.react.HeadlessJsTaskService; - import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -54,6 +52,7 @@ 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_NUMBER; import static io.wazo.callkeep.Constants.EXTRA_CALL_UUID; @@ -191,19 +190,11 @@ private Connection makeOutgoingCall(ConnectionRequest request, String uuid, Bool } private void wakeUpApplication(String uuid, String number, String displayName) { - Intent headlessIntent = new Intent( - this.getApplicationContext(), - RNCallKeepBackgroundMessagingService.class - ); - headlessIntent.putExtra("callUUID", uuid); - headlessIntent.putExtra("name", displayName); - headlessIntent.putExtra("handle", number); - Log.d(TAG, "wakeUpApplication: " + uuid + ", number : " + number + ", 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_NUMBER, number); + sendCallRequestToActivity(ACTION_WAKE_APP, extrasMap); } private void wakeUpAfterReachabilityTimeout(ConnectionRequest request) { From 37b543bb55cd18a514ae75cb8fe228c3a1945211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Mon, 9 Dec 2019 17:46:26 +0000 Subject: [PATCH 04/10] Cleanup constant definitions --- .../main/java/io/wazo/callkeep/Constants.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/android/src/main/java/io/wazo/callkeep/Constants.java b/android/src/main/java/io/wazo/callkeep/Constants.java index 57bcf3ff..4310de56 100644 --- a/android/src/main/java/io/wazo/callkeep/Constants.java +++ b/android/src/main/java/io/wazo/callkeep/Constants.java @@ -1,19 +1,19 @@ package io.wazo.callkeep; public class Constants { - 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_NUMBER = "EXTRA_CALL_NUMBER"; - 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_AUDIO_SESSION = "ACTION_AUDIO_SESSION"; + public static final String ACTION_CHECK_REACHABILITY = "ACTION_CHECK_REACHABILITY"; 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_UNHOLD_CALL = "ACTION_UNHOLD_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_AUDIO_SESSION = "ACTION_AUDIO_SESSION"; - public static final String ACTION_CHECK_REACHABILITY = "ACTION_CHECK_REACHABILITY"; + 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_NUMBER = "EXTRA_CALL_NUMBER"; + public static final String EXTRA_CALL_UUID = "EXTRA_CALL_UUID"; + public static final String EXTRA_CALLER_NAME = "EXTRA_CALLER_NAME"; } From 749b0144df6bb738d555b08a25d02190d033c1c7 Mon Sep 17 00:00:00 2001 From: Emmanuel Quentin Date: Tue, 2 Jun 2020 08:03:41 -0400 Subject: [PATCH 05/10] 3.0.14 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8d6e5072..c488fc34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-callkeep", - "version": "3.0.13", + "version": "3.0.14", "description": "iOS 10 CallKit and Android ConnectionService Framework For React Native", "main": "index.js", "scripts": {}, From 1e8987a5c6100d99c9d4038379e9d967b38a61a2 Mon Sep 17 00:00:00 2001 From: Emmanuel Quentin Date: Fri, 19 Jun 2020 17:44:56 -0400 Subject: [PATCH 06/10] [Android] backToForeground: allow app to start when killed --- .../io/wazo/callkeep/RNCallKeepModule.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java index 77dd4373..25a06261 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; @@ -420,11 +421,22 @@ 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) { From 2a31f3a600d1be032de14f67162ea18a2d361f66 Mon Sep 17 00:00:00 2001 From: Emmanuel Quentin Date: Tue, 23 Jun 2020 10:29:14 -0400 Subject: [PATCH 07/10] Document backToForeground --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) 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 From 3fe4da51026a244cccdc88a9faca3f980b623f69 Mon Sep 17 00:00:00 2001 From: Emmanuel Quentin Date: Tue, 23 Jun 2020 10:52:02 -0400 Subject: [PATCH 08/10] 3.0.15 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c488fc34..43388ee4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-callkeep", - "version": "3.0.14", + "version": "3.0.15", "description": "iOS 10 CallKit and Android ConnectionService Framework For React Native", "main": "index.js", "scripts": {}, From a67421c3597169135431d1d041ecd3a9abdd1030 Mon Sep 17 00:00:00 2001 From: CaptainJeff Date: Tue, 30 Jun 2020 08:51:07 -0400 Subject: [PATCH 09/10] Update index.d.ts answerIncomingCall is missing from the index.d.ts file --- index.d.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/index.d.ts b/index.d.ts index 449db32d..5ae9a5c2 100644 --- a/index.d.ts +++ b/index.d.ts @@ -53,6 +53,10 @@ export default class RNCallKeep { static hasDefaultPhoneAccount(): boolean { + } + + static answerIncomingCall(uuid: string) { + } static displayIncomingCall( From f00ffa0dce3064019b0a24eafb824ecee7bc9dab Mon Sep 17 00:00:00 2001 From: Luxi Liu Date: Sat, 4 Jul 2020 13:31:22 +1000 Subject: [PATCH 10/10] Add support of self-managed video call --- actions.js | 5 ++++ .../main/java/io/wazo/callkeep/Constants.java | 1 + .../io/wazo/callkeep/RNCallKeepModule.java | 29 +++++++++++++++++-- .../io/wazo/callkeep/VoiceConnection.java | 9 ++++++ .../wazo/callkeep/VoiceConnectionService.java | 8 +++++ example/App.js | 7 +++++ .../android/app/src/main/AndroidManifest.xml | 1 + example/package.json | 2 +- index.d.ts | 1 + 9 files changed, 59 insertions(+), 4 deletions(-) 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 index 3d301158..6efdf81c 100644 --- a/android/src/main/java/io/wazo/callkeep/Constants.java +++ b/android/src/main/java/io/wazo/callkeep/Constants.java @@ -4,6 +4,7 @@ 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"; diff --git a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java index 293096ae..884d62f9 100644 --- a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java +++ b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java @@ -77,6 +77,7 @@ 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; @@ -121,7 +122,7 @@ public void setup(ReadableMap options) { VoiceConnectionService.setAvailable(false); this._settings = options; - if (isConnectionServiceAvailable()) { + if (isConnectionServiceAvailable(_settings)) { this.registerPhoneAccount(this.getAppContext()); voiceBroadcastReceiver = new VoiceBroadcastReceiver(); registerReceiver(); @@ -425,6 +426,16 @@ 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(); @@ -459,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()); @@ -512,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); @@ -580,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)); diff --git a/android/src/main/java/io/wazo/callkeep/VoiceConnection.java b/android/src/main/java/io/wazo/callkeep/VoiceConnection.java index 939ae35c..2dab1a6e 100644 --- a/android/src/main/java/io/wazo/callkeep/VoiceConnection.java +++ b/android/src/main/java/io/wazo/callkeep/VoiceConnection.java @@ -39,6 +39,7 @@ 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; @@ -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 b5b7cc7e..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; @@ -234,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); 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 5ae9a5c2..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[], }, }