From 23a0bb3ce0c719aee673ab6a68f15dfd9a1304ec Mon Sep 17 00:00:00 2001 From: Curt Brune Date: Fri, 6 Sep 2019 10:08:27 -0700 Subject: [PATCH] Handle busy call while in PSTN call. --- .../securesms/service/WebRtcCallService.java | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/org/thoughtcrime/securesms/service/WebRtcCallService.java b/src/org/thoughtcrime/securesms/service/WebRtcCallService.java index 36652f7e69..0eddc8e213 100644 --- a/src/org/thoughtcrime/securesms/service/WebRtcCallService.java +++ b/src/org/thoughtcrime/securesms/service/WebRtcCallService.java @@ -32,6 +32,7 @@ import org.greenrobot.eventbus.EventBus; import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.WebRtcCallActivity; import org.thoughtcrime.securesms.contacts.ContactAccessor; +import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil; import org.thoughtcrime.securesms.database.Address; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.RecipientDatabase.VibrateState; @@ -45,6 +46,7 @@ import org.thoughtcrime.securesms.ringrtc.CameraState; import org.thoughtcrime.securesms.ringrtc.MessageRecipient; import org.thoughtcrime.securesms.ringrtc.CallConnectionWrapper; import org.thoughtcrime.securesms.util.FutureTaskListener; +import org.thoughtcrime.securesms.util.ListenableFutureTask; import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.TelephonyUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; @@ -71,6 +73,9 @@ import org.whispersystems.libsignal.InvalidKeyException; import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.api.SignalServiceMessageSender; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; +import org.whispersystems.signalservice.api.messages.calls.BusyMessage; +import org.whispersystems.signalservice.api.messages.calls.SignalServiceCallMessage; +import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException; import org.whispersystems.signalservice.internal.util.concurrent.SettableFuture; @@ -79,6 +84,7 @@ import java.io.IOException; import java.security.SecureRandom; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -168,6 +174,7 @@ public class WebRtcCallService extends Service implements CallConnection.Observe @Nullable private EglBase eglBase; private ExecutorService serviceExecutor = Executors.newSingleThreadExecutor(); + private ExecutorService networkExecutor = Executors.newSingleThreadExecutor(); private final PhoneStateListener hangUpRtcOnDeviceCallAnswered = new HangUpRtcOnPstnCallAnsweredListener(); @@ -590,12 +597,7 @@ public class WebRtcCallService extends Service implements CallConnection.Observe stopForeground(true); } - try { - MessageRecipient messageRecipient = new MessageRecipient(messageSender, recipient); - this.callConnection.sendBusy(messageRecipient, callId); - } catch (CallException e) { - Log.w(TAG, e); - } + sendMessage(recipient, SignalServiceCallMessage.forBusy(new BusyMessage(callId))); insertMissedCall(getRemoteRecipient(intent), false); } @@ -1010,6 +1012,25 @@ public class WebRtcCallService extends Service implements CallConnection.Observe microphoneEnabled)); } + private ListenableFutureTask sendMessage(@NonNull final Recipient recipient, + @NonNull final SignalServiceCallMessage callMessage) + { + Callable callable = new Callable() { + @Override + public Boolean call() throws Exception { + messageSender.sendCallMessage(new SignalServiceAddress(recipient.getAddress().toPhoneString()), + UnidentifiedAccessUtil.getAccessFor(WebRtcCallService.this, recipient), + callMessage); + return true; + } + }; + + ListenableFutureTask listenableFutureTask = new ListenableFutureTask<>(callable, null, serviceExecutor); + networkExecutor.execute(listenableFutureTask); + + return listenableFutureTask; + } + private void startCallCardActivityIfPossible() { if (Build.VERSION.SDK_INT >= 29 && !ApplicationContext.getInstance(getApplicationContext()).isAppVisible()) { return;