use of org.thoughtcrime.securesms.jobmanager.Job in project Signal-Android by WhisperSystems.
the class MessageSender method sendMediaBroadcast.
public static void sendMediaBroadcast(@NonNull Context context, @NonNull List<OutgoingSecureMediaMessage> messages, @NonNull Collection<PreUploadResult> preUploadResults) {
Log.i(TAG, "Sending media broadcast to " + Stream.of(messages).map(m -> m.getRecipient().getId()).toList());
Preconditions.checkArgument(messages.size() > 0, "No messages!");
Preconditions.checkArgument(Stream.of(messages).allMatch(m -> m.getAttachments().isEmpty()), "Messages can't have attachments! They should be pre-uploaded.");
JobManager jobManager = ApplicationDependencies.getJobManager();
AttachmentDatabase attachmentDatabase = SignalDatabase.attachments();
MessageDatabase mmsDatabase = SignalDatabase.mms();
ThreadDatabase threadDatabase = SignalDatabase.threads();
List<AttachmentId> preUploadAttachmentIds = Stream.of(preUploadResults).map(PreUploadResult::getAttachmentId).toList();
List<String> preUploadJobIds = Stream.of(preUploadResults).map(PreUploadResult::getJobIds).flatMap(Stream::of).toList();
List<Long> messageIds = new ArrayList<>(messages.size());
List<String> messageDependsOnIds = new ArrayList<>(preUploadJobIds);
mmsDatabase.beginTransaction();
try {
OutgoingSecureMediaMessage primaryMessage = messages.get(0);
long primaryThreadId = threadDatabase.getOrCreateThreadIdFor(primaryMessage.getRecipient(), primaryMessage.getDistributionType());
long primaryMessageId = mmsDatabase.insertMessageOutbox(applyUniversalExpireTimerIfNecessary(context, primaryMessage.getRecipient(), primaryMessage, primaryThreadId), primaryThreadId, false, null);
attachmentDatabase.updateMessageId(preUploadAttachmentIds, primaryMessageId);
messageIds.add(primaryMessageId);
if (messages.size() > 0) {
List<OutgoingSecureMediaMessage> secondaryMessages = messages.subList(1, messages.size());
List<List<AttachmentId>> attachmentCopies = new ArrayList<>();
List<DatabaseAttachment> preUploadAttachments = Stream.of(preUploadAttachmentIds).map(attachmentDatabase::getAttachment).toList();
for (int i = 0; i < preUploadAttachmentIds.size(); i++) {
attachmentCopies.add(new ArrayList<>(messages.size()));
}
for (OutgoingSecureMediaMessage secondaryMessage : secondaryMessages) {
long allocatedThreadId = threadDatabase.getOrCreateThreadIdFor(secondaryMessage.getRecipient(), secondaryMessage.getDistributionType());
long messageId = mmsDatabase.insertMessageOutbox(applyUniversalExpireTimerIfNecessary(context, secondaryMessage.getRecipient(), secondaryMessage, allocatedThreadId), allocatedThreadId, false, null);
List<AttachmentId> attachmentIds = new ArrayList<>(preUploadAttachmentIds.size());
for (int i = 0; i < preUploadAttachments.size(); i++) {
AttachmentId attachmentId = attachmentDatabase.insertAttachmentForPreUpload(preUploadAttachments.get(i)).getAttachmentId();
attachmentCopies.get(i).add(attachmentId);
attachmentIds.add(attachmentId);
}
attachmentDatabase.updateMessageId(attachmentIds, messageId);
messageIds.add(messageId);
}
for (int i = 0; i < attachmentCopies.size(); i++) {
Job copyJob = new AttachmentCopyJob(preUploadAttachmentIds.get(i), attachmentCopies.get(i));
jobManager.add(copyJob, preUploadJobIds);
messageDependsOnIds.add(copyJob.getId());
}
}
for (int i = 0; i < messageIds.size(); i++) {
long messageId = messageIds.get(i);
OutgoingSecureMediaMessage message = messages.get(i);
Recipient recipient = message.getRecipient();
if (isLocalSelfSend(context, recipient, false)) {
sendLocalMediaSelf(context, messageId);
} else if (isGroupPushSend(recipient)) {
jobManager.add(new PushGroupSendJob(messageId, recipient.getId(), null, true), messageDependsOnIds, recipient.getId().toQueueKey());
} else {
jobManager.add(new PushMediaSendJob(messageId, recipient, true), messageDependsOnIds, recipient.getId().toQueueKey());
}
}
onMessageSent();
mmsDatabase.setTransactionSuccessful();
} catch (MmsException e) {
Log.w(TAG, "Failed to send messages.", e);
} finally {
mmsDatabase.endTransaction();
}
}
use of org.thoughtcrime.securesms.jobmanager.Job in project Signal-Android by WhisperSystems.
the class PaymentSendJob method enqueuePayment.
/**
* @param totalFee Total quoted totalFee to the user. This is expected to cover all defrags and the actual transaction.
*/
@AnyThread
@NonNull
public static UUID enqueuePayment(@Nullable RecipientId recipientId, @NonNull MobileCoinPublicAddress publicAddress, @NonNull String note, @NonNull Money amount, @NonNull Money totalFee) {
UUID uuid = UUID.randomUUID();
long timestamp = System.currentTimeMillis();
Job sendJob = new PaymentSendJob(new Parameters.Builder().setQueue(QUEUE).setMaxAttempts(1).build(), uuid, timestamp, recipientId, Objects.requireNonNull(publicAddress), note, amount, totalFee);
JobManager.Chain chain = ApplicationDependencies.getJobManager().startChain(sendJob).then(new PaymentTransactionCheckJob(uuid, QUEUE)).then(new MultiDeviceOutgoingPaymentSyncJob(uuid));
if (recipientId != null) {
chain.then(new PaymentNotificationSendJob(recipientId, uuid, recipientId.toQueueKey(true)));
}
chain.then(PaymentLedgerUpdateJob.updateLedgerToReflectPayment(uuid)).enqueue();
return uuid;
}
use of org.thoughtcrime.securesms.jobmanager.Job in project Signal-Android by WhisperSystems.
the class MessageSender method preUploadPushAttachment.
/**
* @return A result if the attachment was enqueued, or null if it failed to enqueue or shouldn't
* be enqueued (like in the case of a local self-send).
*/
@Nullable
public static PreUploadResult preUploadPushAttachment(@NonNull Context context, @NonNull Attachment attachment, @Nullable Recipient recipient) {
if (isLocalSelfSend(context, recipient, false)) {
return null;
}
Log.i(TAG, "Pre-uploading attachment for " + (recipient != null ? recipient.getId() : "null"));
try {
AttachmentDatabase attachmentDatabase = SignalDatabase.attachments();
DatabaseAttachment databaseAttachment = attachmentDatabase.insertAttachmentForPreUpload(attachment);
Job compressionJob = AttachmentCompressionJob.fromAttachment(databaseAttachment, false, -1);
Job resumableUploadSpecJob = new ResumableUploadSpecJob();
Job uploadJob = new AttachmentUploadJob(databaseAttachment.getAttachmentId());
ApplicationDependencies.getJobManager().startChain(compressionJob).then(resumableUploadSpecJob).then(uploadJob).enqueue();
return new PreUploadResult(databaseAttachment.getAttachmentId(), Arrays.asList(compressionJob.getId(), resumableUploadSpecJob.getId(), uploadJob.getId()));
} catch (MmsException e) {
Log.w(TAG, "preUploadPushAttachment() - Failed to upload!", e);
return null;
}
}
use of org.thoughtcrime.securesms.jobmanager.Job in project Signal-Android by WhisperSystems.
the class GroupsV1MigrationRepository method getMigrationState.
@WorkerThread
private MigrationState getMigrationState(@NonNull RecipientId groupRecipientId) {
Recipient group = Recipient.resolved(groupRecipientId);
if (!group.isPushV1Group()) {
return new MigrationState(Collections.emptyList(), Collections.emptyList());
}
Set<RecipientId> needsRefresh = Stream.of(group.getParticipants()).filter(r -> r.getGroupsV2Capability() != Recipient.Capability.SUPPORTED || r.getGroupsV1MigrationCapability() != Recipient.Capability.SUPPORTED).map(Recipient::getId).collect(Collectors.toSet());
List<Job> jobs = RetrieveProfileJob.forRecipients(needsRefresh);
for (Job job : jobs) {
if (!ApplicationDependencies.getJobManager().runSynchronously(job, TimeUnit.SECONDS.toMillis(3)).isPresent()) {
Log.w(TAG, "Failed to refresh capabilities in time!");
}
}
try {
List<Recipient> registered = Stream.of(group.getParticipants()).filter(Recipient::isRegistered).toList();
RecipientUtil.ensureUuidsAreAvailable(ApplicationDependencies.getApplication(), registered);
} catch (IOException e) {
Log.w(TAG, "Failed to refresh UUIDs!", e);
}
group = group.fresh();
List<Recipient> ineligible = Stream.of(group.getParticipants()).filter(r -> !r.hasServiceId() || r.getGroupsV2Capability() != Recipient.Capability.SUPPORTED || r.getGroupsV1MigrationCapability() != Recipient.Capability.SUPPORTED || r.getRegistered() != RecipientDatabase.RegisteredState.REGISTERED).toList();
List<Recipient> invites = Stream.of(group.getParticipants()).filterNot(ineligible::contains).filterNot(Recipient::isSelf).filter(r -> r.getProfileKey() == null).toList();
return new MigrationState(invites, ineligible);
}
use of org.thoughtcrime.securesms.jobmanager.Job in project Signal-Android by signalapp.
the class GroupsV1MigrationRepository method getMigrationState.
@WorkerThread
private MigrationState getMigrationState(@NonNull RecipientId groupRecipientId) {
Recipient group = Recipient.resolved(groupRecipientId);
if (!group.isPushV1Group()) {
return new MigrationState(Collections.emptyList(), Collections.emptyList());
}
Set<RecipientId> needsRefresh = Stream.of(group.getParticipants()).filter(r -> r.getGroupsV2Capability() != Recipient.Capability.SUPPORTED || r.getGroupsV1MigrationCapability() != Recipient.Capability.SUPPORTED).map(Recipient::getId).collect(Collectors.toSet());
List<Job> jobs = RetrieveProfileJob.forRecipients(needsRefresh);
for (Job job : jobs) {
if (!ApplicationDependencies.getJobManager().runSynchronously(job, TimeUnit.SECONDS.toMillis(3)).isPresent()) {
Log.w(TAG, "Failed to refresh capabilities in time!");
}
}
try {
List<Recipient> registered = Stream.of(group.getParticipants()).filter(Recipient::isRegistered).toList();
RecipientUtil.ensureUuidsAreAvailable(ApplicationDependencies.getApplication(), registered);
} catch (IOException e) {
Log.w(TAG, "Failed to refresh UUIDs!", e);
}
group = group.fresh();
List<Recipient> ineligible = Stream.of(group.getParticipants()).filter(r -> !r.hasServiceId() || r.getGroupsV2Capability() != Recipient.Capability.SUPPORTED || r.getGroupsV1MigrationCapability() != Recipient.Capability.SUPPORTED || r.getRegistered() != RecipientDatabase.RegisteredState.REGISTERED).toList();
List<Recipient> invites = Stream.of(group.getParticipants()).filterNot(ineligible::contains).filterNot(Recipient::isSelf).filter(r -> r.getProfileKey() == null).toList();
return new MigrationState(invites, ineligible);
}
Aggregations