package org.thoughtcrime.SMP.jobs; import android.content.Context; import android.util.Log; import org.thoughtcrime.SMP.crypto.MasterSecret; import org.thoughtcrime.SMP.database.DatabaseFactory; import org.thoughtcrime.SMP.database.TextSecureDirectory; import org.thoughtcrime.SMP.jobs.requirements.MasterSecretRequirement; import org.thoughtcrime.SMP.mms.PartAuthority; import org.thoughtcrime.SMP.notifications.MessageNotifier; import org.thoughtcrime.SMP.recipients.Recipients; import org.thoughtcrime.SMP.util.Util; import org.whispersystems.jobqueue.JobParameters; import org.whispersystems.jobqueue.requirements.NetworkRequirement; import org.whispersystems.libaxolotl.util.guava.Optional; import org.whispersystems.textsecure.api.messages.TextSecureAttachment; import org.whispersystems.textsecure.api.messages.TextSecureAttachmentStream; import org.whispersystems.textsecure.api.push.TextSecureAddress; import org.whispersystems.textsecure.api.util.InvalidNumberException; import java.io.IOException; import java.io.InputStream; import java.util.LinkedList; import java.util.List; import ws.com.google.android.mms.ContentType; import ws.com.google.android.mms.pdu.PduPart; import ws.com.google.android.mms.pdu.SendReq; public abstract class PushSendJob extends SendJob { private static final String TAG = PushSendJob.class.getSimpleName(); protected PushSendJob(Context context, JobParameters parameters) { super(context, parameters); } protected static JobParameters constructParameters(Context context, String destination) { JobParameters.Builder builder = JobParameters.newBuilder(); builder.withPersistence(); builder.withGroupId(destination); builder.withRequirement(new MasterSecretRequirement(context)); builder.withRequirement(new NetworkRequirement(context)); builder.withRetryCount(5); return builder.create(); } protected TextSecureAddress getPushAddress(String number) throws InvalidNumberException { String e164number = Util.canonicalizeNumber(context, number); String relay = TextSecureDirectory.getInstance(context).getRelay(e164number); return new TextSecureAddress(e164number, Optional.fromNullable(relay)); } protected List<TextSecureAttachment> getAttachments(final MasterSecret masterSecret, final SendReq message) { List<TextSecureAttachment> attachments = new LinkedList<>(); for (int i=0;i<message.getBody().getPartsNum();i++) { PduPart part = message.getBody().getPart(i); String contentType = Util.toIsoString(part.getContentType()); if (ContentType.isImageType(contentType) || ContentType.isAudioType(contentType) || ContentType.isVideoType(contentType)) { try { InputStream is = PartAuthority.getPartStream(context, masterSecret, part.getDataUri()); attachments.add(new TextSecureAttachmentStream(is, contentType, part.getDataSize())); } catch (IOException ioe) { Log.w(TAG, "Couldn't open attachment", ioe); } } } return attachments; } protected void notifyMediaMessageDeliveryFailed(Context context, long messageId) { long threadId = DatabaseFactory.getMmsDatabase(context).getThreadIdForMessage(messageId); Recipients recipients = DatabaseFactory.getThreadDatabase(context).getRecipientsForThreadId(threadId); if (threadId != -1 && recipients != null) { MessageNotifier.notifyMessageDeliveryFailed(context, recipients, threadId); } } }