CDMAPhone.java revision 95a1d1a89e383dab893750638c2393dec54833ff
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;
20767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.content.Context;
21142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport android.content.ContentValues;
22e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.content.Intent;
23142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport android.content.res.Configuration;
24ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krauseimport android.content.SharedPreferences;
25142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport android.database.SQLException;
26142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport android.net.Uri;
27767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.AsyncResult;
28767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Handler;
29767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Looper;
30767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Message;
3195a1d1a89e383dab893750638c2393dec54833ffWink Savilleimport android.os.PowerManager;
3295a1d1a89e383dab893750638c2393dec54833ffWink Savilleimport android.os.PowerManager.WakeLock;
33767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Registrant;
34767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.RegistrantList;
35142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport android.os.RemoteException;
36767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.SystemProperties;
37ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krauseimport android.preference.PreferenceManager;
38767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.provider.Settings;
39142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport android.provider.Telephony;
40767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.telephony.CellLocation;
41767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.telephony.PhoneNumberUtils;
42767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.telephony.ServiceState;
43e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
44767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.text.TextUtils;
45767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.util.Log;
46767a662ecde33c3979bf02b793d392aca0403162Wink Saville
471c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganeshimport com.android.internal.telephony.Call;
48767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.CallStateException;
4990cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalinkimport com.android.internal.telephony.CommandException;
50767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.CommandsInterface;
51767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.Connection;
52767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.DataConnection;
53142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville// TODO(Moto): need to move MccTable from telephony.gsm to telephony
54142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville// since there is no difference between CDMA and GSM for MccTable and
55142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville// CDMA uses gsm's MccTable is not good.
56142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport com.android.internal.telephony.gsm.MccTable;
57767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccCard;
58ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krauseimport com.android.internal.telephony.IccException;
59767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccFileHandler;
60767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccPhoneBookInterfaceManager;
61767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccSmsInterfaceManager;
62767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.MmiCode;
63767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.Phone;
64767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.PhoneBase;
65767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.PhoneNotifier;
66767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.PhoneProxy;
67767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.PhoneSubInfo;
68767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.RILConstants;
69e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport com.android.internal.telephony.TelephonyIntents;
709bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganeshimport com.android.internal.telephony.TelephonyProperties;
71767a662ecde33c3979bf02b793d392aca0403162Wink Saville
72142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA;
73142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC;
74142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY;
75142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
76767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport java.util.List;
7795a1d1a89e383dab893750638c2393dec54833ffWink Saville
78e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
79e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Liimport java.util.regex.Matcher;
80e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Liimport java.util.regex.Pattern;
81e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
82767a662ecde33c3979bf02b793d392aca0403162Wink Saville/**
83767a662ecde33c3979bf02b793d392aca0403162Wink Saville * {@hide}
84767a662ecde33c3979bf02b793d392aca0403162Wink Saville */
85767a662ecde33c3979bf02b793d392aca0403162Wink Savillepublic class CDMAPhone extends PhoneBase {
86767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static final String LOG_TAG = "CDMA";
87e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final boolean DBG = true;
88767a662ecde33c3979bf02b793d392aca0403162Wink Saville
8922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville    // Default Emergency Callback Mode exit timer
90019581bf6055eb69ee7e4cb844dafe2b6c23597eCheng Yang    private static final int DEFAULT_ECM_EXIT_TIMER_VALUE = 300000;
9195a1d1a89e383dab893750638c2393dec54833ffWink Saville
92ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    static final String VM_COUNT_CDMA = "vm_count_key_cdma";
93ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    private static final String VM_NUMBER_CDMA = "vm_number_key_cdma";
94ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    private String mVmNumber = null;
9522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville
9695a1d1a89e383dab893750638c2393dec54833ffWink Saville    static final int RESTART_ECM_TIMER = 0; // restart Ecm timer
9795a1d1a89e383dab893750638c2393dec54833ffWink Saville    static final int CANCEL_ECM_TIMER = 1; // cancel Ecm timer
9895a1d1a89e383dab893750638c2393dec54833ffWink Saville
99767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //***** Instance Variables
100767a662ecde33c3979bf02b793d392aca0403162Wink Saville    CdmaCallTracker mCT;
101767a662ecde33c3979bf02b793d392aca0403162Wink Saville    CdmaSMSDispatcher mSMS;
102767a662ecde33c3979bf02b793d392aca0403162Wink Saville    CdmaServiceStateTracker mSST;
103767a662ecde33c3979bf02b793d392aca0403162Wink Saville    RuimFileHandler mRuimFileHandler;
104767a662ecde33c3979bf02b793d392aca0403162Wink Saville    RuimRecords mRuimRecords;
105767a662ecde33c3979bf02b793d392aca0403162Wink Saville    RuimCard mRuimCard;
106767a662ecde33c3979bf02b793d392aca0403162Wink Saville    MyHandler h;
107767a662ecde33c3979bf02b793d392aca0403162Wink Saville    RuimPhoneBookInterfaceManager mRuimPhoneBookInterfaceManager;
108767a662ecde33c3979bf02b793d392aca0403162Wink Saville    RuimSmsInterfaceManager mRuimSmsInterfaceManager;
109767a662ecde33c3979bf02b793d392aca0403162Wink Saville    PhoneSubInfo mSubInfo;
110e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    EriManager mEriManager;
11195a1d1a89e383dab893750638c2393dec54833ffWink Saville    WakeLock mWakeLock;
112767a662ecde33c3979bf02b793d392aca0403162Wink Saville
113e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    // mNvLoadedRegistrants are informed after the EVENT_NV_READY
114e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    private RegistrantList mNvLoadedRegistrants = new RegistrantList();
115e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
116e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    // mEriFileLoadedRegistrants are informed after the ERI text has been loaded
117e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    private RegistrantList mEriFileLoadedRegistrants = new RegistrantList();
118dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
11995a1d1a89e383dab893750638c2393dec54833ffWink Saville    // mEcmTimerResetRegistrants are informed after Ecm timer is canceled or re-started
12095a1d1a89e383dab893750638c2393dec54833ffWink Saville    private RegistrantList mEcmTimerResetRegistrants = new RegistrantList();
12195a1d1a89e383dab893750638c2393dec54833ffWink Saville
12295a1d1a89e383dab893750638c2393dec54833ffWink Saville    // mEcmExitRespRegistrant is informed after the phone has been exited
123dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    //the emergency callback mode
124dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    //keep track of if phone is in emergency callback mode
12595a1d1a89e383dab893750638c2393dec54833ffWink Saville    private boolean mIsPhoneInEcmState;
12695a1d1a89e383dab893750638c2393dec54833ffWink Saville    private Registrant mEcmExitRespRegistrant;
127767a662ecde33c3979bf02b793d392aca0403162Wink Saville    private String mEsn;
128767a662ecde33c3979bf02b793d392aca0403162Wink Saville    private String mMeid;
129e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    // string to define how the carrier specifies its own ota sp number
130e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private String mCarrierOtaSpNumSchema;
1312563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville
13295a1d1a89e383dab893750638c2393dec54833ffWink Saville    // A runnable which is used to automatically exit from Ecm after a period of time.
133dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private Runnable mExitEcmRunnable = new Runnable() {
134dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        public void run() {
135dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            exitEmergencyCallbackMode();
136dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
137dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    };
138767a662ecde33c3979bf02b793d392aca0403162Wink Saville
139767a662ecde33c3979bf02b793d392aca0403162Wink Saville    Registrant mPostDialHandler;
140767a662ecde33c3979bf02b793d392aca0403162Wink Saville
141767a662ecde33c3979bf02b793d392aca0403162Wink Saville
142767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //***** Constructors
143767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier) {
144767a662ecde33c3979bf02b793d392aca0403162Wink Saville        this(context,ci,notifier, false);
145767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
146767a662ecde33c3979bf02b793d392aca0403162Wink Saville
147767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier,
148767a662ecde33c3979bf02b793d392aca0403162Wink Saville            boolean unitTestMode) {
149767a662ecde33c3979bf02b793d392aca0403162Wink Saville        super(notifier, context, unitTestMode);
150767a662ecde33c3979bf02b793d392aca0403162Wink Saville
151767a662ecde33c3979bf02b793d392aca0403162Wink Saville        h = new MyHandler();
152767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM = ci;
153767a662ecde33c3979bf02b793d392aca0403162Wink Saville
154767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.setPhoneType(RILConstants.CDMA_PHONE);
155767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT = new CdmaCallTracker(this);
156767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSST = new CdmaServiceStateTracker (this);
157767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSMS = new CdmaSMSDispatcher(this);
158767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mIccFileHandler = new RuimFileHandler(this);
159767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mRuimRecords = new RuimRecords(this);
160767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mDataConnection = new CdmaDataConnectionTracker (this);
161767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mRuimCard = new RuimCard(this);
162767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mRuimPhoneBookInterfaceManager = new RuimPhoneBookInterfaceManager(this);
163767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mRuimSmsInterfaceManager = new RuimSmsInterfaceManager(this);
164767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSubInfo = new PhoneSubInfo(this);
165e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mEriManager = new EriManager(this, context, EriManager.ERI_FROM_XML);
166767a662ecde33c3979bf02b793d392aca0403162Wink Saville
167767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.registerForAvailable(h, EVENT_RADIO_AVAILABLE, null);
168767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mRuimRecords.registerForRecordsLoaded(h, EVENT_RUIM_RECORDS_LOADED, null);
169767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.registerForOffOrNotAvailable(h, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
170767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.registerForOn(h, EVENT_RADIO_ON, null);
171767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.setOnSuppServiceNotification(h, EVENT_SSN, null);
172767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.setOnCallRing(h, EVENT_CALL_RING, null);
173767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSST.registerForNetworkAttach(h, EVENT_REGISTERED_TO_NETWORK, null);
174767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.registerForNVReady(h, EVENT_NV_READY, null);
175dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        mCM.setEmergencyCallbackMode(h, EVENT_EMERGENCY_CALLBACK_MODE_ENTER, null);
176e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
17795a1d1a89e383dab893750638c2393dec54833ffWink Saville        PowerManager pm
17895a1d1a89e383dab893750638c2393dec54833ffWink Saville            = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
17995a1d1a89e383dab893750638c2393dec54833ffWink Saville        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,LOG_TAG);
180767a662ecde33c3979bf02b793d392aca0403162Wink Saville
181767a662ecde33c3979bf02b793d392aca0403162Wink Saville        //Change the system setting
1829bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        SystemProperties.set(TelephonyProperties.CURRENT_ACTIVE_PHONE,
1839bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh                new Integer(RILConstants.CDMA_PHONE).toString());
184dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
18522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        // This is needed to handle phone process crashes
18622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
18795a1d1a89e383dab893750638c2393dec54833ffWink Saville        mIsPhoneInEcmState = inEcm.equals("true");
188ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause
189e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        // get the string that specifies the carrier OTA Sp number
190e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        mCarrierOtaSpNumSchema = SystemProperties.get(
191e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                TelephonyProperties.PROPERTY_OTASP_NUM_SCHEMA,"");
192e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
193142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        // Sets operator alpha property by retrieving from build-time system property
194142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        String operatorAlpha = SystemProperties.get("ro.cdma.home.operator.alpha");
195142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, operatorAlpha);
196142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
197142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        // Sets operator numeric property by retrieving from build-time system property
198142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        String operatorNumeric = SystemProperties.get("ro.cdma.home.operator.numeric");
199142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, operatorNumeric);
200142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
201142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        // Sets iso country property by retrieving from build-time system property
202142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        setIsoCountryProperty(operatorNumeric);
203142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
204142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        // Sets current entry in the telephony carrier table
205142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        updateCurrentCarrierInProvider(operatorNumeric);
206142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
207142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        // Updates MCC MNC device configuration information
208142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        updateMccMncConfiguration(operatorNumeric);
209142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
210ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // Notify voicemails.
211ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        notifier.notifyMessageWaitingChanged(this);
212767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
213767a662ecde33c3979bf02b793d392aca0403162Wink Saville
214767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void dispose() {
215767a662ecde33c3979bf02b793d392aca0403162Wink Saville        synchronized(PhoneProxy.lockForRadioTechnologyChange) {
216767a662ecde33c3979bf02b793d392aca0403162Wink Saville
217767a662ecde33c3979bf02b793d392aca0403162Wink Saville            //Unregister from all former registered events
218767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mRuimRecords.unregisterForRecordsLoaded(h); //EVENT_RUIM_RECORDS_LOADED
219767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.unregisterForAvailable(h); //EVENT_RADIO_AVAILABLE
220767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.unregisterForOffOrNotAvailable(h); //EVENT_RADIO_OFF_OR_NOT_AVAILABLE
221767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.unregisterForOn(h); //EVENT_RADIO_ON
222767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.unregisterForNVReady(h); //EVENT_NV_READY
223767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSST.unregisterForNetworkAttach(h); //EVENT_REGISTERED_TO_NETWORK
224767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.unSetOnSuppServiceNotification(h);
225767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.unSetOnCallRing(h);
226dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
227767a662ecde33c3979bf02b793d392aca0403162Wink Saville
228767a662ecde33c3979bf02b793d392aca0403162Wink Saville            //Force all referenced classes to unregister their former registered events
229767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCT.dispose();
230767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mDataConnection.dispose();
231767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSST.dispose();
232767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSMS.dispose();
233767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mIccFileHandler.dispose(); // instance of RuimFileHandler
234767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mRuimRecords.dispose();
235767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mRuimCard.dispose();
236767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mRuimPhoneBookInterfaceManager.dispose();
237767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mRuimSmsInterfaceManager.dispose();
238767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSubInfo.dispose();
239e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mEriManager.dispose();
240767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
241767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
242767a662ecde33c3979bf02b793d392aca0403162Wink Saville
243767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void removeReferences() {
244767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mRuimPhoneBookInterfaceManager = null;
245767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mRuimSmsInterfaceManager = null;
246767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mSMS = null;
247767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mSubInfo = null;
248767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mRuimRecords = null;
249767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mIccFileHandler = null;
250767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mRuimCard = null;
251767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mDataConnection = null;
252767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mCT = null;
253767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mSST = null;
254e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            this.mEriManager = null;
255767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
256767a662ecde33c3979bf02b793d392aca0403162Wink Saville
257767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected void finalize() {
258e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if(DBG) Log.d(LOG_TAG, "CDMAPhone finalized");
25995a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (mWakeLock.isHeld()) {
26095a1d1a89e383dab893750638c2393dec54833ffWink Saville            Log.e(LOG_TAG, "UNEXPECTED; mWakeLock is held when finalizing.");
26195a1d1a89e383dab893750638c2393dec54833ffWink Saville            mWakeLock.release();
26295a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
263767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
264767a662ecde33c3979bf02b793d392aca0403162Wink Saville
265767a662ecde33c3979bf02b793d392aca0403162Wink Saville
266767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //***** Overridden from Phone
267767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public ServiceState getServiceState() {
268767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSST.ss;
269767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
270767a662ecde33c3979bf02b793d392aca0403162Wink Saville
271767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public Phone.State
272767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getState() {
273767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.state;
274767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
275767a662ecde33c3979bf02b793d392aca0403162Wink Saville
276767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String
277767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getPhoneName() {
278767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return "CDMA";
279767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
280767a662ecde33c3979bf02b793d392aca0403162Wink Saville
281767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean canTransfer() {
282767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "canTransfer: not possible in CDMA");
283767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
284767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
285767a662ecde33c3979bf02b793d392aca0403162Wink Saville
286767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CdmaCall
287767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getRingingCall() {
288767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.ringingCall;
289767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
290767a662ecde33c3979bf02b793d392aca0403162Wink Saville
291767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setMute(boolean muted) {
292767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.setMute(muted);
293767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
294767a662ecde33c3979bf02b793d392aca0403162Wink Saville
295767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean getMute() {
296767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.getMute();
297767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
298767a662ecde33c3979bf02b793d392aca0403162Wink Saville
299767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void conference() throws CallStateException {
300767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // three way calls in CDMA will be handled by feature codes
301767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "conference: not possible in CDMA");
302767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
303767a662ecde33c3979bf02b793d392aca0403162Wink Saville
304767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void enableEnhancedVoicePrivacy(boolean enable, Message onComplete) {
305767a662ecde33c3979bf02b793d392aca0403162Wink Saville        this.mCM.setPreferredVoicePrivacy(enable, onComplete);
306767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
307767a662ecde33c3979bf02b793d392aca0403162Wink Saville
308767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getEnhancedVoicePrivacy(Message onComplete) {
309767a662ecde33c3979bf02b793d392aca0403162Wink Saville        this.mCM.getPreferredVoicePrivacy(onComplete);
310767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
311767a662ecde33c3979bf02b793d392aca0403162Wink Saville
312767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void clearDisconnected() {
313767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.clearDisconnected();
314767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
315767a662ecde33c3979bf02b793d392aca0403162Wink Saville
316767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public DataActivityState getDataActivityState() {
317767a662ecde33c3979bf02b793d392aca0403162Wink Saville        DataActivityState ret = DataActivityState.NONE;
318767a662ecde33c3979bf02b793d392aca0403162Wink Saville
319f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville        if (mSST.getCurrentCdmaDataConnectionState() == ServiceState.STATE_IN_SERVICE) {
320767a662ecde33c3979bf02b793d392aca0403162Wink Saville
321767a662ecde33c3979bf02b793d392aca0403162Wink Saville            switch (mDataConnection.getActivity()) {
322767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAIN:
323767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAIN;
324767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
325767a662ecde33c3979bf02b793d392aca0403162Wink Saville
326767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAOUT:
327767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAOUT;
328767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
329767a662ecde33c3979bf02b793d392aca0403162Wink Saville
330767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAINANDOUT:
331767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAINANDOUT;
332767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
333e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
334e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                case DORMANT:
335e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                    ret = DataActivityState.DORMANT;
336e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                break;
337767a662ecde33c3979bf02b793d392aca0403162Wink Saville            }
338767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
339767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return ret;
340767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
341767a662ecde33c3979bf02b793d392aca0403162Wink Saville
342767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /*package*/ void
343767a662ecde33c3979bf02b793d392aca0403162Wink Saville    notifySignalStrength() {
344767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mNotifier.notifySignalStrength(this);
345767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
346767a662ecde33c3979bf02b793d392aca0403162Wink Saville
347767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public Connection
348767a662ecde33c3979bf02b793d392aca0403162Wink Saville    dial (String dialString) throws CallStateException {
349767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // Need to make sure dialString gets parsed properly
350767a662ecde33c3979bf02b793d392aca0403162Wink Saville        String newDialString = PhoneNumberUtils.stripSeparators(dialString);
351767a662ecde33c3979bf02b793d392aca0403162Wink Saville
352d6c5d527d3fa73dafc6e7cd36e4d6922b6d31845Wink Saville        if (!mCT.foregroundCall.isIdle()) {
353d6c5d527d3fa73dafc6e7cd36e4d6922b6d31845Wink Saville            FeatureCode fc = FeatureCode.newFromDialString(newDialString, this);
354d6c5d527d3fa73dafc6e7cd36e4d6922b6d31845Wink Saville            if (fc != null) {
355d6c5d527d3fa73dafc6e7cd36e4d6922b6d31845Wink Saville                //mMmiRegistrants.notifyRegistrants(new AsyncResult(null, fc, null));
356d6c5d527d3fa73dafc6e7cd36e4d6922b6d31845Wink Saville                fc.processCode();
35722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville                return null;
358767a662ecde33c3979bf02b793d392aca0403162Wink Saville            }
359767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
36022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        return mCT.dial(newDialString);
361767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
362767a662ecde33c3979bf02b793d392aca0403162Wink Saville
363e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public SignalStrength getSignalStrength() {
364e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        return mSST.mSignalStrength;
365767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
366767a662ecde33c3979bf02b793d392aca0403162Wink Saville
367767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean
368767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getMessageWaitingIndicator() {
369ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        return (getVoiceMessageCount() > 0);
370767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
371767a662ecde33c3979bf02b793d392aca0403162Wink Saville
372767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public List<? extends MmiCode>
373767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getPendingMmiCodes() {
374767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method getPendingMmiCodes is NOT supported in CDMA!");
375767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return null;
376767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
377767a662ecde33c3979bf02b793d392aca0403162Wink Saville
378767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void registerForSuppServiceNotification(
379767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Handler h, int what, Object obj) {
380767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method registerForSuppServiceNotification is NOT supported in CDMA!");
381767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
382767a662ecde33c3979bf02b793d392aca0403162Wink Saville
383767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CdmaCall getBackgroundCall() {
384767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.backgroundCall;
385767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
386767a662ecde33c3979bf02b793d392aca0403162Wink Saville
387767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean handleInCallMmiCommands(String dialString) {
388767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method handleInCallMmiCommands is NOT supported in CDMA!");
389767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
390767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
391767a662ecde33c3979bf02b793d392aca0403162Wink Saville
392767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
393767a662ecde33c3979bf02b793d392aca0403162Wink Saville    setNetworkSelectionModeAutomatic(Message response) {
394767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method setNetworkSelectionModeAutomatic is NOT supported in CDMA!");
395767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
396767a662ecde33c3979bf02b793d392aca0403162Wink Saville
397767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void unregisterForSuppServiceNotification(Handler h) {
398767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method unregisterForSuppServiceNotification is NOT supported in CDMA!");
399767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
400767a662ecde33c3979bf02b793d392aca0403162Wink Saville
401767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
402767a662ecde33c3979bf02b793d392aca0403162Wink Saville    acceptCall() throws CallStateException {
403767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.acceptCall();
404767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
405767a662ecde33c3979bf02b793d392aca0403162Wink Saville
406767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
407767a662ecde33c3979bf02b793d392aca0403162Wink Saville    rejectCall() throws CallStateException {
408767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.rejectCall();
409767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
410767a662ecde33c3979bf02b793d392aca0403162Wink Saville
411767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
412767a662ecde33c3979bf02b793d392aca0403162Wink Saville    switchHoldingAndActive() throws CallStateException {
413767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.switchWaitingOrHoldingAndActive();
414767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
415767a662ecde33c3979bf02b793d392aca0403162Wink Saville
416767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getLine1Number() {
417f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville        return mSST.getMdnNumber();
418767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
419767a662ecde33c3979bf02b793d392aca0403162Wink Saville
42022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville    public String getCdmaPrlVersion(){
421daccacb865947c00f277f1823333e2fbf91e652aWink Saville        return mSST.getPrlVersion();
42222ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville    }
42322ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville
424019581bf6055eb69ee7e4cb844dafe2b6c23597eCheng Yang    public String getCdmaMin() {
425f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville        return mSST.getCdmaMin();
426e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
427e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
4289e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    public boolean isMinInfoReady() {
4299e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo        return mSST.isMinInfoReady();
4309e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    }
4319e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo
432767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getCallWaiting(Message onComplete) {
433767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.queryCallWaiting(CommandsInterface.SERVICE_CLASS_VOICE, onComplete);
434767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
435767a662ecde33c3979bf02b793d392aca0403162Wink Saville
436767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
437767a662ecde33c3979bf02b793d392aca0403162Wink Saville    setRadioPower(boolean power) {
438767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSST.setRadioPower(power);
439767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
440767a662ecde33c3979bf02b793d392aca0403162Wink Saville
441767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getEsn() {
442767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mEsn;
443767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
444767a662ecde33c3979bf02b793d392aca0403162Wink Saville
445767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getMeid() {
446767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mMeid;
447767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
448767a662ecde33c3979bf02b793d392aca0403162Wink Saville
449767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //returns MEID in CDMA
450767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getDeviceId() {
451767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return getMeid();
452767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
453767a662ecde33c3979bf02b793d392aca0403162Wink Saville
454767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getDeviceSvn() {
455767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.d(LOG_TAG, "getDeviceSvn(): return 0");
456767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return "0";
457767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
458767a662ecde33c3979bf02b793d392aca0403162Wink Saville
459767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getSubscriberId() {
460142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        return mSST.getImsi();
461767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
462767a662ecde33c3979bf02b793d392aca0403162Wink Saville
463767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean canConference() {
464767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "canConference: not possible in CDMA");
465767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
466767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
467767a662ecde33c3979bf02b793d392aca0403162Wink Saville
468767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CellLocation getCellLocation() {
469767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSST.cellLoc;
470767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
471767a662ecde33c3979bf02b793d392aca0403162Wink Saville
472767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean disableDataConnectivity() {
473767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mDataConnection.setDataEnabled(false);
474767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
475767a662ecde33c3979bf02b793d392aca0403162Wink Saville
476767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CdmaCall getForegroundCall() {
477767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.foregroundCall;
478767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
479767a662ecde33c3979bf02b793d392aca0403162Wink Saville
480767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
481767a662ecde33c3979bf02b793d392aca0403162Wink Saville    selectNetworkManually(com.android.internal.telephony.gsm.NetworkInfo network,
482767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Message response) {
483767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "selectNetworkManually: not possible in CDMA");
484767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
485767a662ecde33c3979bf02b793d392aca0403162Wink Saville
486767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setOnPostDialCharacter(Handler h, int what, Object obj) {
487dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        mPostDialHandler = new Registrant(h, what, obj);
488767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
489767a662ecde33c3979bf02b793d392aca0403162Wink Saville
490767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean handlePinMmi(String dialString) {
491767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method handlePinMmi is NOT supported in CDMA!");
492767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
493767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
494767a662ecde33c3979bf02b793d392aca0403162Wink Saville
495767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean isDataConnectivityPossible() {
496767a662ecde33c3979bf02b793d392aca0403162Wink Saville        boolean noData = mDataConnection.getDataEnabled() &&
497767a662ecde33c3979bf02b793d392aca0403162Wink Saville                getDataConnectionState() == DataState.DISCONNECTED;
498767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return !noData && getIccCard().getState() == IccCard.State.READY &&
499767a662ecde33c3979bf02b793d392aca0403162Wink Saville                getServiceState().getState() == ServiceState.STATE_IN_SERVICE &&
500767a662ecde33c3979bf02b793d392aca0403162Wink Saville                (mDataConnection.getDataOnRoamingEnabled() || !getServiceState().getRoaming());
501767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
502767a662ecde33c3979bf02b793d392aca0403162Wink Saville
503767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setLine1Number(String alphaTag, String number, Message onComplete) {
504767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "setLine1Number: not possible in CDMA");
505767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
506767a662ecde33c3979bf02b793d392aca0403162Wink Saville
507767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public IccCard getIccCard() {
508767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mRuimCard;
509767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
510767a662ecde33c3979bf02b793d392aca0403162Wink Saville
511767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getIccSerialNumber() {
512767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mRuimRecords.iccid;
513767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
514767a662ecde33c3979bf02b793d392aca0403162Wink Saville
515767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setCallWaiting(boolean enable, Message onComplete) {
516767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method setCallWaiting is NOT supported in CDMA!");
517767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
518767a662ecde33c3979bf02b793d392aca0403162Wink Saville
519767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void updateServiceLocation(Message response) {
520767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSST.getLacAndCid(response);
521767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
522767a662ecde33c3979bf02b793d392aca0403162Wink Saville
523767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setDataRoamingEnabled(boolean enable) {
524767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mDataConnection.setDataOnRoamingEnabled(enable);
525767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
526767a662ecde33c3979bf02b793d392aca0403162Wink Saville
527dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void registerForCdmaOtaStatusChange(Handler h, int what, Object obj) {
528dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        mCM.registerForCdmaOtaProvision(h, what, obj);
529dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
530dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
531dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void unregisterForCdmaOtaStatusChange(Handler h) {
532dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        mCM.unregisterForCdmaOtaProvision(h);
533dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
534dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
5359e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    public void registerForSubscriptionInfoReady(Handler h, int what, Object obj) {
5369e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo        mSST.registerForSubscriptionInfoReady(h, what, obj);
5379e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    }
5389e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo
5399e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    public void unregisterForSubscriptionInfoReady(Handler h) {
5409e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo        mSST.unregisterForSubscriptionInfoReady(h);
5419e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    }
5429e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo
543dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void setOnEcbModeExitResponse(Handler h, int what, Object obj) {
54495a1d1a89e383dab893750638c2393dec54833ffWink Saville        mEcmExitRespRegistrant = new Registrant (h, what, obj);
545dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
546dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
547dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void unsetOnEcbModeExitResponse(Handler h) {
54895a1d1a89e383dab893750638c2393dec54833ffWink Saville        mEcmExitRespRegistrant.clear();
549dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
550dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
551dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void registerForCallWaiting(Handler h, int what, Object obj) {
55222ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        mCT.registerForCallWaiting(h, what, obj);
553dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
554dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
555dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void unregisterForCallWaiting(Handler h) {
55622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        mCT.unregisterForCallWaiting(h);
557dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
558dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
559767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
560767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getNeighboringCids(Message response) {
56190cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink        /*
56290cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * This is currently not implemented.  At least as of June
56390cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * 2009, there is no neighbor cell information available for
56490cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * CDMA because some party is resisting making this
56590cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * information readily available.  Consequently, calling this
56690cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * function can have no useful effect.  This situation may
56790cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * (and hopefully will) change in the future.
56890cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         */
56990cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink        if (response != null) {
57090cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink            CommandException ce = new CommandException(
57190cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink                    CommandException.Error.REQUEST_NOT_SUPPORTED);
57290cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink            AsyncResult.forMessage(response).exception = ce;
57390cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink            response.sendToTarget();
57490cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink        }
575767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
576767a662ecde33c3979bf02b793d392aca0403162Wink Saville
577767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public DataState getDataConnectionState() {
578767a662ecde33c3979bf02b793d392aca0403162Wink Saville        DataState ret = DataState.DISCONNECTED;
579767a662ecde33c3979bf02b793d392aca0403162Wink Saville
580767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if ((SystemProperties.get("adb.connected", "").length() > 0)
581767a662ecde33c3979bf02b793d392aca0403162Wink Saville                && (SystemProperties.get("android.net.use-adb-networking", "")
582767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        .length() > 0)) {
583767a662ecde33c3979bf02b793d392aca0403162Wink Saville            // We're connected to an ADB host and we have USB networking
584767a662ecde33c3979bf02b793d392aca0403162Wink Saville            // turned on. No matter what the radio state is,
585767a662ecde33c3979bf02b793d392aca0403162Wink Saville            // we report data connected
586767a662ecde33c3979bf02b793d392aca0403162Wink Saville
587767a662ecde33c3979bf02b793d392aca0403162Wink Saville            ret = DataState.CONNECTED;
58844038aa032ffd876f3c9b20a84db9d189f77e18eWink Saville        } else if (mSST == null) {
589e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville             // Radio Technology Change is ongoning, dispose() and removeReferences() have
590e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville             // already been called
59144038aa032ffd876f3c9b20a84db9d189f77e18eWink Saville
592e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville             ret = DataState.DISCONNECTED;
593f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville        } else if (mSST.getCurrentCdmaDataConnectionState() != ServiceState.STATE_IN_SERVICE) {
594767a662ecde33c3979bf02b793d392aca0403162Wink Saville            // If we're out of service, open TCP sockets may still work
595767a662ecde33c3979bf02b793d392aca0403162Wink Saville            // but no data will flow
596767a662ecde33c3979bf02b793d392aca0403162Wink Saville            ret = DataState.DISCONNECTED;
597767a662ecde33c3979bf02b793d392aca0403162Wink Saville        } else {
598767a662ecde33c3979bf02b793d392aca0403162Wink Saville            switch (mDataConnection.getState()) {
599767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case FAILED:
600767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case IDLE:
601767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataState.DISCONNECTED;
602767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
603767a662ecde33c3979bf02b793d392aca0403162Wink Saville
604767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case CONNECTED:
605767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DISCONNECTING:
606767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    if ( mCT.state != Phone.State.IDLE
607767a662ecde33c3979bf02b793d392aca0403162Wink Saville                            && !mSST.isConcurrentVoiceAndData()) {
608767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        ret = DataState.SUSPENDED;
609767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    } else {
610767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        ret = DataState.CONNECTED;
611767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    }
612767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
613767a662ecde33c3979bf02b793d392aca0403162Wink Saville
614767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case INITING:
615767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case CONNECTING:
616767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case SCANNING:
617767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataState.CONNECTING;
618767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
619767a662ecde33c3979bf02b793d392aca0403162Wink Saville            }
620767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
621767a662ecde33c3979bf02b793d392aca0403162Wink Saville
622767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return ret;
623767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
624767a662ecde33c3979bf02b793d392aca0403162Wink Saville
625767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void sendUssdResponse(String ussdMessge) {
626767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "sendUssdResponse: not possible in CDMA");
627767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
628767a662ecde33c3979bf02b793d392aca0403162Wink Saville
629767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void sendDtmf(char c) {
630767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (!PhoneNumberUtils.is12Key(c)) {
631767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Log.e(LOG_TAG,
632767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    "sendDtmf called with invalid character '" + c + "'");
633767a662ecde33c3979bf02b793d392aca0403162Wink Saville        } else {
634767a662ecde33c3979bf02b793d392aca0403162Wink Saville            if (mCT.state ==  Phone.State.OFFHOOK) {
635767a662ecde33c3979bf02b793d392aca0403162Wink Saville                mCM.sendDtmf(c, null);
636767a662ecde33c3979bf02b793d392aca0403162Wink Saville            }
637767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
638767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
639767a662ecde33c3979bf02b793d392aca0403162Wink Saville
640767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void startDtmf(char c) {
641767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (!PhoneNumberUtils.is12Key(c)) {
642767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Log.e(LOG_TAG,
643767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    "startDtmf called with invalid character '" + c + "'");
644767a662ecde33c3979bf02b793d392aca0403162Wink Saville        } else {
645767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.startDtmf(c, null);
646767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
647767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
648767a662ecde33c3979bf02b793d392aca0403162Wink Saville
649767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void stopDtmf() {
650767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.stopDtmf(null);
651767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
652767a662ecde33c3979bf02b793d392aca0403162Wink Saville
653dafa22a3ef9328c72319aeec605f6a6d20e46080jsh    public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete) {
654e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        boolean check = true;
655e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        for (int itr = 0;itr < dtmfString.length(); itr++) {
656e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            if (!PhoneNumberUtils.is12Key(dtmfString.charAt(itr))) {
657e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                Log.e(LOG_TAG,
658e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        "sendDtmf called with invalid character '" + dtmfString.charAt(itr)+ "'");
659e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                check = false;
660e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                break;
661e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            }
662e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
663e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if ((mCT.state ==  Phone.State.OFFHOOK)&&(check)) {
664dafa22a3ef9328c72319aeec605f6a6d20e46080jsh            mCM.sendBurstDtmf(dtmfString, on, off, onComplete);
665e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
666e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     }
667e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
668767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getAvailableNetworks(Message response) {
669767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getAvailableNetworks: not possible in CDMA");
670767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
671767a662ecde33c3979bf02b793d392aca0403162Wink Saville
672767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode, Message onComplete) {
673dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        Log.e(LOG_TAG, "setOutgoingCallerIdDisplay: not possible in CDMA");
674767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
675767a662ecde33c3979bf02b793d392aca0403162Wink Saville
676767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void enableLocationUpdates() {
677767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSST.enableLocationUpdates();
678767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
679767a662ecde33c3979bf02b793d392aca0403162Wink Saville
680767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
681767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @deprecated
682767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
683767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getPdpContextList(Message response) {
684767a662ecde33c3979bf02b793d392aca0403162Wink Saville        getDataCallList(response);
685767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
686767a662ecde33c3979bf02b793d392aca0403162Wink Saville
687767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getDataCallList(Message response) {
688767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.getDataCallList(response);
689767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
690767a662ecde33c3979bf02b793d392aca0403162Wink Saville
691767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean getDataRoamingEnabled() {
692767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mDataConnection.getDataOnRoamingEnabled();
693767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
694767a662ecde33c3979bf02b793d392aca0403162Wink Saville
695767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public List<DataConnection> getCurrentDataConnectionList () {
696767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mDataConnection.getAllDataConnections();
697767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
698767a662ecde33c3979bf02b793d392aca0403162Wink Saville
699767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setVoiceMailNumber(String alphaTag,
700767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                   String voiceMailNumber,
701767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                   Message onComplete) {
702ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        Message resp;
703ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        mVmNumber = voiceMailNumber;
704ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        resp = h.obtainMessage(EVENT_SET_VM_NUMBER_DONE, 0, 0, onComplete);
705ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        mRuimRecords.setVoiceMailNumber(alphaTag, mVmNumber, resp);
706767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
707767a662ecde33c3979bf02b793d392aca0403162Wink Saville
708767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getVoiceMailNumber() {
709ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        String number = null;
710ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
711ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // TODO(Moto): The default value of voicemail number should be read from a system property
712ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        number = sp.getString(VM_NUMBER_CDMA, "*86");
713ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        return number;
714dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
715dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
716dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /* Returns Number of Voicemails
717dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @hide
718dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
719ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    public int getVoiceMessageCount() {
720ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        int voicemailCount =  mRuimRecords.getVoiceMessageCount();
721ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // If mRuimRecords.getVoiceMessageCount returns zero, then there is possibility
722ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // that phone was power cycled and would have lost the voicemail count.
723ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // So get the count from preferences.
724ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        if (voicemailCount == 0) {
725ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
726ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause            voicemailCount = sp.getInt(VM_COUNT_CDMA, 0);
727ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        }
728ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        return voicemailCount;
729767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
730767a662ecde33c3979bf02b793d392aca0403162Wink Saville
731767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getVoiceMailAlphaTag() {
732767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // TODO: Where can we get this value has to be clarified with QC.
733767a662ecde33c3979bf02b793d392aca0403162Wink Saville        String ret = "";//TODO: Remove = "", if we know where to get this value.
734767a662ecde33c3979bf02b793d392aca0403162Wink Saville
735767a662ecde33c3979bf02b793d392aca0403162Wink Saville        //ret = mSIMRecords.getVoiceMailAlphaTag();
736767a662ecde33c3979bf02b793d392aca0403162Wink Saville
737767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (ret == null || ret.length() == 0) {
738767a662ecde33c3979bf02b793d392aca0403162Wink Saville            return mContext.getText(
739767a662ecde33c3979bf02b793d392aca0403162Wink Saville                com.android.internal.R.string.defaultVoiceMailAlphaTag).toString();
740767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
741767a662ecde33c3979bf02b793d392aca0403162Wink Saville
742767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return ret;
743767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
744767a662ecde33c3979bf02b793d392aca0403162Wink Saville
745767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean enableDataConnectivity() {
746dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
747dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        // block data activities when phone is in emergency callback mode
74895a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (mIsPhoneInEcmState) {
749dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            Intent intent = new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS);
750dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            ActivityManagerNative.broadcastStickyIntent(intent, null);
751dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            return false;
752dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        } else {
753dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            return mDataConnection.setDataEnabled(true);
754dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
755767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
756767a662ecde33c3979bf02b793d392aca0403162Wink Saville
757767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void disableLocationUpdates() {
758767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSST.disableLocationUpdates();
759767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
760767a662ecde33c3979bf02b793d392aca0403162Wink Saville
761767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean getIccRecordsLoaded() {
762767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mRuimRecords.getRecordsLoaded();
763767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
764767a662ecde33c3979bf02b793d392aca0403162Wink Saville
765767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getCallForwardingOption(int commandInterfaceCFReason, Message onComplete) {
766767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getCallForwardingOption: not possible in CDMA");
767767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
768767a662ecde33c3979bf02b793d392aca0403162Wink Saville
769767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setCallForwardingOption(int commandInterfaceCFAction,
770767a662ecde33c3979bf02b793d392aca0403162Wink Saville            int commandInterfaceCFReason,
771767a662ecde33c3979bf02b793d392aca0403162Wink Saville            String dialingNumber,
772767a662ecde33c3979bf02b793d392aca0403162Wink Saville            int timerSeconds,
773767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Message onComplete) {
774767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "setCallForwardingOption: not possible in CDMA");
775767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
776767a662ecde33c3979bf02b793d392aca0403162Wink Saville
777767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
778767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getOutgoingCallerIdDisplay(Message onComplete) {
779767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getOutgoingCallerIdDisplay: not possible in CDMA");
780767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
781767a662ecde33c3979bf02b793d392aca0403162Wink Saville
782767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean
783767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getCallForwardingIndicator() {
784767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getCallForwardingIndicator: not possible in CDMA");
785767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
786767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
787767a662ecde33c3979bf02b793d392aca0403162Wink Saville
788767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void explicitCallTransfer() {
789767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "explicitCallTransfer: not possible in CDMA");
790767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
791767a662ecde33c3979bf02b793d392aca0403162Wink Saville
792767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getLine1AlphaTag() {
793767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getLine1AlphaTag: not possible in CDMA");
794767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return null;
795767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
796767a662ecde33c3979bf02b793d392aca0403162Wink Saville
797dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville   /**
7981c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh     * Notify any interested party of a Phone state change  {@link Phone.State}
799767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
800767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /*package*/ void notifyPhoneStateChanged() {
801767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mNotifier.notifyPhoneState(this);
802767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
803767a662ecde33c3979bf02b793d392aca0403162Wink Saville
804767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
8051c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh     * Notify registrants of a change in the call state. This notifies changes in {@link Call.State}
8061c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh     * Use this when changes in the precise call state are needed, else use notifyPhoneStateChanged.
807767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
8081c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh    /*package*/ void notifyPreciseCallStateChanged() {
809767a662ecde33c3979bf02b793d392aca0403162Wink Saville        /* we'd love it if this was package-scoped*/
8101c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh        super.notifyPreciseCallStateChangedP();
811767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
812767a662ecde33c3979bf02b793d392aca0403162Wink Saville
813767a662ecde33c3979bf02b793d392aca0403162Wink Saville     void notifyServiceStateChanged(ServiceState ss) {
814767a662ecde33c3979bf02b793d392aca0403162Wink Saville         super.notifyServiceStateChangedP(ss);
815767a662ecde33c3979bf02b793d392aca0403162Wink Saville     }
816767a662ecde33c3979bf02b793d392aca0403162Wink Saville
817767a662ecde33c3979bf02b793d392aca0403162Wink Saville     void notifyLocationChanged() {
818767a662ecde33c3979bf02b793d392aca0403162Wink Saville         mNotifier.notifyCellLocation(this);
819767a662ecde33c3979bf02b793d392aca0403162Wink Saville     }
820767a662ecde33c3979bf02b793d392aca0403162Wink Saville
821767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /*package*/ void notifyNewRingingConnection(Connection c) {
822767a662ecde33c3979bf02b793d392aca0403162Wink Saville        /* we'd love it if this was package-scoped*/
823767a662ecde33c3979bf02b793d392aca0403162Wink Saville        super.notifyNewRingingConnectionP(c);
824767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
825767a662ecde33c3979bf02b793d392aca0403162Wink Saville
826767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
827767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Notifiy registrants of a RING event.
828767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
829767a662ecde33c3979bf02b793d392aca0403162Wink Saville    void notifyIncomingRing() {
830767a662ecde33c3979bf02b793d392aca0403162Wink Saville        AsyncResult ar = new AsyncResult(null, this, null);
831767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mIncomingRingRegistrants.notifyRegistrants(ar);
832767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
833767a662ecde33c3979bf02b793d392aca0403162Wink Saville
834767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /*package*/ void notifyDisconnect(Connection cn) {
835767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mDisconnectRegistrants.notifyResult(cn);
836767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
837767a662ecde33c3979bf02b793d392aca0403162Wink Saville
838767a662ecde33c3979bf02b793d392aca0403162Wink Saville    void notifyUnknownConnection() {
839767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mUnknownConnectionRegistrants.notifyResult(this);
840767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
841767a662ecde33c3979bf02b793d392aca0403162Wink Saville
842dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    void sendEmergencyCallbackModeChange(){
843dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        //Send an Intent
844dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        Intent intent = new Intent(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
84595a1d1a89e383dab893750638c2393dec54833ffWink Saville        intent.putExtra(PHONE_IN_ECM_STATE, mIsPhoneInEcmState);
846dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        ActivityManagerNative.broadcastStickyIntent(intent,null);
84795a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (DBG) Log.d(LOG_TAG, "sendEmergencyCallbackModeChange");
848dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
849dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
850767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /*package*/ void
851767a662ecde33c3979bf02b793d392aca0403162Wink Saville    updateMessageWaitingIndicator(boolean mwi) {
852767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // this also calls notifyMessageWaitingIndicator()
853767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mRuimRecords.setVoiceMessageWaiting(1, mwi ? -1 : 0);
854767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
855767a662ecde33c3979bf02b793d392aca0403162Wink Saville
856ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    /* This function is overloaded to send number of voicemails instead of sending true/false */
857ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    /*package*/ void
858ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    updateMessageWaitingIndicator(int mwi) {
859ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        mRuimRecords.setVoiceMessageWaiting(1, mwi);
860d6c5d527d3fa73dafc6e7cd36e4d6922b6d31845Wink Saville    }
861767a662ecde33c3979bf02b793d392aca0403162Wink Saville
862767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
863767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Removes the given FC from the pending list and notifies
864767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * registrants that it is complete.
865767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @param fc FC that is done
866767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
867d6c5d527d3fa73dafc6e7cd36e4d6922b6d31845Wink Saville    /*package*/ void onFeatureCodeDone(FeatureCode fc) {
868767a662ecde33c3979bf02b793d392aca0403162Wink Saville        /* Only notify complete if it's on the pending list.
869767a662ecde33c3979bf02b793d392aca0403162Wink Saville         * Otherwise, it's already been handled (eg, previously canceled).
870767a662ecde33c3979bf02b793d392aca0403162Wink Saville         * The exception is cancellation of an incoming USSD-REQUEST, which is
871767a662ecde33c3979bf02b793d392aca0403162Wink Saville         * not on the list.
872767a662ecde33c3979bf02b793d392aca0403162Wink Saville         */
873d6c5d527d3fa73dafc6e7cd36e4d6922b6d31845Wink Saville         mMmiCompleteRegistrants.notifyRegistrants(new AsyncResult(null, fc, null));
874767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
875767a662ecde33c3979bf02b793d392aca0403162Wink Saville
876dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
877dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    @Override
878dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void exitEmergencyCallbackMode() {
87995a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (mWakeLock.isHeld()) {
88095a1d1a89e383dab893750638c2393dec54833ffWink Saville            mWakeLock.release();
88195a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
882dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        // Send a message which will invoke handleExitEmergencyCallbackMode
883dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        mCM.exitEmergencyCallbackMode(h.obtainMessage(EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE));
884dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
885dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
886dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private void handleEnterEmergencyCallbackMode(Message msg) {
88795a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (DBG) {
88895a1d1a89e383dab893750638c2393dec54833ffWink Saville            Log.d(LOG_TAG, "handleEnterEmergencyCallbackMode,mIsPhoneInEcmState= "
88995a1d1a89e383dab893750638c2393dec54833ffWink Saville                    + mIsPhoneInEcmState);
89095a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
89195a1d1a89e383dab893750638c2393dec54833ffWink Saville        // if phone is not in Ecm mode, and it's changed to Ecm mode
89295a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (mIsPhoneInEcmState == false) {
89395a1d1a89e383dab893750638c2393dec54833ffWink Saville            mIsPhoneInEcmState = true;
894dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            // notify change
895dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            sendEmergencyCallbackModeChange();
89622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville            setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE, "true");
8972563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville
898dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            // Post this runnable so we will automatically exit
899dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            // if no one invokes exitEmergencyCallbackMode() directly.
90022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville            long delayInMillis = SystemProperties.getLong(
90122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville                    TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE);
902dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            h.postDelayed(mExitEcmRunnable, delayInMillis);
90395a1d1a89e383dab893750638c2393dec54833ffWink Saville            // We don't want to go to sleep while in Ecm
90495a1d1a89e383dab893750638c2393dec54833ffWink Saville            mWakeLock.acquire();
905dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
906dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
907dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
908dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private void handleExitEmergencyCallbackMode(Message msg) {
909dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        AsyncResult ar = (AsyncResult)msg.obj;
91095a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (DBG) {
91195a1d1a89e383dab893750638c2393dec54833ffWink Saville            Log.d(LOG_TAG, "handleExitEmergencyCallbackMode,ar.exception , mIsPhoneInEcmState "
91295a1d1a89e383dab893750638c2393dec54833ffWink Saville                    + ar.exception + mIsPhoneInEcmState);
91395a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
91495a1d1a89e383dab893750638c2393dec54833ffWink Saville        // Remove pending exit Ecm runnable, if any
915dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        h.removeCallbacks(mExitEcmRunnable);
916dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
91795a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (mEcmExitRespRegistrant != null) {
91895a1d1a89e383dab893750638c2393dec54833ffWink Saville            mEcmExitRespRegistrant.notifyRegistrant(ar);
919dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
920dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        // if exiting ecm success
921dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        if (ar.exception == null) {
92295a1d1a89e383dab893750638c2393dec54833ffWink Saville            if (mIsPhoneInEcmState) {
92395a1d1a89e383dab893750638c2393dec54833ffWink Saville                mIsPhoneInEcmState = false;
92422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville                setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE, "false");
925dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            }
926dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            // send an Intent
927dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            sendEmergencyCallbackModeChange();
92833777d2096c6877ab925db562067ac7272076399Libin Tang            // Re-initiate data connection
92933777d2096c6877ab925db562067ac7272076399Libin Tang            mDataConnection.setDataEnabled(true);
930dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
931dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
932dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
93395a1d1a89e383dab893750638c2393dec54833ffWink Saville    /**
93495a1d1a89e383dab893750638c2393dec54833ffWink Saville     * Handle to cancel or restart Ecm timer in emergency call back mode
93595a1d1a89e383dab893750638c2393dec54833ffWink Saville     * if action is CANCEL_ECM_TIMER, cancel Ecm timer and notify apps the timer is canceled;
93695a1d1a89e383dab893750638c2393dec54833ffWink Saville     * otherwise, restart Ecm timer and notify apps the timer is restarted.
93795a1d1a89e383dab893750638c2393dec54833ffWink Saville     */
93895a1d1a89e383dab893750638c2393dec54833ffWink Saville    void handleTimerInEmergencyCallbackMode(int action) {
93995a1d1a89e383dab893750638c2393dec54833ffWink Saville        switch(action) {
94095a1d1a89e383dab893750638c2393dec54833ffWink Saville        case CANCEL_ECM_TIMER:
94195a1d1a89e383dab893750638c2393dec54833ffWink Saville            h.removeCallbacks(mExitEcmRunnable);
94295a1d1a89e383dab893750638c2393dec54833ffWink Saville            mEcmTimerResetRegistrants.notifyResult(new Boolean(true));
94395a1d1a89e383dab893750638c2393dec54833ffWink Saville            break;
94495a1d1a89e383dab893750638c2393dec54833ffWink Saville        case RESTART_ECM_TIMER:
94595a1d1a89e383dab893750638c2393dec54833ffWink Saville            long delayInMillis = SystemProperties.getLong(
94695a1d1a89e383dab893750638c2393dec54833ffWink Saville                    TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE);
94795a1d1a89e383dab893750638c2393dec54833ffWink Saville            h.postDelayed(mExitEcmRunnable, delayInMillis);
94895a1d1a89e383dab893750638c2393dec54833ffWink Saville            mEcmTimerResetRegistrants.notifyResult(new Boolean(false));
94995a1d1a89e383dab893750638c2393dec54833ffWink Saville            break;
95095a1d1a89e383dab893750638c2393dec54833ffWink Saville        default:
95195a1d1a89e383dab893750638c2393dec54833ffWink Saville            Log.e(LOG_TAG, "handleTimerInEmergencyCallbackMode, unsupported action " + action);
95295a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
95395a1d1a89e383dab893750638c2393dec54833ffWink Saville    }
95495a1d1a89e383dab893750638c2393dec54833ffWink Saville
95595a1d1a89e383dab893750638c2393dec54833ffWink Saville    /**
95695a1d1a89e383dab893750638c2393dec54833ffWink Saville     * Registration point for Ecm timer reset
95795a1d1a89e383dab893750638c2393dec54833ffWink Saville     * @param h handler to notify
95895a1d1a89e383dab893750638c2393dec54833ffWink Saville     * @param what User-defined message code
95995a1d1a89e383dab893750638c2393dec54833ffWink Saville     * @param obj placed in Message.obj
96095a1d1a89e383dab893750638c2393dec54833ffWink Saville     */
96195a1d1a89e383dab893750638c2393dec54833ffWink Saville    public void registerForEcmTimerReset(Handler h, int what, Object obj) {
96295a1d1a89e383dab893750638c2393dec54833ffWink Saville        mEcmTimerResetRegistrants.addUnique(h, what, obj);
96395a1d1a89e383dab893750638c2393dec54833ffWink Saville    }
96495a1d1a89e383dab893750638c2393dec54833ffWink Saville
96595a1d1a89e383dab893750638c2393dec54833ffWink Saville    public void unregisterForEcmTimerReset(Handler h) {
96695a1d1a89e383dab893750638c2393dec54833ffWink Saville        mEcmTimerResetRegistrants.remove(h);
96795a1d1a89e383dab893750638c2393dec54833ffWink Saville    }
96895a1d1a89e383dab893750638c2393dec54833ffWink Saville
969767a662ecde33c3979bf02b793d392aca0403162Wink Saville    //***** Inner Classes
970767a662ecde33c3979bf02b793d392aca0403162Wink Saville    class MyHandler extends Handler {
971767a662ecde33c3979bf02b793d392aca0403162Wink Saville        MyHandler() {
972767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
973767a662ecde33c3979bf02b793d392aca0403162Wink Saville
974767a662ecde33c3979bf02b793d392aca0403162Wink Saville        MyHandler(Looper l) {
975767a662ecde33c3979bf02b793d392aca0403162Wink Saville            super(l);
976767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
977767a662ecde33c3979bf02b793d392aca0403162Wink Saville
978dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        @Override
979767a662ecde33c3979bf02b793d392aca0403162Wink Saville        public void handleMessage(Message msg) {
980767a662ecde33c3979bf02b793d392aca0403162Wink Saville            AsyncResult ar;
981767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Message     onComplete;
982767a662ecde33c3979bf02b793d392aca0403162Wink Saville
983767a662ecde33c3979bf02b793d392aca0403162Wink Saville            switch(msg.what) {
984767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case EVENT_RADIO_AVAILABLE: {
985767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    mCM.getBasebandVersion(obtainMessage(EVENT_GET_BASEBAND_VERSION_DONE));
986767a662ecde33c3979bf02b793d392aca0403162Wink Saville
987767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    mCM.getDeviceIdentity(obtainMessage(EVENT_GET_DEVICE_IDENTITY_DONE));
988767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
989767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
990767a662ecde33c3979bf02b793d392aca0403162Wink Saville
991767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case EVENT_GET_BASEBAND_VERSION_DONE:{
992767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ar = (AsyncResult)msg.obj;
993767a662ecde33c3979bf02b793d392aca0403162Wink Saville
994767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    if (ar.exception != null) {
995767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        break;
996767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    }
997767a662ecde33c3979bf02b793d392aca0403162Wink Saville
998e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    if (DBG) Log.d(LOG_TAG, "Baseband version: " + ar.result);
99922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville                    setSystemProperty(TelephonyProperties.PROPERTY_BASEBAND_VERSION, (String)ar.result);
1000767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
1001767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
1002767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1003767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case EVENT_GET_DEVICE_IDENTITY_DONE:{
1004767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ar = (AsyncResult)msg.obj;
1005767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1006767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    if (ar.exception != null) {
1007767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        break;
1008767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    }
1009767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    String[] respId = (String[])ar.result;
1010767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    mEsn  =  respId[2];
1011767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    mMeid =  respId[3];
1012767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
1013767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
1014767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1015dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                case EVENT_EMERGENCY_CALLBACK_MODE_ENTER:{
1016dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                    handleEnterEmergencyCallbackMode(msg);
1017dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                }
1018dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                break;
1019dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1020dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                case  EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE:{
1021dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                    handleExitEmergencyCallbackMode(msg);
1022e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                }
1023dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                break;
1024dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1025767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case EVENT_RUIM_RECORDS_LOADED:{
1026767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    Log.d(LOG_TAG, "Event EVENT_RUIM_RECORDS_LOADED Received");
1027767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
1028767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
1029767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1030767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case EVENT_RADIO_OFF_OR_NOT_AVAILABLE:{
1031767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    Log.d(LOG_TAG, "Event EVENT_RADIO_OFF_OR_NOT_AVAILABLE Received");
1032767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
1033767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
1034767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1035767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case EVENT_RADIO_ON:{
1036767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    Log.d(LOG_TAG, "Event EVENT_RADIO_ON Received");
1037767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
1038767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
1039767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1040767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case EVENT_SSN:{
1041767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    Log.d(LOG_TAG, "Event EVENT_SSN Received");
1042767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
1043767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
1044767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1045767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case EVENT_CALL_RING:{
1046767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    Log.d(LOG_TAG, "Event EVENT_CALL_RING Received");
1047767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
1048767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
1049767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1050767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case EVENT_REGISTERED_TO_NETWORK:{
1051767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    Log.d(LOG_TAG, "Event EVENT_REGISTERED_TO_NETWORK Received");
1052767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
1053767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
1054767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1055767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case EVENT_NV_READY:{
1056767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    Log.d(LOG_TAG, "Event EVENT_NV_READY Received");
1057767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    //Inform the Service State Tracker
1058e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                    mEriManager.loadEriFile();
1059767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    mNvLoadedRegistrants.notifyRegistrants();
1060e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                    if(mEriManager.isEriFileLoaded()) {
1061e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        // when the ERI file is loaded
1062e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        Log.d(LOG_TAG, "ERI read, notify registrants");
1063e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        mEriFileLoadedRegistrants.notifyRegistrants();
1064e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                    }
106522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville                    setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE,"false");
1066767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
1067767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
1068767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1069ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause                case EVENT_SET_VM_NUMBER_DONE:{
1070ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause                    ar = (AsyncResult)msg.obj;
1071ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause                    if (IccException.class.isInstance(ar.exception)) {
1072ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause                        storeVoiceMailNumber(mVmNumber);
1073ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause                        ar.exception = null;
1074ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause                    }
1075ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause                    onComplete = (Message) ar.userObj;
1076ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause                    if (onComplete != null) {
1077ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause                        AsyncResult.forMessage(onComplete, ar.result, ar.exception);
1078ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause                        onComplete.sendToTarget();
1079ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause                    }
1080ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause                }
1081a1fd1efb52294360d09a4a4f5b6daabafd3c6603repo sync                break;
1082ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause
1083767a662ecde33c3979bf02b793d392aca0403162Wink Saville                default:{
1084767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    throw new RuntimeException("unexpected event not handled");
1085767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
1086767a662ecde33c3979bf02b793d392aca0403162Wink Saville            }
1087767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
1088767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1089767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1090dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1091dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Retrieves the PhoneSubInfo of the CDMAPhone
1092dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1093dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public PhoneSubInfo getPhoneSubInfo() {
1094767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSubInfo;
1095dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1096767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1097dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1098dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Retrieves the IccSmsInterfaceManager of the CDMAPhone
1099dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1100dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public IccSmsInterfaceManager getIccSmsInterfaceManager() {
1101dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        return mRuimSmsInterfaceManager;
1102dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1103767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1104dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1105dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Retrieves the IccPhoneBookInterfaceManager of the CDMAPhone
1106dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1107dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public IccPhoneBookInterfaceManager getIccPhoneBookInterfaceManager() {
1108dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        return mRuimPhoneBookInterfaceManager;
1109dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1110767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1111767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void registerForNvLoaded(Handler h, int what, Object obj) {
1112767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Registrant r = new Registrant (h, what, obj);
1113767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mNvLoadedRegistrants.add(r);
1114767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1115767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1116767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void unregisterForNvLoaded(Handler h) {
1117767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mNvLoadedRegistrants.remove(h);
1118767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1119767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1120e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void registerForEriFileLoaded(Handler h, int what, Object obj) {
1121e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        Registrant r = new Registrant (h, what, obj);
1122e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mEriFileLoadedRegistrants.add(r);
1123e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1124e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1125e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void unregisterForEriFileLoaded(Handler h) {
1126e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mEriFileLoadedRegistrants.remove(h);
1127e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1128e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1129dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    // override for allowing access from other classes of this package
1130dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1131dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * {@inheritDoc}
1132dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1133dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public final void setSystemProperty(String property, String value) {
1134dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        super.setSystemProperty(property, value);
1135dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1136767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1137dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1138dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * {@inheritDoc}
1139dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1140dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public Handler getHandler() {
1141dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        return h;
1142dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1143767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1144dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1145dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * {@inheritDoc}
1146dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1147dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public IccFileHandler getIccFileHandler() {
1148dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        return this.mIccFileHandler;
1149dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1150767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1151dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1152dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Set the TTY mode of the CDMAPhone
1153dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1154dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void setTTYMode(int ttyMode, Message onComplete) {
1155dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        this.mCM.setTTYMode(ttyMode, onComplete);
1156dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1157767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1158dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1159dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Queries the TTY mode of the CDMAPhone
1160dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1161dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void queryTTYMode(Message onComplete) {
1162dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        this.mCM.queryTTYMode(onComplete);
1163dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1164e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1165dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1166dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Activate or deactivate cell broadcast SMS.
1167dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     *
1168dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @param activate 0 = activate, 1 = deactivate
1169dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @param response Callback message is empty on completion
1170dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1171dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void activateCellBroadcastSms(int activate, Message response) {
1172dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        mSMS.activateCellBroadcastSms(activate, response);
1173dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1174767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1175dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1176dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Query the current configuration of cdma cell broadcast SMS.
1177dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     *
1178dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @param response Callback message is empty on completion
1179dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1180dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void getCellBroadcastSmsConfig(Message response) {
1181dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        mSMS.getCellBroadcastSmsConfig(response);
1182dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1183767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1184dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1185dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Configure cdma cell broadcast SMS.
1186dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     *
1187dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @param response Callback message is empty on completion
1188dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1189dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void setCellBroadcastSmsConfig(int[] configValuesArray, Message response) {
1190dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        mSMS.setCellBroadcastConfig(configValuesArray, response);
1191dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1192dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1193e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final String IS683A_FEATURE_CODE = "*228";
1194e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final int IS683A_FEATURE_CODE_NUM_DIGITS = 4;
1195e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final int IS683A_SYS_SEL_CODE_NUM_DIGITS = 2;
1196e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final int IS683A_SYS_SEL_CODE_OFFSET = 4;
1197dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1198dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_800MHZ_A_BAND = 0;
1199dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_800MHZ_B_BAND = 1;
1200dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_A_BLOCK = 2;
1201dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_B_BLOCK = 3;
1202dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_C_BLOCK = 4;
1203dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_D_BLOCK = 5;
1204dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_E_BLOCK = 6;
1205dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_F_BLOCK = 7;
1206e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final int INVALID_SYSTEM_SELECTION_CODE = -1;
1207dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1208dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private boolean isIs683OtaSpDialStr(String dialStr) {
1209dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        int sysSelCodeInt;
1210dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        boolean isOtaspDialString = false;
1211dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        int dialStrLen = dialStr.length();
1212dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1213dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        if (dialStrLen == IS683A_FEATURE_CODE_NUM_DIGITS) {
1214dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            if (dialStr.equals(IS683A_FEATURE_CODE)) {
1215dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                isOtaspDialString = true;
1216dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            }
1217e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        } else {
1218e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            sysSelCodeInt = extractSelCodeFromOtaSpNum(dialStr);
1219e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            switch (sysSelCodeInt) {
1220e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_800MHZ_A_BAND:
1221e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_800MHZ_B_BAND:
1222e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_A_BLOCK:
1223e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_B_BLOCK:
1224e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_C_BLOCK:
1225e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_D_BLOCK:
1226e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_E_BLOCK:
1227e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_F_BLOCK:
1228e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    isOtaspDialString = true;
1229e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    break;
1230e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                default:
1231e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    break;
1232e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            }
1233e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        }
1234e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        return isOtaspDialString;
1235e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    }
1236e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    /**
1237e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * This function extracts the system selection code from the dial string.
1238e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     */
1239e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private int extractSelCodeFromOtaSpNum(String dialStr) {
1240e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        int dialStrLen = dialStr.length();
1241e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        int sysSelCodeInt = INVALID_SYSTEM_SELECTION_CODE;
1242e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
1243e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if ((dialStr.regionMatches(0, IS683A_FEATURE_CODE,
1244e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                                   0, IS683A_FEATURE_CODE_NUM_DIGITS)) &&
1245e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            (dialStrLen >= (IS683A_FEATURE_CODE_NUM_DIGITS +
1246e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                            IS683A_SYS_SEL_CODE_NUM_DIGITS))) {
1247e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                // Since we checked the condition above, the system selection code
1248e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                // extracted from dialStr will not cause any exception
1249e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                sysSelCodeInt = Integer.parseInt (
1250e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                                dialStr.substring (IS683A_FEATURE_CODE_NUM_DIGITS,
1251e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                                IS683A_FEATURE_CODE_NUM_DIGITS + IS683A_SYS_SEL_CODE_NUM_DIGITS));
1252e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        }
1253e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if (DBG) Log.d(LOG_TAG, "extractSelCodeFromOtaSpNum " + sysSelCodeInt);
1254e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        return sysSelCodeInt;
1255e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    }
1256dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1257e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    /**
1258e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * This function checks if the system selection code extracted from
1259e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * the dial string "sysSelCodeInt' is the system selection code specified
1260e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * in the carrier ota sp number schema "sch".
1261e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     */
1262e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private boolean
1263e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    checkOtaSpNumBasedOnSysSelCode (int sysSelCodeInt, String sch[]) {
1264e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        boolean isOtaSpNum = false;
1265e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        try {
1266e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            // Get how many number of system selection code ranges
1267e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            int selRc = Integer.parseInt((String)sch[1]);
1268e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            for (int i = 0; i < selRc; i++) {
1269e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                if (!TextUtils.isEmpty(sch[i+2]) && !TextUtils.isEmpty(sch[i+3])) {
1270e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    int selMin = Integer.parseInt((String)sch[i+2]);
1271e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    int selMax = Integer.parseInt((String)sch[i+3]);
1272e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    // Check if the selection code extracted from the dial string falls
1273e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    // within any of the range pairs specified in the schema.
1274e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    if ((sysSelCodeInt >= selMin) && (sysSelCodeInt <= selMax)) {
1275e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        isOtaSpNum = true;
1276dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                        break;
1277e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    }
1278dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                }
1279dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            }
1280e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        } catch (NumberFormatException ex) {
1281e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            // If the carrier ota sp number schema is not correct, we still allow dial
1282e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            // and only log the error:
1283e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            Log.e(LOG_TAG, "checkOtaSpNumBasedOnSysSelCode, error", ex);
1284dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
1285e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        return isOtaSpNum;
1286e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    }
1287e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
1288e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    // Define the pattern/format for carrier specified OTASP number schema.
1289e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    // It separates by comma and/or whitespace.
1290e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static Pattern pOtaSpNumSchema = Pattern.compile("[,\\s]+");
1291e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
1292e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    /**
1293e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * The following function checks if a dial string is a carrier specified
1294e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * OTASP number or not by checking against the OTASP number schema stored
1295e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * in PROPERTY_OTASP_NUM_SCHEMA.
1296e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *
1297e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * Currently, there are 2 schemas for carriers to specify the OTASP number:
1298e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * 1) Use system selection code:
1299e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    The schema is:
1300e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    SELC,the # of code pairs,min1,max1,min2,max2,...
1301e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    e.g "SELC,3,10,20,30,40,60,70" indicates that there are 3 pairs of
1302e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    selection codes, and they are {10,20}, {30,40} and {60,70} respectively.
1303e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *
1304e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * 2) Use feature code:
1305e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    The schema is:
1306e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    "FC,length of feature code,feature code".
1307e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *     e.g "FC,2,*2" indicates that the length of the feature code is 2,
1308e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *     and the code itself is "*2".
1309e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     */
1310e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private boolean isCarrierOtaSpNum(String dialStr) {
1311e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        boolean isOtaSpNum = false;
1312e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        int sysSelCodeInt = extractSelCodeFromOtaSpNum(dialStr);
1313e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if (sysSelCodeInt == INVALID_SYSTEM_SELECTION_CODE) {
1314e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            return isOtaSpNum;
1315e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        }
1316e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        // mCarrierOtaSpNumSchema is retrieved from PROPERTY_OTASP_NUM_SCHEMA:
1317e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if (!TextUtils.isEmpty(mCarrierOtaSpNumSchema)) {
1318e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            Matcher m = pOtaSpNumSchema.matcher(mCarrierOtaSpNumSchema);
1319e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            if (DBG) {
1320e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                Log.d(LOG_TAG, "isCarrierOtaSpNum,schema" + mCarrierOtaSpNumSchema);
1321e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            }
1322e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
1323e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            if (m.find()) {
1324e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                String sch[] = pOtaSpNumSchema.split(mCarrierOtaSpNumSchema);
1325e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                // If carrier uses system selection code mechanism
1326e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                if (!TextUtils.isEmpty(sch[0]) && sch[0].equals("SELC")) {
1327e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    if (sysSelCodeInt!=INVALID_SYSTEM_SELECTION_CODE) {
1328e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        isOtaSpNum=checkOtaSpNumBasedOnSysSelCode(sysSelCodeInt,sch);
1329e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    } else {
1330e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        if (DBG) {
1331e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                            Log.d(LOG_TAG, "isCarrierOtaSpNum,sysSelCodeInt is invalid");
1332e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        }
1333e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    }
1334e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                } else if (!TextUtils.isEmpty(sch[0]) && sch[0].equals("FC")) {
1335e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    int fcLen =  Integer.parseInt((String)sch[1]);
1336e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    String fc = (String)sch[2];
1337e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    if (dialStr.regionMatches(0,fc,0,fcLen)) {
1338e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        isOtaSpNum = true;
1339e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    } else {
1340e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        if (DBG) Log.d(LOG_TAG, "isCarrierOtaSpNum,not otasp number");
1341e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    }
1342e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                } else {
1343e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    if (DBG) {
1344e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        Log.d(LOG_TAG, "isCarrierOtaSpNum,ota schema not supported" + sch[0]);
1345e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    }
1346e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                }
1347e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            } else {
1348e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                if (DBG) {
1349e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    Log.d(LOG_TAG, "isCarrierOtaSpNum,ota schema pattern not right" +
1350e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                          mCarrierOtaSpNumSchema);
1351e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                }
1352e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            }
1353e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        } else {
1354e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            if (DBG) Log.d(LOG_TAG, "isCarrierOtaSpNum,ota schema pattern empty");
1355e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        }
1356e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        return isOtaSpNum;
1357dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1358767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1359d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang    /**
1360d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     * isOTASPNumber: checks a given number against the IS-683A OTASP dial string and carrier
1361d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     * OTASP dial string.
1362d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     *
1363d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     * @param dialStr the number to look up.
1364d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     * @return true if the number is in IS-683A OTASP dial string or carrier OTASP dial string
1365d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     */
1366dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    @Override
1367d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang    public  boolean isOtaSpNumber(String dialStr){
1368d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        boolean isOtaSpNum = false;
1369d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        String dialableStr = PhoneNumberUtils.extractNetworkPortion(dialStr);
1370d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        if (dialableStr != null) {
1371d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang            isOtaSpNum = isIs683OtaSpDialStr(dialableStr);
1372d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang            if (isOtaSpNum == false) {
1373d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang                isOtaSpNum = isCarrierOtaSpNum(dialableStr);
1374d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang            }
1375d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        }
1376d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        if (DBG) Log.d(LOG_TAG, "isOtaSpNumber " + isOtaSpNum);
1377d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        return isOtaSpNum;
1378d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang    }
1379e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1380e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    @Override
1381e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public int getCdmaEriIconIndex() {
1382e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        int roamInd = getServiceState().getCdmaRoamingIndicator();
1383e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        int defRoamInd = getServiceState().getCdmaDefaultRoamingIndicator();
1384f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville        return mEriManager.getCdmaEriIconIndex(roamInd, defRoamInd);
1385e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1386e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1387e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    /**
1388e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     * Returns the CDMA ERI icon mode,
1389e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     * 0 - ON
1390e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     * 1 - FLASHING
1391e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     */
1392e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    @Override
1393e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public int getCdmaEriIconMode() {
1394e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        int roamInd = getServiceState().getCdmaRoamingIndicator();
1395e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        int defRoamInd = getServiceState().getCdmaDefaultRoamingIndicator();
1396f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville        return mEriManager.getCdmaEriIconMode(roamInd, defRoamInd);
1397e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1398e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1399e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    /**
1400e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     * Returns the CDMA ERI text,
1401e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     */
1402e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    @Override
1403e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public String getCdmaEriText() {
1404e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        int roamInd = getServiceState().getCdmaRoamingIndicator();
1405e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        int defRoamInd = getServiceState().getCdmaDefaultRoamingIndicator();
1406f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville        return mEriManager.getCdmaEriText(roamInd, defRoamInd);
1407e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1408ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause
1409ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    /**
1410ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause     * Store the voicemail number in preferences
1411ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause     */
1412ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    private void storeVoiceMailNumber(String number) {
1413ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // Update the preference value of voicemail number
1414ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
1415ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        SharedPreferences.Editor editor = sp.edit();
1416ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        editor.putString(VM_NUMBER_CDMA, number);
1417ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        editor.commit();
1418ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    }
1419ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause
1420142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    /**
1421142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     * Sets PROPERTY_ICC_OPERATOR_ISO_COUNTRY property
1422142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     *
1423142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     */
1424142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    private void setIsoCountryProperty(String operatorNumeric) {
1425142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        if (TextUtils.isEmpty(operatorNumeric)) {
1426142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, "");
1427142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        } else {
1428142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            String iso = "";
1429142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            try {
1430142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                iso = MccTable.countryCodeForMcc(Integer.parseInt(
1431142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                        operatorNumeric.substring(0,3)));
1432142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            } catch (NumberFormatException ex) {
1433142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                Log.w(LOG_TAG, "countryCodeForMcc error" + ex);
1434142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            } catch (StringIndexOutOfBoundsException ex) {
1435142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                Log.w(LOG_TAG, "countryCodeForMcc error" + ex);
1436142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            }
1437142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
1438142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, iso);
1439142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        }
1440142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    }
1441142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
1442142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    /**
1443142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     * Sets the "current" field in the telephony provider according to the build-time
1444142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     * operator numeric property
1445142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     *
1446142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     * @return true for success; false otherwise.
1447142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     */
1448142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    // TODO(Moto): move this method into PhoneBase, since it looks identical to
1449142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    // the one in GsmPhone
1450142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    private boolean updateCurrentCarrierInProvider(String operatorNumeric) {
1451142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        if (!TextUtils.isEmpty(operatorNumeric)) {
1452142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            try {
1453142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
1454142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                ContentValues map = new ContentValues();
1455142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                map.put(Telephony.Carriers.NUMERIC, operatorNumeric);
1456142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                getContext().getContentResolver().insert(uri, map);
1457142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                return true;
1458142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            } catch (SQLException e) {
1459142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                Log.e(LOG_TAG, "Can't store current operator", e);
1460142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            }
1461142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        }
1462142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        return false;
1463142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    }
1464142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
1465142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    /**
1466142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     * Updates MCC and MNC device configuration information for application retrieving
1467142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     * correct version of resources
1468142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     *
1469142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     */
1470142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    private void updateMccMncConfiguration(String operatorNumeric) {
1471142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        if (operatorNumeric.length() >= 5) {
1472142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            Configuration config = new Configuration();
1473142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            config.mcc = Integer.parseInt(operatorNumeric.substring(0,3));
1474142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            config.mnc = Integer.parseInt(operatorNumeric.substring(3));
1475142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            try {
1476142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                ActivityManagerNative.getDefault().updateConfiguration(config);
1477142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            } catch (RemoteException e) {
1478142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                Log.e(LOG_TAG, "Can't update configuration", e);
1479142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            }
1480142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        }
1481142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    }
1482767a662ecde33c3979bf02b793d392aca0403162Wink Saville}
1483