From 2209ff2272413a5a5db5b92bbefd3f97f88f3fb2 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 15 Jan 2019 12:43:38 -0800 Subject: [PATCH] Use AttachmentUploadJob in PushGroupSendJob. --- .../securesms/jobs/PushGroupSendJob.java | 54 +++++++++++++------ .../securesms/jobs/PushSendJob.java | 2 +- .../securesms/sms/MessageSender.java | 2 +- 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java b/src/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java index ae77be102e..44f8f05e87 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java @@ -3,12 +3,14 @@ package org.thoughtcrime.securesms.jobs; import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.WorkerThread; import com.annimon.stream.Collectors; import com.annimon.stream.Stream; import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.attachments.Attachment; +import org.thoughtcrime.securesms.attachments.DatabaseAttachment; import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil; import org.thoughtcrime.securesms.database.Address; import org.thoughtcrime.securesms.database.DatabaseFactory; @@ -18,8 +20,11 @@ import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; import org.thoughtcrime.securesms.database.documents.NetworkFailure; import org.thoughtcrime.securesms.dependencies.InjectableType; +import org.thoughtcrime.securesms.jobmanager.ChainParameters; +import org.thoughtcrime.securesms.jobmanager.JobManager; import org.thoughtcrime.securesms.jobmanager.JobParameters; import org.thoughtcrime.securesms.jobmanager.SafeData; +import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.mms.MediaConstraints; import org.thoughtcrime.securesms.mms.MmsException; import org.thoughtcrime.securesms.mms.OutgoingGroupMediaMessage; @@ -85,6 +90,29 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType { this.filterRecipientId = -1; } + @WorkerThread + public static void enqueue(@NonNull Context context, @NonNull JobManager jobManager, long messageId, @NonNull Address destination, @Nullable Address filterAddress) { + try { + MmsDatabase database = DatabaseFactory.getMmsDatabase(context); + OutgoingMediaMessage message = database.getOutgoingMessage(messageId); + List attachmentJobs = Stream.of(message.getAttachments()).map(a -> new AttachmentUploadJob(context, ((DatabaseAttachment) a).getAttachmentId())).toList(); + ChainParameters chainParams = new ChainParameters.Builder().setGroupId(destination.serialize()).build(); + + if (attachmentJobs.isEmpty()) { + jobManager.add(new PushGroupSendJob(context, messageId, destination, filterAddress)); + } else { + jobManager.startChain(attachmentJobs) + .then(new PushGroupSendJob(context, messageId, destination, filterAddress)) + .enqueue(chainParams); + } + + } catch (NoSuchMessageException | MmsException e) { + Log.w(TAG, "Failed to enqueue message.", e); + DatabaseFactory.getMmsDatabase(context).markAsSentFailed(messageId); + notifyMediaMessageDeliveryFailed(context, messageId); + } + } + @Override protected void initialize(@NonNull SafeData data) { messageId = data.getLong(KEY_MESSAGE_ID); @@ -175,11 +203,6 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType { database.markAsSentFailed(messageId); notifyMediaMessageDeliveryFailed(context, messageId); } - - } catch (InvalidNumberException | RecipientFormattingException | UndeliverableMessageException e) { - warn(TAG, e); - database.markAsSentFailed(messageId); - notifyMediaMessageDeliveryFailed(context, messageId); } catch (UntrustedIdentityException e) { warn(TAG, e); database.markAsSentFailed(messageId); @@ -200,19 +223,16 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType { } private List deliver(OutgoingMediaMessage message, @NonNull List
destinations) - throws IOException, RecipientFormattingException, InvalidNumberException, - UndeliverableMessageException, UntrustedIdentityException + throws IOException, UntrustedIdentityException { rotateSenderCertificateIfNecessary(); - String groupId = message.getRecipient().getAddress().toGroupString(); - Optional profileKey = getProfileKey(message.getRecipient()); - MediaConstraints mediaConstraints = MediaConstraints.getPushMediaConstraints(); - List scaledAttachments = scaleAndStripExifFromAttachments(mediaConstraints, message.getAttachments()); - List attachmentStreams = getAttachmentsFor(scaledAttachments); - Optional quote = getQuoteFor(message); - List sharedContacts = getSharedContactsFor(message); - List addresses = Stream.of(destinations).map(this::getPushAddress).toList(); + String groupId = message.getRecipient().getAddress().toGroupString(); + Optional profileKey = getProfileKey(message.getRecipient()); + List attachmentPointers = getAttachmentPointersFor(message.getAttachments()); + Optional quote = getQuoteFor(message); + List sharedContacts = getSharedContactsFor(message); + List addresses = Stream.of(destinations).map(this::getPushAddress).toList(); List> unidentifiedAccess = Stream.of(addresses) .map(address -> Address.fromSerialized(address.getNumber())) @@ -223,7 +243,7 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType { if (message.isGroup()) { OutgoingGroupMediaMessage groupMessage = (OutgoingGroupMediaMessage) message; GroupContext groupContext = groupMessage.getGroupContext(); - SignalServiceAttachment avatar = attachmentStreams.isEmpty() ? null : attachmentStreams.get(0); + SignalServiceAttachment avatar = attachmentPointers.isEmpty() ? null : attachmentPointers.get(0); SignalServiceGroup.Type type = groupMessage.isGroupQuit() ? SignalServiceGroup.Type.QUIT : SignalServiceGroup.Type.UPDATE; SignalServiceGroup group = new SignalServiceGroup(type, GroupUtil.getDecodedId(groupId), groupContext.getName(), groupContext.getMembersList(), avatar); SignalServiceDataMessage groupDataMessage = SignalServiceDataMessage.newBuilder() @@ -238,7 +258,7 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType { SignalServiceDataMessage groupMessage = SignalServiceDataMessage.newBuilder() .withTimestamp(message.getSentTimeMillis()) .asGroupMessage(group) - .withAttachments(attachmentStreams) + .withAttachments(attachmentPointers) .withBody(message.getBody()) .withExpiration((int)(message.getExpiresIn() / 1000)) .asExpirationUpdate(message.isExpirationUpdate()) diff --git a/src/org/thoughtcrime/securesms/jobs/PushSendJob.java b/src/org/thoughtcrime/securesms/jobs/PushSendJob.java index 39ee53c4bf..7014077bfd 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushSendJob.java @@ -142,7 +142,7 @@ public abstract class PushSendJob extends SendJob { return null; } - protected @Nullable List getAttachmentPointersFor(List attachments) { + protected @NonNull List getAttachmentPointersFor(List attachments) { return Stream.of(attachments).map(this::getAttachmentPointerFor).filter(a -> a != null).toList(); } diff --git a/src/org/thoughtcrime/securesms/sms/MessageSender.java b/src/org/thoughtcrime/securesms/sms/MessageSender.java index bf16b1121c..ca3a47a374 100644 --- a/src/org/thoughtcrime/securesms/sms/MessageSender.java +++ b/src/org/thoughtcrime/securesms/sms/MessageSender.java @@ -204,7 +204,7 @@ public class MessageSender { private static void sendGroupPush(Context context, Recipient recipient, long messageId, Address filterAddress) { JobManager jobManager = ApplicationContext.getInstance(context).getJobManager(); - jobManager.add(new PushGroupSendJob(context, messageId, recipient.getAddress(), filterAddress)); + PushGroupSendJob.enqueue(context, jobManager, messageId, recipient.getAddress(), filterAddress); } private static void sendSms(Context context, Recipient recipient, long messageId) {