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