Skip to content

ios: support additional options pass from js #188

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 43 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
9d8f656
Remove dependency on RN* part from other part of Android code
LinusU Dec 9, 2019
b4213dc
Remove unused imports
LinusU Dec 9, 2019
4ee21f7
Remove dependency on com.facebook.* from non-RN part of Android code
LinusU Dec 9, 2019
37b543b
Cleanup constant definitions
LinusU Dec 9, 2019
460a14f
checkIfActiveCall
ajnozari Mar 22, 2020
a4a33e1
Minor change
ajnozari Mar 22, 2020
5286fee
Updated with requested changes
ajnozari Apr 4, 2020
14232a2
Merge branch 'master' of https://github.com/react-native-webrtc/react…
ajnozari Apr 4, 2020
9df84d8
Forgot to update RNCallKeep.h to reflect rename
ajnozari Apr 8, 2020
e849f27
Adding the possibility to add a completionHandler for the reportNewIn…
lrorthmann Apr 28, 2020
96e8133
Updating README.md
lrorthmann Apr 28, 2020
1b98744
Changed to overload reportNewIncomingCall method with the new paramet…
lrorthmann Apr 29, 2020
f043034
Exposed to JS
ajnozari Apr 30, 2020
dde9e3f
Updated TS
ajnozari Apr 30, 2020
46fe05e
Updated TS .... again
ajnozari Apr 30, 2020
dd6e0b5
More TS, new to TS in general
ajnozari Apr 30, 2020
15e9259
Still new to new additions
ajnozari Apr 30, 2020
00ef852
Updated to properly expose to RCT EXPORT METHOD, please forgive the c…
ajnozari Apr 30, 2020
5ee1e4a
Updated to properly expose to RCT EXPORT METHOD, please forgive the c…
ajnozari Apr 30, 2020
540a7c3
Using proper variable >_>
ajnozari Apr 30, 2020
4fb7d08
Using proper variable >_>
ajnozari Apr 30, 2020
56b6f3b
Using proper variable >_>
ajnozari Apr 30, 2020
095a34c
Using proper variable >_>
ajnozari Apr 30, 2020
5b37f2d
Merge pull request #191 from Digitro/completionHandler_for_reportNewI…
manuquentin May 12, 2020
3e912d4
Merge pull request #172 from ajnozari/master
manuquentin May 15, 2020
e95288a
3.0.13
manuquentin May 15, 2020
73f188d
Fix didReceiveOnStartcallAction not working
geraintwhite Jun 2, 2020
8034d7e
Merge pull request #207 from grit96/patch-1
manuquentin Jun 2, 2020
59b2526
Merge pull request #137 from LinusU/separate-react-native
manuquentin Jun 4, 2020
749b014
3.0.14
manuquentin Jun 2, 2020
1e8987a
[Android] backToForeground: allow app to start when killed
manuquentin Jun 19, 2020
2a31f3a
Document backToForeground
manuquentin Jun 23, 2020
bedfc23
Merge pull request #223 from react-native-webrtc/back_to_foreground_k…
manuquentin Jun 23, 2020
3fe4da5
3.0.15
manuquentin Jun 23, 2020
a03628c
Android: Revert wakeUpApplication to use react-native class
manuquentin Jun 30, 2020
a67421c
Update index.d.ts
CaptainJeff Jun 30, 2020
082b0d0
Merge pull request #235 from CaptainJeff/patch-1
manuquentin Jun 30, 2020
4cdf17f
Merge pull request #234 from react-native-webrtc/revert_wakeup_app
manuquentin Jul 6, 2020
65ac242
ios: implement support options for disaply incoming call
zxcpoiu Mar 28, 2020
f35ce84
ios: implemet support options for updateDisplay
zxcpoiu Mar 28, 2020
0137e2e
ios: platform specific options for displayIncomingCall and updateDisplay
zxcpoiu Apr 30, 2020
ee625b5
readme: add options arg for displayIncomingCall and updateDisplay
zxcpoiu Apr 30, 2020
0af9f9e
ios: clean/remove reportNewIncomingCall overloading api
zxcpoiu Jul 14, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 40 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,21 @@ Be sure to set this only after your call is ready for two way audio; used both i
RNCallKeep.setCurrentCallActive(uuid);
```

- `uuid`: string
- The `uuid` used for `startCall` or `displayIncomingCall`

### isCallActive
_This feature is available only on IOS._

Returns true if the UUID passed matches an existing and answered call.
This will return true ONLY if the call exists and the user has already answered the call. It will return false
if the call does not exist or has not been answered. This is exposed to both React Native and Native sides.
This was exposed so a call can be canceled if ringing and the user answered on a different device.

```js
RNCallKeep.isCallActive(uuid);
```

- `uuid`: string
- The `uuid` used for `startCall` or `displayIncomingCall`

Expand All @@ -160,6 +175,13 @@ RNCallKeep.displayIncomingCall(uuid, handle, localizedCallerName);
- `hasVideo`: boolean (optional, iOS only)
- `false` (default)
- `true` (you know... when not false)
- `options`: object (optional)
- `ios`: object
- `supportsHolding`: boolean (optional, default true)
- `supportsDTMF`: boolean (optional, default true)
- `supportsGrouping`: boolean (optional, default true)
- `supportsUngrouping`: boolean (optional, default true)
- `android`: object (currently no-op)

### answerIncomingCall
_This feature is available only on Android._
Expand Down Expand Up @@ -215,6 +237,14 @@ RNCallKeep.updateDisplay(uuid, displayName, handle)
- Name of the caller to be displayed on the native UI
- `handle`: string
- Phone number of the caller
- `options`: object (optional)
- `ios`: object
- `hasVideo`: boolean (optional)
- `supportsHolding`: boolean (optional)
- `supportsDTMF`: boolean (optional)
- `supportsGrouping`: boolean (optional)
- `supportsUngrouping`: boolean (optional)
- `android`: object (currently no-op)

### endCall

Expand Down Expand Up @@ -371,6 +401,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

Expand Down Expand Up @@ -673,9 +712,7 @@ Since iOS 13, you'll have to report the incoming calls that wakes up your applic
// NSString *handle = @"caller number here";
// NSDictionary *extra = [payload.dictionaryPayload valueForKeyPath:@"custom.path.to.data"]; /* use this to pass any special data (ie. from your notification) down to RN. Can also be `nil` */

[RNCallKeep reportNewIncomingCall:uuid handle:handle handleType:@"generic" hasVideo:false localizedCallerName:callerName fromPushKit: YES payload:extra];

completion();
[RNCallKeep reportNewIncomingCall:uuid handle:handle handleType:@"generic" hasVideo:false localizedCallerName:callerName fromPushKit: YES payload:extra withCompletionHandler:completion];
}
```

Expand Down
19 changes: 19 additions & 0 deletions android/src/main/java/io/wazo/callkeep/Constants.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
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_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_NUMBER = "EXTRA_CALL_NUMBER";
public static final String EXTRA_CALL_UUID = "EXTRA_CALL_UUID";
public static final String EXTRA_CALLER_NAME = "EXTRA_CALLER_NAME";
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
62 changes: 44 additions & 18 deletions android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -55,6 +56,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;
Expand All @@ -67,26 +69,26 @@

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;
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_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,
Expand Down Expand Up @@ -122,6 +124,7 @@ public void setup(ReadableMap options) {
this.registerPhoneAccount(this.getAppContext());
voiceBroadcastReceiver = new VoiceBroadcastReceiver();
registerReceiver();
VoiceConnectionService.setPhoneAccountHandle(handle);
VoiceConnectionService.setAvailable(true);
}
}
Expand Down Expand Up @@ -418,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"));

if (isOpened) {
focusIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
activity.startActivity(focusIntent);
} else {

focusIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
focusIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK +
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED +
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD +
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

Activity activity = getCurrentActivity();
activity.startActivity(focusIntent);
getReactApplicationContext().startActivity(focusIntent);
}
}

private void registerPhoneAccount(Context appContext) {
Expand Down Expand Up @@ -568,6 +582,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;
}
}
}
Expand Down
22 changes: 11 additions & 11 deletions android/src/main/java/io/wazo/callkeep/VoiceConnection.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
32 changes: 13 additions & 19 deletions android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -53,20 +51,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_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.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;

// @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)
Expand All @@ -76,6 +67,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<String, VoiceConnection> currentConnections = new HashMap<>();
public static Boolean hasOutgoingCall = false;
Expand All @@ -98,6 +90,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) {
Expand Down Expand Up @@ -271,9 +267,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);

Expand Down
8 changes: 8 additions & 0 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ export default class RNCallKeep {

static hasDefaultPhoneAccount(): boolean {

}

static answerIncomingCall(uuid: string) {

}

static displayIncomingCall(
Expand All @@ -61,6 +65,7 @@ export default class RNCallKeep {
localizedCallerName?: string,
handleType?: HandleType,
hasVideo?: boolean,
options?: object,
) {

}
Expand All @@ -78,6 +83,7 @@ export default class RNCallKeep {
uuid: string,
displayName: string,
handle: string,
options?: object,
) {

}
Expand Down Expand Up @@ -114,7 +120,9 @@ export default class RNCallKeep {
static setReachable() {

}
static isCallActive(uuid: string): Promise<boolean> {

}
/**
* @description supportConnectionService method is available only on Android.
*/
Expand Down
Loading