SmsSingleRecipientSender.java revision f7e8281a223af6228e6399055a6197a1edd9bc3a
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
26    public SmsSingleRecipientSender(Context context, String dest, String msgText, long threadId,
27            boolean requestDeliveryReport, Uri uri) {
28        super(context, null, msgText, threadId);
29        mRequestDeliveryReport = requestDeliveryReport;
30        mDest = dest;
31        mUri = uri;
32    }
33
34    public boolean sendMessage(long token) throws MmsException {
35        if (mMessageText == null) {
36            // Don't try to send an empty message, and destination should be just
37            // one.
38            throw new MmsException("Null message body or have multiple destinations.");
39        }
40        SmsManager smsManager = SmsManager.getDefault();
41        ArrayList<String> messages = null;
42        if ((MmsConfig.getEmailGateway() != null) &&
43                (Mms.isEmailAddress(mDest) || MessageUtils.isAlias(mDest))) {
44            String msgText;
45            msgText = mDest + " " + mMessageText;
46            mDest = MmsConfig.getEmailGateway();
47            messages = smsManager.divideMessage(msgText);
48        } else {
49           messages = smsManager.divideMessage(mMessageText);
50           // remove spaces from destination number (e.g. "801 555 1212" -> "8015551212")
51           mDest = mDest.replaceAll(" ", "");
52        }
53        int messageCount = messages.size();
54
55        if (messageCount == 0) {
56            // Don't try to send an empty message.
57            throw new MmsException("SmsMessageSender.sendMessage: divideMessage returned " +
58                    "empty messages. Original message is \"" + mMessageText + "\"");
59        }
60
61        boolean moved = Sms.moveMessageToFolder(mContext, mUri, Sms.MESSAGE_TYPE_OUTBOX, 0);
62        if (!moved) {
63            throw new MmsException("SmsMessageSender.sendMessage: couldn't move message " +
64                    "to outbox: " + mUri);
65        }
66
67        ArrayList<PendingIntent> deliveryIntents =  new ArrayList<PendingIntent>(messageCount);
68        ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(messageCount);
69        for (int i = 0; i < messageCount; i++) {
70            if (mRequestDeliveryReport) {
71                // TODO: Fix: It should not be necessary to
72                // specify the class in this intent.  Doing that
73                // unnecessarily limits customizability.
74                deliveryIntents.add(PendingIntent.getBroadcast(
75                        mContext, 0,
76                        new Intent(
77                                MessageStatusReceiver.MESSAGE_STATUS_RECEIVED_ACTION,
78                                mUri,
79                                mContext,
80                                MessageStatusReceiver.class),
81                        0));
82            }
83            Intent intent  = new Intent(SmsReceiverService.MESSAGE_SENT_ACTION,
84                    mUri,
85                    mContext,
86                    SmsReceiver.class);
87            if (i == messageCount -1) {
88                intent.putExtra(SmsReceiverService.EXTRA_MESSAGE_SENT_SEND_NEXT, true);
89            }
90            sentIntents.add(PendingIntent.getBroadcast(
91                    mContext, 0, intent, 0));
92        }
93        try {
94            smsManager.sendMultipartTextMessage(mDest, mServiceCenter, messages, sentIntents, deliveryIntents);
95        } catch (Exception ex) {
96            throw new MmsException("SmsMessageSender.sendMessage: caught " + ex +
97                    " from SmsManager.sendTextMessage()");
98        }
99        if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {
100            log("sendMessage: address=" + mDest + ", threadId=" + mThreadId +
101                    ", uri=" + mUri + ", msgs.count=" + messageCount);
102        }
103        return false;
104    }
105
106    private void log(String msg) {
107        Log.d(LogTag.TAG, "[SmsSingleRecipientSender] " + msg);
108    }
109}
110