From cc2a39c6e44bd4242b7a0853bde18445d54dde84 Mon Sep 17 00:00:00 2001 From: Fabrizio Moscon Date: Sat, 15 Dec 2018 20:55:32 +0000 Subject: [PATCH 01/26] Fix end-call flow to avoid unknown UUID error --- ios/RNTwilioVoice/RNTwilioVoice.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ios/RNTwilioVoice/RNTwilioVoice.m b/ios/RNTwilioVoice/RNTwilioVoice.m index 0e0a6bfc..8cfa1368 100644 --- a/ios/RNTwilioVoice/RNTwilioVoice.m +++ b/ios/RNTwilioVoice/RNTwilioVoice.m @@ -99,7 +99,7 @@ - (void)dealloc { device.proximityMonitoringEnabled = YES; if (self.call && self.call.state == TVOCallStateConnected) { - [self.call disconnect]; + [self performEndCallActionWithUUID:self.call.uuid]; } else { NSUUID *uuid = [NSUUID UUID]; NSString *handle = [params valueForKey:@"To"]; @@ -352,7 +352,6 @@ - (void)call:(TVOCall *)call didFailToConnectWithError:(NSError *)error { - (void)call:(TVOCall *)call didDisconnectWithError:(NSError *)error { NSLog(@"Call disconnected with error: %@", error); - [self performEndCallActionWithUUID:call.uuid]; [self callDisconnected:error]; } From d2b9c45799f7ff2e1fa81ec25879912419caa4e0 Mon Sep 17 00:00:00 2001 From: Fabrizio Moscon Date: Sat, 15 Dec 2018 20:57:49 +0000 Subject: [PATCH 02/26] fix: align iOS params to Android fixed connectionDidConnect, connectionDidDisconnect. fixes #44 #62 --- ios/RNTwilioVoice/RNTwilioVoice.m | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/ios/RNTwilioVoice/RNTwilioVoice.m b/ios/RNTwilioVoice/RNTwilioVoice.m index 8cfa1368..06f3f1e0 100644 --- a/ios/RNTwilioVoice/RNTwilioVoice.m +++ b/ios/RNTwilioVoice/RNTwilioVoice.m @@ -298,11 +298,11 @@ - (void)handleCallInviteCanceled:(TVOCallInvite *)callInvite { [params setObject:self.callInvite.callSid forKey:@"call_sid"]; } - if (self.callInvite.from){ - [params setObject:self.callInvite.from forKey:@"from"]; + if (self.callInvite.from) { + [params setObject:self.callInvite.from forKey:@"call_from"]; } - if (self.callInvite.to){ - [params setObject:self.callInvite.to forKey:@"to"]; + if (self.callInvite.to) { + [params setObject:self.callInvite.to forKey:@"call_to"]; } if (self.callInvite.state == TVOCallInviteStateCanceled) { [params setObject:StateDisconnected forKey:@"call_state"]; @@ -332,11 +332,11 @@ - (void)callDidConnect:(TVOCall *)call { [callParams setObject:StateConnected forKey:@"call_state"]; } - if (call.from){ - [callParams setObject:call.from forKey:@"from"]; + if (call.from) { + [callParams setObject:call.from forKey:@"call_from"]; } - if (call.to){ - [callParams setObject:call.to forKey:@"to"]; + if (call.to) { + [callParams setObject:call.to forKey:@"call_to"]; } [self sendEventWithName:@"connectionDidConnect" body:callParams]; } @@ -362,12 +362,11 @@ - (void)callDisconnected:(NSError *)error { if (error.localizedFailureReason) { errMsg = [error localizedFailureReason]; } - [params setObject:errMsg forKey:@"error"]; + [params setObject:errMsg forKey:@"err"]; } if (self.call.sid) { [params setObject:self.call.sid forKey:@"call_sid"]; } - if (self.call.to){ [params setObject:self.call.to forKey:@"call_to"]; } if (self.call.from){ From d0ef91620a1432efc32952b412bf095fe0faf4c2 Mon Sep 17 00:00:00 2001 From: Fabrizio Moscon Date: Sat, 15 Dec 2018 20:58:14 +0000 Subject: [PATCH 03/26] update: android to com.twilio:voice-android:2.0.9 --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 878fc179..880ff171 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -44,7 +44,7 @@ android { dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') - compile 'com.twilio:voice-android:2.0.7' + compile 'com.twilio:voice-android:2.0.9' compile 'com.android.support:appcompat-v7:27.0.2' compile 'com.facebook.react:react-native:+' compile 'com.google.firebase:firebase-messaging:17.+' From fb6849afc81ce4eeef1624860e7b7e408f8bb2ec Mon Sep 17 00:00:00 2001 From: Fabrizio Moscon Date: Sat, 15 Dec 2018 21:00:39 +0000 Subject: [PATCH 04/26] update: Android firebase-messaging to 17.3.4 --- android/build.gradle | 2 +- .../RNTwilioVoice/TwilioVoiceModule.java | 63 +++++++++++-------- .../fcm/VoiceFirebaseInstanceIDService.java | 43 ------------- .../fcm/VoiceFirebaseMessagingService.java | 11 +++- 4 files changed, 49 insertions(+), 70 deletions(-) delete mode 100644 android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseInstanceIDService.java diff --git a/android/build.gradle b/android/build.gradle index 880ff171..e2b65ac7 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -47,6 +47,6 @@ dependencies { compile 'com.twilio:voice-android:2.0.9' compile 'com.android.support:appcompat-v7:27.0.2' compile 'com.facebook.react:react-native:+' - compile 'com.google.firebase:firebase-messaging:17.+' + compile 'com.google.firebase:firebase-messaging:17.3.4' testCompile 'junit:junit:4.12' } diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java index 774ad936..228b4b63 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java @@ -15,6 +15,7 @@ import android.media.AudioManager; import android.os.Build; +import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.content.LocalBroadcastManager; @@ -38,8 +39,10 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; -import com.google.firebase.FirebaseApp; +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; import com.google.firebase.iid.FirebaseInstanceId; +import com.google.firebase.iid.InstanceIdResult; import com.twilio.voice.Call; import com.twilio.voice.CallException; import com.twilio.voice.CallInvite; @@ -494,15 +497,16 @@ public void initWithAccessToken(final String accessToken, Promise promise) { if (accessToken.equals("")) { promise.reject(new JSApplicationIllegalArgumentException("Invalid access token")); return; - } - + } + if(!checkPermissionForMicrophone()) { promise.reject(new AssertionException("Can't init without microphone permission")); - } + return; + } TwilioVoiceModule.this.accessToken = accessToken; if (BuildConfig.DEBUG) { - Log.d(TAG, "initWithAccessToken ACTION_FCM_TOKEN"); + Log.d(TAG, "initWithAccessToken"); } registerForCallInvites(); WritableMap params = Arguments.createMap(); @@ -533,20 +537,28 @@ private void clearIncomingNotification(CallInvite callInvite) { * If a valid google-services.json has not been provided or the FirebaseInstanceId has not been * initialized the fcmToken will be null. * - * In the case where the FirebaseInstanceId has not yet been initialized the - * VoiceFirebaseInstanceIDService.onTokenRefresh should result in a LocalBroadcast to this - * activity which will attempt registerForCallInvites again. - * */ private void registerForCallInvites() { - FirebaseApp.initializeApp(getReactApplicationContext()); - final String fcmToken = FirebaseInstanceId.getInstance().getToken(); - if (fcmToken != null) { - if (BuildConfig.DEBUG) { - Log.d(TAG, "Registering with FCM"); - } - Voice.register(getReactApplicationContext(), accessToken, Voice.RegistrationChannel.FCM, fcmToken, registrationListener); - } + FirebaseInstanceId.getInstance().getInstanceId() + .addOnCompleteListener(new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if (!task.isSuccessful()) { + Log.w(TAG, "getInstanceId failed", task.getException()); + return; + } + + // Get new Instance ID token + String fcmToken = task.getResult().getToken(); + if (fcmToken != null) { + if (BuildConfig.DEBUG) { + Log.d(TAG, "Registering with FCM"); + } + Voice.register(getReactApplicationContext(), accessToken, Voice.RegistrationChannel.FCM, fcmToken, registrationListener); + } + } + }); + } @ReactMethod @@ -778,14 +790,15 @@ private boolean checkPermissionForMicrophone() { } private void requestPermissionForMicrophone() { - if (getCurrentActivity() != null) { - if (ActivityCompat.shouldShowRequestPermissionRationale(getCurrentActivity(), Manifest.permission.RECORD_AUDIO)) { - // Snackbar.make(coordinatorLayout, - // "Microphone permissions needed. Please allow in your application settings.", - // SNACKBAR_DURATION).show(); - } else { - ActivityCompat.requestPermissions(getCurrentActivity(), new String[]{Manifest.permission.RECORD_AUDIO}, MIC_PERMISSION_REQUEST_CODE); - } + if (getCurrentActivity() == null) { + return; + } + if (ActivityCompat.shouldShowRequestPermissionRationale(getCurrentActivity(), Manifest.permission.RECORD_AUDIO)) { +// Snackbar.make(coordinatorLayout, +// "Microphone permissions needed. Please allow in your application settings.", +// SNACKBAR_DURATION).show(); + } else { + ActivityCompat.requestPermissions(getCurrentActivity(), new String[]{Manifest.permission.RECORD_AUDIO}, MIC_PERMISSION_REQUEST_CODE); } } } diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseInstanceIDService.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseInstanceIDService.java deleted file mode 100644 index 9154661c..00000000 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseInstanceIDService.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.hoxfon.react.RNTwilioVoice.fcm; - -import android.content.Intent; -import android.support.v4.content.LocalBroadcastManager; -import android.util.Log; - -import com.google.firebase.iid.FirebaseInstanceId; -import com.google.firebase.iid.FirebaseInstanceIdService; -import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.ACTION_FCM_TOKEN; -import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.TAG; - -public class VoiceFirebaseInstanceIDService extends FirebaseInstanceIdService { - - /** - * Called if InstanceID token is updated. This may occur if the security of - * the previous token had been compromised. Note that this is called when the InstanceID token - * is initially generated so this is where you would retrieve the token. - */ - // [START refresh_token] - @Override - public void onTokenRefresh() { - // Get updated InstanceID token. - String refreshedToken = FirebaseInstanceId.getInstance().getToken(); - Log.d(TAG, "Refreshed token: " + refreshedToken); - - // Notify Activity of FCM token - Intent intent = new Intent(ACTION_FCM_TOKEN); - LocalBroadcastManager.getInstance(this).sendBroadcast(intent); - } - // [END refresh_token] - - /** - * Persist token to third-party servers. - * - * Modify this method to associate the user's FCM InstanceID token with any server-side account - * maintained by your application. - * - * @param token The new token. - */ - private void sendRegistrationToServer(String token) { - // TODO: Implement this method to send token to your app server. - } -} diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java index b50facdc..bb4e6d6f 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java @@ -4,7 +4,6 @@ import android.app.ActivityManager; import android.content.Intent; -import android.os.Build; import android.os.Handler; import android.os.Looper; import android.support.v4.content.LocalBroadcastManager; @@ -28,6 +27,7 @@ import java.util.Random; import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.TAG; +import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.ACTION_FCM_TOKEN; import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.ACTION_INCOMING_CALL; import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.INCOMING_CALL_INVITE; import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.INCOMING_CALL_NOTIFICATION_ID; @@ -43,6 +43,15 @@ public void onCreate() { callNotificationManager = new CallNotificationManager(); } + @Override + public void onNewToken(String token) { + Log.d(TAG, "Refreshed token: " + token); + + // Notify Activity of FCM token + Intent intent = new Intent(ACTION_FCM_TOKEN); + LocalBroadcastManager.getInstance(this).sendBroadcast(intent); + } + /** * Called when message is received. * From f6a5a5259cc6d80a9aa7e2694902fa5458c123c9 Mon Sep 17 00:00:00 2001 From: Fabrizio Moscon Date: Sat, 15 Dec 2018 21:01:46 +0000 Subject: [PATCH 05/26] formatting --- ios/RNTwilioVoice/RNTwilioVoice.m | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/ios/RNTwilioVoice/RNTwilioVoice.m b/ios/RNTwilioVoice/RNTwilioVoice.m index 06f3f1e0..57c43c54 100644 --- a/ios/RNTwilioVoice/RNTwilioVoice.m +++ b/ios/RNTwilioVoice/RNTwilioVoice.m @@ -122,14 +122,14 @@ - (void)dealloc { [self toggleAudioRoute:speaker]; } -RCT_EXPORT_METHOD(sendDigits: (NSString *)digits){ +RCT_EXPORT_METHOD(sendDigits: (NSString *)digits) { if (self.call && self.call.state == TVOCallStateConnected) { NSLog(@"SendDigits %@", digits); [self.call sendDigits:digits]; } } -RCT_EXPORT_METHOD(unregister){ +RCT_EXPORT_METHOD(unregister) { NSLog(@"unregister"); NSString *accessToken = [self fetchAccessToken]; @@ -148,16 +148,16 @@ - (void)dealloc { RCT_REMAP_METHOD(getActiveCall, resolver:(RCTPromiseResolveBlock)resolve - rejecter:(RCTPromiseRejectBlock)reject){ + rejecter:(RCTPromiseRejectBlock)reject) { NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; if (self.callInvite) { - if (self.callInvite.callSid){ + if (self.callInvite.callSid) { [params setObject:self.callInvite.callSid forKey:@"call_sid"]; } - if (self.callInvite.from){ + if (self.callInvite.from) { [params setObject:self.callInvite.from forKey:@"from"]; } - if (self.callInvite.to){ + if (self.callInvite.to) { [params setObject:self.callInvite.to forKey:@"to"]; } if (self.callInvite.state == TVOCallInviteStatePending) { @@ -172,10 +172,10 @@ - (void)dealloc { if (self.call.sid) { [params setObject:self.call.sid forKey:@"call_sid"]; } - if (self.call.to){ + if (self.call.to) { [params setObject:self.call.to forKey:@"call_to"]; } - if (self.call.from){ + if (self.call.from) { [params setObject:self.call.from forKey:@"call_from"]; } if (self.call.state == TVOCallStateConnected) { @@ -294,7 +294,7 @@ - (void)handleCallInviteCanceled:(TVOCallInvite *)callInvite { [self performEndCallActionWithUUID:callInvite.uuid]; NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; - if (self.callInvite.callSid){ + if (self.callInvite.callSid) { [params setObject:self.callInvite.callSid forKey:@"call_sid"]; } @@ -367,9 +367,10 @@ - (void)callDisconnected:(NSError *)error { if (self.call.sid) { [params setObject:self.call.sid forKey:@"call_sid"]; } + if (self.call.to) { [params setObject:self.call.to forKey:@"call_to"]; } - if (self.call.from){ + if (self.call.from) { [params setObject:self.call.from forKey:@"call_from"]; } if (self.call.state == TVOCallStateDisconnected) { From 13faff5991dfb5f22135471107220f6ac8cff824 Mon Sep 17 00:00:00 2001 From: Fabrizio Moscon Date: Thu, 27 Dec 2018 18:37:47 +0000 Subject: [PATCH 06/26] fix: align lib dependency with root update build.gradle as per recommendations in RN 0.57.8 update gradle to v 3.2.1 --- android/build.gradle | 30 +++++++++++++++++++++--------- android/settings.gradle | 0 2 files changed, 21 insertions(+), 9 deletions(-) delete mode 100644 android/settings.gradle diff --git a/android/build.gradle b/android/build.gradle index e2b65ac7..c2cd1d1f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,11 +2,15 @@ buildscript { repositories { + maven { + url 'https://maven.google.com/' + name 'Google' + } jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.1' - classpath 'com.google.gms:google-services:3.1.2' + classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.google.gms:google-services:4.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -15,21 +19,27 @@ buildscript { allprojects { repositories { - jcenter() maven { - url "https://maven.google.com" + url 'https://maven.google.com/' + name 'Google' } + jcenter() } } apply plugin: 'com.android.library' +def DEFAULT_COMPILE_SDK_VERSION = 27 +def DEFAULT_BUILD_TOOLS_VERSION = "27.0.3" +def DEFAULT_TARGET_SDK_VERSION = 27 +def DEFAULT_SUPPORT_LIB_VERSION = "27.0.2" + android { - compileSdkVersion 27 - buildToolsVersion "27.0.3" + compileSdkVersion rootProject.hasProperty('compileSdkVersion') ? rootProject.compileSdkVersion : DEFAULT_COMPILE_SDK_VERSION + buildToolsVersion rootProject.hasProperty('buildToolsVersion') ? rootProject.buildToolsVersion : DEFAULT_BUILD_TOOLS_VERSION defaultConfig { minSdkVersion 16 - targetSdkVersion 27 + targetSdkVersion rootProject.hasProperty('targetSdkVersion') ? rootProject.targetSdkVersion : DEFAULT_TARGET_SDK_VERSION versionCode 1 versionName "1.0" vectorDrawables.useSupportLibrary = true @@ -43,10 +53,12 @@ android { } dependencies { + def supportLibVersion = rootProject.hasProperty('supportLibVersion') ? rootProject.supportLibVersion : DEFAULT_SUPPORT_LIB_VERSION + compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.twilio:voice-android:2.0.9' - compile 'com.android.support:appcompat-v7:27.0.2' + compile 'com.android.support:appcompat-v7:$supportLibVersion' compile 'com.facebook.react:react-native:+' - compile 'com.google.firebase:firebase-messaging:17.3.4' + compile 'com.google.firebase:firebase-messaging:17.+' testCompile 'junit:junit:4.12' } diff --git a/android/settings.gradle b/android/settings.gradle deleted file mode 100644 index e69de29b..00000000 From 3e186199cc364246d2427ffc786ef92fe27cefd5 Mon Sep 17 00:00:00 2001 From: Fabrizio Moscon Date: Sat, 15 Dec 2018 21:01:59 +0000 Subject: [PATCH 07/26] v4.0.0 --- CHANGELOG.md | 7 +++ README.md | 55 ++++++------------- .../RNTwilioVoice/TwilioVoiceModule.java | 2 +- package.json | 2 +- 4 files changed, 26 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db2b8b76..0c925fa9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ [Release Section](https://github.com/hoxfon/react-native-twilio-programmable-voice/releases) +## 4.0.0 +- Android + - update Firebase Messaging to 17.3.4 which simplifies how to obtain the FCM token +- iOS + - convert params for connectionDidConnect to => call_to, from => call_from + - convert params for connectionDidDisconnect to => call_to, from => call_from, error => err + ## 3.21.1 - Android: fix crash when asking for microphone permission before an activity is displayed diff --git a/README.md b/README.md index b0e65d07..93f92499 100644 --- a/README.md +++ b/README.md @@ -3,41 +3,15 @@ This is a React Native wrapper for Twilio Programmable Voice SDK that lets you m # Twilio Programmable Voice SDK -- Android 2.0.7 (bundled within this library) -- iOS 2.0.4 (specified by the app's own podfile) +- Android 2.0.9 (bundled within this library) +- iOS 2.0.7 (specified by the app's own podfile) -## Breaking changes in v3.0.0 - -- initWitToken returns an object with a property `initialized` instead of `initilized` -- iOS event `connectionDidConnect` returns the same properties as Android -move property `to` => `call_to` -move property `from` => `call_from` -## Migrating Android from v1 to v2 (incoming call use FCM) -You will need to make changes both on your Twilio account using Twilio Web Console and on your react native app. -Twilio Programmable Voice Android SDK uses `FCM` since version 2.0.0.beta5. - -Before you start, I strongly suggest that you read the list of Twilio changes from Android SDK v2.0.0 beta4 to beta5: -[Twilio example App: Migrating from GCM to FCM](https://github.com/twilio/voice-quickstart-android/blob/d7d4f0658e145eb94ab8f5e34f6fd17314e7ab17/README.md#migrating-from-gcm-to-fcm) - -These are all the changes required: - -- remove all the GCM related code from your `AndroidManifest.xml` and add the following code to receive `FCM` notifications -(I wasn't successful in keeping react-native-fcm working at the same time. If you know how please open an issue to share). +## Breaking changes in v4.0.0 +- Android: remove the following block from your application's `AndroidManifest.xml` ```xml - ..... - - - - - - - - - - ``` -- log into your Firebase console. Navigate to: Project settings > CLOUD MESSAGING. Copy your `Server key` -- in Twilio console add a new Push Credential, type `FCM`, fcm secret Firebase FCM `Server key` -- include in your project `google-services.json`; if you have not include it yet -- rename getIncomingCall() to getActiveCall() +- iOS: params changes for `connectionDidConnect` and `connectionDidDisconnect` + + to => call_to + from => call_from + error => err -If something doesn't work as expected or you want to make a request open an issue. +## Breaking changes in v3.0.0 + +- initWitToken returns an object with a property `initialized` instead of `initilized` +- iOS event `connectionDidConnect` returns the same properties as Android +move property `to` => `call_to` +move property `from` => `call_from` ## Help wanted! @@ -220,8 +199,8 @@ public class MainApplication extends Application implements ReactApplication { protected List getPackages() { return Arrays.asList( new MainReactPackage(), - new TwilioVoicePackage() // <---- Add the Package : by default it will ask microphone permissions - // new TwilioVoicePackage(false) // <---- pass false to handle microphone permissions in your application + new TwilioVoicePackage() // <---- Add the package + // new TwilioVoicePackage(false) // <---- pass false if you don't want to ask for microphone permissions ); } }; diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java index 228b4b63..17409af8 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java @@ -500,7 +500,7 @@ public void initWithAccessToken(final String accessToken, Promise promise) { } if(!checkPermissionForMicrophone()) { - promise.reject(new AssertionException("Can't init without microphone permission")); + promise.reject(new AssertionException("Allow microphone permission")); return; } diff --git a/package.json b/package.json index 02d0d67b..3936971a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-twilio-programmable-voice", - "version": "3.21.1", + "version": "4.0.0", "description": "React Native wrapper for Twilio Programmable Voice SDK", "main": "index.js", "scripts": { From c9714a30f97f54e5732a070b1ca3e5526bc3e048 Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 13:12:41 +0200 Subject: [PATCH 08/26] React 59+ compat --- android/build.gradle | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 878fc179..059ce574 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.1' + classpath 'com.android.tools.build:gradle:3.3.0' classpath 'com.google.gms:google-services:3.1.2' // NOTE: Do not place your application dependencies here; they belong @@ -26,10 +26,10 @@ apply plugin: 'com.android.library' android { compileSdkVersion 27 - buildToolsVersion "27.0.3" + buildToolsVersion "28.0.3" defaultConfig { minSdkVersion 16 - targetSdkVersion 27 + targetSdkVersion 28 versionCode 1 versionName "1.0" vectorDrawables.useSupportLibrary = true @@ -43,10 +43,10 @@ android { } dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - compile 'com.twilio:voice-android:2.0.7' - compile 'com.android.support:appcompat-v7:27.0.2' - compile 'com.facebook.react:react-native:+' - compile 'com.google.firebase:firebase-messaging:17.+' - testCompile 'junit:junit:4.12' + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.twilio:voice-android:4.0.0' + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.facebook.react:react-native:+' + implementation 'com.google.firebase:firebase-messaging:17.+' + testImplementation 'junit:junit:4.12' } From ed1b70bc8467a5196d4be564a41c7890f13d79c2 Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 13:15:16 +0200 Subject: [PATCH 09/26] Correct version --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 059ce574..c7cf3f0f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' + classpath 'com.android.tools.build:gradle:2.3.0' classpath 'com.google.gms:google-services:3.1.2' // NOTE: Do not place your application dependencies here; they belong From 8351458106f4f9d48ed806abd8e8bea4eb3d29da Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 13:36:09 +0200 Subject: [PATCH 10/26] Revert version --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index c7cf3f0f..3b47459f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -44,7 +44,7 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation 'com.twilio:voice-android:4.0.0' + implementation 'com.twilio:voice-android:2.0.7' implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.facebook.react:react-native:+' implementation 'com.google.firebase:firebase-messaging:17.+' From 182b9bfc6b1aac1a9fb2f41b9464abd2149276ef Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 13:53:22 +0200 Subject: [PATCH 11/26] Upgrade to Twilio Sdk 4 --- README.md | 6 +++--- android/build.gradle | 5 +++-- android/gradle/wrapper/gradle-wrapper.properties | 2 +- .../com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java | 2 +- .../RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java | 5 +++++ 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b0e65d07..7c827439 100644 --- a/README.md +++ b/README.md @@ -277,7 +277,7 @@ TwilioVoice.addEventListener('connectionDidConnect', function(data) { // Android // { // call_sid: string, // Twilio call sid - // call_state: 'PENDING' | 'CONNECTED' | 'ACCEPTED' | 'CONNECTING' 'DISCONNECTED' | 'CANCELLED', + // call_state: 'PENDING' | 'CONNECTED' | 'ACCEPTED' | 'CONNECTING' | 'RECONNECTING' | 'DISCONNECTED' | 'CANCELLED', // call_from: string, // "+441234567890" // call_to: string, // "client:bob" // } @@ -297,7 +297,7 @@ TwilioVoice.addEventListener('connectionDidDisconnect', function(data: mixed) { // | Android // { // call_sid: string, // Twilio call sid - // call_state: 'PENDING' | 'CONNECTED' | 'ACCEPTED' | 'CONNECTING' 'DISCONNECTED' | 'CANCELLED', + // call_state: 'PENDING' | 'CONNECTED' | 'ACCEPTED' | 'CONNECTING' | 'RECONNECTING' | 'DISCONNECTED' | 'CANCELLED', // call_from: string, // "+441234567890" // call_to: string, // "client:bob" // err?: string, @@ -321,7 +321,7 @@ TwilioVoice.addEventListener('callRejected', function(value: 'callRejected') {}) TwilioVoice.addEventListener('deviceDidReceiveIncoming', function(data) { // { // call_sid: string, // Twilio call sid - // call_state: 'PENDING' | 'CONNECTED' | 'ACCEPTED' | 'CONNECTING' 'DISCONNECTED' | 'CANCELLED', + // call_state: 'PENDING' | 'CONNECTED' | 'ACCEPTED' | 'CONNECTING' | 'RECONNECTING' | 'DISCONNECTED' | 'CANCELLED', // call_from: string, // "+441234567890" // call_to: string, // "client:bob" // } diff --git a/android/build.gradle b/android/build.gradle index 3b47459f..a847cb3a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -3,9 +3,10 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.0' + classpath 'com.android.tools.build:gradle:3.3.0' classpath 'com.google.gms:google-services:3.1.2' // NOTE: Do not place your application dependencies here; they belong @@ -44,7 +45,7 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation 'com.twilio:voice-android:2.0.7' + implementation 'com.twilio:voice-android:4+' implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.facebook.react:react-native:+' implementation 'com.google.firebase:firebase-messaging:17.+' diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 04e285f3..708a0dce 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java index 774ad936..95a1e673 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java @@ -661,7 +661,7 @@ public void connect(ReadableMap params) { } } - activeCall = Voice.call(getReactApplicationContext(), accessToken, twiMLParams, callListener); + activeCall = Voice.connect(getReactApplicationContext(), accessToken, twiMLParams, callListener); } @ReactMethod diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java index b50facdc..b851e318 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java @@ -116,6 +116,11 @@ public void onReactContextInitialized(ReactContext context) { }); } + @Override + void onCancelledCallInvite(CancelledCallInvite callInvite) { + // Hide notification + } + @Override public void onError(MessageException messageException) { Log.e(TAG, "Error handling FCM message" + messageException.toString()); From 2de78fd90f0582122d2f9ac7027649781eca13e7 Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 13:58:24 +0200 Subject: [PATCH 12/26] Use new api --- .../RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java index b851e318..52776bef 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java @@ -20,7 +20,7 @@ import com.hoxfon.react.RNTwilioVoice.BuildConfig; import com.hoxfon.react.RNTwilioVoice.CallNotificationManager; import com.twilio.voice.CallInvite; -import com.twilio.voice.MessageException; +import com.twilio.voice.CancelledCallInvite import com.twilio.voice.MessageListener; import com.twilio.voice.Voice; @@ -62,8 +62,7 @@ public void onMessageReceived(RemoteMessage remoteMessage) { Random randomNumberGenerator = new Random(System.currentTimeMillis()); final int notificationId = randomNumberGenerator.nextInt(); - Voice.handleMessage(this, data, new MessageListener() { - + boolean valid = Voice.handleMessage(data, new MessageListener() { @Override public void onCallInvite(final CallInvite callInvite) { @@ -121,8 +120,7 @@ void onCancelledCallInvite(CancelledCallInvite callInvite) { // Hide notification } - @Override - public void onError(MessageException messageException) { + if (!valid) { Log.e(TAG, "Error handling FCM message" + messageException.toString()); } }); From e7a82107e4b81fce147f5e0295c297f25228427b Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 14:01:39 +0200 Subject: [PATCH 13/26] Forgot semi colon --- .../react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java index 52776bef..bac209dc 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java @@ -20,7 +20,7 @@ import com.hoxfon.react.RNTwilioVoice.BuildConfig; import com.hoxfon.react.RNTwilioVoice.CallNotificationManager; import com.twilio.voice.CallInvite; -import com.twilio.voice.CancelledCallInvite +import com.twilio.voice.CancelledCallInvite; import com.twilio.voice.MessageListener; import com.twilio.voice.Voice; From 58a1d3ccb44ec81ac55fee6fb7615b64d313af94 Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 14:02:49 +0200 Subject: [PATCH 14/26] Fix identation --- .../RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java index bac209dc..f4f2e8df 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java @@ -119,11 +119,11 @@ public void onReactContextInitialized(ReactContext context) { void onCancelledCallInvite(CancelledCallInvite callInvite) { // Hide notification } - - if (!valid) { - Log.e(TAG, "Error handling FCM message" + messageException.toString()); - } }); + + if (!valid) { + Log.e(TAG, "Error handling FCM message" + messageException.toString()); + } } // Check if message contains a notification payload. From 65260e3040f32c453c7b479ebb047cf7a9cc21ac Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 14:37:29 +0200 Subject: [PATCH 15/26] Update notifications --- .../RNTwilioVoice/TwilioVoiceModule.java | 48 +++++++++---------- .../fcm/VoiceFirebaseMessagingService.java | 20 ++++---- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java index 95a1e673..e7cb768d 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java @@ -386,7 +386,7 @@ private void handleIncomingCallIntent(Intent intent) { if (intent.getAction().equals(ACTION_INCOMING_CALL)) { activeCallInvite = intent.getParcelableExtra(INCOMING_CALL_INVITE); - if (activeCallInvite != null && (activeCallInvite.getState() == CallInvite.State.PENDING)) { + if (activeCallInvite != null) { // && (activeCallInvite.getState() == CallInvite.State.PENDING) callAccepted = false; if (BuildConfig.DEBUG) { Log.d(TAG, "handleIncomingCallIntent state = PENDING"); @@ -409,7 +409,7 @@ private void handleIncomingCallIntent(Intent intent) { params.putString("call_sid", activeCallInvite.getCallSid()); params.putString("call_from", activeCallInvite.getFrom()); params.putString("call_to", activeCallInvite.getTo()); - params.putString("call_state", activeCallInvite.getState().name()); + // params.putString("call_state", activeCallInvite.getState().name()); eventManager.sendEvent(EVENT_DEVICE_DID_RECEIVE_INCOMING, params); } @@ -429,14 +429,14 @@ private void handleIncomingCallIntent(Intent intent) { if (activeCallInvite != null) { if (BuildConfig.DEBUG) { - Log.d(TAG, "activeCallInvite state = " + activeCallInvite.getState()); + // Log.d(TAG, "activeCallInvite state = " + activeCallInvite.getState()); } if (BuildConfig.DEBUG) { Log.d(TAG, "activeCallInvite was cancelled by " + activeCallInvite.getFrom()); } if (!callAccepted) { if (BuildConfig.DEBUG) { - Log.d(TAG, "creating a missed call, activeCallInvite state: " + activeCallInvite.getState()); + // Log.d(TAG, "creating a missed call, activeCallInvite state: " + activeCallInvite.getState()); } callNotificationManager.createMissedCallNotification(getReactApplicationContext(), activeCallInvite); int appImportance = callNotificationManager.getApplicationImportance(getReactApplicationContext()); @@ -445,7 +445,7 @@ private void handleIncomingCallIntent(Intent intent) { params.putString("call_sid", activeCallInvite.getCallSid()); params.putString("call_from", activeCallInvite.getFrom()); params.putString("call_to", activeCallInvite.getTo()); - params.putString("call_state", activeCallInvite.getState().name()); + // params.putString("call_state", activeCallInvite.getState().name()); eventManager.sendEvent(EVENT_CONNECTION_DID_DISCONNECT, params); } } @@ -512,7 +512,7 @@ public void initWithAccessToken(final String accessToken, Promise promise) { private void clearIncomingNotification(CallInvite callInvite) { if (BuildConfig.DEBUG) { - Log.d(TAG, "clearIncomingNotification() callInvite state: "+ callInvite.getState()); + // Log.d(TAG, "clearIncomingNotification() callInvite state: "+ callInvite.getState()); } if (callInvite != null && callInvite.getCallSid() != null) { // remove incoming call notification @@ -554,26 +554,26 @@ public void accept() { callAccepted = true; SoundPoolManager.getInstance(getReactApplicationContext()).stopRinging(); if (activeCallInvite != null){ - if (activeCallInvite.getState() == CallInvite.State.PENDING) { + // if (activeCallInvite.getState() == CallInvite.State.PENDING) { if (BuildConfig.DEBUG) { Log.d(TAG, "accept() activeCallInvite.getState() PENDING"); } activeCallInvite.accept(getReactApplicationContext(), callListener); clearIncomingNotification(activeCallInvite); - } else { - // when the user answers a call from a notification before the react-native App - // is completely initialised, and the first event has been skipped - // re-send connectionDidConnect message to JS - WritableMap params = Arguments.createMap(); - params.putString("call_sid", activeCallInvite.getCallSid()); - params.putString("call_from", activeCallInvite.getFrom()); - params.putString("call_to", activeCallInvite.getTo()); - params.putString("call_state", activeCallInvite.getState().name()); - callNotificationManager.createHangupLocalNotification(getReactApplicationContext(), - activeCallInvite.getCallSid(), - activeCallInvite.getFrom()); - eventManager.sendEvent(EVENT_CONNECTION_DID_CONNECT, params); - } + // } else { + // // when the user answers a call from a notification before the react-native App + // // is completely initialised, and the first event has been skipped + // // re-send connectionDidConnect message to JS + // WritableMap params = Arguments.createMap(); + // params.putString("call_sid", activeCallInvite.getCallSid()); + // params.putString("call_from", activeCallInvite.getFrom()); + // params.putString("call_to", activeCallInvite.getTo()); + // // params.putString("call_state", activeCallInvite.getState().name()); + // callNotificationManager.createHangupLocalNotification(getReactApplicationContext(), + // activeCallInvite.getCallSid(), + // activeCallInvite.getFrom()); + // eventManager.sendEvent(EVENT_CONNECTION_DID_CONNECT, params); + // } } else { eventManager.sendEvent(EVENT_CONNECTION_DID_DISCONNECT, null); } @@ -588,7 +588,7 @@ public void reject() { params.putString("call_sid", activeCallInvite.getCallSid()); params.putString("call_from", activeCallInvite.getFrom()); params.putString("call_to", activeCallInvite.getTo()); - params.putString("call_state", activeCallInvite.getState().name()); + // params.putString("call_state", activeCallInvite.getState().name()); activeCallInvite.reject(getReactApplicationContext()); clearIncomingNotification(activeCallInvite); } @@ -604,7 +604,7 @@ public void ignore() { params.putString("call_sid", activeCallInvite.getCallSid()); params.putString("call_from", activeCallInvite.getFrom()); params.putString("call_to", activeCallInvite.getTo()); - params.putString("call_state", activeCallInvite.getState().name()); + // params.putString("call_state", activeCallInvite.getState().name()); clearIncomingNotification(activeCallInvite); } eventManager.sendEvent(EVENT_CONNECTION_DID_DISCONNECT, params); @@ -708,7 +708,7 @@ public void getActiveCall(Promise promise) { params.putString("call_sid", activeCallInvite.getCallSid()); params.putString("call_from", activeCallInvite.getFrom()); params.putString("call_to", activeCallInvite.getTo()); - params.putString("call_state", activeCallInvite.getState().name()); + // params.putString("call_state", activeCallInvite.getState().name()); promise.resolve(params); return; } diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java index f4f2e8df..2cadc71c 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java @@ -117,7 +117,9 @@ public void onReactContextInitialized(ReactContext context) { @Override void onCancelledCallInvite(CancelledCallInvite callInvite) { - // Hide notification + VoiceFirebaseMessagingService.this.cancelNotification(cancelledCallInvite); + VoiceFirebaseMessagingService.this.sendCancelledCallInviteToActivity( + cancelledCallInvite); } }); @@ -149,7 +151,8 @@ private void sendIncomingCallMessageToActivity( CallInvite callInvite, int notificationId ) { - Intent intent = new Intent(ACTION_INCOMING_CALL); + Intent intent = new Intent(this, VoiceActivity.class); + intent.setAction(VoiceActivity.ACTION_INCOMING_CALL); intent.putExtra(INCOMING_CALL_NOTIFICATION_ID, notificationId); intent.putExtra(INCOMING_CALL_INVITE, callInvite); LocalBroadcastManager.getInstance(context).sendBroadcast(intent); @@ -164,11 +167,12 @@ private void showNotification(ReactApplicationContext context, int notificationId, Intent launchIntent ) { - if (callInvite != null && callInvite.getState() == CallInvite.State.PENDING) { - callNotificationManager.createIncomingCallNotification(context, callInvite, notificationId, launchIntent); - } else { - SoundPoolManager.getInstance(context.getBaseContext()).stopRinging(); - callNotificationManager.removeIncomingCallNotification(context, callInvite, 0); - } + callNotificationManager.createIncomingCallNotification(context, callInvite, notificationId, launchIntent); + } + + private void cancelNotification(CancelledCallInvite cancelledCallInvite) { + SoundPoolManager.getInstance((this)).stopRinging(); + callNotificationManager.removeIncomingCallNotification(context, callInvite, 0); } + } From aae20ae11bc232cfeec89676099fb3da5cf590fc Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 14:40:32 +0200 Subject: [PATCH 16/26] Use connect options --- .../com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java index e7cb768d..c500937d 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java @@ -661,7 +661,11 @@ public void connect(ReadableMap params) { } } - activeCall = Voice.connect(getReactApplicationContext(), accessToken, twiMLParams, callListener); + ConnectOptions connectOptions = new ConnectOptions.Builder(accessToken) + .params(twiMLParams) + .build(); + + activeCall = Voice.connect(getReactApplicationContext(), connectOptions, callListener); } @ReactMethod From 93421313b2662348decd9d08b4ffc05310373991 Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 14:43:27 +0200 Subject: [PATCH 17/26] Add onReconnect method --- .../com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java index c500937d..f3cd275f 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java @@ -43,6 +43,7 @@ import com.twilio.voice.Call; import com.twilio.voice.CallException; import com.twilio.voice.CallInvite; +import com.twilio.voice.ConnectOptions; import com.twilio.voice.LogLevel; import com.twilio.voice.RegistrationException; import com.twilio.voice.RegistrationListener; @@ -242,6 +243,11 @@ public void onConnected(Call call) { eventManager.sendEvent(EVENT_CONNECTION_DID_CONNECT, params); } + @Override + public void onReconnecting(@NonNull Call call, @NonNull CallException callException) { + Log.d(TAG, "onReconnecting"); + } + @Override public void onDisconnected(Call call, CallException error) { unsetAudioFocus(); @@ -706,7 +712,7 @@ public void getActiveCall(Promise promise) { } if (activeCallInvite != null) { if (BuildConfig.DEBUG) { - Log.d(TAG, "Active call invite found state = "+activeCallInvite.getState()); + // Log.d(TAG, "Active call invite found state = "+activeCallInvite.getState()); } WritableMap params = Arguments.createMap(); params.putString("call_sid", activeCallInvite.getCallSid()); From b236cb60bdb8b73da717537d1f253ff066586617 Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 14:49:54 +0200 Subject: [PATCH 18/26] Fix typo --- .../react/RNTwilioVoice/CallNotificationManager.java | 2 +- .../com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/CallNotificationManager.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/CallNotificationManager.java index bace1249..c49fcde3 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/CallNotificationManager.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/CallNotificationManager.java @@ -312,7 +312,7 @@ public void removeIncomingCallNotification(ReactApplicationContext context, Log.d(TAG, "removeIncomingCallNotification"); NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { - if (callInvite != null && callInvite.getState() == CallInvite.State.PENDING) { + if (callInvite != null) { /* * If the incoming call message was cancelled then remove the notification by matching * it with the call sid from the list of notifications in the notification drawer. diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java index f3cd275f..f3308e59 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java @@ -244,10 +244,15 @@ public void onConnected(Call call) { } @Override - public void onReconnecting(@NonNull Call call, @NonNull CallException callException) { + public void onReconnecting(Call call, CallException callException) { Log.d(TAG, "onReconnecting"); } + @Override + public void onReconnected(Call call) { + Log.d(TAG, "onReconnected"); + } + @Override public void onDisconnected(Call call, CallException error) { unsetAudioFocus(); From 1f44944f1d36471f6f75f89008ac22054a4fa241 Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 14:56:28 +0200 Subject: [PATCH 19/26] Handle cancel invite --- .../react/RNTwilioVoice/TwilioVoiceModule.java | 18 ++++++++++++++++++ .../fcm/VoiceFirebaseMessagingService.java | 11 +++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java index f3308e59..1074bbf4 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java @@ -215,6 +215,24 @@ public void onError(RegistrationException error, String accessToken, String fcmT private Call.Listener callListener() { return new Call.Listener() { + /* + * This callback is emitted once before the Call.Listener.onConnected() callback when + * the callee is being alerted of a Call. The behavior of this callback is determined by + * the answerOnBridge flag provided in the Dial verb of your TwiML application + * associated with this client. If the answerOnBridge flag is false, which is the + * default, the Call.Listener.onConnected() callback will be emitted immediately after + * Call.Listener.onRinging(). If the answerOnBridge flag is true, this will cause the + * call to emit the onConnected callback only after the call is answered. + * See answeronbridge for more details on how to use it with the Dial TwiML verb. If the + * twiML response contains a Say verb, then the call will emit the + * Call.Listener.onConnected callback immediately after Call.Listener.onRinging() is + * raised, irrespective of the value of answerOnBridge being set to true or false + */ + @Override + public void onRinging(Call call) { + Log.d(TAG, "Ringing"); + } + @Override public void onConnected(Call call) { if (BuildConfig.DEBUG) { diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java index 2cadc71c..e1792516 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java @@ -116,8 +116,8 @@ public void onReactContextInitialized(ReactContext context) { } @Override - void onCancelledCallInvite(CancelledCallInvite callInvite) { - VoiceFirebaseMessagingService.this.cancelNotification(cancelledCallInvite); + public void onCancelledCallInvite(CancelledCallInvite cancelledCallInvite) { + VoiceFirebaseMessagingService.this.cancelNotification((ReactApplicationContext)context, cancelledCallInvite); VoiceFirebaseMessagingService.this.sendCancelledCallInviteToActivity( cancelledCallInvite); } @@ -151,8 +151,7 @@ private void sendIncomingCallMessageToActivity( CallInvite callInvite, int notificationId ) { - Intent intent = new Intent(this, VoiceActivity.class); - intent.setAction(VoiceActivity.ACTION_INCOMING_CALL); + Intent intent = new Intent(ACTION_INCOMING_CALL); intent.putExtra(INCOMING_CALL_NOTIFICATION_ID, notificationId); intent.putExtra(INCOMING_CALL_INVITE, callInvite); LocalBroadcastManager.getInstance(context).sendBroadcast(intent); @@ -170,9 +169,9 @@ private void showNotification(ReactApplicationContext context, callNotificationManager.createIncomingCallNotification(context, callInvite, notificationId, launchIntent); } - private void cancelNotification(CancelledCallInvite cancelledCallInvite) { + private void cancelNotification(ReactApplicationContext context, CancelledCallInvite cancelledCallInvite) { SoundPoolManager.getInstance((this)).stopRinging(); - callNotificationManager.removeIncomingCallNotification(context, callInvite, 0); + callNotificationManager.removeIncomingCallNotification(context, cancelledCallInvite, 0); } } From a31039ee244d8de6c5dad8ff10fdb5e880477c5b Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 15:02:59 +0200 Subject: [PATCH 20/26] Add CancelledCallInvite --- .../react/RNTwilioVoice/CallNotificationManager.java | 3 ++- .../hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java | 2 +- .../fcm/VoiceFirebaseMessagingService.java | 10 ++++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/CallNotificationManager.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/CallNotificationManager.java index c49fcde3..11050c1d 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/CallNotificationManager.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/CallNotificationManager.java @@ -21,6 +21,7 @@ import com.facebook.react.bridge.ReactApplicationContext; import com.twilio.voice.CallInvite; +import com.twilio.voice.CancelledCallInvite; import java.util.List; @@ -307,7 +308,7 @@ public void createHangupLocalNotification(ReactApplicationContext context, Strin } public void removeIncomingCallNotification(ReactApplicationContext context, - CallInvite callInvite, + CancelledCallInvite callInvite, int notificationId) { Log.d(TAG, "removeIncomingCallNotification"); NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java index 1074bbf4..82619d77 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java @@ -574,7 +574,7 @@ private void registerForCallInvites() { if (BuildConfig.DEBUG) { Log.d(TAG, "Registering with FCM"); } - Voice.register(getReactApplicationContext(), accessToken, Voice.RegistrationChannel.FCM, fcmToken, registrationListener); + Voice.register(accessToken, Voice.RegistrationChannel.FCM, fcmToken, registrationListener); } } diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java index e1792516..9aaf45e7 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java @@ -30,6 +30,7 @@ import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.TAG; import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.ACTION_INCOMING_CALL; import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.INCOMING_CALL_INVITE; +import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.CANCELLED_CALL_INVITE; import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.INCOMING_CALL_NOTIFICATION_ID; import com.hoxfon.react.RNTwilioVoice.SoundPoolManager; @@ -157,6 +158,15 @@ private void sendIncomingCallMessageToActivity( LocalBroadcastManager.getInstance(context).sendBroadcast(intent); } + /* + * Send the CancelledCallInvite to the VoiceActivity + */ + private void sendCancelledCallInviteToActivity(CancelledCallInvite cancelledCallInvite) { + Intent intent = new Intent(ACTION_CANCEL_CALL); + intent.putExtra(CANCELLED_CALL_INVITE, cancelledCallInvite); + LocalBroadcastManager.getInstance(this).sendBroadcast(intent); + } + /* * Show the notification in the Android notification drawer */ From 359ef68a1c5f623d4e159fbb810bbe51e45c9c83 Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 15:06:05 +0200 Subject: [PATCH 21/26] CANCELLED_CALL_INVITE --- .../java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java | 1 + .../react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java index 82619d77..c9700756 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java @@ -76,6 +76,7 @@ public class TwilioVoiceModule extends ReactContextBaseJavaModule implements Act public static final String INCOMING_CALL_INVITE = "INCOMING_CALL_INVITE"; public static final String INCOMING_CALL_NOTIFICATION_ID = "INCOMING_CALL_NOTIFICATION_ID"; public static final String NOTIFICATION_TYPE = "NOTIFICATION_TYPE"; + public static final String CANCELLED_CALL_INVITE = "CANCELLED_CALL_INVITE"; public static final String ACTION_INCOMING_CALL = "com.hoxfon.react.TwilioVoice.INCOMING_CALL"; public static final String ACTION_FCM_TOKEN = "com.hoxfon.react.TwilioVoice.ACTION_FCM_TOKEN"; diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java index 9aaf45e7..f637e5d1 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java @@ -125,7 +125,7 @@ public void onCancelledCallInvite(CancelledCallInvite cancelledCallInvite) { }); if (!valid) { - Log.e(TAG, "Error handling FCM message" + messageException.toString()); + Log.e(TAG, "Error handling FCM message"); } } From 663b237917749f99c620ea068fd10c59cbb642fd Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 15:10:40 +0200 Subject: [PATCH 22/26] Add cancel action --- .../react/RNTwilioVoice/TwilioVoiceModule.java | 1 + .../fcm/VoiceFirebaseMessagingService.java | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java index c9700756..ed8e5aea 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java @@ -79,6 +79,7 @@ public class TwilioVoiceModule extends ReactContextBaseJavaModule implements Act public static final String CANCELLED_CALL_INVITE = "CANCELLED_CALL_INVITE"; public static final String ACTION_INCOMING_CALL = "com.hoxfon.react.TwilioVoice.INCOMING_CALL"; + public static final String ACTION_CANCEL_CALL = "com.hoxfon.react.TwilioVoice.CANCEL_CALL"; public static final String ACTION_FCM_TOKEN = "com.hoxfon.react.TwilioVoice.ACTION_FCM_TOKEN"; public static final String ACTION_MISSED_CALL = "com.hoxfon.react.TwilioVoice.MISSED_CALL"; public static final String ACTION_ANSWER_CALL = "com.hoxfon.react.TwilioVoice.ANSWER_CALL"; diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java index f637e5d1..425e9b3e 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java @@ -29,6 +29,7 @@ import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.TAG; import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.ACTION_INCOMING_CALL; +import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.ACTION_CANCEL_CALL; import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.INCOMING_CALL_INVITE; import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.CANCELLED_CALL_INVITE; import static com.hoxfon.react.RNTwilioVoice.TwilioVoiceModule.INCOMING_CALL_NOTIFICATION_ID; @@ -118,9 +119,16 @@ public void onReactContextInitialized(ReactContext context) { @Override public void onCancelledCallInvite(CancelledCallInvite cancelledCallInvite) { - VoiceFirebaseMessagingService.this.cancelNotification((ReactApplicationContext)context, cancelledCallInvite); - VoiceFirebaseMessagingService.this.sendCancelledCallInviteToActivity( - cancelledCallInvite); + Handler handler = new Handler(Looper.getMainLooper()); + handler.post(new Runnable() { + public void run() { + ReactInstanceManager mReactInstanceManager = ((ReactApplication) getApplication()).getReactNativeHost().getReactInstanceManager(); + ReactContext context = mReactInstanceManager.getCurrentReactContext(); + VoiceFirebaseMessagingService.this.cancelNotification((ReactApplicationContext)context, cancelledCallInvite); + VoiceFirebaseMessagingService.this.sendCancelledCallInviteToActivity( + cancelledCallInvite); + } + }); } }); From 99382250ddc2799cd85f0dad892be982dec14d2a Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 15:11:42 +0200 Subject: [PATCH 23/26] Make final --- .../react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java index 425e9b3e..4336ddf6 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/fcm/VoiceFirebaseMessagingService.java @@ -118,7 +118,7 @@ public void onReactContextInitialized(ReactContext context) { } @Override - public void onCancelledCallInvite(CancelledCallInvite cancelledCallInvite) { + public void onCancelledCallInvite(final CancelledCallInvite cancelledCallInvite) { Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { public void run() { From ae3362c9f2193076e52656b202d2ecfa826c516a Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 27 Sep 2019 16:23:12 +0200 Subject: [PATCH 24/26] Handle cancelled call --- .../RNTwilioVoice/TwilioVoiceModule.java | 72 ++++++++----------- 1 file changed, 30 insertions(+), 42 deletions(-) diff --git a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java index ed8e5aea..0ddd9877 100644 --- a/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java +++ b/android/src/main/java/com/hoxfon/react/RNTwilioVoice/TwilioVoiceModule.java @@ -443,54 +443,42 @@ private void handleIncomingCallIntent(Intent intent) { // params.putString("call_state", activeCallInvite.getState().name()); eventManager.sendEvent(EVENT_DEVICE_DID_RECEIVE_INCOMING, params); } + } else { + + } + } else if (intent.getAction().equals(ACTION_CANCEL_CALL)) { + if (BuildConfig.DEBUG) { + Log.d(TAG, "====> BEGIN handleIncomingCallIntent when activeCallInvite != PENDING"); + } + // this block is executed when the callInvite is cancelled and: + // - the call is answered (activeCall != null) + // - the call is rejected + SoundPoolManager.getInstance(getReactApplicationContext()).stopRinging(); - } else { + if (BuildConfig.DEBUG) { + // Log.d(TAG, "activeCallInvite state = " + activeCallInvite.getState()); + } + if (BuildConfig.DEBUG) { + Log.d(TAG, "activeCallInvite was cancelled by " + activeCallInvite.getFrom()); + } + if (!callAccepted) { if (BuildConfig.DEBUG) { - Log.d(TAG, "====> BEGIN handleIncomingCallIntent when activeCallInvite != PENDING"); + Log.d(TAG, "creating a missed call"); } - // this block is executed when the callInvite is cancelled and: - // - the call is answered (activeCall != null) - // - the call is rejected - - SoundPoolManager.getInstance(getReactApplicationContext()).stopRinging(); - - // the call is not active yet - if (activeCall == null) { - - if (activeCallInvite != null) { - if (BuildConfig.DEBUG) { - // Log.d(TAG, "activeCallInvite state = " + activeCallInvite.getState()); - } - if (BuildConfig.DEBUG) { - Log.d(TAG, "activeCallInvite was cancelled by " + activeCallInvite.getFrom()); - } - if (!callAccepted) { - if (BuildConfig.DEBUG) { - // Log.d(TAG, "creating a missed call, activeCallInvite state: " + activeCallInvite.getState()); - } - callNotificationManager.createMissedCallNotification(getReactApplicationContext(), activeCallInvite); - int appImportance = callNotificationManager.getApplicationImportance(getReactApplicationContext()); - if (appImportance != RunningAppProcessInfo.IMPORTANCE_BACKGROUND) { - WritableMap params = Arguments.createMap(); - params.putString("call_sid", activeCallInvite.getCallSid()); - params.putString("call_from", activeCallInvite.getFrom()); - params.putString("call_to", activeCallInvite.getTo()); - // params.putString("call_state", activeCallInvite.getState().name()); - eventManager.sendEvent(EVENT_CONNECTION_DID_DISCONNECT, params); - } - } - } - clearIncomingNotification(activeCallInvite); - } else { - if (BuildConfig.DEBUG) { - Log.d(TAG, "activeCallInvite was answered. Call " + activeCall); - } - } - if (BuildConfig.DEBUG) { - Log.d(TAG, "====> END"); + callNotificationManager.createMissedCallNotification(getReactApplicationContext(), activeCallInvite); + int appImportance = callNotificationManager.getApplicationImportance(getReactApplicationContext()); + if (appImportance != RunningAppProcessInfo.IMPORTANCE_BACKGROUND) { + WritableMap params = Arguments.createMap(); + params.putString("call_sid", activeCallInvite.getCallSid()); + params.putString("call_from", activeCallInvite.getFrom()); + params.putString("call_to", activeCallInvite.getTo()); + // params.putString("call_state", activeCallInvite.getState().name()); + eventManager.sendEvent(EVENT_CONNECTION_DID_DISCONNECT, params); } } + + clearIncomingNotification(activeCallInvite); } else if (intent.getAction().equals(ACTION_FCM_TOKEN)) { if (BuildConfig.DEBUG) { Log.d(TAG, "handleIncomingCallIntent ACTION_FCM_TOKEN"); From f29997068f50cefb11abd00d17613eb45c9788a8 Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 13 Dec 2019 12:13:15 +0100 Subject: [PATCH 25/26] update compile versions --- android/build.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 4777febd..f96378c3 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -30,10 +30,10 @@ allprojects { apply plugin: 'com.android.library' -def DEFAULT_COMPILE_SDK_VERSION = 27 -def DEFAULT_BUILD_TOOLS_VERSION = "27.0.3" -def DEFAULT_TARGET_SDK_VERSION = 27 -def DEFAULT_SUPPORT_LIB_VERSION = "27.0.2" +def DEFAULT_COMPILE_SDK_VERSION = 28 +def DEFAULT_BUILD_TOOLS_VERSION = "28.0.3" +def DEFAULT_TARGET_SDK_VERSION = 28 +def DEFAULT_SUPPORT_LIB_VERSION = "28.0.2" android { compileSdkVersion rootProject.hasProperty('compileSdkVersion') ? rootProject.compileSdkVersion : DEFAULT_COMPILE_SDK_VERSION From c76535212aed1987cbe6729ac332edd224453400 Mon Sep 17 00:00:00 2001 From: Eelco Wiersma Date: Fri, 13 Dec 2019 12:30:57 +0100 Subject: [PATCH 26/26] Update support lib minor version --- android/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index f96378c3..13d135fb 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -33,7 +33,7 @@ apply plugin: 'com.android.library' def DEFAULT_COMPILE_SDK_VERSION = 28 def DEFAULT_BUILD_TOOLS_VERSION = "28.0.3" def DEFAULT_TARGET_SDK_VERSION = 28 -def DEFAULT_SUPPORT_LIB_VERSION = "28.0.2" +def DEFAULT_SUPPORT_LIB_VERSION = "28.0.3" android { compileSdkVersion rootProject.hasProperty('compileSdkVersion') ? rootProject.compileSdkVersion : DEFAULT_COMPILE_SDK_VERSION