diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 92dbd757f..6c69602f4 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -163,6 +163,15 @@
+
+
+
+
+
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 90054a114..f14b07f60 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -221,6 +221,9 @@
Bad encrypted MMS message...
MMS message encrypted for non-existing session...
+
+ Currently unable to send your MMS message. It will be sent once service becomes available.
+
Migrating
Migrating System Text Messages
@@ -236,7 +239,12 @@
Encrypted message...
Corrupted ciphertext
(No Subject)
+ Message delivery failed.
+ Failed to deliver message.
+ Error delivering message.
+
+ Currently unable to send your SMS message. It will be sent once service becomes available.
You have received a message from someone who supports TextSecure encrypted sessions. Would you like to initiate a secure session?
diff --git a/src/org/thoughtcrime/securesms/database/ThreadDatabase.java b/src/org/thoughtcrime/securesms/database/ThreadDatabase.java
index 8f6def255..5b9cf81be 100644
--- a/src/org/thoughtcrime/securesms/database/ThreadDatabase.java
+++ b/src/org/thoughtcrime/securesms/database/ThreadDatabase.java
@@ -24,6 +24,7 @@ import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import org.thoughtcrime.securesms.recipients.Recipient;
+import org.thoughtcrime.securesms.recipients.RecipientFactory;
import org.thoughtcrime.securesms.recipients.Recipients;
import java.util.Arrays;
@@ -313,6 +314,25 @@ public class ThreadDatabase extends Database {
}
}
+ public Recipients getRecipientsForThreadId(Context context, long threadId) {
+ SQLiteDatabase db = databaseHelper.getReadableDatabase();
+ Cursor cursor = null;
+
+ try {
+ cursor = db.query(TABLE_NAME, null, ID + " = ?", new String[] {threadId+""}, null, null, null);
+
+ if (cursor != null && cursor.moveToFirst()) {
+ String recipientIds = cursor.getString(cursor.getColumnIndexOrThrow(RECIPIENT_IDS));
+ return RecipientFactory.getRecipientsForIds(context, recipientIds, false);
+ }
+ } finally {
+ if (cursor != null)
+ cursor.close();
+ }
+
+ return null;
+ }
+
public void update(long threadId) {
MmsSmsDatabase mmsSmsDatabase = DatabaseFactory.getMmsSmsDatabase(context);
long count = mmsSmsDatabase.getConversationCount(threadId);
diff --git a/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java b/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java
index 9b555d6a8..0a3594e94 100644
--- a/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java
+++ b/src/org/thoughtcrime/securesms/notifications/MessageNotifier.java
@@ -39,6 +39,7 @@ import android.util.Log;
import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
import org.thoughtcrime.securesms.ConversationListActivity;
import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.contacts.ContactPhotoFactory;
import org.thoughtcrime.securesms.crypto.MasterCipher;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.crypto.MessageDisplayHelper;
@@ -74,6 +75,33 @@ public class MessageNotifier {
visibleThread = threadId;
}
+ public static void notifyMessageDeliveryFailed(Context context, Recipients recipients, long threadId) {
+ if (visibleThread == threadId) {
+ sendInThreadNotification(context);
+ } else {
+ Intent intent = new Intent(context, ConversationListActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ intent.putExtra("recipients", recipients);
+ intent.putExtra("thread_id", threadId);
+ intent.setData((Uri.parse("custom://"+System.currentTimeMillis())));
+
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
+ builder.setSmallIcon(R.drawable.icon_notification);
+ builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(),
+ R.drawable.ic_list_alert_sms_failed));
+ builder.setContentTitle(context.getString(R.string.MessageNotifier_message_delivery_failed));
+ builder.setContentText(context.getString(R.string.MessageNotifier_failed_to_deliver_message));
+ builder.setTicker(context.getString(R.string.MessageNotifier_error_delivering_message));
+ builder.setContentIntent(PendingIntent.getActivity(context, 0, intent, 0));
+ builder.setAutoCancel(true);
+ setNotificationAlarms(context, builder, true);
+
+ ((NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE))
+ .notify((int)threadId, builder.build());
+ }
+ }
+
+
public static void updateNotification(Context context, MasterSecret masterSecret) {
updateNotification(context, masterSecret, false);
}
@@ -286,7 +314,9 @@ public class MessageNotifier {
return getMmsRecipient(context, cursor);
}
} catch (RecipientFormattingException e) {
- return new Recipients(new Recipient("Unknown", null, null));
+ Log.w("MessageNotifier", e);
+ return new Recipients(new Recipient("Unknown", "Unknown", null,
+ ContactPhotoFactory.getDefaultContactPhoto(context)));
}
}
diff --git a/src/org/thoughtcrime/securesms/service/MmsSender.java b/src/org/thoughtcrime/securesms/service/MmsSender.java
index 0701bd54c..5a13f76a4 100644
--- a/src/org/thoughtcrime/securesms/service/MmsSender.java
+++ b/src/org/thoughtcrime/securesms/service/MmsSender.java
@@ -18,17 +18,21 @@ package org.thoughtcrime.securesms.service;
import android.content.Context;
import android.content.Intent;
+import android.os.Handler;
import android.telephony.TelephonyManager;
import android.util.Log;
+import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.crypto.SessionCipher;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.MmsDatabase;
import org.thoughtcrime.securesms.mms.MmsSendHelper;
import org.thoughtcrime.securesms.mms.TextTransport;
+import org.thoughtcrime.securesms.notifications.MessageNotifier;
import org.thoughtcrime.securesms.protocol.WirePrefix;
import org.thoughtcrime.securesms.recipients.Recipient;
+import org.thoughtcrime.securesms.recipients.Recipients;
import org.thoughtcrime.securesms.util.Hex;
import ws.com.google.android.mms.ContentType;
@@ -49,9 +53,11 @@ import java.util.LinkedList;
public class MmsSender extends MmscProcessor {
private final LinkedList pendingMessages = new LinkedList();
+ private final Handler toastHandler;
- public MmsSender(Context context) {
+ public MmsSender(Context context, Handler toastHandler) {
super(context);
+ this.toastHandler = toastHandler;
}
public void process(MasterSecret masterSecret, Intent intent) {
@@ -69,8 +75,8 @@ public class MmsSender extends MmscProcessor {
sendRequests[0] = database.getSendRequest(messageId);
}
- if (sendRequests.length > 0)
- handleSendMms(sendRequests);
+ if (sendRequests != null && sendRequests.length > 0)
+ handleSendMms(sendRequests, messageId != -1);
} catch (MmsException me) {
Log.w("MmsSender", me);
@@ -90,10 +96,15 @@ public class MmsSender extends MmscProcessor {
else finishConnectivity();
}
- private void handleSendMms(SendReq[] sendRequests) {
+ private void handleSendMms(SendReq[] sendRequests, boolean targeted) {
if (!isConnectivityPossible()) {
- for (int i=0;i