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