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