11260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa/*
21260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa * Copyright (C) 2006 The Android Open Source Project
31260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa *
41260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa * Licensed under the Apache License, Version 2.0 (the "License");
51260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa * you may not use this file except in compliance with the License.
61260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa * You may obtain a copy of the License at
71260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa *
81260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa *      http://www.apache.org/licenses/LICENSE-2.0
91260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa *
101260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa * Unless required by applicable law or agreed to in writing, software
111260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa * distributed under the License is distributed on an "AS IS" BASIS,
121260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa * See the License for the specific language governing permissions and
141260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa * limitations under the License.
151260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa */
161260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
171260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowapackage com.android.internal.telephony;
181260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
191260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport static android.telephony.SmsManager.RESULT_ERROR_GENERIC_FAILURE;
201260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport android.app.PendingIntent;
211260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport android.app.PendingIntent.CanceledException;
22c99dab56e20222b28cbc6238645feac938f1c333Ye Wenimport android.net.Uri;
231260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport android.os.AsyncResult;
241260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport android.os.Message;
251260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport android.provider.Telephony.Sms.Intents;
261260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport android.telephony.Rlog;
271260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
284bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wenimport com.android.internal.telephony.cdma.CdmaInboundSmsHandler;
291260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport com.android.internal.telephony.cdma.CdmaSMSDispatcher;
301260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowaimport com.android.internal.telephony.gsm.GsmInboundSmsHandler;
314bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wenimport com.android.internal.telephony.gsm.GsmSMSDispatcher;
324bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wen
334bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wenimport java.util.ArrayList;
344bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wenimport java.util.HashMap;
354bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wenimport java.util.List;
364bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wenimport java.util.concurrent.atomic.AtomicBoolean;
374bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wenimport java.util.concurrent.atomic.AtomicInteger;
381260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
391260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowapublic final class ImsSMSDispatcher extends SMSDispatcher {
401260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    private static final String TAG = "RIL_ImsSms";
411260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
421260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    private SMSDispatcher mCdmaDispatcher;
431260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    private SMSDispatcher mGsmDispatcher;
441260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
45ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa    private GsmInboundSmsHandler mGsmInboundSmsHandler;
46ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa    private CdmaInboundSmsHandler mCdmaInboundSmsHandler;
47ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa
481260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
491260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    /** true if IMS is registered and sms is supported, false otherwise.*/
501260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    private boolean mIms = false;
511260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    private String mImsSmsFormat = SmsConstants.FORMAT_UNKNOWN;
521260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
531260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    public ImsSMSDispatcher(PhoneBase phone, SmsStorageMonitor storageMonitor,
541260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            SmsUsageMonitor usageMonitor) {
55ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa        super(phone, usageMonitor, null);
561260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        Rlog.d(TAG, "ImsSMSDispatcher created");
571260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
58ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa        // Create dispatchers, inbound SMS handlers and
59ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa        // broadcast undelivered messages in raw table.
60ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa        mCdmaDispatcher = new CdmaSMSDispatcher(phone, usageMonitor, this);
611260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mGsmInboundSmsHandler = GsmInboundSmsHandler.makeInboundSmsHandler(phone.getContext(),
621260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                storageMonitor, phone);
631260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mCdmaInboundSmsHandler = CdmaInboundSmsHandler.makeInboundSmsHandler(phone.getContext(),
641260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                storageMonitor, phone, (CdmaSMSDispatcher) mCdmaDispatcher);
65ace9a749c5a2a5e07527f728b7331423d16c36cdSukanya Rajkhowa        mGsmDispatcher = new GsmSMSDispatcher(phone, usageMonitor, this, mGsmInboundSmsHandler);
661260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        Thread broadcastThread = new Thread(new SmsBroadcastUndelivered(phone.getContext(),
671260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                mGsmInboundSmsHandler, mCdmaInboundSmsHandler));
681260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        broadcastThread.start();
691260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
701260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mCi.registerForOn(this, EVENT_RADIO_ON, null);
711260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mCi.registerForImsNetworkStateChanged(this, EVENT_IMS_STATE_CHANGED, null);
721260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
731260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
741260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    /* Updates the phone object when there is a change */
751260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    @Override
761260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    protected void updatePhoneObject(PhoneBase phone) {
771260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        Rlog.d(TAG, "In IMS updatePhoneObject ");
781260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        super.updatePhoneObject(phone);
791260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mCdmaDispatcher.updatePhoneObject(phone);
801260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mGsmDispatcher.updatePhoneObject(phone);
81d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville        mGsmInboundSmsHandler.updatePhoneObject(phone);
82d2feaf918ab0c1173d4ada182532e48d0c0d3f77Wink Saville        mCdmaInboundSmsHandler.updatePhoneObject(phone);
831260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
841260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
851260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    public void dispose() {
861260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mCi.unregisterForOn(this);
871260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mCi.unregisterForImsNetworkStateChanged(this);
881260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mGsmDispatcher.dispose();
891260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mCdmaDispatcher.dispose();
901260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mGsmInboundSmsHandler.dispose();
911260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mCdmaInboundSmsHandler.dispose();
921260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
931260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
941260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    /**
951260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     * Handles events coming from the phone stack. Overridden from handler.
961260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     *
971260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     * @param msg the message to handle
981260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     */
991260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    @Override
1001260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    public void handleMessage(Message msg) {
1011260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        AsyncResult ar;
1021260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
1031260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        switch (msg.what) {
1041260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        case EVENT_RADIO_ON:
1051260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        case EVENT_IMS_STATE_CHANGED: // received unsol
1061260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            mCi.getImsRegistrationState(this.obtainMessage(EVENT_IMS_STATE_DONE));
1071260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            break;
1081260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
1091260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        case EVENT_IMS_STATE_DONE:
1101260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            ar = (AsyncResult) msg.obj;
1111260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
1121260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            if (ar.exception == null) {
1131260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                updateImsInfo(ar);
1141260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            } else {
1151260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                Rlog.e(TAG, "IMS State query failed with exp "
1161260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                        + ar.exception);
1171260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            }
1181260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            break;
1191260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
1201260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        default:
1211260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            super.handleMessage(msg);
1221260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        }
1231260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
1241260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
1251260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    private void setImsSmsFormat(int format) {
1261260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        // valid format?
1271260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        switch (format) {
1281260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            case PhoneConstants.PHONE_TYPE_GSM:
1291260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                mImsSmsFormat = "3gpp";
1301260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                break;
1311260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            case PhoneConstants.PHONE_TYPE_CDMA:
1321260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                mImsSmsFormat = "3gpp2";
1331260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                break;
1341260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            default:
1351260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                mImsSmsFormat = "unknown";
1361260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                break;
1371260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        }
1381260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
1391260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
1401260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    private void updateImsInfo(AsyncResult ar) {
1411260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        int[] responseArray = (int[])ar.result;
1421260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
1431260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        mIms = false;
1441260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        if (responseArray[0] == 1) {  // IMS is registered
1451260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            Rlog.d(TAG, "IMS is registered!");
1461260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            mIms = true;
1471260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        } else {
1481260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            Rlog.d(TAG, "IMS is NOT registered!");
1491260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        }
1501260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
1511260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        setImsSmsFormat(responseArray[1]);
1521260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
1531260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        if (("unknown".equals(mImsSmsFormat))) {
1541260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            Rlog.e(TAG, "IMS format was unknown!");
1551260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            // failed to retrieve valid IMS SMS format info, set IMS to unregistered
1561260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            mIms = false;
1571260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        }
1581260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
1591260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
1601260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    @Override
1611260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    protected void sendData(String destAddr, String scAddr, int destPort,
1621260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) {
1631260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        if (isCdmaMo()) {
1641260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            mCdmaDispatcher.sendData(destAddr, scAddr, destPort,
1651260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                    data, sentIntent, deliveryIntent);
1661260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        } else {
1671260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            mGsmDispatcher.sendData(destAddr, scAddr, destPort,
1681260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                    data, sentIntent, deliveryIntent);
1691260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        }
1701260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
1711260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
1721260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    @Override
1731260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    protected void sendMultipartText(String destAddr, String scAddr,
1741260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            ArrayList<String> parts, ArrayList<PendingIntent> sentIntents,
175b29851580bba4a13ddbf7a534d8b09295eb2c60fYe Wen            ArrayList<PendingIntent> deliveryIntents, Uri messageUri, String callingPkg) {
1761260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        if (isCdmaMo()) {
1771260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            mCdmaDispatcher.sendMultipartText(destAddr, scAddr,
178b29851580bba4a13ddbf7a534d8b09295eb2c60fYe Wen                    parts, sentIntents, deliveryIntents, messageUri, callingPkg);
1791260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        } else {
1801260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            mGsmDispatcher.sendMultipartText(destAddr, scAddr,
181b29851580bba4a13ddbf7a534d8b09295eb2c60fYe Wen                    parts, sentIntents, deliveryIntents, messageUri, callingPkg);
1821260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        }
1831260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
1841260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
1851260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    @Override
1861260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    protected void sendSms(SmsTracker tracker) {
1871260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        //  sendSms is a helper function to other send functions, sendText/Data...
1881260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        //  it is not part of ISms.stub
1891260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        Rlog.e(TAG, "sendSms should never be called from here!");
1901260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
1911260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
1921260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    @Override
1938d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang    protected void sendSmsByPstn(SmsTracker tracker) {
1948d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang        // This function should be defined in Gsm/CdmaDispatcher.
1958d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang        Rlog.e(TAG, "sendSmsByPstn should never be called from here!");
1968d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang    }
1978d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang
1988d8e8f45200d17b78d196d8cba389fd9c547ac11Cheuksan Wang    @Override
199b29851580bba4a13ddbf7a534d8b09295eb2c60fYe Wen    protected void sendText(String destAddr, String scAddr, String text, PendingIntent sentIntent,
200b29851580bba4a13ddbf7a534d8b09295eb2c60fYe Wen            PendingIntent deliveryIntent, Uri messageUri, String callingPkg) {
2011260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        Rlog.d(TAG, "sendText");
2021260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        if (isCdmaMo()) {
2031260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            mCdmaDispatcher.sendText(destAddr, scAddr,
204b29851580bba4a13ddbf7a534d8b09295eb2c60fYe Wen                    text, sentIntent, deliveryIntent, messageUri, callingPkg);
2051260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        } else {
2061260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            mGsmDispatcher.sendText(destAddr, scAddr,
207b29851580bba4a13ddbf7a534d8b09295eb2c60fYe Wen                    text, sentIntent, deliveryIntent, messageUri, callingPkg);
2081260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        }
2091260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
2101260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
2111260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    @Override
21263418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni    protected void injectSmsPdu(byte[] pdu, String format, PendingIntent receivedIntent) {
21363418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni        Rlog.d(TAG, "ImsSMSDispatcher:injectSmsPdu");
21463418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni        try {
21563418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni            // TODO We need to decide whether we should allow injecting GSM(3gpp)
21663418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni            // SMS pdus when the phone is camping on CDMA(3gpp2) network and vice versa.
21763418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni            android.telephony.SmsMessage msg =
21863418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni                    android.telephony.SmsMessage.createFromPdu(pdu, format);
21963418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni
22063418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni            // Only class 1 SMS are allowed to be injected.
22163418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni            if (msg.getMessageClass() != android.telephony.SmsMessage.MessageClass.CLASS_1) {
22263418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni                if (receivedIntent != null)
22363418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni                    receivedIntent.send(Intents.RESULT_SMS_GENERIC_ERROR);
22463418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni                return;
22563418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni            }
22663418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni
22763418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni            AsyncResult ar = new AsyncResult(receivedIntent, msg, null);
22863418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni
22963418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni            if (format.equals(SmsConstants.FORMAT_3GPP)) {
23063418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni                Rlog.i(TAG, "ImsSMSDispatcher:injectSmsText Sending msg=" + msg +
23163418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni                        ", format=" + format + "to mGsmInboundSmsHandler");
23263418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni                mGsmInboundSmsHandler.sendMessage(InboundSmsHandler.EVENT_INJECT_SMS, ar);
23363418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni            } else if (format.equals(SmsConstants.FORMAT_3GPP2)) {
23463418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni                Rlog.i(TAG, "ImsSMSDispatcher:injectSmsText Sending msg=" + msg +
23563418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni                        ", format=" + format + "to mCdmaInboundSmsHandler");
23663418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni                mCdmaInboundSmsHandler.sendMessage(InboundSmsHandler.EVENT_INJECT_SMS, ar);
23763418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni            } else {
23863418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni                // Invalid pdu format.
23963418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni                Rlog.e(TAG, "Invalid pdu format: " + format);
2406f64a8956a101bd16c900017f7692f9284c6bdd6Anil Muthineni                if (receivedIntent != null)
2416f64a8956a101bd16c900017f7692f9284c6bdd6Anil Muthineni                    receivedIntent.send(Intents.RESULT_SMS_GENERIC_ERROR);
24263418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni            }
24363418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni        } catch (Exception e) {
24463418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni            Rlog.e(TAG, "injectSmsPdu failed: ", e);
24563418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni            try {
2466f64a8956a101bd16c900017f7692f9284c6bdd6Anil Muthineni                if (receivedIntent != null)
2476f64a8956a101bd16c900017f7692f9284c6bdd6Anil Muthineni                    receivedIntent.send(Intents.RESULT_SMS_GENERIC_ERROR);
24863418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni            } catch (CanceledException ex) {}
24963418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni        }
25063418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni    }
25163418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni
25263418bbd2a9d7cc88ae24cc5ae776c01d688fc3aAnil Muthineni    @Override
2531260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    public void sendRetrySms(SmsTracker tracker) {
2541260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        String oldFormat = tracker.mFormat;
2551260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
2561260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        // newFormat will be based on voice technology
2571260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        String newFormat =
2581260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            (PhoneConstants.PHONE_TYPE_CDMA == mPhone.getPhoneType()) ?
2591260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                    mCdmaDispatcher.getFormat() :
2601260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                        mGsmDispatcher.getFormat();
2611260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
2621260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        // was previously sent sms format match with voice tech?
2631260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        if (oldFormat.equals(newFormat)) {
2641260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            if (isCdmaFormat(newFormat)) {
2651260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                Rlog.d(TAG, "old format matched new format (cdma)");
2661260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                mCdmaDispatcher.sendSms(tracker);
2671260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                return;
2681260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            } else {
2691260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                Rlog.d(TAG, "old format matched new format (gsm)");
2701260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                mGsmDispatcher.sendSms(tracker);
2711260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                return;
2721260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            }
2731260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        }
2741260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
2751260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        // format didn't match, need to re-encode.
2761260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        HashMap map = tracker.mData;
2771260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
2781260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        // to re-encode, fields needed are:  scAddr, destAddr, and
2791260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        //   text if originally sent as sendText or
2801260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        //   data and destPort if originally sent as sendData.
2811260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        if (!( map.containsKey("scAddr") && map.containsKey("destAddr") &&
2821260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa               ( map.containsKey("text") ||
2831260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                       (map.containsKey("data") && map.containsKey("destPort"))))) {
2841260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            // should never come here...
2851260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            Rlog.e(TAG, "sendRetrySms failed to re-encode per missing fields!");
286c99dab56e20222b28cbc6238645feac938f1c333Ye Wen            tracker.onFailed(mContext, RESULT_ERROR_GENERIC_FAILURE, 0/*errorCode*/);
2871260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            return;
2881260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        }
2891260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        String scAddr = (String)map.get("scAddr");
2901260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        String destAddr = (String)map.get("destAddr");
2911260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
2921260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        SmsMessageBase.SubmitPduBase pdu = null;
2931260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        //    figure out from tracker if this was sendText/Data
2941260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        if (map.containsKey("text")) {
2951260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            Rlog.d(TAG, "sms failed was text");
2961260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            String text = (String)map.get("text");
2971260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
2981260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            if (isCdmaFormat(newFormat)) {
2991260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                Rlog.d(TAG, "old format (gsm) ==> new format (cdma)");
3001260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                pdu = com.android.internal.telephony.cdma.SmsMessage.getSubmitPdu(
3011260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                        scAddr, destAddr, text, (tracker.mDeliveryIntent != null), null);
3021260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            } else {
3031260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                Rlog.d(TAG, "old format (cdma) ==> new format (gsm)");
3041260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                pdu = com.android.internal.telephony.gsm.SmsMessage.getSubmitPdu(
3051260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                        scAddr, destAddr, text, (tracker.mDeliveryIntent != null), null);
3061260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            }
3071260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        } else if (map.containsKey("data")) {
3081260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            Rlog.d(TAG, "sms failed was data");
3091260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            byte[] data = (byte[])map.get("data");
3101260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            Integer destPort = (Integer)map.get("destPort");
3111260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
3121260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            if (isCdmaFormat(newFormat)) {
3131260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                Rlog.d(TAG, "old format (gsm) ==> new format (cdma)");
3141260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                pdu = com.android.internal.telephony.cdma.SmsMessage.getSubmitPdu(
3151260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                            scAddr, destAddr, destPort.intValue(), data,
3161260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                            (tracker.mDeliveryIntent != null));
3171260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            } else {
3181260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                Rlog.d(TAG, "old format (cdma) ==> new format (gsm)");
3191260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                pdu = com.android.internal.telephony.gsm.SmsMessage.getSubmitPdu(
3201260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                            scAddr, destAddr, destPort.intValue(), data,
3211260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                            (tracker.mDeliveryIntent != null));
3221260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            }
3231260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        }
3241260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
3251260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        // replace old smsc and pdu with newly encoded ones
3261260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        map.put("smsc", pdu.encodedScAddress);
3271260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        map.put("pdu", pdu.encodedMessage);
3281260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
3291260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        SMSDispatcher dispatcher = (isCdmaFormat(newFormat)) ?
3301260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa                mCdmaDispatcher : mGsmDispatcher;
3311260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
3321260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        tracker.mFormat = dispatcher.getFormat();
3331260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        dispatcher.sendSms(tracker);
3341260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
3351260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
3361260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    @Override
3378215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    protected void sendSubmitPdu(SmsTracker tracker) {
3388215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        sendRawPdu(tracker);
3398215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    }
3408215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang
3418215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    @Override
3421260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    protected String getFormat() {
3431260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        // this function should be defined in Gsm/CdmaDispatcher.
3441260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        Rlog.e(TAG, "getFormat should never be called from here!");
3451260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        return "unknown";
3461260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
3471260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
3481260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    @Override
3491260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    protected GsmAlphabet.TextEncodingDetails calculateLength(
3501260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            CharSequence messageBody, boolean use7bitOnly) {
3511260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        Rlog.e(TAG, "Error! Not implemented for IMS.");
3521260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        return null;
3531260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
3541260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
3551260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    @Override
3568215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    protected SmsTracker getNewSubmitPduTracker(String destinationAddress, String scAddress,
3578215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            String message, SmsHeader smsHeader, int format, PendingIntent sentIntent,
358c99dab56e20222b28cbc6238645feac938f1c333Ye Wen            PendingIntent deliveryIntent, boolean lastPart,
3594bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wen            AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri,
3604bd1dec4138ac11a91a8ec606a27fc4c5c63f14bYe Wen            String fullMessageText) {
3611260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        Rlog.e(TAG, "Error! Not implemented for IMS.");
3628215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        return null;
3631260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
3641260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
3651260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    @Override
3661260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    public boolean isIms() {
3671260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        return mIms;
3681260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
3691260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
3701260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    @Override
3711260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    public String getImsSmsFormat() {
3721260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        return mImsSmsFormat;
3731260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
3741260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
3751260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    /**
3761260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     * Determines whether or not to use CDMA format for MO SMS.
3771260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     * If SMS over IMS is supported, then format is based on IMS SMS format,
3781260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     * otherwise format is based on current phone type.
3791260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     *
3801260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     * @return true if Cdma format should be used for MO SMS, false otherwise.
3811260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     */
3821260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    private boolean isCdmaMo() {
3831260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        if (!isIms()) {
3841260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            // IMS is not registered, use Voice technology to determine SMS format.
3851260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa            return (PhoneConstants.PHONE_TYPE_CDMA == mPhone.getPhoneType());
3861260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        }
3871260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        // IMS is registered with SMS support
3881260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        return isCdmaFormat(mImsSmsFormat);
3891260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
3901260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa
3911260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    /**
3921260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     * Determines whether or not format given is CDMA format.
3931260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     *
3941260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     * @param format
3951260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     * @return true if format given is CDMA format, false otherwise.
3961260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa     */
3971260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    private boolean isCdmaFormat(String format) {
3981260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa        return (mCdmaDispatcher.getFormat().equals(format));
3991260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    }
4001260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa}
401