Refactor attachment upload helpers

This commit is contained in:
AsamK 2022-05-25 22:31:15 +02:00
parent b292de8ae6
commit 0f701df91f
5 changed files with 33 additions and 28 deletions

View file

@ -590,7 +590,7 @@ class ManagerImpl implements Manager {
stickerPack.getPackKey(),
stickerId,
manifestSticker.emoji(),
AttachmentUtils.createAttachment(streamDetails, Optional.empty())));
AttachmentUtils.createAttachmentStream(streamDetails, Optional.empty())));
}
}

View file

@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory;
import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer;
import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentRemoteId;
import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream;
import org.whispersystems.signalservice.api.push.exceptions.MissingConfigurationException;
import java.io.File;
@ -39,21 +40,26 @@ public class AttachmentHelper {
}
public List<SignalServiceAttachment> uploadAttachments(final List<String> attachments) throws AttachmentInvalidException, IOException {
var attachmentStreams = AttachmentUtils.getSignalServiceAttachments(attachments);
var attachmentStreams = AttachmentUtils.createAttachmentStreams(attachments);
// Upload attachments here, so we only upload once even for multiple recipients
var messageSender = dependencies.getMessageSender();
var attachmentPointers = new ArrayList<SignalServiceAttachment>(attachmentStreams.size());
for (var attachment : attachmentStreams) {
if (attachment.isStream()) {
attachmentPointers.add(messageSender.uploadAttachment(attachment.asStream()));
} else if (attachment.isPointer()) {
attachmentPointers.add(attachment.asPointer());
}
for (var attachmentStream : attachmentStreams) {
attachmentPointers.add(uploadAttachment(attachmentStream));
}
return attachmentPointers;
}
public SignalServiceAttachmentPointer uploadAttachment(String attachment) throws IOException, AttachmentInvalidException {
var attachmentStream = AttachmentUtils.createAttachmentStream(new File(attachment));
return uploadAttachment(attachmentStream);
}
public SignalServiceAttachmentPointer uploadAttachment(SignalServiceAttachmentStream attachment) throws IOException {
var messageSender = dependencies.getMessageSender();
return messageSender.uploadAttachment(attachment);
}
public void downloadAttachment(final SignalServiceAttachment attachment) {
if (!attachment.isPointer()) {
logger.warn("Invalid state, can't store an attachment stream.");

View file

@ -98,7 +98,7 @@ public class GroupHelper {
return Optional.empty();
}
return Optional.of(AttachmentUtils.createAttachment(streamDetails, Optional.empty()));
return Optional.of(AttachmentUtils.createAttachmentStream(streamDetails, Optional.empty()));
}
public GroupInfoV2 getOrMigrateGroup(

View file

@ -302,7 +302,7 @@ public class SyncHelper {
return Optional.empty();
}
return Optional.of(AttachmentUtils.createAttachment(streamDetails, Optional.empty()));
return Optional.of(AttachmentUtils.createAttachmentStream(streamDetails, Optional.empty()));
}
private void downloadContactAvatar(SignalServiceAttachment avatar, RecipientAddress address) {

View file

@ -1,7 +1,6 @@
package org.asamk.signal.manager.util;
import org.asamk.signal.manager.api.AttachmentInvalidException;
import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream;
import org.whispersystems.signalservice.api.util.StreamDetails;
import org.whispersystems.signalservice.internal.push.http.ResumableUploadSpec;
@ -14,30 +13,30 @@ import java.util.Optional;
public class AttachmentUtils {
public static List<SignalServiceAttachment> getSignalServiceAttachments(List<String> attachments) throws AttachmentInvalidException {
List<SignalServiceAttachment> signalServiceAttachments = null;
if (attachments != null) {
signalServiceAttachments = new ArrayList<>(attachments.size());
public static List<SignalServiceAttachmentStream> createAttachmentStreams(List<String> attachments) throws AttachmentInvalidException {
if (attachments == null) {
return null;
}
final var signalServiceAttachments = new ArrayList<SignalServiceAttachmentStream>(attachments.size());
for (var attachment : attachments) {
try {
signalServiceAttachments.add(createAttachment(new File(attachment)));
} catch (IOException e) {
throw new AttachmentInvalidException(attachment, e);
}
}
signalServiceAttachments.add(createAttachmentStream(new File(attachment)));
}
return signalServiceAttachments;
}
public static SignalServiceAttachmentStream createAttachment(File attachmentFile) throws IOException {
public static SignalServiceAttachmentStream createAttachmentStream(File attachmentFile) throws AttachmentInvalidException {
try {
final var streamDetails = Utils.createStreamDetailsFromFile(attachmentFile);
return createAttachment(streamDetails, Optional.of(attachmentFile.getName()));
return createAttachmentStream(streamDetails, Optional.of(attachmentFile.getName()));
} catch (IOException e) {
throw new AttachmentInvalidException(attachmentFile.toString(), e);
}
}
public static SignalServiceAttachmentStream createAttachment(
public static SignalServiceAttachmentStream createAttachmentStream(
StreamDetails streamDetails, Optional<String> name
) {
// TODO mabybe add a parameter to set the voiceNote, borderless, preview, width, height and caption option
// TODO maybe add a parameter to set the voiceNote, borderless, preview, width, height and caption option
final var uploadTimestamp = System.currentTimeMillis();
Optional<byte[]> preview = Optional.empty();
Optional<String> caption = Optional.empty();