package org.thoughtcrime.securesms.jobs; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import network.loki.messenger.BuildConfig; import org.thoughtcrime.securesms.TextSecureExpiredException; import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.database.AttachmentDatabase; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.JobLogger; 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 BaseJob { @SuppressWarnings("unused") private final static String TAG = SendJob.class.getSimpleName(); public SendJob(Job.Parameters parameters) { super(parameters); } @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; } protected void log(@NonNull String tag, @NonNull String message) { Log.i(tag, JobLogger.format(this, message)); } protected void warn(@NonNull String tag, @NonNull String message) { warn(tag, message, null); } protected void warn(@NonNull String tag, @Nullable Throwable t) { warn(tag, "", t); } protected void warn(@NonNull String tag, @NonNull String message, @Nullable Throwable t) { Log.w(tag, JobLogger.format(this, message), t); } }