Skip to content

Commit 087fcd5

Browse files
committed
Add Android version checks and updated permissions
1 parent 5074aea commit 087fcd5

File tree

5 files changed

+58
-55
lines changed

5 files changed

+58
-55
lines changed

android/build.gradle

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
1+
buildscript {
2+
repositories {
3+
jcenter()
4+
google()
5+
}
6+
7+
dependencies {
8+
classpath 'com.android.tools.build:gradle:3.0.1'
9+
}
10+
}
11+
112
apply plugin: 'com.android.library'
213

314
def safeExtGet(prop, fallback) {
415
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
516
}
617

718
android {
8-
compileSdkVersion safeExtGet('compileSdkVersion', 23)
19+
compileSdkVersion safeExtGet('compileSdkVersion', 26)
920
buildToolsVersion safeExtGet('buildToolsVersion', "23.0.1")
1021

1122
defaultConfig {
@@ -16,6 +27,10 @@ android {
1627
}
1728
}
1829

30+
repositories {
31+
mavenCentral()
32+
}
33+
1934
dependencies {
2035
compile 'com.facebook.react:react-native:+'
2136
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.wazo.callkeep">
3+
4+
<uses-permission android:name="android.permission.CALL_PHONE" />
35
</manifest>

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

Lines changed: 26 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -17,47 +17,36 @@
1717

1818
package io.wazo.callkeep;
1919

20+
import android.Manifest;
21+
import android.app.Activity;
22+
import android.content.BroadcastReceiver;
2023
import android.content.ComponentName;
2124
import android.content.Context;
22-
import android.content.BroadcastReceiver;
25+
import android.content.Intent;
26+
import android.content.IntentFilter;
2327
import android.content.pm.ApplicationInfo;
2428
import android.content.pm.PackageManager;
25-
import android.content.IntentFilter;
26-
import android.content.Intent;
29+
import android.net.Uri;
30+
import android.os.Build;
31+
import android.os.Bundle;
32+
import android.support.annotation.Nullable;
2733
import android.support.v4.app.ActivityCompat;
2834
import android.support.v4.content.ContextCompat;
2935
import android.support.v4.content.LocalBroadcastManager;
30-
import android.support.annotation.Nullable;
31-
32-
import android.accounts.AccountManager;
33-
import android.accounts.Account;
34-
import android.telecom.DisconnectCause;
3536
import android.telecom.Connection;
36-
import android.telecom.PhoneAccountHandle;
37+
import android.telecom.DisconnectCause;
3738
import android.telecom.PhoneAccount;
39+
import android.telecom.PhoneAccountHandle;
3840
import android.telecom.TelecomManager;
3941

40-
import com.facebook.react.bridge.NativeModule;
42+
import com.facebook.react.bridge.Arguments;
43+
import com.facebook.react.bridge.Promise;
4144
import com.facebook.react.bridge.ReactApplicationContext;
42-
import com.facebook.react.bridge.ReactContext;
4345
import com.facebook.react.bridge.ReactContextBaseJavaModule;
4446
import com.facebook.react.bridge.ReactMethod;
4547
import com.facebook.react.bridge.WritableMap;
46-
import com.facebook.react.bridge.Arguments;
47-
import com.facebook.react.bridge.Promise;
4848
import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter;
4949

50-
import android.os.Bundle;
51-
import android.os.Build;
52-
import android.net.Uri;
53-
import android.app.Activity;
54-
import android.Manifest;
55-
56-
import java.util.Map;
57-
import java.util.HashMap;
58-
import java.util.List;
59-
import java.lang.SecurityException;
60-
6150
// @see https://github.com/kbagchiGWC/voice-quickstart-android/blob/9a2aff7fbe0d0a5ae9457b48e9ad408740dfb968/exampleConnectionService/src/main/java/com/twilio/voice/examples/connectionservice/VoiceConnectionServiceActivity.java
6251
public class RNCallKeepModule extends ReactContextBaseJavaModule {
6352
public static final int REQUEST_READ_PHONE_STATE = 394858;
@@ -81,7 +70,7 @@ public class RNCallKeepModule extends ReactContextBaseJavaModule {
8170
private static TelecomManager telecomManager;
8271
private static Promise hasPhoneAccountPromise;
8372
private ReactApplicationContext reactContext;
84-
private PhoneAccountHandle pah;
73+
private static PhoneAccountHandle handle;
8574
private boolean isReceiverRegistered = false;
8675
private VoiceBroadcastReceiver voiceBroadcastReceiver;
8776

@@ -116,7 +105,7 @@ public String getName() {
116105

117106
@ReactMethod
118107
public void displayIncomingCall(String number, String callerName) {
119-
if (!this.hasPhoneAccount()) {
108+
if (!isAvailable() || !hasPhoneAccount()) {
120109
return;
121110
}
122111

@@ -126,27 +115,27 @@ public void displayIncomingCall(String number, String callerName) {
126115
extras.putParcelable(TelecomManager.EXTRA_INCOMING_CALL_ADDRESS, uri);
127116
extras.putString(EXTRA_CALLER_NAME, callerName);
128117

129-
telecomManager.addNewIncomingCall(this.pah, extras);
118+
telecomManager.addNewIncomingCall(handle, extras);
130119
}
131120

132121
@ReactMethod
133122
public void startCall(String number, String callerName) {
134-
if (!this.hasPhoneAccount()) {
123+
if (!isAvailable() || !hasPhoneAccount()) {
135124
return;
136125
}
137126

138127
Bundle extras = new Bundle();
139128
Uri uri = Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null);
140129

141-
extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, this.pah);
130+
extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, handle);
142131
extras.putString(EXTRA_CALLER_NAME, callerName);
143132

144133
telecomManager.placeCall(uri, extras);
145134
}
146135

147136
@ReactMethod
148137
public void endCall() {
149-
if (!hasPhoneAccount()) {
138+
if (!isAvailable() || !hasPhoneAccount()) {
150139
return;
151140
}
152141

@@ -218,17 +207,19 @@ public static Boolean isAvailable() {
218207
}
219208

220209
private void registerPhoneAccount(Context appContext) {
210+
if (!isAvailable()) {
211+
return;
212+
}
213+
221214
ComponentName cName = new ComponentName(this.getAppContext(), VoiceConnectionService.class);
222215
String appName = this.getApplicationName(appContext);
223216

224-
this.pah = new PhoneAccountHandle(cName, appName);
217+
handle = new PhoneAccountHandle(cName, appName);
225218

226-
PhoneAccount account = new PhoneAccount.Builder(pah, appName)
219+
PhoneAccount account = new PhoneAccount.Builder(handle, appName)
227220
.setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER)
228221
.build();
229222

230-
PhoneAccountHandle handle = new PhoneAccountHandle(cName, appName);
231-
232223
telecomManager = (TelecomManager) this.getAppContext().getSystemService(this.getAppContext().TELECOM_SERVICE);
233224
telecomManager.registerPhoneAccount(account);
234225
}
@@ -267,15 +258,7 @@ private static boolean hasPhoneAccount() {
267258
return false;
268259
}
269260

270-
List<PhoneAccountHandle> enabledAccounts = telecomManager.getCallCapablePhoneAccounts();
271-
272-
for (PhoneAccountHandle account : enabledAccounts) {
273-
if (account.getComponentName().getClassName().equals(VoiceConnectionService.class.getCanonicalName())) {
274-
return true;
275-
}
276-
}
277-
278-
return false;
261+
return telecomManager.getPhoneAccount(handle).isEnabled();
279262
}
280263

281264
private void registerReceiver() {

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,34 @@
1717

1818
package io.wazo.callkeep;
1919

20+
import android.annotation.TargetApi;
2021
import android.content.Intent;
21-
import android.net.Uri;
22+
import android.os.Build;
2223
import android.os.Bundle;
23-
import android.support.v4.content.LocalBroadcastManager;
24+
import android.os.Handler;
2425
import android.support.annotation.Nullable;
25-
26+
import android.support.v4.content.LocalBroadcastManager;
2627
import android.telecom.CallAudioState;
2728
import android.telecom.Connection;
2829
import android.telecom.ConnectionRequest;
2930
import android.telecom.ConnectionService;
3031
import android.telecom.DisconnectCause;
3132
import android.telecom.PhoneAccountHandle;
3233
import android.telecom.TelecomManager;
33-
import android.os.Handler;
3434

35-
import static io.wazo.callkeep.RNCallKeepModule.ACTION_END_CALL;
3635
import static io.wazo.callkeep.RNCallKeepModule.ACTION_ANSWER_CALL;
37-
import static io.wazo.callkeep.RNCallKeepModule.ACTION_MUTE_CALL;
38-
import static io.wazo.callkeep.RNCallKeepModule.ACTION_UNMUTE_CALL;
36+
import static io.wazo.callkeep.RNCallKeepModule.ACTION_AUDIO_SESSION;
3937
import static io.wazo.callkeep.RNCallKeepModule.ACTION_DTMF_TONE;
38+
import static io.wazo.callkeep.RNCallKeepModule.ACTION_END_CALL;
4039
import static io.wazo.callkeep.RNCallKeepModule.ACTION_HOLD_CALL;
41-
import static io.wazo.callkeep.RNCallKeepModule.ACTION_UNHOLD_CALL;
40+
import static io.wazo.callkeep.RNCallKeepModule.ACTION_MUTE_CALL;
4241
import static io.wazo.callkeep.RNCallKeepModule.ACTION_ONGOING_CALL;
43-
import static io.wazo.callkeep.RNCallKeepModule.ACTION_AUDIO_SESSION;
42+
import static io.wazo.callkeep.RNCallKeepModule.ACTION_UNHOLD_CALL;
43+
import static io.wazo.callkeep.RNCallKeepModule.ACTION_UNMUTE_CALL;
4444
import static io.wazo.callkeep.RNCallKeepModule.EXTRA_CALLER_NAME;
4545

4646
// @see https://github.com/kbagchiGWC/voice-quickstart-android/blob/9a2aff7fbe0d0a5ae9457b48e9ad408740dfb968/exampleConnectionService/src/main/java/com/twilio/voice/examples/connectionservice/VoiceConnectionService.java
47+
@TargetApi(Build.VERSION_CODES.M)
4748
public class VoiceConnectionService extends ConnectionService {
4849
private static Connection connection;
4950
private static Boolean isActive = false;

docs/android-installation.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import io.wazo.callkeep.RNCallKeepModule; // Add this import line with others
4040

4141
public class MainActivity extends ReactActivity {
4242
// ...
43-
43+
4444
// Permission results
4545
@Override
4646
public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) {
@@ -61,8 +61,10 @@ public class MainActivity extends ReactActivity {
6161
```xml
6262
<uses-permission android:name="android.permission.BIND_TELECOM_CONNECTION_SERVICE"/>
6363
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
64+
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
65+
<uses-permission android:name="android.permission.CALL_PHONE" />
6466

65-
<application>
67+
<application>
6668
// ...
6769
<service android:name="io.wazo.callkeep.VoiceConnectionService"
6870
android:label="Wazo"

0 commit comments

Comments
 (0)