From 3ad2c6b580e893fdcf32017135b08338b7af537f Mon Sep 17 00:00:00 2001 From: Emmanuel Quentin Date: Thu, 8 Oct 2020 14:33:31 -0400 Subject: [PATCH 1/3] Introduce checkPhoneAccountEnabled and isConnectionServiceAvailable --- .../java/io/wazo/callkeep/RNCallKeepModule.java | 11 ++++++++++- index.d.ts | 4 ++++ index.js | 16 ++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java index 54ff44ca..7f9397c5 100644 --- a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java +++ b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java @@ -432,12 +432,21 @@ public void openPhoneAccountSettings() { this.getAppContext().startActivity(intent); } - @ReactMethod public static Boolean isConnectionServiceAvailable() { // PhoneAccount is available since api level 23 return Build.VERSION.SDK_INT >= 23; } + @ReactMethod + public void isConnectionServiceAvailable(Promise promise) { + promise.resolve(isConnectionServiceAvailable()); + } + + @ReactMethod + public void checkPhoneAccountEnabled(Promise promise) { + promise.resolve(hasPhoneAccount()); + } + @ReactMethod public void backToForeground() { Context context = getAppContext(); diff --git a/index.d.ts b/index.d.ts index f8133789..b7e2670f 100644 --- a/index.d.ts +++ b/index.d.ts @@ -77,6 +77,10 @@ declare module 'react-native-callkeep' { handle: string, ): void + static checkPhoneAccountEnabled(): Promise; + + static isConnectionServiceAvailable(): Promise; + /** * @description reportConnectedOutgoingCallWithUUID method is available only on iOS. */ diff --git a/index.js b/index.js index f5e223fb..39df5f61 100644 --- a/index.js +++ b/index.js @@ -101,6 +101,22 @@ class RNCallKeep { RNCallKeepModule.startCall(uuid, handle, contactIdentifier, handleType, hasVideo); }; + checkPhoneAccountEnabled = async () => { + if (isIOS) { + return; + } + + return RNCallKeepModule.checkPhoneAccountEnabled(); + } + + isConnectionServiceAvailable = async () => { + if (isIOS) { + return true; + } + + return RNCallKeepModule.isConnectionServiceAvailable(); + } + reportConnectingOutgoingCallWithUUID = (uuid) => { //only available on iOS if (isIOS) { From c257086fa09e9022878f5925fed3ada59c8db14a Mon Sep 17 00:00:00 2001 From: Emmanuel Quentin Date: Thu, 8 Oct 2020 14:38:46 -0400 Subject: [PATCH 2/3] Document checkPhoneAccountEnabled and checkPhoneAccountEnabled --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index ac892673..3b1de862 100644 --- a/README.md +++ b/README.md @@ -388,6 +388,29 @@ const options = { RNCallKeep.hasDefaultPhoneAccount(options); ``` +### checkPhoneAccountEnabled + +Checks if the user has set a default [phone account](https://developer.android.com/reference/android/telecom/PhoneAccount) and it's enabled. + +It's useful for custom permission prompts. It should be used in pair with `registerPhoneAccount` +Similar to `hasDefaultPhoneAccount` but without trigering a prompt if the user doesn't have a phone account. + +_This feature is available only on Android._ + +```js +RNCallKeep.checkPhoneAccountEnabled(); +``` + +### isConnectionServiceAvailable + +Check if the device support ConnectionService. + +_This feature is available only on Android._ + +```js +RNCallKeep.checkPhoneAccountEnabled(); +``` + ### backToForeground _This feature is available only on Android._ From 5677bc0ee1f6b0bb8c27a185ab0c9cb6ced9b118 Mon Sep 17 00:00:00 2001 From: Emmanuel Quentin Date: Thu, 8 Oct 2020 15:40:29 -0400 Subject: [PATCH 3/3] Add new canMakeMultipleCalls method --- README.md | 9 +++++++++ android/src/main/java/io/wazo/callkeep/Constants.java | 2 ++ .../main/java/io/wazo/callkeep/RNCallKeepModule.java | 5 +++++ .../java/io/wazo/callkeep/VoiceConnectionService.java | 10 ++++++++++ index.d.ts | 2 ++ index.js | 8 ++++++++ 6 files changed, 36 insertions(+) diff --git a/README.md b/README.md index 3b1de862..73aaecdc 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,15 @@ Eg: When your used log out (or the connection to your server is broken, etc..), RNCallKeep.setAvailable(true); ``` +### canMakeMultipleCalls +_This feature is available only on Android._ + +Disable the "Add call" button in ConnectionService UI. + +```js +RNCallKeep.canMakeMultipleCalls(false); // Enabled by default +``` + - `active`: boolean - Tell whether the app is ready or not diff --git a/android/src/main/java/io/wazo/callkeep/Constants.java b/android/src/main/java/io/wazo/callkeep/Constants.java index 4310de56..f10e109c 100644 --- a/android/src/main/java/io/wazo/callkeep/Constants.java +++ b/android/src/main/java/io/wazo/callkeep/Constants.java @@ -16,4 +16,6 @@ public class Constants { 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"; + // Can't use telecom.EXTRA_DISABLE_ADD_CALL ... + public static final String EXTRA_DISABLE_ADD_CALL = "android.telecom.extra.DISABLE_ADD_CALL"; } diff --git a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java index 7f9397c5..b75467f2 100644 --- a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java +++ b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java @@ -386,6 +386,11 @@ public void setAvailable(Boolean active) { VoiceConnectionService.setAvailable(active); } + @ReactMethod + public void canMakeMultipleCalls(Boolean allow) { + VoiceConnectionService.setCanMakeMultipleCalls(allow); + } + @ReactMethod public void setReachable() { VoiceConnectionService.setReachable(); diff --git a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java index bbe8c3df..4419cf57 100644 --- a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java +++ b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java @@ -58,6 +58,7 @@ 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 static io.wazo.callkeep.Constants.EXTRA_DISABLE_ADD_CALL; // @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) @@ -65,6 +66,7 @@ public class VoiceConnectionService extends ConnectionService { private static Boolean isAvailable; private static Boolean isInitialized; private static Boolean isReachable; + private static Boolean canMakeMultipleCalls = true; private static String notReachableCallUuid; private static ConnectionRequest currentConnectionRequest; private static PhoneAccountHandle phoneAccountHandle; @@ -103,6 +105,10 @@ public static void setAvailable(Boolean value) { isAvailable = value; } + public static void setCanMakeMultipleCalls(Boolean allow) { + VoiceConnectionService.canMakeMultipleCalls = allow; + } + public static void setReachable() { Log.d(TAG, "setReachable"); isReachable = true; @@ -170,6 +176,10 @@ private Connection makeOutgoingCall(ConnectionRequest request, String uuid, Bool extras.putString(EXTRA_CALL_NUMBER, number); } + if (!canMakeMultipleCalls) { + extras.putBoolean(EXTRA_DISABLE_ADD_CALL, true); + } + outgoingCallConnection = createConnection(request); outgoingCallConnection.setDialing(); outgoingCallConnection.setAudioModeIsVoip(true); diff --git a/index.d.ts b/index.d.ts index b7e2670f..025593ab 100644 --- a/index.d.ts +++ b/index.d.ts @@ -136,6 +136,8 @@ declare module 'react-native-callkeep' { */ static setAvailable(active: boolean): void + static canMakeMultipleCalls(allow: boolean): void + static setCurrentCallActive(callUUID: string): void static backToForeground(): void diff --git a/index.js b/index.js index 39df5f61..0ef37db0 100644 --- a/index.js +++ b/index.js @@ -184,6 +184,14 @@ class RNCallKeep { RNCallKeepModule.setAvailable(state); }; + canMakeMultipleCalls = (state) => { + if (isIOS) { + return; + } + + RNCallKeepModule.canMakeMultipleCalls(state); + }; + setCurrentCallActive = (callUUID) => { if (isIOS) { return;