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 081ac2da8..f1d4429c7 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 @@ -5,6 +5,7 @@ import static org.thoughtcrime.securesms.events.WebRtcViewModel.State.CALL_INCOM import static org.thoughtcrime.securesms.events.WebRtcViewModel.State.NETWORK_FAILURE; import static org.thoughtcrime.securesms.events.WebRtcViewModel.State.NO_SUCH_USER; import static org.thoughtcrime.securesms.events.WebRtcViewModel.State.UNTRUSTED_IDENTITY; +import static org.thoughtcrime.securesms.service.webrtc.WebRtcUtil.getUrgencyFromCallUrgency; import android.app.Application; import android.content.Context; @@ -589,10 +590,10 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall. } @Override - public void onSendCallMessage(@NonNull UUID uuid, @NonNull byte[] bytes, @NonNull CallManager.CallMessageUrgency unused) { + public void onSendCallMessage(@NonNull UUID uuid, @NonNull byte[] bytes, @NonNull CallManager.CallMessageUrgency urgency) { Log.i(TAG, "onSendCallMessage():"); - OpaqueMessage opaqueMessage = new OpaqueMessage(bytes); + OpaqueMessage opaqueMessage = new OpaqueMessage(bytes, getUrgencyFromCallUrgency(urgency)); SignalServiceCallMessage callMessage = SignalServiceCallMessage.forOpaque(opaqueMessage, true, null); networkExecutor.execute(() -> { @@ -616,7 +617,7 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall. } @Override - public void onSendCallMessageToGroup(@NonNull byte[] groupIdBytes, @NonNull byte[] message, @NonNull CallManager.CallMessageUrgency unused) { + public void onSendCallMessageToGroup(@NonNull byte[] groupIdBytes, @NonNull byte[] message, @NonNull CallManager.CallMessageUrgency urgency) { Log.i(TAG, "onSendCallMessageToGroup():"); networkExecutor.execute(() -> { @@ -629,7 +630,7 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall. .filter(r -> !r.isBlocked()) .collect(Collectors.toList()))); - OpaqueMessage opaqueMessage = new OpaqueMessage(message); + OpaqueMessage opaqueMessage = new OpaqueMessage(message, getUrgencyFromCallUrgency(urgency)); SignalServiceCallMessage callMessage = SignalServiceCallMessage.forOutgoingGroupOpaque(groupId.getDecodedId(), System.currentTimeMillis(), opaqueMessage, true, null); RecipientAccessList accessList = new RecipientAccessList(recipients); diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcUtil.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcUtil.java index 989553a74..7f4901069 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcUtil.java @@ -17,6 +17,7 @@ import org.whispersystems.libsignal.ecc.Curve; import org.whispersystems.libsignal.ecc.ECPublicKey; import org.whispersystems.signalservice.api.messages.calls.HangupMessage; import org.whispersystems.signalservice.api.messages.calls.OfferMessage; +import org.whispersystems.signalservice.api.messages.calls.OpaqueMessage; /** * Calling specific helpers. @@ -64,6 +65,13 @@ public final class WebRtcUtil { } } + public static OpaqueMessage.Urgency getUrgencyFromCallUrgency(@NonNull CallManager.CallMessageUrgency urgency) { + if (urgency == CallManager.CallMessageUrgency.HANDLE_IMMEDIATELY) { + return OpaqueMessage.Urgency.HANDLE_IMMEDIATELY; + } + return OpaqueMessage.Urgency.DROPPABLE; + } + public static void enableSpeakerPhoneIfNeeded(@NonNull Context context, boolean enable) { if (!enable) { return; diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java index 9b46511df..d7dfcc5f6 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java @@ -46,6 +46,7 @@ import org.whispersystems.signalservice.api.messages.calls.AnswerMessage; import org.whispersystems.signalservice.api.messages.calls.CallingResponse; import org.whispersystems.signalservice.api.messages.calls.IceUpdateMessage; import org.whispersystems.signalservice.api.messages.calls.OfferMessage; +import org.whispersystems.signalservice.api.messages.calls.OpaqueMessage; import org.whispersystems.signalservice.api.messages.calls.SignalServiceCallMessage; import org.whispersystems.signalservice.api.messages.multidevice.BlockedListMessage; import org.whispersystems.signalservice.api.messages.multidevice.ConfigurationMessage; @@ -976,7 +977,11 @@ public class SignalServiceMessageSender { } else if (callMessage.getBusyMessage().isPresent()) { builder.setBusy(CallMessage.Busy.newBuilder().setId(callMessage.getBusyMessage().get().getId())); } else if (callMessage.getOpaqueMessage().isPresent()) { - builder.setOpaque(CallMessage.Opaque.newBuilder().setData(ByteString.copyFrom(callMessage.getOpaqueMessage().get().getOpaque()))); + OpaqueMessage opaqueMessage = callMessage.getOpaqueMessage().get(); + ByteString data = ByteString.copyFrom(opaqueMessage.getOpaque()); + CallMessage.Opaque.Urgency urgency = opaqueMessage.getUrgency().toProto(); + + builder.setOpaque(CallMessage.Opaque.newBuilder().setData(data).setUrgency(urgency)); } builder.setMultiRing(callMessage.isMultiRing()); diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceContent.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceContent.java index 9a6dad08a..da7b4f696 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceContent.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceContent.java @@ -848,7 +848,7 @@ public final class SignalServiceContent { return SignalServiceCallMessage.forBusy(new BusyMessage(busy.getId()), isMultiRing, destinationDeviceId); } else if (content.hasOpaque()) { SignalServiceProtos.CallMessage.Opaque opaque = content.getOpaque(); - return SignalServiceCallMessage.forOpaque(new OpaqueMessage(opaque.getData().toByteArray()), isMultiRing, destinationDeviceId); + return SignalServiceCallMessage.forOpaque(new OpaqueMessage(opaque.getData().toByteArray(), null), isMultiRing, destinationDeviceId); } return SignalServiceCallMessage.empty(); diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/calls/OpaqueMessage.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/calls/OpaqueMessage.java index dd108f10a..d6dab0765 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/calls/OpaqueMessage.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/calls/OpaqueMessage.java @@ -1,14 +1,34 @@ package org.whispersystems.signalservice.api.messages.calls; +import org.whispersystems.signalservice.internal.push.SignalServiceProtos; + public class OpaqueMessage { - private final byte[] opaque; + private final byte[] opaque; + private final Urgency urgency; - public OpaqueMessage(byte[] opaque) { - this.opaque = opaque; + public OpaqueMessage(byte[] opaque, Urgency urgency) { + this.opaque = opaque; + this.urgency = urgency == null ? Urgency.DROPPABLE : urgency; } public byte[] getOpaque() { return opaque; } + + public Urgency getUrgency() { + return urgency; + } + + public enum Urgency { + DROPPABLE, + HANDLE_IMMEDIATELY; + + public SignalServiceProtos.CallMessage.Opaque.Urgency toProto() { + if (this == HANDLE_IMMEDIATELY) { + return SignalServiceProtos.CallMessage.Opaque.Urgency.HANDLE_IMMEDIATELY; + } + return SignalServiceProtos.CallMessage.Opaque.Urgency.DROPPABLE; + } + } } diff --git a/libsignal/service/src/main/proto/SignalService.proto b/libsignal/service/src/main/proto/SignalService.proto index 9f571db20..715c752a8 100644 --- a/libsignal/service/src/main/proto/SignalService.proto +++ b/libsignal/service/src/main/proto/SignalService.proto @@ -97,8 +97,13 @@ message CallMessage { } message Opaque { - optional bytes data = 1; - reserved /* urgency */ 2; + enum Urgency { + DROPPABLE = 0; + HANDLE_IMMEDIATELY = 1; + } + + optional bytes data = 1; + optional Urgency urgency = 2; } optional Offer offer = 1;