SmsSingleRecipientSender.java revision 0d2c0042be90f42635e3bc301f2a2e37460e6344
1package com.android.mms.transaction; 2 3import java.util.ArrayList; 4 5import android.app.PendingIntent; 6import android.content.Context; 7import android.content.Intent; 8import android.database.sqlite.SQLiteException; 9import android.net.Uri; 10import android.provider.Telephony.Mms; 11import android.telephony.SmsManager; 12import android.util.Log; 13 14import com.android.mms.LogTag; 15import com.android.mms.MmsConfig; 16import com.google.android.mms.MmsException; 17import android.provider.Telephony.Sms; 18import com.android.mms.ui.MessageUtils; 19 20public class SmsSingleRecipientSender extends SmsMessageSender { 21 22 private final boolean mRequestDeliveryReport; 23 private String mDest; 24 private Uri mUri; 25 private static final String TAG = "SmsSingleRecipientSender"; 26 27 public SmsSingleRecipientSender(Context context, String dest, String msgText, long threadId, 28 boolean requestDeliveryReport, Uri uri) { 29 super(context, null, msgText, threadId); 30 mRequestDeliveryReport = requestDeliveryReport; 31 mDest = dest; 32 mUri = uri; 33 } 34 35 public boolean sendMessage(long token) throws MmsException { 36 if (LogTag.DEBUG_SEND) { 37 Log.v(TAG, "sendMessage token: " + token); 38 } 39 if (mMessageText == null) { 40 // Don't try to send an empty message, and destination should be just 41 // one. 42 throw new MmsException("Null message body or have multiple destinations."); 43 } 44 SmsManager smsManager = SmsManager.getDefault(); 45 ArrayList<String> messages = null; 46 if ((MmsConfig.getEmailGateway() != null) && 47 (Mms.isEmailAddress(mDest) || MessageUtils.isAlias(mDest))) { 48 String msgText; 49 msgText = mDest + " " + mMessageText; 50 mDest = MmsConfig.getEmailGateway(); 51 messages = smsManager.divideMessage(msgText); 52 } else { 53 messages = smsManager.divideMessage(mMessageText); 54 // remove spaces from destination number (e.g. "801 555 1212" -> "8015551212") 55 mDest = mDest.replaceAll(" ", ""); 56 } 57 int messageCount = messages.size(); 58 59 if (messageCount == 0) { 60 // Don't try to send an empty message. 61 throw new MmsException("SmsMessageSender.sendMessage: divideMessage returned " + 62 "empty messages. Original message is \"" + mMessageText + "\""); 63 } 64 65 boolean moved = Sms.moveMessageToFolder(mContext, mUri, Sms.MESSAGE_TYPE_OUTBOX, 0); 66 if (!moved) { 67 throw new MmsException("SmsMessageSender.sendMessage: couldn't move message " + 68 "to outbox: " + mUri); 69 } 70 if (LogTag.DEBUG_SEND) { 71 Log.v(TAG, "sendMessage mDest: " + mDest + " mRequestDeliveryReport: " + 72 mRequestDeliveryReport); 73 } 74 75 ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>(messageCount); 76 ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(messageCount); 77 for (int i = 0; i < messageCount; i++) { 78 if (mRequestDeliveryReport) { 79 // TODO: Fix: It should not be necessary to 80 // specify the class in this intent. Doing that 81 // unnecessarily limits customizability. 82 deliveryIntents.add(PendingIntent.getBroadcast( 83 mContext, 0, 84 new Intent( 85 MessageStatusReceiver.MESSAGE_STATUS_RECEIVED_ACTION, 86 mUri, 87 mContext, 88 MessageStatusReceiver.class), 89 0)); 90 } 91 Intent intent = new Intent(SmsReceiverService.MESSAGE_SENT_ACTION, 92 mUri, 93 mContext, 94 SmsReceiver.class); 95 96 int requestCode = 0; 97 if (i == messageCount -1) { 98 // Changing the requestCode so that a different pending intent 99 // is created for the last fragment with 100 // EXTRA_MESSAGE_SENT_SEND_NEXT set to true. 101 requestCode = 1; 102 intent.putExtra(SmsReceiverService.EXTRA_MESSAGE_SENT_SEND_NEXT, true); 103 } 104 if (LogTag.DEBUG_SEND) { 105 Log.v(TAG, "sendMessage sendIntent: " + intent); 106 } 107 sentIntents.add(PendingIntent.getBroadcast(mContext, requestCode, intent, 0)); 108 } 109 try { 110 smsManager.sendMultipartTextMessage(mDest, mServiceCenter, messages, sentIntents, deliveryIntents); 111 } catch (Exception ex) { 112 Log.e(TAG, "SmsMessageSender.sendMessage: caught", ex); 113 throw new MmsException("SmsMessageSender.sendMessage: caught " + ex + 114 " from SmsManager.sendTextMessage()"); 115 } 116 if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE) || LogTag.DEBUG_SEND) { 117 log("sendMessage: address=" + mDest + ", threadId=" + mThreadId + 118 ", uri=" + mUri + ", msgs.count=" + messageCount); 119 } 120 return false; 121 } 122 123 private void log(String msg) { 124 Log.d(LogTag.TAG, "[SmsSingleRecipientSender] " + msg); 125 } 126} 127