use of org.whispersystems.signalservice.api.messages.calls.OpaqueMessage in project Signal-Android by WhisperSystems.
the class SignalServiceContent method createCallMessage.
private static SignalServiceCallMessage createCallMessage(SignalServiceProtos.CallMessage content) {
boolean isMultiRing = content.getMultiRing();
Integer destinationDeviceId = content.hasDestinationDeviceId() ? content.getDestinationDeviceId() : null;
if (content.hasOffer()) {
SignalServiceProtos.CallMessage.Offer offerContent = content.getOffer();
return SignalServiceCallMessage.forOffer(new OfferMessage(offerContent.getId(), offerContent.hasSdp() ? offerContent.getSdp() : null, OfferMessage.Type.fromProto(offerContent.getType()), offerContent.hasOpaque() ? offerContent.getOpaque().toByteArray() : null), isMultiRing, destinationDeviceId);
} else if (content.hasAnswer()) {
SignalServiceProtos.CallMessage.Answer answerContent = content.getAnswer();
return SignalServiceCallMessage.forAnswer(new AnswerMessage(answerContent.getId(), answerContent.hasSdp() ? answerContent.getSdp() : null, answerContent.hasOpaque() ? answerContent.getOpaque().toByteArray() : null), isMultiRing, destinationDeviceId);
} else if (content.getIceUpdateCount() > 0) {
List<IceUpdateMessage> iceUpdates = new LinkedList<>();
for (SignalServiceProtos.CallMessage.IceUpdate iceUpdate : content.getIceUpdateList()) {
iceUpdates.add(new IceUpdateMessage(iceUpdate.getId(), iceUpdate.hasOpaque() ? iceUpdate.getOpaque().toByteArray() : null, iceUpdate.hasSdp() ? iceUpdate.getSdp() : null));
}
return SignalServiceCallMessage.forIceUpdates(iceUpdates, isMultiRing, destinationDeviceId);
} else if (content.hasLegacyHangup()) {
SignalServiceProtos.CallMessage.Hangup hangup = content.getLegacyHangup();
return SignalServiceCallMessage.forHangup(new HangupMessage(hangup.getId(), HangupMessage.Type.fromProto(hangup.getType()), hangup.getDeviceId(), content.hasLegacyHangup()), isMultiRing, destinationDeviceId);
} else if (content.hasHangup()) {
SignalServiceProtos.CallMessage.Hangup hangup = content.getHangup();
return SignalServiceCallMessage.forHangup(new HangupMessage(hangup.getId(), HangupMessage.Type.fromProto(hangup.getType()), hangup.getDeviceId(), content.hasLegacyHangup()), isMultiRing, destinationDeviceId);
} else if (content.hasBusy()) {
SignalServiceProtos.CallMessage.Busy busy = content.getBusy();
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(), null), isMultiRing, destinationDeviceId);
}
return SignalServiceCallMessage.empty();
}
use of org.whispersystems.signalservice.api.messages.calls.OpaqueMessage in project Signal-Android by WhisperSystems.
the class SignalCallManager method onSendCallMessageToGroup.
@Override
public void onSendCallMessageToGroup(@NonNull byte[] groupIdBytes, @NonNull byte[] message, @NonNull CallManager.CallMessageUrgency urgency) {
Log.i(TAG, "onSendCallMessageToGroup():");
networkExecutor.execute(() -> {
try {
GroupId groupId = GroupId.v2(new GroupIdentifier(groupIdBytes));
List<Recipient> recipients = SignalDatabase.groups().getGroupMembers(groupId, GroupDatabase.MemberSet.FULL_MEMBERS_EXCLUDING_SELF);
recipients = RecipientUtil.getEligibleForSending((recipients.stream().map(Recipient::resolve).filter(r -> !r.isBlocked()).collect(Collectors.toList())));
OpaqueMessage opaqueMessage = new OpaqueMessage(message, getUrgencyFromCallUrgency(urgency));
SignalServiceCallMessage callMessage = SignalServiceCallMessage.forOutgoingGroupOpaque(groupId.getDecodedId(), System.currentTimeMillis(), opaqueMessage, true, null);
RecipientAccessList accessList = new RecipientAccessList(recipients);
List<SendMessageResult> results = GroupSendUtil.sendCallMessage(context, groupId.requireV2(), recipients, callMessage);
Set<RecipientId> identifyFailureRecipientIds = results.stream().filter(result -> result.getIdentityFailure() != null).map(result -> accessList.requireIdByAddress(result.getAddress())).collect(Collectors.toSet());
if (Util.hasItems(identifyFailureRecipientIds)) {
process((s, p) -> p.handleGroupMessageSentError(s, identifyFailureRecipientIds, UNTRUSTED_IDENTITY));
RetrieveProfileJob.enqueue(identifyFailureRecipientIds);
}
} catch (UntrustedIdentityException | IOException | InvalidInputException e) {
Log.w(TAG, "onSendCallMessageToGroup failed", e);
}
});
}
use of org.whispersystems.signalservice.api.messages.calls.OpaqueMessage in project Signal-Android by WhisperSystems.
the class SignalCallManager method onSendCallMessage.
@Override
public void onSendCallMessage(@NonNull UUID uuid, @NonNull byte[] bytes, @NonNull CallManager.CallMessageUrgency urgency) {
Log.i(TAG, "onSendCallMessage():");
OpaqueMessage opaqueMessage = new OpaqueMessage(bytes, getUrgencyFromCallUrgency(urgency));
SignalServiceCallMessage callMessage = SignalServiceCallMessage.forOpaque(opaqueMessage, true, null);
networkExecutor.execute(() -> {
Recipient recipient = Recipient.resolved(RecipientId.from(ACI.from(uuid), null));
if (recipient.isBlocked()) {
return;
}
try {
messageSender.sendCallMessage(RecipientUtil.toSignalServiceAddress(context, recipient), recipient.isSelf() ? Optional.absent() : UnidentifiedAccessUtil.getAccessFor(context, recipient), callMessage);
} catch (UntrustedIdentityException e) {
Log.i(TAG, "sendOpaqueCallMessage onFailure: ", e);
RetrieveProfileJob.enqueue(recipient.getId());
process((s, p) -> p.handleGroupMessageSentError(s, Collections.singletonList(recipient.getId()), UNTRUSTED_IDENTITY));
} catch (IOException e) {
Log.i(TAG, "sendOpaqueCallMessage onFailure: ", e);
process((s, p) -> p.handleGroupMessageSentError(s, Collections.singletonList(recipient.getId()), NETWORK_FAILURE));
}
});
}
use of org.whispersystems.signalservice.api.messages.calls.OpaqueMessage in project Signal-Android by WhisperSystems.
the class SignalServiceMessageSender method createCallContent.
private Content createCallContent(SignalServiceCallMessage callMessage) {
Content.Builder container = Content.newBuilder();
CallMessage.Builder builder = CallMessage.newBuilder();
if (callMessage.getOfferMessage().isPresent()) {
OfferMessage offer = callMessage.getOfferMessage().get();
CallMessage.Offer.Builder offerBuilder = CallMessage.Offer.newBuilder().setId(offer.getId()).setType(offer.getType().getProtoType());
if (offer.getOpaque() != null) {
offerBuilder.setOpaque(ByteString.copyFrom(offer.getOpaque()));
}
if (offer.getSdp() != null) {
offerBuilder.setSdp(offer.getSdp());
}
builder.setOffer(offerBuilder);
} else if (callMessage.getAnswerMessage().isPresent()) {
AnswerMessage answer = callMessage.getAnswerMessage().get();
CallMessage.Answer.Builder answerBuilder = CallMessage.Answer.newBuilder().setId(answer.getId());
if (answer.getOpaque() != null) {
answerBuilder.setOpaque(ByteString.copyFrom(answer.getOpaque()));
}
if (answer.getSdp() != null) {
answerBuilder.setSdp(answer.getSdp());
}
builder.setAnswer(answerBuilder);
} else if (callMessage.getIceUpdateMessages().isPresent()) {
List<IceUpdateMessage> updates = callMessage.getIceUpdateMessages().get();
for (IceUpdateMessage update : updates) {
CallMessage.IceUpdate.Builder iceBuilder = CallMessage.IceUpdate.newBuilder().setId(update.getId()).setMid("audio").setLine(0);
if (update.getOpaque() != null) {
iceBuilder.setOpaque(ByteString.copyFrom(update.getOpaque()));
}
if (update.getSdp() != null) {
iceBuilder.setSdp(update.getSdp());
}
builder.addIceUpdate(iceBuilder);
}
} else if (callMessage.getHangupMessage().isPresent()) {
CallMessage.Hangup.Type protoType = callMessage.getHangupMessage().get().getType().getProtoType();
CallMessage.Hangup.Builder builderForHangup = CallMessage.Hangup.newBuilder().setType(protoType).setId(callMessage.getHangupMessage().get().getId());
if (protoType != CallMessage.Hangup.Type.HANGUP_NORMAL) {
builderForHangup.setDeviceId(callMessage.getHangupMessage().get().getDeviceId());
}
if (callMessage.getHangupMessage().get().isLegacy()) {
builder.setLegacyHangup(builderForHangup);
} else {
builder.setHangup(builderForHangup);
}
} else if (callMessage.getBusyMessage().isPresent()) {
builder.setBusy(CallMessage.Busy.newBuilder().setId(callMessage.getBusyMessage().get().getId()));
} else if (callMessage.getOpaqueMessage().isPresent()) {
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());
if (callMessage.getDestinationDeviceId().isPresent()) {
builder.setDestinationDeviceId(callMessage.getDestinationDeviceId().get());
}
container.setCallMessage(builder);
return container.build();
}
use of org.whispersystems.signalservice.api.messages.calls.OpaqueMessage in project Signal-Android by signalapp.
the class SignalServiceMessageSender method createCallContent.
private Content createCallContent(SignalServiceCallMessage callMessage) {
Content.Builder container = Content.newBuilder();
CallMessage.Builder builder = CallMessage.newBuilder();
if (callMessage.getOfferMessage().isPresent()) {
OfferMessage offer = callMessage.getOfferMessage().get();
CallMessage.Offer.Builder offerBuilder = CallMessage.Offer.newBuilder().setId(offer.getId()).setType(offer.getType().getProtoType());
if (offer.getOpaque() != null) {
offerBuilder.setOpaque(ByteString.copyFrom(offer.getOpaque()));
}
if (offer.getSdp() != null) {
offerBuilder.setSdp(offer.getSdp());
}
builder.setOffer(offerBuilder);
} else if (callMessage.getAnswerMessage().isPresent()) {
AnswerMessage answer = callMessage.getAnswerMessage().get();
CallMessage.Answer.Builder answerBuilder = CallMessage.Answer.newBuilder().setId(answer.getId());
if (answer.getOpaque() != null) {
answerBuilder.setOpaque(ByteString.copyFrom(answer.getOpaque()));
}
if (answer.getSdp() != null) {
answerBuilder.setSdp(answer.getSdp());
}
builder.setAnswer(answerBuilder);
} else if (callMessage.getIceUpdateMessages().isPresent()) {
List<IceUpdateMessage> updates = callMessage.getIceUpdateMessages().get();
for (IceUpdateMessage update : updates) {
CallMessage.IceUpdate.Builder iceBuilder = CallMessage.IceUpdate.newBuilder().setId(update.getId()).setMid("audio").setLine(0);
if (update.getOpaque() != null) {
iceBuilder.setOpaque(ByteString.copyFrom(update.getOpaque()));
}
if (update.getSdp() != null) {
iceBuilder.setSdp(update.getSdp());
}
builder.addIceUpdate(iceBuilder);
}
} else if (callMessage.getHangupMessage().isPresent()) {
CallMessage.Hangup.Type protoType = callMessage.getHangupMessage().get().getType().getProtoType();
CallMessage.Hangup.Builder builderForHangup = CallMessage.Hangup.newBuilder().setType(protoType).setId(callMessage.getHangupMessage().get().getId());
if (protoType != CallMessage.Hangup.Type.HANGUP_NORMAL) {
builderForHangup.setDeviceId(callMessage.getHangupMessage().get().getDeviceId());
}
if (callMessage.getHangupMessage().get().isLegacy()) {
builder.setLegacyHangup(builderForHangup);
} else {
builder.setHangup(builderForHangup);
}
} else if (callMessage.getBusyMessage().isPresent()) {
builder.setBusy(CallMessage.Busy.newBuilder().setId(callMessage.getBusyMessage().get().getId()));
} else if (callMessage.getOpaqueMessage().isPresent()) {
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());
if (callMessage.getDestinationDeviceId().isPresent()) {
builder.setDestinationDeviceId(callMessage.getDestinationDeviceId().get());
}
container.setCallMessage(builder);
return container.build();
}
Aggregations