From ab88018f366b0d3a2fd712c23f6ec2048d432b33 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 22 Jan 2025 15:15:22 -0400 Subject: [PATCH] Show dialog when group call is full. --- .../securesms/WebRtcCallActivity.java | 16 +++++++++++++++- .../securesms/events/WebRtcViewModel.kt | 2 ++ .../service/webrtc/GroupActionProcessor.java | 1 + .../service/webrtc/state/CallInfoState.kt | 4 +++- .../webrtc/state/WebRtcServiceStateBuilder.java | 5 +++++ 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java index b4628e599c..6ef7d46acf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java @@ -61,6 +61,7 @@ import org.signal.core.util.concurrent.LifecycleDisposable; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; import org.signal.libsignal.protocol.IdentityKey; +import org.signal.ringrtc.GroupCall; import org.thoughtcrime.securesms.components.TooltipPopup; import org.thoughtcrime.securesms.components.sensors.Orientation; import org.thoughtcrime.securesms.components.webrtc.CallLinkProfileKeySender; @@ -780,6 +781,13 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan } } + private void handleGroupCallHasMaxDevices(@NonNull Recipient recipient) { + new MaterialAlertDialogBuilder(this) + .setMessage(R.string.WebRtcCallView__call_is_full) + .setPositiveButton(android.R.string.ok, (d, w) -> handleTerminate(recipient, HangupMessage.Type.NORMAL)) + .show(); + } + private void handleTerminate(@NonNull Recipient recipient, @NonNull HangupMessage.Type hangupType) { Log.i(TAG, "handleTerminate called: " + hangupType.name()); @@ -964,7 +972,13 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan case CALL_RINGING: handleCallRinging(); break; case CALL_DISCONNECTED: - handleTerminate(event.getRecipient(), HangupMessage.Type.NORMAL); break; + if (event.getGroupCallEndReason() == GroupCall.GroupCallEndReason.HAS_MAX_DEVICES) { + handleGroupCallHasMaxDevices(event.getRecipient()); + } else { + handleTerminate(event.getRecipient(), HangupMessage.Type.NORMAL); + } + + break; case CALL_DISCONNECTED_GLARE: handleGlare(event.getRecipient()); break; case CALL_ACCEPTED_ELSEWHERE: diff --git a/app/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.kt index 44cc7dca80..17eb3ae65d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.kt @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.events import com.annimon.stream.OptionalLong +import org.signal.ringrtc.GroupCall.GroupCallEndReason import org.thoughtcrime.securesms.components.webrtc.BroadcastVideoSink import org.thoughtcrime.securesms.events.CallParticipant.Companion.createLocal import org.thoughtcrime.securesms.recipients.Recipient @@ -104,6 +105,7 @@ class WebRtcViewModel(state: WebRtcServiceState) { val pendingParticipants: PendingParticipantCollection = state.callInfoState.pendingParticipants val isCallLink: Boolean = state.callInfoState.callRecipient.isCallLink val callLinkDisconnectReason: CallLinkDisconnectReason? = state.callInfoState.callLinkDisconnectReason + val groupCallEndReason: GroupCallEndReason? = state.callInfoState.groupCallEndReason @get:JvmName("hasAtLeastOneRemote") val hasAtLeastOneRemote = if (state.callInfoState.callRecipient.isIndividual) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java index dcfca8f826..7bdf5103c3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupActionProcessor.java @@ -325,6 +325,7 @@ public class GroupActionProcessor extends DeviceAwareActionProcessor { .changeCallInfoState() .callState(WebRtcViewModel.State.CALL_DISCONNECTED) .groupCallState(WebRtcViewModel.GroupCallState.DISCONNECTED) + .setGroupCallEndReason(groupCallEndReason) .build(); webRtcInteractor.postStateUpdate(currentState); diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/CallInfoState.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/CallInfoState.kt index 511aa45993..ce7fe52f8d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/CallInfoState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/CallInfoState.kt @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.service.webrtc.state import com.annimon.stream.OptionalLong import org.signal.ringrtc.CallId import org.signal.ringrtc.GroupCall +import org.signal.ringrtc.GroupCall.GroupCallEndReason import org.thoughtcrime.securesms.events.CallParticipant import org.thoughtcrime.securesms.events.CallParticipantId import org.thoughtcrime.securesms.events.WebRtcViewModel @@ -30,7 +31,8 @@ data class CallInfoState( var remoteDevicesCount: OptionalLong = OptionalLong.empty(), var participantLimit: Long? = null, var pendingParticipants: PendingParticipantCollection = PendingParticipantCollection(), - var callLinkDisconnectReason: CallLinkDisconnectReason? = null + var callLinkDisconnectReason: CallLinkDisconnectReason? = null, + var groupCallEndReason: GroupCallEndReason? = null ) { val remoteCallParticipants: List diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/WebRtcServiceStateBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/WebRtcServiceStateBuilder.java index 773c21fed6..b627db4a29 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/WebRtcServiceStateBuilder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/WebRtcServiceStateBuilder.java @@ -369,5 +369,10 @@ public class WebRtcServiceStateBuilder { toBuild.setCallLinkDisconnectReason(callLinkDisconnectReason); return this; } + + public @NonNull CallInfoStateBuilder setGroupCallEndReason(@Nullable GroupCall.GroupCallEndReason groupCallEndReason) { + toBuild.setGroupCallEndReason(groupCallEndReason); + return this; + } } }