1717
1818package io .wazo .callkeep ;
1919
20+ import android .Manifest ;
21+ import android .app .Activity ;
22+ import android .content .BroadcastReceiver ;
2023import android .content .ComponentName ;
2124import android .content .Context ;
22- import android .content .BroadcastReceiver ;
25+ import android .content .Intent ;
26+ import android .content .IntentFilter ;
2327import android .content .pm .ApplicationInfo ;
2428import 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 ;
2733import android .support .v4 .app .ActivityCompat ;
2834import android .support .v4 .content .ContextCompat ;
2935import 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 ;
3536import android .telecom .Connection ;
36- import android .telecom .PhoneAccountHandle ;
37+ import android .telecom .DisconnectCause ;
3738import android .telecom .PhoneAccount ;
39+ import android .telecom .PhoneAccountHandle ;
3840import 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 ;
4144import com .facebook .react .bridge .ReactApplicationContext ;
42- import com .facebook .react .bridge .ReactContext ;
4345import com .facebook .react .bridge .ReactContextBaseJavaModule ;
4446import com .facebook .react .bridge .ReactMethod ;
4547import com .facebook .react .bridge .WritableMap ;
46- import com .facebook .react .bridge .Arguments ;
47- import com .facebook .react .bridge .Promise ;
4848import 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
6251public 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 () {
0 commit comments