From fd1d2ec8fca35e67db666960f6c792252197f48f Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 16 Nov 2022 11:29:46 -0500 Subject: [PATCH] Ignore group ring requests if we are already in the call. --- .../service/webrtc/IdleActionProcessor.java | 11 ++++++++--- .../securesms/service/webrtc/SignalCallManager.java | 12 +++++++----- .../service/webrtc/WebRtcActionProcessor.java | 3 ++- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IdleActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IdleActionProcessor.java index e780b5c2e..7b030b9ca 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IdleActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/IdleActionProcessor.java @@ -5,6 +5,7 @@ import androidx.annotation.NonNull; import org.signal.core.util.logging.Log; import org.signal.ringrtc.CallException; import org.signal.ringrtc.CallManager; +import org.signal.ringrtc.PeekInfo; import org.thoughtcrime.securesms.components.webrtc.EglBaseWrapper; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.events.WebRtcViewModel; @@ -124,8 +125,8 @@ public class IdleActionProcessor extends WebRtcActionProcessor { } @Override - protected @NonNull WebRtcServiceState handleReceivedGroupCallPeekForRingingCheck(@NonNull WebRtcServiceState currentState, @NonNull GroupCallRingCheckInfo info, long deviceCount) { - Log.i(tag, "handleReceivedGroupCallPeekForRingingCheck(): recipient: " + info.getRecipientId() + " ring: " + info.getRingId() + " deviceCount: " + deviceCount); + protected @NonNull WebRtcServiceState handleReceivedGroupCallPeekForRingingCheck(@NonNull WebRtcServiceState currentState, @NonNull GroupCallRingCheckInfo info, @NonNull PeekInfo peekInfo) { + Log.i(tag, "handleReceivedGroupCallPeekForRingingCheck(): recipient: " + info.getRecipientId() + " ring: " + info.getRingId()); if (SignalDatabase.groupCallRings().isCancelled(info.getRingId())) { try { @@ -137,10 +138,14 @@ public class IdleActionProcessor extends WebRtcActionProcessor { return currentState; } - if (deviceCount == 0) { + if (peekInfo.getDeviceCount() == 0) { Log.i(TAG, "No one in the group call, mark as expired and do not ring"); SignalDatabase.groupCallRings().insertOrUpdateGroupRing(info.getRingId(), System.currentTimeMillis(), CallManager.RingUpdate.EXPIRED_REQUEST); return currentState; + } else if (peekInfo.getJoinedMembers().contains(Recipient.self().requireServiceId().uuid())) { + Log.i(TAG, "We are already in the call, mark accepted on another device and do not ring"); + SignalDatabase.groupCallRings().insertOrUpdateGroupRing(info.getRingId(), System.currentTimeMillis(), CallManager.RingUpdate.ACCEPTED_ON_ANOTHER_DEVICE); + return currentState; } currentState = currentState.builder() diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java index 89a7e5e34..447dcf3b4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/SignalCallManager.java @@ -25,6 +25,7 @@ import org.signal.ringrtc.CallManager; import org.signal.ringrtc.GroupCall; import org.signal.ringrtc.HttpHeader; import org.signal.ringrtc.NetworkRoute; +import org.signal.ringrtc.PeekInfo; import org.signal.ringrtc.Remote; import org.signal.storageservice.protos.groups.GroupExternalCredential; import org.thoughtcrime.securesms.WebRtcCallActivity; @@ -300,8 +301,8 @@ private void processStateless(@NonNull Function1 p.handleSetRingGroup(s, ringGroup)); } - private void receivedGroupCallPeekForRingingCheck(@NonNull GroupCallRingCheckInfo groupCallRingCheckInfo, long deviceCount) { - process((s, p) -> p.handleReceivedGroupCallPeekForRingingCheck(s, groupCallRingCheckInfo, deviceCount)); + private void receivedGroupCallPeekForRingingCheck(@NonNull GroupCallRingCheckInfo groupCallRingCheckInfo, @NonNull PeekInfo peekInfo) { + process((s, p) -> p.handleReceivedGroupCallPeekForRingingCheck(s, groupCallRingCheckInfo, peekInfo)); } public void onAudioDeviceChanged(@NonNull SignalAudioManager.AudioDevice activeDevice, @NonNull Set availableDevices) { @@ -379,9 +380,10 @@ private void processStateless(@NonNull Function1 new GroupCall.GroupMemberInfo(entry.getKey(), entry.getValue().serialize())) .collect(Collectors.toList()); - callManager.peekGroupCall(SignalStore.internalValues().groupCallingServer(), credential.getTokenBytes().toByteArray(), members, peekInfo -> { - receivedGroupCallPeekForRingingCheck(info, peekInfo.getDeviceCount()); - }); + callManager.peekGroupCall(SignalStore.internalValues().groupCallingServer(), + credential.getTokenBytes().toByteArray(), + members, + peekInfo -> receivedGroupCallPeekForRingingCheck(info, peekInfo)); } catch (IOException | VerificationFailedException | CallException e) { Log.e(TAG, "error peeking for ringing check", e); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java index e9f46dec6..902bbbcfc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java @@ -17,6 +17,7 @@ import org.signal.ringrtc.CallManager; import org.signal.ringrtc.CallManager.RingUpdate; import org.signal.ringrtc.GroupCall; import org.signal.ringrtc.NetworkRoute; +import org.signal.ringrtc.PeekInfo; import org.thoughtcrime.securesms.components.sensors.Orientation; import org.thoughtcrime.securesms.components.webrtc.BroadcastVideoSink; import org.thoughtcrime.securesms.components.webrtc.EglBaseWrapper; @@ -810,7 +811,7 @@ public abstract class WebRtcActionProcessor { return currentState; } - protected @NonNull WebRtcServiceState handleReceivedGroupCallPeekForRingingCheck(@NonNull WebRtcServiceState currentState, @NonNull GroupCallRingCheckInfo info, long deviceCount) { + protected @NonNull WebRtcServiceState handleReceivedGroupCallPeekForRingingCheck(@NonNull WebRtcServiceState currentState, @NonNull GroupCallRingCheckInfo info, @NonNull PeekInfo peekInfo) { Log.i(tag, "handleReceivedGroupCallPeekForRingingCheck not processed"); return currentState;