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;
33ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowaimport com.android.internal.telephony.ImsSMSDispatcher;
341260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport com.android.internal.telephony.PhoneBase;
354bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wenimport com.android.internal.telephony.PhoneConstants;
361260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport com.android.internal.telephony.SMSDispatcher;
37ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowaimport com.android.internal.telephony.SmsConstants;
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.SmsHeader;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.SmsUsageMonitor;
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.TelephonyProperties;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.cdma.sms.UserData;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.HashMap;
44c99dab56e20222b28cbc6238645feac938f1c333Ye Wenimport java.util.concurrent.atomic.AtomicBoolean;
45c99dab56e20222b28cbc6238645feac938f1c333Ye Wenimport java.util.concurrent.atomic.AtomicInteger;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
471260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowapublic class CdmaSMSDispatcher extends SMSDispatcher {
48cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private static final String TAG = "CdmaSMSDispatcher";
49cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private static final boolean VDBG = false;
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
51ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa    public CdmaSMSDispatcher(PhoneBase phone, SmsUsageMonitor usageMonitor,
52ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa            ImsSMSDispatcher imsSMSDispatcher) {
53ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa        super(phone, usageMonitor, imsSMSDispatcher);
541260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        Rlog.d(TAG, "CdmaSMSDispatcher created");
550d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    }
560d4bcdf379842af4b6304809156971e926f374f0Jake Hamby
57ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa    @Override
58ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa    protected String getFormat() {
59ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa        return SmsConstants.FORMAT_3GPP2;
60ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa    }
61ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa
620d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    /**
630d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     * Send the SMS status report to the dispatcher thread to process.
640d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     * @param sms the CDMA SMS message containing the status report
650d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     */
660d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    void sendStatusReportMessage(SmsMessage sms) {
670d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        if (VDBG) Rlog.d(TAG, "sending EVENT_HANDLE_STATUS_REPORT message");
680d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        sendMessage(obtainMessage(EVENT_HANDLE_STATUS_REPORT, sms));
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
720d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    protected void handleStatusReport(Object o) {
730d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        if (o instanceof SmsMessage) {
740d4bcdf379842af4b6304809156971e926f374f0Jake Hamby            if (VDBG) Rlog.d(TAG, "calling handleCdmaStatusReport()");
750d4bcdf379842af4b6304809156971e926f374f0Jake Hamby            handleCdmaStatusReport((SmsMessage) o);
760d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        } else {
770d4bcdf379842af4b6304809156971e926f374f0Jake Hamby            Rlog.e(TAG, "handleStatusReport() called for object type " + o.getClass().getName());
780d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        }
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
810d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    /**
820d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     * Called from parent class to handle status report from {@code CdmaInboundSmsHandler}.
830d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     * @param sms the CDMA SMS message to process
840d4bcdf379842af4b6304809156971e926f374f0Jake Hamby     */
850d4bcdf379842af4b6304809156971e926f374f0Jake Hamby    void handleCdmaStatusReport(SmsMessage sms) {
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0, count = deliveryPendingList.size(); i < count; i++) {
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            SmsTracker tracker = deliveryPendingList.get(i);
8822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (tracker.mMessageRef == sms.mMessageRef) {
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Found it.  Remove from list and broadcast.
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                deliveryPendingList.remove(i);
910217e2d6e60f7edd95407c7b385a627da9f1c1e3David Braun                // Update the message status (COMPLETE)
920217e2d6e60f7edd95407c7b385a627da9f1c1e3David Braun                tracker.updateSentMessageStatus(mContext, Sms.STATUS_COMPLETE);
930217e2d6e60f7edd95407c7b385a627da9f1c1e3David Braun
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                PendingIntent intent = tracker.mDeliveryIntent;
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Intent fillIn = new Intent();
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                fillIn.putExtra("pdu", sms.getPdu());
971260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                fillIn.putExtra("format", getFormat());
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                try {
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    intent.send(mContext, Activity.RESULT_OK, fillIn);
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } catch (CanceledException ex) {}
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;  // Only expect to see one tracker matching this message.
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@inheritDoc} */
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void sendData(String destAddr, String scAddr, int destPort,
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) {
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu(
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                scAddr, destAddr, destPort, data, (deliveryIntent != null));
112ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa        HashMap map = getSmsTrackerMap(destAddr, scAddr, destPort, data, pdu);
113c99dab56e20222b28cbc6238645feac938f1c333Ye Wen        SmsTracker tracker = getSmsTracker(map, sentIntent, deliveryIntent, getFormat(),
11452a98d0a37731f48a316bc79fbc2c5a0f00a5e58Ye Wen                null /*messageUri*/, false /*isExpectMore*/, null /*fullMessageText*/,
11552a98d0a37731f48a316bc79fbc2c5a0f00a5e58Ye Wen                false /*isText*/);
1168215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang
1178215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        String carrierPackage = getCarrierAppPackageName();
1188215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        if (carrierPackage != null) {
1198215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            Rlog.d(TAG, "Found carrier package.");
1208215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            DataSmsSender smsSender = new DataSmsSender(tracker);
1218215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            smsSender.sendSmsByCarrierApp(carrierPackage, new SmsSenderCallback(smsSender));
1228215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        } else {
1238215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            Rlog.v(TAG, "No carrier package.");
1248215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            sendSubmitPdu(tracker);
1258215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        }
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@inheritDoc} */
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
130b29851580bba4a13ddbf7a534d8b09295eb2c60fYe Wen    protected void sendText(String destAddr, String scAddr, String text, PendingIntent sentIntent,
131b29851580bba4a13ddbf7a534d8b09295eb2c60fYe Wen            PendingIntent deliveryIntent, Uri messageUri, String callingPkg) {
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu(
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                scAddr, destAddr, text, (deliveryIntent != null), null);
134c99dab56e20222b28cbc6238645feac938f1c333Ye Wen        if (pdu != null) {
135c99dab56e20222b28cbc6238645feac938f1c333Ye Wen            HashMap map = getSmsTrackerMap(destAddr, scAddr, text, pdu);
136c99dab56e20222b28cbc6238645feac938f1c333Ye Wen            SmsTracker tracker = getSmsTracker(map, sentIntent, deliveryIntent, getFormat(),
13752a98d0a37731f48a316bc79fbc2c5a0f00a5e58Ye Wen                    messageUri, false /*isExpectMore*/, text, true /*isText*/);
1388215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang
1398215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            String carrierPackage = getCarrierAppPackageName();
1408215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            if (carrierPackage != null) {
1418215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang                Rlog.d(TAG, "Found carrier package.");
1428215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang                TextSmsSender smsSender = new TextSmsSender(tracker);
1438215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang                smsSender.sendSmsByCarrierApp(carrierPackage, new SmsSenderCallback(smsSender));
1448215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            } else {
1458215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang                Rlog.v(TAG, "No carrier package.");
1468215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang                sendSubmitPdu(tracker);
1478215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            }
148c99dab56e20222b28cbc6238645feac938f1c333Ye Wen        } else {
149c99dab56e20222b28cbc6238645feac938f1c333Ye Wen            Rlog.e(TAG, "CdmaSMSDispatcher.sendText(): getSubmitPdu() returned null");
150c99dab56e20222b28cbc6238645feac938f1c333Ye Wen        }
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@inheritDoc} */
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
15563418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni    protected void injectSmsPdu(byte[] pdu, String format, PendingIntent receivedIntent) {
15663418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni        throw new IllegalStateException("This method must be called only on ImsSMSDispatcher");
15763418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni    }
15863418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni
15963418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni    /** {@inheritDoc} */
16063418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni    @Override
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected GsmAlphabet.TextEncodingDetails calculateLength(CharSequence messageBody,
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean use7bitOnly) {
16343eaf7ebbdffd1791c4b9cf0dffebdd371a0210cAmit Mahajan        return SmsMessage.calculateLength(messageBody, use7bitOnly, false);
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@inheritDoc} */
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1688215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    protected SmsTracker getNewSubmitPduTracker(String destinationAddress, String scAddress,
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String message, SmsHeader smsHeader, int encoding,
170c99dab56e20222b28cbc6238645feac938f1c333Ye Wen            PendingIntent sentIntent, PendingIntent deliveryIntent, boolean lastPart,
1714bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wen            AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri,
1724bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wen            String fullMessageText) {
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        UserData uData = new UserData();
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        uData.payloadStr = message;
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        uData.userDataHeader = smsHeader;
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (encoding == SmsConstants.ENCODING_7BIT) {
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            uData.msgEncoding = UserData.ENCODING_GSM_7BIT_ALPHABET;
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else { // assume UTF-16
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            uData.msgEncoding = UserData.ENCODING_UNICODE_16;
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        uData.msgEncodingSet = true;
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /* By setting the statusReportRequested bit only for the
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * last message fragment, this will result in only one
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * callback to the sender when that last fragment delivery
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * has been acknowledged. */
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SmsMessage.SubmitPdu submitPdu = SmsMessage.getSubmitPdu(destinationAddress,
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                uData, (deliveryIntent != null) && lastPart);
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa        HashMap map = getSmsTrackerMap(destinationAddress, scAddress,
1911260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                message, submitPdu);
1928215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        return getSmsTracker(map, sentIntent, deliveryIntent,
1934bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wen                getFormat(), unsentPartCount, anyPartFailed, messageUri, smsHeader,
19452a98d0a37731f48a316bc79fbc2c5a0f00a5e58Ye Wen                false /*isExpextMore*/, fullMessageText, true /*isText*/);
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1978215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    @Override
1981260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    protected void sendSubmitPdu(SmsTracker tracker) {
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (SystemProperties.getBoolean(TelephonyProperties.PROPERTY_INECM_MODE, false)) {
200cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            if (VDBG) {
20199c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.d(TAG, "Block SMS in Emergency Callback mode");
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
203c99dab56e20222b28cbc6238645feac938f1c333Ye Wen            tracker.onFailed(mContext, SmsManager.RESULT_ERROR_NO_SERVICE, 0/*errorCode*/);
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2061260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        sendRawPdu(tracker);
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** {@inheritDoc} */
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void sendSms(SmsTracker tracker) {
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        HashMap<String, Object> map = tracker.mData;
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2140d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        // byte[] smsc = (byte[]) map.get("smsc");  // unused for CDMA
2150d4bcdf379842af4b6304809156971e926f374f0Jake Hamby        byte[] pdu = (byte[]) map.get("pdu");
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
217f653f91baeb35b18a47c8f80b6ca1b1361dea238Ji Yang        Rlog.d(TAG, "sendSms: "
2188d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang                + " isIms()=" + isIms()
2198d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang                + " mRetryCount=" + tracker.mRetryCount
2208d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang                + " mImsRetry=" + tracker.mImsRetry
2218d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang                + " mMessageRef=" + tracker.mMessageRef
2228d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang                + " SS=" + mPhone.getServiceState().getState());
2238d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang
2248215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        sendSmsByPstn(tracker);
2258d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang    }
2268d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang
2278d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang    /** {@inheritDoc} */
2288d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang    @Override
2298d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang    protected void sendSmsByPstn(SmsTracker tracker) {
230a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal        int ss = mPhone.getServiceState().getState();
231a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal        // if sms over IMS is not supported on data and voice is not available...
232a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal        if (!isIms() && ss != ServiceState.STATE_IN_SERVICE) {
233a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal            tracker.onFailed(mContext, getNotInServiceError(ss), 0/*errorCode*/);
234a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal            return;
235a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal        }
236a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal
2378d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang        Message reply = obtainMessage(EVENT_SEND_SMS_COMPLETE, tracker);
2388d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang        byte[] pdu = (byte[]) tracker.mData.get("pdu");
2391260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
2404eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying        int currentDataNetwork = mPhone.getServiceState().getDataNetworkType();
2414eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying        boolean imsSmsDisabled = (currentDataNetwork == TelephonyManager.NETWORK_TYPE_EHRPD
2424eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying                    || (currentDataNetwork == TelephonyManager.NETWORK_TYPE_LTE
2434eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying                    && !mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()))
2444eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying                    && mPhone.getServiceState().getVoiceNetworkType()
2454eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying                    == TelephonyManager.NETWORK_TYPE_1xRTT
2464f5f5e2aab6a42cdb9493bddcb3c3d9530bc778fEtan Cohen                    && ((CDMAPhone) mPhone).mCT.mState != PhoneConstants.State.IDLE;
2474eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying
2481260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        // sms over cdma is used:
2491260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        //   if sms over IMS is not supported AND
2501260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        //   this is not a retry case after sms over IMS failed
2511260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        //     indicated by mImsRetry > 0
2524eb8e4c8dc684e2109276ea2ec4ce25d3b188568Xia Ying        if (0 == tracker.mImsRetry && !isIms() || imsSmsDisabled) {
2531260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            mCi.sendCdmaSms(pdu, reply);
2541260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        } else {
2551260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            mCi.sendImsCdmaSms(pdu, tracker.mImsRetry, tracker.mMessageRef, reply);
2561260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            // increment it here, so in case of SMS_FAIL_RETRY over IMS
2571260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            // next retry will be sent using IMS request again.
2581260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            tracker.mImsRetry++;
2591260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        }
2601260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
262