diff --git a/src/org/thoughtcrime/securesms/database/MmsDatabase.java b/src/org/thoughtcrime/securesms/database/MmsDatabase.java index 5a16dc8572..6b6fbeaef5 100644 --- a/src/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -262,6 +262,10 @@ public class MmsDatabase extends Database implements MmsSmsColumns { notifyConversationListeners(threadId); } + public void markAsSecure(long messageId) { + updateMailboxBitmask(messageId, 0, Types.SECURE_MESSAGE_BIT); + } + public void markAsDecryptFailed(long messageId, long threadId) { updateMailboxBitmask(messageId, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_FAILED_BIT); notifyConversationListeners(threadId); diff --git a/src/org/thoughtcrime/securesms/mms/MmsSendResult.java b/src/org/thoughtcrime/securesms/mms/MmsSendResult.java new file mode 100644 index 0000000000..aed5b82319 --- /dev/null +++ b/src/org/thoughtcrime/securesms/mms/MmsSendResult.java @@ -0,0 +1,27 @@ +package org.thoughtcrime.securesms.mms; + +public class MmsSendResult { + + private final byte[] messageId; + private final int responseStatus; + private final boolean upgradedSecure; + + + public MmsSendResult(byte[] messageId, int responseStatus, boolean upgradedSecure) { + this.messageId = messageId; + this.responseStatus = responseStatus; + this.upgradedSecure = upgradedSecure; + } + + public boolean isUpgradedSecure() { + return upgradedSecure; + } + + public int getResponseStatus() { + return responseStatus; + } + + public byte[] getMessageId() { + return messageId; + } +} diff --git a/src/org/thoughtcrime/securesms/service/MmsSender.java b/src/org/thoughtcrime/securesms/service/MmsSender.java index a38d8130d4..8eaef07a1b 100644 --- a/src/org/thoughtcrime/securesms/service/MmsSender.java +++ b/src/org/thoughtcrime/securesms/service/MmsSender.java @@ -24,6 +24,7 @@ import android.util.Pair; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.ThreadDatabase; +import org.thoughtcrime.securesms.mms.MmsSendResult; import org.thoughtcrime.securesms.notifications.MessageNotifier; import org.thoughtcrime.securesms.recipients.Recipients; import org.thoughtcrime.securesms.service.SendReceiveService.ToastHandler; @@ -64,8 +65,14 @@ public class MmsSender { try { Log.w("MmsSender", "Passing to MMS transport: " + message.getDatabaseMessageId()); database.markAsSending(message.getDatabaseMessageId()); - Pair result = transport.deliver(message, threadId); - database.markAsSent(message.getDatabaseMessageId(), result.first, result.second); + MmsSendResult result = transport.deliver(message, threadId); + + if (result.isUpgradedSecure()) { + database.markAsSecure(message.getDatabaseMessageId()); + } + + database.markAsSent(message.getDatabaseMessageId(), result.getMessageId(), + result.getResponseStatus()); } catch (UndeliverableMessageException e) { Log.w("MmsSender", e); database.markAsSentFailed(message.getDatabaseMessageId()); diff --git a/src/org/thoughtcrime/securesms/service/PushDownloader.java b/src/org/thoughtcrime/securesms/service/PushDownloader.java index f2ebfdae8c..bb5e4ef3f4 100644 --- a/src/org/thoughtcrime/securesms/service/PushDownloader.java +++ b/src/org/thoughtcrime/securesms/service/PushDownloader.java @@ -16,6 +16,7 @@ import org.whispersystems.textsecure.crypto.AttachmentCipherInputStream; import org.whispersystems.textsecure.crypto.InvalidMessageException; import org.whispersystems.textsecure.crypto.MasterCipher; import org.whispersystems.textsecure.crypto.MasterSecret; +import org.whispersystems.textsecure.push.NotFoundException; import org.whispersystems.textsecure.push.PushServiceSocket; import org.whispersystems.textsecure.util.Base64; @@ -79,6 +80,13 @@ public class PushDownloader { InputStream attachmentInput = new AttachmentCipherInputStream(attachmentFile, key); database.updateDownloadedPart(messageId, partId, part, attachmentInput); + } catch (NotFoundException e) { + Log.w("PushDownloader", e); + try { + database.updateFailedDownloadedPart(messageId, partId, part); + } catch (MmsException mme) { + Log.w("PushDownloader", mme); + } } catch (InvalidMessageException e) { Log.w("PushDownloader", e); try { diff --git a/src/org/thoughtcrime/securesms/transport/MmsTransport.java b/src/org/thoughtcrime/securesms/transport/MmsTransport.java index f90a76e582..f1154e8167 100644 --- a/src/org/thoughtcrime/securesms/transport/MmsTransport.java +++ b/src/org/thoughtcrime/securesms/transport/MmsTransport.java @@ -20,21 +20,20 @@ package org.thoughtcrime.securesms.transport; import android.content.Context; import android.telephony.TelephonyManager; import android.util.Log; -import android.util.Pair; import org.thoughtcrime.securesms.crypto.IdentityKeyUtil; -import org.whispersystems.textsecure.crypto.IdentityKeyPair; -import org.whispersystems.textsecure.crypto.MasterSecret; -import org.whispersystems.textsecure.crypto.MessageCipher; import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.mms.MmsRadio; import org.thoughtcrime.securesms.mms.MmsRadioException; import org.thoughtcrime.securesms.mms.MmsSendHelper; +import org.thoughtcrime.securesms.mms.MmsSendResult; import org.thoughtcrime.securesms.mms.TextTransport; import org.thoughtcrime.securesms.protocol.WirePrefix; import org.thoughtcrime.securesms.recipients.Recipient; +import org.whispersystems.textsecure.crypto.IdentityKeyPair; +import org.whispersystems.textsecure.crypto.MasterSecret; +import org.whispersystems.textsecure.crypto.MessageCipher; import org.whispersystems.textsecure.crypto.ecc.Curve; -import org.whispersystems.textsecure.crypto.ecc.ECPublicKey; import org.whispersystems.textsecure.crypto.protocol.CiphertextMessage; import org.whispersystems.textsecure.util.Hex; @@ -62,7 +61,7 @@ public class MmsTransport { this.radio = MmsRadio.getInstance(context); } - public Pair deliver(SendReq message) throws UndeliverableMessageException { + public MmsSendResult deliver(SendReq message) throws UndeliverableMessageException { try { if (isCdmaDevice()) { Log.w("MmsTransport", "Sending MMS directly without radio change..."); @@ -77,7 +76,7 @@ public class MmsTransport { radio.connect(); try { - Pair result = sendMms(message, true, false); + MmsSendResult result = sendMms(message, true, false); radio.disconnect(); return result; } catch (IOException e) { @@ -87,7 +86,7 @@ public class MmsTransport { Log.w("MmsTransport", "Sending MMS with radio change and proxy..."); try { - Pair result = sendMms(message, true, true); + MmsSendResult result = sendMms(message, true, true); radio.disconnect(); return result; } catch (IOException ioe) { @@ -102,13 +101,15 @@ public class MmsTransport { } } - private Pair sendMms(SendReq message, boolean usingMmsRadio, boolean useProxy) + private MmsSendResult sendMms(SendReq message, boolean usingMmsRadio, boolean useProxy) throws IOException, UndeliverableMessageException { - String number = ((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE)).getLine1Number(); + String number = ((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE)).getLine1Number(); + boolean upgradedSecure = false; if (MmsDatabase.Types.isSecureType(message.getDatabaseMessageBox())) { - message = getEncryptedMessage(message); + message = getEncryptedMessage(message); + upgradedSecure = true; } if (number != null && number.trim().length() != 0) { @@ -129,7 +130,7 @@ public class MmsTransport { } else if (isInconsistentResponse(message, conf)) { throw new UndeliverableMessageException("Mismatched response!"); } else { - return new Pair(conf.getMessageId(), conf.getResponseStatus()); + return new MmsSendResult(conf.getMessageId(), conf.getResponseStatus(), upgradedSecure); } } diff --git a/src/org/thoughtcrime/securesms/transport/UniversalTransport.java b/src/org/thoughtcrime/securesms/transport/UniversalTransport.java index 4b5230c256..d6da46db64 100644 --- a/src/org/thoughtcrime/securesms/transport/UniversalTransport.java +++ b/src/org/thoughtcrime/securesms/transport/UniversalTransport.java @@ -21,6 +21,7 @@ import android.util.Log; import android.util.Pair; import org.thoughtcrime.securesms.database.model.SmsMessageRecord; +import org.thoughtcrime.securesms.mms.MmsSendResult; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.TextSecurePushCredentials; @@ -76,7 +77,7 @@ public class UniversalTransport { } } - public Pair deliver(SendReq mediaMessage, long threadId) + public MmsSendResult deliver(SendReq mediaMessage, long threadId) throws UndeliverableMessageException { if (!TextSecurePreferences.isPushRegistered(context)) { @@ -89,7 +90,7 @@ public class UniversalTransport { try { Log.w("UniversalTransport", "Delivering media message with GCM..."); pushTransport.deliver(mediaMessage, destinations, threadId); - return new Pair("push".getBytes("UTF-8"), 0); + return new MmsSendResult("push".getBytes("UTF-8"), 0, true); } catch (IOException ioe) { Log.w("UniversalTransport", ioe); return mmsTransport.deliver(mediaMessage);