Skip to content

Commit 5074aea

Browse files
committed
Add ability to start calls on Android
1 parent bdfd5de commit 5074aea

File tree

3 files changed

+39
-11
lines changed

3 files changed

+39
-11
lines changed

android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public class RNCallKeepModule extends ReactContextBaseJavaModule {
7373
public static final String ACTION_HOLD_CALL = "ACTION_HOLD_CALL";
7474
public static final String ACTION_UNHOLD_CALL = "ACTION_UNHOLD_CALL";
7575
public static final String ACTION_ONGOING_CALL = "ACTION_ONGOING_CALL";
76+
public static final String ACTION_AUDIO_SESSION = "ACTION_AUDIO_SESSION";
7677

7778
private static final String E_ACTIVITY_DOES_NOT_EXIST = "E_ACTIVITY_DOES_NOT_EXIST";
7879
private static final String REACT_NATIVE_MODULE_NAME = "RNCallKeep";
@@ -128,6 +129,21 @@ public void displayIncomingCall(String number, String callerName) {
128129
telecomManager.addNewIncomingCall(this.pah, extras);
129130
}
130131

132+
@ReactMethod
133+
public void startCall(String number, String callerName) {
134+
if (!this.hasPhoneAccount()) {
135+
return;
136+
}
137+
138+
Bundle extras = new Bundle();
139+
Uri uri = Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null);
140+
141+
extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, this.pah);
142+
extras.putString(EXTRA_CALLER_NAME, callerName);
143+
144+
telecomManager.placeCall(uri, extras);
145+
}
146+
131147
@ReactMethod
132148
public void endCall() {
133149
if (!hasPhoneAccount()) {
@@ -156,7 +172,8 @@ public void checkPhoneAccountPermission(Promise promise) {
156172
}
157173

158174
hasPhoneAccountPromise = promise;
159-
if (!this.checkPermission(Manifest.permission.READ_PHONE_STATE, REQUEST_READ_PHONE_STATE)) {
175+
String[] permissions = { Manifest.permission.READ_PHONE_STATE, Manifest.permission.CALL_PHONE };
176+
if (!this.checkPermissions(permissions, REQUEST_READ_PHONE_STATE)) {
160177
return;
161178
}
162179

@@ -227,16 +244,22 @@ private String getApplicationName(Context appContext) {
227244
return stringId == 0 ? applicationInfo.nonLocalizedLabel.toString() : appContext.getString(stringId);
228245
}
229246

230-
private Boolean checkPermission(String name, int id) {
247+
private Boolean checkPermissions(String[] permissions, int id) {
231248
Activity currentActivity = this.getCurrentActivity();
232-
int permissionCheck = ContextCompat.checkSelfPermission(currentActivity, name);
233249

234-
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
235-
ActivityCompat.requestPermissions(currentActivity, new String[]{name}, id);
236-
return false;
250+
boolean hasPermissions = true;
251+
for (String permission : permissions) {
252+
int permissionCheck = ContextCompat.checkSelfPermission(currentActivity, permission);
253+
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
254+
hasPermissions = false;
255+
}
256+
}
257+
258+
if (!hasPermissions) {
259+
ActivityCompat.requestPermissions(currentActivity, permissions, id);
237260
}
238261

239-
return true;
262+
return hasPermissions;
240263
}
241264

242265
private static boolean hasPhoneAccount() {
@@ -266,6 +289,7 @@ private void registerReceiver() {
266289
intentFilter.addAction(ACTION_UNHOLD_CALL);
267290
intentFilter.addAction(ACTION_HOLD_CALL);
268291
intentFilter.addAction(ACTION_ONGOING_CALL);
292+
intentFilter.addAction(ACTION_AUDIO_SESSION);
269293
LocalBroadcastManager.getInstance(this.reactContext).registerReceiver(voiceBroadcastReceiver, intentFilter);
270294
isReceiverRegistered = true;
271295
}
@@ -313,6 +337,9 @@ public void onReceive(Context context, Intent intent) {
313337

314338
sendEventToJS("RNCallKeepDidReceiveStartCallAction", args);
315339
break;
340+
case ACTION_AUDIO_SESSION:
341+
sendEventToJS("RNCallKeepDidActivateAudioSession", null);
342+
break;
316343
}
317344
}
318345
}

android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import static io.wazo.callkeep.RNCallKeepModule.ACTION_HOLD_CALL;
4141
import static io.wazo.callkeep.RNCallKeepModule.ACTION_UNHOLD_CALL;
4242
import static io.wazo.callkeep.RNCallKeepModule.ACTION_ONGOING_CALL;
43+
import static io.wazo.callkeep.RNCallKeepModule.ACTION_AUDIO_SESSION;
4344
import static io.wazo.callkeep.RNCallKeepModule.EXTRA_CALLER_NAME;
4445

4546
// @see https://github.com/kbagchiGWC/voice-quickstart-android/blob/9a2aff7fbe0d0a5ae9457b48e9ad408740dfb968/exampleConnectionService/src/main/java/com/twilio/voice/examples/connectionservice/VoiceConnectionService.java
@@ -78,6 +79,7 @@ public Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManage
7879
outgoingCallConnection.setDialing();
7980

8081
sendCallRequestToActivity(ACTION_ONGOING_CALL, request.getAddress().getSchemeSpecificPart());
82+
sendCallRequestToActivity(ACTION_AUDIO_SESSION, null);
8183

8284
return outgoingCallConnection;
8385
}
@@ -112,6 +114,7 @@ public void onAnswer() {
112114
connection.setAudioModeIsVoip(true);
113115

114116
sendCallRequestToActivity(ACTION_ANSWER_CALL, null);
117+
sendCallRequestToActivity(ACTION_AUDIO_SESSION, null);
115118
}
116119

117120
@Override
@@ -176,9 +179,7 @@ public void onReject() {
176179

177180
Bundle extra = request.getExtras();
178181

179-
connection.setConnectionCapabilities(Connection.CAPABILITY_MUTE);
180-
connection.setConnectionCapabilities(Connection.CAPABILITY_HOLD);
181-
connection.setConnectionCapabilities(Connection.CAPABILITY_SUPPORT_HOLD);
182+
connection.setConnectionCapabilities(Connection.CAPABILITY_MUTE | Connection.CAPABILITY_HOLD | Connection.CAPABILITY_SUPPORT_HOLD);
182183
connection.setAddress(request.getAddress(), TelecomManager.PRESENTATION_ALLOWED);
183184
connection.setExtras(extra);
184185
connection.setCallerDisplayName(extra.getString(EXTRA_CALLER_NAME), TelecomManager.PRESENTATION_ALLOWED);

index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class RNCallKeep {
5050

5151
startCall(uuid, handle, handleType = 'number', hasVideo = false, contactIdentifier) {
5252
if (!isIOS) {
53-
// Can't start a call directly on Android
53+
RNCallKeepModule.startCall(handle, contactIdentifier);
5454
return;
5555
}
5656

0 commit comments

Comments
 (0)