10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project
31260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa *
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.ActivityManagerNative;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.ContentValues;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Intent;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.SharedPreferences;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.database.SQLException;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.Uri;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.PowerManager;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.PowerManager.WakeLock;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Registrant;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RegistrantList;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties;
34cbbf6deee30d702e398939f4bb464f5e821f5e6cDianne Hackbornimport android.os.UserHandle;
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.preference.PreferenceManager;
36ffe6e68213ae3220497188fed814e271b472292aJake Hambyimport android.provider.Settings;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.provider.Telephony;
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.CellLocation;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.PhoneNumberUtils;
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState;
41ffe6e68213ae3220497188fed814e271b472292aJake Hambyimport android.telephony.cdma.CdmaCellLocation;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils;
4399c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog;
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallStateException;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallTracker;
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CommandException;
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CommandsInterface;
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Connection;
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IccPhoneBookInterfaceManager;
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IccSmsInterfaceManager;
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.MccTable;
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.MmiCode;
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.OperatorInfo;
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneBase;
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneConstants;
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneNotifier;
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneProxy;
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneSubInfo;
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.ServiceStateTracker;
610d4bcdf379842af4b6304809156971e926f374f0Jake Hambyimport com.android.internal.telephony.SmsBroadcastUndelivered;
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.TelephonyIntents;
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.TelephonyProperties;
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.UUSInfo;
65454b1dfd508844b42eb775e4ab2359be74d3672bWink Savilleimport com.android.internal.telephony.dataconnection.DcTracker;
66d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccException;
67d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccRecords;
68d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.RuimRecords;
69d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.UiccCardApplication;
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.uicc.UiccController;
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor;
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter;
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List;
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.regex.Matcher;
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.regex.Pattern;
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA;
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY;
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC;
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class CDMAPhone extends PhoneBase {
86cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    static final String LOG_TAG = "CDMAPhone";
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final boolean DBG = true;
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final boolean VDBG = false; /* STOP SHIP if true */
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Default Emergency Callback Mode exit timer
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int DEFAULT_ECM_EXIT_TIMER_VALUE = 300000;
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final String VM_COUNT_CDMA = "vm_count_key_cdma";
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String VM_NUMBER_CDMA = "vm_number_key_cdma";
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String mVmNumber = null;
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final int RESTART_ECM_TIMER = 0; // restart Ecm timer
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final int CANCEL_ECM_TIMER = 1; // cancel Ecm timer
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Instance Variables
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    CdmaCallTracker mCT;
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    CdmaServiceStateTracker mSST;
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    CdmaSubscriptionSourceManager mCdmaSSM;
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    ArrayList <CdmaMmiCode> mPendingMmis = new ArrayList<CdmaMmiCode>();
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    RuimPhoneBookInterfaceManager mRuimPhoneBookInterfaceManager;
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int mCdmaSubscriptionSource = CdmaSubscriptionSourceManager.SUBSCRIPTION_SOURCE_UNKNOWN;
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    PhoneSubInfo mSubInfo;
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    EriManager mEriManager;
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    WakeLock mWakeLock;
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // mEriFileLoadedRegistrants are informed after the ERI text has been loaded
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final RegistrantList mEriFileLoadedRegistrants = new RegistrantList();
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // mEcmTimerResetRegistrants are informed after Ecm timer is canceled or re-started
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private final RegistrantList mEcmTimerResetRegistrants = new RegistrantList();
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // mEcmExitRespRegistrant is informed after the phone has been exited
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //the emergency callback mode
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //keep track of if phone is in emergency callback mode
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean mIsPhoneInEcmState;
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Registrant mEcmExitRespRegistrant;
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected String mImei;
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected String mImeiSv;
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String mEsn;
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String mMeid;
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // string to define how the carrier specifies its own ota sp number
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String mCarrierOtaSpNumSchema;
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // A runnable which is used to automatically exit from Ecm after a period of time.
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Runnable mExitEcmRunnable = new Runnable() {
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        @Override
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public void run() {
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            exitEmergencyCallbackMode();
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    };
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Registrant mPostDialHandler;
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static String PROPERTY_CDMA_HOME_OPERATOR_NUMERIC = "ro.cdma.home.operator.numeric";
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Constructors
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier) {
143ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        super("CDMA", notifier, context, ci, false);
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        initSstIcc();
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        init(context, notifier);
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier,
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean unitTestMode) {
150ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        super("CDMA", notifier, context, ci, unitTestMode);
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        initSstIcc();
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        init(context, notifier);
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void initSstIcc() {
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST = new CdmaServiceStateTracker(this);
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void init(Context context, PhoneNotifier notifier) {
16022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setPhoneType(PhoneConstants.PHONE_TYPE_CDMA);
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT = new CdmaCallTracker(this);
16222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCdmaSSM = CdmaSubscriptionSourceManager.getInstance(context, mCi, this,
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null);
164454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        mDcTracker = new DcTracker(this);
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRuimPhoneBookInterfaceManager = new RuimPhoneBookInterfaceManager(this);
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSubInfo = new PhoneSubInfo(this);
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mEriManager = new EriManager(this, context, EriManager.ERI_FROM_XML);
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForAvailable(this, EVENT_RADIO_AVAILABLE, null);
17022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
17122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForOn(this, EVENT_RADIO_ON, null);
17222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setOnSuppServiceNotification(this, EVENT_SSN, null);
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null);
17422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setEmergencyCallbackMode(this, EVENT_EMERGENCY_CALLBACK_MODE_ENTER, null);
175fba544106298510dc3edf110ab2be92270f08c13Anshul Jain        mCi.registerForExitEmergencyCallbackMode(this, EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE,
176fba544106298510dc3edf110ab2be92270f08c13Anshul Jain                null);
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        PowerManager pm
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,LOG_TAG);
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //Change the system setting
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SystemProperties.set(TelephonyProperties.CURRENT_ACTIVE_PHONE,
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Integer.toString(PhoneConstants.PHONE_TYPE_CDMA));
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This is needed to handle phone process crashes
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mIsPhoneInEcmState = inEcm.equals("true");
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mIsPhoneInEcmState) {
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Send a message which will invoke handleExitEmergencyCallbackMode
19122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.exitEmergencyCallbackMode(obtainMessage(EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE));
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // get the string that specifies the carrier OTA Sp number
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCarrierOtaSpNumSchema = SystemProperties.get(
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                TelephonyProperties.PROPERTY_OTASP_NUM_SCHEMA,"");
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
198ce06370fc58f59abda3cb072326e9425da3d755dWink Saville        // Sets operator properties by retrieving from build-time system property
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String operatorAlpha = SystemProperties.get("ro.cdma.home.operator.alpha");
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String operatorNumeric = SystemProperties.get(PROPERTY_CDMA_HOME_OPERATOR_NUMERIC);
201ce06370fc58f59abda3cb072326e9425da3d755dWink Saville        log("init: operatorAlpha='" + operatorAlpha
202ce06370fc58f59abda3cb072326e9425da3d755dWink Saville                + "' operatorNumeric='" + operatorNumeric + "'");
203ce06370fc58f59abda3cb072326e9425da3d755dWink Saville        if (mUiccController.getUiccCardApplication(UiccController.APP_FAM_3GPP) == null) {
204ce06370fc58f59abda3cb072326e9425da3d755dWink Saville            log("init: APP_FAM_3GPP == NULL");
205ce06370fc58f59abda3cb072326e9425da3d755dWink Saville            if (!TextUtils.isEmpty(operatorAlpha)) {
206ce06370fc58f59abda3cb072326e9425da3d755dWink Saville                log("init: set 'gsm.sim.operator.alpha' to operator='" + operatorAlpha + "'");
207ce06370fc58f59abda3cb072326e9425da3d755dWink Saville                setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, operatorAlpha);
208ce06370fc58f59abda3cb072326e9425da3d755dWink Saville            }
209ce06370fc58f59abda3cb072326e9425da3d755dWink Saville            if (!TextUtils.isEmpty(operatorNumeric)) {
210ce06370fc58f59abda3cb072326e9425da3d755dWink Saville                log("init: set 'gsm.sim.operator.numeric' to operator='" + operatorNumeric + "'");
211ce06370fc58f59abda3cb072326e9425da3d755dWink Saville                setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, operatorNumeric);
212ce06370fc58f59abda3cb072326e9425da3d755dWink Saville            }
213ce06370fc58f59abda3cb072326e9425da3d755dWink Saville            setIsoCountryProperty(operatorNumeric);
2148469152d2c6bdaf4632a07880bd1bcd6af78d10bduho.ro        }
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Sets current entry in the telephony carrier table
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        updateCurrentCarrierInProvider(operatorNumeric);
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Notify voicemails.
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        notifier.notifyMessageWaitingChanged(this);
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dispose() {
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        synchronized(PhoneProxy.lockForRadioTechnologyChange) {
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            super.dispose();
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("dispose");
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //Unregister from all former registered events
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            unregisterForRuimRecordEvents();
23122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.unregisterForAvailable(this); //EVENT_RADIO_AVAILABLE
23222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.unregisterForOffOrNotAvailable(this); //EVENT_RADIO_OFF_OR_NOT_AVAILABLE
23322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.unregisterForOn(this); //EVENT_RADIO_ON
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSST.unregisterForNetworkAttached(this); //EVENT_REGISTERED_TO_NETWORK
23522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.unSetOnSuppServiceNotification(this);
236fba544106298510dc3edf110ab2be92270f08c13Anshul Jain            mCi.unregisterForExitEmergencyCallbackMode(this);
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            removeCallbacks(mExitEcmRunnable);
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mPendingMmis.clear();
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //Force all referenced classes to unregister their former registered events
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCT.dispose();
243454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville            mDcTracker.dispose();
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSST.dispose();
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCdmaSSM.dispose(this);
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mRuimPhoneBookInterfaceManager.dispose();
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSubInfo.dispose();
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mEriManager.dispose();
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void removeReferences() {
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        log("removeReferences");
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRuimPhoneBookInterfaceManager = null;
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSubInfo = null;
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT = null;
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST = null;
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mEriManager = null;
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mExitEcmRunnable = null;
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.removeReferences();
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void finalize() {
26699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        if(DBG) Rlog.d(LOG_TAG, "CDMAPhone finalized");
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mWakeLock.isHeld()) {
26899c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.e(LOG_TAG, "UNEXPECTED; mWakeLock is held when finalizing.");
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mWakeLock.release();
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
273cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public ServiceState getServiceState() {
27522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mSST.mSS;
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
278cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public CallTracker getCallTracker() {
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCT;
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
283cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneConstants.State getState() {
28522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCT.mState;
2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
288cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public ServiceStateTracker getServiceStateTracker() {
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSST;
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
293cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getPhoneType() {
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return PhoneConstants.PHONE_TYPE_CDMA;
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
298cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean canTransfer() {
30099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "canTransfer: not possible in CDMA");
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
304cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public CdmaCall getRingingCall() {
30622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCT.mRingingCall;
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
309cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setMute(boolean muted) {
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT.setMute(muted);
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
314cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getMute() {
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCT.getMute();
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
319cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
320cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void conference() {
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // three way calls in CDMA will be handled by feature codes
32299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "conference: not possible in CDMA");
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
325cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void enableEnhancedVoicePrivacy(boolean enable, Message onComplete) {
32722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setPreferredVoicePrivacy(enable, onComplete);
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
330cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getEnhancedVoicePrivacy(Message onComplete) {
33222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.getPreferredVoicePrivacy(onComplete);
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
335cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void clearDisconnected() {
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT.clearDisconnected();
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
340cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public DataActivityState getDataActivityState() {
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        DataActivityState ret = DataActivityState.NONE;
3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mSST.getCurrentDataConnectionState() == ServiceState.STATE_IN_SERVICE) {
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
346454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville            switch (mDcTracker.getActivity()) {
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DATAIN:
3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ret = DataActivityState.DATAIN;
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DATAOUT:
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ret = DataActivityState.DATAOUT;
3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DATAINANDOUT:
3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ret = DataActivityState.DATAINANDOUT;
3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DORMANT:
3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ret = DataActivityState.DORMANT;
3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
362cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville
363cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                default:
364cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    ret = DataActivityState.NONE;
365cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ret;
3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
371cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Connection
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    dial (String dialString) throws CallStateException {
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Need to make sure dialString gets parsed properly
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String newDialString = PhoneNumberUtils.stripSeparators(dialString);
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCT.dial(newDialString);
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
379cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Connection dial(String dialString, UUSInfo uusInfo) throws CallStateException {
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        throw new CallStateException("Sending UUS information NOT supported in CDMA!");
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
384cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean
3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getMessageWaitingIndicator() {
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return (getVoiceMessageCount() > 0);
3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
390cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public List<? extends MmiCode>
3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getPendingMmiCodes() {
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mPendingMmis;
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
396cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForSuppServiceNotification(
3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Handler h, int what, Object obj) {
39999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "method registerForSuppServiceNotification is NOT supported in CDMA!");
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
402cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public CdmaCall getBackgroundCall() {
40422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCT.mBackgroundCall;
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
407cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean handleInCallMmiCommands(String dialString) {
40999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "method handleInCallMmiCommands is NOT supported in CDMA!");
4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean isInCall() {
4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        CdmaCall.State foregroundCallState = getForegroundCall().getState();
4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        CdmaCall.State backgroundCallState = getBackgroundCall().getState();
4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        CdmaCall.State ringingCallState = getRingingCall().getState();
4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return (foregroundCallState.isAlive() || backgroundCallState.isAlive() || ringingCallState
4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                .isAlive());
4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
422cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    setNetworkSelectionModeAutomatic(Message response) {
42599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "method setNetworkSelectionModeAutomatic is NOT supported in CDMA!");
4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
428cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForSuppServiceNotification(Handler h) {
43099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "method unregisterForSuppServiceNotification is NOT supported in CDMA!");
4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
433cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    acceptCall() throws CallStateException {
4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT.acceptCall();
4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
439cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    rejectCall() throws CallStateException {
4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT.rejectCall();
4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
445cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    switchHoldingAndActive() throws CallStateException {
4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT.switchWaitingOrHoldingAndActive();
4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
451cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4528e416432ae310dd451f1360dfd4f70d8ef9b3903duho.ro    public String getIccSerialNumber() {
4538e416432ae310dd451f1360dfd4f70d8ef9b3903duho.ro        IccRecords r = mIccRecords.get();
4548e416432ae310dd451f1360dfd4f70d8ef9b3903duho.ro        if (r == null) {
4558e416432ae310dd451f1360dfd4f70d8ef9b3903duho.ro            // to get ICCID form SIMRecords because it is on MF.
4568e416432ae310dd451f1360dfd4f70d8ef9b3903duho.ro            r = mUiccController.getIccRecords(UiccController.APP_FAM_3GPP);
4578e416432ae310dd451f1360dfd4f70d8ef9b3903duho.ro        }
4588e416432ae310dd451f1360dfd4f70d8ef9b3903duho.ro        return (r != null) ? r.getIccId() : null;
4598e416432ae310dd451f1360dfd4f70d8ef9b3903duho.ro    }
4608e416432ae310dd451f1360dfd4f70d8ef9b3903duho.ro
4618e416432ae310dd451f1360dfd4f70d8ef9b3903duho.ro    @Override
4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getLine1Number() {
4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSST.getMdnNumber();
4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
466cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getCdmaPrlVersion(){
4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSST.getPrlVersion();
4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
471cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getCdmaMin() {
4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSST.getCdmaMin();
4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
476cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isMinInfoReady() {
4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSST.isMinInfoReady();
4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
481cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getCallWaiting(Message onComplete) {
48322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.queryCallWaiting(CommandsInterface.SERVICE_CLASS_VOICE, onComplete);
4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
486cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    setRadioPower(boolean power) {
4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST.setRadioPower(power);
4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
492cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getEsn() {
4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mEsn;
4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
497cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getMeid() {
4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mMeid;
5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //returns MEID or ESN in CDMA
503cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getDeviceId() {
5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String id = getMeid();
5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if ((id == null) || id.matches("^0*$")) {
50799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.d(LOG_TAG, "getDeviceId(): MEID is not initialized use ESN");
5080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            id = getEsn();
5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return id;
5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
513cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getDeviceSvn() {
51599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.d(LOG_TAG, "getDeviceSvn(): return 0");
5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return "0";
5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
519cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getSubscriberId() {
5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSST.getImsi();
5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
524cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
5250e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi    public String getGroupIdLevel1() {
5260e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi        Rlog.e(LOG_TAG, "GID1 is not available in CDMA");
5270e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi        return null;
5280e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi    }
5290e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi
5300e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi    @Override
5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getImei() {
53299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "IMEI is not available in CDMA");
5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
536cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean canConference() {
53899c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "canConference: not possible in CDMA");
5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
542cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public CellLocation getCellLocation() {
544ffe6e68213ae3220497188fed814e271b472292aJake Hamby        CdmaCellLocation loc = mSST.mCellLoc;
545ffe6e68213ae3220497188fed814e271b472292aJake Hamby
546ffe6e68213ae3220497188fed814e271b472292aJake Hamby        int mode = Settings.Secure.getInt(getContext().getContentResolver(),
547ffe6e68213ae3220497188fed814e271b472292aJake Hamby                Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
548ffe6e68213ae3220497188fed814e271b472292aJake Hamby        if (mode == Settings.Secure.LOCATION_MODE_OFF) {
549ffe6e68213ae3220497188fed814e271b472292aJake Hamby            // clear lat/long values for location privacy
550ffe6e68213ae3220497188fed814e271b472292aJake Hamby            CdmaCellLocation privateLoc = new CdmaCellLocation();
551ffe6e68213ae3220497188fed814e271b472292aJake Hamby            privateLoc.setCellLocationData(loc.getBaseStationId(),
552ffe6e68213ae3220497188fed814e271b472292aJake Hamby                    CdmaCellLocation.INVALID_LAT_LONG,
553ffe6e68213ae3220497188fed814e271b472292aJake Hamby                    CdmaCellLocation.INVALID_LAT_LONG,
554ffe6e68213ae3220497188fed814e271b472292aJake Hamby                    loc.getSystemId(), loc.getNetworkId());
555ffe6e68213ae3220497188fed814e271b472292aJake Hamby            loc = privateLoc;
556ffe6e68213ae3220497188fed814e271b472292aJake Hamby        }
557ffe6e68213ae3220497188fed814e271b472292aJake Hamby        return loc;
5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
560cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public CdmaCall getForegroundCall() {
56222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCT.mForegroundCall;
5630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
565cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    selectNetworkManually(OperatorInfo network,
5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Message response) {
56999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "selectNetworkManually: not possible in CDMA");
5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
572cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setOnPostDialCharacter(Handler h, int what, Object obj) {
5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPostDialHandler = new Registrant(h, what, obj);
5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
577cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
5780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean handlePinMmi(String dialString) {
5793522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        CdmaMmiCode mmi = CdmaMmiCode.newFromDialString(dialString, this, mUiccApplication.get());
5800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mmi == null) {
58299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.e(LOG_TAG, "Mmi is NULL!");
5830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return false;
5843522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville        } else if (mmi.isPinPukCommand()) {
5850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mPendingMmis.add(mmi);
5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mmi.processCode();
5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return true;
5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
59099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "Unrecognized mmi!");
5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Removes the given MMI from the pending list and notifies registrants that
5960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * it is complete.
5970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param mmi MMI that is done
5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void onMMIDone(CdmaMmiCode mmi) {
6010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /*
6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * Only notify complete if it's on the pending list. Otherwise, it's
6030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * already been handled (eg, previously canceled).
6040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         */
6050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mPendingMmis.remove(mmi)) {
6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mMmiCompleteRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
610cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setLine1Number(String alphaTag, String number, Message onComplete) {
61299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "setLine1Number: not possible in CDMA");
6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
615cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setCallWaiting(boolean enable, Message onComplete) {
61799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "method setCallWaiting is NOT supported in CDMA!");
6180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
620cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void updateServiceLocation() {
6220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST.enableSingleLocationUpdate();
6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
625cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setDataRoamingEnabled(boolean enable) {
627454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        mDcTracker.setDataOnRoamingEnabled(enable);
6280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
630cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForCdmaOtaStatusChange(Handler h, int what, Object obj) {
63222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForCdmaOtaProvision(h, what, obj);
6330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
635cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForCdmaOtaStatusChange(Handler h) {
63722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForCdmaOtaProvision(h);
6380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
640cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForSubscriptionInfoReady(Handler h, int what, Object obj) {
6420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST.registerForSubscriptionInfoReady(h, what, obj);
6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
645cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForSubscriptionInfoReady(Handler h) {
6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST.unregisterForSubscriptionInfoReady(h);
6480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
650cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setOnEcbModeExitResponse(Handler h, int what, Object obj) {
6520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mEcmExitRespRegistrant = new Registrant (h, what, obj);
6530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
655cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unsetOnEcbModeExitResponse(Handler h) {
6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mEcmExitRespRegistrant.clear();
6580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
660cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForCallWaiting(Handler h, int what, Object obj) {
6620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT.registerForCallWaiting(h, what, obj);
6630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
665cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForCallWaiting(Handler h) {
6670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT.unregisterForCallWaiting(h);
6680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
670cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
6720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getNeighboringCids(Message response) {
6730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /*
6740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * This is currently not implemented.  At least as of June
6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * 2009, there is no neighbor cell information available for
6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * CDMA because some party is resisting making this
6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * information readily available.  Consequently, calling this
6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * function can have no useful effect.  This situation may
6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * (and hopefully will) change in the future.
6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         */
6810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (response != null) {
6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            CommandException ce = new CommandException(
6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    CommandException.Error.REQUEST_NOT_SUPPORTED);
6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            AsyncResult.forMessage(response).exception = ce;
6850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            response.sendToTarget();
6860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
689cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneConstants.DataState getDataConnectionState(String apnType) {
6910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        PhoneConstants.DataState ret = PhoneConstants.DataState.DISCONNECTED;
6920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mSST == null) {
6940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             // Radio Technology Change is ongoning, dispose() and removeReferences() have
6950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             // already been called
6960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             ret = PhoneConstants.DataState.DISCONNECTED;
6980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (mSST.getCurrentDataConnectionState() != ServiceState.STATE_IN_SERVICE) {
6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // If we're out of service, open TCP sockets may still work
7000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // but no data will flow
7010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret = PhoneConstants.DataState.DISCONNECTED;
702454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        } else if (mDcTracker.isApnTypeEnabled(apnType) == false ||
703454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                mDcTracker.isApnTypeActive(apnType) == false) {
7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret = PhoneConstants.DataState.DISCONNECTED;
7050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
706454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville            switch (mDcTracker.getState(apnType)) {
707c6bbea82bf74ebb492508199b6f3e172b7ce860aWink Saville                case RETRYING:
7080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case FAILED:
7090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case IDLE:
7100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ret = PhoneConstants.DataState.DISCONNECTED;
7110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
7120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case CONNECTED:
7140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DISCONNECTING:
71522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if ( mCT.mState != PhoneConstants.State.IDLE
7160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            && !mSST.isConcurrentVoiceAndDataAllowed()) {
7170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        ret = PhoneConstants.DataState.SUSPENDED;
7180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
7190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        ret = PhoneConstants.DataState.CONNECTED;
7200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
7210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
7220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case CONNECTING:
7240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case SCANNING:
7250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ret = PhoneConstants.DataState.CONNECTING;
7260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
7270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
7280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        log("getDataConnectionState apnType=" + apnType + " ret=" + ret);
7310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ret;
7320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
734cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void sendUssdResponse(String ussdMessge) {
73699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "sendUssdResponse: not possible in CDMA");
7370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
739cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void sendDtmf(char c) {
7410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!PhoneNumberUtils.is12Key(c)) {
74299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.e(LOG_TAG,
7430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "sendDtmf called with invalid character '" + c + "'");
7440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
74522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (mCT.mState ==  PhoneConstants.State.OFFHOOK) {
74622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCi.sendDtmf(c, null);
7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
7480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
751cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void startDtmf(char c) {
7530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!PhoneNumberUtils.is12Key(c)) {
75499c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.e(LOG_TAG,
7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "startDtmf called with invalid character '" + c + "'");
7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
75722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.startDtmf(c, null);
7580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
761cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void stopDtmf() {
76322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.stopDtmf(null);
7640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
766cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete) {
7680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean check = true;
7690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int itr = 0;itr < dtmfString.length(); itr++) {
7700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (!PhoneNumberUtils.is12Key(dtmfString.charAt(itr))) {
77199c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.e(LOG_TAG,
7720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        "sendDtmf called with invalid character '" + dtmfString.charAt(itr)+ "'");
7730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                check = false;
7740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
7750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
7760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
77722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if ((mCT.mState ==  PhoneConstants.State.OFFHOOK)&&(check)) {
77822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.sendBurstDtmf(dtmfString, on, off, onComplete);
7790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     }
7810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
782cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getAvailableNetworks(Message response) {
78499c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "getAvailableNetworks: not possible in CDMA");
7850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
787cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode, Message onComplete) {
78999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "setOutgoingCallerIdDisplay: not possible in CDMA");
7900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
792cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void enableLocationUpdates() {
7940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST.enableLocationUpdates();
7950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
797cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void disableLocationUpdates() {
7990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST.disableLocationUpdates();
8000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
802cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getDataCallList(Message response) {
80422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.getDataCallList(response);
8050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
807cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getDataRoamingEnabled() {
809454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        return mDcTracker.getDataOnRoamingEnabled();
8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
812cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setVoiceMailNumber(String alphaTag,
8140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                   String voiceMailNumber,
8150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                   Message onComplete) {
8160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Message resp;
8170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mVmNumber = voiceMailNumber;
8180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        resp = obtainMessage(EVENT_SET_VM_NUMBER_DONE, 0, 0, onComplete);
819e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
820e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        if (r != null) {
821e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            r.setVoiceMailNumber(alphaTag, mVmNumber, resp);
822e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        }
8230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
825cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getVoiceMailNumber() {
8270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String number = null;
8280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
8290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO: The default value of voicemail number should be read from a system property
8300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Read platform settings for dynamic voicemail number
8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (getContext().getResources().getBoolean(com.android.internal
8330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                .R.bool.config_telephony_use_own_number_for_voicemail)) {
8340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            number = sp.getString(VM_NUMBER_CDMA, getLine1Number());
8350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
8360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            number = sp.getString(VM_NUMBER_CDMA, "*86");
8370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return number;
8390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* Returns Number of Voicemails
8420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @hide
8430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
844cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getVoiceMessageCount() {
846e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
847e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        int voicemailCount =  (r != null) ? r.getVoiceMessageCount() : 0;
8480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // If mRuimRecords.getVoiceMessageCount returns zero, then there is possibility
8490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // that phone was power cycled and would have lost the voicemail count.
8500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // So get the count from preferences.
8510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (voicemailCount == 0) {
8520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
8530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            voicemailCount = sp.getInt(VM_COUNT_CDMA, 0);
8540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return voicemailCount;
8560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
858cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getVoiceMailAlphaTag() {
8600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO: Where can we get this value has to be clarified with QC.
8610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String ret = "";//TODO: Remove = "", if we know where to get this value.
8620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //ret = mSIMRecords.getVoiceMailAlphaTag();
8640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (ret == null || ret.length() == 0) {
8660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return mContext.getText(
8670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                com.android.internal.R.string.defaultVoiceMailAlphaTag).toString();
8680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ret;
8710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
873cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getCallForwardingOption(int commandInterfaceCFReason, Message onComplete) {
87599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "getCallForwardingOption: not possible in CDMA");
8760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
878cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setCallForwardingOption(int commandInterfaceCFAction,
8800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int commandInterfaceCFReason,
8810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String dialingNumber,
8820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int timerSeconds,
8830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Message onComplete) {
88499c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "setCallForwardingOption: not possible in CDMA");
8850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
887cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
8890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getOutgoingCallerIdDisplay(Message onComplete) {
89099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "getOutgoingCallerIdDisplay: not possible in CDMA");
8910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
893cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean
8950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getCallForwardingIndicator() {
89699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "getCallForwardingIndicator: not possible in CDMA");
8970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
8980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
900cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
9010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void explicitCallTransfer() {
90299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "explicitCallTransfer: not possible in CDMA");
9030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
905cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
9060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getLine1AlphaTag() {
90799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "getLine1AlphaTag: not possible in CDMA");
9080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
9090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
912cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Notify any interested party of a Phone state change
913cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * {@link com.android.internal.telephony.PhoneConstants.State}
9140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
9150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void notifyPhoneStateChanged() {
9160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyPhoneState(this);
9170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
920cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Notify registrants of a change in the call state. This notifies changes in
921cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * {@link com.android.internal.telephony.Call.State}. Use this when changes
922cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * in the precise call state are needed, else use notifyPhoneStateChanged.
9230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
9240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void notifyPreciseCallStateChanged() {
9250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /* we'd love it if this was package-scoped*/
9260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.notifyPreciseCallStateChangedP();
9270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     void notifyServiceStateChanged(ServiceState ss) {
9300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         super.notifyServiceStateChangedP(ss);
9310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     }
9320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     void notifyLocationChanged() {
9340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         mNotifier.notifyCellLocation(this);
9350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     }
9360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void notifyNewRingingConnection(Connection c) {
9380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /* we'd love it if this was package-scoped*/
9390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.notifyNewRingingConnectionP(c);
9400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void notifyDisconnect(Connection cn) {
9430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDisconnectRegistrants.notifyResult(cn);
9440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void notifyUnknownConnection() {
9470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mUnknownConnectionRegistrants.notifyResult(this);
9480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
950cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
9510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isInEmergencyCall() {
9520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCT.isInEmergencyCall();
9530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
955cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
9560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isInEcm() {
9570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mIsPhoneInEcmState;
9580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void sendEmergencyCallbackModeChange(){
9610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //Send an Intent
9620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Intent intent = new Intent(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
9630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        intent.putExtra(PhoneConstants.PHONE_IN_ECM_STATE, mIsPhoneInEcmState);
964cbbf6deee30d702e398939f4bb464f5e821f5e6cDianne Hackborn        ActivityManagerNative.broadcastStickyIntent(intent,null,UserHandle.USER_ALL);
96599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        if (DBG) Rlog.d(LOG_TAG, "sendEmergencyCallbackModeChange");
9660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
9690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void exitEmergencyCallbackMode() {
9700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mWakeLock.isHeld()) {
9710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mWakeLock.release();
9720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Send a message which will invoke handleExitEmergencyCallbackMode
97422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.exitEmergencyCallbackMode(obtainMessage(EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE));
9750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void handleEnterEmergencyCallbackMode(Message msg) {
9780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
97999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.d(LOG_TAG, "handleEnterEmergencyCallbackMode,mIsPhoneInEcmState= "
9800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + mIsPhoneInEcmState);
9810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // if phone is not in Ecm mode, and it's changed to Ecm mode
9830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mIsPhoneInEcmState == false) {
9840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mIsPhoneInEcmState = true;
9850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // notify change
9860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sendEmergencyCallbackModeChange();
9870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE, "true");
9880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Post this runnable so we will automatically exit
9900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // if no one invokes exitEmergencyCallbackMode() directly.
9910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            long delayInMillis = SystemProperties.getLong(
9920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE);
9930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            postDelayed(mExitEcmRunnable, delayInMillis);
9940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // We don't want to go to sleep while in Ecm
9950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mWakeLock.acquire();
9960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void handleExitEmergencyCallbackMode(Message msg) {
10000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar = (AsyncResult)msg.obj;
10010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG) {
100299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.d(LOG_TAG, "handleExitEmergencyCallbackMode,ar.exception , mIsPhoneInEcmState "
10030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + ar.exception + mIsPhoneInEcmState);
10040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Remove pending exit Ecm runnable, if any
10060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        removeCallbacks(mExitEcmRunnable);
10070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mEcmExitRespRegistrant != null) {
10090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mEcmExitRespRegistrant.notifyRegistrant(ar);
10100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // if exiting ecm success
10120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (ar.exception == null) {
10130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (mIsPhoneInEcmState) {
10140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mIsPhoneInEcmState = false;
10150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE, "false");
10160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // send an Intent
10180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sendEmergencyCallbackModeChange();
10190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Re-initiate data connection
1020454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville            mDcTracker.setInternalDataEnabled(true);
10210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Handle to cancel or restart Ecm timer in emergency call back mode
10260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * if action is CANCEL_ECM_TIMER, cancel Ecm timer and notify apps the timer is canceled;
10270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * otherwise, restart Ecm timer and notify apps the timer is restarted.
10280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void handleTimerInEmergencyCallbackMode(int action) {
10300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch(action) {
10310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CANCEL_ECM_TIMER:
10320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            removeCallbacks(mExitEcmRunnable);
10330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mEcmTimerResetRegistrants.notifyResult(Boolean.TRUE);
10340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
10350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case RESTART_ECM_TIMER:
10360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            long delayInMillis = SystemProperties.getLong(
10370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE);
10380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            postDelayed(mExitEcmRunnable, delayInMillis);
10390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mEcmTimerResetRegistrants.notifyResult(Boolean.FALSE);
10400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
10410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        default:
104299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.e(LOG_TAG, "handleTimerInEmergencyCallbackMode, unsupported action " + action);
10430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Registration point for Ecm timer reset
10480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param h handler to notify
10490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param what User-defined message code
10500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param obj placed in Message.obj
10510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1052cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
10530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForEcmTimerReset(Handler h, int what, Object obj) {
10540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mEcmTimerResetRegistrants.addUnique(h, what, obj);
10550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1057cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
10580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForEcmTimerReset(Handler h) {
10590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mEcmTimerResetRegistrants.remove(h);
10600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
10630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void handleMessage(Message msg) {
10640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar;
10650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Message     onComplete;
10660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10675e2000b856a7959609e8f15148a3584ec372f865Wink Saville        if (!mIsTheCurrentActivePhone) {
10685e2000b856a7959609e8f15148a3584ec372f865Wink Saville            Rlog.e(LOG_TAG, "Received message " + msg +
10695e2000b856a7959609e8f15148a3584ec372f865Wink Saville                    "[" + msg.what + "] while being destroyed. Ignoring.");
10705e2000b856a7959609e8f15148a3584ec372f865Wink Saville            return;
10715e2000b856a7959609e8f15148a3584ec372f865Wink Saville        }
10720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch(msg.what) {
10730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_RADIO_AVAILABLE: {
107422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCi.getBasebandVersion(obtainMessage(EVENT_GET_BASEBAND_VERSION_DONE));
10750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
107622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCi.getDeviceIdentity(obtainMessage(EVENT_GET_DEVICE_IDENTITY_DONE));
10770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
10790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_GET_BASEBAND_VERSION_DONE:{
10810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
10820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception != null) {
10840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
10850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
10860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
108799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                if (DBG) Rlog.d(LOG_TAG, "Baseband version: " + ar.result);
10880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                setSystemProperty(TelephonyProperties.PROPERTY_BASEBAND_VERSION, (String)ar.result);
10890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
10910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_GET_DEVICE_IDENTITY_DONE:{
10930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
10940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception != null) {
10960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
10970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
10980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String[] respId = (String[])ar.result;
10990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mImei = respId[0];
11000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mImeiSv = respId[1];
11010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mEsn  =  respId[2];
11020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mMeid =  respId[3];
11030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
11050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_EMERGENCY_CALLBACK_MODE_ENTER:{
11070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                handleEnterEmergencyCallbackMode(msg);
11080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
11100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_ICC_RECORD_EVENTS:
11120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
11130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                processIccRecordEvents((Integer)ar.result);
11140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
11150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case  EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE:{
11170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                handleExitEmergencyCallbackMode(msg);
11180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
11200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_RUIM_RECORDS_LOADED:{
112299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.d(LOG_TAG, "Event EVENT_RUIM_RECORDS_LOADED Received");
11230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                updateCurrentCarrierInProvider();
11240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
11260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_RADIO_OFF_OR_NOT_AVAILABLE:{
112899c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.d(LOG_TAG, "Event EVENT_RADIO_OFF_OR_NOT_AVAILABLE Received");
11290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
11310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_RADIO_ON:{
113399c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.d(LOG_TAG, "Event EVENT_RADIO_ON Received");
11340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                handleCdmaSubscriptionSource(mCdmaSSM.getCdmaSubscriptionSource());
11350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
11370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED:{
113999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.d(LOG_TAG, "EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED");
11400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                handleCdmaSubscriptionSource(mCdmaSSM.getCdmaSubscriptionSource());
11410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
11430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_SSN:{
114599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.d(LOG_TAG, "Event EVENT_SSN Received");
11460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
11480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_REGISTERED_TO_NETWORK:{
115099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.d(LOG_TAG, "Event EVENT_REGISTERED_TO_NETWORK Received");
11510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
11530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_NV_READY:{
115599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.d(LOG_TAG, "Event EVENT_NV_READY Received");
11560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                prepareEri();
11570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
11590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_SET_VM_NUMBER_DONE:{
11610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
11620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (IccException.class.isInstance(ar.exception)) {
11630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    storeVoiceMailNumber(mVmNumber);
11640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ar.exception = null;
11650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
11660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                onComplete = (Message) ar.userObj;
11670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (onComplete != null) {
11680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    AsyncResult.forMessage(onComplete, ar.result, ar.exception);
11690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    onComplete.sendToTarget();
11700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
11710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
11730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:{
11750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                super.handleMessage(msg);
11760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1180e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    @Override
1181e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    protected void onUpdateIccAvailability() {
1182e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        if (mUiccController == null ) {
1183e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            return;
1184e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        }
1185e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
1186e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        UiccCardApplication newUiccApplication =
1187e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccController.getUiccCardApplication(UiccController.APP_FAM_3GPP2);
1188e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
1189df53e221838a87a2d5d5175c1b8372e8515a822cJake Hamby        if (newUiccApplication == null) {
1190df53e221838a87a2d5d5175c1b8372e8515a822cJake Hamby            log("can't find 3GPP2 application; trying APP_FAM_3GPP");
1191df53e221838a87a2d5d5175c1b8372e8515a822cJake Hamby            newUiccApplication = mUiccController
1192df53e221838a87a2d5d5175c1b8372e8515a822cJake Hamby                    .getUiccCardApplication(UiccController.APP_FAM_3GPP);
1193df53e221838a87a2d5d5175c1b8372e8515a822cJake Hamby        }
1194df53e221838a87a2d5d5175c1b8372e8515a822cJake Hamby
1195e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        UiccCardApplication app = mUiccApplication.get();
1196e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (app != newUiccApplication) {
1197e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (app != null) {
1198e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                log("Removing stale icc objects.");
1199e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                if (mIccRecords.get() != null) {
1200e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                    unregisterForRuimRecordEvents();
1201e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                    mRuimPhoneBookInterfaceManager.updateIccRecords(null);
1202e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                }
1203e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                mIccRecords.set(null);
1204e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplication.set(null);
1205e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            }
1206e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (newUiccApplication != null) {
1207e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                log("New Uicc application found");
1208e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplication.set(newUiccApplication);
1209e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccRecords.set(newUiccApplication.getIccRecords());
1210e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                registerForRuimRecordEvents();
1211e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mRuimPhoneBookInterfaceManager.updateIccRecords(mIccRecords.get());
1212e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            }
1213e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        }
1214e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    }
1215e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
12160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void processIccRecordEvents(int eventCode) {
12170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (eventCode) {
12180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case RuimRecords.EVENT_MWI:
12190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                notifyMessageWaitingIndicator();
12200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
12210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
122399c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.e(LOG_TAG,"Unknown icc records event code " + eventCode);
12240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
12250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
12260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Handles the call to get the subscription source
12300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
12310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param newSubscriptionSource holds the new CDMA subscription source value
12320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
12330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void handleCdmaSubscriptionSource(int newSubscriptionSource) {
12340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (newSubscriptionSource != mCdmaSubscriptionSource) {
12350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             mCdmaSubscriptionSource = newSubscriptionSource;
12360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             if (newSubscriptionSource == CDMA_SUBSCRIPTION_NV) {
12370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                 // NV is ready when subscription source is NV
12380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                 sendMessage(obtainMessage(EVENT_NV_READY));
12390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             }
12400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
12410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Retrieves the PhoneSubInfo of the CDMAPhone
12450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1246cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
12470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneSubInfo getPhoneSubInfo() {
12480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSubInfo;
12490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Retrieves the IccPhoneBookInterfaceManager of the CDMAPhone
12530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1254cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
12550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public IccPhoneBookInterfaceManager getIccPhoneBookInterfaceManager() {
12560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mRuimPhoneBookInterfaceManager;
12570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForEriFileLoaded(Handler h, int what, Object obj) {
12600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Registrant r = new Registrant (h, what, obj);
12610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mEriFileLoadedRegistrants.add(r);
12620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForEriFileLoaded(Handler h) {
12650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mEriFileLoadedRegistrants.remove(h);
12660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // override for allowing access from other classes of this package
12690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * {@inheritDoc}
12710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1272cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
12730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final void setSystemProperty(String property, String value) {
12740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.setSystemProperty(property, value);
12750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Activate or deactivate cell broadcast SMS.
12790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
12800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param activate 0 = activate, 1 = deactivate
12810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param response Callback message is empty on completion
12820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1283cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
12840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void activateCellBroadcastSms(int activate, Message response) {
128599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "[CDMAPhone] activateCellBroadcastSms() is obsolete; use SmsManager");
12860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        response.sendToTarget();
12870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Query the current configuration of cdma cell broadcast SMS.
12910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
12920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param response Callback message is empty on completion
12930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1294cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
12950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getCellBroadcastSmsConfig(Message response) {
129699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "[CDMAPhone] getCellBroadcastSmsConfig() is obsolete; use SmsManager");
12970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        response.sendToTarget();
12980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
13010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Configure cdma cell broadcast SMS.
13020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
13030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param response Callback message is empty on completion
13040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1305cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setCellBroadcastSmsConfig(int[] configValuesArray, Message response) {
130799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        Rlog.e(LOG_TAG, "[CDMAPhone] setCellBroadcastSmsConfig() is obsolete; use SmsManager");
13080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        response.sendToTarget();
13090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
13120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns true if OTA Service Provisioning needs to be performed.
13130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
13140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
13150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean needsOtaServiceProvisioning() {
13160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSST.getOtasp() != ServiceStateTracker.OTASP_NOT_NEEDED;
13170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String IS683A_FEATURE_CODE = "*228";
13200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int IS683A_FEATURE_CODE_NUM_DIGITS = 4;
13210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int IS683A_SYS_SEL_CODE_NUM_DIGITS = 2;
13220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int IS683A_SYS_SEL_CODE_OFFSET = 4;
13230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int IS683_CONST_800MHZ_A_BAND = 0;
13250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int IS683_CONST_800MHZ_B_BAND = 1;
13260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int IS683_CONST_1900MHZ_A_BLOCK = 2;
13270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int IS683_CONST_1900MHZ_B_BLOCK = 3;
13280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int IS683_CONST_1900MHZ_C_BLOCK = 4;
13290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int IS683_CONST_1900MHZ_D_BLOCK = 5;
13300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int IS683_CONST_1900MHZ_E_BLOCK = 6;
13310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int IS683_CONST_1900MHZ_F_BLOCK = 7;
13320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final int INVALID_SYSTEM_SELECTION_CODE = -1;
13330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static boolean isIs683OtaSpDialStr(String dialStr) {
13350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int sysSelCodeInt;
13360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean isOtaspDialString = false;
13370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int dialStrLen = dialStr.length();
13380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (dialStrLen == IS683A_FEATURE_CODE_NUM_DIGITS) {
13400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (dialStr.equals(IS683A_FEATURE_CODE)) {
13410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                isOtaspDialString = true;
13420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
13430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
13440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sysSelCodeInt = extractSelCodeFromOtaSpNum(dialStr);
13450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            switch (sysSelCodeInt) {
13460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case IS683_CONST_800MHZ_A_BAND:
13470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case IS683_CONST_800MHZ_B_BAND:
13480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case IS683_CONST_1900MHZ_A_BLOCK:
13490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case IS683_CONST_1900MHZ_B_BLOCK:
13500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case IS683_CONST_1900MHZ_C_BLOCK:
13510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case IS683_CONST_1900MHZ_D_BLOCK:
13520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case IS683_CONST_1900MHZ_E_BLOCK:
13530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case IS683_CONST_1900MHZ_F_BLOCK:
13540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    isOtaspDialString = true;
13550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
13560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                default:
13570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
13580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
13590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
13600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return isOtaspDialString;
13610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
13630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * This function extracts the system selection code from the dial string.
13640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
13650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static int extractSelCodeFromOtaSpNum(String dialStr) {
13660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int dialStrLen = dialStr.length();
13670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int sysSelCodeInt = INVALID_SYSTEM_SELECTION_CODE;
13680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if ((dialStr.regionMatches(0, IS683A_FEATURE_CODE,
13700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                   0, IS683A_FEATURE_CODE_NUM_DIGITS)) &&
13710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            (dialStrLen >= (IS683A_FEATURE_CODE_NUM_DIGITS +
13720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            IS683A_SYS_SEL_CODE_NUM_DIGITS))) {
13730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Since we checked the condition above, the system selection code
13740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // extracted from dialStr will not cause any exception
13750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                sysSelCodeInt = Integer.parseInt (
13760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                dialStr.substring (IS683A_FEATURE_CODE_NUM_DIGITS,
13770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                IS683A_FEATURE_CODE_NUM_DIGITS + IS683A_SYS_SEL_CODE_NUM_DIGITS));
13780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
137999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        if (DBG) Rlog.d(LOG_TAG, "extractSelCodeFromOtaSpNum " + sysSelCodeInt);
13800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return sysSelCodeInt;
13810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
13840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * This function checks if the system selection code extracted from
13850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the dial string "sysSelCodeInt' is the system selection code specified
13860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * in the carrier ota sp number schema "sch".
13870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
13880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static boolean
13890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    checkOtaSpNumBasedOnSysSelCode (int sysSelCodeInt, String sch[]) {
13900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean isOtaSpNum = false;
13910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
13920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Get how many number of system selection code ranges
1393cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            int selRc = Integer.parseInt(sch[1]);
13940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (int i = 0; i < selRc; i++) {
13950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (!TextUtils.isEmpty(sch[i+2]) && !TextUtils.isEmpty(sch[i+3])) {
1396cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    int selMin = Integer.parseInt(sch[i+2]);
1397cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    int selMax = Integer.parseInt(sch[i+3]);
13980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // Check if the selection code extracted from the dial string falls
13990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // within any of the range pairs specified in the schema.
14000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if ((sysSelCodeInt >= selMin) && (sysSelCodeInt <= selMax)) {
14010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        isOtaSpNum = true;
14020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        break;
14030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
14040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
14050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
14060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (NumberFormatException ex) {
14070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // If the carrier ota sp number schema is not correct, we still allow dial
14080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // and only log the error:
140999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            Rlog.e(LOG_TAG, "checkOtaSpNumBasedOnSysSelCode, error", ex);
14100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
14110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return isOtaSpNum;
14120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Define the pattern/format for carrier specified OTASP number schema.
14150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // It separates by comma and/or whitespace.
14160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static Pattern pOtaSpNumSchema = Pattern.compile("[,\\s]+");
14170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
14190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * The following function checks if a dial string is a carrier specified
14200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * OTASP number or not by checking against the OTASP number schema stored
14210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * in PROPERTY_OTASP_NUM_SCHEMA.
14220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
14230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Currently, there are 2 schemas for carriers to specify the OTASP number:
14240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * 1) Use system selection code:
14250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *    The schema is:
14260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *    SELC,the # of code pairs,min1,max1,min2,max2,...
14270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *    e.g "SELC,3,10,20,30,40,60,70" indicates that there are 3 pairs of
14280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *    selection codes, and they are {10,20}, {30,40} and {60,70} respectively.
14290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
14300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * 2) Use feature code:
14310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *    The schema is:
14320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *    "FC,length of feature code,feature code".
14330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *     e.g "FC,2,*2" indicates that the length of the feature code is 2,
14340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *     and the code itself is "*2".
14350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
14360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean isCarrierOtaSpNum(String dialStr) {
14370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean isOtaSpNum = false;
14380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int sysSelCodeInt = extractSelCodeFromOtaSpNum(dialStr);
14390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (sysSelCodeInt == INVALID_SYSTEM_SELECTION_CODE) {
14400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return isOtaSpNum;
14410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
14420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // mCarrierOtaSpNumSchema is retrieved from PROPERTY_OTASP_NUM_SCHEMA:
14430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!TextUtils.isEmpty(mCarrierOtaSpNumSchema)) {
14440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Matcher m = pOtaSpNumSchema.matcher(mCarrierOtaSpNumSchema);
14450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG) {
144699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.d(LOG_TAG, "isCarrierOtaSpNum,schema" + mCarrierOtaSpNumSchema);
14470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
14480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (m.find()) {
14500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String sch[] = pOtaSpNumSchema.split(mCarrierOtaSpNumSchema);
14510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // If carrier uses system selection code mechanism
14520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (!TextUtils.isEmpty(sch[0]) && sch[0].equals("SELC")) {
14530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (sysSelCodeInt!=INVALID_SYSTEM_SELECTION_CODE) {
14540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        isOtaSpNum=checkOtaSpNumBasedOnSysSelCode(sysSelCodeInt,sch);
14550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
14560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (DBG) {
145799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                            Rlog.d(LOG_TAG, "isCarrierOtaSpNum,sysSelCodeInt is invalid");
14580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
14590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
14600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else if (!TextUtils.isEmpty(sch[0]) && sch[0].equals("FC")) {
1461cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    int fcLen =  Integer.parseInt(sch[1]);
1462cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    String fc = sch[2];
14630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (dialStr.regionMatches(0,fc,0,fcLen)) {
14640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        isOtaSpNum = true;
14650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
146699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                        if (DBG) Rlog.d(LOG_TAG, "isCarrierOtaSpNum,not otasp number");
14670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
14680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
14690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (DBG) {
147099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                        Rlog.d(LOG_TAG, "isCarrierOtaSpNum,ota schema not supported" + sch[0]);
14710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
14720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
14730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
14740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (DBG) {
147599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                    Rlog.d(LOG_TAG, "isCarrierOtaSpNum,ota schema pattern not right" +
14760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                          mCarrierOtaSpNumSchema);
14770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
14780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
14790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
148099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville            if (DBG) Rlog.d(LOG_TAG, "isCarrierOtaSpNum,ota schema pattern empty");
14810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
14820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return isOtaSpNum;
14830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
14860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * isOTASPNumber: checks a given number against the IS-683A OTASP dial string and carrier
14870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * OTASP dial string.
14880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
14890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param dialStr the number to look up.
14900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if the number is in IS-683A OTASP dial string or carrier OTASP dial string
14910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
14920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
14930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public  boolean isOtaSpNumber(String dialStr){
14940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean isOtaSpNum = false;
14950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String dialableStr = PhoneNumberUtils.extractNetworkPortionAlt(dialStr);
14960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (dialableStr != null) {
14970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            isOtaSpNum = isIs683OtaSpDialStr(dialableStr);
14980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (isOtaSpNum == false) {
14990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                isOtaSpNum = isCarrierOtaSpNum(dialableStr);
15000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
15010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
150299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville        if (DBG) Rlog.d(LOG_TAG, "isOtaSpNumber " + isOtaSpNum);
15030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return isOtaSpNum;
15040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
15070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getCdmaEriIconIndex() {
15080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return getServiceState().getCdmaEriIconIndex();
15090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the CDMA ERI icon mode,
15130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * 0 - ON
15140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * 1 - FLASHING
15150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
15160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
15170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getCdmaEriIconMode() {
15180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return getServiceState().getCdmaEriIconMode();
15190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the CDMA ERI text,
15230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
15240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
15250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getCdmaEriText() {
15260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int roamInd = getServiceState().getCdmaRoamingIndicator();
15270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int defRoamInd = getServiceState().getCdmaDefaultRoamingIndicator();
15280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mEriManager.getCdmaEriText(roamInd, defRoamInd);
15290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Store the voicemail number in preferences
15330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
15340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void storeVoiceMailNumber(String number) {
15350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Update the preference value of voicemail number
15360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
15370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences.Editor editor = sp.edit();
15380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        editor.putString(VM_NUMBER_CDMA, number);
15390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        editor.apply();
15400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Sets PROPERTY_ICC_OPERATOR_ISO_COUNTRY property
15440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
15450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
15460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void setIsoCountryProperty(String operatorNumeric) {
15470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (TextUtils.isEmpty(operatorNumeric)) {
1548ce06370fc58f59abda3cb072326e9425da3d755dWink Saville            log("setIsoCountryProperty: clear 'gsm.sim.operator.iso-country'");
15490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, "");
15500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
15510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String iso = "";
15520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
15530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                iso = MccTable.countryCodeForMcc(Integer.parseInt(
15540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        operatorNumeric.substring(0,3)));
15550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (NumberFormatException ex) {
1556ce06370fc58f59abda3cb072326e9425da3d755dWink Saville                loge("setIsoCountryProperty: countryCodeForMcc error", ex);
15570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (StringIndexOutOfBoundsException ex) {
1558ce06370fc58f59abda3cb072326e9425da3d755dWink Saville                loge("setIsoCountryProperty: countryCodeForMcc error", ex);
15590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
15600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1561ce06370fc58f59abda3cb072326e9425da3d755dWink Saville            log("setIsoCountryProperty: set 'gsm.sim.operator.iso-country' to iso=" + iso);
15620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, iso);
15630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
15640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Sets the "current" field in the telephony provider according to the
15680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * build-time operator numeric property
15690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
15700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true for success; false otherwise.
15710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
15720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean updateCurrentCarrierInProvider(String operatorNumeric) {
1573ce06370fc58f59abda3cb072326e9425da3d755dWink Saville        log("CDMAPhone: updateCurrentCarrierInProvider called");
15740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!TextUtils.isEmpty(operatorNumeric)) {
15750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
15760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
15770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ContentValues map = new ContentValues();
15780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                map.put(Telephony.Carriers.NUMERIC, operatorNumeric);
15790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                log("updateCurrentCarrierInProvider from system: numeric=" + operatorNumeric);
15800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                getContext().getContentResolver().insert(uri, map);
15810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Updates MCC MNC device configuration information
1583b0b637dbf2a67c0e7eee917c0809f1cc54983986Robert Greenwalt                MccTable.updateMccMncConfiguration(mContext, operatorNumeric, false);
15840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return true;
15860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (SQLException e) {
158799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville                Rlog.e(LOG_TAG, "Can't store current operator", e);
15880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
15890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
15900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
15910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Sets the "current" field in the telephony provider according to the SIM's operator.
15950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Implemented in {@link CDMALTEPhone} for CDMA/LTE devices.
15960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
15970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true for success; false otherwise.
15980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
15990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean updateCurrentCarrierInProvider() {
16000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return true;
16010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void prepareEri() {
16040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mEriManager.loadEriFile();
16050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if(mEriManager.isEriFileLoaded()) {
16060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // when the ERI file is loaded
16070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log("ERI read, notify registrants");
16080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mEriFileLoadedRegistrants.notifyRegistrants();
16090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
16100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isEriFileLoaded() {
16130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mEriManager.isEriFileLoaded();
16140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1616e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    protected void registerForRuimRecordEvents() {
1617e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
1618e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        if (r == null) {
1619e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            return;
1620e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        }
1621e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        r.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null);
1622e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        r.registerForRecordsLoaded(this, EVENT_RUIM_RECORDS_LOADED, null);
16230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1625e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    protected void unregisterForRuimRecordEvents() {
1626e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
1627e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        if (r == null) {
1628e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            return;
1629e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        }
1630e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        r.unregisterForRecordsEvents(this);
1631e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        r.unregisterForRecordsLoaded(this);
16320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void log(String s) {
16350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG)
1636cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            Rlog.d(LOG_TAG, s);
16370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1639ce06370fc58f59abda3cb072326e9425da3d755dWink Saville    protected void loge(String s, Exception e) {
1640ce06370fc58f59abda3cb072326e9425da3d755dWink Saville        if (DBG)
1641ce06370fc58f59abda3cb072326e9425da3d755dWink Saville            Rlog.e(LOG_TAG, s, e);
1642ce06370fc58f59abda3cb072326e9425da3d755dWink Saville    }
1643ce06370fc58f59abda3cb072326e9425da3d755dWink Saville
16440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
16450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
16460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println("CDMAPhone extends:");
16470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.dump(fd, pw, args);
16480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mVmNumber=" + mVmNumber);
16490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mCT=" + mCT);
16500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mSST=" + mSST);
16510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mCdmaSSM=" + mCdmaSSM);
16520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mPendingMmis=" + mPendingMmis);
16530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mRuimPhoneBookInterfaceManager=" + mRuimPhoneBookInterfaceManager);
16540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mCdmaSubscriptionSource=" + mCdmaSubscriptionSource);
16550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mSubInfo=" + mSubInfo);
16560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mEriManager=" + mEriManager);
16570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mWakeLock=" + mWakeLock);
16580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mIsPhoneInEcmState=" + mIsPhoneInEcmState);
16590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (VDBG) pw.println(" mImei=" + mImei);
16600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (VDBG) pw.println(" mImeiSv=" + mImeiSv);
16610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (VDBG) pw.println(" mEsn=" + mEsn);
16620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (VDBG) pw.println(" mMeid=" + mMeid);
16630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mCarrierOtaSpNumSchema=" + mCarrierOtaSpNumSchema);
16640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" getCdmaEriIconIndex()=" + getCdmaEriIconIndex());
16650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" getCdmaEriIconMode()=" + getCdmaEriIconMode());
16660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" getCdmaEriText()=" + getCdmaEriText());
16670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" isMinInfoReady()=" + isMinInfoReady());
16680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" isCspPlmnEnabled()=" + isCspPlmnEnabled());
16690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
1671