package org.thoughtcrime.securesms.jobs; import android.content.Context; import android.support.annotation.NonNull; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.TextSecureExpiredException; import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.crypto.MasterSecret; import org.thoughtcrime.securesms.database.AttachmentDatabase; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.jobmanager.JobParameters; import org.thoughtcrime.securesms.logging.Log; import org.thoughtcrime.securesms.mms.MediaConstraints; import org.thoughtcrime.securesms.mms.MediaStream; import org.thoughtcrime.securesms.mms.MmsException; import org.thoughtcrime.securesms.transport.UndeliverableMessageException; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.Util; import java.io.IOException; import java.util.LinkedList; import java.util.List; public abstract class SendJob extends ContextJob { @SuppressWarnings("unused") private final static String TAG = SendJob.class.getSimpleName(); public SendJob(Context context, JobParameters parameters) { super(context, parameters); } @Override protected String getDescription() { return context.getString(R.string.SendJob_sending_a_message); } @Override public final void onRun() throws Exception { if (Util.getDaysTillBuildExpiry() <= 0) { throw new TextSecureExpiredException(String.format("TextSecure expired (build %d, now %d)", BuildConfig.BUILD_TIMESTAMP, System.currentTimeMillis())); } Log.i(TAG, "Starting message send attempt"); onSend(); Log.i(TAG, "Message send completed"); } protected abstract void onSend() 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 scaleAndStripExifFromAttachments(@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, attachment)) { if (MediaUtil.isJpeg(attachment)) { MediaStream stripped = constraints.getResizedMedia(context, attachment); results.add(attachmentDatabase.updateAttachmentData(attachment, stripped)); } else { results.add(attachment); } } else if (constraints.canResize(attachment)) { MediaStream resized = constraints.getResizedMedia(context, attachment); results.add(attachmentDatabase.updateAttachmentData(attachment, resized)); } else { throw new UndeliverableMessageException("Size constraints could not be met!"); } } catch (IOException | MmsException e) { throw new UndeliverableMessageException(e); } } return results; } }