10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2007 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
19a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.BroadcastReceiver;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context;
21a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.Intent;
22a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.IntentFilter;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.SharedPreferences;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.LinkProperties;
2596cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwaltimport android.net.NetworkCapabilities;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.wifi.WifiManager;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult;
282cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Savilleimport android.os.Build;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Looper;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
32e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingamimport android.os.Registrant;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RegistrantList;
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties;
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.preference.PreferenceManager;
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.provider.Settings;
37dc2b5d1c32cad5269106d00fd106bd64097238f4Tyler Gunnimport android.telecom.VideoProfile;
38ffe6e68213ae3220497188fed814e271b472292aJake Hambyimport android.telephony.CellIdentityCdma;
39ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.CellInfo;
40ffe6e68213ae3220497188fed814e271b472292aJake Hambyimport android.telephony.CellInfoCdma;
418758315661d65c14d0e10d354a14f80ec1f65db7Wink Savilleimport android.telephony.DataConnectionRealTimeInfo;
422b40e6226b4b71408964bca46f0a9f256cd4f523Wink Savilleimport android.telephony.RadioAccessFamily;
43ffe6e68213ae3220497188fed814e271b472292aJake Hambyimport android.telephony.Rlog;
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState;
45ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.SignalStrength;
466bc4098827f3070a44b5e51508b455d7c7be9c07Wink Savilleimport android.telephony.SubscriptionManager;
472b40e6226b4b71408964bca46f0a9f256cd4f523Wink Savilleimport android.telephony.VoLteServiceState;
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils;
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
50a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.ims.ImsManager;
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.R;
52454b1dfd508844b42eb775e4ab2359be74d3672bWink Savilleimport com.android.internal.telephony.dataconnection.DcTrackerBase;
53888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohenimport com.android.internal.telephony.imsphone.ImsPhone;
542b40e6226b4b71408964bca46f0a9f256cd4f523Wink Savilleimport com.android.internal.telephony.RadioCapability;
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.test.SimulatedRadioControl;
56d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType;
57d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccFileHandler;
58d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccRecords;
59d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IsimRecords;
60a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.uicc.UiccCard;
61d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.UiccCardApplication;
62e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenkaimport com.android.internal.telephony.uicc.UiccController;
63d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.UsimServiceTable;
64ffe6e68213ae3220497188fed814e271b472292aJake Hamby
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor;
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter;
67ffe6e68213ae3220497188fed814e271b472292aJake Hambyimport java.util.ArrayList;
6834057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawalimport java.util.HashSet;
69ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport java.util.List;
70c25bcac2c4c8754faae69efe2fc5c407f66a9240Narayan Kamathimport java.util.Locale;
7134057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawalimport java.util.Set;
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.concurrent.atomic.AtomicReference;
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * (<em>Not for SDK use</em>)
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * A base implementation for the com.android.internal.telephony.Phone interface.
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Note that implementations of Phone.java are expected to be used
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * from a single application thread. This should be the same thread that
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * originally called PhoneFactory to obtain the interface.
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *  {@hide}
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic abstract class PhoneBase extends Handler implements Phone {
87cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private static final String LOG_TAG = "PhoneBase";
88ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
89a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private BroadcastReceiver mImsIntentReceiver = new BroadcastReceiver() {
90a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        @Override
91a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        public void onReceive(Context context, Intent intent) {
9253dde7e076954c250e55d156cc1df1202c3a8a9eEtan Cohen            Rlog.d(LOG_TAG, "mImsIntentReceiver: action " + intent.getAction());
9353dde7e076954c250e55d156cc1df1202c3a8a9eEtan Cohen            if (intent.hasExtra(ImsManager.EXTRA_PHONE_ID)) {
9453dde7e076954c250e55d156cc1df1202c3a8a9eEtan Cohen                int extraPhoneId = intent.getIntExtra(ImsManager.EXTRA_PHONE_ID,
9553dde7e076954c250e55d156cc1df1202c3a8a9eEtan Cohen                        SubscriptionManager.INVALID_PHONE_INDEX);
9653dde7e076954c250e55d156cc1df1202c3a8a9eEtan Cohen                Rlog.d(LOG_TAG, "mImsIntentReceiver: extraPhoneId = " + extraPhoneId);
9753dde7e076954c250e55d156cc1df1202c3a8a9eEtan Cohen                if (extraPhoneId == SubscriptionManager.INVALID_PHONE_INDEX ||
9853dde7e076954c250e55d156cc1df1202c3a8a9eEtan Cohen                        extraPhoneId != getPhoneId()) {
999f9aadee921db335adc891412a6e1e828153cfc6Etan Cohen                    return;
10053dde7e076954c250e55d156cc1df1202c3a8a9eEtan Cohen                }
1019f9aadee921db335adc891412a6e1e828153cfc6Etan Cohen            }
10238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen
103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (intent.getAction().equals(ImsManager.ACTION_IMS_SERVICE_UP)) {
104a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                mImsServiceReady = true;
105888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohen                updateImsPhone();
106a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            } else if (intent.getAction().equals(ImsManager.ACTION_IMS_SERVICE_DOWN)) {
107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                mImsServiceReady = false;
108888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohen                updateImsPhone();
109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    };
112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Key used to read and write the saved network selection numeric value
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String NETWORK_SELECTION_KEY = "network_selection_key";
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Key used to read and write the saved network selection operator name
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String NETWORK_SELECTION_NAME_KEY = "network_selection_name_key";
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Key used to read/write "disable data connection on boot" pref (used for testing)
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String DATA_DISABLED_ON_BOOT_KEY = "disabled_on_boot_key";
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* Event Constants */
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_RADIO_AVAILABLE             = 1;
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** Supplementary Service Notification received. */
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SSN                         = 2;
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SIM_RECORDS_LOADED          = 3;
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_MMI_DONE                    = 4;
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_RADIO_ON                    = 5;
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_GET_BASEBAND_VERSION_DONE   = 6;
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_USSD                        = 7;
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_RADIO_OFF_OR_NOT_AVAILABLE  = 8;
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_GET_IMEI_DONE               = 9;
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_GET_IMEISV_DONE             = 10;
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_GET_SIM_STATUS_DONE         = 11;
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SET_CALL_FORWARD_DONE       = 12;
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_GET_CALL_FORWARD_DONE       = 13;
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_CALL_RING                   = 14;
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_CALL_RING_CONTINUE          = 15;
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Used to intercept the carrier selection calls so that
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // we can save the values.
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SET_NETWORK_MANUAL_COMPLETE    = 16;
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SET_NETWORK_AUTOMATIC_COMPLETE = 17;
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SET_CLIR_COMPLETE              = 18;
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_REGISTERED_TO_NETWORK          = 19;
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SET_VM_NUMBER_DONE             = 20;
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Events for CDMA support
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_GET_DEVICE_IDENTITY_DONE       = 21;
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_RUIM_RECORDS_LOADED            = 22;
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_NV_READY                       = 23;
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SET_ENHANCED_VP                = 24;
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_EMERGENCY_CALLBACK_MODE_ENTER  = 25;
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE = 26;
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED = 27;
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // other
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected static final int EVENT_SET_NETWORK_AUTOMATIC          = 28;
1571260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    protected static final int EVENT_ICC_RECORD_EVENTS              = 29;
1581260f1c6c909f2940989b72afe1b91fd83845eaaSukanya Rajkhowa    protected static final int EVENT_ICC_CHANGED                    = 30;
159a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    // Single Radio Voice Call Continuity
160a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected static final int EVENT_SRVCC_STATE_CHANGED            = 31;
161a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected static final int EVENT_INITIATE_SILENT_REDIAL         = 32;
1626bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville    protected static final int EVENT_RADIO_NOT_AVAILABLE            = 33;
163110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu    protected static final int EVENT_UNSOL_OEM_HOOK_RAW             = 34;
1642b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    protected static final int EVENT_GET_RADIO_CAPABILITY           = 35;
16509b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja    protected static final int EVENT_SS                             = 36;
16609b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja    protected static final int EVENT_LAST                           = EVENT_SS;
16709b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja
16834057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    // For shared prefs.
16934057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    private static final String GSM_ROAMING_LIST_OVERRIDE_PREFIX = "gsm_roaming_list_";
17034057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    private static final String GSM_NON_ROAMING_LIST_OVERRIDE_PREFIX = "gsm_non_roaming_list_";
17134057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    private static final String CDMA_ROAMING_LIST_OVERRIDE_PREFIX = "cdma_roaming_list_";
17234057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    private static final String CDMA_NON_ROAMING_LIST_OVERRIDE_PREFIX = "cdma_non_roaming_list_";
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Key used to read/write current CLIR setting
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String CLIR_KEY = "clir_key";
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
17726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    // Key used for storing voice mail count
17826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    public static final String VM_COUNT = "vm_count_key";
17926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    // Key used to read/write the ID for storing the voice mail
18026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    public static final String VM_ID = "vm_id_key";
18126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Key used to read/write "disable DNS server check" pref (used for testing)
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String DNS_SERVER_CHECK_DISABLED_KEY = "dns_server_check_disabled_key";
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
185f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal    /**
186f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal     * Small container class used to hold information relevant to
187f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal     * the carrier selection process. operatorNumeric can be ""
188f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal     * if we are looking for automatic selection. operatorAlphaLong is the
189f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal     * corresponding operator name.
190f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal     */
191f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal    protected static class NetworkSelectMessage {
192f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        public Message message;
193f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        public String operatorNumeric;
194f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        public String operatorAlphaLong;
195f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal    }
196f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* Instance Variables */
19822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    public CommandsInterface mCi;
19926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    private int mVmCount = 0;
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean mDnsCheckDisabled;
201454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville    public DcTrackerBase mDcTracker;
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean mDoesRilSendMultipleCallRing;
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int mCallRingContinueToken;
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    int mCallRingDelay;
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean mIsTheCurrentActivePhone = true;
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean mIsVoiceCapable = true;
207e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    protected UiccController mUiccController = null;
208e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    public AtomicReference<IccRecords> mIccRecords = new AtomicReference<IccRecords>();
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SmsStorageMonitor mSmsStorageMonitor;
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SmsUsageMonitor mSmsUsageMonitor;
211e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka    protected AtomicReference<UiccCardApplication> mUiccApplication =
212e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            new AtomicReference<UiccCardApplication>();
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
214ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private TelephonyTester mTelephonyTester;
215ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private final String mName;
216ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private final String mActionDetached;
217ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private final String mActionAttached;
218ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected int mPhoneId;
220a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
22138b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen    private final Object mImsLock = new Object();
22238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen    private boolean mImsServiceReady = false;
223888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohen    protected ImsPhone mImsPhone = null;
224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
2252b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    protected int mRadioAccessFamily = RadioAccessFamily.RAF_UNKNOWN;
2262b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville
227ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    @Override
228ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public String getPhoneName() {
229ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return mName;
230ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
231ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
2322351b17aba5350004fc76707f3b3d2859ce773c8xinhe    public String getNai(){
2332351b17aba5350004fc76707f3b3d2859ce773c8xinhe         return null;
2342351b17aba5350004fc76707f3b3d2859ce773c8xinhe    }
2352351b17aba5350004fc76707f3b3d2859ce773c8xinhe
236ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
237ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Return the ActionDetached string. When this action is received by components
238ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * they are to simulate detaching from the network.
239ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *
240ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @return com.android.internal.telephony.{mName}.action_detached
241ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *          {mName} is GSM, CDMA ...
242ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
243ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public String getActionDetached() {
244ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return mActionDetached;
245ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
246ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
247ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    /**
248ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * Return the ActionAttached string. When this action is received by components
249ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * they are to simulate attaching to the network.
250ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *
251ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     * @return com.android.internal.telephony.{mName}.action_detached
252ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     *          {mName} is GSM, CDMA ...
253ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville     */
254ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public String getActionAttached() {
255ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        return mActionAttached;
256ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    }
257ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Set a system property, unless we're in unit test mode
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
261a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    // CAF_MSIM TODO this need to be replated with TelephonyManager API ?
262ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    public void setSystemProperty(String property, String value) {
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if(getUnitTestMode()) {
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SystemProperties.set(property, value);
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2692d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying    /**
2702d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying     * Set a system property, unless we're in unit test mode
2712d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying     */
2722d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying    // CAF_MSIM TODO this need to be replated with TelephonyManager API ?
2732d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying    public String getSystemProperty(String property, String defValue) {
2742d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        if(getUnitTestMode()) {
2752d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying            return null;
2762d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        }
2772d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        return SystemProperties.get(property, defValue);
2782d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying    }
2792d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mPreciseCallStateRegistrants
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
284e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    protected final RegistrantList mHandoverRegistrants
285e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam             = new RegistrantList();
286e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mNewRingingConnectionRegistrants
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mIncomingRingRegistrants
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mDisconnectRegistrants
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mServiceStateRegistrants
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mMmiCompleteRegistrants
3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mMmiRegistrants
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mUnknownConnectionRegistrants
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final RegistrantList mSuppServiceFailedRegistrants
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = new RegistrantList();
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3116bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville    protected final RegistrantList mRadioOffOrNotAvailableRegistrants
3126bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville            = new RegistrantList();
3136bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville
314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected final RegistrantList mSimRecordsLoadedRegistrants
315a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            = new RegistrantList();
316a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected Looper mLooper; /* to insure registrants are in correct thread*/
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected final Context mContext;
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * PhoneNotifier is an abstraction for all system-wide
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * state change notification. DefaultPhoneNotifier is
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * used here unless running we're inside a unit test.
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected PhoneNotifier mNotifier;
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected SimulatedRadioControl mSimulatedRadioControl;
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean mUnitTestMode;
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Constructs a PhoneBase in normal (non-unit test) mode.
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param notifier An instance of DefaultPhoneNotifier,
336ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     * @param context Context object from hosting application
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * unless unit testing.
338ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     * @param ci the CommandsInterface
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
340ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected PhoneBase(String name, PhoneNotifier notifier, Context context, CommandsInterface ci) {
341ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        this(name, notifier, context, ci, false);
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Constructs a PhoneBase in normal (non-unit test) mode.
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param notifier An instance of DefaultPhoneNotifier,
348ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     * @param context Context object from hosting application
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * unless unit testing.
350ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     * @param ci is CommandsInterface
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param unitTestMode when true, prevents notifications
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * of state change events
3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
354ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    protected PhoneBase(String name, PhoneNotifier notifier, Context context, CommandsInterface ci,
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            boolean unitTestMode) {
3564b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        this(name, notifier, context, ci, unitTestMode, SubscriptionManager.DEFAULT_PHONE_INDEX);
357a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
358a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
359a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
360a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Constructs a PhoneBase in normal (non-unit test) mode.
361a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     *
362a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * @param notifier An instance of DefaultPhoneNotifier,
363a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * @param context Context object from hosting application
364a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * unless unit testing.
365a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * @param ci is CommandsInterface
366a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * @param unitTestMode when true, prevents notifications
367a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * of state change events
368a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * @param subscription is current phone subscription
369a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
370a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected PhoneBase(String name, PhoneNotifier notifier, Context context, CommandsInterface ci,
371a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            boolean unitTestMode, int phoneId) {
372a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mPhoneId = phoneId;
373ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mName = name;
37422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mNotifier = notifier;
37522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mContext = context;
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mLooper = Looper.myLooper();
37722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi = ci;
378ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mActionDetached = this.getClass().getPackage().getName() + ".action_detached";
379ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        mActionAttached = this.getClass().getPackage().getName() + ".action_attached";
380ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
3812cc8c148fa4cb6cba5deac6b011268b4174a0b02Wink Saville        if (Build.IS_DEBUGGABLE) {
382ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            mTelephonyTester = new TelephonyTester(this);
383ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville        }
3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setUnitTestMode(unitTestMode);
3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDnsCheckDisabled = sp.getBoolean(DNS_SERVER_CHECK_DISABLED_KEY, false);
38922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setOnCallRing(this, EVENT_CALL_RING, null);
3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /* "Voice capable" means that this device supports circuit-switched
3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        * (i.e. voice) phone calls over the telephony network, and is allowed
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        * to display the in-call UI while a cellular voice call is active.
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        * This will be false on "data only" devices which can't make voice
3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        * calls and don't support any in-call UI.
3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        */
3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mIsVoiceCapable = mContext.getResources().getBoolean(
3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                com.android.internal.R.bool.config_voice_capable);
3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /**
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *  Some RIL's don't always send RIL_UNSOL_CALL_RING so it needs
4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *  to be generated locally. Ideally all ring tones should be loops
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * and this wouldn't be necessary. But to minimize changes to upper
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * layers it is requested that it be generated by lower layers.
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         *
4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * By default old phones won't have the property set but do generate
4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * the RIL_UNSOL_CALL_RING so the default if there is no property is
4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * true.
4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         */
4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDoesRilSendMultipleCallRing = SystemProperties.getBoolean(
4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                TelephonyProperties.PROPERTY_RIL_SENDS_MULTIPLE_CALL_RING, true);
412ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.d(LOG_TAG, "mDoesRilSendMultipleCallRing=" + mDoesRilSendMultipleCallRing);
4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCallRingDelay = SystemProperties.getInt(
4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                TelephonyProperties.PROPERTY_CALL_RING_DELAY, 3000);
416ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.d(LOG_TAG, "mCallRingDelay=" + mCallRingDelay);
4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
418a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (getPhoneType() == PhoneConstants.PHONE_TYPE_IMS) return;
419a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
420a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        setPropertiesByCarrier();
421a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Initialize device storage and outgoing SMS usage monitors for SMSDispatchers.
4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSmsStorageMonitor = new SmsStorageMonitor(this);
4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSmsUsageMonitor = new SmsUsageMonitor(context);
425e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mUiccController = UiccController.getInstance();
426e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null);
427a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
428a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // Monitor IMS service
429a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        IntentFilter filter = new IntentFilter();
430a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        filter.addAction(ImsManager.ACTION_IMS_SERVICE_UP);
431a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        filter.addAction(ImsManager.ACTION_IMS_SERVICE_DOWN);
432a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mContext.registerReceiver(mImsIntentReceiver, filter);
433befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh
434befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh        mCi.registerForSrvccStateChanged(this, EVENT_SRVCC_STATE_CHANGED, null);
435110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu        mCi.setOnUnsolOemHookRaw(this, EVENT_UNSOL_OEM_HOOK_RAW, null);
4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
438cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dispose() {
4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        synchronized(PhoneProxy.lockForRadioTechnologyChange) {
441a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mContext.unregisterReceiver(mImsIntentReceiver);
44222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.unSetOnCallRing(this);
4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Must cleanup all connectionS and needs to use sendMessage!
444454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville            mDcTracker.cleanUpAllConnections(null);
4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mIsTheCurrentActivePhone = false;
4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Dispose the SMS usage and storage monitors
4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSmsStorageMonitor.dispose();
4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSmsUsageMonitor.dispose();
449e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            mUiccController.unregisterForIccChanged(this);
450befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh            mCi.unregisterForSrvccStateChanged(this);
451110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu            mCi.unSetOnUnsolOemHookRaw(this);
452ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville
453ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            if (mTelephonyTester != null) {
454ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville                mTelephonyTester.dispose();
455ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville            }
456a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
45738b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            ImsPhone imsPhone = mImsPhone;
45838b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            if (imsPhone != null) {
45938b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                imsPhone.unregisterForSilentRedial(this);
46038b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                imsPhone.dispose();
461a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
465cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void removeReferences() {
4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSmsStorageMonitor = null;
4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSmsUsageMonitor = null;
469e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        mIccRecords.set(null);
470e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        mUiccApplication.set(null);
471454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        mDcTracker = null;
472e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        mUiccController = null;
473a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
47438b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen        ImsPhone imsPhone = mImsPhone;
47538b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen        if (imsPhone != null) {
47638b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            imsPhone.removeReferences();
477888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohen            mImsPhone = null;
478a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * When overridden the derived class needs to call
4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * super.handleMessage(msg) so this method has a
4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * a chance to process the message.
4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param msg
4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void handleMessage(Message msg) {
4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar;
4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4927771a0a487bc9253872034025e9c91283af4425fEtan Cohen        // messages to be handled whether or not the phone is being destroyed
4937771a0a487bc9253872034025e9c91283af4425fEtan Cohen        // should only include messages which are being re-directed and do not use
4947771a0a487bc9253872034025e9c91283af4425fEtan Cohen        // resources of the phone being destroyed
4957771a0a487bc9253872034025e9c91283af4425fEtan Cohen        // Note: make sure to add code in GSMPhone/CDMAPhone to re-direct here before
4967771a0a487bc9253872034025e9c91283af4425fEtan Cohen        // they check if phone destroyed.
4977771a0a487bc9253872034025e9c91283af4425fEtan Cohen        switch (msg.what) {
4987771a0a487bc9253872034025e9c91283af4425fEtan Cohen            // handle the select network completion callbacks.
4997771a0a487bc9253872034025e9c91283af4425fEtan Cohen            case EVENT_SET_NETWORK_MANUAL_COMPLETE:
5007771a0a487bc9253872034025e9c91283af4425fEtan Cohen            case EVENT_SET_NETWORK_AUTOMATIC_COMPLETE:
5017771a0a487bc9253872034025e9c91283af4425fEtan Cohen                handleSetSelectNetwork((AsyncResult) msg.obj);
5027771a0a487bc9253872034025e9c91283af4425fEtan Cohen                return;
5037771a0a487bc9253872034025e9c91283af4425fEtan Cohen        }
5047771a0a487bc9253872034025e9c91283af4425fEtan Cohen
5055e2000b856a7959609e8f15148a3584ec372f865Wink Saville        if (!mIsTheCurrentActivePhone) {
5065e2000b856a7959609e8f15148a3584ec372f865Wink Saville            Rlog.e(LOG_TAG, "Received message " + msg +
5075e2000b856a7959609e8f15148a3584ec372f865Wink Saville                    "[" + msg.what + "] while being destroyed. Ignoring.");
5085e2000b856a7959609e8f15148a3584ec372f865Wink Saville            return;
5095e2000b856a7959609e8f15148a3584ec372f865Wink Saville        }
5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch(msg.what) {
5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_CALL_RING:
512ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                Rlog.d(LOG_TAG, "Event EVENT_CALL_RING Received state=" + getState());
5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception == null) {
5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    PhoneConstants.State state = getState();
5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if ((!mDoesRilSendMultipleCallRing)
5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            && ((state == PhoneConstants.State.RINGING) ||
5180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    (state == PhoneConstants.State.IDLE))) {
5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mCallRingContinueToken += 1;
5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        sendIncomingCallRingNotification(mCallRingContinueToken);
5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        notifyIncomingRing();
5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_CALL_RING_CONTINUE:
528ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                Rlog.d(LOG_TAG, "Event EVENT_CALL_RING_CONTINUE Received stat=" + getState());
5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (getState() == PhoneConstants.State.RINGING) {
5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    sendIncomingCallRingNotification(msg.arg1);
5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
534e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            case EVENT_ICC_CHANGED:
535e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                onUpdateIccAvailability();
536e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                break;
537e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
538a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case EVENT_INITIATE_SILENT_REDIAL:
539a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                Rlog.d(LOG_TAG, "Event EVENT_INITIATE_SILENT_REDIAL Received");
540a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                ar = (AsyncResult) msg.obj;
541a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                if ((ar.exception == null) && (ar.result != null)) {
542a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    String dialString = (String) ar.result;
543a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    if (TextUtils.isEmpty(dialString)) return;
544a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    try {
545d5c5a168b4f5806701a4d146309c996acca7183dIhab Awad                        dialInternal(dialString, null, VideoProfile.VideoState.AUDIO_ONLY);
546a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    } catch (CallStateException e) {
547a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        Rlog.e(LOG_TAG, "silent redial failed: " + e);
548a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    }
549a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                }
550a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
551a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
552befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh            case EVENT_SRVCC_STATE_CHANGED:
553befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                ar = (AsyncResult)msg.obj;
554befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                if (ar.exception == null) {
555befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                    handleSrvccStateChanged((int[]) ar.result);
556befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                } else {
557befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                    Rlog.e(LOG_TAG, "Srvcc exception: " + ar.exception);
558befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                }
559befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                break;
560befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh
561110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu            case EVENT_UNSOL_OEM_HOOK_RAW:
562110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu                ar = (AsyncResult)msg.obj;
563110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu                if (ar.exception == null) {
564110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu                    byte[] data = (byte[])ar.result;
565110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu                    Rlog.d(LOG_TAG, "EVENT_UNSOL_OEM_HOOK_RAW data="
566110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu                            + IccUtils.bytesToHexString(data));
567110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu                    mNotifier.notifyOemHookRawEventForSubscriber(getSubId(), data);
568110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu                } else {
569110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu                    Rlog.e(LOG_TAG, "OEM hook raw exception: " + ar.exception);
570110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu                }
571110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu                break;
572110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu
5732b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville            case EVENT_GET_RADIO_CAPABILITY:
5742b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville                ar = (AsyncResult) msg.obj;
5752b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville                RadioCapability rc = (RadioCapability) ar.result;
5762b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville                if (ar.exception != null) {
5772b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville                    Rlog.d(LOG_TAG, "get phone radio capability fail,"
5782b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville                            + "no need to change mRadioAccessFamily");
5792b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville                } else {
5802b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville                    mRadioAccessFamily = rc.getRadioAccessFamily();
5812b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville                }
5822b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville                Rlog.d(LOG_TAG, "EVENT_GET_RADIO_CAPABILITY :"
5832b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville                        + "phone RAF : " + mRadioAccessFamily);
5842b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville                break;
5852b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville
5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                throw new RuntimeException("unexpected event not handled");
5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
591befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh    private void handleSrvccStateChanged(int[] ret) {
592befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh        Rlog.d(LOG_TAG, "handleSrvccStateChanged");
593befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh
5944be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam        ArrayList<Connection> conn = null;
59538b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen        ImsPhone imsPhone = mImsPhone;
596befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh        Call.SrvccState srvccState = Call.SrvccState.NONE;
597befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh        if (ret != null && ret.length != 0) {
598befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh            int state = ret[0];
599befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh            switch(state) {
600befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                case VoLteServiceState.HANDOVER_STARTED:
601befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                    srvccState = Call.SrvccState.STARTED;
60238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                    if (imsPhone != null) {
60338b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                        conn = imsPhone.getHandoverConnection();
6044be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam                        migrateFrom(imsPhone);
605befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                    } else {
606888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohen                        Rlog.d(LOG_TAG, "HANDOVER_STARTED: mImsPhone null");
607befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                    }
608befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                    break;
609befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                case VoLteServiceState.HANDOVER_COMPLETED:
610befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                    srvccState = Call.SrvccState.COMPLETED;
61138b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                    if (imsPhone != null) {
61238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                        imsPhone.notifySrvccState(srvccState);
613befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                    } else {
614888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohen                        Rlog.d(LOG_TAG, "HANDOVER_COMPLETED: mImsPhone null");
615befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                    }
616befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                    break;
617befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                case VoLteServiceState.HANDOVER_FAILED:
618befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                case VoLteServiceState.HANDOVER_CANCELED:
619befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                    srvccState = Call.SrvccState.FAILED;
620befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                    break;
621befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh
622befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                default:
623befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                    //ignore invalid state
624befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh                    return;
625befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh            }
626befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh
627befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh            getCallTracker().notifySrvccState(srvccState, conn);
628befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh
629befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh            VoLteServiceState lteState = new VoLteServiceState(state);
630befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh            notifyVoLteServiceStateChanged(lteState);
631befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh        }
632befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh    }
633befe0bf21cf06c47b1f099caed9e6c6b7125c0feShriram Ganesh
6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
635cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Context getContext() {
6370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mContext;
6380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
640e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    // Will be called when icc changed
641e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    protected abstract void onUpdateIccAvailability();
642e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Disables the DNS check (i.e., allows "0.0.0.0").
6450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Useful for lab testing environment.
6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param b true disables the check, false enables.
6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
648cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void disableDnsCheck(boolean b) {
6500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDnsCheckDisabled = b;
6510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
6520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences.Editor editor = sp.edit();
6530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        editor.putBoolean(DNS_SERVER_CHECK_DISABLED_KEY, b);
6540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        editor.apply();
6550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns true if the DNS check is currently disabled.
6590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
660cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isDnsCheckDisabled() {
6620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDnsCheckDisabled;
6630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
666cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForPreciseCallStateChanged(Handler h, int what, Object obj) {
6680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPreciseCallStateRegistrants.addUnique(h, what, obj);
6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
674cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForPreciseCallStateChanged(Handler h) {
6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPreciseCallStateRegistrants.remove(h);
6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Subclasses of Phone probably want to replace this with a
6810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * version scoped to their packages
6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void notifyPreciseCallStateChangedP() {
6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar = new AsyncResult(null, this, null);
6850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPreciseCallStateRegistrants.notifyRegistrants(ar);
6860742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela
6870742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        mNotifier.notifyPreciseCallState(this);
6880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
690e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    @Override
691e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public void registerForHandoverStateChanged(Handler h, int what, Object obj) {
692e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        checkCorrectThread(h);
693e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        mHandoverRegistrants.addUnique(h, what, obj);
694e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    }
695e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam
696e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    @Override
697e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public void unregisterForHandoverStateChanged(Handler h) {
698e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        mHandoverRegistrants.remove(h);
699e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    }
700e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam
701e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    /**
702e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam     * Subclasses of Phone probably want to replace this with a
703e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam     * version scoped to their packages
704e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam     */
705e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public void notifyHandoverStateChanged(Connection cn) {
706e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam       AsyncResult ar = new AsyncResult(null, cn, null);
707e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam       mHandoverRegistrants.notifyRegistrants(ar);
708e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    }
709e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam
710e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public void migrateFrom(PhoneBase from) {
711e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        migrate(mHandoverRegistrants, from.mHandoverRegistrants);
712e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        migrate(mPreciseCallStateRegistrants, from.mPreciseCallStateRegistrants);
713e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        migrate(mNewRingingConnectionRegistrants, from.mNewRingingConnectionRegistrants);
714e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        migrate(mIncomingRingRegistrants, from.mIncomingRingRegistrants);
715e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        migrate(mDisconnectRegistrants, from.mDisconnectRegistrants);
716e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        migrate(mServiceStateRegistrants, from.mServiceStateRegistrants);
717e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        migrate(mMmiCompleteRegistrants, from.mMmiCompleteRegistrants);
718e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        migrate(mMmiRegistrants, from.mMmiRegistrants);
719e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        migrate(mUnknownConnectionRegistrants, from.mUnknownConnectionRegistrants);
720e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        migrate(mSuppServiceFailedRegistrants, from.mSuppServiceFailedRegistrants);
721e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    }
722e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam
723e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    public void migrate(RegistrantList to, RegistrantList from) {
724e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        from.removeCleared();
725e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        for (int i = 0, n = from.size(); i < n; i++) {
726e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam            to.add((Registrant) from.get(i));
727e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        }
728e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam    }
729e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam
7300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
731cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForUnknownConnection(Handler h, int what, Object obj) {
7330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
7340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mUnknownConnectionRegistrants.addUnique(h, what, obj);
7360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
739cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForUnknownConnection(Handler h) {
7410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mUnknownConnectionRegistrants.remove(h);
7420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
745cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForNewRingingConnection(
7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Handler h, int what, Object obj) {
7480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
7490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNewRingingConnectionRegistrants.addUnique(h, what, obj);
7510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
754cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForNewRingingConnection(Handler h) {
7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNewRingingConnectionRegistrants.remove(h);
7570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
760cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForInCallVoicePrivacyOn(Handler h, int what, Object obj){
7628758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville        mCi.registerForInCallVoicePrivacyOn(h, what, obj);
7630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
766cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForInCallVoicePrivacyOn(Handler h){
76822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForInCallVoicePrivacyOn(h);
7690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
772cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForInCallVoicePrivacyOff(Handler h, int what, Object obj){
7748758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville        mCi.registerForInCallVoicePrivacyOff(h, what, obj);
7750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
778cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForInCallVoicePrivacyOff(Handler h){
78022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForInCallVoicePrivacyOff(h);
7810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
784cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForIncomingRing(
7860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Handler h, int what, Object obj) {
7870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
7880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mIncomingRingRegistrants.addUnique(h, what, obj);
7900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
793cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForIncomingRing(Handler h) {
7950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mIncomingRingRegistrants.remove(h);
7960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
799cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForDisconnect(Handler h, int what, Object obj) {
8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
8020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDisconnectRegistrants.addUnique(h, what, obj);
8040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
807cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForDisconnect(Handler h) {
8090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDisconnectRegistrants.remove(h);
8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
813cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForSuppServiceFailed(Handler h, int what, Object obj) {
8150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
8160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSuppServiceFailedRegistrants.addUnique(h, what, obj);
8180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
821cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForSuppServiceFailed(Handler h) {
8230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSuppServiceFailedRegistrants.remove(h);
8240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
827cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForMmiInitiate(Handler h, int what, Object obj) {
8290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
8300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mMmiRegistrants.addUnique(h, what, obj);
8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
835cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForMmiInitiate(Handler h) {
8370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mMmiRegistrants.remove(h);
8380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
841cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForMmiComplete(Handler h, int what, Object obj) {
8430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
8440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mMmiCompleteRegistrants.addUnique(h, what, obj);
8460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
849cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
8500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForMmiComplete(Handler h) {
8510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
8520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mMmiCompleteRegistrants.remove(h);
8540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
856a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void registerForSimRecordsLoaded(Handler h, int what, Object obj) {
857a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        logUnexpectedCdmaMethodCall("registerForSimRecordsLoaded");
858a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
859a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
860a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void unregisterForSimRecordsLoaded(Handler h) {
861a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        logUnexpectedCdmaMethodCall("unregisterForSimRecordsLoaded");
862a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
863a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
864f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal    @Override
8656d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak    public void registerForTtyModeReceived(Handler h, int what, Object obj) {
8666d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak    }
8676d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak
8686d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak    @Override
8696d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak    public void unregisterForTtyModeReceived(Handler h) {
8706d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak    }
8716d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak
8726d91e295add44a5b7e611cb51401a20b3caa6571Pavel Zhamaitsiak    @Override
873f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal    public void setNetworkSelectionModeAutomatic(Message response) {
874f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        // wrap the response message in our own message along with
875f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        // an empty string (to indicate automatic selection) for the
876f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        // operator's id.
877f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        NetworkSelectMessage nsm = new NetworkSelectMessage();
878f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        nsm.message = response;
879f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        nsm.operatorNumeric = "";
880f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        nsm.operatorAlphaLong = "";
881f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal
882f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        Message msg = obtainMessage(EVENT_SET_NETWORK_AUTOMATIC_COMPLETE, nsm);
883f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        mCi.setNetworkSelectionModeAutomatic(msg);
8848cef6eeaae1f80cf867875e8b3e0172216806509Amit Mahajan
8858cef6eeaae1f80cf867875e8b3e0172216806509Amit Mahajan        updateSavedNetworkOperator(nsm);
886f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal    }
887f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal
888f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal    @Override
8893b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal    public void getNetworkSelectionMode(Message message) {
8903b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal        mCi.getNetworkSelectionMode(message);
8913b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal    }
8923b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal
8933b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal    @Override
894f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal    public void selectNetworkManually(OperatorInfo network, Message response) {
895f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        // wrap the response message in our own message along with
896f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        // the operator's id.
897f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        NetworkSelectMessage nsm = new NetworkSelectMessage();
898f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        nsm.message = response;
899f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        nsm.operatorNumeric = network.getOperatorNumeric();
900f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        nsm.operatorAlphaLong = network.getOperatorAlphaLong();
901f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal
902f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        Message msg = obtainMessage(EVENT_SET_NETWORK_MANUAL_COMPLETE, nsm);
903f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        mCi.setNetworkSelectionModeManual(network.getOperatorNumeric(), msg);
9048cef6eeaae1f80cf867875e8b3e0172216806509Amit Mahajan
9058cef6eeaae1f80cf867875e8b3e0172216806509Amit Mahajan        updateSavedNetworkOperator(nsm);
9068cef6eeaae1f80cf867875e8b3e0172216806509Amit Mahajan    }
9078cef6eeaae1f80cf867875e8b3e0172216806509Amit Mahajan
9088cef6eeaae1f80cf867875e8b3e0172216806509Amit Mahajan    private void updateSavedNetworkOperator(NetworkSelectMessage nsm) {
909d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan        int subId = getSubId();
910d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan        if (SubscriptionManager.isValidSubscriptionId(subId)) {
911d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan            // open the shared preferences editor, and write the value.
912d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan            // nsm.operatorNumeric is "" if we're in automatic.selection.
913d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
914d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan            SharedPreferences.Editor editor = sp.edit();
915d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan            editor.putString(NETWORK_SELECTION_KEY + subId, nsm.operatorNumeric);
916d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan            editor.putString(NETWORK_SELECTION_NAME_KEY + subId, nsm.operatorAlphaLong);
917d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan
918d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan            // commit and log the result.
919d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan            if (!editor.commit()) {
920d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan                Rlog.e(LOG_TAG, "failed to commit network selection preference");
921d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan            }
922d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan        } else {
923d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan            Rlog.e(LOG_TAG, "Cannot update network selection preference due to invalid subId " +
924d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan                    subId);
9258cef6eeaae1f80cf867875e8b3e0172216806509Amit Mahajan        }
926f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal    }
927f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal
928f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal    /**
929f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal     * Used to track the settings upon completion of the network change.
930f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal     */
931f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal    private void handleSetSelectNetwork(AsyncResult ar) {
932f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        // look for our wrapper within the asyncresult, skip the rest if it
933f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        // is null.
934f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        if (!(ar.userObj instanceof NetworkSelectMessage)) {
935f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal            Rlog.e(LOG_TAG, "unexpected result from user object.");
936f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal            return;
937f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        }
938f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal
939f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        NetworkSelectMessage nsm = (NetworkSelectMessage) ar.userObj;
940f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal
941f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        // found the object, now we send off the message we had originally
942f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        // attached to the request.
943f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        if (nsm.message != null) {
944f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal            AsyncResult.forMessage(nsm.message, ar.result, ar.exception);
945f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal            nsm.message.sendToTarget();
946f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal        }
947f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal    }
948f61aaae6608243be4e0da97a56ff9fed488cb173Shishir Agrawal
9490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
9500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Method to retrieve the saved operator id from the Shared Preferences
9510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
9520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String getSavedNetworkSelection() {
9530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // open the shared preferences and search with our key.
9540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
955d756a6bcf4fe09b561481eb6ed5368bd7b21ca76Amit Mahajan        return sp.getString(NETWORK_SELECTION_KEY + getSubId(), "");
9560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
9590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Method to restore the previously saved operator id, or reset to
9600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * automatic selection, all depending upon the value in the shared
9610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * preferences.
9620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
9630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void restoreSavedNetworkSelection(Message response) {
9640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // retrieve the operator id
9650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String networkSelection = getSavedNetworkSelection();
9660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // set to auto if the id is empty, otherwise select the network.
9680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (TextUtils.isEmpty(networkSelection)) {
96922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.setNetworkSelectionModeAutomatic(response);
9700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
97122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.setNetworkSelectionModeManual(networkSelection, response);
9720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
976cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
9770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setUnitTestMode(boolean f) {
9780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mUnitTestMode = f;
9790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
982cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
9830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getUnitTestMode() {
9840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mUnitTestMode;
9850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
9880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * To be invoked when a voice call Connection disconnects.
9890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
9900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Subclasses of Phone probably want to replace this with a
9910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * version scoped to their packages
9920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
9930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void notifyDisconnectP(Connection cn) {
9940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar = new AsyncResult(null, cn, null);
9950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDisconnectRegistrants.notifyRegistrants(ar);
9960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
999cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
10000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForServiceStateChanged(
10010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Handler h, int what, Object obj) {
10020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        checkCorrectThread(h);
10030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mServiceStateRegistrants.add(h, what, obj);
10050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
1008cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
10090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForServiceStateChanged(Handler h) {
10100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mServiceStateRegistrants.remove(h);
10110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
1014cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
10150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForRingbackTone(Handler h, int what, Object obj) {
10168758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville        mCi.registerForRingbackTone(h, what, obj);
10170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
1020cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
10210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForRingbackTone(Handler h) {
102222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForRingbackTone(h);
10230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
1026cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1027a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void registerForOnHoldTone(Handler h, int what, Object obj) {
1028a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
1029a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1030a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    // Inherited documentation suffices.
1031a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
1032a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void unregisterForOnHoldTone(Handler h) {
1033a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
1034a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1035a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    // Inherited documentation suffices.
1036a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
10370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForResendIncallMute(Handler h, int what, Object obj) {
10388758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville        mCi.registerForResendIncallMute(h, what, obj);
10390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
1042cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
10430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForResendIncallMute(Handler h) {
104422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForResendIncallMute(h);
10450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1047cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1048184ffb58812108624ea0be2732cdae511b99d09dVidyakumar Athota    public void setEchoSuppressionEnabled() {
10490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // no need for regular phone
10500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Subclasses of Phone probably want to replace this with a
10540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * version scoped to their packages
10550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void notifyServiceStateChangedP(ServiceState ss) {
10570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar = new AsyncResult(null, ss, null);
10580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mServiceStateRegistrants.notifyRegistrants(ar);
10590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyServiceState(this);
10610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Inherited documentation suffices.
1064cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
10650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SimulatedRadioControl getSimulatedRadioControl() {
10660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSimulatedRadioControl;
10670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Verifies the current thread is the same as the thread originally
10710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * used in the initialization of this instance. Throws RuntimeException
10720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * if not.
10730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
10740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @exception RuntimeException if the current thread is not
10750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the thread that originally obtained this PhoneBase instance.
10760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void checkCorrectThread(Handler h) {
10780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (h.getLooper() != mLooper) {
10790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new RuntimeException(
10800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "com.android.internal.telephony.Phone must be used from within one thread");
10810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Set the properties by matching the carrier string in
10860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * a string-array resource
10870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void setPropertiesByCarrier() {
10890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String carrier = SystemProperties.get("ro.carrier");
10900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (null == carrier || 0 == carrier.length() || "unknown".equals(carrier)) {
10920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
10930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        CharSequence[] carrierLocales = mContext.
10960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                getResources().getTextArray(R.array.carrier_properties);
10970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0; i < carrierLocales.length; i+=3) {
10990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String c = carrierLocales[i].toString();
11000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (carrier.equals(c)) {
1101c25bcac2c4c8754faae69efe2fc5c407f66a9240Narayan Kamath                final Locale l = Locale.forLanguageTag(carrierLocales[i + 1].toString().replace('_', '-'));
1102c25bcac2c4c8754faae69efe2fc5c407f66a9240Narayan Kamath                final String country = l.getCountry();
1103c25bcac2c4c8754faae69efe2fc5c407f66a9240Narayan Kamath                MccTable.setSystemLocale(mContext, l.getLanguage(), country);
1104e0695876e8a7084cf4eaa8e6c71808f238a853a7Robert Greenwalt
1105e0695876e8a7084cf4eaa8e6c71808f238a853a7Robert Greenwalt                if (!country.isEmpty()) {
1106e0695876e8a7084cf4eaa8e6c71808f238a853a7Robert Greenwalt                    try {
1107e0695876e8a7084cf4eaa8e6c71808f238a853a7Robert Greenwalt                        Settings.Global.getInt(mContext.getContentResolver(),
1108e0695876e8a7084cf4eaa8e6c71808f238a853a7Robert Greenwalt                                Settings.Global.WIFI_COUNTRY_CODE);
1109e0695876e8a7084cf4eaa8e6c71808f238a853a7Robert Greenwalt                    } catch (Settings.SettingNotFoundException e) {
1110e0695876e8a7084cf4eaa8e6c71808f238a853a7Robert Greenwalt                        // note this is not persisting
1111e0695876e8a7084cf4eaa8e6c71808f238a853a7Robert Greenwalt                        WifiManager wM = (WifiManager)
1112e0695876e8a7084cf4eaa8e6c71808f238a853a7Robert Greenwalt                                mContext.getSystemService(Context.WIFI_SERVICE);
1113e0695876e8a7084cf4eaa8e6c71808f238a853a7Robert Greenwalt                        wM.setCountryCode(country, false);
1114e0695876e8a7084cf4eaa8e6c71808f238a853a7Robert Greenwalt                    }
1115e0695876e8a7084cf4eaa8e6c71808f238a853a7Robert Greenwalt                }
11160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return;
11170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Get state
11230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1124cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
11250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract PhoneConstants.State getState();
11260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Retrieves the IccFileHandler of the Phone instance
11290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
11300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public IccFileHandler getIccFileHandler(){
1131e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        UiccCardApplication uiccApplication = mUiccApplication.get();
1132d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville        IccFileHandler fh;
1133d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville
1134d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville        if (uiccApplication == null) {
1135d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville            Rlog.d(LOG_TAG, "getIccFileHandler: uiccApplication == null, return null");
1136d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville            fh = null;
1137d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville        } else {
1138d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville            fh = uiccApplication.getIccFileHandler();
1139d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville        }
1140d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville
1141d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville        Rlog.d(LOG_TAG, "getIccFileHandler: fh=" + fh);
1142d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville        return fh;
11430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
11460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Retrieves the Handler of the Phone instance
11470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
11480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Handler getHandler() {
11490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return this;
11500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
115203b37b67755a4033c6be32ae2e389c310e06e7d1Amit Mahajan    @Override
115303b37b67755a4033c6be32ae2e389c310e06e7d1Amit Mahajan    public void updatePhoneObject(int voiceRadioTech) {
115403b37b67755a4033c6be32ae2e389c310e06e7d1Amit Mahajan        // Only the PhoneProxy can update the phone object.
115503b37b67755a4033c6be32ae2e389c310e06e7d1Amit Mahajan        PhoneFactory.getDefaultPhone().updatePhoneObject(voiceRadioTech);
115603b37b67755a4033c6be32ae2e389c310e06e7d1Amit Mahajan    }
115703b37b67755a4033c6be32ae2e389c310e06e7d1Amit Mahajan
11580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    * Retrieves the ServiceStateTracker of the phone instance.
11600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    */
11610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public ServiceStateTracker getServiceStateTracker() {
11620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
11630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    * Get call tracker
11670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    */
11680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public CallTracker getCallTracker() {
11690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
11700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1172ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka    public AppType getCurrentUiccAppType() {
1173ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka        UiccCardApplication currentApp = mUiccApplication.get();
1174ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka        if (currentApp != null) {
1175ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka            return currentApp.getType();
1176ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka        }
1177ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka        return AppType.APPTYPE_UNKNOWN;
1178ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka    }
1179ba06d1becedde6ee94229154b2e493d6d4a3ad53Alex Yakavenka
11800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
11810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public IccCard getIccCard() {
1182e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        return null;
1183e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        //throw new Exception("getIccCard Shouldn't be called from PhoneBase");
11840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
11870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getIccSerialNumber() {
1188e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
11893c6bdec23af42aba1168303cdefc20525b0ec1d0Ajay Nambi        return (r != null) ? r.getIccId() : null;
11900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
11930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getIccRecordsLoaded() {
1194e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
1195e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        return (r != null) ? r.getRecordsLoaded() : false;
11960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1198ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    /**
1199ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     * @return all available cell information or null if none.
1200ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     */
1201ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    @Override
1202ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    public List<CellInfo> getAllCellInfo() {
1203ffe6e68213ae3220497188fed814e271b472292aJake Hamby        List<CellInfo> cellInfoList = getServiceStateTracker().getAllCellInfo();
1204ffe6e68213ae3220497188fed814e271b472292aJake Hamby        return privatizeCellInfoList(cellInfoList);
1205ffe6e68213ae3220497188fed814e271b472292aJake Hamby    }
1206ffe6e68213ae3220497188fed814e271b472292aJake Hamby
1207ffe6e68213ae3220497188fed814e271b472292aJake Hamby    /**
1208ffe6e68213ae3220497188fed814e271b472292aJake Hamby     * Clear CDMA base station lat/long values if location setting is disabled.
1209ffe6e68213ae3220497188fed814e271b472292aJake Hamby     * @param cellInfoList the original cell info list from the RIL
1210ffe6e68213ae3220497188fed814e271b472292aJake Hamby     * @return the original list with CDMA lat/long cleared if necessary
1211ffe6e68213ae3220497188fed814e271b472292aJake Hamby     */
1212ffe6e68213ae3220497188fed814e271b472292aJake Hamby    private List<CellInfo> privatizeCellInfoList(List<CellInfo> cellInfoList) {
1213ffe6e68213ae3220497188fed814e271b472292aJake Hamby        int mode = Settings.Secure.getInt(getContext().getContentResolver(),
1214ffe6e68213ae3220497188fed814e271b472292aJake Hamby                Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
1215ffe6e68213ae3220497188fed814e271b472292aJake Hamby        if (mode == Settings.Secure.LOCATION_MODE_OFF) {
1216ffe6e68213ae3220497188fed814e271b472292aJake Hamby            ArrayList<CellInfo> privateCellInfoList = new ArrayList<CellInfo>(cellInfoList.size());
1217ffe6e68213ae3220497188fed814e271b472292aJake Hamby            // clear lat/lon values for location privacy
1218ffe6e68213ae3220497188fed814e271b472292aJake Hamby            for (CellInfo c : cellInfoList) {
1219ffe6e68213ae3220497188fed814e271b472292aJake Hamby                if (c instanceof CellInfoCdma) {
1220ffe6e68213ae3220497188fed814e271b472292aJake Hamby                    CellInfoCdma cellInfoCdma = (CellInfoCdma) c;
1221ffe6e68213ae3220497188fed814e271b472292aJake Hamby                    CellIdentityCdma cellIdentity = cellInfoCdma.getCellIdentity();
1222ffe6e68213ae3220497188fed814e271b472292aJake Hamby                    CellIdentityCdma maskedCellIdentity = new CellIdentityCdma(
1223ffe6e68213ae3220497188fed814e271b472292aJake Hamby                            cellIdentity.getNetworkId(),
1224ffe6e68213ae3220497188fed814e271b472292aJake Hamby                            cellIdentity.getSystemId(),
1225ffe6e68213ae3220497188fed814e271b472292aJake Hamby                            cellIdentity.getBasestationId(),
1226ffe6e68213ae3220497188fed814e271b472292aJake Hamby                            Integer.MAX_VALUE, Integer.MAX_VALUE);
1227ffe6e68213ae3220497188fed814e271b472292aJake Hamby                    CellInfoCdma privateCellInfoCdma = new CellInfoCdma(cellInfoCdma);
1228ffe6e68213ae3220497188fed814e271b472292aJake Hamby                    privateCellInfoCdma.setCellIdentity(maskedCellIdentity);
1229ffe6e68213ae3220497188fed814e271b472292aJake Hamby                    privateCellInfoList.add(privateCellInfoCdma);
1230ffe6e68213ae3220497188fed814e271b472292aJake Hamby                } else {
1231ffe6e68213ae3220497188fed814e271b472292aJake Hamby                    privateCellInfoList.add(c);
1232ffe6e68213ae3220497188fed814e271b472292aJake Hamby                }
1233ffe6e68213ae3220497188fed814e271b472292aJake Hamby            }
1234ffe6e68213ae3220497188fed814e271b472292aJake Hamby            cellInfoList = privateCellInfoList;
1235ffe6e68213ae3220497188fed814e271b472292aJake Hamby        }
1236ffe6e68213ae3220497188fed814e271b472292aJake Hamby        return cellInfoList;
1237ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    }
1238ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville
12395fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville    /**
12405fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville     * {@inheritDoc}
12415fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville     */
12425fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville    @Override
12435fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville    public void setCellInfoListRate(int rateInMillis) {
12445fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville        mCi.setCellInfoListRate(rateInMillis, null);
12455fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville    }
12465fb811ff076aa6b4a9ceca6edaf504a4c6d9ad20Wink Saville
12470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
124826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    /** @return true if there are messages waiting, false otherwise. */
12490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getMessageWaitingIndicator() {
125026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        return mVmCount != 0;
12510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
12540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getCallForwardingIndicator() {
1255e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
1256e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        return (r != null) ? r.getVoiceCallForwardingFlag() : false;
12570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  Query the status of the CDMA roaming preference
12610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1262cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
12630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void queryCdmaRoamingPreference(Message response) {
126422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.queryCdmaRoamingPreference(response);
12650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1268ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     * Get the signal strength
1269ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     */
1270ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    @Override
1271ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    public SignalStrength getSignalStrength() {
1272ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        ServiceStateTracker sst = getServiceStateTracker();
1273ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        if (sst == null) {
1274ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville            return new SignalStrength();
1275ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        } else {
1276ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville            return sst.getSignalStrength();
1277ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        }
1278ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    }
1279ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville
1280ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    /**
12810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  Set the status of the CDMA roaming preference
12820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1283cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
12840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setCdmaRoamingPreference(int cdmaRoamingType, Message response) {
128522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setCdmaRoamingPreference(cdmaRoamingType, response);
12860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  Set the status of the CDMA subscription mode
12900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1291cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
12920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setCdmaSubscription(int cdmaSubscriptionType, Message response) {
129322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setCdmaSubscriptionSource(cdmaSubscriptionType, response);
12940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
12970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *  Set the preferred Network Type: Global, CDMA only or GSM/UMTS only
12980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1299cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setPreferredNetworkType(int networkType, Message response) {
130122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setPreferredNetworkType(networkType, response);
13020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1304cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getPreferredNetworkType(Message response) {
130622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.getPreferredNetworkType(response);
13070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1309cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getSmscAddress(Message result) {
131122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.getSmscAddress(result);
13120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1314cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setSmscAddress(String address, Message result) {
131622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setSmscAddress(address, result);
13170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1319cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setTTYMode(int ttyMode, Message onComplete) {
132122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setTTYMode(ttyMode, onComplete);
13220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1324cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1325b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh    public void setUiTTYMode(int uiTtyMode, Message onComplete) {
1326b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh        Rlog.d(LOG_TAG, "unexpected setUiTTYMode method call");
1327b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh    }
1328b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh
1329b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh    @Override
13300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void queryTTYMode(Message onComplete) {
133122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.queryTTYMode(onComplete);
13320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1334cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void enableEnhancedVoicePrivacy(boolean enable, Message onComplete) {
13360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
13370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("enableEnhancedVoicePrivacy");
13380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1340cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getEnhancedVoicePrivacy(Message onComplete) {
13420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
13430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("getEnhancedVoicePrivacy");
13440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1346cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setBandMode(int bandMode, Message response) {
134822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setBandMode(bandMode, response);
13490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1351cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void queryAvailableBandMode(Message response) {
135322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.queryAvailableBandMode(response);
13540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1356cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void invokeOemRilRequestRaw(byte[] data, Message response) {
135822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.invokeOemRilRequestRaw(data, response);
13590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1361cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void invokeOemRilRequestStrings(String[] strings, Message response) {
136322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.invokeOemRilRequestStrings(strings, response);
13640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1366cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1367f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby    public void nvReadItem(int itemID, Message response) {
1368f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby        mCi.nvReadItem(itemID, response);
1369f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby    }
1370f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby
1371f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby    @Override
1372f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby    public void nvWriteItem(int itemID, String itemValue, Message response) {
1373f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby        mCi.nvWriteItem(itemID, itemValue, response);
1374f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby    }
1375f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby
1376f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby    @Override
1377f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby    public void nvWriteCdmaPrl(byte[] preferredRoamingList, Message response) {
1378f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby        mCi.nvWriteCdmaPrl(preferredRoamingList, response);
1379f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby    }
1380f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby
1381f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby    @Override
1382f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby    public void nvResetConfig(int resetType, Message response) {
1383f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby        mCi.nvResetConfig(resetType, response);
1384f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby    }
1385f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby
1386f28ac81ec36df38307648d404cff4b2b11f46861Jake Hamby    @Override
13870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyDataActivity() {
13880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyDataActivity(this);
13890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyMessageWaitingIndicator() {
13920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Do not notify voice mail waiting if device doesn't support voice
13930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!mIsVoiceCapable)
13940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
13950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function is added to send the notification to DefaultPhoneNotifier.
13970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyMessageWaitingChanged(this);
13980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyDataConnection(String reason, String apnType,
14010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            PhoneConstants.DataState state) {
14020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyDataConnection(this, reason, apnType, state);
14030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyDataConnection(String reason, String apnType) {
14060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyDataConnection(this, reason, apnType, getDataConnectionState(apnType));
14070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyDataConnection(String reason) {
14100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String types[] = getActiveApnTypes();
14110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (String apnType : types) {
14120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mNotifier.notifyDataConnection(this, reason, apnType, getDataConnectionState(apnType));
14130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
14140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyOtaspChanged(int otaspMode) {
14170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyOtaspChanged(this, otaspMode);
14180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1420ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    public void notifySignalStrength() {
1421ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        mNotifier.notifySignalStrength(this);
1422ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    }
1423ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville
1424ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    public void notifyCellInfo(List<CellInfo> cellInfo) {
1425ffe6e68213ae3220497188fed814e271b472292aJake Hamby        mNotifier.notifyCellInfo(this, privatizeCellInfoList(cellInfo));
1426ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    }
1427ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville
14288758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville    public void notifyDataConnectionRealTimeInfo(DataConnectionRealTimeInfo dcRtInfo) {
14298758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville        mNotifier.notifyDataConnectionRealTimeInfo(this, dcRtInfo);
14308758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville    }
14318758315661d65c14d0e10d354a14f80ec1f65db7Wink Saville
1432a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void notifyVoLteServiceStateChanged(VoLteServiceState lteState) {
1433a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mNotifier.notifyVoLteServiceStateChanged(this, lteState);
1434a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
1435a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
14360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
14370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if a mobile originating emergency call is active
14380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
14390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isInEmergencyCall() {
14400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
14410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
14440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if we are in the emergency call back mode. This is a period where
14450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the phone should be using as little power as possible and be ready to receive an
14460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * incoming call from the emergency operator.
14470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
14480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isInEcm() {
14490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
14500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1452cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
14530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract int getPhoneType();
14540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** @hide */
145626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    /** @return number of voicemails */
1457cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
14580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getVoiceMessageCount(){
145926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        return mVmCount;
146026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    }
146126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
146226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    /** sets the voice mail count of the phone and notifies listeners. */
146326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    public void setVoiceMessageCount(int countWaiting) {
146426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        mVmCount = countWaiting;
146526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        // notify listeners of voice mail
146626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        notifyMessageWaitingIndicator();
146726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    }
146826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
146926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    /** gets the voice mail count from preferences */
147026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa    protected int getStoredVoiceMessageCount() {
147126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        int countVoiceMessages = 0;
147226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
147326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        String subscriberId = sp.getString(VM_ID, null);
147426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        String currentSubscriberId = getSubscriberId();
147526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
147626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        Rlog.d(LOG_TAG, "Voicemail count retrieval for subscriberId = " + subscriberId +
147726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                " current subscriberId = " + currentSubscriberId);
147826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa
147926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        if ((subscriberId != null) && (currentSubscriberId != null)
148026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa                && (currentSubscriberId.equals(subscriberId))) {
148126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            // get voice mail count from preferences
148226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            countVoiceMessages = sp.getInt(VM_COUNT, 0);
148326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa            Rlog.d(LOG_TAG, "Voice Mail Count from preference = " + countVoiceMessages);
148426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        }
148526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        return countVoiceMessages;
14860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
14890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the CDMA ERI icon index to display
14900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1491cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
14920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getCdmaEriIconIndex() {
14930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("getCdmaEriIconIndex");
14940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return -1;
14950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
14980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the CDMA ERI icon mode,
14990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * 0 - ON
15000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * 1 - FLASHING
15010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1502cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getCdmaEriIconMode() {
15040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("getCdmaEriIconMode");
15050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return -1;
15060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns the CDMA ERI text,
15100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1511cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getCdmaEriText() {
15130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("getCdmaEriText");
15140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return "GSM nw, no ERI";
15150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1517cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getCdmaMin() {
15190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
15200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("getCdmaMin");
15210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
15220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1524cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isMinInfoReady() {
15260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
15270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("isMinInfoReady");
15280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
15290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1531cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getCdmaPrlVersion(){
15330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //  This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
15340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("getCdmaPrlVersion");
15350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
15360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1538cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete) {
15400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
15410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("sendBurstDtmf");
15420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1544cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void exitEmergencyCallbackMode() {
15460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
15470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("exitEmergencyCallbackMode");
15480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1550cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForCdmaOtaStatusChange(Handler h, int what, Object obj) {
15520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
15530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("registerForCdmaOtaStatusChange");
15540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1556cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForCdmaOtaStatusChange(Handler h) {
15580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
15590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("unregisterForCdmaOtaStatusChange");
15600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1562cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForSubscriptionInfoReady(Handler h, int what, Object obj) {
15640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
15650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("registerForSubscriptionInfoReady");
15660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1568cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForSubscriptionInfoReady(Handler h) {
15700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
15710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("unregisterForSubscriptionInfoReady");
15720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Returns true if OTA Service Provisioning needs to be performed.
15760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * If not overridden return false.
15770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1578cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean needsOtaServiceProvisioning() {
15800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
15810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Return true if number is an OTASP number.
15850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * If not overridden return false.
15860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1587cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public  boolean isOtaSpNumber(String dialStr) {
15890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
15900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1592cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForCallWaiting(Handler h, int what, Object obj){
15940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
15950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("registerForCallWaiting");
15960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1598cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
15990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForCallWaiting(Handler h){
16000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
16010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("unregisterForCallWaiting");
16020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1604cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForEcmTimerReset(Handler h, int what, Object obj) {
16060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
16070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("registerForEcmTimerReset");
16080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1610cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForEcmTimerReset(Handler h) {
16120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
16130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedCdmaMethodCall("unregisterForEcmTimerReset");
16140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1616cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForSignalInfo(Handler h, int what, Object obj) {
161822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForSignalInfo(h, what, obj);
16190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1621cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForSignalInfo(Handler h) {
162322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForSignalInfo(h);
16240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1626cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForDisplayInfo(Handler h, int what, Object obj) {
162822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForDisplayInfo(h, what, obj);
16290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1631cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     @Override
1632cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void unregisterForDisplayInfo(Handler h) {
163322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville         mCi.unregisterForDisplayInfo(h);
16340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     }
16350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1636cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForNumberInfo(Handler h, int what, Object obj) {
163822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForNumberInfo(h, what, obj);
16390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1641cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForNumberInfo(Handler h) {
164322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForNumberInfo(h);
16440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1646cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForRedirectedNumberInfo(Handler h, int what, Object obj) {
164822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForRedirectedNumberInfo(h, what, obj);
16490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1651cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForRedirectedNumberInfo(Handler h) {
165322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForRedirectedNumberInfo(h);
16540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1656cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForLineControlInfo(Handler h, int what, Object obj) {
165822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForLineControlInfo( h, what, obj);
16590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1661cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForLineControlInfo(Handler h) {
166322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForLineControlInfo(h);
16640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1666cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerFoT53ClirlInfo(Handler h, int what, Object obj) {
166822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerFoT53ClirlInfo(h, what, obj);
16690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1671cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForT53ClirInfo(Handler h) {
167322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForT53ClirInfo(h);
16740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1676cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForT53AudioControlInfo(Handler h, int what, Object obj) {
167822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForT53AudioControlInfo( h, what, obj);
16790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1681cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForT53AudioControlInfo(Handler h) {
168322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForT53AudioControlInfo(h);
16840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1686cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     @Override
1687cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void setOnEcbModeExitResponse(Handler h, int what, Object obj){
16880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
16890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         logUnexpectedCdmaMethodCall("setOnEcbModeExitResponse");
16900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     }
16910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1692cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     @Override
1693cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    public void unsetOnEcbModeExitResponse(Handler h){
16940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class CDMAPhone. Not implemented in GSMPhone.
16950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         logUnexpectedCdmaMethodCall("unsetOnEcbModeExitResponse");
16960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     }
16970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1698cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16996bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville    public void registerForRadioOffOrNotAvailable(Handler h, int what, Object obj) {
17006bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        mRadioOffOrNotAvailableRegistrants.addUnique(h, what, obj);
17016bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville    }
17026bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville
17036bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville    @Override
17046bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville    public void unregisterForRadioOffOrNotAvailable(Handler h) {
17056bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        mRadioOffOrNotAvailableRegistrants.remove(h);
17066bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville    }
17076bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville
17086bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville    @Override
17090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String[] getActiveApnTypes() {
1710454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        return mDcTracker.getActiveApnTypes();
17110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1713cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
171479f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu    public boolean hasMatchedTetherApnSetting() {
171579f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu        return mDcTracker.hasMatchedTetherApnSetting();
171679f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu    }
171779f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu
171879f9daf3ef1c254439ed0e9a640df214c5f8196dJunda Liu    @Override
17190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getActiveApnHost(String apnType) {
1720454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        return mDcTracker.getActiveApnString(apnType);
17210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1723cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
17240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public LinkProperties getLinkProperties(String apnType) {
1725454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        return mDcTracker.getLinkProperties(apnType);
17260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1728cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
172996cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwalt    public NetworkCapabilities getNetworkCapabilities(String apnType) {
173096cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwalt        return mDcTracker.getNetworkCapabilities(apnType);
17310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1733cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
17340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isDataConnectivityPossible() {
17350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return isDataConnectivityPossible(PhoneConstants.APN_TYPE_DEFAULT);
17360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1738cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
17390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isDataConnectivityPossible(String apnType) {
1740454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville        return ((mDcTracker != null) &&
1741454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                (mDcTracker.isDataPossible(apnType)));
17420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
17440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
17450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Notify registrants of a new ringing Connection.
17460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Subclasses of Phone probably want to replace this with a
17470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * version scoped to their packages
17480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
174938b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen    public void notifyNewRingingConnectionP(Connection cn) {
17500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!mIsVoiceCapable)
17510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
17520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar = new AsyncResult(null, cn, null);
17530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNewRingingConnectionRegistrants.notifyRegistrants(ar);
17540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
17560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
17570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Notify registrants of a RING event.
17580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
17590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void notifyIncomingRing() {
17600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!mIsVoiceCapable)
17610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
17620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar = new AsyncResult(null, this, null);
17630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mIncomingRingRegistrants.notifyRegistrants(ar);
17640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
17660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
17670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Send the incoming call Ring notification if conditions are right.
17680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
17690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void sendIncomingCallRingNotification(int token) {
17700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mIsVoiceCapable && !mDoesRilSendMultipleCallRing &&
17710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                (token == mCallRingContinueToken)) {
1772ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.d(LOG_TAG, "Sending notifyIncomingRing");
17730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            notifyIncomingRing();
17740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            sendMessageDelayed(
17750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    obtainMessage(EVENT_CALL_RING_CONTINUE, token, 0), mCallRingDelay);
17760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1777ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.d(LOG_TAG, "Ignoring ring notification request,"
17780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + " mDoesRilSendMultipleCallRing=" + mDoesRilSendMultipleCallRing
17790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + " token=" + token
17800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + " mCallRingContinueToken=" + mCallRingContinueToken
17810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    + " mIsVoiceCapable=" + mIsVoiceCapable);
17820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
17830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1785cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
17860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isCspPlmnEnabled() {
17870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class GSMPhone.
17880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Not implemented in CDMAPhone.
17890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedGsmMethodCall("isCspPlmnEnabled");
17900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
17910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1793cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
17940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public IsimRecords getIsimRecords() {
1795ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.e(LOG_TAG, "getIsimRecords() is only supported on LTE devices");
17960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
17970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
17980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1799cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
18000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getMsisdn() {
18010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        logUnexpectedGsmMethodCall("getMsisdn");
18020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
18030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
18040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
18060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Common error logger method for unexpected calls to CDMA-only methods.
18070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
18080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static void logUnexpectedCdmaMethodCall(String name)
18090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    {
1810ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.e(LOG_TAG, "Error! " + name + "() in PhoneBase should not be " +
18110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "called, CDMAPhone inactive.");
18120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
18130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1814cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
18150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneConstants.DataState getDataConnectionState() {
18160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return getDataConnectionState(PhoneConstants.APN_TYPE_DEFAULT);
18170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
18180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
18200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Common error logger method for unexpected calls to GSM/WCDMA-only methods.
18210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
18220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static void logUnexpectedGsmMethodCall(String name) {
1823ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.e(LOG_TAG, "Error! " + name + "() in PhoneBase should not be " +
18240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "called, GSMPhone inactive.");
18250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
18260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Called by SimRecords which is constructed with a PhoneBase instead of a GSMPhone.
18280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyCallForwardingIndicator() {
18290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This function should be overridden by the class GSMPhone. Not implemented in CDMAPhone.
1830ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.e(LOG_TAG, "Error! This function should never be executed, inactive CDMAPhone.");
18310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
18320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyDataConnectionFailed(String reason, String apnType) {
18340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyDataConnectionFailed(this, reason, apnType);
18350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
18360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18370742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    public void notifyPreciseDataConnectionFailed(String reason, String apnType, String apn,
18380742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            String failCause) {
18390742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        mNotifier.notifyPreciseDataConnectionFailed(this, reason, apnType, apn, failCause);
18400742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    }
18410742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela
18420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
18430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * {@inheritDoc}
18440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
18450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
18460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getLteOnCdmaMode() {
184722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCi.getLteOnCdmaMode();
18480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
18490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setVoiceMessageWaiting(int line, int countWaiting) {
185126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        // This function should be overridden by class GSMPhone and CDMAPhone.
185226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa        Rlog.e(LOG_TAG, "Error! This function should never be executed, inactive Phone.");
18530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
18540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
18560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Gets the USIM service table from the UICC, if present and available.
18570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return an interface to the UsimServiceTable record, or null if not available
18580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
18590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
18600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public UsimServiceTable getUsimServiceTable() {
1861e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
1862e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        return (r != null) ? r.getUsimServiceTable() : null;
18630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
18640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1865a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
1866a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Gets the Uicc card corresponding to this phone.
1867a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * @return the UiccCard object corresponding to the phone ID.
1868a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
1869a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
1870a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public UiccCard getUiccCard() {
1871a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mUiccController.getUiccCard(mPhoneId);
1872a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
1873a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1874a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
1875a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Get P-CSCF address from PCO after data connection is established or modified.
1876bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram     * @param apnType the apnType, "ims" for IMS APN, "emergency" for EMERGENCY APN
1877a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
1878a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
1879bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram    public String[] getPcscfAddress(String apnType) {
1880bc78e2f9988f380a3b88d4cb4a9c0b80b8f44beeram        return mDcTracker.getPcscfAddress(apnType);
1881a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
1882a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1883a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
1884a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Set IMS registration state
1885a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
1886a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
1887a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void setImsRegistrationState(boolean registered) {
1888a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        mDcTracker.setImsRegistrationState(registered);
1889a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
1890a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1891a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
1892a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Return an instance of a IMS phone
1893a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
1894a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
1895888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohen    public Phone getImsPhone() {
1896888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohen        return mImsPhone;
1897a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
1898a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
189938b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen    @Override
190038b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen    public ImsPhone relinquishOwnershipOfImsPhone() {
190138b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen        synchronized (mImsLock) {
190238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            if (mImsPhone == null)
190338b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                return null;
190438b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen
190538b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            ImsPhone imsPhone = mImsPhone;
190638b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            mImsPhone = null;
190738b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen
190838b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            CallManager.getInstance().unregisterPhone(imsPhone);
190938b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            imsPhone.unregisterForSilentRedial(this);
191038b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen
191138b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            return imsPhone;
191238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen        }
191338b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen    }
191438b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen
191538b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen    @Override
191638b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen    public void acquireOwnershipOfImsPhone(ImsPhone imsPhone) {
191738b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen        synchronized (mImsLock) {
191838b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            if (imsPhone == null)
191938b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                return;
1920a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
192138b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            if (mImsPhone != null) {
192238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                Rlog.e(LOG_TAG, "acquireOwnershipOfImsPhone: non-null mImsPhone." +
192338b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                        " Shouldn't happen - but disposing");
192438b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                mImsPhone.dispose();
192530862cd26cbde4397d984c9afd1780ffbc9adbc2Etan Cohen                // Potential GC issue if someone keeps a reference to ImsPhone.
192630862cd26cbde4397d984c9afd1780ffbc9adbc2Etan Cohen                // However: this change will make sure that such a reference does
192730862cd26cbde4397d984c9afd1780ffbc9adbc2Etan Cohen                // not access functions through NULL pointer.
192830862cd26cbde4397d984c9afd1780ffbc9adbc2Etan Cohen                //mImsPhone.removeReferences();
192938b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            }
193038b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen
193138b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            mImsPhone = imsPhone;
193238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen
193338b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            mImsServiceReady = true;
193438b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            mImsPhone.updateParentPhone(this);
1935888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohen            CallManager.getInstance().registerPhone(mImsPhone);
1936888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohen            mImsPhone.registerForSilentRedial(
1937a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    this, EVENT_INITIATE_SILENT_REDIAL, null);
193838b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen        }
193938b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen    }
1940a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
194138b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen    protected void updateImsPhone() {
194238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen        synchronized (mImsLock) {
194338b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            Rlog.d(LOG_TAG, "updateImsPhone"
194438b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                    + " mImsServiceReady=" + mImsServiceReady);
194538b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen
194638b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            if (mImsServiceReady && (mImsPhone == null)) {
194738b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                mImsPhone = PhoneFactory.makeImsPhone(mNotifier, this);
194838b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                CallManager.getInstance().registerPhone(mImsPhone);
194938b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                mImsPhone.registerForSilentRedial(
195038b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                        this, EVENT_INITIATE_SILENT_REDIAL, null);
195138b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            } else if (!mImsServiceReady && (mImsPhone != null)) {
195238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                CallManager.getInstance().unregisterPhone(mImsPhone);
195338b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                mImsPhone.unregisterForSilentRedial(this);
195438b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen
195538b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                mImsPhone.dispose();
195630862cd26cbde4397d984c9afd1780ffbc9adbc2Etan Cohen                // Potential GC issue if someone keeps a reference to ImsPhone.
195730862cd26cbde4397d984c9afd1780ffbc9adbc2Etan Cohen                // However: this change will make sure that such a reference does
195830862cd26cbde4397d984c9afd1780ffbc9adbc2Etan Cohen                // not access functions through NULL pointer.
195930862cd26cbde4397d984c9afd1780ffbc9adbc2Etan Cohen                //mImsPhone.removeReferences();
196038b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                mImsPhone = null;
196138b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen            }
1962a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
1963a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
1964a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
19656bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn    /**
19666bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn     * Dials a number.
19676bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn     *
19686bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn     * @param dialString The number to dial.
19696bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn     * @param uusInfo The UUSInfo.
19706bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn     * @param videoState The video state for the call.
19716bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn     * @return The Connection.
19726bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn     * @throws CallStateException
19736bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn     */
19746bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn    protected Connection dialInternal(String dialString, UUSInfo uusInfo, int videoState)
1975a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            throws CallStateException {
1976a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // dialInternal shall be overriden by GSMPhone and CDMAPhone
1977a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return null;
1978a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
1979a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1980a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
1981a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Returns the subscription id.
1982a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
1983b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville    public int getSubId() {
19846bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville        return SubscriptionController.getInstance().getSubIdUsingPhoneId(mPhoneId);
1985a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
1986a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1987a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
1988a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * Returns the phone id.
1989a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
1990a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public int getPhoneId() {
1991a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mPhoneId;
1992a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
1993a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1994a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
1995888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohen     * Return the service state of mImsPhone if it is STATE_IN_SERVICE
1996a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     * otherwise return the current voice service state
1997a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
1998a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
1999888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohen    public int getVoicePhoneServiceState() {
200038b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen        ImsPhone imsPhone = mImsPhone;
200138b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen        if (imsPhone != null
200238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen                && imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE) {
2003a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            return ServiceState.STATE_IN_SERVICE;
2004a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
2005a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return getServiceState().getState();
2006a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
2007b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal
2008b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal    @Override
2009279a26768a5fde8f0dd72e4b9e951c1c32265aabShishir Agrawal    public boolean setOperatorBrandOverride(String brand) {
2010b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal        return false;
2011b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal    }
201203586878fb3d870373f2fdf65afb81cc5ae97067Naveen Kalla
201303586878fb3d870373f2fdf65afb81cc5ae97067Naveen Kalla    @Override
201434057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    public boolean setRoamingOverride(List<String> gsmRoamingList,
201534057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal            List<String> gsmNonRoamingList, List<String> cdmaRoamingList,
201634057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal            List<String> cdmaNonRoamingList) {
201734057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        String iccId = getIccSerialNumber();
201834057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        if (TextUtils.isEmpty(iccId)) {
201934057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal            return false;
202034057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        }
202134057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal
202234057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        setRoamingOverrideHelper(gsmRoamingList, GSM_ROAMING_LIST_OVERRIDE_PREFIX, iccId);
202334057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        setRoamingOverrideHelper(gsmNonRoamingList, GSM_NON_ROAMING_LIST_OVERRIDE_PREFIX, iccId);
202434057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        setRoamingOverrideHelper(cdmaRoamingList, CDMA_ROAMING_LIST_OVERRIDE_PREFIX, iccId);
202534057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        setRoamingOverrideHelper(cdmaNonRoamingList, CDMA_NON_ROAMING_LIST_OVERRIDE_PREFIX, iccId);
202634057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal
202734057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        // Refresh.
202834057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        ServiceStateTracker tracker = getServiceStateTracker();
202934057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        if (tracker != null) {
203034057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal            tracker.pollState();
203134057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        }
203234057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        return true;
203334057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    }
203434057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal
203534057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    private void setRoamingOverrideHelper(List<String> list, String prefix, String iccId) {
203634057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        SharedPreferences.Editor spEditor =
203734057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal                PreferenceManager.getDefaultSharedPreferences(mContext).edit();
203834057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        String key = prefix + iccId;
203934057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        if (list == null || list.isEmpty()) {
204034057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal            spEditor.remove(key).commit();
204134057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        } else {
204234057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal            spEditor.putStringSet(key, new HashSet<String>(list)).commit();
204334057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        }
204434057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    }
204534057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal
204634057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    public boolean isMccMncMarkedAsRoaming(String mccMnc) {
204734057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        return getRoamingOverrideHelper(GSM_ROAMING_LIST_OVERRIDE_PREFIX, mccMnc);
204834057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    }
204934057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal
205034057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    public boolean isMccMncMarkedAsNonRoaming(String mccMnc) {
205134057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        return getRoamingOverrideHelper(GSM_NON_ROAMING_LIST_OVERRIDE_PREFIX, mccMnc);
205234057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    }
205334057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal
205434057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    public boolean isSidMarkedAsRoaming(int SID) {
205534057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        return getRoamingOverrideHelper(CDMA_ROAMING_LIST_OVERRIDE_PREFIX,
205634057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal                Integer.toString(SID));
205734057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    }
205834057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal
205934057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    public boolean isSidMarkedAsNonRoaming(int SID) {
206034057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        return getRoamingOverrideHelper(CDMA_NON_ROAMING_LIST_OVERRIDE_PREFIX,
206134057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal                Integer.toString(SID));
206234057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    }
206334057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal
2064bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com    /**
2065bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com     * Get IMS Registration Status
2066bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com     */
2067bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com    @Override
2068bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com    public boolean isImsRegistered() {
2069bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com        ImsPhone imsPhone = mImsPhone;
2070bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com        boolean isImsRegistered = false;
2071bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com        if (imsPhone != null) {
2072bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com            isImsRegistered = imsPhone.isImsRegistered();
2073bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com        } else {
2074bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com            ServiceStateTracker sst = getServiceStateTracker();
2075bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com            if (sst != null) {
2076bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com                isImsRegistered = sst.isImsRegistered();
2077bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com            }
2078bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com        }
2079bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com        Rlog.d(LOG_TAG, "isImsRegistered =" + isImsRegistered);
2080bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com        return isImsRegistered;
2081bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com    }
2082bd4bb4f2250463ba59dc98be649f6aa4df9fb682Libin.Tang@motorola.com
208334057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    private boolean getRoamingOverrideHelper(String prefix, String key) {
208434057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        String iccId = getIccSerialNumber();
208534057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        if (TextUtils.isEmpty(iccId) || TextUtils.isEmpty(key)) {
208634057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal            return false;
208734057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        }
208834057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal
208934057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
209034057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        Set<String> value = sp.getStringSet(prefix + iccId, null);
209134057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        if (value == null) {
209234057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal            return false;
209334057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        }
209434057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal        return value.contains(key);
209534057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    }
209634057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal
209734057c56c8cb3e3c011a70b2c799c73f15bd4522Shishir Agrawal    @Override
209803586878fb3d870373f2fdf65afb81cc5ae97067Naveen Kalla    public boolean isRadioAvailable() {
209903586878fb3d870373f2fdf65afb81cc5ae97067Naveen Kalla        return mCi.getRadioState().isAvailable();
210003586878fb3d870373f2fdf65afb81cc5ae97067Naveen Kalla    }
210103586878fb3d870373f2fdf65afb81cc5ae97067Naveen Kalla
210203586878fb3d870373f2fdf65afb81cc5ae97067Naveen Kalla    @Override
210303586878fb3d870373f2fdf65afb81cc5ae97067Naveen Kalla    public void shutdownRadio() {
210403586878fb3d870373f2fdf65afb81cc5ae97067Naveen Kalla        getServiceStateTracker().requestShutdown();
210503586878fb3d870373f2fdf65afb81cc5ae97067Naveen Kalla    }
2106e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville
21072b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    @Override
21082b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    public void setRadioCapability(RadioCapability rc, Message response) {
21092b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville        mCi.setRadioCapability(rc, response);
21102b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    }
21112b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville
21122b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    @Override
21132b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    public int getRadioAccessFamily() {
21142b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville        return mRadioAccessFamily;
21152b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    }
21162b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville
21172b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    @Override
21187e7d2b34010bf24a70bbf40303c7a4606c438adaStuart Scott    public int getSupportedRadioAccessFamily() {
21197e7d2b34010bf24a70bbf40303c7a4606c438adaStuart Scott        return mCi.getSupportedRadioAccessFamily();
21207e7d2b34010bf24a70bbf40303c7a4606c438adaStuart Scott    }
21217e7d2b34010bf24a70bbf40303c7a4606c438adaStuart Scott
21227e7d2b34010bf24a70bbf40303c7a4606c438adaStuart Scott    @Override
21232b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    public void registerForRadioCapabilityChanged(Handler h, int what, Object obj) {
21242b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville        mCi.registerForRadioCapabilityChanged(h, what, obj);
21252b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    }
21262b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville
21272b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    @Override
21282b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    public void unregisterForRadioCapabilityChanged(Handler h) {
21292b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville        mCi.unregisterForRadioCapabilityChanged(this);
21302b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville    }
21312b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville
2132e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
2133e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println("PhoneBase: subId=" + getSubId());
2134e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mPhoneId=" + mPhoneId);
2135e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mCi=" + mCi);
2136e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mDnsCheckDisabled=" + mDnsCheckDisabled);
2137e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mDcTracker=" + mDcTracker);
2138e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mDoesRilSendMultipleCallRing=" + mDoesRilSendMultipleCallRing);
2139e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mCallRingContinueToken=" + mCallRingContinueToken);
2140e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mCallRingDelay=" + mCallRingDelay);
2141e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mIsTheCurrentActivePhone=" + mIsTheCurrentActivePhone);
2142e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mIsVoiceCapable=" + mIsVoiceCapable);
2143e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mIccRecords=" + mIccRecords.get());
2144e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mUiccApplication=" + mUiccApplication.get());
2145e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mSmsStorageMonitor=" + mSmsStorageMonitor);
2146e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mSmsUsageMonitor=" + mSmsUsageMonitor);
2147e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.flush();
2148e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mLooper=" + mLooper);
2149e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mContext=" + mContext);
2150e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mNotifier=" + mNotifier);
2151e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mSimulatedRadioControl=" + mSimulatedRadioControl);
2152e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" mUnitTestMode=" + mUnitTestMode);
2153e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" isDnsCheckDisabled()=" + isDnsCheckDisabled());
2154e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" getUnitTestMode()=" + getUnitTestMode());
2155e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" getState()=" + getState());
2156e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" getIccSerialNumber()=" + getIccSerialNumber());
2157e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" getIccRecordsLoaded()=" + getIccRecordsLoaded());
2158e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" getMessageWaitingIndicator()=" + getMessageWaitingIndicator());
2159e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" getCallForwardingIndicator()=" + getCallForwardingIndicator());
2160e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" isInEmergencyCall()=" + isInEmergencyCall());
2161e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.flush();
2162e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" isInEcm()=" + isInEcm());
2163e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" getPhoneName()=" + getPhoneName());
2164e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" getPhoneType()=" + getPhoneType());
2165e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" getVoiceMessageCount()=" + getVoiceMessageCount());
2166e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" getActiveApnTypes()=" + getActiveApnTypes());
2167e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" isDataConnectivityPossible()=" + isDataConnectivityPossible());
2168e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println(" needsOtaServiceProvisioning=" + needsOtaServiceProvisioning());
2169e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.flush();
2170e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println("++++++++++++++++++++++++++++++++");
2171e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville
2172e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        try {
2173e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville            mDcTracker.dump(fd, pw, args);
2174e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        } catch (Exception e) {
2175e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville            e.printStackTrace();
2176e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        }
2177e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.flush();
2178e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println("++++++++++++++++++++++++++++++++");
2179e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville
2180e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        try {
2181e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville            getServiceStateTracker().dump(fd, pw, args);
2182e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        } catch (Exception e) {
2183e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville            e.printStackTrace();
2184e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        }
2185e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.flush();
2186e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println("++++++++++++++++++++++++++++++++");
2187e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville
2188e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        try {
2189e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville            getCallTracker().dump(fd, pw, args);
2190e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        } catch (Exception e) {
2191e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville            e.printStackTrace();
2192e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        }
2193e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.flush();
2194e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println("++++++++++++++++++++++++++++++++");
2195e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville
2196e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        try {
2197e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville            ((RIL)mCi).dump(fd, pw, args);
2198e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        } catch (Exception e) {
2199e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville            e.printStackTrace();
2200e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        }
2201e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.flush();
2202e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville        pw.println("++++++++++++++++++++++++++++++++");
2203e97be3971cb6b55e019433c32524cc60ce0d037bWink Saville    }
22040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
2205