diff --git a/res/drawable-hdpi/ic_sms_mms_delivered.png b/res/drawable-hdpi/ic_sms_mms_delivered.png
new file mode 100644
index 0000000000..0802373ec3
Binary files /dev/null and b/res/drawable-hdpi/ic_sms_mms_delivered.png differ
diff --git a/res/drawable-mdpi/ic_sms_mms_delivered.png b/res/drawable-mdpi/ic_sms_mms_delivered.png
new file mode 100644
index 0000000000..44b91453d6
Binary files /dev/null and b/res/drawable-mdpi/ic_sms_mms_delivered.png differ
diff --git a/res/drawable-xhdpi/ic_sms_mms_delivered.png b/res/drawable-xhdpi/ic_sms_mms_delivered.png
new file mode 100644
index 0000000000..6eeecc4a3c
Binary files /dev/null and b/res/drawable-xhdpi/ic_sms_mms_delivered.png differ
diff --git a/res/layout/conversation_item_received.xml b/res/layout/conversation_item_received.xml
index 39e3b0705b..cbb0d39e57 100644
--- a/res/layout/conversation_item_received.xml
+++ b/res/layout/conversation_item_received.xml
@@ -96,6 +96,13 @@
android:orientation="horizontal"
android:gravity="left">
+
+
-
+ android:paddingTop="1dip"/>
+
+
-
+
+
+
+
+
+
+
= SmsDatabase.Status.STATUS_FAILED) {
+ return MessageRecord.DELIVERY_STATUS_FAILED;
+ } else if (status >= SmsDatabase.Status.STATUS_PENDING) {
+ return MessageRecord.DELIVERY_STATUS_PENDING;
+ } else {
+ return MessageRecord.DELIVERY_STATUS_RECEIVED;
+ }
+ }
}
diff --git a/src/org/thoughtcrime/securesms/service/SendReceiveService.java b/src/org/thoughtcrime/securesms/service/SendReceiveService.java
index 6a0c912ba6..50c0b6e1d1 100644
--- a/src/org/thoughtcrime/securesms/service/SendReceiveService.java
+++ b/src/org/thoughtcrime/securesms/service/SendReceiveService.java
@@ -47,6 +47,7 @@ public class SendReceiveService extends Service {
public static final String SEND_SMS_ACTION = "org.thoughtcrime.securesms.SendReceiveService.SEND_SMS_ACTION";
public static final String SENT_SMS_ACTION = "org.thoughtcrime.securesms.SendReceiveService.SENT_SMS_ACTION";
+ public static final String DELIVERED_SMS_ACTION = "org.thoughtcrime.securesms.SendReceiveService.DELIVERED_SMS_ACTION";
public static final String RECEIVE_SMS_ACTION = "org.thoughtcrime.securesms.SendReceiveService.RECEIVE_SMS_ACTION";
public static final String SEND_MMS_ACTION = "org.thoughtcrime.securesms.SendReceiveService.SEND_MMS_ACTION";
public static final String SEND_MMS_CONNECTIVITY_ACTION = "org.thoughtcrime.securesms.SendReceiveService.SEND_MMS_CONNECTIVITY_ACTION";
@@ -93,6 +94,8 @@ public class SendReceiveService extends Service {
scheduleIntent(RECEIVE_SMS, intent);
else if (intent.getAction().equals(SENT_SMS_ACTION))
scheduleIntent(RECEIVE_SMS, intent);
+ else if (intent.getAction().equals(DELIVERED_SMS_ACTION))
+ scheduleIntent(RECEIVE_SMS, intent);
else if (intent.getAction().equals(SEND_MMS_ACTION) || intent.getAction().equals(SEND_MMS_CONNECTIVITY_ACTION))
scheduleSecretRequiredIntent(SEND_MMS, intent);
else if (intent.getAction().equals(RECEIVE_MMS_ACTION))
@@ -191,8 +194,8 @@ public class SendReceiveService extends Service {
public void run() {
switch (what) {
- case RECEIVE_SMS: smsReceiver.process(masterSecret, intent); return;
- case SEND_SMS: smsSender.process(masterSecret, intent); return;
+ case RECEIVE_SMS: smsReceiver.process(masterSecret, intent); return;
+ case SEND_SMS: smsSender.process(masterSecret, intent); return;
case RECEIVE_MMS: mmsReceiver.process(masterSecret, intent); return;
case SEND_MMS: mmsSender.process(masterSecret, intent); return;
case DOWNLOAD_MMS: mmsDownloader.process(masterSecret, intent); return;
diff --git a/src/org/thoughtcrime/securesms/service/SmsListener.java b/src/org/thoughtcrime/securesms/service/SmsListener.java
index 62f7f58a44..002f404ca6 100644
--- a/src/org/thoughtcrime/securesms/service/SmsListener.java
+++ b/src/org/thoughtcrime/securesms/service/SmsListener.java
@@ -1,6 +1,6 @@
-/**
+/**
* Copyright (C) 2011 Whisper Systems
- *
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
@@ -10,14 +10,12 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
package org.thoughtcrime.securesms.service;
-import org.thoughtcrime.securesms.protocol.WirePrefix;
-
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -26,6 +24,8 @@ import android.preference.PreferenceManager;
import android.telephony.SmsMessage;
import android.util.Log;
+import org.thoughtcrime.securesms.protocol.WirePrefix;
+
public class SmsListener extends BroadcastReceiver {
private static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
@@ -40,58 +40,58 @@ public class SmsListener extends BroadcastReceiver {
if (messageBody.startsWith("Sparebank1://otp?")) {
return true;
}
-
+
// Sprint Visual Voicemail
- return
- message.getOriginatingAddress().length() < 7 &&
- (messageBody.startsWith("//ANDROID:") || messageBody.startsWith("//Android:") ||
+ return
+ message.getOriginatingAddress().length() < 7 &&
+ (messageBody.startsWith("//ANDROID:") || messageBody.startsWith("//Android:") ||
messageBody.startsWith("//android:") || messageBody.startsWith("//BREW:"));
}
-
+
private SmsMessage getSmsMessageFromIntent(Intent intent) {
Bundle bundle = intent.getExtras();
Object[] pdus = (Object[])bundle.get("pdus");
if (pdus == null || pdus.length == 0)
return null;
-
+
return SmsMessage.createFromPdu((byte[])pdus[0]);
}
-
+
private String getSmsMessageBodyFromIntent(Intent intent) {
Bundle bundle = intent.getExtras();
Object[] pdus = (Object[])bundle.get("pdus");
StringBuilder bodyBuilder = new StringBuilder();
-
+
if (pdus == null)
return null;
-
+
for (int i=0;i constructDeliveredIntents(long messageId, long type, ArrayList messages) {
+ if (!PreferenceManager.getDefaultSharedPreferences(context)
+ .getBoolean(ApplicationPreferencesActivity.SMS_DELIVERY_REPORT_PREF, false))
+ {
+ return null;
+ }
+
+ ArrayList deliveredIntents = new ArrayList(messages.size());
+
+ for (int i=0;i messages = SmsManager.getDefault().divideMessage(text);
- ArrayList sentIntents = constructSentIntents(messageId, type, messages);
+ ArrayList messages = SmsManager.getDefault().divideMessage(text);
+ ArrayList sentIntents = constructSentIntents(messageId, type, messages);
+ ArrayList deliveredIntents = constructDeliveredIntents(messageId, type, messages);
+
// XXX moxie@thoughtcrime.org 1/7/11 -- There's apparently a bug where for some unknown recipients
// and messages, this will throw an NPE. I have no idea why, so I'm just catching it and marking
// the message as a failure. That way at least it doesn't repeatedly crash every time you start
// the app.
try {
- SmsManager.getDefault().sendMultipartTextMessage(recipient, null, messages, sentIntents, null);
+ SmsManager.getDefault().sendMultipartTextMessage(recipient, null, messages, sentIntents, deliveredIntents);
} catch (NullPointerException npe) {
Log.w("SmsSender", npe);
DatabaseFactory.getSmsDatabase(context).markAsSentFailed(messageId);
@@ -142,15 +165,18 @@ public class SmsSender {
return;
}
- ArrayList messages = multipartMessageHandler.divideMessage(recipient, text, prefix);
- ArrayList sentIntents = constructSentIntents(messageId, type, messages);
+ ArrayList messages = multipartMessageHandler.divideMessage(recipient, text, prefix);
+ ArrayList sentIntents = constructSentIntents(messageId, type, messages);
+ ArrayList deliveredIntents = constructDeliveredIntents(messageId, type, messages);
+
for (int i=0;i