From 90d51b70244a8b8d59bb67628e09dbf71e7b0015 Mon Sep 17 00:00:00 2001 From: Emmanuel Quentin Date: Tue, 2 Mar 2021 19:32:08 -0500 Subject: [PATCH 1/4] Avoid to wakeup appllication twice --- .../main/java/io/wazo/callkeep/VoiceConnectionService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java index aa83b532..a0c38973 100644 --- a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java +++ b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java @@ -252,6 +252,11 @@ private void startForegroundService() { } private void wakeUpApplication(String uuid, String number, String displayName) { + Log.d(TAG, "wakeUpApplication, uuid:" + uuid + ", number :" + number + ", displayName:" + displayName); + + // Avoid to call wake up the app again in wakeUpAfterReachabilityTimeout. + this.currentConnectionRequest = null; + Intent headlessIntent = new Intent( this.getApplicationContext(), RNCallKeepBackgroundMessagingService.class From 643af79707cea8cd6473a11de166cfe8b970eb74 Mon Sep 17 00:00:00 2001 From: Emmanuel Quentin Date: Tue, 2 Mar 2021 19:33:25 -0500 Subject: [PATCH 2/4] Avoid to check for reachability everytime we make a call --- .../java/io/wazo/callkeep/RNCallKeepModule.java | 2 ++ .../wazo/callkeep/VoiceConnectionService.java | 17 ++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java index 327d49b4..75655a60 100644 --- a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java +++ b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java @@ -122,7 +122,9 @@ public String getName() { @ReactMethod public void setup(ReadableMap options) { + Log.d(TAG, "setup"); VoiceConnectionService.setAvailable(false); + VoiceConnectionService.setInitialized(true); this._settings = options; if (isConnectionServiceAvailable()) { diff --git a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java index a0c38973..303de2f1 100644 --- a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java +++ b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java @@ -69,9 +69,9 @@ // @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) public class VoiceConnectionService extends ConnectionService { - private static Boolean isAvailable; - private static Boolean isInitialized; - private static Boolean isReachable; + private static Boolean isAvailable = false; + private static Boolean isInitialized = false; + private static Boolean isReachable = false; private static Boolean canMakeMultipleCalls = true; private static String notReachableCallUuid; private static ConnectionRequest currentConnectionRequest; @@ -92,9 +92,6 @@ public static Connection getConnection(String connectionId) { public VoiceConnectionService() { super(); Log.e(TAG, "Constructor"); - isReachable = false; - isInitialized = false; - isAvailable = false; currentConnectionRequest = null; currentConnectionService = this; } @@ -106,7 +103,7 @@ public static void setPhoneAccountHandle(PhoneAccountHandle phoneAccountHandle) public static void setAvailable(Boolean value) { Log.d(TAG, "setAvailable: " + (value ? "true" : "false")); if (value) { - isInitialized = true; + setInitialized(true); } isAvailable = value; @@ -126,6 +123,12 @@ public static void setReachable() { VoiceConnectionService.currentConnectionRequest = null; } + public static void setInitialized(boolean value) { + Log.d(TAG, "setInitialized: " + (value ? "true" : "false")); + + isInitialized = value; + } + public static void deinitConnection(String connectionId) { Log.d(TAG, "deinitConnection:" + connectionId); VoiceConnectionService.hasOutgoingCall = false; From 1d64946eb0c057647a90bb70b33995b83902c95e Mon Sep 17 00:00:00 2001 From: Emmanuel Quentin Date: Tue, 2 Mar 2021 19:33:58 -0500 Subject: [PATCH 3/4] Add more logs --- .../io/wazo/callkeep/RNCallKeepModule.java | 23 +++++++++++++++---- .../wazo/callkeep/VoiceConnectionService.java | 18 +++++++++++++-- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java index 75655a60..7253480e 100644 --- a/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java +++ b/android/src/main/java/io/wazo/callkeep/RNCallKeepModule.java @@ -142,6 +142,8 @@ public void registerPhoneAccount() { return; } + Log.d(TAG, "registerPhoneAccount"); + this.registerPhoneAccount(this.getAppContext()); } @@ -162,7 +164,7 @@ public void displayIncomingCall(String uuid, String number, String callerName) { return; } - Log.d(TAG, "displayIncomingCall number: " + number + ", callerName: " + callerName); + Log.d(TAG, "displayIncomingCall, uuid: " + uuid + ", number: " + number + ", callerName: " + callerName); Bundle extras = new Bundle(); Uri uri = Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null); @@ -176,6 +178,7 @@ public void displayIncomingCall(String uuid, String number, String callerName) { @ReactMethod public void answerIncomingCall(String uuid) { + Log.d(TAG, "answerIncomingCall, uuid: " + uuid); if (!isConnectionServiceAvailable() || !hasPhoneAccount()) { return; } @@ -190,12 +193,12 @@ public void answerIncomingCall(String uuid) { @ReactMethod public void startCall(String uuid, String number, String callerName) { + Log.d(TAG, "startCall called, uuid: " + uuid + ", number: " + number + ", callerName: " + callerName); + if (!isConnectionServiceAvailable() || !hasPhoneAccount() || !hasPermissions() || number == null) { return; } - Log.d(TAG, "startCall number: " + number + ", callerName: " + callerName); - Bundle extras = new Bundle(); Uri uri = Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null); @@ -207,12 +210,14 @@ public void startCall(String uuid, String number, String callerName) { extras.putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, handle); extras.putParcelable(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, callExtras); + Log.d(TAG, "startCall, uuid: " + uuid); + telecomManager.placeCall(uri, extras); } @ReactMethod public void endCall(String uuid) { - Log.d(TAG, "endCall called"); + Log.d(TAG, "endCall called, uuid: " + uuid); if (!isConnectionServiceAvailable() || !hasPhoneAccount()) { return; } @@ -223,7 +228,7 @@ public void endCall(String uuid) { } conn.onDisconnect(); - Log.d(TAG, "endCall executed"); + Log.d(TAG, "endCall executed, uuid: " + uuid); } @ReactMethod @@ -362,6 +367,8 @@ public void checkDefaultPhoneAccount(Promise promise) { @ReactMethod public void setOnHold(String uuid, boolean shouldHold) { + Log.d(TAG, "setOnHold, uuid: " + uuid + ", shouldHold: " + (shouldHold ? "true" : "false")); + Connection conn = VoiceConnectionService.getConnection(uuid); if (conn == null) { return; @@ -376,6 +383,7 @@ public void setOnHold(String uuid, boolean shouldHold) { @ReactMethod public void reportEndCallWithUUID(String uuid, int reason) { + Log.d(TAG, "reportEndCallWithUUID, uuid: " + uuid + ", reason: " + reason); if (!isConnectionServiceAvailable() || !hasPhoneAccount()) { return; } @@ -389,6 +397,7 @@ public void reportEndCallWithUUID(String uuid, int reason) { @ReactMethod public void rejectCall(String uuid) { + Log.d(TAG, "rejectCall, uuid: " + uuid); if (!isConnectionServiceAvailable() || !hasPhoneAccount()) { return; } @@ -403,6 +412,7 @@ public void rejectCall(String uuid) { @ReactMethod public void setMutedCall(String uuid, boolean shouldMute) { + Log.d(TAG, "setMutedCall, uuid: " + uuid + ", shouldMute: " + (shouldMute ? "true" : "false")); Connection conn = VoiceConnectionService.getConnection(uuid); if (conn == null) { return; @@ -422,6 +432,7 @@ public void setMutedCall(String uuid, boolean shouldMute) { @ReactMethod public void sendDTMF(String uuid, String key) { + Log.d(TAG, "sendDTMF, uuid: " + uuid + ", key: " + key); Connection conn = VoiceConnectionService.getConnection(uuid); if (conn == null) { return; @@ -432,6 +443,7 @@ public void sendDTMF(String uuid, String key) { @ReactMethod public void updateDisplay(String uuid, String displayName, String uri) { + Log.d(TAG, "updateDisplay, uuid: " + uuid + ", displayName: " + displayName+ ", uri: " + uri); Connection conn = VoiceConnectionService.getConnection(uuid); if (conn == null) { return; @@ -482,6 +494,7 @@ public void setReachable() { @ReactMethod public void setCurrentCallActive(String uuid) { + Log.d(TAG, "setCurrentCallActive, uuid: " + uuid); Connection conn = VoiceConnectionService.getConnection(uuid); if (conn == null) { return; diff --git a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java index 303de2f1..c0ebcf6c 100644 --- a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java +++ b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java @@ -143,6 +143,9 @@ public Connection onCreateIncomingConnection(PhoneAccountHandle connectionManage Bundle extra = request.getExtras(); Uri number = request.getAddress(); String name = extra.getString(EXTRA_CALLER_NAME); + + Log.d(TAG, "onCreateIncomingConnection, name:" + name); + Connection incomingCallConnection = createConnection(request); incomingCallConnection.setRinging(); incomingCallConnection.setInitialized(); @@ -157,6 +160,8 @@ public Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManage VoiceConnectionService.hasOutgoingCall = true; String uuid = UUID.randomUUID().toString(); + Log.d(TAG, "onCreateOutgoingConnection, uuid:" + uuid); + if (!isInitialized && !isReachable) { this.notReachableCallUuid = uuid; this.currentConnectionRequest = request; @@ -174,7 +179,7 @@ private Connection makeOutgoingCall(ConnectionRequest request, String uuid, Bool String displayName = extras.getString(EXTRA_CALLER_NAME); Boolean isForeground = VoiceConnectionService.isRunning(this.getApplicationContext()); - Log.d(TAG, "makeOutgoingCall:" + uuid + ", number: " + number + ", displayName:" + displayName); + Log.d(TAG, "makeOutgoingCall, uuid:" + uuid + ", number: " + number + ", displayName:" + displayName); // Wakeup application if needed if (!isForeground || forceWakeUp) { @@ -224,6 +229,7 @@ private void startForegroundService() { // Foreground services not required before SDK 28 return; } + Log.d(TAG, "startForegroundService"); if (_settings == null || !_settings.hasKey("foregroundService")) { Log.d(TAG, "Not creating foregroundService because not configured"); return; @@ -307,6 +313,8 @@ private Boolean canMakeOutgoingCall() { } private Connection createConnection(ConnectionRequest request) { + Log.d(TAG, "createConnection"); + Bundle extras = request.getExtras(); HashMap extrasMap = this.bundleToMap(extras); extrasMap.put(EXTRA_CALL_NUMBER, request.getAddress().toString()); @@ -331,6 +339,7 @@ private Connection createConnection(ConnectionRequest request) { @Override public void onConference(Connection connection1, Connection connection2) { + Log.d(TAG, "onConference"); super.onConference(connection1, connection2); VoiceConnection voiceConnection1 = (VoiceConnection) connection1; VoiceConnection voiceConnection2 = (VoiceConnection) connection2; @@ -352,6 +361,8 @@ private void sendCallRequestToActivity(final String action, @Nullable final Hash final VoiceConnectionService instance = this; final Handler handler = new Handler(); + Log.d(TAG, "sendCallRequestToActivity, action:" + action); + handler.post(new Runnable() { @Override public void run() { @@ -391,10 +402,13 @@ public static boolean isRunning(Context context) { List tasks = activityManager.getRunningTasks(Integer.MAX_VALUE); for (RunningTaskInfo task : tasks) { - if (context.getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName())) + if (context.getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName())) { return true; + } } + Log.d(TAG, "isRunning: no running package found."); + return false; } } From b760af9fdb39dfb41133a9e5dd86a283d3197a75 Mon Sep 17 00:00:00 2001 From: Emmanuel Quentin Date: Thu, 4 Mar 2021 17:36:16 -0500 Subject: [PATCH 4/4] Stop foreground service when connection is closed --- .../java/io/wazo/callkeep/VoiceConnectionService.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java index c0ebcf6c..bcede465 100644 --- a/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java +++ b/android/src/main/java/io/wazo/callkeep/VoiceConnectionService.java @@ -133,6 +133,8 @@ public static void deinitConnection(String connectionId) { Log.d(TAG, "deinitConnection:" + connectionId); VoiceConnectionService.hasOutgoingCall = false; + currentConnectionService.stopForegroundService(); + if (currentConnections.containsKey(connectionId)) { currentConnections.remove(connectionId); } @@ -260,6 +262,15 @@ private void startForegroundService() { startForeground(FOREGROUND_SERVICE_TYPE_MICROPHONE, notification); } + private void stopForegroundService() { + Log.d(TAG, "stopForegroundService"); + if (_settings == null || !_settings.hasKey("foregroundService")) { + Log.d(TAG, "Discarding stop foreground service, no service configured"); + return; + } + stopForeground(FOREGROUND_SERVICE_TYPE_MICROPHONE); + } + private void wakeUpApplication(String uuid, String number, String displayName) { Log.d(TAG, "wakeUpApplication, uuid:" + uuid + ", number :" + number + ", displayName:" + displayName);