package org.thoughtcrime.SMP.jobs; import android.content.Context; import android.util.Log; import android.util.Pair; import org.thoughtcrime.SMP.ApplicationContext; import org.thoughtcrime.SMP.database.DatabaseFactory; import org.thoughtcrime.SMP.database.MmsDatabase; import org.thoughtcrime.SMP.recipients.RecipientFactory; import org.thoughtcrime.SMP.recipients.Recipients; import org.thoughtcrime.SMP.util.Util; import org.whispersystems.jobqueue.JobParameters; import ws.com.google.android.mms.pdu.GenericPdu; import ws.com.google.android.mms.pdu.NotificationInd; import ws.com.google.android.mms.pdu.PduHeaders; import ws.com.google.android.mms.pdu.PduParser; public class MmsReceiveJob extends ContextJob { private static final String TAG = MmsReceiveJob.class.getSimpleName(); private final byte[] data; public MmsReceiveJob(Context context, byte[] data) { super(context, JobParameters.newBuilder() .withWakeLock(true) .withPersistence().create()); this.data = data; } @Override public void onAdded() { } @Override public void onRun() { if (data == null) { Log.w(TAG, "Received NULL pdu, ignoring..."); return; } PduParser parser = new PduParser(data); GenericPdu pdu = null; try { pdu = parser.parse(); } catch (RuntimeException e) { Log.w(TAG, e); } if (isNotification(pdu) && !isBlocked(pdu)) { MmsDatabase database = DatabaseFactory.getMmsDatabase(context); Pair<Long, Long> messageAndThreadId = database.insertMessageInbox((NotificationInd)pdu); Log.w(TAG, "Inserted received MMS notification..."); ApplicationContext.getInstance(context) .getJobManager() .add(new MmsDownloadJob(context, messageAndThreadId.first, messageAndThreadId.second, true)); } else if (isNotification(pdu)) { Log.w(TAG, "*** Received blocked MMS, ignoring..."); } } @Override public void onCanceled() { // TODO } @Override public boolean onShouldRetry(Exception exception) { return false; } private boolean isBlocked(GenericPdu pdu) { if (pdu.getFrom() != null && pdu.getFrom().getTextString() != null) { Recipients recipients = RecipientFactory.getRecipientsFromString(context, Util.toIsoString(pdu.getFrom().getTextString()), false); return recipients.isBlocked(); } return false; } private boolean isNotification(GenericPdu pdu) { return pdu != null && pdu.getMessageType() == PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND; } }