diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java index 022df026a..4d57962ed 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java @@ -244,8 +244,8 @@ public class MultiDeviceContactUpdateJob extends BaseJob { @Override public boolean onShouldRetry(@NonNull Exception exception) { - if (exception instanceof PushNetworkException) return true; - return false; + return exception instanceof PushNetworkException || + exception instanceof NetworkException; } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceGroupUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceGroupUpdateJob.java index 5039438f2..9643eea04 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceGroupUpdateJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceGroupUpdateJob.java @@ -30,6 +30,7 @@ import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSy import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -128,7 +129,11 @@ public class MultiDeviceGroupUpdateJob extends BaseJob { BlobProvider.getInstance().getStream(context, uri), length); } else { - Log.w(TAG, "No groups present for sync message..."); + Log.w(TAG, "No groups present for sync message. Sending an empty update."); + + sendUpdate(ApplicationDependencies.getSignalServiceMessageSender(), + null, + 0); } } finally { BlobProvider.getInstance().delete(context, uri); @@ -149,11 +154,17 @@ public class MultiDeviceGroupUpdateJob extends BaseJob { private void sendUpdate(SignalServiceMessageSender messageSender, InputStream stream, long length) throws IOException, UntrustedIdentityException { - SignalServiceAttachmentStream attachmentStream = SignalServiceAttachment.newStreamBuilder() - .withStream(stream) - .withContentType("application/octet-stream") - .withLength(length) - .build(); + SignalServiceAttachmentStream attachmentStream; + + if (length > 0) { + attachmentStream = SignalServiceAttachment.newStreamBuilder() + .withStream(stream) + .withContentType("application/octet-stream") + .withLength(length) + .build(); + } else { + attachmentStream = SignalServiceAttachment.emptyStream("application/octet-stream"); + } messageSender.sendMessage(SignalServiceSyncMessage.forGroups(attachmentStream), UnidentifiedAccessUtil.getAccessForSync(context)); 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 6c5bbb1ed..4c6002bf4 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 @@ -869,6 +869,7 @@ public class SignalServiceMessageSender { private byte[] createMultiDeviceGroupsContent(SignalServiceAttachmentStream groups) throws IOException { Content.Builder container = Content.newBuilder(); SyncMessage.Builder builder = createSyncMessageBuilder(); + builder.setGroups(SyncMessage.Groups.newBuilder() .setBlob(createAttachmentPointer(groups))); diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceAttachment.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceAttachment.java index 9b155d14b..cbee8d782 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceAttachment.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/SignalServiceAttachment.java @@ -10,6 +10,7 @@ import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.internal.push.http.CancelationSignal; import org.whispersystems.signalservice.internal.push.http.ResumableUploadSpec; +import java.io.ByteArrayInputStream; import java.io.InputStream; public abstract class SignalServiceAttachment { @@ -39,6 +40,10 @@ public abstract class SignalServiceAttachment { return new Builder(); } + public static SignalServiceAttachmentStream emptyStream(String contentType) { + return new SignalServiceAttachmentStream(new ByteArrayInputStream(new byte[0]), contentType, 0, Optional.absent(), false, false, null, null); + } + public static class Builder { private InputStream inputStream;