19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.telephony.gsm;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.SharedPreferences;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.SQLException;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.AsyncResult;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Registrant;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RegistrantList;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemProperties;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.preference.PreferenceManager;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Telephony;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.CellLocation;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.PhoneNumberUtils;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.ServiceState;
35e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
369d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Savilleimport com.android.internal.telephony.CallTracker;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_DISABLE;
41767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_ENABLE;
42767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_ERASURE;
43767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_REGISTRATION;
44767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_ALL;
45767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_ALL_CONDITIONAL;
46767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_NO_REPLY;
47767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_NOT_REACHABLE;
48767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_BUSY;
49767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDITIONAL;
50767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_VOICE;
51767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_BASEBAND_VERSION;
52767a662ecde33c3979bf02b793d392aca0403162Wink Saville
53a27353c1965911f69be8d02a01b15389189eab9dAlex Yakavenkaimport com.android.internal.telephony.cat.CatService;
541c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganeshimport com.android.internal.telephony.Call;
55767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.CallForwardInfo;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.CallStateException;
57767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.CommandsInterface;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.Connection;
59e7af59b375f08b13d964816fc52048e670764bdbAlex Yakavenkaimport com.android.internal.telephony.IccCard;
60767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccFileHandler;
61767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccPhoneBookInterfaceManager;
62767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccSmsInterfaceManager;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.MmiCode;
643caa1bd1061df4029951e68d0a04d5e30928701fRobert Greenwaltimport com.android.internal.telephony.OperatorInfo;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.Phone;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.PhoneBase;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.PhoneNotifier;
68767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.PhoneProxy;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.PhoneSubInfo;
709bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganeshimport com.android.internal.telephony.TelephonyProperties;
7124440cf8a9431291bdcaa77b418e6c4715932507Naveen Kallaimport com.android.internal.telephony.UUSInfo;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.test.SimulatedRadioControl;
7322c1700378667c1f25974b134cc201663ac2c29eWink Savilleimport com.android.internal.telephony.uicc.UiccController;
74767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccVmNotSupportedException;
759d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Savilleimport com.android.internal.telephony.ServiceStateTracker;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7730ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Savilleimport java.io.FileDescriptor;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
7930ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Savilleimport java.io.PrintWriter;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.InetSocketAddress;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.ServerSocket;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.Socket;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class GSMPhone extends PhoneBase {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // NOTE that LOG_TAG here is "GSM", which means that log messages
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // from this file will go into the radio log rather than the main
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // log.  (Use "adb logcat -b radio" to see them.)
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final String LOG_TAG = "GSM";
94767a662ecde33c3979bf02b793d392aca0403162Wink Saville    private static final boolean LOCAL_DEBUG = true;
9530ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville    private static final boolean VDBG = false; /* STOP SHIP if true */
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Key used to read/write current ciphering state
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String CIPHERING_KEY = "ciphering_key";
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Key used to read/write voice mail number
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String VM_NUMBER = "vm_number_key";
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Key used to read/write the SIM IMSI used for storing the voice mail
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String VM_SIM_IMSI = "vm_sim_imsi_key";
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
104a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville    // Instance Variables
105767a662ecde33c3979bf02b793d392aca0403162Wink Saville    GsmCallTracker mCT;
106767a662ecde33c3979bf02b793d392aca0403162Wink Saville    GsmServiceStateTracker mSST;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList <GsmMmiCode> mPendingMMIs = new ArrayList<GsmMmiCode>();
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SimPhoneBookInterfaceManager mSimPhoneBookIntManager;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SimSmsInterfaceManager mSimSmsIntManager;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PhoneSubInfo mSubInfo;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Registrant mPostDialHandler;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** List of Registrants to receive Supplementary Service Notifications. */
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    RegistrantList mSsnRegistrants = new RegistrantList();
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Thread debugPortThread;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ServerSocket debugSocket;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mImei;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mImeiSv;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mVmNumber;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
126a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville    // Constructors
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public
129767a662ecde33c3979bf02b793d392aca0403162Wink Saville    GSMPhone (Context context, CommandsInterface ci, PhoneNotifier notifier) {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context,ci,notifier, false);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public
134767a662ecde33c3979bf02b793d392aca0403162Wink Saville    GSMPhone (Context context, CommandsInterface ci, PhoneNotifier notifier, boolean unitTestMode) {
135a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        super(notifier, context, ci, unitTestMode);
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ci instanceof SimulatedRadioControl) {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSimulatedRadioControl = (SimulatedRadioControl) ci;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
140ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville
1413cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink        mCM.setPhoneType(Phone.PHONE_TYPE_GSM);
142ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccCard.set(UiccController.getInstance(this).getIccCard());
143ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords = mIccCard.get().getIccRecords();
144767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT = new GsmCallTracker(this);
145767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSST = new GsmServiceStateTracker (this);
146b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mSMS = new GsmSMSDispatcher(this, mSmsStorageMonitor, mSmsUsageMonitor);
14763edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt        mDataConnectionTracker = new GsmDataConnectionTracker (this);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!unitTestMode) {
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSimPhoneBookIntManager = new SimPhoneBookInterfaceManager(this);
150bb3716332321e22537a5015be13e2229fb9b90bcJake Hamby            mSimSmsIntManager = new SimSmsInterfaceManager(this, mSMS);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSubInfo = new PhoneSubInfo(this);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
153767a662ecde33c3979bf02b793d392aca0403162Wink Saville
154a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.registerForAvailable(this, EVENT_RADIO_AVAILABLE, null);
155ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        registerForSimRecordEvents();
156a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
157a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.registerForOn(this, EVENT_RADIO_ON, null);
158a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.setOnUSSD(this, EVENT_USSD, null);
159a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        mCM.setOnSuppServiceNotification(this, EVENT_SSN, null);
16088d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt        mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null);
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (false) {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //debugSocket = new LocalServerSocket("com.android.internal.telephony.debug");
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                debugSocket = new ServerSocket();
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                debugSocket.setReuseAddress(true);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                debugSocket.bind (new InetSocketAddress("127.0.0.1", 6666));
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                debugPortThread
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    = new Thread(
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        new Runnable() {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            public void run() {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                for(;;) {
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    try {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        Socket sock;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        sock = debugSocket.accept();
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        Log.i(LOG_TAG, "New connection; resetting radio");
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        mCM.resetRadio(null);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        sock.close();
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    } catch (IOException ex) {
181767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                        Log.w(LOG_TAG,
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            "Exception accepting socket", ex);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        },
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "GSMPhone debug");
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                debugPortThread.start();
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IOException ex) {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(LOG_TAG, "Failure to open com.android.internal.telephony.debug socket", ex);
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
195767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1969bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        //Change the system property
1979bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        SystemProperties.set(TelephonyProperties.CURRENT_ACTIVE_PHONE,
1983cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink                new Integer(Phone.PHONE_TYPE_GSM).toString());
199767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
200767a662ecde33c3979bf02b793d392aca0403162Wink Saville
201b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    @Override
202767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void dispose() {
203767a662ecde33c3979bf02b793d392aca0403162Wink Saville        synchronized(PhoneProxy.lockForRadioTechnologyChange) {
204a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            super.dispose();
205a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville
206767a662ecde33c3979bf02b793d392aca0403162Wink Saville            //Unregister from all former registered events
207a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            mCM.unregisterForAvailable(this); //EVENT_RADIO_AVAILABLE
20880198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka            unregisterForSimRecordEvents();
209a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            mCM.unregisterForOffOrNotAvailable(this); //EVENT_RADIO_OFF_OR_NOT_AVAILABLE
210a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            mCM.unregisterForOn(this); //EVENT_RADIO_ON
21188d852969a0ffd2ce228defe96ecae0173574f55Robert Greenwalt            mSST.unregisterForNetworkAttached(this); //EVENT_REGISTERED_TO_NETWORK
212a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            mCM.unSetOnUSSD(this);
213a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            mCM.unSetOnSuppServiceNotification(this);
214767a662ecde33c3979bf02b793d392aca0403162Wink Saville
215767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mPendingMMIs.clear();
216767a662ecde33c3979bf02b793d392aca0403162Wink Saville
217767a662ecde33c3979bf02b793d392aca0403162Wink Saville            //Force all referenced classes to unregister their former registered events
218767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCT.dispose();
21963edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt            mDataConnectionTracker.dispose();
220767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSST.dispose();
221767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSimPhoneBookIntManager.dispose();
222767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSimSmsIntManager.dispose();
223767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSubInfo.dispose();
224767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
226767a662ecde33c3979bf02b793d392aca0403162Wink Saville
227b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby    @Override
228767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void removeReferences() {
229b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        Log.d(LOG_TAG, "removeReferences");
230b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mSimulatedRadioControl = null;
231b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mSimPhoneBookIntManager = null;
232b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mSimSmsIntManager = null;
233b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mSubInfo = null;
234b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mCT = null;
235b7945cae5ad0feaad09378d0db77f2b3105e5235Jake Hamby        mSST = null;
236ce2dcb6f1358398eef9ccffccd0c0a309238f7a4Alex Yakavenka        super.removeReferences();
237767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
238767a662ecde33c3979bf02b793d392aca0403162Wink Saville
239767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected void finalize() {
240767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if(LOCAL_DEBUG) Log.d(LOG_TAG, "GSMPhone finalized");
241767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
242767a662ecde33c3979bf02b793d392aca0403162Wink Saville
243767a662ecde33c3979bf02b793d392aca0403162Wink Saville
244767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public ServiceState
245767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getServiceState() {
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSST.ss;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CellLocation getCellLocation() {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSST.cellLoc;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2533cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink    public Phone.State getState() {
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCT.state;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2573cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink    public String getPhoneName() {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "GSM";
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2613cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink    public int getPhoneType() {
2623cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink        return Phone.PHONE_TYPE_GSM;
2633cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink    }
2643cc97f8dbc22eff56f17f30e1633084af507eff4Tammo Spalink
265e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public SignalStrength getSignalStrength() {
266e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        return mSST.mSignalStrength;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public CallTracker getCallTracker() {
2709d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        return mCT;
2719d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
2729d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
2739d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public ServiceStateTracker getServiceStateTracker() {
2749d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville        return mSST;
2759d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    }
2769d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public List<? extends MmiCode>
278767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getPendingMmiCodes() {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPendingMMIs;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28202648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt    public DataState getDataConnectionState(String apnType) {
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DataState ret = DataState.DISCONNECTED;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28582583b8312403ed734c30b161750d40c26086ee2Elliott Hughes        if (mSST == null) {
28644038aa032ffd876f3c9b20a84db9d189f77e18eWink Saville            // Radio Technology Change is ongoning, dispose() and removeReferences() have
28744038aa032ffd876f3c9b20a84db9d189f77e18eWink Saville            // already been called
28844038aa032ffd876f3c9b20a84db9d189f77e18eWink Saville
28944038aa032ffd876f3c9b20a84db9d189f77e18eWink Saville            ret = DataState.DISCONNECTED;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mSST.getCurrentGprsState()
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                != ServiceState.STATE_IN_SERVICE) {
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we're out of service, open TCP sockets may still work
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // but no data will flow
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret = DataState.DISCONNECTED;
29563edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt        } else if (mDataConnectionTracker.isApnTypeEnabled(apnType) == false ||
29663edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt                mDataConnectionTracker.isApnTypeActive(apnType) == false) {
2972e994586ed0aa09f93951dbc4de35d56a93abe95Kazuhiro Ondo            //TODO: isApnTypeActive() is just checking whether ApnContext holds
2982e994586ed0aa09f93951dbc4de35d56a93abe95Kazuhiro Ondo            //      Dataconnection or not. Checking each ApnState below should
2992e994586ed0aa09f93951dbc4de35d56a93abe95Kazuhiro Ondo            //      provide the same state. Calling isApnTypeActive() can be removed.
30002648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt            ret = DataState.DISCONNECTED;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else { /* mSST.gprsState == ServiceState.STATE_IN_SERVICE */
30263edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt            switch (mDataConnectionTracker.getState(apnType)) {
303767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case FAILED:
304767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case IDLE:
305767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataState.DISCONNECTED;
306767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
308767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case CONNECTED:
309767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DISCONNECTING:
310767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    if ( mCT.state != Phone.State.IDLE
3119d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville                            && !mSST.isConcurrentVoiceAndDataAllowed()) {
312767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        ret = DataState.SUSPENDED;
313767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    } else {
314767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        ret = DataState.CONNECTED;
315767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    }
316767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
318767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case INITING:
319767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case CONNECTING:
320767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case SCANNING:
321767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataState.CONNECTING;
322767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ret;
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public DataActivityState getDataActivityState() {
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DataActivityState ret = DataActivityState.NONE;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSST.getCurrentGprsState() == ServiceState.STATE_IN_SERVICE) {
33363edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt            switch (mDataConnectionTracker.getActivity()) {
334767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAIN:
335767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAIN;
336767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
338767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAOUT:
339767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAOUT;
340767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
342767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAINANDOUT:
343767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAINANDOUT;
344767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ret;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3521c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh     * Notify any interested party of a Phone state change {@link Phone.State}
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void notifyPhoneStateChanged() {
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNotifier.notifyPhoneState(this);
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3591c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh     * Notify registrants of a change in the call state. This notifies changes in {@link Call.State}
3601c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh     * Use this when changes in the precise call state are needed, else use notifyPhoneStateChanged.
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3621c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh    /*package*/ void notifyPreciseCallStateChanged() {
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* we'd love it if this was package-scoped*/
3641c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh        super.notifyPreciseCallStateChangedP();
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void
368767a662ecde33c3979bf02b793d392aca0403162Wink Saville    notifyNewRingingConnection(Connection c) {
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* we'd love it if this was package-scoped*/
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.notifyNewRingingConnectionP(c);
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void
374767a662ecde33c3979bf02b793d392aca0403162Wink Saville    notifyDisconnect(Connection cn) {
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDisconnectRegistrants.notifyResult(cn);
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void notifyUnknownConnection() {
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnknownConnectionRegistrants.notifyResult(this);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
381767a662ecde33c3979bf02b793d392aca0403162Wink Saville
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void notifySuppServiceFailed(SuppService code) {
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSuppServiceFailedRegistrants.notifyResult(code);
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void
387767a662ecde33c3979bf02b793d392aca0403162Wink Saville    notifyServiceStateChanged(ServiceState ss) {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.notifyServiceStateChangedP(ss);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void notifyLocationChanged() {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNotifier.notifyCellLocation(this);
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void
397767a662ecde33c3979bf02b793d392aca0403162Wink Saville    notifySignalStrength() {
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNotifier.notifySignalStrength(this);
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4019d7d62801ddb206d2ea96d74864a9edfe54d2eeeWink Saville    public void
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    notifyCallForwardingIndicator() {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNotifier.notifyCallForwardingChanged(this);
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
406767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // override for allowing access from other classes of this package
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
408767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * {@inheritDoc}
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
410767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public final void
411767a662ecde33c3979bf02b793d392aca0403162Wink Saville    setSystemProperty(String property, String value) {
412767a662ecde33c3979bf02b793d392aca0403162Wink Saville        super.setSystemProperty(property, value);
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void registerForSuppServiceNotification(
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler h, int what, Object obj) {
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSsnRegistrants.addUnique(h, what, obj);
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSsnRegistrants.size() == 1) mCM.setSuppServiceNotifications(true, null);
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterForSuppServiceNotification(Handler h) {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSsnRegistrants.remove(h);
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSsnRegistrants.size() == 0) mCM.setSuppServiceNotifications(false, null);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
426767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
427767a662ecde33c3979bf02b793d392aca0403162Wink Saville    acceptCall() throws CallStateException {
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCT.acceptCall();
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
431767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
432767a662ecde33c3979bf02b793d392aca0403162Wink Saville    rejectCall() throws CallStateException {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCT.rejectCall();
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void
437767a662ecde33c3979bf02b793d392aca0403162Wink Saville    switchHoldingAndActive() throws CallStateException {
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCT.switchWaitingOrHoldingAndActive();
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
441767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean canConference() {
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCT.canConference();
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
445767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean canDial() {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCT.canDial();
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void conference() throws CallStateException {
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCT.conference();
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
453767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void clearDisconnected() {
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCT.clearDisconnected();
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
457767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean canTransfer() {
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCT.canTransfer();
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
461767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void explicitCallTransfer() throws CallStateException {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCT.explicitCallTransfer();
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
465767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public GsmCall
466767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getForegroundCall() {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCT.foregroundCall;
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
470767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public GsmCall
471767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getBackgroundCall() {
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCT.backgroundCall;
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
475767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public GsmCall
476767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getRingingCall() {
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCT.ringingCall;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean handleCallDeflectionIncallSupplementaryService(
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String dialString) throws CallStateException {
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dialString.length() > 1) {
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
486767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (getRingingCall().getState() != GsmCall.State.IDLE) {
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 0: rejectCall");
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCT.rejectCall();
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (CallStateException e) {
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_DEBUG) Log.d(LOG_TAG,
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "reject failed", e);
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifySuppServiceFailed(Phone.SuppService.REJECT);
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
495767a662ecde33c3979bf02b793d392aca0403162Wink Saville        } else if (getBackgroundCall().getState() != GsmCall.State.IDLE) {
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG,
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "MmiCode 0: hangupWaitingOrBackground");
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCT.hangupWaitingOrBackground();
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean handleCallWaitingIncallSupplementaryService(
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String dialString) throws CallStateException {
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int len = dialString.length();
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (len > 2) {
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
512767a662ecde33c3979bf02b793d392aca0403162Wink Saville        GsmCall call = (GsmCall) getForegroundCall();
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (len > 1) {
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                char ch = dialString.charAt(1);
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int callIndex = ch - '0';
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (callIndex >= 1 && callIndex <= GsmCallTracker.MAX_CONNECTIONS) {
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "MmiCode 1: hangupConnectionByIndex " +
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            callIndex);
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCT.hangupConnectionByIndex(call, callIndex);
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
526767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (call.getState() != GsmCall.State.IDLE) {
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "MmiCode 1: hangup foreground");
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    //mCT.hangupForegroundResumeBackground();
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCT.hangup(call);
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "MmiCode 1: switchWaitingOrHoldingAndActive");
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCT.switchWaitingOrHoldingAndActive();
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CallStateException e) {
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG,
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "hangup failed", e);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            notifySuppServiceFailed(Phone.SuppService.HANGUP);
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean handleCallHoldIncallSupplementaryService(String dialString)
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws CallStateException {
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int len = dialString.length();
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (len > 2) {
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
554767a662ecde33c3979bf02b793d392aca0403162Wink Saville        GsmCall call = (GsmCall) getForegroundCall();
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (len > 1) {
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                char ch = dialString.charAt(1);
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int callIndex = ch - '0';
560767a662ecde33c3979bf02b793d392aca0403162Wink Saville                GsmConnection conn = mCT.getConnectionByIndex(call, callIndex);
561767a662ecde33c3979bf02b793d392aca0403162Wink Saville
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // gsm index starts at 1, up to 5 connections in a call,
563767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (conn != null && callIndex >= 1 && callIndex <= GsmCallTracker.MAX_CONNECTIONS) {
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 2: separate call "+
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            callIndex);
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCT.separate(conn);
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG, "separate: invalid call index "+
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            callIndex);
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    notifySuppServiceFailed(Phone.SuppService.SEPARATE);
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (CallStateException e) {
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_DEBUG) Log.d(LOG_TAG,
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "separate failed", e);
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifySuppServiceFailed(Phone.SuppService.SEPARATE);
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
579767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (getRingingCall().getState() != GsmCall.State.IDLE) {
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "MmiCode 2: accept ringing call");
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCT.acceptCall();
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "MmiCode 2: switchWaitingOrHoldingAndActive");
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCT.switchWaitingOrHoldingAndActive();
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (CallStateException e) {
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_DEBUG) Log.d(LOG_TAG,
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "switch failed", e);
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifySuppServiceFailed(Phone.SuppService.SWITCH);
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean handleMultipartyIncallSupplementaryService(
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String dialString) throws CallStateException {
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dialString.length() > 1) {
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 3: merge calls");
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            conference();
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CallStateException e) {
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG,
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "conference failed", e);
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            notifySuppServiceFailed(Phone.SuppService.CONFERENCE);
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean handleEctIncallSupplementaryService(String dialString)
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws CallStateException {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int len = dialString.length();
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (len != 1) {
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 4: explicit call transfer");
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            explicitCallTransfer();
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CallStateException e) {
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG,
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "transfer failed", e);
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            notifySuppServiceFailed(Phone.SuppService.TRANSFER);
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean handleCcbsIncallSupplementaryService(String dialString)
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws CallStateException {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dialString.length() > 1) {
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.i(LOG_TAG, "MmiCode 5: CCBS not supported!");
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Treat it as an "unknown" service.
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        notifySuppServiceFailed(Phone.SuppService.UNKNOWN);
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean handleInCallMmiCommands(String dialString)
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws CallStateException {
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isInCall()) {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TextUtils.isEmpty(dialString)) {
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean result = false;
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char ch = dialString.charAt(0);
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (ch) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '0':
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = handleCallDeflectionIncallSupplementaryService(
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dialString);
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '1':
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = handleCallWaitingIncallSupplementaryService(
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dialString);
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '2':
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = handleCallHoldIncallSupplementaryService(dialString);
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '3':
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = handleMultipartyIncallSupplementaryService(dialString);
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '4':
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = handleEctIncallSupplementaryService(dialString);
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '5':
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = handleCcbsIncallSupplementaryService(dialString);
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean isInCall() {
688767a662ecde33c3979bf02b793d392aca0403162Wink Saville        GsmCall.State foregroundCallState = getForegroundCall().getState();
689767a662ecde33c3979bf02b793d392aca0403162Wink Saville        GsmCall.State backgroundCallState = getBackgroundCall().getState();
690767a662ecde33c3979bf02b793d392aca0403162Wink Saville        GsmCall.State ringingCallState = getRingingCall().getState();
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       return (foregroundCallState.isAlive() ||
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                backgroundCallState.isAlive() ||
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ringingCallState.isAlive());
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Connection
69824440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla    dial(String dialString) throws CallStateException {
69924440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla        return dial(dialString, null);
70024440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla    }
70124440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla
70224440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla    public Connection
70324440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla    dial (String dialString, UUSInfo uusInfo) throws CallStateException {
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Need to make sure dialString gets parsed properly
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String newDialString = PhoneNumberUtils.stripSeparators(dialString);
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // handle in-call MMI first if applicable
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (handleInCallMmiCommands(newDialString)) {
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Only look at the Network portion for mmi
7139e534153264138cfee383c626db92b934fafc1afTammo Spalink        String networkPortion = PhoneNumberUtils.extractNetworkPortionAlt(newDialString);
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GsmMmiCode mmi = GsmMmiCode.newFromDialString(networkPortion, this);
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (LOCAL_DEBUG) Log.d(LOG_TAG,
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                               "dialing w/ mmi '" + mmi + "'...");
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mmi == null) {
71924440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla            return mCT.dial(newDialString, uusInfo);
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mmi.isTemporaryModeCLIR()) {
72124440cf8a9431291bdcaa77b418e6c4715932507Naveen Kalla            return mCT.dial(mmi.dialingNumber, mmi.getCLIRMode(), uusInfo);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPendingMMIs.add(mmi);
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mmi.processCode();
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // FIXME should this return null or something else?
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean handlePinMmi(String dialString) {
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GsmMmiCode mmi = GsmMmiCode.newFromDialString(dialString, this);
734767a662ecde33c3979bf02b793d392aca0403162Wink Saville
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mmi != null && mmi.isPinCommand()) {
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPendingMMIs.add(mmi);
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mmi.processCode();
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
741767a662ecde33c3979bf02b793d392aca0403162Wink Saville
742767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendUssdResponse(String ussdMessge) {
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GsmMmiCode mmi = GsmMmiCode.newFromUssdUserInput(ussdMessge, this);
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPendingMMIs.add(mmi);
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mmi.sendUssd(ussdMessge);
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
751767a662ecde33c3979bf02b793d392aca0403162Wink Saville
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sendDtmf(char c) {
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!PhoneNumberUtils.is12Key(c)) {
755767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Log.e(LOG_TAG,
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "sendDtmf called with invalid character '" + c + "'");
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCT.state ==  Phone.State.OFFHOOK) {
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCM.sendDtmf(c, null);
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    startDtmf(char c) {
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!PhoneNumberUtils.is12Key(c)) {
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(LOG_TAG,
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "startDtmf called with invalid character '" + c + "'");
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCM.startDtmf(c, null);
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    stopDtmf() {
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.stopDtmf(null);
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void
780e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    sendBurstDtmf(String dtmfString) {
781e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        Log.e(LOG_TAG, "[GSMPhone] sendBurstDtmf() is a CDMA method");
782e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
783e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
784e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    setRadioPower(boolean power) {
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSST.setRadioPower(power);
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void storeVoiceMailNumber(String number) {
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences.Editor editor = sp.edit();
7929bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        editor.putString(VM_NUMBER, number);
793fa8e271636b9e9b86f247cdb4c91d9ebe9675c27Brad Fitzpatrick        editor.apply();
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setVmSimImsi(getSubscriberId());
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getVoiceMailNumber() {
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Read from the SIM. If its null, try reading from the shared preference area.
799ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        String number = mIccRecords.getVoiceMailNumber();
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TextUtils.isEmpty(number)) {
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            number = sp.getString(VM_NUMBER, null);
8039bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        }
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return number;
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8069bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String getVmSimImsi() {
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sp.getString(VM_SIM_IMSI, null);
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void setVmSimImsi(String imsi) {
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences.Editor editor = sp.edit();
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        editor.putString(VM_SIM_IMSI, imsi);
816fa8e271636b9e9b86f247cdb4c91d9ebe9675c27Brad Fitzpatrick        editor.apply();
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8189bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getVoiceMailAlphaTag() {
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String ret;
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
822ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        ret = mIccRecords.getVoiceMailAlphaTag();
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ret == null || ret.length() == 0) {
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mContext.getText(
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.string.defaultVoiceMailAlphaTag).toString();
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return ret;
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getDeviceId() {
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mImei;
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getDeviceSvn() {
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mImeiSv;
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8402ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang    public String getImei() {
8412ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang        return mImei;
8422ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang    }
8432ea7e443b27ff185104b8a8b5e7a08b5510125bdJohn Wang
844767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getEsn() {
845767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "[GSMPhone] getEsn() is a CDMA method");
846767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return "0";
847767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
848767a662ecde33c3979bf02b793d392aca0403162Wink Saville
849767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getMeid() {
850767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "[GSMPhone] getMeid() is a CDMA method");
851767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return "0";
852767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
853767a662ecde33c3979bf02b793d392aca0403162Wink Saville
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getSubscriberId() {
855ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        return mIccRecords.getIMSI();
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getLine1Number() {
859ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        return mIccRecords.getMsisdnNumber();
8605d39ec4a37de500ada84225f8bd2c244db0cd287Jake Hamby    }
8615d39ec4a37de500ada84225f8bd2c244db0cd287Jake Hamby
8625d39ec4a37de500ada84225f8bd2c244db0cd287Jake Hamby    @Override
8635d39ec4a37de500ada84225f8bd2c244db0cd287Jake Hamby    public String getMsisdn() {
864ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        return mIccRecords.getMsisdnNumber();
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getLine1AlphaTag() {
868ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        return mIccRecords.getMsisdnAlphaTag();
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setLine1Number(String alphaTag, String number, Message onComplete) {
872ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.setMsisdnNumber(alphaTag, number, onComplete);
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setVoiceMailNumber(String alphaTag,
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            String voiceMailNumber,
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Message onComplete) {
8789bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
8799bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        Message resp;
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mVmNumber = voiceMailNumber;
881a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        resp = obtainMessage(EVENT_SET_VM_NUMBER_DONE, 0, 0, onComplete);
882ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.setVoiceMailNumber(alphaTag, mVmNumber, resp);
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8849bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean isValidCommandInterfaceCFReason (int commandInterfaceCFReason) {
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (commandInterfaceCFReason) {
887767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_REASON_UNCONDITIONAL:
888767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_REASON_BUSY:
889767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_REASON_NO_REPLY:
890767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_REASON_NOT_REACHABLE:
891767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_REASON_ALL:
892767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_REASON_ALL_CONDITIONAL:
893767a662ecde33c3979bf02b793d392aca0403162Wink Saville            return true;
894767a662ecde33c3979bf02b793d392aca0403162Wink Saville        default:
895767a662ecde33c3979bf02b793d392aca0403162Wink Saville            return false;
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean isValidCommandInterfaceCFAction (int commandInterfaceCFAction) {
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (commandInterfaceCFAction) {
901767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_ACTION_DISABLE:
902767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_ACTION_ENABLE:
903767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_ACTION_REGISTRATION:
904767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_ACTION_ERASURE:
905767a662ecde33c3979bf02b793d392aca0403162Wink Saville            return true;
906767a662ecde33c3979bf02b793d392aca0403162Wink Saville        default:
907767a662ecde33c3979bf02b793d392aca0403162Wink Saville            return false;
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
910767a662ecde33c3979bf02b793d392aca0403162Wink Saville
911767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected  boolean isCfEnable(int action) {
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (action == CF_ACTION_ENABLE) || (action == CF_ACTION_REGISTRATION);
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
914767a662ecde33c3979bf02b793d392aca0403162Wink Saville
915767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getCallForwardingOption(int commandInterfaceCFReason, Message onComplete) {
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isValidCommandInterfaceCFReason(commandInterfaceCFReason)) {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG, "requesting call forwarding query.");
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message resp;
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (commandInterfaceCFReason == CF_REASON_UNCONDITIONAL) {
920a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                resp = obtainMessage(EVENT_GET_CALL_FORWARD_DONE, onComplete);
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resp = onComplete;
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCM.queryCallForwardStatus(commandInterfaceCFReason,0,null,resp);
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCallForwardingOption(int commandInterfaceCFAction,
929767a662ecde33c3979bf02b793d392aca0403162Wink Saville            int commandInterfaceCFReason,
930767a662ecde33c3979bf02b793d392aca0403162Wink Saville            String dialingNumber,
931767a662ecde33c3979bf02b793d392aca0403162Wink Saville            int timerSeconds,
932767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Message onComplete) {
933767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (    (isValidCommandInterfaceCFAction(commandInterfaceCFAction)) &&
934767a662ecde33c3979bf02b793d392aca0403162Wink Saville                (isValidCommandInterfaceCFReason(commandInterfaceCFReason))) {
935767a662ecde33c3979bf02b793d392aca0403162Wink Saville
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message resp;
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (commandInterfaceCFReason == CF_REASON_UNCONDITIONAL) {
938a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                resp = obtainMessage(EVENT_SET_CALL_FORWARD_DONE,
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        isCfEnable(commandInterfaceCFAction) ? 1 : 0, 0, onComplete);
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resp = onComplete;
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCM.setCallForward(commandInterfaceCFAction,
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    commandInterfaceCFReason,
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CommandsInterface.SERVICE_CLASS_VOICE,
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dialingNumber,
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    timerSeconds,
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resp);
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
951767a662ecde33c3979bf02b793d392aca0403162Wink Saville
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getOutgoingCallerIdDisplay(Message onComplete) {
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.getCLIR(onComplete);
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
955767a662ecde33c3979bf02b793d392aca0403162Wink Saville
956767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode,
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                           Message onComplete) {
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.setCLIR(commandInterfaceCLIRMode,
959a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                obtainMessage(EVENT_SET_CLIR_COMPLETE, commandInterfaceCLIRMode, 0, onComplete));
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getCallWaiting(Message onComplete) {
963c4c4c98c5ca6b4c017a5b429a6bd80a440c63559Naveen Kalla        //As per 3GPP TS 24.083, section 1.6 UE doesn't need to send service
964c4c4c98c5ca6b4c017a5b429a6bd80a440c63559Naveen Kalla        //class parameter in call waiting interrogation  to network
965c4c4c98c5ca6b4c017a5b429a6bd80a440c63559Naveen Kalla        mCM.queryCallWaiting(CommandsInterface.SERVICE_CLASS_NONE, onComplete);
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
967767a662ecde33c3979bf02b793d392aca0403162Wink Saville
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCallWaiting(boolean enable, Message onComplete) {
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.setCallWaiting(enable, CommandsInterface.SERVICE_CLASS_VOICE, onComplete);
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
971767a662ecde33c3979bf02b793d392aca0403162Wink Saville
972767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getAvailableNetworks(Message response) {
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.getAvailableNetworks(response);
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
978767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Small container class used to hold information relevant to
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the carrier selection process. operatorNumeric can be ""
980c6f79ce6bcc77abe222e5cc39a0b065bc76bce83johnwang     * if we are looking for automatic selection. operatorAlphaLong is the
981c6f79ce6bcc77abe222e5cc39a0b065bc76bce83johnwang     * corresponding operator name.
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static class NetworkSelectMessage {
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Message message;
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String operatorNumeric;
986c6f79ce6bcc77abe222e5cc39a0b065bc76bce83johnwang        public String operatorAlphaLong;
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
988767a662ecde33c3979bf02b793d392aca0403162Wink Saville
989767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    setNetworkSelectionModeAutomatic(Message response) {
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // wrap the response message in our own message along with
992767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // an empty string (to indicate automatic selection) for the
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // operator's id.
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NetworkSelectMessage nsm = new NetworkSelectMessage();
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nsm.message = response;
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nsm.operatorNumeric = "";
997c6f79ce6bcc77abe222e5cc39a0b065bc76bce83johnwang        nsm.operatorAlphaLong = "";
998767a662ecde33c3979bf02b793d392aca0403162Wink Saville
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get the message
1000a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        Message msg = obtainMessage(EVENT_SET_NETWORK_AUTOMATIC_COMPLETE, nsm);
1001767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (LOCAL_DEBUG)
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.d(LOG_TAG, "wrapping and sending message to connect automatically");
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.setNetworkSelectionModeAutomatic(msg);
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1007767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
10083caa1bd1061df4029951e68d0a04d5e30928701fRobert Greenwalt    selectNetworkManually(OperatorInfo network,
1009767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Message response) {
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // wrap the response message in our own message along with
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the operator's id.
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NetworkSelectMessage nsm = new NetworkSelectMessage();
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nsm.message = response;
10143caa1bd1061df4029951e68d0a04d5e30928701fRobert Greenwalt        nsm.operatorNumeric = network.getOperatorNumeric();
10153caa1bd1061df4029951e68d0a04d5e30928701fRobert Greenwalt        nsm.operatorAlphaLong = network.getOperatorAlphaLong();
1016767a662ecde33c3979bf02b793d392aca0403162Wink Saville
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get the message
1018a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        Message msg = obtainMessage(EVENT_SET_NETWORK_MANUAL_COMPLETE, nsm);
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10203caa1bd1061df4029951e68d0a04d5e30928701fRobert Greenwalt        mCM.setNetworkSelectionModeManual(network.getOperatorNumeric(), msg);
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getNeighboringCids(Message response) {
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.getNeighboringCids(response);
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1027767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1028767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setOnPostDialCharacter(Handler h, int what, Object obj) {
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPostDialHandler = new Registrant(h, what, obj);
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1032767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setMute(boolean muted) {
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCT.setMute(muted);
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1036767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean getMute() {
1037767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.getMute();
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1040767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getDataCallList(Message response) {
1041767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.getDataCallList(response);
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10447a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink    public void updateServiceLocation() {
10457a043b351b43e963605afef6ab76a52ae3a9270eTammo Spalink        mSST.enableSingleLocationUpdate();
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enableLocationUpdates() {
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSST.enableLocationUpdates();
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void disableLocationUpdates() {
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSST.disableLocationUpdates();
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getDataRoamingEnabled() {
105763edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt        return mDataConnectionTracker.getDataOnRoamingEnabled();
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDataRoamingEnabled(boolean enable) {
106163edf6c4f5795009e55f2ae9556550c38daa9774Robert Greenwalt        mDataConnectionTracker.setDataOnRoamingEnabled(enable);
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Removes the given MMI from the pending list and notifies
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * registrants that it is complete.
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mmi MMI that is done
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void
1070767a662ecde33c3979bf02b793d392aca0403162Wink Saville    onMMIDone(GsmMmiCode mmi) {
1071767a662ecde33c3979bf02b793d392aca0403162Wink Saville        /* Only notify complete if it's on the pending list.
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Otherwise, it's already been handled (eg, previously canceled).
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The exception is cancellation of an incoming USSD-REQUEST, which is
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * not on the list.
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPendingMMIs.remove(mmi) || mmi.isUssdRequest()) {
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMmiCompleteRegistrants.notifyRegistrants(
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new AsyncResult(null, mmi, null));
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1083767a662ecde33c3979bf02b793d392aca0403162Wink Saville    private void
1084767a662ecde33c3979bf02b793d392aca0403162Wink Saville    onNetworkInitiatedUssd(GsmMmiCode mmi) {
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMmiCompleteRegistrants.notifyRegistrants(
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            new AsyncResult(null, mmi, null));
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** ussdMode is one of CommandsInterface.USSD_MODE_* */
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void
1092767a662ecde33c3979bf02b793d392aca0403162Wink Saville    onIncomingUSSD (int ussdMode, String ussdMessage) {
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isUssdError;
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isUssdRequest;
1095767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1096767a662ecde33c3979bf02b793d392aca0403162Wink Saville        isUssdRequest
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = (ussdMode == CommandsInterface.USSD_MODE_REQUEST);
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099767a662ecde33c3979bf02b793d392aca0403162Wink Saville        isUssdError
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = (ussdMode != CommandsInterface.USSD_MODE_NOTIFY
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && ussdMode != CommandsInterface.USSD_MODE_REQUEST);
1102767a662ecde33c3979bf02b793d392aca0403162Wink Saville
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // See comments in GsmMmiCode.java
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // USSD requests aren't finished until one
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // of these two events happen
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GsmMmiCode found = null;
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0, s = mPendingMMIs.size() ; i < s; i++) {
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(mPendingMMIs.get(i).isPendingUSSD()) {
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                found = mPendingMMIs.get(i);
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (found != null) {
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Complete pending USSD
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isUssdError) {
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                found.onUssdFinishedError();
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                found.onUssdFinished(ussdMessage, isUssdRequest);
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else { // pending USSD not found
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The network may initiate its own USSD request
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // ignore everything that isnt a Notify or a Request
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // also, discard if there is no message to present
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!isUssdError && ussdMessage != null) {
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmMmiCode mmi;
1129767a662ecde33c3979bf02b793d392aca0403162Wink Saville                mmi = GsmMmiCode.newNetworkInitiatedUssd(ussdMessage,
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   isUssdRequest,
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   GSMPhone.this);
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onNetworkInitiatedUssd(mmi);
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Make sure the network knows our preferred setting.
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1140767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected  void syncClirSetting() {
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int clirSetting = sp.getInt(CLIR_KEY, -1);
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (clirSetting >= 0) {
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCM.setCLIR(clirSetting, null);
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1148a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville    @Override
1149a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville    public void handleMessage (Message msg) {
1150a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        AsyncResult ar;
1151a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        Message onComplete;
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1153a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville        switch (msg.what) {
1154a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_RADIO_AVAILABLE: {
1155a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mCM.getBasebandVersion(
1156a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                        obtainMessage(EVENT_GET_BASEBAND_VERSION_DONE));
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1158a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mCM.getIMEI(obtainMessage(EVENT_GET_IMEI_DONE));
1159a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mCM.getIMEISV(obtainMessage(EVENT_GET_IMEISV_DONE));
1160a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            }
1161a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1163a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_RADIO_ON:
1164a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1166a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_REGISTERED_TO_NETWORK:
1167a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                syncClirSetting();
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1170a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_SIM_RECORDS_LOADED:
1171a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                updateCurrentCarrierInProvider();
11729bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
1173a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                // Check if this is a different SIM than the previous one. If so unset the
1174a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                // voice mail number.
1175a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                String imsi = getVmSimImsi();
1176aeab76c5be62ad4289e5b27937affd4460d588b3Babis Triantafyllou                String imsiFromSIM = getSubscriberId();
1177aeab76c5be62ad4289e5b27937affd4460d588b3Babis Triantafyllou                if (imsi != null && imsiFromSIM != null && !imsiFromSIM.equals(imsi)) {
1178a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    storeVoiceMailNumber(null);
1179a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    setVmSimImsi(null);
1180a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                }
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1182a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1184a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_GET_BASEBAND_VERSION_DONE:
1185a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1187a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (ar.exception != null) {
1188a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    break;
1189a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                }
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1191a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (LOCAL_DEBUG) Log.d(LOG_TAG, "Baseband version: " + ar.result);
1192a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                setSystemProperty(PROPERTY_BASEBAND_VERSION, (String)ar.result);
1193a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1195a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_GET_IMEI_DONE:
1196a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1198a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (ar.exception != null) {
1199a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    break;
1200a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                }
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1202a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mImei = (String)ar.result;
1203a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1205a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_GET_IMEISV_DONE:
1206a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1208a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (ar.exception != null) {
1209a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    break;
1210a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                }
1211767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1212a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mImeiSv = (String)ar.result;
1213a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1215a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_USSD:
1216a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1218a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                String[] ussdResult = (String[]) ar.result;
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1220a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (ussdResult.length > 1) {
1221a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    try {
1222a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                        onIncomingUSSD(Integer.parseInt(ussdResult[0]), ussdResult[1]);
1223a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    } catch (NumberFormatException e) {
1224a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                        Log.w(LOG_TAG, "error parsing USSD");
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1226a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                }
1227a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_RADIO_OFF_OR_NOT_AVAILABLE:
1230a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                // Some MMI requests (eg USSD) are not completed
1231a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                // within the course of a CommandsInterface request
1232a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                // If the radio shuts off or resets while one of these
1233a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                // is pending, we need to clean up.
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1235a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                for (int i = 0, s = mPendingMMIs.size() ; i < s; i++) {
1236a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    if (mPendingMMIs.get(i).isPendingUSSD()) {
1237a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                        mPendingMMIs.get(i).onUssdFinishedError();
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1239a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                }
1240a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1241a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville
1242a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_SSN:
1243a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
1244a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                SuppServiceNotification not = (SuppServiceNotification) ar.result;
1245a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                mSsnRegistrants.notifyRegistrants(ar);
1246a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            break;
1247a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville
1248a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_SET_CALL_FORWARD_DONE:
1249a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
1250ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville                if (ar.exception == null) {
1251ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville                    mIccRecords.setVoiceCallForwardingFlag(1, msg.arg1 == 1);
1252a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                }
1253a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                onComplete = (Message) ar.userObj;
1254a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (onComplete != null) {
1255a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    AsyncResult.forMessage(onComplete, ar.result, ar.exception);
1256a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    onComplete.sendToTarget();
1257a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                }
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1259767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1260a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_SET_VM_NUMBER_DONE:
1261a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
1262a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (IccVmNotSupportedException.class.isInstance(ar.exception)) {
1263a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    storeVoiceMailNumber(mVmNumber);
1264a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    ar.exception = null;
1265a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                }
1266a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                onComplete = (Message) ar.userObj;
1267a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (onComplete != null) {
1268a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    AsyncResult.forMessage(onComplete, ar.result, ar.exception);
1269a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    onComplete.sendToTarget();
1270a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                }
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12739bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
1274a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_GET_CALL_FORWARD_DONE:
1275a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
1276a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (ar.exception == null) {
1277a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    handleCfuQueryResult((CallForwardInfo[])ar.result);
1278a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                }
1279a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                onComplete = (Message) ar.userObj;
1280a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (onComplete != null) {
1281a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    AsyncResult.forMessage(onComplete, ar.result, ar.exception);
1282a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    onComplete.sendToTarget();
1283a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                }
1284a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                break;
1285767a662ecde33c3979bf02b793d392aca0403162Wink Saville
128680198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka            case EVENT_NEW_ICC_SMS:
128780198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                ar = (AsyncResult)msg.obj;
128880198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                mSMS.dispatchMessage((SmsMessage)ar.result);
128980198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                break;
129080198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka
129180198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka            case EVENT_SET_NETWORK_AUTOMATIC:
129280198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                ar = (AsyncResult)msg.obj;
129380198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                setNetworkSelectionModeAutomatic((Message)ar.result);
129480198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                break;
129580198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka
129680198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka            case EVENT_ICC_RECORD_EVENTS:
129780198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                ar = (AsyncResult)msg.obj;
129880198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                processIccRecordEvents((Integer)ar.result);
129980198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                break;
130080198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka
1301a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            // handle the select network completion callbacks.
1302a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_SET_NETWORK_MANUAL_COMPLETE:
1303a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_SET_NETWORK_AUTOMATIC_COMPLETE:
1304a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                handleSetSelectNetwork((AsyncResult) msg.obj);
1305a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                break;
1306767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1307a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville            case EVENT_SET_CLIR_COMPLETE:
1308a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                ar = (AsyncResult)msg.obj;
1309a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (ar.exception == null) {
1310a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    saveClirSetting(msg.arg1);
1311a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                }
1312a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                onComplete = (Message) ar.userObj;
1313a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                if (onComplete != null) {
1314a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    AsyncResult.forMessage(onComplete, ar.result, ar.exception);
1315a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                    onComplete.sendToTarget();
1316a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                }
1317a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                break;
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville             default:
1320a3659232ba9f7f3ba87ff036d17e08a46cf1be62Wink Saville                 super.handleMessage(msg);
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
132480198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka    private void processIccRecordEvents(int eventCode) {
132580198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka        switch (eventCode) {
1326ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville            case SIMRecords.EVENT_CFI:
132780198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                notifyCallForwardingIndicator();
132880198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                break;
1329ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville            case SIMRecords.EVENT_MWI:
133080198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                notifyMessageWaitingIndicator();
133180198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                break;
133280198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka        }
133380198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka    }
133480198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka
133580198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka   /**
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the "current" field in the telephony provider according to the SIM's operator
13379bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh     *
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true for success; false otherwise.
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean updateCurrentCarrierInProvider() {
1341ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        if (mIccRecords != null) {
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ContentValues map = new ContentValues();
1345ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville                map.put(Telephony.Carriers.NUMERIC, mIccRecords.getOperatorNumeric());
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mContext.getContentResolver().insert(uri, map);
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (SQLException e) {
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(LOG_TAG, "Can't store current operator", e);
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Used to track the settings upon completion of the network change.
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void handleSetSelectNetwork(AsyncResult ar) {
1359767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // look for our wrapper within the asyncresult, skip the rest if it
1360767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // is null.
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(ar.userObj instanceof NetworkSelectMessage)) {
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG, "unexpected result from user object.");
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1365767a662ecde33c3979bf02b793d392aca0403162Wink Saville
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NetworkSelectMessage nsm = (NetworkSelectMessage) ar.userObj;
1367767a662ecde33c3979bf02b793d392aca0403162Wink Saville
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // found the object, now we send off the message we had originally
1369767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // attached to the request.
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nsm.message != null) {
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG, "sending original message to recipient");
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AsyncResult.forMessage(nsm.message, ar.result, ar.exception);
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            nsm.message.sendToTarget();
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1375767a662ecde33c3979bf02b793d392aca0403162Wink Saville
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // open the shared preferences editor, and write the value.
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // nsm.operatorNumeric is "" if we're in automatic.selection.
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences.Editor editor = sp.edit();
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        editor.putString(NETWORK_SELECTION_KEY, nsm.operatorNumeric);
1381c6f79ce6bcc77abe222e5cc39a0b065bc76bce83johnwang        editor.putString(NETWORK_SELECTION_NAME_KEY, nsm.operatorAlphaLong);
1382767a662ecde33c3979bf02b793d392aca0403162Wink Saville
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // commit and log the result.
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (! editor.commit()) {
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(LOG_TAG, "failed to commit network selection preference");
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Saves CLIR setting so that we can re-apply it as necessary
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (in case the RIL resets it across reboots).
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1394767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void saveClirSetting(int commandInterfaceCLIRMode) {
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // open the shared preferences editor, and write the value.
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences.Editor editor = sp.edit();
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        editor.putInt(CLIR_KEY, commandInterfaceCLIRMode);
1399767a662ecde33c3979bf02b793d392aca0403162Wink Saville
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // commit and log the result.
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (! editor.commit()) {
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(LOG_TAG, "failed to commit CLIR preference");
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void handleCfuQueryResult(CallForwardInfo[] infos) {
1407ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        if (infos == null || infos.length == 0) {
1408ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville            // Assume the default is not active
1409ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville            // Set unconditional CFF in SIM to false
1410ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville            mIccRecords.setVoiceCallForwardingFlag(1, false);
1411ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        } else {
1412ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville            for (int i = 0, s = infos.length; i < s; i++) {
1413ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville                if ((infos[i].serviceClass & SERVICE_CLASS_VOICE) != 0) {
1414ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville                    mIccRecords.setVoiceCallForwardingFlag(1, (infos[i].status == 1));
1415ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville                    // should only have the one
1416ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville                    break;
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1421767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1422767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
1423767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Retrieves the PhoneSubInfo of the GSMPhone
1424767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
1425767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public PhoneSubInfo getPhoneSubInfo(){
1426767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSubInfo;
1427767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1428767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1429767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
1430767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Retrieves the IccSmsInterfaceManager of the GSMPhone
1431767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
1432767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public IccSmsInterfaceManager getIccSmsInterfaceManager(){
1433767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSimSmsIntManager;
1434767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1435767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1436767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
1437767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Retrieves the IccPhoneBookInterfaceManager of the GSMPhone
1438767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
1439767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public IccPhoneBookInterfaceManager getIccPhoneBookInterfaceManager(){
1440767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSimPhoneBookIntManager;
1441767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1442767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1443767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
1444ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby     * Activate or deactivate cell broadcast SMS.
1445ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby     *
1446ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby     * @param activate 0 = activate, 1 = deactivate
1447ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby     * @param response Callback message is empty on completion
1448ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby     */
1449767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void activateCellBroadcastSms(int activate, Message response) {
1450ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        Log.e(LOG_TAG, "[GSMPhone] activateCellBroadcastSms() is obsolete; use SmsManager");
1451ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        response.sendToTarget();
1452767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1453767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1454ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby    /**
1455ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby     * Query the current configuration of cdma cell broadcast SMS.
1456ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby     *
1457ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby     * @param response Callback message is empty on completion
1458ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby     */
1459767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getCellBroadcastSmsConfig(Message response) {
1460ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        Log.e(LOG_TAG, "[GSMPhone] getCellBroadcastSmsConfig() is obsolete; use SmsManager");
1461ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        response.sendToTarget();
1462767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1463767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1464ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby    /**
1465ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby     * Configure cdma cell broadcast SMS.
1466ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby     *
1467ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby     * @param response Callback message is empty on completion
1468ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby     */
1469ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby    public void setCellBroadcastSmsConfig(int[] configValuesArray, Message response) {
1470ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        Log.e(LOG_TAG, "[GSMPhone] setCellBroadcastSmsConfig() is obsolete; use SmsManager");
1471ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby        response.sendToTarget();
1472767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1473767a662ecde33c3979bf02b793d392aca0403162Wink Saville
14740e67c8926be9896e46eeecac42894d8997656809Banavathu, Srinivas Naik    public boolean isCspPlmnEnabled() {
1475ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        return mIccRecords.isCspPlmnEnabled();
14760e67c8926be9896e46eeecac42894d8997656809Banavathu, Srinivas Naik    }
147780198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka
147880198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka    private void registerForSimRecordEvents() {
1479ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.registerForNetworkSelectionModeAutomatic(
148080198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka                this, EVENT_SET_NETWORK_AUTOMATIC, null);
1481ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.registerForNewSms(this, EVENT_NEW_ICC_SMS, null);
1482ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null);
1483ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.registerForRecordsLoaded(this, EVENT_SIM_RECORDS_LOADED, null);
148480198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka    }
148580198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka
148680198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka    private void unregisterForSimRecordEvents() {
1487ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.unregisterForNetworkSelectionModeAutomatic(this);
1488ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.unregisterForNewSms(this);
1489ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.unregisterForRecordsEvents(this);
1490ecd302259a66aaf5abd49407c379c066e2542e95Wink Saville        mIccRecords.unregisterForRecordsLoaded(this);
149180198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka    }
149280198f2235d12f278e391dfedc582b0b40bfd404Alex Yakavenka
149330ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville    @Override
149430ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
149530ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println("GSMPhone extends:");
149630ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        super.dump(fd, pw, args);
149730ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mCT=" + mCT);
149830ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mSST=" + mSST);
149930ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mPendingMMIs=" + mPendingMMIs);
150030ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mSimPhoneBookIntManager=" + mSimPhoneBookIntManager);
150130ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mSimSmsIntManager=" + mSimSmsIntManager);
150230ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mSubInfo=" + mSubInfo);
150330ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        if (VDBG) pw.println(" mImei=" + mImei);
150430ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        if (VDBG) pw.println(" mImeiSv=" + mImeiSv);
150530ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville        pw.println(" mVmNumber=" + mVmNumber);
150630ccade7f9432b8212807b9ddc8cc69a4a8fc854Wink Saville    }
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1508