10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 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.gsm;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.ContentValues;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.SharedPreferences;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.database.SQLException;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.Uri;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Registrant;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RegistrantList;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.preference.PreferenceManager;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.provider.Telephony;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.CellLocation;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.PhoneNumberUtils;
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState;
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.SignalStrength;
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallTracker;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils;
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_DISABLE;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_ENABLE;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_ERASURE;
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_REGISTRATION;
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_ALL;
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_ALL_CONDITIONAL;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_NO_REPLY;
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_NOT_REACHABLE;
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_BUSY;
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDITIONAL;
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_VOICE;
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_BASEBAND_VERSION;
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
53e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardApplicationStatus.AppState;
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.cat.CatService;
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Call;
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallForwardInfo;
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallStateException;
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CommandsInterface;
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Connection;
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IccFileHandler;
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IccPhoneBookInterfaceManager;
62e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenkaimport com.android.internal.telephony.IccRecords;
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IccSmsInterfaceManager;
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.MmiCode;
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.OperatorInfo;
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Phone;
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneBase;
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneConstants;
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneNotifier;
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneProxy;
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneSubInfo;
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.TelephonyProperties;
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.UUSInfo;
74e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.UiccCard;
75e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.UiccCardApplication;
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.test.SimulatedRadioControl;
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.uicc.UiccController;
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IccVmNotSupportedException;
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.ServiceStateTracker;
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor;
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.IOException;
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter;
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.net.InetSocketAddress;
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.net.ServerSocket;
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.net.Socket;
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List;
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class GSMPhone extends PhoneBase {
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // NOTE that LOG_TAG here is "GSM", which means that log messages
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // from this file will go into the radio log rather than the main
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // log.  (Use "adb logcat -b radio" to see them.)
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final String LOG_TAG = "GSM";
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final boolean LOCAL_DEBUG = true;
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final boolean VDBG = false; /* STOP SHIP if true */
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Key used to read/write current ciphering state
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String CIPHERING_KEY = "ciphering_key";
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Key used to read/write voice mail number
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String VM_NUMBER = "vm_number_key";
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Key used to read/write the SIM IMSI used for storing the voice mail
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static final String VM_SIM_IMSI = "vm_sim_imsi_key";
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Instance Variables
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    GsmCallTracker mCT;
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    GsmServiceStateTracker mSST;
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    ArrayList <GsmMmiCode> mPendingMMIs = new ArrayList<GsmMmiCode>();
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    SimPhoneBookInterfaceManager mSimPhoneBookIntManager;
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    SimSmsInterfaceManager mSimSmsIntManager;
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    PhoneSubInfo mSubInfo;
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Registrant mPostDialHandler;
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** List of Registrants to receive Supplementary Service Notifications. */
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    RegistrantList mSsnRegistrants = new RegistrantList();
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Thread debugPortThread;
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    ServerSocket debugSocket;
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String mImei;
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String mImeiSv;
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String mVmNumber;
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // Constructors
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    GSMPhone (Context context, CommandsInterface ci, PhoneNotifier notifier) {
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this(context,ci,notifier, false);
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    GSMPhone (Context context, CommandsInterface ci, PhoneNotifier notifier, boolean unitTestMode) {
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super(notifier, context, ci, unitTestMode);
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (ci instanceof SimulatedRadioControl) {
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSimulatedRadioControl = (SimulatedRadioControl) ci;
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.setPhoneType(PhoneConstants.PHONE_TYPE_GSM);
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT = new GsmCallTracker(this);
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST = new GsmServiceStateTracker (this);
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSMS = new GsmSMSDispatcher(this, mSmsStorageMonitor, mSmsUsageMonitor);
149e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDataConnectionTracker = new GsmDataConnectionTracker (this);
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!unitTestMode) {
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSimPhoneBookIntManager = new SimPhoneBookInterfaceManager(this);
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSimSmsIntManager = new SimSmsInterfaceManager(this, mSMS);
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSubInfo = new PhoneSubInfo(this);
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForAvailable(this, EVENT_RADIO_AVAILABLE, null);
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.registerForOn(this, EVENT_RADIO_ON, null);
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.setOnUSSD(this, EVENT_USSD, null);
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.setOnSuppServiceNotification(this, EVENT_SSN, null);
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null);
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (false) {
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                //debugSocket = new LocalServerSocket("com.android.internal.telephony.debug");
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                debugSocket = new ServerSocket();
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                debugSocket.setReuseAddress(true);
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                debugSocket.bind (new InetSocketAddress("127.0.0.1", 6666));
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                debugPortThread
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    = new Thread(
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        new Runnable() {
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            public void run() {
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                for(;;) {
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    try {
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                        Socket sock;
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                        sock = debugSocket.accept();
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                        Log.i(LOG_TAG, "New connection; resetting radio");
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                        mCM.resetRadio(null);
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                        sock.close();
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    } catch (IOException ex) {
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                        Log.w(LOG_TAG,
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                            "Exception accepting socket", ex);
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    }
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                }
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            }
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        },
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        "GSMPhone debug");
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                debugPortThread.start();
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (IOException ex) {
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Log.w(LOG_TAG, "Failure to open com.android.internal.telephony.debug socket", ex);
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //Change the system property
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SystemProperties.set(TelephonyProperties.CURRENT_ACTIVE_PHONE,
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                new Integer(PhoneConstants.PHONE_TYPE_GSM).toString());
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dispose() {
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        synchronized(PhoneProxy.lockForRadioTechnologyChange) {
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            super.dispose();
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //Unregister from all former registered events
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCM.unregisterForAvailable(this); //EVENT_RADIO_AVAILABLE
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            unregisterForSimRecordEvents();
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCM.unregisterForOffOrNotAvailable(this); //EVENT_RADIO_OFF_OR_NOT_AVAILABLE
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCM.unregisterForOn(this); //EVENT_RADIO_ON
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSST.unregisterForNetworkAttached(this); //EVENT_REGISTERED_TO_NETWORK
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCM.unSetOnUSSD(this);
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCM.unSetOnSuppServiceNotification(this);
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mPendingMMIs.clear();
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //Force all referenced classes to unregister their former registered events
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCT.dispose();
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mDataConnectionTracker.dispose();
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSST.dispose();
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSimPhoneBookIntManager.dispose();
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSimSmsIntManager.dispose();
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mSubInfo.dispose();
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void removeReferences() {
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.d(LOG_TAG, "removeReferences");
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSimulatedRadioControl = null;
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSimPhoneBookIntManager = null;
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSimSmsIntManager = null;
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSubInfo = null;
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT = null;
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST = null;
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.removeReferences();
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void finalize() {
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if(LOCAL_DEBUG) Log.d(LOG_TAG, "GSMPhone finalized");
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public ServiceState
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getServiceState() {
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSST.ss;
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public CellLocation getCellLocation() {
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSST.cellLoc;
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneConstants.State getState() {
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCT.state;
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getPhoneName() {
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return "GSM";
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getPhoneType() {
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return PhoneConstants.PHONE_TYPE_GSM;
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
267ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    public ServiceStateTracker getServiceStateTracker() {
268ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        return mSST;
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public CallTracker getCallTracker() {
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCT;
2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public List<? extends MmiCode>
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getPendingMmiCodes() {
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mPendingMMIs;
2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneConstants.DataState getDataConnectionState(String apnType) {
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        PhoneConstants.DataState ret = PhoneConstants.DataState.DISCONNECTED;
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mSST == null) {
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Radio Technology Change is ongoning, dispose() and removeReferences() have
2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // already been called
2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret = PhoneConstants.DataState.DISCONNECTED;
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (mSST.getCurrentGprsState()
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                != ServiceState.STATE_IN_SERVICE) {
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // If we're out of service, open TCP sockets may still work
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // but no data will flow
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret = PhoneConstants.DataState.DISCONNECTED;
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (mDataConnectionTracker.isApnTypeEnabled(apnType) == false ||
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mDataConnectionTracker.isApnTypeActive(apnType) == false) {
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //TODO: isApnTypeActive() is just checking whether ApnContext holds
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //      Dataconnection or not. Checking each ApnState below should
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //      provide the same state. Calling isApnTypeActive() can be removed.
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ret = PhoneConstants.DataState.DISCONNECTED;
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else { /* mSST.gprsState == ServiceState.STATE_IN_SERVICE */
3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            switch (mDataConnectionTracker.getState(apnType)) {
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case FAILED:
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case IDLE:
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ret = PhoneConstants.DataState.DISCONNECTED;
3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case CONNECTED:
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DISCONNECTING:
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if ( mCT.state != PhoneConstants.State.IDLE
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            && !mSST.isConcurrentVoiceAndDataAllowed()) {
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        ret = PhoneConstants.DataState.SUSPENDED;
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        ret = PhoneConstants.DataState.CONNECTED;
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case INITING:
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case CONNECTING:
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case SCANNING:
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ret = PhoneConstants.DataState.CONNECTING;
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ret;
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public DataActivityState getDataActivityState() {
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        DataActivityState ret = DataActivityState.NONE;
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mSST.getCurrentGprsState() == ServiceState.STATE_IN_SERVICE) {
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            switch (mDataConnectionTracker.getActivity()) {
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DATAIN:
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ret = DataActivityState.DATAIN;
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DATAOUT:
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ret = DataActivityState.DATAOUT;
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                case DATAINANDOUT:
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ret = DataActivityState.DATAINANDOUT;
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
343b3a03455be44a2a0ffbeb757b193d860c1878599Naveen Kalla
344b3a03455be44a2a0ffbeb757b193d860c1878599Naveen Kalla                case DORMANT:
345b3a03455be44a2a0ffbeb757b193d860c1878599Naveen Kalla                    ret = DataActivityState.DORMANT;
346b3a03455be44a2a0ffbeb757b193d860c1878599Naveen Kalla                break;
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ret;
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Notify any interested party of a Phone state change {@link PhoneConstants.State}
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void notifyPhoneStateChanged() {
3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyPhoneState(this);
3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Notify registrants of a change in the call state. This notifies changes in {@link Call.State}
3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Use this when changes in the precise call state are needed, else use notifyPhoneStateChanged.
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void notifyPreciseCallStateChanged() {
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /* we'd love it if this was package-scoped*/
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.notifyPreciseCallStateChangedP();
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void
3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    notifyNewRingingConnection(Connection c) {
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /* we'd love it if this was package-scoped*/
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.notifyNewRingingConnectionP(c);
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    notifyDisconnect(Connection cn) {
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDisconnectRegistrants.notifyResult(cn);
3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void notifyUnknownConnection() {
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mUnknownConnectionRegistrants.notifyResult(this);
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void notifySuppServiceFailed(SuppService code) {
3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSuppServiceFailedRegistrants.notifyResult(code);
3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void
3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    notifyServiceStateChanged(ServiceState ss) {
3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.notifyServiceStateChangedP(ss);
3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void notifyLocationChanged() {
3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyCellLocation(this);
3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    notifyCallForwardingIndicator() {
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyCallForwardingChanged(this);
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // override for allowing access from other classes of this package
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * {@inheritDoc}
4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public final void
4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    setSystemProperty(String property, String value) {
4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.setSystemProperty(property, value);
4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForSuppServiceNotification(
4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Handler h, int what, Object obj) {
4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSsnRegistrants.addUnique(h, what, obj);
4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mSsnRegistrants.size() == 1) mCM.setSuppServiceNotifications(true, null);
4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForSuppServiceNotification(Handler h) {
4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSsnRegistrants.remove(h);
4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mSsnRegistrants.size() == 0) mCM.setSuppServiceNotifications(false, null);
4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    acceptCall() throws CallStateException {
4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT.acceptCall();
4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    rejectCall() throws CallStateException {
4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT.rejectCall();
4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    switchHoldingAndActive() throws CallStateException {
4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT.switchWaitingOrHoldingAndActive();
4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean canConference() {
4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCT.canConference();
4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean canDial() {
4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCT.canDial();
4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void conference() throws CallStateException {
4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT.conference();
4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void clearDisconnected() {
4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT.clearDisconnected();
4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean canTransfer() {
4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCT.canTransfer();
4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void explicitCallTransfer() throws CallStateException {
4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT.explicitCallTransfer();
4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public GsmCall
4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getForegroundCall() {
4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCT.foregroundCall;
4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public GsmCall
4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getBackgroundCall() {
4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCT.backgroundCall;
4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public GsmCall
4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getRingingCall() {
4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCT.ringingCall;
4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean handleCallDeflectionIncallSupplementaryService(
4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String dialString) throws CallStateException {
4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (dialString.length() > 1) {
4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return false;
4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (getRingingCall().getState() != GsmCall.State.IDLE) {
4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 0: rejectCall");
4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mCT.rejectCall();
4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (CallStateException e) {
4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (LOCAL_DEBUG) Log.d(LOG_TAG,
4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "reject failed", e);
4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                notifySuppServiceFailed(Phone.SuppService.REJECT);
4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (getBackgroundCall().getState() != GsmCall.State.IDLE) {
4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (LOCAL_DEBUG) Log.d(LOG_TAG,
4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "MmiCode 0: hangupWaitingOrBackground");
4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCT.hangupWaitingOrBackground();
4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return true;
4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean handleCallWaitingIncallSupplementaryService(
5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String dialString) throws CallStateException {
5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int len = dialString.length();
5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (len > 2) {
5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return false;
5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        GsmCall call = (GsmCall) getForegroundCall();
5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (len > 1) {
5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                char ch = dialString.charAt(1);
5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                int callIndex = ch - '0';
5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (callIndex >= 1 && callIndex <= GsmCallTracker.MAX_CONNECTIONS) {
5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
5180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            "MmiCode 1: hangupConnectionByIndex " +
5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            callIndex);
5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mCT.hangupConnectionByIndex(call, callIndex);
5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (call.getState() != GsmCall.State.IDLE) {
5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            "MmiCode 1: hangup foreground");
5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    //mCT.hangupForegroundResumeBackground();
5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mCT.hangup(call);
5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            "MmiCode 1: switchWaitingOrHoldingAndActive");
5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mCT.switchWaitingOrHoldingAndActive();
5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (CallStateException e) {
5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (LOCAL_DEBUG) Log.d(LOG_TAG,
5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "hangup failed", e);
5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            notifySuppServiceFailed(Phone.SuppService.HANGUP);
5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return true;
5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean handleCallHoldIncallSupplementaryService(String dialString)
5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throws CallStateException {
5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int len = dialString.length();
5460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (len > 2) {
5480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return false;
5490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        GsmCall call = (GsmCall) getForegroundCall();
5520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (len > 1) {
5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                char ch = dialString.charAt(1);
5560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                int callIndex = ch - '0';
5570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                GsmConnection conn = mCT.getConnectionByIndex(call, callIndex);
5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // gsm index starts at 1, up to 5 connections in a call,
5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (conn != null && callIndex >= 1 && callIndex <= GsmCallTracker.MAX_CONNECTIONS) {
5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 2: separate call "+
5620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            callIndex);
5630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mCT.separate(conn);
5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (LOCAL_DEBUG) Log.d(LOG_TAG, "separate: invalid call index "+
5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            callIndex);
5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    notifySuppServiceFailed(Phone.SuppService.SEPARATE);
5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
5690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (CallStateException e) {
5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (LOCAL_DEBUG) Log.d(LOG_TAG,
5710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "separate failed", e);
5720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                notifySuppServiceFailed(Phone.SuppService.SEPARATE);
5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (getRingingCall().getState() != GsmCall.State.IDLE) {
5770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
5780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "MmiCode 2: accept ringing call");
5790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mCT.acceptCall();
5800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
5810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
5820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "MmiCode 2: switchWaitingOrHoldingAndActive");
5830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    mCT.switchWaitingOrHoldingAndActive();
5840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
5850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (CallStateException e) {
5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (LOCAL_DEBUG) Log.d(LOG_TAG,
5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "switch failed", e);
5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                notifySuppServiceFailed(Phone.SuppService.SWITCH);
5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return true;
5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean handleMultipartyIncallSupplementaryService(
5960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String dialString) throws CallStateException {
5970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (dialString.length() > 1) {
5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return false;
5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 3: merge calls");
6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
6030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            conference();
6040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (CallStateException e) {
6050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (LOCAL_DEBUG) Log.d(LOG_TAG,
6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "conference failed", e);
6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            notifySuppServiceFailed(Phone.SuppService.CONFERENCE);
6080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return true;
6100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean handleEctIncallSupplementaryService(String dialString)
6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throws CallStateException {
6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int len = dialString.length();
6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (len != 1) {
6180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return false;
6190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 4: explicit call transfer");
6220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            explicitCallTransfer();
6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (CallStateException e) {
6250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (LOCAL_DEBUG) Log.d(LOG_TAG,
6260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "transfer failed", e);
6270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            notifySuppServiceFailed(Phone.SuppService.TRANSFER);
6280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return true;
6300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean handleCcbsIncallSupplementaryService(String dialString)
6330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throws CallStateException {
6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (dialString.length() > 1) {
6350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return false;
6360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.i(LOG_TAG, "MmiCode 5: CCBS not supported!");
6390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Treat it as an "unknown" service.
6400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        notifySuppServiceFailed(Phone.SuppService.UNKNOWN);
6410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return true;
6420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean handleInCallMmiCommands(String dialString)
6450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throws CallStateException {
6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!isInCall()) {
6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return false;
6480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (TextUtils.isEmpty(dialString)) {
6510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return false;
6520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean result = false;
6550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        char ch = dialString.charAt(0);
6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (ch) {
6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case '0':
6580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result = handleCallDeflectionIncallSupplementaryService(
6590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        dialString);
6600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
6610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case '1':
6620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result = handleCallWaitingIncallSupplementaryService(
6630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        dialString);
6640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
6650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case '2':
6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result = handleCallHoldIncallSupplementaryService(dialString);
6670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
6680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case '3':
6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result = handleMultipartyIncallSupplementaryService(dialString);
6700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case '4':
6720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result = handleEctIncallSupplementaryService(dialString);
6730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
6740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case '5':
6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                result = handleCcbsIncallSupplementaryService(dialString);
6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return result;
6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean isInCall() {
6850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        GsmCall.State foregroundCallState = getForegroundCall().getState();
6860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        GsmCall.State backgroundCallState = getBackgroundCall().getState();
6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        GsmCall.State ringingCallState = getRingingCall().getState();
6880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville       return (foregroundCallState.isAlive() ||
6900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                backgroundCallState.isAlive() ||
6910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ringingCallState.isAlive());
6920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Connection
6950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    dial(String dialString) throws CallStateException {
6960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return dial(dialString, null);
6970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Connection
7000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    dial (String dialString, UUSInfo uusInfo) throws CallStateException {
7010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Need to make sure dialString gets parsed properly
7020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String newDialString = PhoneNumberUtils.stripSeparators(dialString);
7030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // handle in-call MMI first if applicable
7050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (handleInCallMmiCommands(newDialString)) {
7060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return null;
7070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Only look at the Network portion for mmi
7100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String networkPortion = PhoneNumberUtils.extractNetworkPortionAlt(newDialString);
711e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        GsmMmiCode mmi =
712e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                GsmMmiCode.newFromDialString(networkPortion, this, mUiccApplication.get());
7130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (LOCAL_DEBUG) Log.d(LOG_TAG,
7140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                               "dialing w/ mmi '" + mmi + "'...");
7150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mmi == null) {
7170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return mCT.dial(newDialString, uusInfo);
7180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (mmi.isTemporaryModeCLIR()) {
7190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return mCT.dial(mmi.dialingNumber, mmi.getCLIRMode(), uusInfo);
7200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
7210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mPendingMMIs.add(mmi);
7220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
7230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mmi.processCode();
7240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // FIXME should this return null or something else?
7260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return null;
7270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean handlePinMmi(String dialString) {
731e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        GsmMmiCode mmi = GsmMmiCode.newFromDialString(dialString, this, mUiccApplication.get());
7320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mmi != null && mmi.isPinCommand()) {
7340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mPendingMMIs.add(mmi);
7350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
7360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mmi.processCode();
7370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return true;
7380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
7410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void sendUssdResponse(String ussdMessge) {
744e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        GsmMmiCode mmi = GsmMmiCode.newFromUssdUserInput(ussdMessge, this, mUiccApplication.get());
7450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPendingMMIs.add(mmi);
7460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mmi.sendUssd(ussdMessge);
7480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
7510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    sendDtmf(char c) {
7520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!PhoneNumberUtils.is12Key(c)) {
7530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Log.e(LOG_TAG,
7540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "sendDtmf called with invalid character '" + c + "'");
7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (mCT.state ==  PhoneConstants.State.OFFHOOK) {
7570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mCM.sendDtmf(c, null);
7580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
7630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    startDtmf(char c) {
7640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!PhoneNumberUtils.is12Key(c)) {
7650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Log.e(LOG_TAG,
7660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                "startDtmf called with invalid character '" + c + "'");
7670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
7680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCM.startDtmf(c, null);
7690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
7730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    stopDtmf() {
7740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.stopDtmf(null);
7750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
7780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    sendBurstDtmf(String dtmfString) {
7790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "[GSMPhone] sendBurstDtmf() is a CDMA method");
7800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
7830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    setRadioPower(boolean power) {
7840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST.setRadioPower(power);
7850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void storeVoiceMailNumber(String number) {
7880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
7890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences.Editor editor = sp.edit();
7900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        editor.putString(VM_NUMBER, number);
7910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        editor.apply();
7920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        setVmSimImsi(getSubscriberId());
7930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getVoiceMailNumber() {
7960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Read from the SIM. If its null, try reading from the shared preference area.
797e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
798e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        String number = (r != null) ? r.getVoiceMailNumber() : "";
7990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (TextUtils.isEmpty(number)) {
8000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            number = sp.getString(VM_NUMBER, null);
8020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return number;
8040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String getVmSimImsi() {
8070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
8080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return sp.getString(VM_SIM_IMSI, null);
8090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void setVmSimImsi(String imsi) {
8120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
8130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences.Editor editor = sp.edit();
8140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        editor.putString(VM_SIM_IMSI, imsi);
8150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        editor.apply();
8160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getVoiceMailAlphaTag() {
8190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String ret;
820e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
8210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
822e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        ret = (r != null) ? r.getVoiceMailAlphaTag() : "";
8230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (ret == null || ret.length() == 0) {
8250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return mContext.getText(
8260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                com.android.internal.R.string.defaultVoiceMailAlphaTag).toString();
8270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ret;
8300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getDeviceId() {
8330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mImei;
8340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getDeviceSvn() {
8370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mImeiSv;
8380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getImei() {
8410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mImei;
8420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getEsn() {
8450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "[GSMPhone] getEsn() is a CDMA method");
8460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return "0";
8470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getMeid() {
8500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "[GSMPhone] getMeid() is a CDMA method");
8510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return "0";
8520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getSubscriberId() {
855e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
856e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        return (r != null) ? r.getIMSI() : "";
8570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getLine1Number() {
860e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
861e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        return (r != null) ? r.getMsisdnNumber() : "";
8620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
8650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getMsisdn() {
866e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
867e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        return (r != null) ? r.getMsisdnNumber() : "";
8680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getLine1AlphaTag() {
871e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
872e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        return (r != null) ? r.getMsisdnAlphaTag() : "";
8730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setLine1Number(String alphaTag, String number, Message onComplete) {
876e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
877e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        if (r != null) {
878e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            r.setMsisdnNumber(alphaTag, number, onComplete);
879e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        }
8800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setVoiceMailNumber(String alphaTag,
8830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            String voiceMailNumber,
8840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            Message onComplete) {
8850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Message resp;
8870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mVmNumber = voiceMailNumber;
8880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        resp = obtainMessage(EVENT_SET_VM_NUMBER_DONE, 0, 0, onComplete);
889e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
890e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        if (r != null) {
891e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            r.setVoiceMailNumber(alphaTag, mVmNumber, resp);
892e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        }
8930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean isValidCommandInterfaceCFReason (int commandInterfaceCFReason) {
8960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (commandInterfaceCFReason) {
8970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CF_REASON_UNCONDITIONAL:
8980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CF_REASON_BUSY:
8990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CF_REASON_NO_REPLY:
9000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CF_REASON_NOT_REACHABLE:
9010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CF_REASON_ALL:
9020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CF_REASON_ALL_CONDITIONAL:
9030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return true;
9040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        default:
9050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return false;
9060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean isValidCommandInterfaceCFAction (int commandInterfaceCFAction) {
9100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (commandInterfaceCFAction) {
9110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CF_ACTION_DISABLE:
9120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CF_ACTION_ENABLE:
9130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CF_ACTION_REGISTRATION:
9140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CF_ACTION_ERASURE:
9150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return true;
9160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        default:
9170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return false;
9180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected  boolean isCfEnable(int action) {
9220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return (action == CF_ACTION_ENABLE) || (action == CF_ACTION_REGISTRATION);
9230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getCallForwardingOption(int commandInterfaceCFReason, Message onComplete) {
9260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (isValidCommandInterfaceCFReason(commandInterfaceCFReason)) {
9270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (LOCAL_DEBUG) Log.d(LOG_TAG, "requesting call forwarding query.");
9280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Message resp;
9290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (commandInterfaceCFReason == CF_REASON_UNCONDITIONAL) {
9300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                resp = obtainMessage(EVENT_GET_CALL_FORWARD_DONE, onComplete);
9310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
9320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                resp = onComplete;
9330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
9340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCM.queryCallForwardStatus(commandInterfaceCFReason,0,null,resp);
9350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setCallForwardingOption(int commandInterfaceCFAction,
9390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int commandInterfaceCFReason,
9400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String dialingNumber,
9410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int timerSeconds,
9420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Message onComplete) {
9430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (    (isValidCommandInterfaceCFAction(commandInterfaceCFAction)) &&
9440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                (isValidCommandInterfaceCFReason(commandInterfaceCFReason))) {
9450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Message resp;
9470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (commandInterfaceCFReason == CF_REASON_UNCONDITIONAL) {
9480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                resp = obtainMessage(EVENT_SET_CALL_FORWARD_DONE,
9490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        isCfEnable(commandInterfaceCFAction) ? 1 : 0, 0, onComplete);
9500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
9510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                resp = onComplete;
9520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
9530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCM.setCallForward(commandInterfaceCFAction,
9540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    commandInterfaceCFReason,
9550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    CommandsInterface.SERVICE_CLASS_VOICE,
9560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    dialingNumber,
9570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    timerSeconds,
9580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    resp);
9590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getOutgoingCallerIdDisplay(Message onComplete) {
9630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.getCLIR(onComplete);
9640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode,
9670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                           Message onComplete) {
9680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.setCLIR(commandInterfaceCLIRMode,
9690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                obtainMessage(EVENT_SET_CLIR_COMPLETE, commandInterfaceCLIRMode, 0, onComplete));
9700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getCallWaiting(Message onComplete) {
9730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //As per 3GPP TS 24.083, section 1.6 UE doesn't need to send service
9740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //class parameter in call waiting interrogation  to network
9750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.queryCallWaiting(CommandsInterface.SERVICE_CLASS_NONE, onComplete);
9760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setCallWaiting(boolean enable, Message onComplete) {
9790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.setCallWaiting(enable, CommandsInterface.SERVICE_CLASS_VOICE, onComplete);
9800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
9830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getAvailableNetworks(Message response) {
9840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.getAvailableNetworks(response);
9850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
9880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Small container class used to hold information relevant to
9890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * the carrier selection process. operatorNumeric can be ""
9900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * if we are looking for automatic selection. operatorAlphaLong is the
9910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * corresponding operator name.
9920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
9930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static class NetworkSelectMessage {
9940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public Message message;
9950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public String operatorNumeric;
9960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        public String operatorAlphaLong;
9970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
10000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    setNetworkSelectionModeAutomatic(Message response) {
10010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // wrap the response message in our own message along with
10020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // an empty string (to indicate automatic selection) for the
10030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // operator's id.
10040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        NetworkSelectMessage nsm = new NetworkSelectMessage();
10050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        nsm.message = response;
10060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        nsm.operatorNumeric = "";
10070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        nsm.operatorAlphaLong = "";
10080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // get the message
10100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Message msg = obtainMessage(EVENT_SET_NETWORK_AUTOMATIC_COMPLETE, nsm);
10110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (LOCAL_DEBUG)
10120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Log.d(LOG_TAG, "wrapping and sending message to connect automatically");
10130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.setNetworkSelectionModeAutomatic(msg);
10150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
10180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    selectNetworkManually(OperatorInfo network,
10190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Message response) {
10200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // wrap the response message in our own message along with
10210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // the operator's id.
10220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        NetworkSelectMessage nsm = new NetworkSelectMessage();
10230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        nsm.message = response;
10240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        nsm.operatorNumeric = network.getOperatorNumeric();
10250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        nsm.operatorAlphaLong = network.getOperatorAlphaLong();
10260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // get the message
10280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Message msg = obtainMessage(EVENT_SET_NETWORK_MANUAL_COMPLETE, nsm);
10290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.setNetworkSelectionModeManual(network.getOperatorNumeric(), msg);
10310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
10340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getNeighboringCids(Message response) {
10350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.getNeighboringCids(response);
10360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setOnPostDialCharacter(Handler h, int what, Object obj) {
10390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mPostDialHandler = new Registrant(h, what, obj);
10400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setMute(boolean muted) {
10430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCT.setMute(muted);
10440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getMute() {
10470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCT.getMute();
10480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getDataCallList(Message response) {
10510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCM.getDataCallList(response);
10520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void updateServiceLocation() {
10550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST.enableSingleLocationUpdate();
10560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void enableLocationUpdates() {
10590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST.enableLocationUpdates();
10600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void disableLocationUpdates() {
10630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSST.disableLocationUpdates();
10640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getDataRoamingEnabled() {
10670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mDataConnectionTracker.getDataOnRoamingEnabled();
10680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setDataRoamingEnabled(boolean enable) {
10710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDataConnectionTracker.setDataOnRoamingEnabled(enable);
10720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Removes the given MMI from the pending list and notifies
10760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * registrants that it is complete.
10770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param mmi MMI that is done
10780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void
10800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    onMMIDone(GsmMmiCode mmi) {
10810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /* Only notify complete if it's on the pending list.
10820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * Otherwise, it's already been handled (eg, previously canceled).
10830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * The exception is cancellation of an incoming USSD-REQUEST, which is
10840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         * not on the list.
10850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville         */
10860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mPendingMMIs.remove(mmi) || mmi.isUssdRequest()) {
10870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mMmiCompleteRegistrants.notifyRegistrants(
10880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                new AsyncResult(null, mmi, null));
10890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void
10940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    onNetworkInitiatedUssd(GsmMmiCode mmi) {
10950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mMmiCompleteRegistrants.notifyRegistrants(
10960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            new AsyncResult(null, mmi, null));
10970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /** ussdMode is one of CommandsInterface.USSD_MODE_* */
11010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void
11020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    onIncomingUSSD (int ussdMode, String ussdMessage) {
11030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean isUssdError;
11040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean isUssdRequest;
11050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        isUssdRequest
11070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = (ussdMode == CommandsInterface.USSD_MODE_REQUEST);
11080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        isUssdError
11100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            = (ussdMode != CommandsInterface.USSD_MODE_NOTIFY
11110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                && ussdMode != CommandsInterface.USSD_MODE_REQUEST);
11120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // See comments in GsmMmiCode.java
11140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // USSD requests aren't finished until one
11150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // of these two events happen
11160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        GsmMmiCode found = null;
11170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0, s = mPendingMMIs.size() ; i < s; i++) {
11180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if(mPendingMMIs.get(i).isPendingUSSD()) {
11190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                found = mPendingMMIs.get(i);
11200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
11210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (found != null) {
11250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Complete pending USSD
11260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (isUssdError) {
11280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                found.onUssdFinishedError();
11290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
11300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                found.onUssdFinished(ussdMessage, isUssdRequest);
11310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else { // pending USSD not found
11330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // The network may initiate its own USSD request
11340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // ignore everything that isnt a Notify or a Request
11360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // also, discard if there is no message to present
11370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (!isUssdError && ussdMessage != null) {
11380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                GsmMmiCode mmi;
11390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mmi = GsmMmiCode.newNetworkInitiatedUssd(ussdMessage,
11400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                                   isUssdRequest,
1141e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                                                   GSMPhone.this,
1142e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                                                   mUiccApplication.get());
11430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                onNetworkInitiatedUssd(mmi);
11440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Make sure the network knows our preferred setting.
11500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
11510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected  void syncClirSetting() {
11520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
11530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int clirSetting = sp.getInt(CLIR_KEY, -1);
11540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (clirSetting >= 0) {
11550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mCM.setCLIR(clirSetting, null);
11560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
11600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void handleMessage (Message msg) {
11610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar;
11620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Message onComplete;
11630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (msg.what) {
11650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_RADIO_AVAILABLE: {
11660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mCM.getBasebandVersion(
11670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        obtainMessage(EVENT_GET_BASEBAND_VERSION_DONE));
11680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mCM.getIMEI(obtainMessage(EVENT_GET_IMEI_DONE));
11700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mCM.getIMEISV(obtainMessage(EVENT_GET_IMEISV_DONE));
11710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
11730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_RADIO_ON:
11750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
11760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_REGISTERED_TO_NETWORK:
11780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                syncClirSetting();
11790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
11800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_SIM_RECORDS_LOADED:
11820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                updateCurrentCarrierInProvider();
11830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Check if this is a different SIM than the previous one. If so unset the
11850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // voice mail number.
11860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String imsi = getVmSimImsi();
11870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String imsiFromSIM = getSubscriberId();
11880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (imsi != null && imsiFromSIM != null && !imsiFromSIM.equals(imsi)) {
11890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    storeVoiceMailNumber(null);
11900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    setVmSimImsi(null);
11910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
11920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
11940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_GET_BASEBAND_VERSION_DONE:
11960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
11970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception != null) {
11990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
12000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
12010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (LOCAL_DEBUG) Log.d(LOG_TAG, "Baseband version: " + ar.result);
12030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                setSystemProperty(PROPERTY_BASEBAND_VERSION, (String)ar.result);
12040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
12050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_GET_IMEI_DONE:
12070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
12080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception != null) {
12100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
12110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
12120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mImei = (String)ar.result;
12140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
12150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_GET_IMEISV_DONE:
12170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
12180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception != null) {
12200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    break;
12210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
12220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mImeiSv = (String)ar.result;
12240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
12250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_USSD:
12270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
12280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                String[] ussdResult = (String[]) ar.result;
12300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ussdResult.length > 1) {
12320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    try {
12330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        onIncomingUSSD(Integer.parseInt(ussdResult[0]), ussdResult[1]);
12340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } catch (NumberFormatException e) {
12350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        Log.w(LOG_TAG, "error parsing USSD");
12360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
12370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
12380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
12390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_RADIO_OFF_OR_NOT_AVAILABLE:
12410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Some MMI requests (eg USSD) are not completed
12420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // within the course of a CommandsInterface request
12430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // If the radio shuts off or resets while one of these
12440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // is pending, we need to clean up.
12450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                for (int i = mPendingMMIs.size() - 1; i >= 0; i--) {
12470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (mPendingMMIs.get(i).isPendingUSSD()) {
12480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        mPendingMMIs.get(i).onUssdFinishedError();
12490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
12500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
12510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
12520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_SSN:
12540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
12550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                SuppServiceNotification not = (SuppServiceNotification) ar.result;
12560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mSsnRegistrants.notifyRegistrants(ar);
12570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
12580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_SET_CALL_FORWARD_DONE:
12600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
1261e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                IccRecords r = mIccRecords.get();
1262e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                if (ar.exception == null && r != null) {
1263e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                    r.setVoiceCallForwardingFlag(1, msg.arg1 == 1);
12640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
12650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                onComplete = (Message) ar.userObj;
12660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (onComplete != null) {
12670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    AsyncResult.forMessage(onComplete, ar.result, ar.exception);
12680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    onComplete.sendToTarget();
12690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
12700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
12710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_SET_VM_NUMBER_DONE:
12730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
12740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (IccVmNotSupportedException.class.isInstance(ar.exception)) {
12750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    storeVoiceMailNumber(mVmNumber);
12760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ar.exception = null;
12770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
12780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                onComplete = (Message) ar.userObj;
12790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (onComplete != null) {
12800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    AsyncResult.forMessage(onComplete, ar.result, ar.exception);
12810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    onComplete.sendToTarget();
12820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
12830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
12840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_GET_CALL_FORWARD_DONE:
12870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
12880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception == null) {
12890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    handleCfuQueryResult((CallForwardInfo[])ar.result);
12900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
12910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                onComplete = (Message) ar.userObj;
12920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (onComplete != null) {
12930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    AsyncResult.forMessage(onComplete, ar.result, ar.exception);
12940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    onComplete.sendToTarget();
12950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
12960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
12970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_NEW_ICC_SMS:
12990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
13000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mSMS.dispatchMessage((SmsMessage)ar.result);
13010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
13020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_SET_NETWORK_AUTOMATIC:
13040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
13050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                setNetworkSelectionModeAutomatic((Message)ar.result);
13060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
13070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_ICC_RECORD_EVENTS:
13090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
13100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                processIccRecordEvents((Integer)ar.result);
13110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
13120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // handle the select network completion callbacks.
13140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_SET_NETWORK_MANUAL_COMPLETE:
13150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_SET_NETWORK_AUTOMATIC_COMPLETE:
13160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                handleSetSelectNetwork((AsyncResult) msg.obj);
13170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
13180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_SET_CLIR_COMPLETE:
13200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
13210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception == null) {
13220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    saveClirSetting(msg.arg1);
13230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
13240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                onComplete = (Message) ar.userObj;
13250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (onComplete != null) {
13260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    AsyncResult.forMessage(onComplete, ar.result, ar.exception);
13270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    onComplete.sendToTarget();
13280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
13290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
13300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville             default:
13320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                 super.handleMessage(msg);
13330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
13340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1336e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    @Override
1337e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    protected void onUpdateIccAvailability() {
1338e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        if (mUiccController == null ) {
1339e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            return;
1340e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        }
1341e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
1342e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        UiccCardApplication newUiccApplication =
1343e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccController.getUiccCardApplication(UiccController.APP_FAM_3GPP);
1344e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
1345e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        UiccCardApplication app = mUiccApplication.get();
1346e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka        if (app != newUiccApplication) {
1347e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (app != null) {
1348e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                if (LOCAL_DEBUG) log("Removing stale icc objects.");
1349e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                if (mIccRecords.get() != null) {
1350e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                    unregisterForSimRecordEvents();
1351e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                    mSimPhoneBookIntManager.updateIccRecords(null);
1352e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                }
1353e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                mIccRecords.set(null);
1354e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplication.set(null);
1355e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            }
1356e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka            if (newUiccApplication != null) {
1357e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                if (LOCAL_DEBUG) log("New Uicc application found");
1358e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mUiccApplication.set(newUiccApplication);
1359e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka                mIccRecords.set(newUiccApplication.getIccRecords());
1360e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                registerForSimRecordEvents();
1361e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                mSimPhoneBookIntManager.updateIccRecords(mIccRecords.get());
1362e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            }
1363e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        }
1364e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    }
1365e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
13660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void processIccRecordEvents(int eventCode) {
13670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (eventCode) {
1368e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            case IccRecords.EVENT_CFI:
13690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                notifyCallForwardingIndicator();
13700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
1371e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            case IccRecords.EVENT_MWI:
13720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                notifyMessageWaitingIndicator();
13730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
13740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
13750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville   /**
13780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Sets the "current" field in the telephony provider according to the SIM's operator
13790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
13800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true for success; false otherwise.
13810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
13820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean updateCurrentCarrierInProvider() {
1383e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
1384e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        if (r != null) {
13850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
13860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
13870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ContentValues map = new ContentValues();
1388e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                map.put(Telephony.Carriers.NUMERIC, r.getOperatorNumeric());
13890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                mContext.getContentResolver().insert(uri, map);
13900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return true;
13910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (SQLException e) {
13920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Log.e(LOG_TAG, "Can't store current operator", e);
13930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
13940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
13950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
13960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
13990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Used to track the settings upon completion of the network change.
14000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
14010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void handleSetSelectNetwork(AsyncResult ar) {
14020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // look for our wrapper within the asyncresult, skip the rest if it
14030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // is null.
14040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!(ar.userObj instanceof NetworkSelectMessage)) {
14050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (LOCAL_DEBUG) Log.d(LOG_TAG, "unexpected result from user object.");
14060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
14070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
14080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        NetworkSelectMessage nsm = (NetworkSelectMessage) ar.userObj;
14100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // found the object, now we send off the message we had originally
14120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // attached to the request.
14130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (nsm.message != null) {
14140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (LOCAL_DEBUG) Log.d(LOG_TAG, "sending original message to recipient");
14150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            AsyncResult.forMessage(nsm.message, ar.result, ar.exception);
14160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            nsm.message.sendToTarget();
14170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
14180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // open the shared preferences editor, and write the value.
14200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // nsm.operatorNumeric is "" if we're in automatic.selection.
14210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
14220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences.Editor editor = sp.edit();
14230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        editor.putString(NETWORK_SELECTION_KEY, nsm.operatorNumeric);
14240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        editor.putString(NETWORK_SELECTION_NAME_KEY, nsm.operatorAlphaLong);
14250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // commit and log the result.
14270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (! editor.commit()) {
14280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Log.e(LOG_TAG, "failed to commit network selection preference");
14290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
14300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
14340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Saves CLIR setting so that we can re-apply it as necessary
14350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * (in case the RIL resets it across reboots).
14360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
14370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void saveClirSetting(int commandInterfaceCLIRMode) {
14380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // open the shared preferences editor, and write the value.
14390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
14400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        SharedPreferences.Editor editor = sp.edit();
14410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        editor.putInt(CLIR_KEY, commandInterfaceCLIRMode);
14420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // commit and log the result.
14440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (! editor.commit()) {
14450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Log.e(LOG_TAG, "failed to commit CLIR preference");
14460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
14470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void handleCfuQueryResult(CallForwardInfo[] infos) {
1450e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
1451e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        if (r != null) {
1452e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            if (infos == null || infos.length == 0) {
1453e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                // Assume the default is not active
1454e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                // Set unconditional CFF in SIM to false
1455e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                r.setVoiceCallForwardingFlag(1, false);
1456e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            } else {
1457e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                for (int i = 0, s = infos.length; i < s; i++) {
1458e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                    if ((infos[i].serviceClass & SERVICE_CLASS_VOICE) != 0) {
1459e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                        r.setVoiceCallForwardingFlag(1, (infos[i].status == 1));
1460e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                        // should only have the one
1461e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                        break;
1462e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka                    }
14630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
14640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
14650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
14660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
14690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Retrieves the PhoneSubInfo of the GSMPhone
14700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
14710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneSubInfo getPhoneSubInfo(){
14720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSubInfo;
14730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
14760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Retrieves the IccSmsInterfaceManager of the GSMPhone
14770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
14780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public IccSmsInterfaceManager getIccSmsInterfaceManager(){
14790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSimSmsIntManager;
14800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
14830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Retrieves the IccPhoneBookInterfaceManager of the GSMPhone
14840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
14850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public IccPhoneBookInterfaceManager getIccPhoneBookInterfaceManager(){
14860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mSimPhoneBookIntManager;
14870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
14900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Activate or deactivate cell broadcast SMS.
14910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
14920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param activate 0 = activate, 1 = deactivate
14930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param response Callback message is empty on completion
14940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
14950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void activateCellBroadcastSms(int activate, Message response) {
14960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "[GSMPhone] activateCellBroadcastSms() is obsolete; use SmsManager");
14970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        response.sendToTarget();
14980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
14990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Query the current configuration of cdma cell broadcast SMS.
15020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
15030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param response Callback message is empty on completion
15040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
15050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getCellBroadcastSmsConfig(Message response) {
15060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "[GSMPhone] getCellBroadcastSmsConfig() is obsolete; use SmsManager");
15070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        response.sendToTarget();
15080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Configure cdma cell broadcast SMS.
15120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
15130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @param response Callback message is empty on completion
15140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
15150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setCellBroadcastSmsConfig(int[] configValuesArray, Message response) {
15160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "[GSMPhone] setCellBroadcastSmsConfig() is obsolete; use SmsManager");
15170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        response.sendToTarget();
15180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isCspPlmnEnabled() {
1521e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
1522e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        return (r != null) ? r.isCspPlmnEnabled() : false;
15230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void registerForSimRecordEvents() {
1526e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
1527e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        if (r == null) {
1528e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            return;
1529e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        }
1530e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        r.registerForNetworkSelectionModeAutomatic(
15310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                this, EVENT_SET_NETWORK_AUTOMATIC, null);
1532e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        r.registerForNewSms(this, EVENT_NEW_ICC_SMS, null);
1533e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        r.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null);
1534e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        r.registerForRecordsLoaded(this, EVENT_SIM_RECORDS_LOADED, null);
15350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void unregisterForSimRecordEvents() {
1538e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        IccRecords r = mIccRecords.get();
1539e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        if (r == null) {
1540e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka            return;
1541e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        }
1542e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        r.unregisterForNetworkSelectionModeAutomatic(this);
1543e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        r.unregisterForNewSms(this);
1544e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        r.unregisterForRecordsEvents(this);
1545e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        r.unregisterForRecordsLoaded(this);
15460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
15490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
15500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println("GSMPhone extends:");
15510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.dump(fd, pw, args);
15520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mCT=" + mCT);
15530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mSST=" + mSST);
15540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mPendingMMIs=" + mPendingMMIs);
15550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mSimPhoneBookIntManager=" + mSimPhoneBookIntManager);
15560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mSimSmsIntManager=" + mSimSmsIntManager);
15570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mSubInfo=" + mSubInfo);
15580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (VDBG) pw.println(" mImei=" + mImei);
15590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (VDBG) pw.println(" mImeiSv=" + mImeiSv);
15600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mVmNumber=" + mVmNumber);
15610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1562e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
1563e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    protected void log(String s) {
1564e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka        Log.d(LOG_TAG, "[GSMPhone] " + s);
1565e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    }
15660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
1567