package org.thoughtcrime.securesms.jobs; import android.content.Context; import android.support.annotation.NonNull; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.TextSecureExpiredException; import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.crypto.MasterSecret; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.AttachmentDatabase; import org.thoughtcrime.securesms.mms.MediaConstraints; import org.thoughtcrime.securesms.transport.UndeliverableMessageException; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.jobqueue.JobParameters; import java.io.IOException; import java.io.InputStream; import java.util.LinkedList; import java.util.List; import ws.com.google.android.mms.MmsException; public abstract class SendJob extends MasterSecretJob { private final static String TAG = SendJob.class.getSimpleName(); public SendJob(Context context, JobParameters parameters) { super(context, parameters); } @Override public final void onRun(MasterSecret masterSecret) throws Exception { if (!Util.isBuildFresh()) { throw new TextSecureExpiredException(String.format("TextSecure expired (build %d, now %d)", BuildConfig.BUILD_TIMESTAMP, System.currentTimeMillis())); } onSend(masterSecret); } protected abstract void onSend(MasterSecret masterSecret) throws Exception; protected void markAttachmentsUploaded(long messageId, @NonNull List attachments) { AttachmentDatabase database = DatabaseFactory.getAttachmentDatabase(context); for (Attachment attachment : attachments) { database.markAttachmentUploaded(messageId, attachment); } } protected List scaleAttachments(@NonNull MasterSecret masterSecret, @NonNull MediaConstraints constraints, @NonNull List attachments) throws UndeliverableMessageException { AttachmentDatabase attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context); List results = new LinkedList<>(); for (Attachment attachment : attachments) { try { if (constraints.isSatisfied(context, masterSecret, attachment)) { results.add(attachment); } else if (constraints.canResize(attachment)) { InputStream resized = constraints.getResizedMedia(context, masterSecret, attachment); results.add(attachmentDatabase.updateAttachmentData(masterSecret, attachment, resized)); } else { throw new UndeliverableMessageException("Size constraints could not be met!"); } } catch (IOException | MmsException e) { throw new UndeliverableMessageException(e); } } return results; } }