1767a662ecde33c3979bf02b793d392aca0403162Wink Saville/*
2767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Copyright (C) 2006 The Android Open Source Project
3767a662ecde33c3979bf02b793d392aca0403162Wink Saville *
4767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5767a662ecde33c3979bf02b793d392aca0403162Wink Saville * you may not use this file except in compliance with the License.
6767a662ecde33c3979bf02b793d392aca0403162Wink Saville * You may obtain a copy of the License at
7767a662ecde33c3979bf02b793d392aca0403162Wink Saville *
8767a662ecde33c3979bf02b793d392aca0403162Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9767a662ecde33c3979bf02b793d392aca0403162Wink Saville *
10767a662ecde33c3979bf02b793d392aca0403162Wink Saville * Unless required by applicable law or agreed to in writing, software
11767a662ecde33c3979bf02b793d392aca0403162Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12767a662ecde33c3979bf02b793d392aca0403162Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13767a662ecde33c3979bf02b793d392aca0403162Wink Saville * See the License for the specific language governing permissions and
14767a662ecde33c3979bf02b793d392aca0403162Wink Saville * limitations under the License.
15767a662ecde33c3979bf02b793d392aca0403162Wink Saville */
16767a662ecde33c3979bf02b793d392aca0403162Wink Saville
17767a662ecde33c3979bf02b793d392aca0403162Wink Savillepackage com.android.internal.telephony.cdma;
18767a662ecde33c3979bf02b793d392aca0403162Wink Saville
19e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.app.ActivityManagerNative;
20142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport android.content.ContentValues;
21b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hambyimport android.content.Context;
22e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.content.Intent;
23ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krauseimport android.content.SharedPreferences;
24142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport android.database.SQLException;
25142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport android.net.Uri;
26767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.AsyncResult;
27767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Handler;
28767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Message;
2995a1d1a89e383dab893750638c2393dec54833ffWink Savilleimport android.os.PowerManager;
3095a1d1a89e383dab893750638c2393dec54833ffWink Savilleimport android.os.PowerManager.WakeLock;
31767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.Registrant;
32767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.RegistrantList;
33767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.os.SystemProperties;
34ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krauseimport android.preference.PreferenceManager;
35142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Savilleimport android.provider.Telephony;
36767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.telephony.CellLocation;
37767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.telephony.PhoneNumberUtils;
38767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.telephony.ServiceState;
39e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
40767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.text.TextUtils;
41767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.util.Log;
42767a662ecde33c3979bf02b793d392aca0403162Wink Saville
431c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganeshimport com.android.internal.telephony.Call;
44767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.CallStateException;
45b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hambyimport com.android.internal.telephony.CallTracker;
4690cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalinkimport com.android.internal.telephony.CommandException;
47767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.CommandsInterface;
48767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.Connection;
49ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krauseimport com.android.internal.telephony.IccException;
50767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccFileHandler;
51767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccPhoneBookInterfaceManager;
52767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccSmsInterfaceManager;
53b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hambyimport com.android.internal.telephony.MccTable;
54767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.MmiCode;
553caa1bd1061df4029951e68d0a04d5e30928701fRobert Greenwaltimport com.android.internal.telephony.OperatorInfo;
56767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.Phone;
57767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.PhoneBase;
58767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.PhoneNotifier;
59767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.PhoneProxy;
60767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.PhoneSubInfo;
61fd2d01302781af91d77557a99874111a4fee8365Wink Savilleimport com.android.internal.telephony.ServiceStateTracker;
62e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport com.android.internal.telephony.TelephonyIntents;
639bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganeshimport com.android.internal.telephony.TelephonyProperties;
6424440cf8a9431291bdcaa77b418e6c4715932507Naveen Kallaimport com.android.internal.telephony.UUSInfo;
65b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hambyimport com.android.internal.telephony.cat.CatService;
66142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
67e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kallaimport java.util.ArrayList;
68767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport java.util.List;
69e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Liimport java.util.regex.Matcher;
70e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Liimport java.util.regex.Pattern;
71e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
72b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hambyimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ALPHA;
73b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hambyimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY;
74b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hambyimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC;
75b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby
76767a662ecde33c3979bf02b793d392aca0403162Wink Saville/**
77767a662ecde33c3979bf02b793d392aca0403162Wink Saville * {@hide}
78767a662ecde33c3979bf02b793d392aca0403162Wink Saville */
79767a662ecde33c3979bf02b793d392aca0403162Wink Savillepublic class CDMAPhone extends PhoneBase {
80767a662ecde33c3979bf02b793d392aca0403162Wink Saville    static final String LOG_TAG = "CDMA";
81e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final boolean DBG = true;
82767a662ecde33c3979bf02b793d392aca0403162Wink Saville
8322ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville    // Default Emergency Callback Mode exit timer
84019581bf6055eb69ee7e4cb844dafe2b6c23597eCheng Yang    private static final int DEFAULT_ECM_EXIT_TIMER_VALUE = 300000;
8595a1d1a89e383dab893750638c2393dec54833ffWink Saville
86ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    static final String VM_COUNT_CDMA = "vm_count_key_cdma";
87ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    private static final String VM_NUMBER_CDMA = "vm_number_key_cdma";
88ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    private String mVmNumber = null;
8922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville
9095a1d1a89e383dab893750638c2393dec54833ffWink Saville    static final int RESTART_ECM_TIMER = 0; // restart Ecm timer
9195a1d1a89e383dab893750638c2393dec54833ffWink Saville    static final int CANCEL_ECM_TIMER = 1; // cancel Ecm timer
9295a1d1a89e383dab893750638c2393dec54833ffWink Saville
93a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville    // Instance Variables
94767a662ecde33c3979bf02b793d392aca0403162Wink Saville    CdmaCallTracker mCT;
95767a662ecde33c3979bf02b793d392aca0403162Wink Saville    CdmaServiceStateTracker mSST;
96e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla    ArrayList <CdmaMmiCode> mPendingMmis = new ArrayList<CdmaMmiCode>();
97767a662ecde33c3979bf02b793d392aca0403162Wink Saville    RuimPhoneBookInterfaceManager mRuimPhoneBookInterfaceManager;
98767a662ecde33c3979bf02b793d392aca0403162Wink Saville    RuimSmsInterfaceManager mRuimSmsInterfaceManager;
99767a662ecde33c3979bf02b793d392aca0403162Wink Saville    PhoneSubInfo mSubInfo;
100e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    EriManager mEriManager;
10195a1d1a89e383dab893750638c2393dec54833ffWink Saville    WakeLock mWakeLock;
102a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka    CatService mCcatService;
103a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville
104e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    // mNvLoadedRegistrants are informed after the EVENT_NV_READY
105b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    private final RegistrantList mNvLoadedRegistrants = new RegistrantList();
106e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
107e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    // mEriFileLoadedRegistrants are informed after the ERI text has been loaded
108b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    private final RegistrantList mEriFileLoadedRegistrants = new RegistrantList();
109dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
11095a1d1a89e383dab893750638c2393dec54833ffWink Saville    // mEcmTimerResetRegistrants are informed after Ecm timer is canceled or re-started
111b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    private final RegistrantList mEcmTimerResetRegistrants = new RegistrantList();
11295a1d1a89e383dab893750638c2393dec54833ffWink Saville
11395a1d1a89e383dab893750638c2393dec54833ffWink Saville    // mEcmExitRespRegistrant is informed after the phone has been exited
114dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    //the emergency callback mode
115dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    //keep track of if phone is in emergency callback mode
11695a1d1a89e383dab893750638c2393dec54833ffWink Saville    private boolean mIsPhoneInEcmState;
11795a1d1a89e383dab893750638c2393dec54833ffWink Saville    private Registrant mEcmExitRespRegistrant;
1182ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang    protected String mImei;
1192ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang    protected String mImeiSv;
120767a662ecde33c3979bf02b793d392aca0403162Wink Saville    private String mEsn;
121767a662ecde33c3979bf02b793d392aca0403162Wink Saville    private String mMeid;
122e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    // string to define how the carrier specifies its own ota sp number
123e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private String mCarrierOtaSpNumSchema;
1242563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville
12595a1d1a89e383dab893750638c2393dec54833ffWink Saville    // A runnable which is used to automatically exit from Ecm after a period of time.
126dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private Runnable mExitEcmRunnable = new Runnable() {
127b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        @Override
128dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        public void run() {
129dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            exitEmergencyCallbackMode();
130dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
131dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    };
132767a662ecde33c3979bf02b793d392aca0403162Wink Saville
133767a662ecde33c3979bf02b793d392aca0403162Wink Saville    Registrant mPostDialHandler;
134767a662ecde33c3979bf02b793d392aca0403162Wink Saville
135fe629782f33a07827c69841fce9964bd90ff152aWink Saville    static String PROPERTY_CDMA_HOME_OPERATOR_NUMERIC = "ro.cdma.home.operator.numeric";
136767a662ecde33c3979bf02b793d392aca0403162Wink Saville
137a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville    // Constructors
138767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier) {
1399d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        super(notifier, context, ci, false);
1401f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville        initSstIcc();
1419d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        init(context, notifier);
142767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
143767a662ecde33c3979bf02b793d392aca0403162Wink Saville
144767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier,
145767a662ecde33c3979bf02b793d392aca0403162Wink Saville            boolean unitTestMode) {
146a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        super(notifier, context, ci, unitTestMode);
1471f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville        initSstIcc();
1489d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        init(context, notifier);
1499d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
150767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1511f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville    protected void initSstIcc() {
15275acebd02d2b3478d98cc8da98fa9229c53c32d5Ramesh Sudini        mSST = new CdmaServiceStateTracker(this);
1531f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville        mIccRecords = new RuimRecords(this);
1541f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville        mIccCard = new RuimCard(this, LOG_TAG, DBG);
155c46a085eedef8c7c59df4b182d90d787f1ff0f04Kazuhiro Ondo        mIccFileHandler = new RuimFileHandler(this);
15675acebd02d2b3478d98cc8da98fa9229c53c32d5Ramesh Sudini    }
15775acebd02d2b3478d98cc8da98fa9229c53c32d5Ramesh Sudini
1589d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    protected void init(Context context, PhoneNotifier notifier) {
1593cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink        mCM.setPhoneType(Phone.PHONE_TYPE_CDMA);
160767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT = new CdmaCallTracker(this);
161b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mSMS = new CdmaSMSDispatcher(this, mSmsStorageMonitor, mSmsUsageMonitor);
16263edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt        mDataConnectionTracker = new CdmaDataConnectionTracker (this);
163767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mRuimPhoneBookInterfaceManager = new RuimPhoneBookInterfaceManager(this);
164bb3716332321e22537a5015be13e2229fb9b90bcJake Hamby        mRuimSmsInterfaceManager = new RuimSmsInterfaceManager(this, mSMS);
165767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSubInfo = new PhoneSubInfo(this);
166e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mEriManager = new EriManager(this, context, EriManager.ERI_FROM_XML);
1671f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville        mCcatService = CatService.getInstance(mCM, mIccRecords, mContext,
1681f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville                mIccFileHandler, mIccCard);
169767a662ecde33c3979bf02b793d392aca0403162Wink Saville
170a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.registerForAvailable(this, EVENT_RADIO_AVAILABLE, null);
1711f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville        mIccRecords.registerForRecordsLoaded(this, EVENT_RUIM_RECORDS_LOADED, null);
172a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
173a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.registerForOn(this, EVENT_RADIO_ON, null);
174a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.setOnSuppServiceNotification(this, EVENT_SSN, null);
17588d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null);
176a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.registerForNVReady(this, EVENT_NV_READY, null);
177a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.setEmergencyCallbackMode(this, EVENT_EMERGENCY_CALLBACK_MODE_ENTER, null);
178e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
17995a1d1a89e383dab893750638c2393dec54833ffWink Saville        PowerManager pm
18095a1d1a89e383dab893750638c2393dec54833ffWink Saville            = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
18195a1d1a89e383dab893750638c2393dec54833ffWink Saville        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,LOG_TAG);
182767a662ecde33c3979bf02b793d392aca0403162Wink Saville
183767a662ecde33c3979bf02b793d392aca0403162Wink Saville        //Change the system setting
1849bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        SystemProperties.set(TelephonyProperties.CURRENT_ACTIVE_PHONE,
185b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby                Integer.toString(Phone.PHONE_TYPE_CDMA));
186dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
18722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        // This is needed to handle phone process crashes
18822ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
18995a1d1a89e383dab893750638c2393dec54833ffWink Saville        mIsPhoneInEcmState = inEcm.equals("true");
1909b62851c3fbcd7fb61ead7583dcae33e411232d0Libin Tang        if (mIsPhoneInEcmState) {
1919b62851c3fbcd7fb61ead7583dcae33e411232d0Libin Tang            // Send a message which will invoke handleExitEmergencyCallbackMode
1929b62851c3fbcd7fb61ead7583dcae33e411232d0Libin Tang            mCM.exitEmergencyCallbackMode(obtainMessage(EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE));
1939b62851c3fbcd7fb61ead7583dcae33e411232d0Libin Tang        }
194ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause
195e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        // get the string that specifies the carrier OTA Sp number
196e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        mCarrierOtaSpNumSchema = SystemProperties.get(
197e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                TelephonyProperties.PROPERTY_OTASP_NUM_SCHEMA,"");
198e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
199142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        // Sets operator alpha property by retrieving from build-time system property
200142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        String operatorAlpha = SystemProperties.get("ro.cdma.home.operator.alpha");
201142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, operatorAlpha);
202142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
203142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        // Sets operator numeric property by retrieving from build-time system property
204fe629782f33a07827c69841fce9964bd90ff152aWink Saville        String operatorNumeric = SystemProperties.get(PROPERTY_CDMA_HOME_OPERATOR_NUMERIC);
205142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, operatorNumeric);
206142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
207142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        // Sets iso country property by retrieving from build-time system property
208142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        setIsoCountryProperty(operatorNumeric);
209142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
210142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        // Sets current entry in the telephony carrier table
211142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        updateCurrentCarrierInProvider(operatorNumeric);
212142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
213ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // Notify voicemails.
214ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        notifier.notifyMessageWaitingChanged(this);
215767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
216767a662ecde33c3979bf02b793d392aca0403162Wink Saville
217b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    @Override
218767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void dispose() {
219767a662ecde33c3979bf02b793d392aca0403162Wink Saville        synchronized(PhoneProxy.lockForRadioTechnologyChange) {
220a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            super.dispose();
2211f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville            log("dispose");
222767a662ecde33c3979bf02b793d392aca0403162Wink Saville
223767a662ecde33c3979bf02b793d392aca0403162Wink Saville            //Unregister from all former registered events
2241f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville            mIccRecords.unregisterForRecordsLoaded(this); //EVENT_RUIM_RECORDS_LOADED
225a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            mCM.unregisterForAvailable(this); //EVENT_RADIO_AVAILABLE
226a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            mCM.unregisterForOffOrNotAvailable(this); //EVENT_RADIO_OFF_OR_NOT_AVAILABLE
227a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            mCM.unregisterForOn(this); //EVENT_RADIO_ON
228a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            mCM.unregisterForNVReady(this); //EVENT_NV_READY
22988d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt            mSST.unregisterForNetworkAttached(this); //EVENT_REGISTERED_TO_NETWORK
230a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            mCM.unSetOnSuppServiceNotification(this);
231f3ee6f87a344b185d8bde12c77440c9020378510Banavathu, Srinivas Naik            removeCallbacks(mExitEcmRunnable);
232767a662ecde33c3979bf02b793d392aca0403162Wink Saville
233e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            mPendingMmis.clear();
234e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla
235767a662ecde33c3979bf02b793d392aca0403162Wink Saville            //Force all referenced classes to unregister their former registered events
236767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCT.dispose();
23763edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt            mDataConnectionTracker.dispose();
238767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSST.dispose();
239767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSMS.dispose();
240767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mIccFileHandler.dispose(); // instance of RuimFileHandler
2411f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville            mIccRecords.dispose();
2421f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville            mIccCard.dispose();
243767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mRuimPhoneBookInterfaceManager.dispose();
244767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mRuimSmsInterfaceManager.dispose();
245767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSubInfo.dispose();
246e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mEriManager.dispose();
247a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenka            mCcatService.dispose();
248767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
249767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
250767a662ecde33c3979bf02b793d392aca0403162Wink Saville
251b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    @Override
252767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void removeReferences() {
253b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        log("removeReferences");
254b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        super.removeReferences();
255b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mRuimPhoneBookInterfaceManager = null;
256b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mRuimSmsInterfaceManager = null;
257b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mSMS = null;
258b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mSubInfo = null;
259b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mIccRecords = null;
260b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mIccFileHandler = null;
261b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mIccCard = null;
262b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mDataConnectionTracker = null;
263b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mCT = null;
264b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mSST = null;
265b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mEriManager = null;
266b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mCcatService = null;
267b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mExitEcmRunnable = null;
268767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
269767a662ecde33c3979bf02b793d392aca0403162Wink Saville
270b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    @Override
271767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected void finalize() {
272e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if(DBG) Log.d(LOG_TAG, "CDMAPhone finalized");
27395a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (mWakeLock.isHeld()) {
27495a1d1a89e383dab893750638c2393dec54833ffWink Saville            Log.e(LOG_TAG, "UNEXPECTED; mWakeLock is held when finalizing.");
27595a1d1a89e383dab893750638c2393dec54833ffWink Saville            mWakeLock.release();
27695a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
277767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
278767a662ecde33c3979bf02b793d392aca0403162Wink Saville
279767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public ServiceState getServiceState() {
280767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSST.ss;
281767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
282767a662ecde33c3979bf02b793d392aca0403162Wink Saville
2839d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public CallTracker getCallTracker() {
2849d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        return mCT;
2859d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
2869d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
2873cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink    public Phone.State getState() {
288767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.state;
289767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
290767a662ecde33c3979bf02b793d392aca0403162Wink Saville
2919d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public ServiceStateTracker getServiceStateTracker() {
2929d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        return mSST;
2939d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
2949d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
2953cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink    public String getPhoneName() {
296767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return "CDMA";
297767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
298767a662ecde33c3979bf02b793d392aca0403162Wink Saville
2993cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink    public int getPhoneType() {
3003cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink        return Phone.PHONE_TYPE_CDMA;
3013cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink    }
3023cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink
303767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean canTransfer() {
304767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "canTransfer: not possible in CDMA");
305767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
306767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
307767a662ecde33c3979bf02b793d392aca0403162Wink Saville
3083cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink    public CdmaCall getRingingCall() {
309767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.ringingCall;
310767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
311767a662ecde33c3979bf02b793d392aca0403162Wink Saville
312767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setMute(boolean muted) {
313767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.setMute(muted);
314767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
315767a662ecde33c3979bf02b793d392aca0403162Wink Saville
316767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean getMute() {
317767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.getMute();
318767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
319767a662ecde33c3979bf02b793d392aca0403162Wink Saville
320767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void conference() throws CallStateException {
321767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // three way calls in CDMA will be handled by feature codes
322767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "conference: not possible in CDMA");
323767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
324767a662ecde33c3979bf02b793d392aca0403162Wink Saville
325767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void enableEnhancedVoicePrivacy(boolean enable, Message onComplete) {
326767a662ecde33c3979bf02b793d392aca0403162Wink Saville        this.mCM.setPreferredVoicePrivacy(enable, onComplete);
327767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
328767a662ecde33c3979bf02b793d392aca0403162Wink Saville
329767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getEnhancedVoicePrivacy(Message onComplete) {
330767a662ecde33c3979bf02b793d392aca0403162Wink Saville        this.mCM.getPreferredVoicePrivacy(onComplete);
331767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
332767a662ecde33c3979bf02b793d392aca0403162Wink Saville
333767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void clearDisconnected() {
334767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.clearDisconnected();
335767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
336767a662ecde33c3979bf02b793d392aca0403162Wink Saville
337767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public DataActivityState getDataActivityState() {
338767a662ecde33c3979bf02b793d392aca0403162Wink Saville        DataActivityState ret = DataActivityState.NONE;
339767a662ecde33c3979bf02b793d392aca0403162Wink Saville
340a4e82851e9c8a75dfb371403c500e3b3cf3e4565Robert Greenwalt        if (mSST.getCurrentDataConnectionState() == ServiceState.STATE_IN_SERVICE) {
341767a662ecde33c3979bf02b793d392aca0403162Wink Saville
34263edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt            switch (mDataConnectionTracker.getActivity()) {
343767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAIN:
344767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAIN;
345767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
346767a662ecde33c3979bf02b793d392aca0403162Wink Saville
347767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAOUT:
348767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAOUT;
349767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
350767a662ecde33c3979bf02b793d392aca0403162Wink Saville
351767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAINANDOUT:
352767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAINANDOUT;
353767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
354e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
355e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                case DORMANT:
356e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                    ret = DataActivityState.DORMANT;
357e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                break;
358767a662ecde33c3979bf02b793d392aca0403162Wink Saville            }
359767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
360767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return ret;
361767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
362767a662ecde33c3979bf02b793d392aca0403162Wink Saville
363767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /*package*/ void
364767a662ecde33c3979bf02b793d392aca0403162Wink Saville    notifySignalStrength() {
365767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mNotifier.notifySignalStrength(this);
366767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
367767a662ecde33c3979bf02b793d392aca0403162Wink Saville
368767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public Connection
369767a662ecde33c3979bf02b793d392aca0403162Wink Saville    dial (String dialString) throws CallStateException {
370767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // Need to make sure dialString gets parsed properly
371767a662ecde33c3979bf02b793d392aca0403162Wink Saville        String newDialString = PhoneNumberUtils.stripSeparators(dialString);
37222ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        return mCT.dial(newDialString);
373767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
374767a662ecde33c3979bf02b793d392aca0403162Wink Saville
37524440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla    public Connection dial(String dialString, UUSInfo uusInfo) throws CallStateException {
37624440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla        throw new CallStateException("Sending UUS information NOT supported in CDMA!");
37724440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla    }
37824440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla
379e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public SignalStrength getSignalStrength() {
380e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        return mSST.mSignalStrength;
381767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
382767a662ecde33c3979bf02b793d392aca0403162Wink Saville
383767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean
384767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getMessageWaitingIndicator() {
385ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        return (getVoiceMessageCount() > 0);
386767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
387767a662ecde33c3979bf02b793d392aca0403162Wink Saville
388767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public List<? extends MmiCode>
389767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getPendingMmiCodes() {
390e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        return mPendingMmis;
391767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
392767a662ecde33c3979bf02b793d392aca0403162Wink Saville
393767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void registerForSuppServiceNotification(
394767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Handler h, int what, Object obj) {
395767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method registerForSuppServiceNotification is NOT supported in CDMA!");
396767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
397767a662ecde33c3979bf02b793d392aca0403162Wink Saville
398767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CdmaCall getBackgroundCall() {
399767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.backgroundCall;
400767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
401767a662ecde33c3979bf02b793d392aca0403162Wink Saville
402767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean handleInCallMmiCommands(String dialString) {
403767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method handleInCallMmiCommands is NOT supported in CDMA!");
404767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
405767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
406767a662ecde33c3979bf02b793d392aca0403162Wink Saville
407e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla    boolean isInCall() {
408e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        CdmaCall.State foregroundCallState = getForegroundCall().getState();
409e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        CdmaCall.State backgroundCallState = getBackgroundCall().getState();
410e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        CdmaCall.State ringingCallState = getRingingCall().getState();
411e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla
412e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        return (foregroundCallState.isAlive() || backgroundCallState.isAlive() || ringingCallState
413e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla                .isAlive());
414e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla    }
415e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla
416767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
417767a662ecde33c3979bf02b793d392aca0403162Wink Saville    setNetworkSelectionModeAutomatic(Message response) {
418767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method setNetworkSelectionModeAutomatic is NOT supported in CDMA!");
419767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
420767a662ecde33c3979bf02b793d392aca0403162Wink Saville
421767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void unregisterForSuppServiceNotification(Handler h) {
422767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method unregisterForSuppServiceNotification is NOT supported in CDMA!");
423767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
424767a662ecde33c3979bf02b793d392aca0403162Wink Saville
425767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
426767a662ecde33c3979bf02b793d392aca0403162Wink Saville    acceptCall() throws CallStateException {
427767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.acceptCall();
428767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
429767a662ecde33c3979bf02b793d392aca0403162Wink Saville
430767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
431767a662ecde33c3979bf02b793d392aca0403162Wink Saville    rejectCall() throws CallStateException {
432767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.rejectCall();
433767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
434767a662ecde33c3979bf02b793d392aca0403162Wink Saville
435767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
436767a662ecde33c3979bf02b793d392aca0403162Wink Saville    switchHoldingAndActive() throws CallStateException {
437767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT.switchWaitingOrHoldingAndActive();
438767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
439767a662ecde33c3979bf02b793d392aca0403162Wink Saville
440767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getLine1Number() {
441f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville        return mSST.getMdnNumber();
442767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
443767a662ecde33c3979bf02b793d392aca0403162Wink Saville
44422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville    public String getCdmaPrlVersion(){
445daccacb865947c00f277f1823333e2fbf91e652aWink Saville        return mSST.getPrlVersion();
44622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville    }
44722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville
448019581bf6055eb69ee7e4cb844dafe2b6c23597eCheng Yang    public String getCdmaMin() {
449f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville        return mSST.getCdmaMin();
450e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
451e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
4529e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    public boolean isMinInfoReady() {
4539e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo        return mSST.isMinInfoReady();
4549e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    }
4559e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo
456767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getCallWaiting(Message onComplete) {
457767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.queryCallWaiting(CommandsInterface.SERVICE_CLASS_VOICE, onComplete);
458767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
459767a662ecde33c3979bf02b793d392aca0403162Wink Saville
460767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
461767a662ecde33c3979bf02b793d392aca0403162Wink Saville    setRadioPower(boolean power) {
462767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSST.setRadioPower(power);
463767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
464767a662ecde33c3979bf02b793d392aca0403162Wink Saville
465767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getEsn() {
466767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mEsn;
467767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
468767a662ecde33c3979bf02b793d392aca0403162Wink Saville
469767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getMeid() {
470767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mMeid;
471767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
472767a662ecde33c3979bf02b793d392aca0403162Wink Saville
4733158cf689f4994ec53c3b727f9b6ad7751a5551bWink Saville    //returns MEID or ESN in CDMA
474767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getDeviceId() {
4753158cf689f4994ec53c3b727f9b6ad7751a5551bWink Saville        String id = getMeid();
4763158cf689f4994ec53c3b727f9b6ad7751a5551bWink Saville        if ((id == null) || id.matches("^0*$")) {
4773158cf689f4994ec53c3b727f9b6ad7751a5551bWink Saville            Log.d(LOG_TAG, "getDeviceId(): MEID is not initialized use ESN");
4783158cf689f4994ec53c3b727f9b6ad7751a5551bWink Saville            id = getEsn();
4793158cf689f4994ec53c3b727f9b6ad7751a5551bWink Saville        }
4803158cf689f4994ec53c3b727f9b6ad7751a5551bWink Saville        return id;
481767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
482767a662ecde33c3979bf02b793d392aca0403162Wink Saville
483767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getDeviceSvn() {
484767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.d(LOG_TAG, "getDeviceSvn(): return 0");
485767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return "0";
486767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
487767a662ecde33c3979bf02b793d392aca0403162Wink Saville
488767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getSubscriberId() {
489142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        return mSST.getImsi();
490767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
491767a662ecde33c3979bf02b793d392aca0403162Wink Saville
4922ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang    public String getImei() {
4932ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang        Log.e(LOG_TAG, "IMEI is not available in CDMA");
4942ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang        return null;
4952ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang    }
4962ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang
497767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean canConference() {
498767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "canConference: not possible in CDMA");
499767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
500767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
501767a662ecde33c3979bf02b793d392aca0403162Wink Saville
502767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CellLocation getCellLocation() {
503767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSST.cellLoc;
504767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
505767a662ecde33c3979bf02b793d392aca0403162Wink Saville
506767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public CdmaCall getForegroundCall() {
507767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.foregroundCall;
508767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
509767a662ecde33c3979bf02b793d392aca0403162Wink Saville
510767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
5113caa1bd1061df4029951e68d0a04d5e30928701fRobert Greenwalt    selectNetworkManually(OperatorInfo network,
512767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Message response) {
513767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "selectNetworkManually: not possible in CDMA");
514767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
515767a662ecde33c3979bf02b793d392aca0403162Wink Saville
516767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setOnPostDialCharacter(Handler h, int what, Object obj) {
517dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        mPostDialHandler = new Registrant(h, what, obj);
518767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
519767a662ecde33c3979bf02b793d392aca0403162Wink Saville
520767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean handlePinMmi(String dialString) {
521e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        CdmaMmiCode mmi = CdmaMmiCode.newFromDialString(dialString, this);
522e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla
523e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        if (mmi == null) {
524e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            Log.e(LOG_TAG, "Mmi is NULL!");
525e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            return false;
526e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        } else if (mmi.isPukCommand()) {
527e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            mPendingMmis.add(mmi);
528e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
529e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            mmi.processCode();
530e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            return true;
531e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        }
532e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        Log.e(LOG_TAG, "Unrecognized mmi!");
533767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
534767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
535767a662ecde33c3979bf02b793d392aca0403162Wink Saville
536e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla    /**
537e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla     * Removes the given MMI from the pending list and notifies registrants that
538e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla     * it is complete.
539e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla     *
540e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla     * @param mmi MMI that is done
541e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla     */
542e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla    void onMMIDone(CdmaMmiCode mmi) {
543e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        /*
544e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla         * Only notify complete if it's on the pending list. Otherwise, it's
545e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla         * already been handled (eg, previously canceled).
546e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla         */
547e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        if (mPendingMmis.remove(mmi)) {
548e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla            mMmiCompleteRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
549e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla        }
550e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla    }
551e9c0a6d73711ace2ed53f90862ef06f3d0ed6afeNaveen Kalla
552767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setLine1Number(String alphaTag, String number, Message onComplete) {
553767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "setLine1Number: not possible in CDMA");
554767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
555767a662ecde33c3979bf02b793d392aca0403162Wink Saville
556767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setCallWaiting(boolean enable, Message onComplete) {
557767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "method setCallWaiting is NOT supported in CDMA!");
558767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
559767a662ecde33c3979bf02b793d392aca0403162Wink Saville
5607a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink    public void updateServiceLocation() {
5617a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        mSST.enableSingleLocationUpdate();
562767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
563767a662ecde33c3979bf02b793d392aca0403162Wink Saville
564767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setDataRoamingEnabled(boolean enable) {
56563edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt        mDataConnectionTracker.setDataOnRoamingEnabled(enable);
566767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
567767a662ecde33c3979bf02b793d392aca0403162Wink Saville
568dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void registerForCdmaOtaStatusChange(Handler h, int what, Object obj) {
569dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        mCM.registerForCdmaOtaProvision(h, what, obj);
570dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
571dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
572dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void unregisterForCdmaOtaStatusChange(Handler h) {
573dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        mCM.unregisterForCdmaOtaProvision(h);
574dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
575dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
5769e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    public void registerForSubscriptionInfoReady(Handler h, int what, Object obj) {
5779e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo        mSST.registerForSubscriptionInfoReady(h, what, obj);
5789e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    }
5799e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo
5809e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    public void unregisterForSubscriptionInfoReady(Handler h) {
5819e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo        mSST.unregisterForSubscriptionInfoReady(h);
5829e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo    }
5839e652dcc213b96087ccadc730b1e6b1891cd02aeJinghui Guo
584dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void setOnEcbModeExitResponse(Handler h, int what, Object obj) {
58595a1d1a89e383dab893750638c2393dec54833ffWink Saville        mEcmExitRespRegistrant = new Registrant (h, what, obj);
586dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
587dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
588dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void unsetOnEcbModeExitResponse(Handler h) {
58995a1d1a89e383dab893750638c2393dec54833ffWink Saville        mEcmExitRespRegistrant.clear();
590dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
591dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
592dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void registerForCallWaiting(Handler h, int what, Object obj) {
59322ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        mCT.registerForCallWaiting(h, what, obj);
594dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
595dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
596dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void unregisterForCallWaiting(Handler h) {
59722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville        mCT.unregisterForCallWaiting(h);
598dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
599dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
600767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
601767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getNeighboringCids(Message response) {
60290cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink        /*
60390cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * This is currently not implemented.  At least as of June
60490cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * 2009, there is no neighbor cell information available for
60590cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * CDMA because some party is resisting making this
60690cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * information readily available.  Consequently, calling this
60790cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * function can have no useful effect.  This situation may
60890cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         * (and hopefully will) change in the future.
60990cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink         */
61090cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink        if (response != null) {
61190cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink            CommandException ce = new CommandException(
61290cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink                    CommandException.Error.REQUEST_NOT_SUPPORTED);
61390cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink            AsyncResult.forMessage(response).exception = ce;
61490cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink            response.sendToTarget();
61590cb947c22f05f8ac68ceff1d74af15bf38268c6Tammo Spalink        }
616767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
617767a662ecde33c3979bf02b793d392aca0403162Wink Saville
61802648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt    public DataState getDataConnectionState(String apnType) {
619767a662ecde33c3979bf02b793d392aca0403162Wink Saville        DataState ret = DataState.DISCONNECTED;
620767a662ecde33c3979bf02b793d392aca0403162Wink Saville
62182583b8312403ed734c30b161750d40c26086ee2Elliott Hughes        if (mSST == null) {
622e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville             // Radio Technology Change is ongoning, dispose() and removeReferences() have
623e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville             // already been called
62444038aa032ffd876f3c9b20a84db9d189f77e18eWink Saville
625e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville             ret = DataState.DISCONNECTED;
626a4e82851e9c8a75dfb371403c500e3b3cf3e4565Robert Greenwalt        } else if (mSST.getCurrentDataConnectionState() != ServiceState.STATE_IN_SERVICE) {
627767a662ecde33c3979bf02b793d392aca0403162Wink Saville            // If we're out of service, open TCP sockets may still work
628767a662ecde33c3979bf02b793d392aca0403162Wink Saville            // but no data will flow
629767a662ecde33c3979bf02b793d392aca0403162Wink Saville            ret = DataState.DISCONNECTED;
63063edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt        } else if (mDataConnectionTracker.isApnTypeEnabled(apnType) == false ||
63163edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt                mDataConnectionTracker.isApnTypeActive(apnType) == false) {
63202648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt            ret = DataState.DISCONNECTED;
633767a662ecde33c3979bf02b793d392aca0403162Wink Saville        } else {
63463edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt            switch (mDataConnectionTracker.getState(apnType)) {
635767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case FAILED:
636767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case IDLE:
637767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataState.DISCONNECTED;
638767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
639767a662ecde33c3979bf02b793d392aca0403162Wink Saville
640767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case CONNECTED:
641767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DISCONNECTING:
642767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    if ( mCT.state != Phone.State.IDLE
6439d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville                            && !mSST.isConcurrentVoiceAndDataAllowed()) {
644767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        ret = DataState.SUSPENDED;
645767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    } else {
646767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        ret = DataState.CONNECTED;
647767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    }
648767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
649767a662ecde33c3979bf02b793d392aca0403162Wink Saville
650767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case INITING:
651767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case CONNECTING:
652767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case SCANNING:
653767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataState.CONNECTING;
654767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
655767a662ecde33c3979bf02b793d392aca0403162Wink Saville            }
656767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
657767a662ecde33c3979bf02b793d392aca0403162Wink Saville
6581f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville        log("getDataConnectionState apnType=" + apnType + " ret=" + ret);
659767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return ret;
660767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
661767a662ecde33c3979bf02b793d392aca0403162Wink Saville
662767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void sendUssdResponse(String ussdMessge) {
663767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "sendUssdResponse: not possible in CDMA");
664767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
665767a662ecde33c3979bf02b793d392aca0403162Wink Saville
666767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void sendDtmf(char c) {
667767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (!PhoneNumberUtils.is12Key(c)) {
668767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Log.e(LOG_TAG,
669767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    "sendDtmf called with invalid character '" + c + "'");
670767a662ecde33c3979bf02b793d392aca0403162Wink Saville        } else {
671767a662ecde33c3979bf02b793d392aca0403162Wink Saville            if (mCT.state ==  Phone.State.OFFHOOK) {
672767a662ecde33c3979bf02b793d392aca0403162Wink Saville                mCM.sendDtmf(c, null);
673767a662ecde33c3979bf02b793d392aca0403162Wink Saville            }
674767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
675767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
676767a662ecde33c3979bf02b793d392aca0403162Wink Saville
677767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void startDtmf(char c) {
678767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (!PhoneNumberUtils.is12Key(c)) {
679767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Log.e(LOG_TAG,
680767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    "startDtmf called with invalid character '" + c + "'");
681767a662ecde33c3979bf02b793d392aca0403162Wink Saville        } else {
682767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.startDtmf(c, null);
683767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
684767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
685767a662ecde33c3979bf02b793d392aca0403162Wink Saville
686767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void stopDtmf() {
687767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.stopDtmf(null);
688767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
689767a662ecde33c3979bf02b793d392aca0403162Wink Saville
690dafa22a3ef9328c72319aeec605f6a6d20e46080jsh    public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete) {
691e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        boolean check = true;
692e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        for (int itr = 0;itr < dtmfString.length(); itr++) {
693e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            if (!PhoneNumberUtils.is12Key(dtmfString.charAt(itr))) {
694e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                Log.e(LOG_TAG,
695e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                        "sendDtmf called with invalid character '" + dtmfString.charAt(itr)+ "'");
696e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                check = false;
697e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville                break;
698e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            }
699e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
700e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if ((mCT.state ==  Phone.State.OFFHOOK)&&(check)) {
701dafa22a3ef9328c72319aeec605f6a6d20e46080jsh            mCM.sendBurstDtmf(dtmfString, on, off, onComplete);
702e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
703e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     }
704e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
705767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getAvailableNetworks(Message response) {
706767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getAvailableNetworks: not possible in CDMA");
707767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
708767a662ecde33c3979bf02b793d392aca0403162Wink Saville
709767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode, Message onComplete) {
710dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        Log.e(LOG_TAG, "setOutgoingCallerIdDisplay: not possible in CDMA");
711767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
712767a662ecde33c3979bf02b793d392aca0403162Wink Saville
713767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void enableLocationUpdates() {
714767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSST.enableLocationUpdates();
715767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
716767a662ecde33c3979bf02b793d392aca0403162Wink Saville
7177a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink    public void disableLocationUpdates() {
7187a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        mSST.disableLocationUpdates();
7197a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink    }
7207a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink
721767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getDataCallList(Message response) {
722767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.getDataCallList(response);
723767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
724767a662ecde33c3979bf02b793d392aca0403162Wink Saville
725767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean getDataRoamingEnabled() {
72663edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt        return mDataConnectionTracker.getDataOnRoamingEnabled();
727767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
728767a662ecde33c3979bf02b793d392aca0403162Wink Saville
729767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setVoiceMailNumber(String alphaTag,
730767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                   String voiceMailNumber,
731767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                   Message onComplete) {
732ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        Message resp;
733ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        mVmNumber = voiceMailNumber;
734a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        resp = obtainMessage(EVENT_SET_VM_NUMBER_DONE, 0, 0, onComplete);
7351f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville        mIccRecords.setVoiceMailNumber(alphaTag, mVmNumber, resp);
736767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
737767a662ecde33c3979bf02b793d392aca0403162Wink Saville
738767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getVoiceMailNumber() {
739ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        String number = null;
740ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
7417188f946521d64ea21121939d2a4c279f33fe910Wink Saville        // TODO: The default value of voicemail number should be read from a system property
742092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi
743092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi        // Read platform settings for dynamic voicemail number
744092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi        if (getContext().getResources().getBoolean(com.android.internal
745092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi                .R.bool.config_telephony_use_own_number_for_voicemail)) {
746092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi            number = sp.getString(VM_NUMBER_CDMA, getLine1Number());
747092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi        } else {
748092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi            number = sp.getString(VM_NUMBER_CDMA, "*86");
749092238916fd5d10090c0bcad33644778a1f366e7Samyeoul Choi        }
750ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        return number;
751dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
752dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
753dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /* Returns Number of Voicemails
754dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @hide
755dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
756ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    public int getVoiceMessageCount() {
7571f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville        int voicemailCount =  mIccRecords.getVoiceMessageCount();
758ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // If mRuimRecords.getVoiceMessageCount returns zero, then there is possibility
759ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // that phone was power cycled and would have lost the voicemail count.
760ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // So get the count from preferences.
761ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        if (voicemailCount == 0) {
762ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
763ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause            voicemailCount = sp.getInt(VM_COUNT_CDMA, 0);
764ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        }
765ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        return voicemailCount;
766767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
767767a662ecde33c3979bf02b793d392aca0403162Wink Saville
768767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getVoiceMailAlphaTag() {
769767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // TODO: Where can we get this value has to be clarified with QC.
770767a662ecde33c3979bf02b793d392aca0403162Wink Saville        String ret = "";//TODO: Remove = "", if we know where to get this value.
771767a662ecde33c3979bf02b793d392aca0403162Wink Saville
772767a662ecde33c3979bf02b793d392aca0403162Wink Saville        //ret = mSIMRecords.getVoiceMailAlphaTag();
773767a662ecde33c3979bf02b793d392aca0403162Wink Saville
774767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (ret == null || ret.length() == 0) {
775767a662ecde33c3979bf02b793d392aca0403162Wink Saville            return mContext.getText(
776767a662ecde33c3979bf02b793d392aca0403162Wink Saville                com.android.internal.R.string.defaultVoiceMailAlphaTag).toString();
777767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
778767a662ecde33c3979bf02b793d392aca0403162Wink Saville
779767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return ret;
780767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
781767a662ecde33c3979bf02b793d392aca0403162Wink Saville
782767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getCallForwardingOption(int commandInterfaceCFReason, Message onComplete) {
783767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getCallForwardingOption: not possible in CDMA");
784767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
785767a662ecde33c3979bf02b793d392aca0403162Wink Saville
786767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setCallForwardingOption(int commandInterfaceCFAction,
787767a662ecde33c3979bf02b793d392aca0403162Wink Saville            int commandInterfaceCFReason,
788767a662ecde33c3979bf02b793d392aca0403162Wink Saville            String dialingNumber,
789767a662ecde33c3979bf02b793d392aca0403162Wink Saville            int timerSeconds,
790767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Message onComplete) {
791767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "setCallForwardingOption: not possible in CDMA");
792767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
793767a662ecde33c3979bf02b793d392aca0403162Wink Saville
794767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
795767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getOutgoingCallerIdDisplay(Message onComplete) {
796767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getOutgoingCallerIdDisplay: not possible in CDMA");
797767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
798767a662ecde33c3979bf02b793d392aca0403162Wink Saville
799767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean
800767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getCallForwardingIndicator() {
801767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getCallForwardingIndicator: not possible in CDMA");
802767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
803767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
804767a662ecde33c3979bf02b793d392aca0403162Wink Saville
805767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void explicitCallTransfer() {
806767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "explicitCallTransfer: not possible in CDMA");
807767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
808767a662ecde33c3979bf02b793d392aca0403162Wink Saville
809767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getLine1AlphaTag() {
810767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "getLine1AlphaTag: not possible in CDMA");
811767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return null;
812767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
813767a662ecde33c3979bf02b793d392aca0403162Wink Saville
814b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    /**
8151c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh     * Notify any interested party of a Phone state change  {@link Phone.State}
816767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
817767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /*package*/ void notifyPhoneStateChanged() {
818767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mNotifier.notifyPhoneState(this);
819767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
820767a662ecde33c3979bf02b793d392aca0403162Wink Saville
821767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
8221c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh     * Notify registrants of a change in the call state. This notifies changes in {@link Call.State}
8231c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh     * Use this when changes in the precise call state are needed, else use notifyPhoneStateChanged.
824767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
8251c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh    /*package*/ void notifyPreciseCallStateChanged() {
826767a662ecde33c3979bf02b793d392aca0403162Wink Saville        /* we'd love it if this was package-scoped*/
8271c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh        super.notifyPreciseCallStateChangedP();
828767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
829767a662ecde33c3979bf02b793d392aca0403162Wink Saville
830767a662ecde33c3979bf02b793d392aca0403162Wink Saville     void notifyServiceStateChanged(ServiceState ss) {
831767a662ecde33c3979bf02b793d392aca0403162Wink Saville         super.notifyServiceStateChangedP(ss);
832767a662ecde33c3979bf02b793d392aca0403162Wink Saville     }
833767a662ecde33c3979bf02b793d392aca0403162Wink Saville
834767a662ecde33c3979bf02b793d392aca0403162Wink Saville     void notifyLocationChanged() {
835767a662ecde33c3979bf02b793d392aca0403162Wink Saville         mNotifier.notifyCellLocation(this);
836767a662ecde33c3979bf02b793d392aca0403162Wink Saville     }
837767a662ecde33c3979bf02b793d392aca0403162Wink Saville
838767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /*package*/ void notifyNewRingingConnection(Connection c) {
839767a662ecde33c3979bf02b793d392aca0403162Wink Saville        /* we'd love it if this was package-scoped*/
840767a662ecde33c3979bf02b793d392aca0403162Wink Saville        super.notifyNewRingingConnectionP(c);
841767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
842767a662ecde33c3979bf02b793d392aca0403162Wink Saville
843767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /*package*/ void notifyDisconnect(Connection cn) {
844767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mDisconnectRegistrants.notifyResult(cn);
845767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
846767a662ecde33c3979bf02b793d392aca0403162Wink Saville
847767a662ecde33c3979bf02b793d392aca0403162Wink Saville    void notifyUnknownConnection() {
848767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mUnknownConnectionRegistrants.notifyResult(this);
849767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
850767a662ecde33c3979bf02b793d392aca0403162Wink Saville
851e025391bf499e41650fe6508ac78f097559a31a4Wink Saville    public boolean isInEmergencyCall() {
852e025391bf499e41650fe6508ac78f097559a31a4Wink Saville        return mCT.isInEmergencyCall();
853e025391bf499e41650fe6508ac78f097559a31a4Wink Saville    }
854e025391bf499e41650fe6508ac78f097559a31a4Wink Saville
855e025391bf499e41650fe6508ac78f097559a31a4Wink Saville    public boolean isInEcm() {
856e025391bf499e41650fe6508ac78f097559a31a4Wink Saville        return mIsPhoneInEcmState;
857e025391bf499e41650fe6508ac78f097559a31a4Wink Saville    }
858e025391bf499e41650fe6508ac78f097559a31a4Wink Saville
859dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    void sendEmergencyCallbackModeChange(){
860dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        //Send an Intent
861dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        Intent intent = new Intent(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
86295a1d1a89e383dab893750638c2393dec54833ffWink Saville        intent.putExtra(PHONE_IN_ECM_STATE, mIsPhoneInEcmState);
863dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        ActivityManagerNative.broadcastStickyIntent(intent,null);
86495a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (DBG) Log.d(LOG_TAG, "sendEmergencyCallbackModeChange");
865dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
866dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
867dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    @Override
868dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void exitEmergencyCallbackMode() {
86995a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (mWakeLock.isHeld()) {
87095a1d1a89e383dab893750638c2393dec54833ffWink Saville            mWakeLock.release();
87195a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
872dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        // Send a message which will invoke handleExitEmergencyCallbackMode
873a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.exitEmergencyCallbackMode(obtainMessage(EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE));
874dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
875dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
876dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private void handleEnterEmergencyCallbackMode(Message msg) {
87795a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (DBG) {
87895a1d1a89e383dab893750638c2393dec54833ffWink Saville            Log.d(LOG_TAG, "handleEnterEmergencyCallbackMode,mIsPhoneInEcmState= "
87995a1d1a89e383dab893750638c2393dec54833ffWink Saville                    + mIsPhoneInEcmState);
88095a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
88195a1d1a89e383dab893750638c2393dec54833ffWink Saville        // if phone is not in Ecm mode, and it's changed to Ecm mode
88295a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (mIsPhoneInEcmState == false) {
88395a1d1a89e383dab893750638c2393dec54833ffWink Saville            mIsPhoneInEcmState = true;
884dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            // notify change
885dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            sendEmergencyCallbackModeChange();
88622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville            setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE, "true");
8872563a3ac05dd3cf8a07203ae682c243f2e793137Wink Saville
888dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            // Post this runnable so we will automatically exit
889dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            // if no one invokes exitEmergencyCallbackMode() directly.
89022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville            long delayInMillis = SystemProperties.getLong(
89122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville                    TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE);
892a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            postDelayed(mExitEcmRunnable, delayInMillis);
89395a1d1a89e383dab893750638c2393dec54833ffWink Saville            // We don't want to go to sleep while in Ecm
89495a1d1a89e383dab893750638c2393dec54833ffWink Saville            mWakeLock.acquire();
895dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
896dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
897dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
898dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private void handleExitEmergencyCallbackMode(Message msg) {
899dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        AsyncResult ar = (AsyncResult)msg.obj;
90095a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (DBG) {
90195a1d1a89e383dab893750638c2393dec54833ffWink Saville            Log.d(LOG_TAG, "handleExitEmergencyCallbackMode,ar.exception , mIsPhoneInEcmState "
90295a1d1a89e383dab893750638c2393dec54833ffWink Saville                    + ar.exception + mIsPhoneInEcmState);
90395a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
90495a1d1a89e383dab893750638c2393dec54833ffWink Saville        // Remove pending exit Ecm runnable, if any
905a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        removeCallbacks(mExitEcmRunnable);
906dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
90795a1d1a89e383dab893750638c2393dec54833ffWink Saville        if (mEcmExitRespRegistrant != null) {
90895a1d1a89e383dab893750638c2393dec54833ffWink Saville            mEcmExitRespRegistrant.notifyRegistrant(ar);
909dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
910dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        // if exiting ecm success
911dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        if (ar.exception == null) {
91295a1d1a89e383dab893750638c2393dec54833ffWink Saville            if (mIsPhoneInEcmState) {
91395a1d1a89e383dab893750638c2393dec54833ffWink Saville                mIsPhoneInEcmState = false;
91422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville                setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE, "false");
915dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            }
916dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            // send an Intent
917dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            sendEmergencyCallbackModeChange();
91833777d2096c6877ab925db562067ac7272076399Libin Tang            // Re-initiate data connection
91963edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt            mDataConnectionTracker.setInternalDataEnabled(true);
920dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
921dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
922dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
92395a1d1a89e383dab893750638c2393dec54833ffWink Saville    /**
92495a1d1a89e383dab893750638c2393dec54833ffWink Saville     * Handle to cancel or restart Ecm timer in emergency call back mode
92595a1d1a89e383dab893750638c2393dec54833ffWink Saville     * if action is CANCEL_ECM_TIMER, cancel Ecm timer and notify apps the timer is canceled;
92695a1d1a89e383dab893750638c2393dec54833ffWink Saville     * otherwise, restart Ecm timer and notify apps the timer is restarted.
92795a1d1a89e383dab893750638c2393dec54833ffWink Saville     */
92895a1d1a89e383dab893750638c2393dec54833ffWink Saville    void handleTimerInEmergencyCallbackMode(int action) {
92995a1d1a89e383dab893750638c2393dec54833ffWink Saville        switch(action) {
93095a1d1a89e383dab893750638c2393dec54833ffWink Saville        case CANCEL_ECM_TIMER:
931a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            removeCallbacks(mExitEcmRunnable);
9325644b080741bb4fae103617ecbea7a62b0262a56Kenny Root            mEcmTimerResetRegistrants.notifyResult(Boolean.TRUE);
93395a1d1a89e383dab893750638c2393dec54833ffWink Saville            break;
93495a1d1a89e383dab893750638c2393dec54833ffWink Saville        case RESTART_ECM_TIMER:
93595a1d1a89e383dab893750638c2393dec54833ffWink Saville            long delayInMillis = SystemProperties.getLong(
93695a1d1a89e383dab893750638c2393dec54833ffWink Saville                    TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE);
937a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            postDelayed(mExitEcmRunnable, delayInMillis);
9385644b080741bb4fae103617ecbea7a62b0262a56Kenny Root            mEcmTimerResetRegistrants.notifyResult(Boolean.FALSE);
93995a1d1a89e383dab893750638c2393dec54833ffWink Saville            break;
94095a1d1a89e383dab893750638c2393dec54833ffWink Saville        default:
94195a1d1a89e383dab893750638c2393dec54833ffWink Saville            Log.e(LOG_TAG, "handleTimerInEmergencyCallbackMode, unsupported action " + action);
94295a1d1a89e383dab893750638c2393dec54833ffWink Saville        }
94395a1d1a89e383dab893750638c2393dec54833ffWink Saville    }
94495a1d1a89e383dab893750638c2393dec54833ffWink Saville
94595a1d1a89e383dab893750638c2393dec54833ffWink Saville    /**
94695a1d1a89e383dab893750638c2393dec54833ffWink Saville     * Registration point for Ecm timer reset
94795a1d1a89e383dab893750638c2393dec54833ffWink Saville     * @param h handler to notify
94895a1d1a89e383dab893750638c2393dec54833ffWink Saville     * @param what User-defined message code
94995a1d1a89e383dab893750638c2393dec54833ffWink Saville     * @param obj placed in Message.obj
95095a1d1a89e383dab893750638c2393dec54833ffWink Saville     */
95195a1d1a89e383dab893750638c2393dec54833ffWink Saville    public void registerForEcmTimerReset(Handler h, int what, Object obj) {
95295a1d1a89e383dab893750638c2393dec54833ffWink Saville        mEcmTimerResetRegistrants.addUnique(h, what, obj);
95395a1d1a89e383dab893750638c2393dec54833ffWink Saville    }
95495a1d1a89e383dab893750638c2393dec54833ffWink Saville
95595a1d1a89e383dab893750638c2393dec54833ffWink Saville    public void unregisterForEcmTimerReset(Handler h) {
95695a1d1a89e383dab893750638c2393dec54833ffWink Saville        mEcmTimerResetRegistrants.remove(h);
95795a1d1a89e383dab893750638c2393dec54833ffWink Saville    }
95895a1d1a89e383dab893750638c2393dec54833ffWink Saville
959a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville    @Override
960a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville    public void handleMessage(Message msg) {
961a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        AsyncResult ar;
962a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        Message     onComplete;
963767a662ecde33c3979bf02b793d392aca0403162Wink Saville
964a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        switch(msg.what) {
965a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_RADIO_AVAILABLE: {
966a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mCM.getBasebandVersion(obtainMessage(EVENT_GET_BASEBAND_VERSION_DONE));
967767a662ecde33c3979bf02b793d392aca0403162Wink Saville
968a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mCM.getDeviceIdentity(obtainMessage(EVENT_GET_DEVICE_IDENTITY_DONE));
969a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
970a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
971767a662ecde33c3979bf02b793d392aca0403162Wink Saville
972a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_GET_BASEBAND_VERSION_DONE:{
973a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
974767a662ecde33c3979bf02b793d392aca0403162Wink Saville
975a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (ar.exception != null) {
976a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    break;
977767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
978767a662ecde33c3979bf02b793d392aca0403162Wink Saville
979a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (DBG) Log.d(LOG_TAG, "Baseband version: " + ar.result);
980a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                setSystemProperty(TelephonyProperties.PROPERTY_BASEBAND_VERSION, (String)ar.result);
981a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
982a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
983767a662ecde33c3979bf02b793d392aca0403162Wink Saville
984a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_GET_DEVICE_IDENTITY_DONE:{
985a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
986767a662ecde33c3979bf02b793d392aca0403162Wink Saville
987a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (ar.exception != null) {
988a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    break;
989767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
990a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                String[] respId = (String[])ar.result;
9912ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang                mImei = respId[0];
9922ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang                mImeiSv = respId[1];
993a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mEsn  =  respId[2];
994a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mMeid =  respId[3];
995a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
996a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
997767a662ecde33c3979bf02b793d392aca0403162Wink Saville
998a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_EMERGENCY_CALLBACK_MODE_ENTER:{
999a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                handleEnterEmergencyCallbackMode(msg);
1000a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1001a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1002dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1003a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case  EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE:{
1004a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                handleExitEmergencyCallbackMode(msg);
1005a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1006a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1007dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1008a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_RUIM_RECORDS_LOADED:{
1009a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                Log.d(LOG_TAG, "Event EVENT_RUIM_RECORDS_LOADED Received");
1010b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby                updateCurrentCarrierInProvider();
1011a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1012a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1013767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1014a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_RADIO_OFF_OR_NOT_AVAILABLE:{
1015a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                Log.d(LOG_TAG, "Event EVENT_RADIO_OFF_OR_NOT_AVAILABLE Received");
1016a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1017a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1018767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1019a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_RADIO_ON:{
1020a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                Log.d(LOG_TAG, "Event EVENT_RADIO_ON Received");
1021a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1022a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1023767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1024a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_SSN:{
1025a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                Log.d(LOG_TAG, "Event EVENT_SSN Received");
1026a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1027a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1028767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1029a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_REGISTERED_TO_NETWORK:{
1030a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                Log.d(LOG_TAG, "Event EVENT_REGISTERED_TO_NETWORK Received");
1031a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1032a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1033767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1034a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_NV_READY:{
1035a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                Log.d(LOG_TAG, "Event EVENT_NV_READY Received");
1036a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                //Inform the Service State Tracker
1037a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mNvLoadedRegistrants.notifyRegistrants();
1038c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo                prepareEri();
1039a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1040a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1041767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1042a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_SET_VM_NUMBER_DONE:{
1043a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
1044a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (IccException.class.isInstance(ar.exception)) {
1045a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    storeVoiceMailNumber(mVmNumber);
1046a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    ar.exception = null;
1047767a662ecde33c3979bf02b793d392aca0403162Wink Saville                }
1048a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                onComplete = (Message) ar.userObj;
1049a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (onComplete != null) {
1050a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    AsyncResult.forMessage(onComplete, ar.result, ar.exception);
1051a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    onComplete.sendToTarget();
1052ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause                }
1053a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1054a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1055ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause
1056a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            default:{
1057a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                super.handleMessage(msg);
1058767a662ecde33c3979bf02b793d392aca0403162Wink Saville            }
1059767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
1060767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1061767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1062dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1063dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Retrieves the PhoneSubInfo of the CDMAPhone
1064dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1065dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public PhoneSubInfo getPhoneSubInfo() {
1066767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSubInfo;
1067dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1068767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1069dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1070dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Retrieves the IccSmsInterfaceManager of the CDMAPhone
1071dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1072dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public IccSmsInterfaceManager getIccSmsInterfaceManager() {
1073dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        return mRuimSmsInterfaceManager;
1074dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1075767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1076dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1077dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Retrieves the IccPhoneBookInterfaceManager of the CDMAPhone
1078dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1079dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public IccPhoneBookInterfaceManager getIccPhoneBookInterfaceManager() {
1080dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        return mRuimPhoneBookInterfaceManager;
1081dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1082767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1083767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void registerForNvLoaded(Handler h, int what, Object obj) {
1084767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Registrant r = new Registrant (h, what, obj);
1085767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mNvLoadedRegistrants.add(r);
1086767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1087767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1088767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void unregisterForNvLoaded(Handler h) {
1089767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mNvLoadedRegistrants.remove(h);
1090767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1091767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1092e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void registerForEriFileLoaded(Handler h, int what, Object obj) {
1093e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        Registrant r = new Registrant (h, what, obj);
1094e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mEriFileLoadedRegistrants.add(r);
1095e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1096e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1097e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void unregisterForEriFileLoaded(Handler h) {
1098e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        mEriFileLoadedRegistrants.remove(h);
1099e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1100e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1101dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    // override for allowing access from other classes of this package
1102dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1103dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * {@inheritDoc}
1104dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1105dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public final void setSystemProperty(String property, String value) {
1106dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        super.setSystemProperty(property, value);
1107dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1108767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1109dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1110dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * {@inheritDoc}
1111dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1112dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public IccFileHandler getIccFileHandler() {
1113dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        return this.mIccFileHandler;
1114dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1115767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1116dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1117dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Activate or deactivate cell broadcast SMS.
1118dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     *
1119dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @param activate 0 = activate, 1 = deactivate
1120dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @param response Callback message is empty on completion
1121dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1122dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void activateCellBroadcastSms(int activate, Message response) {
1123ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        Log.e(LOG_TAG, "[CDMAPhone] activateCellBroadcastSms() is obsolete; use SmsManager");
1124ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        response.sendToTarget();
1125dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1126767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1127dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1128dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Query the current configuration of cdma cell broadcast SMS.
1129dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     *
1130dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @param response Callback message is empty on completion
1131dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1132dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void getCellBroadcastSmsConfig(Message response) {
1133ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        Log.e(LOG_TAG, "[CDMAPhone] getCellBroadcastSmsConfig() is obsolete; use SmsManager");
1134ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        response.sendToTarget();
1135dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1136767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1137dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    /**
1138dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * Configure cdma cell broadcast SMS.
1139dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     *
1140dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     * @param response Callback message is empty on completion
1141dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville     */
1142dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    public void setCellBroadcastSmsConfig(int[] configValuesArray, Message response) {
1143ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        Log.e(LOG_TAG, "[CDMAPhone] setCellBroadcastSmsConfig() is obsolete; use SmsManager");
1144ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        response.sendToTarget();
1145dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1146dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
11474d8ae85b5de8a90a597e4b649c6ee7208e446e3bWink Saville    /**
11484d8ae85b5de8a90a597e4b649c6ee7208e446e3bWink Saville     * Returns true if OTA Service Provisioning needs to be performed.
11494d8ae85b5de8a90a597e4b649c6ee7208e446e3bWink Saville     */
11504d8ae85b5de8a90a597e4b649c6ee7208e446e3bWink Saville    @Override
11514d8ae85b5de8a90a597e4b649c6ee7208e446e3bWink Saville    public boolean needsOtaServiceProvisioning() {
1152fd2d01302781af91d77557a99874111a4fee8365Wink Saville        return mSST.getOtasp() != ServiceStateTracker.OTASP_NOT_NEEDED;
11534d8ae85b5de8a90a597e4b649c6ee7208e446e3bWink Saville    }
11544d8ae85b5de8a90a597e4b649c6ee7208e446e3bWink Saville
1155e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final String IS683A_FEATURE_CODE = "*228";
1156e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final int IS683A_FEATURE_CODE_NUM_DIGITS = 4;
1157e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final int IS683A_SYS_SEL_CODE_NUM_DIGITS = 2;
1158e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final int IS683A_SYS_SEL_CODE_OFFSET = 4;
1159dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1160dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_800MHZ_A_BAND = 0;
1161dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_800MHZ_B_BAND = 1;
1162dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_A_BLOCK = 2;
1163dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_B_BLOCK = 3;
1164dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_C_BLOCK = 4;
1165dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_D_BLOCK = 5;
1166dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_E_BLOCK = 6;
1167dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    private static final int IS683_CONST_1900MHZ_F_BLOCK = 7;
1168e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static final int INVALID_SYSTEM_SELECTION_CODE = -1;
1169dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1170b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    private static boolean isIs683OtaSpDialStr(String dialStr) {
1171dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        int sysSelCodeInt;
1172dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        boolean isOtaspDialString = false;
1173dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        int dialStrLen = dialStr.length();
1174dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1175dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        if (dialStrLen == IS683A_FEATURE_CODE_NUM_DIGITS) {
1176dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            if (dialStr.equals(IS683A_FEATURE_CODE)) {
1177dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                isOtaspDialString = true;
1178dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            }
1179e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        } else {
1180e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            sysSelCodeInt = extractSelCodeFromOtaSpNum(dialStr);
1181e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            switch (sysSelCodeInt) {
1182e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_800MHZ_A_BAND:
1183e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_800MHZ_B_BAND:
1184e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_A_BLOCK:
1185e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_B_BLOCK:
1186e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_C_BLOCK:
1187e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_D_BLOCK:
1188e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_E_BLOCK:
1189e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                case IS683_CONST_1900MHZ_F_BLOCK:
1190e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    isOtaspDialString = true;
1191e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    break;
1192e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                default:
1193e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    break;
1194e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            }
1195e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        }
1196e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        return isOtaspDialString;
1197e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    }
1198e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    /**
1199e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * This function extracts the system selection code from the dial string.
1200e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     */
1201b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    private static int extractSelCodeFromOtaSpNum(String dialStr) {
1202e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        int dialStrLen = dialStr.length();
1203e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        int sysSelCodeInt = INVALID_SYSTEM_SELECTION_CODE;
1204e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
1205e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if ((dialStr.regionMatches(0, IS683A_FEATURE_CODE,
1206e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                                   0, IS683A_FEATURE_CODE_NUM_DIGITS)) &&
1207e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            (dialStrLen >= (IS683A_FEATURE_CODE_NUM_DIGITS +
1208e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                            IS683A_SYS_SEL_CODE_NUM_DIGITS))) {
1209e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                // Since we checked the condition above, the system selection code
1210e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                // extracted from dialStr will not cause any exception
1211e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                sysSelCodeInt = Integer.parseInt (
1212e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                                dialStr.substring (IS683A_FEATURE_CODE_NUM_DIGITS,
1213e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                                IS683A_FEATURE_CODE_NUM_DIGITS + IS683A_SYS_SEL_CODE_NUM_DIGITS));
1214e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        }
1215e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if (DBG) Log.d(LOG_TAG, "extractSelCodeFromOtaSpNum " + sysSelCodeInt);
1216e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        return sysSelCodeInt;
1217e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    }
1218dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville
1219e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    /**
1220e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * This function checks if the system selection code extracted from
1221e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * the dial string "sysSelCodeInt' is the system selection code specified
1222e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * in the carrier ota sp number schema "sch".
1223e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     */
1224b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    private static boolean
1225e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    checkOtaSpNumBasedOnSysSelCode (int sysSelCodeInt, String sch[]) {
1226e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        boolean isOtaSpNum = false;
1227e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        try {
1228e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            // Get how many number of system selection code ranges
1229e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            int selRc = Integer.parseInt((String)sch[1]);
1230e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            for (int i = 0; i < selRc; i++) {
1231e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                if (!TextUtils.isEmpty(sch[i+2]) && !TextUtils.isEmpty(sch[i+3])) {
1232e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    int selMin = Integer.parseInt((String)sch[i+2]);
1233e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    int selMax = Integer.parseInt((String)sch[i+3]);
1234e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    // Check if the selection code extracted from the dial string falls
1235e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    // within any of the range pairs specified in the schema.
1236e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    if ((sysSelCodeInt >= selMin) && (sysSelCodeInt <= selMax)) {
1237e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        isOtaSpNum = true;
1238dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                        break;
1239e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    }
1240dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville                }
1241dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville            }
1242e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        } catch (NumberFormatException ex) {
1243e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            // If the carrier ota sp number schema is not correct, we still allow dial
1244e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            // and only log the error:
1245e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            Log.e(LOG_TAG, "checkOtaSpNumBasedOnSysSelCode, error", ex);
1246dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville        }
1247e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        return isOtaSpNum;
1248e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    }
1249e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
1250e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    // Define the pattern/format for carrier specified OTASP number schema.
1251e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    // It separates by comma and/or whitespace.
1252e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private static Pattern pOtaSpNumSchema = Pattern.compile("[,\\s]+");
1253e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
1254e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    /**
1255e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * The following function checks if a dial string is a carrier specified
1256e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * OTASP number or not by checking against the OTASP number schema stored
1257e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * in PROPERTY_OTASP_NUM_SCHEMA.
1258e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *
1259e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * Currently, there are 2 schemas for carriers to specify the OTASP number:
1260e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * 1) Use system selection code:
1261e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    The schema is:
1262e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    SELC,the # of code pairs,min1,max1,min2,max2,...
1263e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    e.g "SELC,3,10,20,30,40,60,70" indicates that there are 3 pairs of
1264e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    selection codes, and they are {10,20}, {30,40} and {60,70} respectively.
1265e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *
1266e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     * 2) Use feature code:
1267e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    The schema is:
1268e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *    "FC,length of feature code,feature code".
1269e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *     e.g "FC,2,*2" indicates that the length of the feature code is 2,
1270e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     *     and the code itself is "*2".
1271e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li     */
1272e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li    private boolean isCarrierOtaSpNum(String dialStr) {
1273e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        boolean isOtaSpNum = false;
1274e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        int sysSelCodeInt = extractSelCodeFromOtaSpNum(dialStr);
1275e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if (sysSelCodeInt == INVALID_SYSTEM_SELECTION_CODE) {
1276e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            return isOtaSpNum;
1277e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        }
1278e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        // mCarrierOtaSpNumSchema is retrieved from PROPERTY_OTASP_NUM_SCHEMA:
1279e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        if (!TextUtils.isEmpty(mCarrierOtaSpNumSchema)) {
1280e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            Matcher m = pOtaSpNumSchema.matcher(mCarrierOtaSpNumSchema);
1281e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            if (DBG) {
1282e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                Log.d(LOG_TAG, "isCarrierOtaSpNum,schema" + mCarrierOtaSpNumSchema);
1283e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            }
1284e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li
1285e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            if (m.find()) {
1286e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                String sch[] = pOtaSpNumSchema.split(mCarrierOtaSpNumSchema);
1287e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                // If carrier uses system selection code mechanism
1288e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                if (!TextUtils.isEmpty(sch[0]) && sch[0].equals("SELC")) {
1289e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    if (sysSelCodeInt!=INVALID_SYSTEM_SELECTION_CODE) {
1290e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        isOtaSpNum=checkOtaSpNumBasedOnSysSelCode(sysSelCodeInt,sch);
1291e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    } else {
1292e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        if (DBG) {
1293e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                            Log.d(LOG_TAG, "isCarrierOtaSpNum,sysSelCodeInt is invalid");
1294e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        }
1295e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    }
1296e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                } else if (!TextUtils.isEmpty(sch[0]) && sch[0].equals("FC")) {
1297e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    int fcLen =  Integer.parseInt((String)sch[1]);
1298e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    String fc = (String)sch[2];
1299e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    if (dialStr.regionMatches(0,fc,0,fcLen)) {
1300e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        isOtaSpNum = true;
1301e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    } else {
1302e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        if (DBG) Log.d(LOG_TAG, "isCarrierOtaSpNum,not otasp number");
1303e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    }
1304e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                } else {
1305e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    if (DBG) {
1306e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                        Log.d(LOG_TAG, "isCarrierOtaSpNum,ota schema not supported" + sch[0]);
1307e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    }
1308e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                }
1309e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            } else {
1310e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                if (DBG) {
1311e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                    Log.d(LOG_TAG, "isCarrierOtaSpNum,ota schema pattern not right" +
1312e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                          mCarrierOtaSpNumSchema);
1313e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li                }
1314e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            }
1315e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        } else {
1316e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li            if (DBG) Log.d(LOG_TAG, "isCarrierOtaSpNum,ota schema pattern empty");
1317e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        }
1318e4a84af11d94e90f8d0a376582e0c91cdfc1c4feLing Li        return isOtaSpNum;
1319dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    }
1320767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1321d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang    /**
1322d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     * isOTASPNumber: checks a given number against the IS-683A OTASP dial string and carrier
1323d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     * OTASP dial string.
1324d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     *
1325d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     * @param dialStr the number to look up.
1326d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     * @return true if the number is in IS-683A OTASP dial string or carrier OTASP dial string
1327d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang     */
1328dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville    @Override
1329d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang    public  boolean isOtaSpNumber(String dialStr){
1330d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        boolean isOtaSpNum = false;
13319e534153264138cfee383c626db92b934fafc1afTammo Spalink        String dialableStr = PhoneNumberUtils.extractNetworkPortionAlt(dialStr);
1332d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        if (dialableStr != null) {
1333d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang            isOtaSpNum = isIs683OtaSpDialStr(dialableStr);
1334d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang            if (isOtaSpNum == false) {
1335d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang                isOtaSpNum = isCarrierOtaSpNum(dialableStr);
1336d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang            }
1337d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        }
1338d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        if (DBG) Log.d(LOG_TAG, "isOtaSpNumber " + isOtaSpNum);
1339d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang        return isOtaSpNum;
1340d903014c1f42884531372f18a754e5d6ff7366a7Libin Tang    }
1341e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1342e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    @Override
1343e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public int getCdmaEriIconIndex() {
1344cc5c1ad53ce4541f17842daba29e7ccba221c079Robert Greenwalt        return getServiceState().getCdmaEriIconIndex();
1345e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1346e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1347e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    /**
1348e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     * Returns the CDMA ERI icon mode,
1349e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     * 0 - ON
1350e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     * 1 - FLASHING
1351e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     */
1352e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    @Override
1353e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public int getCdmaEriIconMode() {
1354cc5c1ad53ce4541f17842daba29e7ccba221c079Robert Greenwalt        return getServiceState().getCdmaEriIconMode();
1355e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1356e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1357e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    /**
1358e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     * Returns the CDMA ERI text,
1359e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville     */
1360e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    @Override
1361e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public String getCdmaEriText() {
1362e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        int roamInd = getServiceState().getCdmaRoamingIndicator();
1363e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        int defRoamInd = getServiceState().getCdmaDefaultRoamingIndicator();
1364f315238a2b07c7e84f6ade800e504f520d262e66Wink Saville        return mEriManager.getCdmaEriText(roamInd, defRoamInd);
1365e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
1366ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause
1367ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    /**
1368ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause     * Store the voicemail number in preferences
1369ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause     */
1370ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    private void storeVoiceMailNumber(String number) {
1371ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        // Update the preference value of voicemail number
1372ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
1373ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        SharedPreferences.Editor editor = sp.edit();
1374ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause        editor.putString(VM_NUMBER_CDMA, number);
1375fa8e271636b9e9b86f247cdb4c91d9ebe9675c27Brad Fitzpatrick        editor.apply();
1376ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause    }
1377ce099c3226b33b43e0dd5d1f24347b14a2223ee1David Krause
1378142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    /**
1379142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     * Sets PROPERTY_ICC_OPERATOR_ISO_COUNTRY property
1380142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     *
1381142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     */
1382142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    private void setIsoCountryProperty(String operatorNumeric) {
1383142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        if (TextUtils.isEmpty(operatorNumeric)) {
1384142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, "");
1385142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        } else {
1386142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            String iso = "";
1387142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            try {
1388142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                iso = MccTable.countryCodeForMcc(Integer.parseInt(
1389142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                        operatorNumeric.substring(0,3)));
1390142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            } catch (NumberFormatException ex) {
1391142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                Log.w(LOG_TAG, "countryCodeForMcc error" + ex);
1392142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            } catch (StringIndexOutOfBoundsException ex) {
1393142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                Log.w(LOG_TAG, "countryCodeForMcc error" + ex);
1394142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            }
1395142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
1396142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, iso);
1397142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        }
1398142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    }
1399142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville
1400142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    /**
1401144fdfec240a56890657d2248a22bdda9f22470cWink Saville     * Sets the "current" field in the telephony provider according to the
1402144fdfec240a56890657d2248a22bdda9f22470cWink Saville     * build-time operator numeric property
1403142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     *
1404142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     * @return true for success; false otherwise.
1405142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville     */
1406144fdfec240a56890657d2248a22bdda9f22470cWink Saville    boolean updateCurrentCarrierInProvider(String operatorNumeric) {
1407142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        if (!TextUtils.isEmpty(operatorNumeric)) {
1408142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            try {
1409142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
1410142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                ContentValues map = new ContentValues();
1411142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                map.put(Telephony.Carriers.NUMERIC, operatorNumeric);
1412b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby                log("updateCurrentCarrierInProvider from system: numeric=" + operatorNumeric);
1413142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                getContext().getContentResolver().insert(uri, map);
1414144fdfec240a56890657d2248a22bdda9f22470cWink Saville
1415144fdfec240a56890657d2248a22bdda9f22470cWink Saville                // Updates MCC MNC device configuration information
1416144fdfec240a56890657d2248a22bdda9f22470cWink Saville                MccTable.updateMccMncConfiguration(this, operatorNumeric);
1417144fdfec240a56890657d2248a22bdda9f22470cWink Saville
1418142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                return true;
1419142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            } catch (SQLException e) {
1420142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville                Log.e(LOG_TAG, "Can't store current operator", e);
1421142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville            }
1422142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        }
1423142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville        return false;
1424142eefc67b661a63f95dd2b92cf622e7b57fcb4bWink Saville    }
14251f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville
1426b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    /**
1427b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby     * Sets the "current" field in the telephony provider according to the SIM's operator.
1428b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby     * Implemented in {@link CDMALTEPhone} for CDMA/LTE devices.
1429b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby     *
1430b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby     * @return true for success; false otherwise.
1431b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby     */
1432b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    boolean updateCurrentCarrierInProvider() {
1433b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        return true;
1434b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    }
1435b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby
1436c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo    public void prepareEri() {
1437c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo        mEriManager.loadEriFile();
1438c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo        if(mEriManager.isEriFileLoaded()) {
1439c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo            // when the ERI file is loaded
1440c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo            log("ERI read, notify registrants");
1441c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo            mEriFileLoadedRegistrants.notifyRegistrants();
1442c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo        }
1443c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo    }
1444c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo
1445c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo    public boolean isEriFileLoaded() {
1446c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo        return mEriManager.isEriFileLoaded();
1447c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo    }
1448c8e2916d0bdbbda5fb6faf61d6f24100641d19f5Kazuhiro Ondo
14491f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville    protected void log(String s) {
14501f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville        if (DBG)
14511f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville            Log.d(LOG_TAG, "[CDMAPhone] " + s);
14521f3278e111c8abadedf71a9bcdbbaffe154be738Wink Saville    }
1453767a662ecde33c3979bf02b793d392aca0403162Wink Saville}
1454