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