1767a662ecde33c3979bf02b793d392aca0403162Wink Saville/*
2767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Copyright (C) 2006 The Android Open Source Project
3767a662ecde33c3979bf02b793d392aca0403162Wink Saville *
4767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5767a662ecde33c3979bf02b793d392aca0403162Wink Saville * you may not use this file except in compliance with the License.
6767a662ecde33c3979bf02b793d392aca0403162Wink Saville * You may obtain a copy of the License at
7767a662ecde33c3979bf02b793d392aca0403162Wink Saville *
8767a662ecde33c3979bf02b793d392aca0403162Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9767a662ecde33c3979bf02b793d392aca0403162Wink Saville *
10767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Unless required by applicable law or agreed to in writing, software
11767a662ecde33c3979bf02b793d392aca0403162Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12767a662ecde33c3979bf02b793d392aca0403162Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13767a662ecde33c3979bf02b793d392aca0403162Wink Saville * See the License for the specific language governing permissions and
14767a662ecde33c3979bf02b793d392aca0403162Wink Saville * limitations under the License.
15767a662ecde33c3979bf02b793d392aca0403162Wink Saville */
16767a662ecde33c3979bf02b793d392aca0403162Wink Saville
17767a662ecde33c3979bf02b793d392aca0403162Wink Savillepackage com.android.internal.telephony.cdma;
18767a662ecde33c3979bf02b793d392aca0403162Wink Saville
19e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.app.ActivityManagerNative;
20142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport android.content.ContentValues;
21b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hambyimport android.content.Context;
22e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.content.Intent;
23ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krauseimport android.content.SharedPreferences;
24142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport android.database.SQLException;
25142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport android.net.Uri;
26767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.AsyncResult;
27767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Handler;
28767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Message;
2995a1d1a89e383dab893750638c2393dec54833ffWink Savilleimport android.os.PowerManager;
3095a1d1a89e383dab893750638c2393dec54833ffWink Savilleimport android.os.PowerManager.WakeLock;
31767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Registrant;
32767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.RegistrantList;
33767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.SystemProperties;
34ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krauseimport android.preference.PreferenceManager;
35142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport android.provider.Telephony;
36767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.telephony.CellLocation;
37767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.telephony.PhoneNumberUtils;
38767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.telephony.ServiceState;
39e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
40767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.text.TextUtils;
41767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.util.Log;
42767a662ecde33c3979bf02b793d392aca0403162Wink Saville
431c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganeshimport com.android.internal.telephony.Call;
44767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.CallStateException;
45b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hambyimport com.android.internal.telephony.CallTracker;
4690cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalinkimport com.android.internal.telephony.CommandException;
47767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.CommandsInterface;
48767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.Connection;
49e7af59b375f08b13d964816fc52048e670764bdbAlex Yakavenkaimport com.android.internal.telephony.IccCard;
50ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krauseimport com.android.internal.telephony.IccException;
51767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccFileHandler;
52767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccPhoneBookInterfaceManager;
53767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccSmsInterfaceManager;
54b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hambyimport com.android.internal.telephony.MccTable;
55767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.MmiCode;
563caa1bd1061df4029951e68d0a04d5e30928701fRobert Greenwaltimport com.android.internal.telephony.OperatorInfo;
57767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.Phone;
58767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.PhoneBase;
59767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.PhoneNotifier;
60767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.PhoneProxy;
61767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.PhoneSubInfo;
62fd2d01302781af91d77557a99874111a4fee8365Wink Savilleimport com.android.internal.telephony.ServiceStateTracker;
63e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport com.android.internal.telephony.TelephonyIntents;
649bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganeshimport com.android.internal.telephony.TelephonyProperties;
6524440cf8a9431291bdcaa77b418e6c4715932507Naveen Kallaimport com.android.internal.telephony.UUSInfo;
66b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hambyimport com.android.internal.telephony.cat.CatService;
6722c1700378667c1f25974b134cc201663ac2c29eWink Savilleimport com.android.internal.telephony.uicc.UiccController;
68142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
6930ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Savilleimport java.io.FileDescriptor;
7030ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Savilleimport java.io.PrintWriter;
71e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kallaimport java.util.ArrayList;
72767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport java.util.List;
73e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Liimport java.util.regex.Matcher;
74e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Liimport java.util.regex.Pattern;
75e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
76b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hambyimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA;
77b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hambyimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY;
78b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hambyimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC;
79b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby
80767a662ecde33c3979bf02b793d392aca0403162Wink Saville/**
81767a662ecde33c3979bf02b793d392aca0403162Wink Saville * {@hide}
82767a662ecde33c3979bf02b793d392aca0403162Wink Saville */
83767a662ecde33c3979bf02b793d392aca0403162Wink Savillepublic class CDMAPhone extends PhoneBase {
84767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static final String LOG_TAG = "CDMA";
85e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final boolean DBG = true;
8630ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville    private static final boolean VDBG = false; /* STOP SHIP if true */
87767a662ecde33c3979bf02b793d392aca0403162Wink Saville
8822ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville    // Default Emergency Callback Mode exit timer
89019581bf6055eb69ee7e4cb844dafe2b6c23597eCheng Yang    private static final int DEFAULT_ECM_EXIT_TIMER_VALUE = 300000;
9095a1d1a89e383dab893750638c2393dec54833ffWink Saville
91ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    static final String VM_COUNT_CDMA = "vm_count_key_cdma";
92ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    private static final String VM_NUMBER_CDMA = "vm_number_key_cdma";
93ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    private String mVmNumber = null;
9422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville
9595a1d1a89e383dab893750638c2393dec54833ffWink Saville    static final int RESTART_ECM_TIMER = 0; // restart Ecm timer
9695a1d1a89e383dab893750638c2393dec54833ffWink Saville    static final int CANCEL_ECM_TIMER = 1; // cancel Ecm timer
9795a1d1a89e383dab893750638c2393dec54833ffWink Saville
98a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville    // Instance Variables
99767a662ecde33c3979bf02b793d392aca0403162Wink Saville    CdmaCallTracker mCT;
100767a662ecde33c3979bf02b793d392aca0403162Wink Saville    CdmaServiceStateTracker mSST;
101fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla    CdmaSubscriptionSourceManager mCdmaSSM;
102e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla    ArrayList <CdmaMmiCode> mPendingMmis = new ArrayList<CdmaMmiCode>();
103767a662ecde33c3979bf02b793d392aca0403162Wink Saville    RuimPhoneBookInterfaceManager mRuimPhoneBookInterfaceManager;
104767a662ecde33c3979bf02b793d392aca0403162Wink Saville    RuimSmsInterfaceManager mRuimSmsInterfaceManager;
105fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla    int mCdmaSubscriptionSource = CdmaSubscriptionSourceManager.SUBSCRIPTION_SOURCE_UNKNOWN;
106767a662ecde33c3979bf02b793d392aca0403162Wink Saville    PhoneSubInfo mSubInfo;
107e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    EriManager mEriManager;
10895a1d1a89e383dab893750638c2393dec54833ffWink Saville    WakeLock mWakeLock;
109a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville
110e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    // mEriFileLoadedRegistrants are informed after the ERI text has been loaded
111b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    private final RegistrantList mEriFileLoadedRegistrants = new RegistrantList();
112dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
11395a1d1a89e383dab893750638c2393dec54833ffWink Saville    // mEcmTimerResetRegistrants are informed after Ecm timer is canceled or re-started
114b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    private final RegistrantList mEcmTimerResetRegistrants = new RegistrantList();
11595a1d1a89e383dab893750638c2393dec54833ffWink Saville
11695a1d1a89e383dab893750638c2393dec54833ffWink Saville    // mEcmExitRespRegistrant is informed after the phone has been exited
117dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    //the emergency callback mode
118dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    //keep track of if phone is in emergency callback mode
11995a1d1a89e383dab893750638c2393dec54833ffWink Saville    private boolean mIsPhoneInEcmState;
12095a1d1a89e383dab893750638c2393dec54833ffWink Saville    private Registrant mEcmExitRespRegistrant;
1212ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang    protected String mImei;
1222ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang    protected String mImeiSv;
123767a662ecde33c3979bf02b793d392aca0403162Wink Saville    private String mEsn;
124767a662ecde33c3979bf02b793d392aca0403162Wink Saville    private String mMeid;
125e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    // string to define how the carrier specifies its own ota sp number
126e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private String mCarrierOtaSpNumSchema;
1272563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville
12895a1d1a89e383dab893750638c2393dec54833ffWink Saville    // A runnable which is used to automatically exit from Ecm after a period of time.
129dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private Runnable mExitEcmRunnable = new Runnable() {
130b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        @Override
131dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        public void run() {
132dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            exitEmergencyCallbackMode();
133dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
134dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    };
135767a662ecde33c3979bf02b793d392aca0403162Wink Saville
136767a662ecde33c3979bf02b793d392aca0403162Wink Saville    Registrant mPostDialHandler;
137767a662ecde33c3979bf02b793d392aca0403162Wink Saville
138fe629782f33a07827c69841fce9964bd90ff152aWink Saville    static String PROPERTY_CDMA_HOME_OPERATOR_NUMERIC = "ro.cdma.home.operator.numeric";
139767a662ecde33c3979bf02b793d392aca0403162Wink Saville
140a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville    // Constructors
141767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier) {
1429d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        super(notifier, context, ci, false);
1431f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville        initSstIcc();
1449d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        init(context, notifier);
145767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
146767a662ecde33c3979bf02b793d392aca0403162Wink Saville
147767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier,
148767a662ecde33c3979bf02b793d392aca0403162Wink Saville            boolean unitTestMode) {
149a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        super(notifier, context, ci, unitTestMode);
1501f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville        initSstIcc();
1519d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        init(context, notifier);
1529d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
153767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1541f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville    protected void initSstIcc() {
155ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccCard.set(UiccController.getInstance(this).getIccCard());
156ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords = mIccCard.get().getIccRecords();
157ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        // CdmaServiceStateTracker registers with IccCard to know
158ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        // when the Ruim card is ready. So create mIccCard before the ServiceStateTracker
159fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla        mSST = new CdmaServiceStateTracker(this);
16075acebd02d2b3478d98cc8da98fa9229c53c32d5Ramesh Sudini    }
16175acebd02d2b3478d98cc8da98fa9229c53c32d5Ramesh Sudini
1629d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    protected void init(Context context, PhoneNotifier notifier) {
1633cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink        mCM.setPhoneType(Phone.PHONE_TYPE_CDMA);
164767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT = new CdmaCallTracker(this);
165fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla        mCdmaSSM = CdmaSubscriptionSourceManager.getInstance(context, mCM, this,
166fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla                EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null);
167b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mSMS = new CdmaSMSDispatcher(this, mSmsStorageMonitor, mSmsUsageMonitor);
16863edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt        mDataConnectionTracker = new CdmaDataConnectionTracker (this);
169767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mRuimPhoneBookInterfaceManager = new RuimPhoneBookInterfaceManager(this);
170bb3716332321e22537a5015be13e2229fb9b90bcJake Hamby        mRuimSmsInterfaceManager = new RuimSmsInterfaceManager(this, mSMS);
171767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSubInfo = new PhoneSubInfo(this);
172e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mEriManager = new EriManager(this, context, EriManager.ERI_FROM_XML);
173767a662ecde33c3979bf02b793d392aca0403162Wink Saville
174a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.registerForAvailable(this, EVENT_RADIO_AVAILABLE, null);
175ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        registerForRuimRecordEvents();
176a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
177a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.registerForOn(this, EVENT_RADIO_ON, null);
178a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.setOnSuppServiceNotification(this, EVENT_SSN, null);
17988d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null);
180a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.setEmergencyCallbackMode(this, EVENT_EMERGENCY_CALLBACK_MODE_ENTER, null);
181e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
18295a1d1a89e383dab893750638c2393dec54833ffWink Saville        PowerManager pm
18395a1d1a89e383dab893750638c2393dec54833ffWink Saville            = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
18495a1d1a89e383dab893750638c2393dec54833ffWink Saville        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,LOG_TAG);
185767a662ecde33c3979bf02b793d392aca0403162Wink Saville
186767a662ecde33c3979bf02b793d392aca0403162Wink Saville        //Change the system setting
1879bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        SystemProperties.set(TelephonyProperties.CURRENT_ACTIVE_PHONE,
188b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby                Integer.toString(Phone.PHONE_TYPE_CDMA));
189dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
19022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        // This is needed to handle phone process crashes
19122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
19295a1d1a89e383dab893750638c2393dec54833ffWink Saville        mIsPhoneInEcmState = inEcm.equals("true");
1939b62851c3fbcd7fb61ead7583dcae33e411232d0Libin Tang        if (mIsPhoneInEcmState) {
1949b62851c3fbcd7fb61ead7583dcae33e411232d0Libin Tang            // Send a message which will invoke handleExitEmergencyCallbackMode
1959b62851c3fbcd7fb61ead7583dcae33e411232d0Libin Tang            mCM.exitEmergencyCallbackMode(obtainMessage(EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE));
1969b62851c3fbcd7fb61ead7583dcae33e411232d0Libin Tang        }
197ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause
198e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        // get the string that specifies the carrier OTA Sp number
199e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        mCarrierOtaSpNumSchema = SystemProperties.get(
200e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                TelephonyProperties.PROPERTY_OTASP_NUM_SCHEMA,"");
201e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
202142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        // Sets operator alpha property by retrieving from build-time system property
203142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        String operatorAlpha = SystemProperties.get("ro.cdma.home.operator.alpha");
204142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, operatorAlpha);
205142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
206142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        // Sets operator numeric property by retrieving from build-time system property
207fe629782f33a07827c69841fce9964bd90ff152aWink Saville        String operatorNumeric = SystemProperties.get(PROPERTY_CDMA_HOME_OPERATOR_NUMERIC);
208431a4a3b97f494c23e3dc7e781c2efcea63f3a7eWink Saville        log("CDMAPhone: init set 'gsm.sim.operator.numeric' to operator='" +
209431a4a3b97f494c23e3dc7e781c2efcea63f3a7eWink Saville                operatorNumeric + "'");
210142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, operatorNumeric);
211142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
212142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        // Sets iso country property by retrieving from build-time system property
213142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        setIsoCountryProperty(operatorNumeric);
214142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
215142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        // Sets current entry in the telephony carrier table
216142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        updateCurrentCarrierInProvider(operatorNumeric);
217142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
218ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // Notify voicemails.
219ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        notifier.notifyMessageWaitingChanged(this);
220767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
221767a662ecde33c3979bf02b793d392aca0403162Wink Saville
222b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    @Override
223767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void dispose() {
224767a662ecde33c3979bf02b793d392aca0403162Wink Saville        synchronized(PhoneProxy.lockForRadioTechnologyChange) {
225a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            super.dispose();
2261f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville            log("dispose");
227767a662ecde33c3979bf02b793d392aca0403162Wink Saville
228767a662ecde33c3979bf02b793d392aca0403162Wink Saville            //Unregister from all former registered events
22980198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka            unregisterForRuimRecordEvents();
230a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            mCM.unregisterForAvailable(this); //EVENT_RADIO_AVAILABLE
231a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            mCM.unregisterForOffOrNotAvailable(this); //EVENT_RADIO_OFF_OR_NOT_AVAILABLE
232a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            mCM.unregisterForOn(this); //EVENT_RADIO_ON
23388d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt            mSST.unregisterForNetworkAttached(this); //EVENT_REGISTERED_TO_NETWORK
234a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            mCM.unSetOnSuppServiceNotification(this);
235f3ee6f87a344b185d8bde12c77440c9020378510Banavathu, Srinivas Naik            removeCallbacks(mExitEcmRunnable);
236767a662ecde33c3979bf02b793d392aca0403162Wink Saville
237e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            mPendingMmis.clear();
238e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla
239767a662ecde33c3979bf02b793d392aca0403162Wink Saville            //Force all referenced classes to unregister their former registered events
240767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCT.dispose();
24163edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt            mDataConnectionTracker.dispose();
242767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSST.dispose();
243fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla            mCdmaSSM.dispose(this);
244767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSMS.dispose();
245767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mRuimPhoneBookInterfaceManager.dispose();
246767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mRuimSmsInterfaceManager.dispose();
247767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSubInfo.dispose();
248e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mEriManager.dispose();
249767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
250767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
251767a662ecde33c3979bf02b793d392aca0403162Wink Saville
252b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    @Override
253767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void removeReferences() {
254b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        log("removeReferences");
255b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mRuimPhoneBookInterfaceManager = null;
256b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mRuimSmsInterfaceManager = null;
257b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mSubInfo = null;
258b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mCT = null;
259b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mSST = null;
260b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mEriManager = null;
261b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mExitEcmRunnable = null;
262ce2dcb6f1358398eef9ccffccd0c0a309238f7a4Alex Yakavenka        super.removeReferences();
263767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
264767a662ecde33c3979bf02b793d392aca0403162Wink Saville
265b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    @Override
266767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected void finalize() {
267e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if(DBG) Log.d(LOG_TAG, "CDMAPhone finalized");
26895a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (mWakeLock.isHeld()) {
26995a1d1a89e383dab893750638c2393dec54833ffWink Saville            Log.e(LOG_TAG, "UNEXPECTED; mWakeLock is held when finalizing.");
27095a1d1a89e383dab893750638c2393dec54833ffWink Saville            mWakeLock.release();
27195a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
272767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
273767a662ecde33c3979bf02b793d392aca0403162Wink Saville
274767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public ServiceState getServiceState() {
275767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSST.ss;
276767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
277767a662ecde33c3979bf02b793d392aca0403162Wink Saville
2789d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public CallTracker getCallTracker() {
2799d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        return mCT;
2809d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
2819d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
2823cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink    public Phone.State getState() {
283767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.state;
284767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
285767a662ecde33c3979bf02b793d392aca0403162Wink Saville
2869d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public ServiceStateTracker getServiceStateTracker() {
2879d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        return mSST;
2889d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
2899d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
2903cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink    public String getPhoneName() {
291767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return "CDMA";
292767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
293767a662ecde33c3979bf02b793d392aca0403162Wink Saville
2943cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink    public int getPhoneType() {
2953cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink        return Phone.PHONE_TYPE_CDMA;
2963cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink    }
2973cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink
298767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean canTransfer() {
299767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "canTransfer: not possible in CDMA");
300767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
301767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
302767a662ecde33c3979bf02b793d392aca0403162Wink Saville
3033cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink    public CdmaCall getRingingCall() {
304767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.ringingCall;
305767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
306767a662ecde33c3979bf02b793d392aca0403162Wink Saville
307767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setMute(boolean muted) {
308767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.setMute(muted);
309767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
310767a662ecde33c3979bf02b793d392aca0403162Wink Saville
311767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean getMute() {
312767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.getMute();
313767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
314767a662ecde33c3979bf02b793d392aca0403162Wink Saville
315767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void conference() throws CallStateException {
316767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // three way calls in CDMA will be handled by feature codes
317767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "conference: not possible in CDMA");
318767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
319767a662ecde33c3979bf02b793d392aca0403162Wink Saville
320767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void enableEnhancedVoicePrivacy(boolean enable, Message onComplete) {
321767a662ecde33c3979bf02b793d392aca0403162Wink Saville        this.mCM.setPreferredVoicePrivacy(enable, onComplete);
322767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
323767a662ecde33c3979bf02b793d392aca0403162Wink Saville
324767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getEnhancedVoicePrivacy(Message onComplete) {
325767a662ecde33c3979bf02b793d392aca0403162Wink Saville        this.mCM.getPreferredVoicePrivacy(onComplete);
326767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
327767a662ecde33c3979bf02b793d392aca0403162Wink Saville
328767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void clearDisconnected() {
329767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.clearDisconnected();
330767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
331767a662ecde33c3979bf02b793d392aca0403162Wink Saville
332767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public DataActivityState getDataActivityState() {
333767a662ecde33c3979bf02b793d392aca0403162Wink Saville        DataActivityState ret = DataActivityState.NONE;
334767a662ecde33c3979bf02b793d392aca0403162Wink Saville
335a4e82851e9c8a75dfb371403c500e3b3cf3e4565Robert Greenwalt        if (mSST.getCurrentDataConnectionState() == ServiceState.STATE_IN_SERVICE) {
336767a662ecde33c3979bf02b793d392aca0403162Wink Saville
33763edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt            switch (mDataConnectionTracker.getActivity()) {
338767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAIN:
339767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAIN;
340767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
341767a662ecde33c3979bf02b793d392aca0403162Wink Saville
342767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAOUT:
343767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAOUT;
344767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
345767a662ecde33c3979bf02b793d392aca0403162Wink Saville
346767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAINANDOUT:
347767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAINANDOUT;
348767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
349e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
350e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                case DORMANT:
351e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                    ret = DataActivityState.DORMANT;
352e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                break;
353767a662ecde33c3979bf02b793d392aca0403162Wink Saville            }
354767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
355767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return ret;
356767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
357767a662ecde33c3979bf02b793d392aca0403162Wink Saville
358767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /*package*/ void
359767a662ecde33c3979bf02b793d392aca0403162Wink Saville    notifySignalStrength() {
360767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mNotifier.notifySignalStrength(this);
361767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
362767a662ecde33c3979bf02b793d392aca0403162Wink Saville
363767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public Connection
364767a662ecde33c3979bf02b793d392aca0403162Wink Saville    dial (String dialString) throws CallStateException {
365767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // Need to make sure dialString gets parsed properly
366767a662ecde33c3979bf02b793d392aca0403162Wink Saville        String newDialString = PhoneNumberUtils.stripSeparators(dialString);
36722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        return mCT.dial(newDialString);
368767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
369767a662ecde33c3979bf02b793d392aca0403162Wink Saville
37024440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla    public Connection dial(String dialString, UUSInfo uusInfo) throws CallStateException {
37124440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla        throw new CallStateException("Sending UUS information NOT supported in CDMA!");
37224440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla    }
37324440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla
374e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public SignalStrength getSignalStrength() {
375e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        return mSST.mSignalStrength;
376767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
377767a662ecde33c3979bf02b793d392aca0403162Wink Saville
378767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean
379767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getMessageWaitingIndicator() {
380ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        return (getVoiceMessageCount() > 0);
381767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
382767a662ecde33c3979bf02b793d392aca0403162Wink Saville
383767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public List<? extends MmiCode>
384767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getPendingMmiCodes() {
385e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        return mPendingMmis;
386767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
387767a662ecde33c3979bf02b793d392aca0403162Wink Saville
388767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void registerForSuppServiceNotification(
389767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Handler h, int what, Object obj) {
390767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method registerForSuppServiceNotification is NOT supported in CDMA!");
391767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
392767a662ecde33c3979bf02b793d392aca0403162Wink Saville
393767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CdmaCall getBackgroundCall() {
394767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.backgroundCall;
395767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
396767a662ecde33c3979bf02b793d392aca0403162Wink Saville
397767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean handleInCallMmiCommands(String dialString) {
398767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method handleInCallMmiCommands is NOT supported in CDMA!");
399767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
400767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
401767a662ecde33c3979bf02b793d392aca0403162Wink Saville
402e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla    boolean isInCall() {
403e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        CdmaCall.State foregroundCallState = getForegroundCall().getState();
404e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        CdmaCall.State backgroundCallState = getBackgroundCall().getState();
405e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        CdmaCall.State ringingCallState = getRingingCall().getState();
406e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla
407e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        return (foregroundCallState.isAlive() || backgroundCallState.isAlive() || ringingCallState
408e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla                .isAlive());
409e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla    }
410e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla
411767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
412767a662ecde33c3979bf02b793d392aca0403162Wink Saville    setNetworkSelectionModeAutomatic(Message response) {
413767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method setNetworkSelectionModeAutomatic is NOT supported in CDMA!");
414767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
415767a662ecde33c3979bf02b793d392aca0403162Wink Saville
416767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void unregisterForSuppServiceNotification(Handler h) {
417767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method unregisterForSuppServiceNotification is NOT supported in CDMA!");
418767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
419767a662ecde33c3979bf02b793d392aca0403162Wink Saville
420767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
421767a662ecde33c3979bf02b793d392aca0403162Wink Saville    acceptCall() throws CallStateException {
422767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.acceptCall();
423767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
424767a662ecde33c3979bf02b793d392aca0403162Wink Saville
425767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
426767a662ecde33c3979bf02b793d392aca0403162Wink Saville    rejectCall() throws CallStateException {
427767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.rejectCall();
428767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
429767a662ecde33c3979bf02b793d392aca0403162Wink Saville
430767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
431767a662ecde33c3979bf02b793d392aca0403162Wink Saville    switchHoldingAndActive() throws CallStateException {
432767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.switchWaitingOrHoldingAndActive();
433767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
434767a662ecde33c3979bf02b793d392aca0403162Wink Saville
435767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getLine1Number() {
436f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville        return mSST.getMdnNumber();
437767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
438767a662ecde33c3979bf02b793d392aca0403162Wink Saville
43922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville    public String getCdmaPrlVersion(){
440daccacb865947c00f277f1823333e2fbf91e652aWink Saville        return mSST.getPrlVersion();
44122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville    }
44222ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville
443019581bf6055eb69ee7e4cb844dafe2b6c23597eCheng Yang    public String getCdmaMin() {
444f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville        return mSST.getCdmaMin();
445e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
446e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
4479e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    public boolean isMinInfoReady() {
4489e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo        return mSST.isMinInfoReady();
4499e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    }
4509e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo
451767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getCallWaiting(Message onComplete) {
452767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.queryCallWaiting(CommandsInterface.SERVICE_CLASS_VOICE, onComplete);
453767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
454767a662ecde33c3979bf02b793d392aca0403162Wink Saville
455767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
456767a662ecde33c3979bf02b793d392aca0403162Wink Saville    setRadioPower(boolean power) {
457767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSST.setRadioPower(power);
458767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
459767a662ecde33c3979bf02b793d392aca0403162Wink Saville
460767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getEsn() {
461767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mEsn;
462767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
463767a662ecde33c3979bf02b793d392aca0403162Wink Saville
464767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getMeid() {
465767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mMeid;
466767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
467767a662ecde33c3979bf02b793d392aca0403162Wink Saville
4683158cf689f4994ec53c3b727f9b6ad7751a5551bWink Saville    //returns MEID or ESN in CDMA
469767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getDeviceId() {
4703158cf689f4994ec53c3b727f9b6ad7751a5551bWink Saville        String id = getMeid();
4713158cf689f4994ec53c3b727f9b6ad7751a5551bWink Saville        if ((id == null) || id.matches("^0*$")) {
4723158cf689f4994ec53c3b727f9b6ad7751a5551bWink Saville            Log.d(LOG_TAG, "getDeviceId(): MEID is not initialized use ESN");
4733158cf689f4994ec53c3b727f9b6ad7751a5551bWink Saville            id = getEsn();
4743158cf689f4994ec53c3b727f9b6ad7751a5551bWink Saville        }
4753158cf689f4994ec53c3b727f9b6ad7751a5551bWink Saville        return id;
476767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
477767a662ecde33c3979bf02b793d392aca0403162Wink Saville
478767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getDeviceSvn() {
479767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.d(LOG_TAG, "getDeviceSvn(): return 0");
480767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return "0";
481767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
482767a662ecde33c3979bf02b793d392aca0403162Wink Saville
483767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getSubscriberId() {
484142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        return mSST.getImsi();
485767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
486767a662ecde33c3979bf02b793d392aca0403162Wink Saville
4872ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang    public String getImei() {
4882ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang        Log.e(LOG_TAG, "IMEI is not available in CDMA");
4892ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang        return null;
4902ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang    }
4912ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang
492767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean canConference() {
493767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "canConference: not possible in CDMA");
494767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
495767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
496767a662ecde33c3979bf02b793d392aca0403162Wink Saville
497767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CellLocation getCellLocation() {
498767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSST.cellLoc;
499767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
500767a662ecde33c3979bf02b793d392aca0403162Wink Saville
501767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CdmaCall getForegroundCall() {
502767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.foregroundCall;
503767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
504767a662ecde33c3979bf02b793d392aca0403162Wink Saville
505767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
5063caa1bd1061df4029951e68d0a04d5e30928701fRobert Greenwalt    selectNetworkManually(OperatorInfo network,
507767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Message response) {
508767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "selectNetworkManually: not possible in CDMA");
509767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
510767a662ecde33c3979bf02b793d392aca0403162Wink Saville
511767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setOnPostDialCharacter(Handler h, int what, Object obj) {
512dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        mPostDialHandler = new Registrant(h, what, obj);
513767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
514767a662ecde33c3979bf02b793d392aca0403162Wink Saville
515767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean handlePinMmi(String dialString) {
516e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        CdmaMmiCode mmi = CdmaMmiCode.newFromDialString(dialString, this);
517e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla
518e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        if (mmi == null) {
519e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            Log.e(LOG_TAG, "Mmi is NULL!");
520e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            return false;
521e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        } else if (mmi.isPukCommand()) {
522e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            mPendingMmis.add(mmi);
523e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
524e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            mmi.processCode();
525e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            return true;
526e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        }
527e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        Log.e(LOG_TAG, "Unrecognized mmi!");
528767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
529767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
530767a662ecde33c3979bf02b793d392aca0403162Wink Saville
531e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla    /**
532e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla     * Removes the given MMI from the pending list and notifies registrants that
533e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla     * it is complete.
534e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla     *
535e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla     * @param mmi MMI that is done
536e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla     */
537e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla    void onMMIDone(CdmaMmiCode mmi) {
538e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        /*
539e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla         * Only notify complete if it's on the pending list. Otherwise, it's
540e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla         * already been handled (eg, previously canceled).
541e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla         */
542e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        if (mPendingMmis.remove(mmi)) {
543e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            mMmiCompleteRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
544e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        }
545e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla    }
546e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla
547767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setLine1Number(String alphaTag, String number, Message onComplete) {
548767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "setLine1Number: not possible in CDMA");
549767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
550767a662ecde33c3979bf02b793d392aca0403162Wink Saville
551767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setCallWaiting(boolean enable, Message onComplete) {
552767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method setCallWaiting is NOT supported in CDMA!");
553767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
554767a662ecde33c3979bf02b793d392aca0403162Wink Saville
5557a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink    public void updateServiceLocation() {
5567a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        mSST.enableSingleLocationUpdate();
557767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
558767a662ecde33c3979bf02b793d392aca0403162Wink Saville
559767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setDataRoamingEnabled(boolean enable) {
56063edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt        mDataConnectionTracker.setDataOnRoamingEnabled(enable);
561767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
562767a662ecde33c3979bf02b793d392aca0403162Wink Saville
563dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void registerForCdmaOtaStatusChange(Handler h, int what, Object obj) {
564dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        mCM.registerForCdmaOtaProvision(h, what, obj);
565dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
566dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
567dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void unregisterForCdmaOtaStatusChange(Handler h) {
568dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        mCM.unregisterForCdmaOtaProvision(h);
569dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
570dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
5719e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    public void registerForSubscriptionInfoReady(Handler h, int what, Object obj) {
5729e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo        mSST.registerForSubscriptionInfoReady(h, what, obj);
5739e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    }
5749e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo
5759e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    public void unregisterForSubscriptionInfoReady(Handler h) {
5769e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo        mSST.unregisterForSubscriptionInfoReady(h);
5779e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    }
5789e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo
579dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void setOnEcbModeExitResponse(Handler h, int what, Object obj) {
58095a1d1a89e383dab893750638c2393dec54833ffWink Saville        mEcmExitRespRegistrant = new Registrant (h, what, obj);
581dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
582dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
583dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void unsetOnEcbModeExitResponse(Handler h) {
58495a1d1a89e383dab893750638c2393dec54833ffWink Saville        mEcmExitRespRegistrant.clear();
585dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
586dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
587dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void registerForCallWaiting(Handler h, int what, Object obj) {
58822ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        mCT.registerForCallWaiting(h, what, obj);
589dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
590dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
591dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void unregisterForCallWaiting(Handler h) {
59222ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        mCT.unregisterForCallWaiting(h);
593dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
594dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
595767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
596767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getNeighboringCids(Message response) {
59790cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink        /*
59890cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * This is currently not implemented.  At least as of June
59990cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * 2009, there is no neighbor cell information available for
60090cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * CDMA because some party is resisting making this
60190cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * information readily available.  Consequently, calling this
60290cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * function can have no useful effect.  This situation may
60390cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * (and hopefully will) change in the future.
60490cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         */
60590cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink        if (response != null) {
60690cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink            CommandException ce = new CommandException(
60790cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink                    CommandException.Error.REQUEST_NOT_SUPPORTED);
60890cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink            AsyncResult.forMessage(response).exception = ce;
60990cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink            response.sendToTarget();
61090cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink        }
611767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
612767a662ecde33c3979bf02b793d392aca0403162Wink Saville
61302648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt    public DataState getDataConnectionState(String apnType) {
614767a662ecde33c3979bf02b793d392aca0403162Wink Saville        DataState ret = DataState.DISCONNECTED;
615767a662ecde33c3979bf02b793d392aca0403162Wink Saville
61682583b8312403ed734c30b161750d40c26086ee2Elliott Hughes        if (mSST == null) {
617e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville             // Radio Technology Change is ongoning, dispose() and removeReferences() have
618e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville             // already been called
61944038aa032ffd876f3c9b20a84db9d189f77e18eWink Saville
620e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville             ret = DataState.DISCONNECTED;
621a4e82851e9c8a75dfb371403c500e3b3cf3e4565Robert Greenwalt        } else if (mSST.getCurrentDataConnectionState() != ServiceState.STATE_IN_SERVICE) {
622767a662ecde33c3979bf02b793d392aca0403162Wink Saville            // If we're out of service, open TCP sockets may still work
623767a662ecde33c3979bf02b793d392aca0403162Wink Saville            // but no data will flow
624767a662ecde33c3979bf02b793d392aca0403162Wink Saville            ret = DataState.DISCONNECTED;
62563edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt        } else if (mDataConnectionTracker.isApnTypeEnabled(apnType) == false ||
62663edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt                mDataConnectionTracker.isApnTypeActive(apnType) == false) {
62702648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt            ret = DataState.DISCONNECTED;
628767a662ecde33c3979bf02b793d392aca0403162Wink Saville        } else {
62963edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt            switch (mDataConnectionTracker.getState(apnType)) {
630767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case FAILED:
631767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case IDLE:
632767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataState.DISCONNECTED;
633767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
634767a662ecde33c3979bf02b793d392aca0403162Wink Saville
635767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case CONNECTED:
636767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DISCONNECTING:
637767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    if ( mCT.state != Phone.State.IDLE
6389d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville                            && !mSST.isConcurrentVoiceAndDataAllowed()) {
639767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        ret = DataState.SUSPENDED;
640767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    } else {
641767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        ret = DataState.CONNECTED;
642767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    }
643767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
644767a662ecde33c3979bf02b793d392aca0403162Wink Saville
645767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case INITING:
646767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case CONNECTING:
647767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case SCANNING:
648767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataState.CONNECTING;
649767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
650767a662ecde33c3979bf02b793d392aca0403162Wink Saville            }
651767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
652767a662ecde33c3979bf02b793d392aca0403162Wink Saville
6531f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville        log("getDataConnectionState apnType=" + apnType + " ret=" + ret);
654767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return ret;
655767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
656767a662ecde33c3979bf02b793d392aca0403162Wink Saville
657767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void sendUssdResponse(String ussdMessge) {
658767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "sendUssdResponse: not possible in CDMA");
659767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
660767a662ecde33c3979bf02b793d392aca0403162Wink Saville
661767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void sendDtmf(char c) {
662767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (!PhoneNumberUtils.is12Key(c)) {
663767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Log.e(LOG_TAG,
664767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    "sendDtmf called with invalid character '" + c + "'");
665767a662ecde33c3979bf02b793d392aca0403162Wink Saville        } else {
666767a662ecde33c3979bf02b793d392aca0403162Wink Saville            if (mCT.state ==  Phone.State.OFFHOOK) {
667767a662ecde33c3979bf02b793d392aca0403162Wink Saville                mCM.sendDtmf(c, null);
668767a662ecde33c3979bf02b793d392aca0403162Wink Saville            }
669767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
670767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
671767a662ecde33c3979bf02b793d392aca0403162Wink Saville
672767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void startDtmf(char c) {
673767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (!PhoneNumberUtils.is12Key(c)) {
674767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Log.e(LOG_TAG,
675767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    "startDtmf called with invalid character '" + c + "'");
676767a662ecde33c3979bf02b793d392aca0403162Wink Saville        } else {
677767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.startDtmf(c, null);
678767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
679767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
680767a662ecde33c3979bf02b793d392aca0403162Wink Saville
681767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void stopDtmf() {
682767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.stopDtmf(null);
683767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
684767a662ecde33c3979bf02b793d392aca0403162Wink Saville
685dafa22a3ef9328c72319aeec605f6a6d20e46080jsh    public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete) {
686e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        boolean check = true;
687e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        for (int itr = 0;itr < dtmfString.length(); itr++) {
688e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            if (!PhoneNumberUtils.is12Key(dtmfString.charAt(itr))) {
689e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                Log.e(LOG_TAG,
690e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        "sendDtmf called with invalid character '" + dtmfString.charAt(itr)+ "'");
691e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                check = false;
692e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                break;
693e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            }
694e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
695e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if ((mCT.state ==  Phone.State.OFFHOOK)&&(check)) {
696dafa22a3ef9328c72319aeec605f6a6d20e46080jsh            mCM.sendBurstDtmf(dtmfString, on, off, onComplete);
697e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
698e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     }
699e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
700767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getAvailableNetworks(Message response) {
701767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getAvailableNetworks: not possible in CDMA");
702767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
703767a662ecde33c3979bf02b793d392aca0403162Wink Saville
704767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode, Message onComplete) {
705dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        Log.e(LOG_TAG, "setOutgoingCallerIdDisplay: not possible in CDMA");
706767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
707767a662ecde33c3979bf02b793d392aca0403162Wink Saville
708767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void enableLocationUpdates() {
709767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSST.enableLocationUpdates();
710767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
711767a662ecde33c3979bf02b793d392aca0403162Wink Saville
7127a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink    public void disableLocationUpdates() {
7137a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        mSST.disableLocationUpdates();
7147a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink    }
7157a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink
716767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getDataCallList(Message response) {
717767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.getDataCallList(response);
718767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
719767a662ecde33c3979bf02b793d392aca0403162Wink Saville
720767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean getDataRoamingEnabled() {
72163edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt        return mDataConnectionTracker.getDataOnRoamingEnabled();
722767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
723767a662ecde33c3979bf02b793d392aca0403162Wink Saville
724767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setVoiceMailNumber(String alphaTag,
725767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                   String voiceMailNumber,
726767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                   Message onComplete) {
727ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        Message resp;
728ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        mVmNumber = voiceMailNumber;
729a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        resp = obtainMessage(EVENT_SET_VM_NUMBER_DONE, 0, 0, onComplete);
730ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.setVoiceMailNumber(alphaTag, mVmNumber, resp);
731767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
732767a662ecde33c3979bf02b793d392aca0403162Wink Saville
733767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getVoiceMailNumber() {
734ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        String number = null;
735ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
7367188f946521d64ea21121939d2a4c279f33fe910Wink Saville        // TODO: The default value of voicemail number should be read from a system property
737092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi
738092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi        // Read platform settings for dynamic voicemail number
739092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi        if (getContext().getResources().getBoolean(com.android.internal
740092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi                .R.bool.config_telephony_use_own_number_for_voicemail)) {
741092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi            number = sp.getString(VM_NUMBER_CDMA, getLine1Number());
742092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi        } else {
743092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi            number = sp.getString(VM_NUMBER_CDMA, "*86");
744092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi        }
745ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        return number;
746dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
747dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
748dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /* Returns Number of Voicemails
749dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @hide
750dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
751ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    public int getVoiceMessageCount() {
752ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        int voicemailCount =  mIccRecords.getVoiceMessageCount();
753ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // If mRuimRecords.getVoiceMessageCount returns zero, then there is possibility
754ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // that phone was power cycled and would have lost the voicemail count.
755ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // So get the count from preferences.
756ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        if (voicemailCount == 0) {
757ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
758ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause            voicemailCount = sp.getInt(VM_COUNT_CDMA, 0);
759ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        }
760ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        return voicemailCount;
761767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
762767a662ecde33c3979bf02b793d392aca0403162Wink Saville
763767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getVoiceMailAlphaTag() {
764767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // TODO: Where can we get this value has to be clarified with QC.
765767a662ecde33c3979bf02b793d392aca0403162Wink Saville        String ret = "";//TODO: Remove = "", if we know where to get this value.
766767a662ecde33c3979bf02b793d392aca0403162Wink Saville
767767a662ecde33c3979bf02b793d392aca0403162Wink Saville        //ret = mSIMRecords.getVoiceMailAlphaTag();
768767a662ecde33c3979bf02b793d392aca0403162Wink Saville
769767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (ret == null || ret.length() == 0) {
770767a662ecde33c3979bf02b793d392aca0403162Wink Saville            return mContext.getText(
771767a662ecde33c3979bf02b793d392aca0403162Wink Saville                com.android.internal.R.string.defaultVoiceMailAlphaTag).toString();
772767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
773767a662ecde33c3979bf02b793d392aca0403162Wink Saville
774767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return ret;
775767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
776767a662ecde33c3979bf02b793d392aca0403162Wink Saville
777767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getCallForwardingOption(int commandInterfaceCFReason, Message onComplete) {
778767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getCallForwardingOption: not possible in CDMA");
779767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
780767a662ecde33c3979bf02b793d392aca0403162Wink Saville
781767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setCallForwardingOption(int commandInterfaceCFAction,
782767a662ecde33c3979bf02b793d392aca0403162Wink Saville            int commandInterfaceCFReason,
783767a662ecde33c3979bf02b793d392aca0403162Wink Saville            String dialingNumber,
784767a662ecde33c3979bf02b793d392aca0403162Wink Saville            int timerSeconds,
785767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Message onComplete) {
786767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "setCallForwardingOption: not possible in CDMA");
787767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
788767a662ecde33c3979bf02b793d392aca0403162Wink Saville
789767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
790767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getOutgoingCallerIdDisplay(Message onComplete) {
791767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getOutgoingCallerIdDisplay: not possible in CDMA");
792767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
793767a662ecde33c3979bf02b793d392aca0403162Wink Saville
794767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean
795767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getCallForwardingIndicator() {
796767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getCallForwardingIndicator: not possible in CDMA");
797767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
798767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
799767a662ecde33c3979bf02b793d392aca0403162Wink Saville
800767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void explicitCallTransfer() {
801767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "explicitCallTransfer: not possible in CDMA");
802767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
803767a662ecde33c3979bf02b793d392aca0403162Wink Saville
804767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getLine1AlphaTag() {
805767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getLine1AlphaTag: not possible in CDMA");
806767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return null;
807767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
808767a662ecde33c3979bf02b793d392aca0403162Wink Saville
809b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    /**
8101c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh     * Notify any interested party of a Phone state change  {@link Phone.State}
811767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
812767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /*package*/ void notifyPhoneStateChanged() {
813767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mNotifier.notifyPhoneState(this);
814767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
815767a662ecde33c3979bf02b793d392aca0403162Wink Saville
816767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
8171c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh     * Notify registrants of a change in the call state. This notifies changes in {@link Call.State}
8181c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh     * Use this when changes in the precise call state are needed, else use notifyPhoneStateChanged.
819767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
8201c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh    /*package*/ void notifyPreciseCallStateChanged() {
821767a662ecde33c3979bf02b793d392aca0403162Wink Saville        /* we'd love it if this was package-scoped*/
8221c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh        super.notifyPreciseCallStateChangedP();
823767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
824767a662ecde33c3979bf02b793d392aca0403162Wink Saville
825767a662ecde33c3979bf02b793d392aca0403162Wink Saville     void notifyServiceStateChanged(ServiceState ss) {
826767a662ecde33c3979bf02b793d392aca0403162Wink Saville         super.notifyServiceStateChangedP(ss);
827767a662ecde33c3979bf02b793d392aca0403162Wink Saville     }
828767a662ecde33c3979bf02b793d392aca0403162Wink Saville
829767a662ecde33c3979bf02b793d392aca0403162Wink Saville     void notifyLocationChanged() {
830767a662ecde33c3979bf02b793d392aca0403162Wink Saville         mNotifier.notifyCellLocation(this);
831767a662ecde33c3979bf02b793d392aca0403162Wink Saville     }
832767a662ecde33c3979bf02b793d392aca0403162Wink Saville
833767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /*package*/ void notifyNewRingingConnection(Connection c) {
834767a662ecde33c3979bf02b793d392aca0403162Wink Saville        /* we'd love it if this was package-scoped*/
835767a662ecde33c3979bf02b793d392aca0403162Wink Saville        super.notifyNewRingingConnectionP(c);
836767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
837767a662ecde33c3979bf02b793d392aca0403162Wink Saville
838767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /*package*/ void notifyDisconnect(Connection cn) {
839767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mDisconnectRegistrants.notifyResult(cn);
840767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
841767a662ecde33c3979bf02b793d392aca0403162Wink Saville
842767a662ecde33c3979bf02b793d392aca0403162Wink Saville    void notifyUnknownConnection() {
843767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mUnknownConnectionRegistrants.notifyResult(this);
844767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
845767a662ecde33c3979bf02b793d392aca0403162Wink Saville
846e025391bf499e41650fe6508ac78f097559a31a4Wink Saville    public boolean isInEmergencyCall() {
847e025391bf499e41650fe6508ac78f097559a31a4Wink Saville        return mCT.isInEmergencyCall();
848e025391bf499e41650fe6508ac78f097559a31a4Wink Saville    }
849e025391bf499e41650fe6508ac78f097559a31a4Wink Saville
850e025391bf499e41650fe6508ac78f097559a31a4Wink Saville    public boolean isInEcm() {
851e025391bf499e41650fe6508ac78f097559a31a4Wink Saville        return mIsPhoneInEcmState;
852e025391bf499e41650fe6508ac78f097559a31a4Wink Saville    }
853e025391bf499e41650fe6508ac78f097559a31a4Wink Saville
854dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    void sendEmergencyCallbackModeChange(){
855dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        //Send an Intent
856dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        Intent intent = new Intent(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
85795a1d1a89e383dab893750638c2393dec54833ffWink Saville        intent.putExtra(PHONE_IN_ECM_STATE, mIsPhoneInEcmState);
858dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        ActivityManagerNative.broadcastStickyIntent(intent,null);
85995a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (DBG) Log.d(LOG_TAG, "sendEmergencyCallbackModeChange");
860dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
861dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
862dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    @Override
863dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void exitEmergencyCallbackMode() {
86495a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (mWakeLock.isHeld()) {
86595a1d1a89e383dab893750638c2393dec54833ffWink Saville            mWakeLock.release();
86695a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
867dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        // Send a message which will invoke handleExitEmergencyCallbackMode
868a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.exitEmergencyCallbackMode(obtainMessage(EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE));
869dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
870dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
871dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private void handleEnterEmergencyCallbackMode(Message msg) {
87295a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (DBG) {
87395a1d1a89e383dab893750638c2393dec54833ffWink Saville            Log.d(LOG_TAG, "handleEnterEmergencyCallbackMode,mIsPhoneInEcmState= "
87495a1d1a89e383dab893750638c2393dec54833ffWink Saville                    + mIsPhoneInEcmState);
87595a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
87695a1d1a89e383dab893750638c2393dec54833ffWink Saville        // if phone is not in Ecm mode, and it's changed to Ecm mode
87795a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (mIsPhoneInEcmState == false) {
87895a1d1a89e383dab893750638c2393dec54833ffWink Saville            mIsPhoneInEcmState = true;
879dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            // notify change
880dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            sendEmergencyCallbackModeChange();
88122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville            setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE, "true");
8822563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville
883dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            // Post this runnable so we will automatically exit
884dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            // if no one invokes exitEmergencyCallbackMode() directly.
88522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville            long delayInMillis = SystemProperties.getLong(
88622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville                    TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE);
887a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            postDelayed(mExitEcmRunnable, delayInMillis);
88895a1d1a89e383dab893750638c2393dec54833ffWink Saville            // We don't want to go to sleep while in Ecm
88995a1d1a89e383dab893750638c2393dec54833ffWink Saville            mWakeLock.acquire();
890dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
891dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
892dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
893dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private void handleExitEmergencyCallbackMode(Message msg) {
894dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        AsyncResult ar = (AsyncResult)msg.obj;
89595a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (DBG) {
89695a1d1a89e383dab893750638c2393dec54833ffWink Saville            Log.d(LOG_TAG, "handleExitEmergencyCallbackMode,ar.exception , mIsPhoneInEcmState "
89795a1d1a89e383dab893750638c2393dec54833ffWink Saville                    + ar.exception + mIsPhoneInEcmState);
89895a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
89995a1d1a89e383dab893750638c2393dec54833ffWink Saville        // Remove pending exit Ecm runnable, if any
900a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        removeCallbacks(mExitEcmRunnable);
901dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
90295a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (mEcmExitRespRegistrant != null) {
90395a1d1a89e383dab893750638c2393dec54833ffWink Saville            mEcmExitRespRegistrant.notifyRegistrant(ar);
904dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
905dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        // if exiting ecm success
906dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        if (ar.exception == null) {
90795a1d1a89e383dab893750638c2393dec54833ffWink Saville            if (mIsPhoneInEcmState) {
90895a1d1a89e383dab893750638c2393dec54833ffWink Saville                mIsPhoneInEcmState = false;
90922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville                setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE, "false");
910dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            }
911dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            // send an Intent
912dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            sendEmergencyCallbackModeChange();
91333777d2096c6877ab925db562067ac7272076399Libin Tang            // Re-initiate data connection
91463edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt            mDataConnectionTracker.setInternalDataEnabled(true);
915dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
916dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
917dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
91895a1d1a89e383dab893750638c2393dec54833ffWink Saville    /**
91995a1d1a89e383dab893750638c2393dec54833ffWink Saville     * Handle to cancel or restart Ecm timer in emergency call back mode
92095a1d1a89e383dab893750638c2393dec54833ffWink Saville     * if action is CANCEL_ECM_TIMER, cancel Ecm timer and notify apps the timer is canceled;
92195a1d1a89e383dab893750638c2393dec54833ffWink Saville     * otherwise, restart Ecm timer and notify apps the timer is restarted.
92295a1d1a89e383dab893750638c2393dec54833ffWink Saville     */
92395a1d1a89e383dab893750638c2393dec54833ffWink Saville    void handleTimerInEmergencyCallbackMode(int action) {
92495a1d1a89e383dab893750638c2393dec54833ffWink Saville        switch(action) {
92595a1d1a89e383dab893750638c2393dec54833ffWink Saville        case CANCEL_ECM_TIMER:
926a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            removeCallbacks(mExitEcmRunnable);
9275644b080741bb4fae103617ecbea7a62b0262a56Kenny Root            mEcmTimerResetRegistrants.notifyResult(Boolean.TRUE);
92895a1d1a89e383dab893750638c2393dec54833ffWink Saville            break;
92995a1d1a89e383dab893750638c2393dec54833ffWink Saville        case RESTART_ECM_TIMER:
93095a1d1a89e383dab893750638c2393dec54833ffWink Saville            long delayInMillis = SystemProperties.getLong(
93195a1d1a89e383dab893750638c2393dec54833ffWink Saville                    TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE);
932a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            postDelayed(mExitEcmRunnable, delayInMillis);
9335644b080741bb4fae103617ecbea7a62b0262a56Kenny Root            mEcmTimerResetRegistrants.notifyResult(Boolean.FALSE);
93495a1d1a89e383dab893750638c2393dec54833ffWink Saville            break;
93595a1d1a89e383dab893750638c2393dec54833ffWink Saville        default:
93695a1d1a89e383dab893750638c2393dec54833ffWink Saville            Log.e(LOG_TAG, "handleTimerInEmergencyCallbackMode, unsupported action " + action);
93795a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
93895a1d1a89e383dab893750638c2393dec54833ffWink Saville    }
93995a1d1a89e383dab893750638c2393dec54833ffWink Saville
94095a1d1a89e383dab893750638c2393dec54833ffWink Saville    /**
94195a1d1a89e383dab893750638c2393dec54833ffWink Saville     * Registration point for Ecm timer reset
94295a1d1a89e383dab893750638c2393dec54833ffWink Saville     * @param h handler to notify
94395a1d1a89e383dab893750638c2393dec54833ffWink Saville     * @param what User-defined message code
94495a1d1a89e383dab893750638c2393dec54833ffWink Saville     * @param obj placed in Message.obj
94595a1d1a89e383dab893750638c2393dec54833ffWink Saville     */
94695a1d1a89e383dab893750638c2393dec54833ffWink Saville    public void registerForEcmTimerReset(Handler h, int what, Object obj) {
94795a1d1a89e383dab893750638c2393dec54833ffWink Saville        mEcmTimerResetRegistrants.addUnique(h, what, obj);
94895a1d1a89e383dab893750638c2393dec54833ffWink Saville    }
94995a1d1a89e383dab893750638c2393dec54833ffWink Saville
95095a1d1a89e383dab893750638c2393dec54833ffWink Saville    public void unregisterForEcmTimerReset(Handler h) {
95195a1d1a89e383dab893750638c2393dec54833ffWink Saville        mEcmTimerResetRegistrants.remove(h);
95295a1d1a89e383dab893750638c2393dec54833ffWink Saville    }
95395a1d1a89e383dab893750638c2393dec54833ffWink Saville
954a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville    @Override
955a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville    public void handleMessage(Message msg) {
956a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        AsyncResult ar;
957a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        Message     onComplete;
958767a662ecde33c3979bf02b793d392aca0403162Wink Saville
959a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        switch(msg.what) {
960a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_RADIO_AVAILABLE: {
961a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mCM.getBasebandVersion(obtainMessage(EVENT_GET_BASEBAND_VERSION_DONE));
962767a662ecde33c3979bf02b793d392aca0403162Wink Saville
963a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mCM.getDeviceIdentity(obtainMessage(EVENT_GET_DEVICE_IDENTITY_DONE));
964a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
965a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
966767a662ecde33c3979bf02b793d392aca0403162Wink Saville
967a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_GET_BASEBAND_VERSION_DONE:{
968a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
969767a662ecde33c3979bf02b793d392aca0403162Wink Saville
970a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (ar.exception != null) {
971a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    break;
972767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
973767a662ecde33c3979bf02b793d392aca0403162Wink Saville
974a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (DBG) Log.d(LOG_TAG, "Baseband version: " + ar.result);
975a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                setSystemProperty(TelephonyProperties.PROPERTY_BASEBAND_VERSION, (String)ar.result);
976a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
977a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
978767a662ecde33c3979bf02b793d392aca0403162Wink Saville
979a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_GET_DEVICE_IDENTITY_DONE:{
980a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
981767a662ecde33c3979bf02b793d392aca0403162Wink Saville
982a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (ar.exception != null) {
983a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    break;
984767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
985a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                String[] respId = (String[])ar.result;
9862ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang                mImei = respId[0];
9872ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang                mImeiSv = respId[1];
988a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mEsn  =  respId[2];
989a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mMeid =  respId[3];
990a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
991a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
992767a662ecde33c3979bf02b793d392aca0403162Wink Saville
993a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_EMERGENCY_CALLBACK_MODE_ENTER:{
994a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                handleEnterEmergencyCallbackMode(msg);
995a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
996a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
997dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
99880198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka            case EVENT_ICC_RECORD_EVENTS:
99980198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                ar = (AsyncResult)msg.obj;
100080198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                processIccRecordEvents((Integer)ar.result);
100180198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                break;
100280198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka
1003a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case  EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE:{
1004a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                handleExitEmergencyCallbackMode(msg);
1005a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1006a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1007dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1008a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_RUIM_RECORDS_LOADED:{
1009a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                Log.d(LOG_TAG, "Event EVENT_RUIM_RECORDS_LOADED Received");
1010b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby                updateCurrentCarrierInProvider();
1011a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1012a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1013767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1014a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_RADIO_OFF_OR_NOT_AVAILABLE:{
1015a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                Log.d(LOG_TAG, "Event EVENT_RADIO_OFF_OR_NOT_AVAILABLE Received");
1016a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1017a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1018767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1019a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_RADIO_ON:{
1020a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                Log.d(LOG_TAG, "Event EVENT_RADIO_ON Received");
1021fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla                handleCdmaSubscriptionSource(mCdmaSSM.getCdmaSubscriptionSource());
1022fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla            }
1023fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla            break;
1024fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla
1025fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla            case EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED:{
1026fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla                Log.d(LOG_TAG, "EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED");
1027fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla                handleCdmaSubscriptionSource(mCdmaSSM.getCdmaSubscriptionSource());
1028a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1029a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1030767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1031a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_SSN:{
1032a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                Log.d(LOG_TAG, "Event EVENT_SSN Received");
1033a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1034a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1035767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1036a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_REGISTERED_TO_NETWORK:{
1037a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                Log.d(LOG_TAG, "Event EVENT_REGISTERED_TO_NETWORK Received");
1038a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1039a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1040767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1041a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_NV_READY:{
1042a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                Log.d(LOG_TAG, "Event EVENT_NV_READY Received");
1043c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo                prepareEri();
1044a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1045a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1046767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1047a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_SET_VM_NUMBER_DONE:{
1048a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
1049a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (IccException.class.isInstance(ar.exception)) {
1050a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    storeVoiceMailNumber(mVmNumber);
1051a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    ar.exception = null;
1052767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
1053a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                onComplete = (Message) ar.userObj;
1054a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (onComplete != null) {
1055a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    AsyncResult.forMessage(onComplete, ar.result, ar.exception);
1056a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    onComplete.sendToTarget();
1057ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause                }
1058a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1059a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1060ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause
1061a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            default:{
1062a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                super.handleMessage(msg);
1063767a662ecde33c3979bf02b793d392aca0403162Wink Saville            }
1064767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
1065767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1066767a662ecde33c3979bf02b793d392aca0403162Wink Saville
106780198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka    private void processIccRecordEvents(int eventCode) {
106880198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka        switch (eventCode) {
106980198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka            case RuimRecords.EVENT_MWI:
107080198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                notifyMessageWaitingIndicator();
107180198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                break;
107280198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka
107380198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka            default:
107480198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                Log.e(LOG_TAG,"Unknown icc records event code " + eventCode);
107580198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                break;
107680198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka        }
107780198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka    }
107880198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka
1079dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1080fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla     * Handles the call to get the subscription source
1081fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla     *
108280198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka     * @param newSubscriptionSource holds the new CDMA subscription source value
1083fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla     */
1084fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla    private void handleCdmaSubscriptionSource(int newSubscriptionSource) {
1085fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla        if (newSubscriptionSource != mCdmaSubscriptionSource) {
1086fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla             mCdmaSubscriptionSource = newSubscriptionSource;
1087fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla             if (newSubscriptionSource == CDMA_SUBSCRIPTION_NV) {
1088fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla                 // NV is ready when subscription source is NV
1089fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla                 sendMessage(obtainMessage(EVENT_NV_READY));
1090fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla             }
1091fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla        }
1092fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla    }
1093fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla
1094fc2cbe9b46ab17a401dc50f8e0dbb677ed012299Naveen Kalla    /**
1095dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Retrieves the PhoneSubInfo of the CDMAPhone
1096dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1097dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public PhoneSubInfo getPhoneSubInfo() {
1098767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSubInfo;
1099dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1100767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1101dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1102dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Retrieves the IccSmsInterfaceManager of the CDMAPhone
1103dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1104dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public IccSmsInterfaceManager getIccSmsInterfaceManager() {
1105dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        return mRuimSmsInterfaceManager;
1106dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1107767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1108dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1109dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Retrieves the IccPhoneBookInterfaceManager of the CDMAPhone
1110dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1111dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public IccPhoneBookInterfaceManager getIccPhoneBookInterfaceManager() {
1112dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        return mRuimPhoneBookInterfaceManager;
1113dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1114767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1115e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void registerForEriFileLoaded(Handler h, int what, Object obj) {
1116e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        Registrant r = new Registrant (h, what, obj);
1117e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mEriFileLoadedRegistrants.add(r);
1118e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1119e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1120e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void unregisterForEriFileLoaded(Handler h) {
1121e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mEriFileLoadedRegistrants.remove(h);
1122e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1123e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1124dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    // override for allowing access from other classes of this package
1125dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1126dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * {@inheritDoc}
1127dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1128dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public final void setSystemProperty(String property, String value) {
1129dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        super.setSystemProperty(property, value);
1130dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1131767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1132dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1133dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Activate or deactivate cell broadcast SMS.
1134dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     *
1135dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @param activate 0 = activate, 1 = deactivate
1136dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @param response Callback message is empty on completion
1137dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1138dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void activateCellBroadcastSms(int activate, Message response) {
1139ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        Log.e(LOG_TAG, "[CDMAPhone] activateCellBroadcastSms() is obsolete; use SmsManager");
1140ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        response.sendToTarget();
1141dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1142767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1143dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1144dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Query the current configuration of cdma cell broadcast SMS.
1145dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     *
1146dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @param response Callback message is empty on completion
1147dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1148dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void getCellBroadcastSmsConfig(Message response) {
1149ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        Log.e(LOG_TAG, "[CDMAPhone] getCellBroadcastSmsConfig() is obsolete; use SmsManager");
1150ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        response.sendToTarget();
1151dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1152767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1153dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1154dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Configure cdma cell broadcast SMS.
1155dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     *
1156dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @param response Callback message is empty on completion
1157dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1158dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void setCellBroadcastSmsConfig(int[] configValuesArray, Message response) {
1159ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        Log.e(LOG_TAG, "[CDMAPhone] setCellBroadcastSmsConfig() is obsolete; use SmsManager");
1160ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        response.sendToTarget();
1161dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1162dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
11634d8ae85b5de8a90a597e4b649c6ee7208e446e3bWink Saville    /**
11644d8ae85b5de8a90a597e4b649c6ee7208e446e3bWink Saville     * Returns true if OTA Service Provisioning needs to be performed.
11654d8ae85b5de8a90a597e4b649c6ee7208e446e3bWink Saville     */
11664d8ae85b5de8a90a597e4b649c6ee7208e446e3bWink Saville    @Override
11674d8ae85b5de8a90a597e4b649c6ee7208e446e3bWink Saville    public boolean needsOtaServiceProvisioning() {
1168fd2d01302781af91d77557a99874111a4fee8365Wink Saville        return mSST.getOtasp() != ServiceStateTracker.OTASP_NOT_NEEDED;
11694d8ae85b5de8a90a597e4b649c6ee7208e446e3bWink Saville    }
11704d8ae85b5de8a90a597e4b649c6ee7208e446e3bWink Saville
1171e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final String IS683A_FEATURE_CODE = "*228";
1172e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final int IS683A_FEATURE_CODE_NUM_DIGITS = 4;
1173e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final int IS683A_SYS_SEL_CODE_NUM_DIGITS = 2;
1174e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final int IS683A_SYS_SEL_CODE_OFFSET = 4;
1175dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1176dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_800MHZ_A_BAND = 0;
1177dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_800MHZ_B_BAND = 1;
1178dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_A_BLOCK = 2;
1179dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_B_BLOCK = 3;
1180dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_C_BLOCK = 4;
1181dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_D_BLOCK = 5;
1182dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_E_BLOCK = 6;
1183dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_F_BLOCK = 7;
1184e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final int INVALID_SYSTEM_SELECTION_CODE = -1;
1185dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1186b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    private static boolean isIs683OtaSpDialStr(String dialStr) {
1187dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        int sysSelCodeInt;
1188dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        boolean isOtaspDialString = false;
1189dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        int dialStrLen = dialStr.length();
1190dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1191dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        if (dialStrLen == IS683A_FEATURE_CODE_NUM_DIGITS) {
1192dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            if (dialStr.equals(IS683A_FEATURE_CODE)) {
1193dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                isOtaspDialString = true;
1194dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            }
1195e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        } else {
1196e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            sysSelCodeInt = extractSelCodeFromOtaSpNum(dialStr);
1197e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            switch (sysSelCodeInt) {
1198e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_800MHZ_A_BAND:
1199e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_800MHZ_B_BAND:
1200e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_A_BLOCK:
1201e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_B_BLOCK:
1202e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_C_BLOCK:
1203e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_D_BLOCK:
1204e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_E_BLOCK:
1205e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_F_BLOCK:
1206e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    isOtaspDialString = true;
1207e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    break;
1208e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                default:
1209e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    break;
1210e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            }
1211e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        }
1212e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        return isOtaspDialString;
1213e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    }
1214e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    /**
1215e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * This function extracts the system selection code from the dial string.
1216e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     */
1217b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    private static int extractSelCodeFromOtaSpNum(String dialStr) {
1218e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        int dialStrLen = dialStr.length();
1219e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        int sysSelCodeInt = INVALID_SYSTEM_SELECTION_CODE;
1220e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
1221e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if ((dialStr.regionMatches(0, IS683A_FEATURE_CODE,
1222e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                                   0, IS683A_FEATURE_CODE_NUM_DIGITS)) &&
1223e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            (dialStrLen >= (IS683A_FEATURE_CODE_NUM_DIGITS +
1224e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                            IS683A_SYS_SEL_CODE_NUM_DIGITS))) {
1225e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                // Since we checked the condition above, the system selection code
1226e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                // extracted from dialStr will not cause any exception
1227e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                sysSelCodeInt = Integer.parseInt (
1228e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                                dialStr.substring (IS683A_FEATURE_CODE_NUM_DIGITS,
1229e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                                IS683A_FEATURE_CODE_NUM_DIGITS + IS683A_SYS_SEL_CODE_NUM_DIGITS));
1230e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        }
1231e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if (DBG) Log.d(LOG_TAG, "extractSelCodeFromOtaSpNum " + sysSelCodeInt);
1232e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        return sysSelCodeInt;
1233e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    }
1234dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1235e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    /**
1236e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * This function checks if the system selection code extracted from
1237e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * the dial string "sysSelCodeInt' is the system selection code specified
1238e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * in the carrier ota sp number schema "sch".
1239e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     */
1240b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    private static boolean
1241e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    checkOtaSpNumBasedOnSysSelCode (int sysSelCodeInt, String sch[]) {
1242e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        boolean isOtaSpNum = false;
1243e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        try {
1244e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            // Get how many number of system selection code ranges
1245e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            int selRc = Integer.parseInt((String)sch[1]);
1246e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            for (int i = 0; i < selRc; i++) {
1247e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                if (!TextUtils.isEmpty(sch[i+2]) && !TextUtils.isEmpty(sch[i+3])) {
1248e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    int selMin = Integer.parseInt((String)sch[i+2]);
1249e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    int selMax = Integer.parseInt((String)sch[i+3]);
1250e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    // Check if the selection code extracted from the dial string falls
1251e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    // within any of the range pairs specified in the schema.
1252e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    if ((sysSelCodeInt >= selMin) && (sysSelCodeInt <= selMax)) {
1253e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        isOtaSpNum = true;
1254dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                        break;
1255e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    }
1256dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                }
1257dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            }
1258e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        } catch (NumberFormatException ex) {
1259e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            // If the carrier ota sp number schema is not correct, we still allow dial
1260e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            // and only log the error:
1261e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            Log.e(LOG_TAG, "checkOtaSpNumBasedOnSysSelCode, error", ex);
1262dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
1263e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        return isOtaSpNum;
1264e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    }
1265e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
1266e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    // Define the pattern/format for carrier specified OTASP number schema.
1267e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    // It separates by comma and/or whitespace.
1268e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static Pattern pOtaSpNumSchema = Pattern.compile("[,\\s]+");
1269e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
1270e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    /**
1271e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * The following function checks if a dial string is a carrier specified
1272e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * OTASP number or not by checking against the OTASP number schema stored
1273e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * in PROPERTY_OTASP_NUM_SCHEMA.
1274e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *
1275e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * Currently, there are 2 schemas for carriers to specify the OTASP number:
1276e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * 1) Use system selection code:
1277e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    The schema is:
1278e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    SELC,the # of code pairs,min1,max1,min2,max2,...
1279e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    e.g "SELC,3,10,20,30,40,60,70" indicates that there are 3 pairs of
1280e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    selection codes, and they are {10,20}, {30,40} and {60,70} respectively.
1281e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *
1282e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * 2) Use feature code:
1283e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    The schema is:
1284e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    "FC,length of feature code,feature code".
1285e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *     e.g "FC,2,*2" indicates that the length of the feature code is 2,
1286e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *     and the code itself is "*2".
1287e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     */
1288e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private boolean isCarrierOtaSpNum(String dialStr) {
1289e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        boolean isOtaSpNum = false;
1290e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        int sysSelCodeInt = extractSelCodeFromOtaSpNum(dialStr);
1291e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if (sysSelCodeInt == INVALID_SYSTEM_SELECTION_CODE) {
1292e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            return isOtaSpNum;
1293e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        }
1294e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        // mCarrierOtaSpNumSchema is retrieved from PROPERTY_OTASP_NUM_SCHEMA:
1295e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if (!TextUtils.isEmpty(mCarrierOtaSpNumSchema)) {
1296e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            Matcher m = pOtaSpNumSchema.matcher(mCarrierOtaSpNumSchema);
1297e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            if (DBG) {
1298e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                Log.d(LOG_TAG, "isCarrierOtaSpNum,schema" + mCarrierOtaSpNumSchema);
1299e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            }
1300e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
1301e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            if (m.find()) {
1302e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                String sch[] = pOtaSpNumSchema.split(mCarrierOtaSpNumSchema);
1303e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                // If carrier uses system selection code mechanism
1304e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                if (!TextUtils.isEmpty(sch[0]) && sch[0].equals("SELC")) {
1305e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    if (sysSelCodeInt!=INVALID_SYSTEM_SELECTION_CODE) {
1306e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        isOtaSpNum=checkOtaSpNumBasedOnSysSelCode(sysSelCodeInt,sch);
1307e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    } else {
1308e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        if (DBG) {
1309e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                            Log.d(LOG_TAG, "isCarrierOtaSpNum,sysSelCodeInt is invalid");
1310e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        }
1311e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    }
1312e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                } else if (!TextUtils.isEmpty(sch[0]) && sch[0].equals("FC")) {
1313e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    int fcLen =  Integer.parseInt((String)sch[1]);
1314e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    String fc = (String)sch[2];
1315e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    if (dialStr.regionMatches(0,fc,0,fcLen)) {
1316e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        isOtaSpNum = true;
1317e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    } else {
1318e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        if (DBG) Log.d(LOG_TAG, "isCarrierOtaSpNum,not otasp number");
1319e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    }
1320e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                } else {
1321e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    if (DBG) {
1322e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        Log.d(LOG_TAG, "isCarrierOtaSpNum,ota schema not supported" + sch[0]);
1323e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    }
1324e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                }
1325e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            } else {
1326e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                if (DBG) {
1327e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    Log.d(LOG_TAG, "isCarrierOtaSpNum,ota schema pattern not right" +
1328e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                          mCarrierOtaSpNumSchema);
1329e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                }
1330e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            }
1331e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        } else {
1332e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            if (DBG) Log.d(LOG_TAG, "isCarrierOtaSpNum,ota schema pattern empty");
1333e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        }
1334e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        return isOtaSpNum;
1335dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1336767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1337d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang    /**
1338d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     * isOTASPNumber: checks a given number against the IS-683A OTASP dial string and carrier
1339d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     * OTASP dial string.
1340d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     *
1341d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     * @param dialStr the number to look up.
1342d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     * @return true if the number is in IS-683A OTASP dial string or carrier OTASP dial string
1343d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     */
1344dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    @Override
1345d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang    public  boolean isOtaSpNumber(String dialStr){
1346d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        boolean isOtaSpNum = false;
13479e534153264138cfee383c626db92b934fafc1afTammo Spalink        String dialableStr = PhoneNumberUtils.extractNetworkPortionAlt(dialStr);
1348d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        if (dialableStr != null) {
1349d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang            isOtaSpNum = isIs683OtaSpDialStr(dialableStr);
1350d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang            if (isOtaSpNum == false) {
1351d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang                isOtaSpNum = isCarrierOtaSpNum(dialableStr);
1352d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang            }
1353d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        }
1354d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        if (DBG) Log.d(LOG_TAG, "isOtaSpNumber " + isOtaSpNum);
1355d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        return isOtaSpNum;
1356d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang    }
1357e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1358e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    @Override
1359e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public int getCdmaEriIconIndex() {
1360cc5c1ad53ce4541f17842daba29e7ccba221c079Robert Greenwalt        return getServiceState().getCdmaEriIconIndex();
1361e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1362e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1363e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    /**
1364e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     * Returns the CDMA ERI icon mode,
1365e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     * 0 - ON
1366e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     * 1 - FLASHING
1367e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     */
1368e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    @Override
1369e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public int getCdmaEriIconMode() {
1370cc5c1ad53ce4541f17842daba29e7ccba221c079Robert Greenwalt        return getServiceState().getCdmaEriIconMode();
1371e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1372e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1373e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    /**
1374e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     * Returns the CDMA ERI text,
1375e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     */
1376e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    @Override
1377e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public String getCdmaEriText() {
1378e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        int roamInd = getServiceState().getCdmaRoamingIndicator();
1379e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        int defRoamInd = getServiceState().getCdmaDefaultRoamingIndicator();
1380f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville        return mEriManager.getCdmaEriText(roamInd, defRoamInd);
1381e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1382ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause
1383ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    /**
1384ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause     * Store the voicemail number in preferences
1385ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause     */
1386ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    private void storeVoiceMailNumber(String number) {
1387ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // Update the preference value of voicemail number
1388ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
1389ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        SharedPreferences.Editor editor = sp.edit();
1390ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        editor.putString(VM_NUMBER_CDMA, number);
1391fa8e271636b9e9b86f247cdb4c91d9ebe9675c27Brad Fitzpatrick        editor.apply();
1392ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    }
1393ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause
1394142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    /**
1395142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     * Sets PROPERTY_ICC_OPERATOR_ISO_COUNTRY property
1396142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     *
1397142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     */
1398142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    private void setIsoCountryProperty(String operatorNumeric) {
1399142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        if (TextUtils.isEmpty(operatorNumeric)) {
1400142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, "");
1401142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        } else {
1402142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            String iso = "";
1403142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            try {
1404142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                iso = MccTable.countryCodeForMcc(Integer.parseInt(
1405142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                        operatorNumeric.substring(0,3)));
1406142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            } catch (NumberFormatException ex) {
1407142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                Log.w(LOG_TAG, "countryCodeForMcc error" + ex);
1408142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            } catch (StringIndexOutOfBoundsException ex) {
1409142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                Log.w(LOG_TAG, "countryCodeForMcc error" + ex);
1410142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            }
1411142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
1412142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, iso);
1413142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        }
1414142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    }
1415142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
1416142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    /**
1417144fdfec240a56890657d2248a22bdda9f22470cWink Saville     * Sets the "current" field in the telephony provider according to the
1418144fdfec240a56890657d2248a22bdda9f22470cWink Saville     * build-time operator numeric property
1419142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     *
1420142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     * @return true for success; false otherwise.
1421142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     */
1422144fdfec240a56890657d2248a22bdda9f22470cWink Saville    boolean updateCurrentCarrierInProvider(String operatorNumeric) {
1423142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        if (!TextUtils.isEmpty(operatorNumeric)) {
1424142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            try {
1425142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
1426142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                ContentValues map = new ContentValues();
1427142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                map.put(Telephony.Carriers.NUMERIC, operatorNumeric);
1428b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby                log("updateCurrentCarrierInProvider from system: numeric=" + operatorNumeric);
1429142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                getContext().getContentResolver().insert(uri, map);
1430144fdfec240a56890657d2248a22bdda9f22470cWink Saville
1431144fdfec240a56890657d2248a22bdda9f22470cWink Saville                // Updates MCC MNC device configuration information
143280198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                MccTable.updateMccMncConfiguration(mContext, operatorNumeric);
1433144fdfec240a56890657d2248a22bdda9f22470cWink Saville
1434142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                return true;
1435142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            } catch (SQLException e) {
1436142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                Log.e(LOG_TAG, "Can't store current operator", e);
1437142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            }
1438142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        }
1439142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        return false;
1440142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    }
14411f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville
1442b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    /**
1443b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby     * Sets the "current" field in the telephony provider according to the SIM's operator.
1444b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby     * Implemented in {@link CDMALTEPhone} for CDMA/LTE devices.
1445b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby     *
1446b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby     * @return true for success; false otherwise.
1447b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby     */
1448b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    boolean updateCurrentCarrierInProvider() {
1449b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        return true;
1450b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    }
1451b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby
1452c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo    public void prepareEri() {
1453c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo        mEriManager.loadEriFile();
1454c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo        if(mEriManager.isEriFileLoaded()) {
1455c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo            // when the ERI file is loaded
1456c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo            log("ERI read, notify registrants");
1457c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo            mEriFileLoadedRegistrants.notifyRegistrants();
1458c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo        }
1459c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo    }
1460c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo
1461c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo    public boolean isEriFileLoaded() {
1462c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo        return mEriManager.isEriFileLoaded();
1463c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo    }
1464c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo
1465ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville    private void registerForRuimRecordEvents() {
1466ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null);
1467ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.registerForRecordsLoaded(this, EVENT_RUIM_RECORDS_LOADED, null);
146880198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka    }
146980198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka
1470ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville    private void unregisterForRuimRecordEvents() {
1471ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.unregisterForRecordsEvents(this);
1472ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.unregisterForRecordsLoaded(this);
147380198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka    }
147480198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka
14751f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville    protected void log(String s) {
14761f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville        if (DBG)
14771f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville            Log.d(LOG_TAG, "[CDMAPhone] " + s);
14781f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville    }
147930ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville
148030ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville    @Override
148130ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
148230ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println("CDMAPhone extends:");
148330ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        super.dump(fd, pw, args);
148430ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mVmNumber=" + mVmNumber);
148530ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mCT=" + mCT);
148630ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mSST=" + mSST);
148730ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mCdmaSSM=" + mCdmaSSM);
148830ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mPendingMmis=" + mPendingMmis);
148930ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mRuimPhoneBookInterfaceManager=" + mRuimPhoneBookInterfaceManager);
149030ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mRuimSmsInterfaceManager=" + mRuimSmsInterfaceManager);
149130ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mCdmaSubscriptionSource=" + mCdmaSubscriptionSource);
149230ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mSubInfo=" + mSubInfo);
149330ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mEriManager=" + mEriManager);
149430ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mWakeLock=" + mWakeLock);
149530ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mIsPhoneInEcmState=" + mIsPhoneInEcmState);
149630ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        if (VDBG) pw.println(" mImei=" + mImei);
149730ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        if (VDBG) pw.println(" mImeiSv=" + mImeiSv);
149830ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        if (VDBG) pw.println(" mEsn=" + mEsn);
149930ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        if (VDBG) pw.println(" mMeid=" + mMeid);
150030ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mCarrierOtaSpNumSchema=" + mCarrierOtaSpNumSchema);
150130ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" getCdmaEriIconIndex()=" + getCdmaEriIconIndex());
150230ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" getCdmaEriIconMode()=" + getCdmaEriIconMode());
150330ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" getCdmaEriText()=" + getCdmaEriText());
150430ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" isMinInfoReady()=" + isMinInfoReady());
150530ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" isCspPlmnEnabled()=" + isCspPlmnEnabled());
150630ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville    }
1507767a662ecde33c3979bf02b793d392aca0403162Wink Saville}
1508