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