10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2008 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony.cdma;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.app.Activity;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.app.PendingIntent;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.app.PendingIntent.CanceledException;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Intent;
23c99dab56e20222b28cbc6238645feac938f1c333Ye Wenimport android.net.Uri;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties;
260217e2d6e60f7edd95407c7b385a627da9f1c1e3David Braunimport android.provider.Telephony.Sms;
2799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog;
28a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawalimport android.telephony.ServiceState;
290d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport android.telephony.SmsManager;
304bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wenimport android.telephony.TelephonyManager;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.GsmAlphabet;
331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.GsmCdmaPhone;
34ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowaimport com.android.internal.telephony.ImsSMSDispatcher;
351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.Phone;
364bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wenimport com.android.internal.telephony.PhoneConstants;
371260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport com.android.internal.telephony.SMSDispatcher;
38ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowaimport com.android.internal.telephony.SmsConstants;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.SmsHeader;
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.SmsUsageMonitor;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.TelephonyProperties;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.cdma.sms.UserData;
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.HashMap;
45c99dab56e20222b28cbc6238645feac938f1c333Ye Wenimport java.util.concurrent.atomic.AtomicBoolean;
46c99dab56e20222b28cbc6238645feac938f1c333Ye Wenimport java.util.concurrent.atomic.AtomicInteger;
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
481260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowapublic class CdmaSMSDispatcher extends SMSDispatcher {
49cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private static final String TAG = "CdmaSMSDispatcher";
50cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private static final boolean VDBG = false;
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    public CdmaSMSDispatcher(Phone phone, SmsUsageMonitor usageMonitor,
53ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa            ImsSMSDispatcher imsSMSDispatcher) {
54ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa        super(phone, usageMonitor, imsSMSDispatcher);
551260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        Rlog.d(TAG, "CdmaSMSDispatcher created");
560d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    }
570d4bcdf379842af4b6304809156971e926f374f0Jake Hamby
58ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa    @Override
595d5ca33a24e6b73a48b575a0e1a5e790784d0bb7Amit Mahajan    public String getFormat() {
60ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa        return SmsConstants.FORMAT_3GPP2;
61ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa    }
62ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa
630d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    /**
640d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     * Send the SMS status report to the dispatcher thread to process.
650d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     * @param sms the CDMA SMS message containing the status report
660d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     */
675d5ca33a24e6b73a48b575a0e1a5e790784d0bb7Amit Mahajan    public void sendStatusReportMessage(SmsMessage sms) {
680d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        if (VDBG) Rlog.d(TAG, "sending EVENT_HANDLE_STATUS_REPORT message");
690d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        sendMessage(obtainMessage(EVENT_HANDLE_STATUS_REPORT, sms));
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
730d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    protected void handleStatusReport(Object o) {
740d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        if (o instanceof SmsMessage) {
750d4bcdf379842af4b6304809156971e926f374f0Jake Hamby            if (VDBG) Rlog.d(TAG, "calling handleCdmaStatusReport()");
760d4bcdf379842af4b6304809156971e926f374f0Jake Hamby            handleCdmaStatusReport((SmsMessage) o);
770d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        } else {
780d4bcdf379842af4b6304809156971e926f374f0Jake Hamby            Rlog.e(TAG, "handleStatusReport() called for object type " + o.getClass().getName());
790d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        }
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
820d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    /**
830d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     * Called from parent class to handle status report from {@code CdmaInboundSmsHandler}.
840d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     * @param sms the CDMA SMS message to process
850d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     */
865d5ca33a24e6b73a48b575a0e1a5e790784d0bb7Amit Mahajan    private void handleCdmaStatusReport(SmsMessage sms) {
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0, count = deliveryPendingList.size(); i < count; i++) {
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            SmsTracker tracker = deliveryPendingList.get(i);
8922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (tracker.mMessageRef == sms.mMessageRef) {
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Found it.  Remove from list and broadcast.
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                deliveryPendingList.remove(i);
920217e2d6e60f7edd95407c7b385a627da9f1c1e3David Braun                // Update the message status (COMPLETE)
930217e2d6e60f7edd95407c7b385a627da9f1c1e3David Braun                tracker.updateSentMessageStatus(mContext, Sms.STATUS_COMPLETE);
940217e2d6e60f7edd95407c7b385a627da9f1c1e3David Braun
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                PendingIntent intent = tracker.mDeliveryIntent;
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Intent fillIn = new Intent();
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                fillIn.putExtra("pdu", sms.getPdu());
981260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                fillIn.putExtra("format", getFormat());
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                try {
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    intent.send(mContext, Activity.RESULT_OK, fillIn);
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } catch (CanceledException ex) {}
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;  // Only expect to see one tracker matching this message.
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@inheritDoc} */
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1095d5ca33a24e6b73a48b575a0e1a5e790784d0bb7Amit Mahajan    public void sendData(String destAddr, String scAddr, int destPort,
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) {
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu(
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                scAddr, destAddr, destPort, data, (deliveryIntent != null));
113efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu        if (pdu != null) {
114efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu            HashMap map = getSmsTrackerMap(destAddr, scAddr, destPort, data, pdu);
115efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu            SmsTracker tracker = getSmsTracker(map, sentIntent, deliveryIntent, getFormat(),
116efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                    null /*messageUri*/, false /*isExpectMore*/, null /*fullMessageText*/,
117a8f8c5a113a66de4854f4fb13a5825eb0705bd59Ji Yang                    false /*isText*/, true /*persistMessage*/);
118efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu
119efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu            String carrierPackage = getCarrierAppPackageName();
120efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu            if (carrierPackage != null) {
121efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                Rlog.d(TAG, "Found carrier package.");
122efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                DataSmsSender smsSender = new DataSmsSender(tracker);
123efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                smsSender.sendSmsByCarrierApp(carrierPackage, new SmsSenderCallback(smsSender));
124efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu            } else {
125efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                Rlog.v(TAG, "No carrier package.");
126efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                sendSubmitPdu(tracker);
127efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu            }
1288215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        } else {
129efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu            Rlog.e(TAG, "CdmaSMSDispatcher.sendData(): getSubmitPdu() returned null");
130efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu            if (sentIntent != null) {
131efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                try {
132efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                    sentIntent.send(SmsManager.RESULT_ERROR_GENERIC_FAILURE);
133efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                } catch (CanceledException ex) {
134efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                    Rlog.e(TAG, "Intent has been canceled!");
135efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                }
136efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu            }
1378215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        }
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@inheritDoc} */
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1425d5ca33a24e6b73a48b575a0e1a5e790784d0bb7Amit Mahajan    public void sendText(String destAddr, String scAddr, String text, PendingIntent sentIntent,
143a8f8c5a113a66de4854f4fb13a5825eb0705bd59Ji Yang            PendingIntent deliveryIntent, Uri messageUri, String callingPkg,
144a8f8c5a113a66de4854f4fb13a5825eb0705bd59Ji Yang            boolean persistMessage) {
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu(
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                scAddr, destAddr, text, (deliveryIntent != null), null);
147c99dab56e20222b28cbc6238645feac938f1c333Ye Wen        if (pdu != null) {
148c99dab56e20222b28cbc6238645feac938f1c333Ye Wen            HashMap map = getSmsTrackerMap(destAddr, scAddr, text, pdu);
149c99dab56e20222b28cbc6238645feac938f1c333Ye Wen            SmsTracker tracker = getSmsTracker(map, sentIntent, deliveryIntent, getFormat(),
150a8f8c5a113a66de4854f4fb13a5825eb0705bd59Ji Yang                    messageUri, false /*isExpectMore*/, text, true /*isText*/, persistMessage);
1518215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang
1528215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            String carrierPackage = getCarrierAppPackageName();
1538215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            if (carrierPackage != null) {
1548215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang                Rlog.d(TAG, "Found carrier package.");
1558215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang                TextSmsSender smsSender = new TextSmsSender(tracker);
1568215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang                smsSender.sendSmsByCarrierApp(carrierPackage, new SmsSenderCallback(smsSender));
1578215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            } else {
1588215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang                Rlog.v(TAG, "No carrier package.");
1598215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang                sendSubmitPdu(tracker);
1608215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            }
161c99dab56e20222b28cbc6238645feac938f1c333Ye Wen        } else {
162c99dab56e20222b28cbc6238645feac938f1c333Ye Wen            Rlog.e(TAG, "CdmaSMSDispatcher.sendText(): getSubmitPdu() returned null");
163efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu            if (sentIntent != null) {
164efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                try {
165efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                    sentIntent.send(SmsManager.RESULT_ERROR_GENERIC_FAILURE);
166efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                } catch (CanceledException ex) {
167efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                    Rlog.e(TAG, "Intent has been canceled!");
168efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu                }
169efecbc338ce7821044b6e0251472aa89e743cf5fJack Yu            }
170c99dab56e20222b28cbc6238645feac938f1c333Ye Wen        }
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@inheritDoc} */
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
17563418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni    protected void injectSmsPdu(byte[] pdu, String format, PendingIntent receivedIntent) {
17663418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni        throw new IllegalStateException("This method must be called only on ImsSMSDispatcher");
17763418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni    }
17863418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni
17963418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni    /** {@inheritDoc} */
18063418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni    @Override
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected GsmAlphabet.TextEncodingDetails calculateLength(CharSequence messageBody,
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean use7bitOnly) {
1833ce96a061c2c6e24f4ff3bd237e18c29fc0c0108Amit Mahajan        return SmsMessage.calculateLength(messageBody, use7bitOnly, false);
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@inheritDoc} */
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1888215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    protected SmsTracker getNewSubmitPduTracker(String destinationAddress, String scAddress,
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String message, SmsHeader smsHeader, int encoding,
190c99dab56e20222b28cbc6238645feac938f1c333Ye Wen            PendingIntent sentIntent, PendingIntent deliveryIntent, boolean lastPart,
1914bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wen            AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri,
1924bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wen            String fullMessageText) {
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        UserData uData = new UserData();
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        uData.payloadStr = message;
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        uData.userDataHeader = smsHeader;
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (encoding == SmsConstants.ENCODING_7BIT) {
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            uData.msgEncoding = UserData.ENCODING_GSM_7BIT_ALPHABET;
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else { // assume UTF-16
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            uData.msgEncoding = UserData.ENCODING_UNICODE_16;
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        uData.msgEncodingSet = true;
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /* By setting the statusReportRequested bit only for the
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * last message fragment, this will result in only one
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * callback to the sender when that last fragment delivery
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * has been acknowledged. */
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SmsMessage.SubmitPdu submitPdu = SmsMessage.getSubmitPdu(destinationAddress,
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                uData, (deliveryIntent != null) && lastPart);
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
210ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa        HashMap map = getSmsTrackerMap(destinationAddress, scAddress,
2111260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                message, submitPdu);
2128215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        return getSmsTracker(map, sentIntent, deliveryIntent,
2134bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wen                getFormat(), unsentPartCount, anyPartFailed, messageUri, smsHeader,
214a8f8c5a113a66de4854f4fb13a5825eb0705bd59Ji Yang                false /*isExpextMore*/, fullMessageText, true /*isText*/,
215a8f8c5a113a66de4854f4fb13a5825eb0705bd59Ji Yang                true /*persistMessage*/);
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2188215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    @Override
2191260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    protected void sendSubmitPdu(SmsTracker tracker) {
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (SystemProperties.getBoolean(TelephonyProperties.PROPERTY_INECM_MODE, false)) {
221cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (VDBG) {
22299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.d(TAG, "Block SMS in Emergency Callback mode");
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
224c99dab56e20222b28cbc6238645feac938f1c333Ye Wen            tracker.onFailed(mContext, SmsManager.RESULT_ERROR_NO_SERVICE, 0/*errorCode*/);
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2271260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        sendRawPdu(tracker);
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@inheritDoc} */
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2325d5ca33a24e6b73a48b575a0e1a5e790784d0bb7Amit Mahajan    public void sendSms(SmsTracker tracker) {
233f653f91baeb35b18a47c8f80b6ca1b1361dea238Ji Yang        Rlog.d(TAG, "sendSms: "
2348d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang                + " isIms()=" + isIms()
2358d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang                + " mRetryCount=" + tracker.mRetryCount
2368d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang                + " mImsRetry=" + tracker.mImsRetry
2378d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang                + " mMessageRef=" + tracker.mMessageRef
2388d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang                + " SS=" + mPhone.getServiceState().getState());
2398d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang
2408215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        sendSmsByPstn(tracker);
2418d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang    }
2428d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang
2438d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang    /** {@inheritDoc} */
2448d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang    @Override
2458d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang    protected void sendSmsByPstn(SmsTracker tracker) {
246a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal        int ss = mPhone.getServiceState().getState();
247a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal        // if sms over IMS is not supported on data and voice is not available...
248a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal        if (!isIms() && ss != ServiceState.STATE_IN_SERVICE) {
249a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal            tracker.onFailed(mContext, getNotInServiceError(ss), 0/*errorCode*/);
250a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal            return;
251a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal        }
252a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal
2538d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang        Message reply = obtainMessage(EVENT_SEND_SMS_COMPLETE, tracker);
2545d5ca33a24e6b73a48b575a0e1a5e790784d0bb7Amit Mahajan        byte[] pdu = (byte[]) tracker.getData().get("pdu");
2551260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
2564eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying        int currentDataNetwork = mPhone.getServiceState().getDataNetworkType();
2574eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying        boolean imsSmsDisabled = (currentDataNetwork == TelephonyManager.NETWORK_TYPE_EHRPD
258000f48b9c960010bf41cd22b8625b4ff16c2e719Ajay Nambi                    || (ServiceState.isLte(currentDataNetwork)
2594eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying                    && !mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()))
2604eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying                    && mPhone.getServiceState().getVoiceNetworkType()
2614eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying                    == TelephonyManager.NETWORK_TYPE_1xRTT
2621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    && ((GsmCdmaPhone) mPhone).mCT.mState != PhoneConstants.State.IDLE;
2634eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying
2641260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        // sms over cdma is used:
2651260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        //   if sms over IMS is not supported AND
2661260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        //   this is not a retry case after sms over IMS failed
2671260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        //     indicated by mImsRetry > 0
2684eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying        if (0 == tracker.mImsRetry && !isIms() || imsSmsDisabled) {
2691260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            mCi.sendCdmaSms(pdu, reply);
2701260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        } else {
2711260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            mCi.sendImsCdmaSms(pdu, tracker.mImsRetry, tracker.mMessageRef, reply);
2721260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            // increment it here, so in case of SMS_FAIL_RETRY over IMS
2731260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            // next retry will be sent using IMS request again.
2741260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            tracker.mImsRetry++;
2751260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        }
2761260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
278