GsmSMSDispatcher.java revision a8f8c5a113a66de4854f4fb13a5825eb0705bd59
1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/* 2c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Copyright (C) 2006 The Android Open Source Project 3c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 4c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * you may not use this file except in compliance with the License. 6c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * You may obtain a copy of the License at 7c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 8c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 10c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Unless required by applicable law or agreed to in writing, software 11c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See the License for the specific language governing permissions and 14c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * limitations under the License. 15c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 16c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 17c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepackage com.android.internal.telephony.gsm; 18c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 19c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.app.Activity; 20c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.app.PendingIntent; 21c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.app.PendingIntent.CanceledException; 22c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Intent; 23c99dab56e20222b28cbc6238645feac938f1c333Ye Wenimport android.net.Uri; 24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.AsyncResult; 25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Message; 26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.provider.Telephony.Sms; 27c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.provider.Telephony.Sms.Intents; 28ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog; 29a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawalimport android.telephony.ServiceState; 30c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.GsmAlphabet; 32ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowaimport com.android.internal.telephony.ImsSMSDispatcher; 33ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowaimport com.android.internal.telephony.InboundSmsHandler; 34c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.PhoneBase; 35c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.SMSDispatcher; 360d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport com.android.internal.telephony.SmsConstants; 37c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.SmsHeader; 38c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.SmsUsageMonitor; 391260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport com.android.internal.telephony.uicc.IccRecords; 40d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccUtils; 411260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport com.android.internal.telephony.uicc.UiccCardApplication; 421260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport com.android.internal.telephony.uicc.UiccController; 43c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport java.util.HashMap; 45c99dab56e20222b28cbc6238645feac938f1c333Ye Wenimport java.util.concurrent.atomic.AtomicBoolean; 46c99dab56e20222b28cbc6238645feac938f1c333Ye Wenimport java.util.concurrent.atomic.AtomicInteger; 471260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport java.util.concurrent.atomic.AtomicReference; 48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic final class GsmSMSDispatcher extends SMSDispatcher { 50cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private static final String TAG = "GsmSMSDispatcher"; 511260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa private static final boolean VDBG = false; 521260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa protected UiccController mUiccController = null; 531260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa private AtomicReference<IccRecords> mIccRecords = new AtomicReference<IccRecords>(); 541260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa private AtomicReference<UiccCardApplication> mUiccApplication = 551260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa new AtomicReference<UiccCardApplication>(); 561260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa private GsmInboundSmsHandler mGsmInboundSmsHandler; 57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Status report received */ 59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static final int EVENT_NEW_SMS_STATUS_REPORT = 100; 60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 61ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa public GsmSMSDispatcher(PhoneBase phone, SmsUsageMonitor usageMonitor, 62ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa ImsSMSDispatcher imsSMSDispatcher, 631260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa GsmInboundSmsHandler gsmInboundSmsHandler) { 64ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa super(phone, usageMonitor, imsSMSDispatcher); 6522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.setOnSmsStatus(this, EVENT_NEW_SMS_STATUS_REPORT, null); 661260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa mGsmInboundSmsHandler = gsmInboundSmsHandler; 67ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa mUiccController = UiccController.getInstance(); 68ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null); 691260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa Rlog.d(TAG, "GsmSMSDispatcher created"); 70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 740d4bcdf379842af4b6304809156971e926f374f0Jake Hamby super.dispose(); 7522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.unSetOnSmsStatus(this); 76ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa mUiccController.unregisterForIccChanged(this); 77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected String getFormat() { 81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return SmsConstants.FORMAT_3GPP; 82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Handles 3GPP format-specific events coming from the phone stack. 86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Other events are handled by {@link SMSDispatcher#handleMessage}. 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param msg the message to handle 89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void handleMessage(Message msg) { 92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (msg.what) { 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_NEW_SMS_STATUS_REPORT: 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleStatusReport((AsyncResult) msg.obj); 95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 971260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa case EVENT_NEW_ICC_SMS: 981260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa // pass to InboundSmsHandler to process 991260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa mGsmInboundSmsHandler.sendMessage(InboundSmsHandler.EVENT_NEW_SMS, msg.obj); 1001260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa break; 1011260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa 1021260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa case EVENT_ICC_CHANGED: 1031260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa onUpdateIccAvailability(); 1041260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa break; 1051260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville super.handleMessage(msg); 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when a status report is received. This should correspond to 113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * a previously successful SEND. 114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param ar AsyncResult passed into the message handler. ar.result should 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * be a String representing the status report PDU, as ASCII hex. 117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void handleStatusReport(AsyncResult ar) { 119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String pduString = (String) ar.result; 120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SmsMessage sms = SmsMessage.newFromCDS(pduString); 121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (sms != null) { 123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int tpStatus = sms.getStatus(); 12422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville int messageRef = sms.mMessageRef; 125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (int i = 0, count = deliveryPendingList.size(); i < count; i++) { 126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SmsTracker tracker = deliveryPendingList.get(i); 127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (tracker.mMessageRef == messageRef) { 128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Found it. Remove from list and broadcast. 129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if(tpStatus >= Sms.STATUS_FAILED || tpStatus < Sms.STATUS_PENDING ) { 130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville deliveryPendingList.remove(i); 1310217e2d6e60f7edd95407c7b385a627da9f1c1e3David Braun // Update the message status (COMPLETE or FAILED) 1320217e2d6e60f7edd95407c7b385a627da9f1c1e3David Braun tracker.updateSentMessageStatus(mContext, tpStatus); 133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville PendingIntent intent = tracker.mDeliveryIntent; 135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Intent fillIn = new Intent(); 136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fillIn.putExtra("pdu", IccUtils.hexStringToBytes(pduString)); 1371260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa fillIn.putExtra("format", getFormat()); 138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville try { 139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville intent.send(mContext, Activity.RESULT_OK, fillIn); 140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } catch (CanceledException ex) {} 141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Only expect to see one tracker matching this messageref 143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1470d4bcdf379842af4b6304809156971e926f374f0Jake Hamby mCi.acknowledgeLastIncomingGsmSms(true, Intents.RESULT_SMS_HANDLED, null); 148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** {@inheritDoc} */ 151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void sendData(String destAddr, String scAddr, int destPort, 153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) { 154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu( 155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville scAddr, destAddr, destPort, data, (deliveryIntent != null)); 156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (pdu != null) { 157ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa HashMap map = getSmsTrackerMap(destAddr, scAddr, destPort, data, pdu); 158c99dab56e20222b28cbc6238645feac938f1c333Ye Wen SmsTracker tracker = getSmsTracker(map, sentIntent, deliveryIntent, getFormat(), 15952a98d0a37731f48a316bc79fbc2c5a0f00a5e58Ye Wen null /*messageUri*/, false /*isExpectMore*/, null /*fullMessageText*/, 160a8f8c5a113a66de4854f4fb13a5825eb0705bd59Ji Yang false /*isText*/, true /*persistMessage*/); 1618215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang 1628215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang String carrierPackage = getCarrierAppPackageName(); 1638215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang if (carrierPackage != null) { 1648215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang Rlog.d(TAG, "Found carrier package."); 1658215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang DataSmsSender smsSender = new DataSmsSender(tracker); 1668215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang smsSender.sendSmsByCarrierApp(carrierPackage, new SmsSenderCallback(smsSender)); 1678215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang } else { 1688215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang Rlog.v(TAG, "No carrier package."); 1698215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang sendRawPdu(tracker); 1708215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang } 171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 172ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e(TAG, "GsmSMSDispatcher.sendData(): getSubmitPdu() returned null"); 173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** {@inheritDoc} */ 177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 178b29851580bba4a13ddbf7a534d8b09295eb2c60fYe Wen protected void sendText(String destAddr, String scAddr, String text, PendingIntent sentIntent, 179a8f8c5a113a66de4854f4fb13a5825eb0705bd59Ji Yang PendingIntent deliveryIntent, Uri messageUri, String callingPkg, 180a8f8c5a113a66de4854f4fb13a5825eb0705bd59Ji Yang boolean persistMessage) { 181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu( 182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville scAddr, destAddr, text, (deliveryIntent != null)); 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (pdu != null) { 184ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa HashMap map = getSmsTrackerMap(destAddr, scAddr, text, pdu); 185c99dab56e20222b28cbc6238645feac938f1c333Ye Wen SmsTracker tracker = getSmsTracker(map, sentIntent, deliveryIntent, getFormat(), 186a8f8c5a113a66de4854f4fb13a5825eb0705bd59Ji Yang messageUri, false /*isExpectMore*/, text /*fullMessageText*/, true /*isText*/, 187a8f8c5a113a66de4854f4fb13a5825eb0705bd59Ji Yang persistMessage); 1888215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang 1898215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang String carrierPackage = getCarrierAppPackageName(); 1908215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang if (carrierPackage != null) { 1918215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang Rlog.d(TAG, "Found carrier package."); 1928215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang TextSmsSender smsSender = new TextSmsSender(tracker); 1938215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang smsSender.sendSmsByCarrierApp(carrierPackage, new SmsSenderCallback(smsSender)); 1948215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang } else { 1958215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang Rlog.v(TAG, "No carrier package."); 1968215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang sendRawPdu(tracker); 1978215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang } 198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 199ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e(TAG, "GsmSMSDispatcher.sendText(): getSubmitPdu() returned null"); 200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** {@inheritDoc} */ 204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 20563418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni protected void injectSmsPdu(byte[] pdu, String format, PendingIntent receivedIntent) { 20663418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni throw new IllegalStateException("This method must be called only on ImsSMSDispatcher"); 20763418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni } 20863418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni 20963418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni /** {@inheritDoc} */ 21063418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni @Override 211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected GsmAlphabet.TextEncodingDetails calculateLength(CharSequence messageBody, 212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean use7bitOnly) { 213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return SmsMessage.calculateLength(messageBody, use7bitOnly); 214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** {@inheritDoc} */ 217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 2188215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang protected SmsTracker getNewSubmitPduTracker(String destinationAddress, String scAddress, 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String message, SmsHeader smsHeader, int encoding, 220c99dab56e20222b28cbc6238645feac938f1c333Ye Wen PendingIntent sentIntent, PendingIntent deliveryIntent, boolean lastPart, 2214bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wen AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri, 2224bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wen String fullMessageText) { 223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu(scAddress, destinationAddress, 224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville message, deliveryIntent != null, SmsHeader.toByteArray(smsHeader), 225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville encoding, smsHeader.languageTable, smsHeader.languageShiftTable); 226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (pdu != null) { 227ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa HashMap map = getSmsTrackerMap(destinationAddress, scAddress, 2281260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa message, pdu); 2298215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang return getSmsTracker(map, sentIntent, 23078d39a9fab86a26f4f39585af5cfe2a07c756fceShishir Agrawal deliveryIntent, getFormat(), unsentPartCount, anyPartFailed, messageUri, 231a8f8c5a113a66de4854f4fb13a5825eb0705bd59Ji Yang smsHeader, !lastPart, fullMessageText, true /*isText*/, 232a8f8c5a113a66de4854f4fb13a5825eb0705bd59Ji Yang false /*persistMessage*/); 233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 234ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e(TAG, "GsmSMSDispatcher.sendNewSubmitPdu(): getSubmitPdu() returned null"); 2358215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang return null; 236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2398215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang @Override 2408215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang protected void sendSubmitPdu(SmsTracker tracker) { 2418215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang sendRawPdu(tracker); 2428215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang } 2438215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang 244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** {@inheritDoc} */ 245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void sendSms(SmsTracker tracker) { 247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville HashMap<String, Object> map = tracker.mData; 248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville byte pdu[] = (byte[]) map.get("pdu"); 250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 251454c5783e7695feec276325920550b2d4dcc3e16Rika Brooks if (tracker.mRetryCount > 0) { 252454c5783e7695feec276325920550b2d4dcc3e16Rika Brooks Rlog.d(TAG, "sendSms: " 253454c5783e7695feec276325920550b2d4dcc3e16Rika Brooks + " mRetryCount=" + tracker.mRetryCount 254454c5783e7695feec276325920550b2d4dcc3e16Rika Brooks + " mMessageRef=" + tracker.mMessageRef 255454c5783e7695feec276325920550b2d4dcc3e16Rika Brooks + " SS=" + mPhone.getServiceState().getState()); 256454c5783e7695feec276325920550b2d4dcc3e16Rika Brooks 257454c5783e7695feec276325920550b2d4dcc3e16Rika Brooks // per TS 23.040 Section 9.2.3.6: If TP-MTI SMS-SUBMIT (0x01) type 258454c5783e7695feec276325920550b2d4dcc3e16Rika Brooks // TP-RD (bit 2) is 1 for retry 259454c5783e7695feec276325920550b2d4dcc3e16Rika Brooks // and TP-MR is set to previously failed sms TP-MR 260454c5783e7695feec276325920550b2d4dcc3e16Rika Brooks if (((0x01 & pdu[0]) == 0x01)) { 261454c5783e7695feec276325920550b2d4dcc3e16Rika Brooks pdu[0] |= 0x04; // TP-RD 262454c5783e7695feec276325920550b2d4dcc3e16Rika Brooks pdu[1] = (byte) tracker.mMessageRef; // TP-MR 263454c5783e7695feec276325920550b2d4dcc3e16Rika Brooks } 264454c5783e7695feec276325920550b2d4dcc3e16Rika Brooks } 2651260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa Rlog.d(TAG, "sendSms: " 2668d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang + " isIms()=" + isIms() 2678d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang + " mRetryCount=" + tracker.mRetryCount 2688d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang + " mImsRetry=" + tracker.mImsRetry 2698d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang + " mMessageRef=" + tracker.mMessageRef 2708d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang + " SS=" + mPhone.getServiceState().getState()); 2718d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang 2728215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang sendSmsByPstn(tracker); 2738d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang } 2748d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang 2758d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang /** {@inheritDoc} */ 2768d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang @Override 2778d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang protected void sendSmsByPstn(SmsTracker tracker) { 278a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal int ss = mPhone.getServiceState().getState(); 279a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal // if sms over IMS is not supported on data and voice is not available... 280a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal if (!isIms() && ss != ServiceState.STATE_IN_SERVICE) { 281a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal tracker.onFailed(mContext, getNotInServiceError(ss), 0/*errorCode*/); 282a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal return; 283a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal } 284a0c22039b77054d659151537896c1db90c7057f7Shishir Agrawal 2858d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang HashMap<String, Object> map = tracker.mData; 2868d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang 2878d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang byte smsc[] = (byte[]) map.get("smsc"); 2888d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang byte[] pdu = (byte[]) map.get("pdu"); 2898d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang Message reply = obtainMessage(EVENT_SEND_SMS_COMPLETE, tracker); 2901260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa 2911260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa // sms over gsm is used: 2921260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa // if sms over IMS is not supported AND 2931260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa // this is not a retry case after sms over IMS failed 2941260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa // indicated by mImsRetry > 0 2951260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa if (0 == tracker.mImsRetry && !isIms()) { 2961260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa if (tracker.mRetryCount > 0) { 2971260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa // per TS 23.040 Section 9.2.3.6: If TP-MTI SMS-SUBMIT (0x01) type 2981260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa // TP-RD (bit 2) is 1 for retry 2991260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa // and TP-MR is set to previously failed sms TP-MR 3001260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa if (((0x01 & pdu[0]) == 0x01)) { 3011260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa pdu[0] |= 0x04; // TP-RD 3021260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa pdu[1] = (byte) tracker.mMessageRef; // TP-MR 3031260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 3041260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 3056ad88a8a2caf739e78c8d5f7f50fc7fa84a07ca7Chaitanya Saggurthi if (tracker.mRetryCount == 0 && tracker.mExpectMore) { 3066ad88a8a2caf739e78c8d5f7f50fc7fa84a07ca7Chaitanya Saggurthi mCi.sendSMSExpectMore(IccUtils.bytesToHexString(smsc), 3076ad88a8a2caf739e78c8d5f7f50fc7fa84a07ca7Chaitanya Saggurthi IccUtils.bytesToHexString(pdu), reply); 3086ad88a8a2caf739e78c8d5f7f50fc7fa84a07ca7Chaitanya Saggurthi } else { 3096ad88a8a2caf739e78c8d5f7f50fc7fa84a07ca7Chaitanya Saggurthi mCi.sendSMS(IccUtils.bytesToHexString(smsc), 3106ad88a8a2caf739e78c8d5f7f50fc7fa84a07ca7Chaitanya Saggurthi IccUtils.bytesToHexString(pdu), reply); 3116ad88a8a2caf739e78c8d5f7f50fc7fa84a07ca7Chaitanya Saggurthi } 3121260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } else { 3131260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa mCi.sendImsGsmSms(IccUtils.bytesToHexString(smsc), 3141260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa IccUtils.bytesToHexString(pdu), tracker.mImsRetry, 3151260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa tracker.mMessageRef, reply); 3161260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa // increment it here, so in case of SMS_FAIL_RETRY over IMS 3171260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa // next retry will be sent using IMS request again. 3181260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa tracker.mImsRetry++; 3191260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 3201260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 3211260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa 3221260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa protected UiccCardApplication getUiccCardApplication() { 323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Rlog.d(TAG, "GsmSMSDispatcher: subId = " + mPhone.getSubId() 324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville + " slotId = " + mPhone.getPhoneId()); 325a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mUiccController.getUiccCardApplication(mPhone.getPhoneId(), 326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville UiccController.APP_FAM_3GPP); 3271260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 3281260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa 3291260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa private void onUpdateIccAvailability() { 3301260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa if (mUiccController == null ) { 3311260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa return; 3321260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 3331260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa 3341260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa UiccCardApplication newUiccApplication = getUiccCardApplication(); 3351260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa 3361260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa UiccCardApplication app = mUiccApplication.get(); 3371260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa if (app != newUiccApplication) { 3381260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa if (app != null) { 3391260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa Rlog.d(TAG, "Removing stale icc objects."); 3401260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa if (mIccRecords.get() != null) { 3411260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa mIccRecords.get().unregisterForNewSms(this); 3421260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 3431260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa mIccRecords.set(null); 3441260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa mUiccApplication.set(null); 3451260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 3461260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa if (newUiccApplication != null) { 3471260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa Rlog.d(TAG, "New Uicc application found"); 3481260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa mUiccApplication.set(newUiccApplication); 3491260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa mIccRecords.set(newUiccApplication.getIccRecords()); 3501260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa if (mIccRecords.get() != null) { 3511260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa mIccRecords.get().registerForNewSms(this, EVENT_NEW_ICC_SMS, null); 3521260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 3531260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 3541260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 3551260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa } 356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 357