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