GSMPhone.java revision 9bfbfbd40df381817c0c685b177a2a1d666e101d
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.Looper;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Registrant;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RegistrantList;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemProperties;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.preference.PreferenceManager;
32767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport android.provider.Settings;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Telephony;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.CellLocation;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.PhoneNumberUtils;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.ServiceState;
37e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_DISABLE;
42767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_ENABLE;
43767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_ERASURE;
44767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_REGISTRATION;
45767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_ALL;
46767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_ALL_CONDITIONAL;
47767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_NO_REPLY;
48767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_NOT_REACHABLE;
49767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_BUSY;
50767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDITIONAL;
51767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_VOICE;
52767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport static com.android.internal.telephony.TelephonyProperties.PROPERTY_BASEBAND_VERSION;
53767a662ecde33c3979bf02b793d392aca0403162Wink Saville
54767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.CallForwardInfo;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.CallStateException;
56767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.CommandsInterface;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.Connection;
58767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.DataConnection;
59767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.DataConnectionTracker;
60767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccCard;
61767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccFileHandler;
62767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccPhoneBookInterfaceManager;
63767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccSmsInterfaceManager;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.MmiCode;
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;
70767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.RILConstants;
719bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganeshimport com.android.internal.telephony.TelephonyProperties;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.gsm.stk.StkService;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.test.SimulatedRadioControl;
74767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.IccVmNotSupportedException;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.InetSocketAddress;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.ServerSocket;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.Socket;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class GSMPhone extends PhoneBase {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // NOTE that LOG_TAG here is "GSM", which means that log messages
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // from this file will go into the radio log rather than the main
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // log.  (Use "adb logcat -b radio" to see them.)
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final String LOG_TAG = "GSM";
91767a662ecde33c3979bf02b793d392aca0403162Wink Saville    private static final boolean LOCAL_DEBUG = true;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Key used to read/write current ciphering state
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String CIPHERING_KEY = "ciphering_key";
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Key used to read/write voice mail number
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String VM_NUMBER = "vm_number_key";
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Key used to read/write the SIM IMSI used for storing the voice mail
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String VM_SIM_IMSI = "vm_sim_imsi_key";
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //***** Instance Variables
101767a662ecde33c3979bf02b793d392aca0403162Wink Saville    GsmCallTracker mCT;
102767a662ecde33c3979bf02b793d392aca0403162Wink Saville    GsmServiceStateTracker mSST;
103767a662ecde33c3979bf02b793d392aca0403162Wink Saville    GsmSMSDispatcher mSMS;
104767a662ecde33c3979bf02b793d392aca0403162Wink Saville    GsmDataConnectionTracker mDataConnection;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SIMRecords mSIMRecords;
106767a662ecde33c3979bf02b793d392aca0403162Wink Saville    SimCard mSimCard;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    StkService mStkService;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    MyHandler h;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayList <GsmMmiCode> mPendingMMIs = new ArrayList<GsmMmiCode>();
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SimPhoneBookInterfaceManager mSimPhoneBookIntManager;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    SimSmsInterfaceManager mSimSmsIntManager;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    PhoneSubInfo mSubInfo;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Registrant mPostDialHandler;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** List of Registrants to receive Supplementary Service Notifications. */
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    RegistrantList mSsnRegistrants = new RegistrantList();
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Thread debugPortThread;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ServerSocket debugSocket;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mReportedRadioResets;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mReportedAttemptedConnects;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mReportedSuccessfulConnects;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mImei;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mImeiSv;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mVmNumber;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //***** Constructors
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public
135767a662ecde33c3979bf02b793d392aca0403162Wink Saville    GSMPhone (Context context, CommandsInterface ci, PhoneNotifier notifier) {
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context,ci,notifier, false);
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public
140767a662ecde33c3979bf02b793d392aca0403162Wink Saville    GSMPhone (Context context, CommandsInterface ci, PhoneNotifier notifier, boolean unitTestMode) {
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(notifier, context, unitTestMode);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        h = new MyHandler();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM = ci;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ci instanceof SimulatedRadioControl) {
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSimulatedRadioControl = (SimulatedRadioControl) ci;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
149767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.setPhoneType(RILConstants.GSM_PHONE);
150767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCT = new GsmCallTracker(this);
151767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSST = new GsmServiceStateTracker (this);
152767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSMS = new GsmSMSDispatcher(this);
153767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mIccFileHandler = new SIMFileHandler(this);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSIMRecords = new SIMRecords(this);
155767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mDataConnection = new GsmDataConnectionTracker (this);
156767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mSimCard = new SimCard(this);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!unitTestMode) {
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSimPhoneBookIntManager = new SimPhoneBookInterfaceManager(this);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSimSmsIntManager = new SimSmsInterfaceManager(this);
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSubInfo = new PhoneSubInfo(this);
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStkService = StkService.getInstance(mCM, mSIMRecords, mContext,
163767a662ecde33c3979bf02b793d392aca0403162Wink Saville                (SIMFileHandler)mIccFileHandler, mSimCard);
164767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.registerForAvailable(h, EVENT_RADIO_AVAILABLE, null);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSIMRecords.registerForRecordsLoaded(h, EVENT_SIM_RECORDS_LOADED, null);
167767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.registerForOffOrNotAvailable(h, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.registerForOn(h, EVENT_RADIO_ON, null);
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.setOnUSSD(h, EVENT_USSD, null);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.setOnSuppServiceNotification(h, EVENT_SSN, null);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.setOnCallRing(h, EVENT_CALL_RING, null);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSST.registerForNetworkAttach(h, EVENT_REGISTERED_TO_NETWORK, null);
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (false) {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //debugSocket = new LocalServerSocket("com.android.internal.telephony.debug");
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                debugSocket = new ServerSocket();
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                debugSocket.setReuseAddress(true);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                debugSocket.bind (new InetSocketAddress("127.0.0.1", 6666));
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                debugPortThread
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    = new Thread(
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        new Runnable() {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            public void run() {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                for(;;) {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    try {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        Socket sock;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        sock = debugSocket.accept();
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        Log.i(LOG_TAG, "New connection; resetting radio");
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        mCM.resetRadio(null);
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        sock.close();
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    } catch (IOException ex) {
193767a662ecde33c3979bf02b793d392aca0403162Wink Saville                                        Log.w(LOG_TAG,
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            "Exception accepting socket", ex);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        },
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "GSMPhone debug");
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                debugPortThread.start();
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (IOException ex) {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(LOG_TAG, "Failure to open com.android.internal.telephony.debug socket", ex);
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
207767a662ecde33c3979bf02b793d392aca0403162Wink Saville
2089bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        //Change the system property
2099bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        SystemProperties.set(TelephonyProperties.CURRENT_ACTIVE_PHONE,
2109bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh                new Integer(RILConstants.GSM_PHONE).toString());
211767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
212767a662ecde33c3979bf02b793d392aca0403162Wink Saville
213767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void dispose() {
214767a662ecde33c3979bf02b793d392aca0403162Wink Saville        synchronized(PhoneProxy.lockForRadioTechnologyChange) {
215767a662ecde33c3979bf02b793d392aca0403162Wink Saville            //Unregister from all former registered events
216767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.unregisterForAvailable(h); //EVENT_RADIO_AVAILABLE
217767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSIMRecords.unregisterForRecordsLoaded(h); //EVENT_SIM_RECORDS_LOADED
218767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.unregisterForOffOrNotAvailable(h); //EVENT_RADIO_OFF_OR_NOT_AVAILABLE
219767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.unregisterForOn(h); //EVENT_RADIO_ON
220767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSST.unregisterForNetworkAttach(h); //EVENT_REGISTERED_TO_NETWORK
221767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.unSetOnUSSD(h);
222767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.unSetOnSuppServiceNotification(h);
223767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCM.unSetOnCallRing(h);
224767a662ecde33c3979bf02b793d392aca0403162Wink Saville
225767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mPendingMMIs.clear();
226767a662ecde33c3979bf02b793d392aca0403162Wink Saville
227767a662ecde33c3979bf02b793d392aca0403162Wink Saville            //Force all referenced classes to unregister their former registered events
228767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mStkService.dispose();
229767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mCT.dispose();
230767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mDataConnection.dispose();
231767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSST.dispose();
232767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mIccFileHandler.dispose(); // instance of SimFileHandler
233767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSIMRecords.dispose();
234767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSimCard.dispose();
235767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSimPhoneBookIntManager.dispose();
236767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSimSmsIntManager.dispose();
237767a662ecde33c3979bf02b793d392aca0403162Wink Saville            mSubInfo.dispose();
238767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
240767a662ecde33c3979bf02b793d392aca0403162Wink Saville
241767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void removeReferences() {
242767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mSimulatedRadioControl = null;
243767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mStkService = null;
244767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mSimPhoneBookIntManager = null;
245767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mSimSmsIntManager = null;
246767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mSMS = null;
247767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mSubInfo = null;
248767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mSIMRecords = null;
249767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mIccFileHandler = null;
250767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mSimCard = null;
251767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mDataConnection = null;
252767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mCT = null;
253767a662ecde33c3979bf02b793d392aca0403162Wink Saville            this.mSST = null;
254767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
255767a662ecde33c3979bf02b793d392aca0403162Wink Saville
256767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected void finalize() {
257767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if(LOCAL_DEBUG) Log.d(LOG_TAG, "GSMPhone finalized");
258767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
259767a662ecde33c3979bf02b793d392aca0403162Wink Saville
260767a662ecde33c3979bf02b793d392aca0403162Wink Saville
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //***** Overridden from Phone
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
263767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public ServiceState
264767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getServiceState() {
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSST.ss;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CellLocation getCellLocation() {
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSST.cellLoc;
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
272767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public Phone.State
273767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getState() {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCT.state;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String
278767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getPhoneName() {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "GSM";
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] getActiveApnTypes() {
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDataConnection.getActiveApnTypes();
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getActiveApn() {
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDataConnection.getActiveApnString();
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
290e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public SignalStrength getSignalStrength() {
291e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        return mSST.mSignalStrength;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean
295767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getMessageWaitingIndicator() {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSIMRecords.getVoiceMessageWaiting();
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getCallForwardingIndicator() {
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSIMRecords.getVoiceCallForwardingFlag();
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public List<? extends MmiCode>
305767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getPendingMmiCodes() {
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPendingMMIs;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public DataState getDataConnectionState() {
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DataState ret = DataState.DISCONNECTED;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((SystemProperties.get("adb.connected", "").length() > 0)
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (SystemProperties.get("android.net.use-adb-networking", "")
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                .length() > 0)) {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // We're connected to an ADB host and we have USB networking
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // turned on. No matter what the radio state is,
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we report data connected
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret = DataState.CONNECTED;
32044038aa032ffd876f3c9b20a84db9d189f77e18eWink Saville        } else if (mSST == null) {
32144038aa032ffd876f3c9b20a84db9d189f77e18eWink Saville            // Radio Technology Change is ongoning, dispose() and removeReferences() have
32244038aa032ffd876f3c9b20a84db9d189f77e18eWink Saville            // already been called
32344038aa032ffd876f3c9b20a84db9d189f77e18eWink Saville
32444038aa032ffd876f3c9b20a84db9d189f77e18eWink Saville            ret = DataState.DISCONNECTED;
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mSST.getCurrentGprsState()
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                != ServiceState.STATE_IN_SERVICE) {
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we're out of service, open TCP sockets may still work
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // but no data will flow
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ret = DataState.DISCONNECTED;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else { /* mSST.gprsState == ServiceState.STATE_IN_SERVICE */
331767a662ecde33c3979bf02b793d392aca0403162Wink Saville            switch (mDataConnection.getState()) {
332767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case FAILED:
333767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case IDLE:
334767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataState.DISCONNECTED;
335767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
337767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case CONNECTED:
338767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DISCONNECTING:
339767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    if ( mCT.state != Phone.State.IDLE
340767a662ecde33c3979bf02b793d392aca0403162Wink Saville                            && !mSST.isConcurrentVoiceAndData()) {
341767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        ret = DataState.SUSPENDED;
342767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    } else {
343767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        ret = DataState.CONNECTED;
344767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    }
345767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
347767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case INITING:
348767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case CONNECTING:
349767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case SCANNING:
350767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataState.CONNECTING;
351767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ret;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public DataActivityState getDataActivityState() {
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DataActivityState ret = DataActivityState.NONE;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSST.getCurrentGprsState() == ServiceState.STATE_IN_SERVICE) {
362767a662ecde33c3979bf02b793d392aca0403162Wink Saville            switch (mDataConnection.getActivity()) {
363767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAIN:
364767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAIN;
365767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
367767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAOUT:
368767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAOUT;
369767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
371767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case DATAINANDOUT:
372767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    ret = DataActivityState.DATAINANDOUT;
373767a662ecde33c3979bf02b793d392aca0403162Wink Saville                break;
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ret;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Notify any interested party of a Phone state change.
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void notifyPhoneStateChanged() {
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNotifier.notifyPhoneState(this);
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Notifies registrants (ie, activities in the Phone app) about
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changes to call state (including Phone and Connection changes).
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void
392767a662ecde33c3979bf02b793d392aca0403162Wink Saville    notifyCallStateChanged() {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* we'd love it if this was package-scoped*/
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.notifyCallStateChangedP();
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void
398767a662ecde33c3979bf02b793d392aca0403162Wink Saville    notifyNewRingingConnection(Connection c) {
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* we'd love it if this was package-scoped*/
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.notifyNewRingingConnectionP(c);
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Notifiy registrants of a RING event.
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
406767a662ecde33c3979bf02b793d392aca0403162Wink Saville    void notifyIncomingRing() {
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AsyncResult ar = new AsyncResult(null, this, null);
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIncomingRingRegistrants.notifyRegistrants(ar);
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
410767a662ecde33c3979bf02b793d392aca0403162Wink Saville
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void
412767a662ecde33c3979bf02b793d392aca0403162Wink Saville    notifyDisconnect(Connection cn) {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDisconnectRegistrants.notifyResult(cn);
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void notifyUnknownConnection() {
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnknownConnectionRegistrants.notifyResult(this);
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
419767a662ecde33c3979bf02b793d392aca0403162Wink Saville
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void notifySuppServiceFailed(SuppService code) {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSuppServiceFailedRegistrants.notifyResult(code);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void
425767a662ecde33c3979bf02b793d392aca0403162Wink Saville    notifyServiceStateChanged(ServiceState ss) {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.notifyServiceStateChangedP(ss);
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void notifyLocationChanged() {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNotifier.notifyCellLocation(this);
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void
435767a662ecde33c3979bf02b793d392aca0403162Wink Saville    notifySignalStrength() {
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNotifier.notifySignalStrength(this);
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    notifyDataConnectionFailed(String reason) {
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNotifier.notifyDataConnectionFailed(this, reason);
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void
445767a662ecde33c3979bf02b793d392aca0403162Wink Saville    updateMessageWaitingIndicator(boolean mwi) {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this also calls notifyMessageWaitingIndicator()
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSIMRecords.setVoiceMessageWaiting(1, mwi ? -1 : 0);
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
450767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
451767a662ecde33c3979bf02b793d392aca0403162Wink Saville    notifyMessageWaitingIndicator() {
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNotifier.notifyMessageWaitingChanged(this);
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
455767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    notifyCallForwardingIndicator() {
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNotifier.notifyCallForwardingChanged(this);
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
460767a662ecde33c3979bf02b793d392aca0403162Wink Saville    // override for allowing access from other classes of this package
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
462767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * {@inheritDoc}
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
464767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public final void
465767a662ecde33c3979bf02b793d392aca0403162Wink Saville    setSystemProperty(String property, String value) {
466767a662ecde33c3979bf02b793d392aca0403162Wink Saville        super.setSystemProperty(property, value);
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void registerForSuppServiceNotification(
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Handler h, int what, Object obj) {
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSsnRegistrants.addUnique(h, what, obj);
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSsnRegistrants.size() == 1) mCM.setSuppServiceNotifications(true, null);
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unregisterForSuppServiceNotification(Handler h) {
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSsnRegistrants.remove(h);
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSsnRegistrants.size() == 0) mCM.setSuppServiceNotifications(false, null);
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
480767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
481767a662ecde33c3979bf02b793d392aca0403162Wink Saville    acceptCall() throws CallStateException {
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCT.acceptCall();
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
485767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
486767a662ecde33c3979bf02b793d392aca0403162Wink Saville    rejectCall() throws CallStateException {
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCT.rejectCall();
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void
491767a662ecde33c3979bf02b793d392aca0403162Wink Saville    switchHoldingAndActive() throws CallStateException {
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCT.switchWaitingOrHoldingAndActive();
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
495767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean canConference() {
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCT.canConference();
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean canDial() {
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCT.canDial();
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
503767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void conference() throws CallStateException {
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCT.conference();
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
507767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void clearDisconnected() {
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCT.clearDisconnected();
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
511767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean canTransfer() {
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCT.canTransfer();
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
515767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void explicitCallTransfer() throws CallStateException {
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCT.explicitCallTransfer();
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public GsmCall
520767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getForegroundCall() {
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCT.foregroundCall;
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
524767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public GsmCall
525767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getBackgroundCall() {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCT.backgroundCall;
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public GsmCall
530767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getRingingCall() {
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCT.ringingCall;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean handleCallDeflectionIncallSupplementaryService(
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String dialString) throws CallStateException {
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dialString.length() > 1) {
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
540767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (getRingingCall().getState() != GsmCall.State.IDLE) {
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 0: rejectCall");
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCT.rejectCall();
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (CallStateException e) {
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_DEBUG) Log.d(LOG_TAG,
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "reject failed", e);
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifySuppServiceFailed(Phone.SuppService.REJECT);
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
549767a662ecde33c3979bf02b793d392aca0403162Wink Saville        } else if (getBackgroundCall().getState() != GsmCall.State.IDLE) {
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG,
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "MmiCode 0: hangupWaitingOrBackground");
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCT.hangupWaitingOrBackground();
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean handleCallWaitingIncallSupplementaryService(
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String dialString) throws CallStateException {
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int len = dialString.length();
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (len > 2) {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
566767a662ecde33c3979bf02b793d392aca0403162Wink Saville        GsmCall call = (GsmCall) getForegroundCall();
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (len > 1) {
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                char ch = dialString.charAt(1);
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int callIndex = ch - '0';
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
573767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (callIndex >= 1 && callIndex <= GsmCallTracker.MAX_CONNECTIONS) {
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "MmiCode 1: hangupConnectionByIndex " +
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            callIndex);
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCT.hangupConnectionByIndex(call, callIndex);
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
580767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (call.getState() != GsmCall.State.IDLE) {
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "MmiCode 1: hangup foreground");
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    //mCT.hangupForegroundResumeBackground();
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCT.hangup(call);
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "MmiCode 1: switchWaitingOrHoldingAndActive");
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCT.switchWaitingOrHoldingAndActive();
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CallStateException e) {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG,
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "hangup failed", e);
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            notifySuppServiceFailed(Phone.SuppService.HANGUP);
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean handleCallHoldIncallSupplementaryService(String dialString)
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws CallStateException {
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int len = dialString.length();
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (len > 2) {
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
608767a662ecde33c3979bf02b793d392aca0403162Wink Saville        GsmCall call = (GsmCall) getForegroundCall();
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (len > 1) {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                char ch = dialString.charAt(1);
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int callIndex = ch - '0';
614767a662ecde33c3979bf02b793d392aca0403162Wink Saville                GsmConnection conn = mCT.getConnectionByIndex(call, callIndex);
615767a662ecde33c3979bf02b793d392aca0403162Wink Saville
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // gsm index starts at 1, up to 5 connections in a call,
617767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (conn != null && callIndex >= 1 && callIndex <= GsmCallTracker.MAX_CONNECTIONS) {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 2: separate call "+
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            callIndex);
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCT.separate(conn);
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG, "separate: invalid call index "+
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            callIndex);
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    notifySuppServiceFailed(Phone.SuppService.SEPARATE);
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (CallStateException e) {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_DEBUG) Log.d(LOG_TAG,
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "separate failed", e);
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifySuppServiceFailed(Phone.SuppService.SEPARATE);
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
633767a662ecde33c3979bf02b793d392aca0403162Wink Saville                if (getRingingCall().getState() != GsmCall.State.IDLE) {
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "MmiCode 2: accept ringing call");
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCT.acceptCall();
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG,
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "MmiCode 2: switchWaitingOrHoldingAndActive");
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCT.switchWaitingOrHoldingAndActive();
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (CallStateException e) {
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (LOCAL_DEBUG) Log.d(LOG_TAG,
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "switch failed", e);
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifySuppServiceFailed(Phone.SuppService.SWITCH);
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean handleMultipartyIncallSupplementaryService(
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String dialString) throws CallStateException {
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dialString.length() > 1) {
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 3: merge calls");
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            conference();
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CallStateException e) {
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG,
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "conference failed", e);
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            notifySuppServiceFailed(Phone.SuppService.CONFERENCE);
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean handleEctIncallSupplementaryService(String dialString)
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws CallStateException {
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int len = dialString.length();
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (len != 1) {
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (LOCAL_DEBUG) Log.d(LOG_TAG, "MmiCode 4: explicit call transfer");
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            explicitCallTransfer();
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (CallStateException e) {
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG,
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "transfer failed", e);
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            notifySuppServiceFailed(Phone.SuppService.TRANSFER);
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean handleCcbsIncallSupplementaryService(String dialString)
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws CallStateException {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (dialString.length() > 1) {
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.i(LOG_TAG, "MmiCode 5: CCBS not supported!");
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Treat it as an "unknown" service.
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        notifySuppServiceFailed(Phone.SuppService.UNKNOWN);
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean handleInCallMmiCommands(String dialString)
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws CallStateException {
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isInCall()) {
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TextUtils.isEmpty(dialString)) {
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean result = false;
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        char ch = dialString.charAt(0);
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (ch) {
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '0':
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = handleCallDeflectionIncallSupplementaryService(
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dialString);
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '1':
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = handleCallWaitingIncallSupplementaryService(
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dialString);
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '2':
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = handleCallHoldIncallSupplementaryService(dialString);
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '3':
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = handleMultipartyIncallSupplementaryService(dialString);
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '4':
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = handleEctIncallSupplementaryService(dialString);
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case '5':
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = handleCcbsIncallSupplementaryService(dialString);
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean isInCall() {
742767a662ecde33c3979bf02b793d392aca0403162Wink Saville        GsmCall.State foregroundCallState = getForegroundCall().getState();
743767a662ecde33c3979bf02b793d392aca0403162Wink Saville        GsmCall.State backgroundCallState = getBackgroundCall().getState();
744767a662ecde33c3979bf02b793d392aca0403162Wink Saville        GsmCall.State ringingCallState = getRingingCall().getState();
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project       return (foregroundCallState.isAlive() ||
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                backgroundCallState.isAlive() ||
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ringingCallState.isAlive());
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Connection
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    dial (String dialString) throws CallStateException {
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Need to make sure dialString gets parsed properly
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String newDialString = PhoneNumberUtils.stripSeparators(dialString);
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // handle in-call MMI first if applicable
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (handleInCallMmiCommands(newDialString)) {
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Only look at the Network portion for mmi
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String networkPortion = PhoneNumberUtils.extractNetworkPortion(newDialString);
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GsmMmiCode mmi = GsmMmiCode.newFromDialString(networkPortion, this);
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (LOCAL_DEBUG) Log.d(LOG_TAG,
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                               "dialing w/ mmi '" + mmi + "'...");
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mmi == null) {
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCT.dial(newDialString);
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mmi.isTemporaryModeCLIR()) {
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCT.dial(mmi.dialingNumber, mmi.getCLIRMode());
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPendingMMIs.add(mmi);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mmi.processCode();
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // FIXME should this return null or something else?
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean handlePinMmi(String dialString) {
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GsmMmiCode mmi = GsmMmiCode.newFromDialString(dialString, this);
783767a662ecde33c3979bf02b793d392aca0403162Wink Saville
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mmi != null && mmi.isPinCommand()) {
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPendingMMIs.add(mmi);
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mmi.processCode();
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
790767a662ecde33c3979bf02b793d392aca0403162Wink Saville
791767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return false;
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void sendUssdResponse(String ussdMessge) {
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GsmMmiCode mmi = GsmMmiCode.newFromUssdUserInput(ussdMessge, this);
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPendingMMIs.add(mmi);
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null));
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mmi.sendUssd(ussdMessge);
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
800767a662ecde33c3979bf02b793d392aca0403162Wink Saville
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sendDtmf(char c) {
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!PhoneNumberUtils.is12Key(c)) {
804767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Log.e(LOG_TAG,
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "sendDtmf called with invalid character '" + c + "'");
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mCT.state ==  Phone.State.OFFHOOK) {
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCM.sendDtmf(c, null);
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    startDtmf(char c) {
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!PhoneNumberUtils.is12Key(c)) {
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(LOG_TAG,
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "startDtmf called with invalid character '" + c + "'");
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCM.startDtmf(c, null);
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    stopDtmf() {
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.stopDtmf(null);
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void
829e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    sendBurstDtmf(String dtmfString) {
830e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        Log.e(LOG_TAG, "[GSMPhone] sendBurstDtmf() is a CDMA method");
831e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
832e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
833e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    setRadioPower(boolean power) {
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSST.setRadioPower(power);
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void storeVoiceMailNumber(String number) {
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences.Editor editor = sp.edit();
8419bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        editor.putString(VM_NUMBER, number);
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        editor.commit();
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setVmSimImsi(getSubscriberId());
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getVoiceMailNumber() {
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Read from the SIM. If its null, try reading from the shared preference area.
8489bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        String number = mSIMRecords.getVoiceMailNumber();
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TextUtils.isEmpty(number)) {
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            number = sp.getString(VM_NUMBER, null);
8529bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        }
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return number;
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8559bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String getVmSimImsi() {
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sp.getString(VM_SIM_IMSI, null);
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void setVmSimImsi(String imsi) {
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences.Editor editor = sp.edit();
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        editor.putString(VM_SIM_IMSI, imsi);
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        editor.commit();
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8679bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getVoiceMailAlphaTag() {
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String ret;
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ret = mSIMRecords.getVoiceMailAlphaTag();
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ret == null || ret.length() == 0) {
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mContext.getText(
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.string.defaultVoiceMailAlphaTag).toString();
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
878767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return ret;
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
881e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public String getMin() {
882e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        Log.e(LOG_TAG, "[GSMPhone] getMin() is a CDMA method");
883e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        return "0";
884e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    }
885e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getDeviceId() {
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mImei;
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getDeviceSvn() {
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mImeiSv;
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
894767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getEsn() {
895767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "[GSMPhone] getEsn() is a CDMA method");
896767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return "0";
897767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
898767a662ecde33c3979bf02b793d392aca0403162Wink Saville
899767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getMeid() {
900767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "[GSMPhone] getMeid() is a CDMA method");
901767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return "0";
902767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
903767a662ecde33c3979bf02b793d392aca0403162Wink Saville
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getSubscriberId() {
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSIMRecords.imsi;
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
908767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public String getIccSerialNumber() {
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSIMRecords.iccid;
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getLine1Number() {
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSIMRecords.getMsisdnNumber();
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getLine1AlphaTag() {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String ret;
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ret = mSIMRecords.getMsisdnAlphaTag();
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ret == null || ret.length() == 0) {
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mContext.getText(
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    com.android.internal.R.string.defaultMsisdnAlphaTag).toString();
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ret;
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setLine1Number(String alphaTag, String number, Message onComplete) {
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSIMRecords.setMsisdnNumber(alphaTag, number, onComplete);
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setVoiceMailNumber(String alphaTag,
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            String voiceMailNumber,
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Message onComplete) {
9369bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
9379bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh        Message resp;
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mVmNumber = voiceMailNumber;
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        resp = h.obtainMessage(EVENT_SET_VM_NUMBER_DONE, 0, 0, onComplete);
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSIMRecords.setVoiceMailNumber(alphaTag, mVmNumber, resp);
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9429bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean isValidCommandInterfaceCFReason (int commandInterfaceCFReason) {
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (commandInterfaceCFReason) {
945767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_REASON_UNCONDITIONAL:
946767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_REASON_BUSY:
947767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_REASON_NO_REPLY:
948767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_REASON_NOT_REACHABLE:
949767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_REASON_ALL:
950767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_REASON_ALL_CONDITIONAL:
951767a662ecde33c3979bf02b793d392aca0403162Wink Saville            return true;
952767a662ecde33c3979bf02b793d392aca0403162Wink Saville        default:
953767a662ecde33c3979bf02b793d392aca0403162Wink Saville            return false;
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean isValidCommandInterfaceCFAction (int commandInterfaceCFAction) {
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (commandInterfaceCFAction) {
959767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_ACTION_DISABLE:
960767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_ACTION_ENABLE:
961767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_ACTION_REGISTRATION:
962767a662ecde33c3979bf02b793d392aca0403162Wink Saville        case CF_ACTION_ERASURE:
963767a662ecde33c3979bf02b793d392aca0403162Wink Saville            return true;
964767a662ecde33c3979bf02b793d392aca0403162Wink Saville        default:
965767a662ecde33c3979bf02b793d392aca0403162Wink Saville            return false;
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
968767a662ecde33c3979bf02b793d392aca0403162Wink Saville
969767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected  boolean isCfEnable(int action) {
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (action == CF_ACTION_ENABLE) || (action == CF_ACTION_REGISTRATION);
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
972767a662ecde33c3979bf02b793d392aca0403162Wink Saville
973767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getCallForwardingOption(int commandInterfaceCFReason, Message onComplete) {
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isValidCommandInterfaceCFReason(commandInterfaceCFReason)) {
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG, "requesting call forwarding query.");
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message resp;
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (commandInterfaceCFReason == CF_REASON_UNCONDITIONAL) {
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resp = h.obtainMessage(EVENT_GET_CALL_FORWARD_DONE, onComplete);
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resp = onComplete;
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCM.queryCallForwardStatus(commandInterfaceCFReason,0,null,resp);
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCallForwardingOption(int commandInterfaceCFAction,
987767a662ecde33c3979bf02b793d392aca0403162Wink Saville            int commandInterfaceCFReason,
988767a662ecde33c3979bf02b793d392aca0403162Wink Saville            String dialingNumber,
989767a662ecde33c3979bf02b793d392aca0403162Wink Saville            int timerSeconds,
990767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Message onComplete) {
991767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (    (isValidCommandInterfaceCFAction(commandInterfaceCFAction)) &&
992767a662ecde33c3979bf02b793d392aca0403162Wink Saville                (isValidCommandInterfaceCFReason(commandInterfaceCFReason))) {
993767a662ecde33c3979bf02b793d392aca0403162Wink Saville
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message resp;
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (commandInterfaceCFReason == CF_REASON_UNCONDITIONAL) {
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resp = h.obtainMessage(EVENT_SET_CALL_FORWARD_DONE,
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        isCfEnable(commandInterfaceCFAction) ? 1 : 0, 0, onComplete);
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resp = onComplete;
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCM.setCallForward(commandInterfaceCFAction,
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    commandInterfaceCFReason,
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    CommandsInterface.SERVICE_CLASS_VOICE,
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dialingNumber,
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    timerSeconds,
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    resp);
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1009767a662ecde33c3979bf02b793d392aca0403162Wink Saville
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getOutgoingCallerIdDisplay(Message onComplete) {
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.getCLIR(onComplete);
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1013767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1014767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode,
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                           Message onComplete) {
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.setCLIR(commandInterfaceCLIRMode,
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                h.obtainMessage(EVENT_SET_CLIR_COMPLETE, commandInterfaceCLIRMode, 0, onComplete));
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getCallWaiting(Message onComplete) {
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.queryCallWaiting(CommandsInterface.SERVICE_CLASS_VOICE, onComplete);
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1023767a662ecde33c3979bf02b793d392aca0403162Wink Saville
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCallWaiting(boolean enable, Message onComplete) {
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.setCallWaiting(enable, CommandsInterface.SERVICE_CLASS_VOICE, onComplete);
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1027767a662ecde33c3979bf02b793d392aca0403162Wink Saville
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean
1029767a662ecde33c3979bf02b793d392aca0403162Wink Saville    getIccRecordsLoaded() {
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSIMRecords.getRecordsLoaded();
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1033767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public IccCard getIccCard() {
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSimCard;
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1037767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getAvailableNetworks(Message response) {
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.getAvailableNetworks(response);
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1043767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Small container class used to hold information relevant to
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the carrier selection process. operatorNumeric can be ""
1045767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * if we are looking for automatic selection.
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static class NetworkSelectMessage {
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Message message;
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String operatorNumeric;
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1051767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1052767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    setNetworkSelectionModeAutomatic(Message response) {
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // wrap the response message in our own message along with
1055767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // an empty string (to indicate automatic selection) for the
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // operator's id.
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NetworkSelectMessage nsm = new NetworkSelectMessage();
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nsm.message = response;
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nsm.operatorNumeric = "";
1060767a662ecde33c3979bf02b793d392aca0403162Wink Saville
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get the message
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = h.obtainMessage(EVENT_SET_NETWORK_AUTOMATIC_COMPLETE, nsm);
1063767a662ecde33c3979bf02b793d392aca0403162Wink Saville        if (LOCAL_DEBUG)
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.d(LOG_TAG, "wrapping and sending message to connect automatically");
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.setNetworkSelectionModeAutomatic(msg);
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    selectNetworkManually(com.android.internal.telephony.gsm.NetworkInfo network,
1071767a662ecde33c3979bf02b793d392aca0403162Wink Saville            Message response) {
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // wrap the response message in our own message along with
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the operator's id.
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NetworkSelectMessage nsm = new NetworkSelectMessage();
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nsm.message = response;
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nsm.operatorNumeric = network.operatorNumeric;
1077767a662ecde33c3979bf02b793d392aca0403162Wink Saville
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // get the message
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message msg = h.obtainMessage(EVENT_SET_NETWORK_MANUAL_COMPLETE, nsm);
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.setNetworkSelectionModeManual(network.operatorNumeric, msg);
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    getNeighboringCids(Message response) {
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCM.getNeighboringCids(response);
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1088767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1089767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setOnPostDialCharacter(Handler h, int what, Object obj) {
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPostDialHandler = new Registrant(h, what, obj);
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1093767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setMute(boolean muted) {
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCT.setMute(muted);
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1097767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public boolean getMute() {
1098767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mCT.getMute();
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1101767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
1102767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @deprecated
1103767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getPdpContextList(Message response) {
1105767a662ecde33c3979bf02b793d392aca0403162Wink Saville        getDataCallList(response);
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1108767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getDataCallList(Message response) {
1109767a662ecde33c3979bf02b793d392aca0403162Wink Saville        mCM.getDataCallList(response);
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1113767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * @deprecated
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1115767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public List<PdpConnection> getCurrentPdpList() {
1116767a662ecde33c3979bf02b793d392aca0403162Wink Saville        ArrayList<DataConnection> connections = new ArrayList<DataConnection>();
1117767a662ecde33c3979bf02b793d392aca0403162Wink Saville        ArrayList<PdpConnection> pdp_list = new ArrayList<PdpConnection>();
1118767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1119767a662ecde33c3979bf02b793d392aca0403162Wink Saville        for(int n = 0; n < connections.size(); n++) {
1120767a662ecde33c3979bf02b793d392aca0403162Wink Saville            pdp_list.add((PdpConnection) connections.get(n));
1121767a662ecde33c3979bf02b793d392aca0403162Wink Saville        }
1122767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1123767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return pdp_list;
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1126767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public List<DataConnection> getCurrentDataConnectionList () {
1127767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mDataConnection.getAllDataConnections();
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void updateServiceLocation(Message response) {
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSST.getLacAndCid(response);
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enableLocationUpdates() {
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSST.enableLocationUpdates();
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void disableLocationUpdates() {
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSST.disableLocationUpdates();
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getDataRoamingEnabled() {
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDataConnection.getDataOnRoamingEnabled();
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDataRoamingEnabled(boolean enable) {
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDataConnection.setDataOnRoamingEnabled(enable);
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean enableDataConnectivity() {
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDataConnection.setDataEnabled(true);
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int enableApnType(String type) {
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDataConnection.enableApnType(type);
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int disableApnType(String type) {
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDataConnection.disableApnType(type);
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean disableDataConnectivity() {
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDataConnection.setDataEnabled(false);
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getInterfaceName(String apnType) {
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDataConnection.getInterfaceName(apnType);
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getIpAddress(String apnType) {
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDataConnection.getIpAddress(apnType);
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getGateway(String apnType) {
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDataConnection.getGateway(apnType);
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] getDnsServers(String apnType) {
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDataConnection.getDnsServers(apnType);
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The only circumstances under which we report that data connectivity is not
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * possible are
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <ul>
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>Data roaming is disallowed and we are roaming.</li>
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>The current data state is {@code DISCONNECTED} for a reason other than
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * having explicitly disabled connectivity. In other words, data is not available
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * because the phone is out of coverage or some like reason.</li>
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </ul>
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if data connectivity is possible, {@code false} otherwise.
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isDataConnectivityPossible() {
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: Currently checks if any GPRS connection is active. Should it only
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // check for "default"?
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean noData = mDataConnection.getDataEnabled() &&
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            getDataConnectionState() == DataState.DISCONNECTED;
1198767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return !noData && getIccCard().getState() == SimCard.State.READY &&
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getServiceState().getState() == ServiceState.STATE_IN_SERVICE &&
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (mDataConnection.getDataOnRoamingEnabled() || !getServiceState().getRoaming());
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Removes the given MMI from the pending list and notifies
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * registrants that it is complete.
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mmi MMI that is done
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ void
1209767a662ecde33c3979bf02b793d392aca0403162Wink Saville    onMMIDone(GsmMmiCode mmi) {
1210767a662ecde33c3979bf02b793d392aca0403162Wink Saville        /* Only notify complete if it's on the pending list.
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Otherwise, it's already been handled (eg, previously canceled).
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The exception is cancellation of an incoming USSD-REQUEST, which is
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * not on the list.
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPendingMMIs.remove(mmi) || mmi.isUssdRequest()) {
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMmiCompleteRegistrants.notifyRegistrants(
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new AsyncResult(null, mmi, null));
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1222767a662ecde33c3979bf02b793d392aca0403162Wink Saville    private void
1223767a662ecde33c3979bf02b793d392aca0403162Wink Saville    onNetworkInitiatedUssd(GsmMmiCode mmi) {
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMmiCompleteRegistrants.notifyRegistrants(
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            new AsyncResult(null, mmi, null));
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** ussdMode is one of CommandsInterface.USSD_MODE_* */
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void
1231767a662ecde33c3979bf02b793d392aca0403162Wink Saville    onIncomingUSSD (int ussdMode, String ussdMessage) {
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isUssdError;
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isUssdRequest;
1234767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1235767a662ecde33c3979bf02b793d392aca0403162Wink Saville        isUssdRequest
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = (ussdMode == CommandsInterface.USSD_MODE_REQUEST);
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1238767a662ecde33c3979bf02b793d392aca0403162Wink Saville        isUssdError
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = (ussdMode != CommandsInterface.USSD_MODE_NOTIFY
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && ussdMode != CommandsInterface.USSD_MODE_REQUEST);
1241767a662ecde33c3979bf02b793d392aca0403162Wink Saville
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // See comments in GsmMmiCode.java
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // USSD requests aren't finished until one
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // of these two events happen
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        GsmMmiCode found = null;
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0, s = mPendingMMIs.size() ; i < s; i++) {
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if(mPendingMMIs.get(i).isPendingUSSD()) {
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                found = mPendingMMIs.get(i);
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (found != null) {
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Complete pending USSD
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isUssdError) {
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                found.onUssdFinishedError();
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                found.onUssdFinished(ussdMessage, isUssdRequest);
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else { // pending USSD not found
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The network may initiate its own USSD request
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // ignore everything that isnt a Notify or a Request
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // also, discard if there is no message to present
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!isUssdError && ussdMessage != null) {
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GsmMmiCode mmi;
1268767a662ecde33c3979bf02b793d392aca0403162Wink Saville                mmi = GsmMmiCode.newNetworkInitiatedUssd(ussdMessage,
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   isUssdRequest,
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   GSMPhone.this);
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onNetworkInitiatedUssd(mmi);
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Make sure the network knows our preferred setting.
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1279767a662ecde33c3979bf02b793d392aca0403162Wink Saville    protected  void syncClirSetting() {
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int clirSetting = sp.getInt(CLIR_KEY, -1);
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (clirSetting >= 0) {
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCM.setCLIR(clirSetting, null);
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //***** Inner Classes
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289767a662ecde33c3979bf02b793d392aca0403162Wink Saville    class MyHandler extends Handler {
1290767a662ecde33c3979bf02b793d392aca0403162Wink Saville        MyHandler() {
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1293767a662ecde33c3979bf02b793d392aca0403162Wink Saville        MyHandler(Looper l) {
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(l);
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void
1298767a662ecde33c3979bf02b793d392aca0403162Wink Saville        handleMessage (Message msg) {
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AsyncResult ar;
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message onComplete;
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (msg.what) {
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_RADIO_AVAILABLE: {
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCM.getBasebandVersion(
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            obtainMessage(EVENT_GET_BASEBAND_VERSION_DONE));
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCM.getIMEI(obtainMessage(EVENT_GET_IMEI_DONE));
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCM.getIMEISV(obtainMessage(EVENT_GET_IMEISV_DONE));
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_RADIO_ON:
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_REGISTERED_TO_NETWORK:
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    syncClirSetting();
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_SIM_RECORDS_LOADED:
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    updateCurrentCarrierInProvider();
13219bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Check if this is a different SIM than the previous one. If so unset the
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // voice mail number.
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String imsi = getVmSimImsi();
13259bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh                    if (imsi != null && !getSubscriberId().equals(imsi)) {
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        storeVoiceMailNumber(null);
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        setVmSimImsi(null);
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_GET_BASEBAND_VERSION_DONE:
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar = (AsyncResult)msg.obj;
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ar.exception != null) {
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (LOCAL_DEBUG) Log.d(LOG_TAG, "Baseband version: " + ar.result);
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    setSystemProperty(PROPERTY_BASEBAND_VERSION, (String)ar.result);
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_GET_IMEI_DONE:
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar = (AsyncResult)msg.obj;
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ar.exception != null) {
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mImei = (String)ar.result;
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_GET_IMEISV_DONE:
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar = (AsyncResult)msg.obj;
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ar.exception != null) {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1359767a662ecde33c3979bf02b793d392aca0403162Wink Saville
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mImeiSv = (String)ar.result;
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_USSD:
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar = (AsyncResult)msg.obj;
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String[] ussdResult = (String[]) ar.result;
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ussdResult.length > 1) {
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            onIncomingUSSD(Integer.parseInt(ussdResult[0]), ussdResult[1]);
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } catch (NumberFormatException e) {
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Log.w(LOG_TAG, "error parsing USSD");
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1377767a662ecde33c3979bf02b793d392aca0403162Wink Saville                case EVENT_RADIO_OFF_OR_NOT_AVAILABLE:
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Some MMI requests (eg USSD) are not completed
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // within the course of a CommandsInterface request
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If the radio shuts off or resets while one of these
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // is pending, we need to clean up.
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0, s = mPendingMMIs.size() ; i < s; i++) {
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mPendingMMIs.get(i).isPendingUSSD()) {
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mPendingMMIs.get(i).onUssdFinishedError();
1386767a662ecde33c3979bf02b793d392aca0403162Wink Saville                        }
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
1389767a662ecde33c3979bf02b793d392aca0403162Wink Saville
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_SSN:
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar = (AsyncResult)msg.obj;
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    SuppServiceNotification not = (SuppServiceNotification) ar.result;
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSsnRegistrants.notifyRegistrants(ar);
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_SET_CALL_FORWARD_DONE:
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar = (AsyncResult)msg.obj;
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ar.exception == null) {
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mSIMRecords.setVoiceCallForwardingFlag(1, msg.arg1 == 1);
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    onComplete = (Message) ar.userObj;
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (onComplete != null) {
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        AsyncResult.forMessage(onComplete, ar.result, ar.exception);
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        onComplete.sendToTarget();
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
14079bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_SET_VM_NUMBER_DONE:
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar = (AsyncResult)msg.obj;
1410767a662ecde33c3979bf02b793d392aca0403162Wink Saville                    if (IccVmNotSupportedException.class.isInstance(ar.exception)) {
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        storeVoiceMailNumber(mVmNumber);
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        ar.exception = null;
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    onComplete = (Message) ar.userObj;
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (onComplete != null) {
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        AsyncResult.forMessage(onComplete, ar.result, ar.exception);
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        onComplete.sendToTarget();
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14219bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_GET_CALL_FORWARD_DONE:
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar = (AsyncResult)msg.obj;
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ar.exception == null) {
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        handleCfuQueryResult((CallForwardInfo[])ar.result);
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    onComplete = (Message) ar.userObj;
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (onComplete != null) {
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        AsyncResult.forMessage(onComplete, ar.result, ar.exception);
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        onComplete.sendToTarget();
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
1433767a662ecde33c3979bf02b793d392aca0403162Wink Saville
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_CALL_RING:
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar = (AsyncResult)msg.obj;
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ar.exception == null) {
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        notifyIncomingRing();
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
1440767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1441767a662ecde33c3979bf02b793d392aca0403162Wink Saville                // handle the select network completion callbacks.
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_SET_NETWORK_MANUAL_COMPLETE:
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_SET_NETWORK_AUTOMATIC_COMPLETE:
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    handleSetSelectNetwork((AsyncResult) msg.obj);
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case EVENT_SET_CLIR_COMPLETE:
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ar = (AsyncResult)msg.obj;
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ar.exception == null) {
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        saveClirSetting(msg.arg1);
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    onComplete = (Message) ar.userObj;
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (onComplete != null) {
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        AsyncResult.forMessage(onComplete, ar.result, ar.exception);
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        onComplete.sendToTarget();
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the "current" field in the telephony provider according to the SIM's operator
14649bfbfbd40df381817c0c685b177a2a1d666e101dJaikumar Ganesh     *
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true for success; false otherwise.
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean updateCurrentCarrierInProvider() {
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSIMRecords != null) {
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ContentValues map = new ContentValues();
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                map.put(Telephony.Carriers.NUMERIC, mSIMRecords.getSIMOperatorNumeric());
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mContext.getContentResolver().insert(uri, map);
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (SQLException e) {
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(LOG_TAG, "Can't store current operator", e);
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Used to track the settings upon completion of the network change.
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void handleSetSelectNetwork(AsyncResult ar) {
1486767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // look for our wrapper within the asyncresult, skip the rest if it
1487767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // is null.
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!(ar.userObj instanceof NetworkSelectMessage)) {
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG, "unexpected result from user object.");
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1492767a662ecde33c3979bf02b793d392aca0403162Wink Saville
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        NetworkSelectMessage nsm = (NetworkSelectMessage) ar.userObj;
1494767a662ecde33c3979bf02b793d392aca0403162Wink Saville
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // found the object, now we send off the message we had originally
1496767a662ecde33c3979bf02b793d392aca0403162Wink Saville        // attached to the request.
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nsm.message != null) {
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (LOCAL_DEBUG) Log.d(LOG_TAG, "sending original message to recipient");
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AsyncResult.forMessage(nsm.message, ar.result, ar.exception);
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            nsm.message.sendToTarget();
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1502767a662ecde33c3979bf02b793d392aca0403162Wink Saville
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // open the shared preferences editor, and write the value.
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // nsm.operatorNumeric is "" if we're in automatic.selection.
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences.Editor editor = sp.edit();
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        editor.putString(NETWORK_SELECTION_KEY, nsm.operatorNumeric);
1508767a662ecde33c3979bf02b793d392aca0403162Wink Saville
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // commit and log the result.
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (! editor.commit()) {
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(LOG_TAG, "failed to commit network selection preference");
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Saves CLIR setting so that we can re-apply it as necessary
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (in case the RIL resets it across reboots).
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1520767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void saveClirSetting(int commandInterfaceCLIRMode) {
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // open the shared preferences editor, and write the value.
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SharedPreferences.Editor editor = sp.edit();
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        editor.putInt(CLIR_KEY, commandInterfaceCLIRMode);
1525767a662ecde33c3979bf02b793d392aca0403162Wink Saville
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // commit and log the result.
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (! editor.commit()) {
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e(LOG_TAG, "failed to commit CLIR preference");
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void handleCfuQueryResult(CallForwardInfo[] infos) {
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (infos == null || infos.length == 0) {
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Assume the default is not active
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Set unconditional CFF in SIM to false
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSIMRecords.setVoiceCallForwardingFlag(1, false);
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i = 0, s = infos.length; i < s; i++) {
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((infos[i].serviceClass & SERVICE_CLASS_VOICE) != 0) {
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSIMRecords.setVoiceCallForwardingFlag(1, (infos[i].status == 1));
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // should only have the one
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * simulateDataConnection
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * simulates various data connection states. This messes with
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * DataConnectionTracker's internal states, but doesn't actually change
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the underlying radio connection states.
1553767a662ecde33c3979bf02b793d392aca0403162Wink Saville     *
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param state Phone.DataState enum.
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void simulateDataConnection(Phone.DataState state) {
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        DataConnectionTracker.State dcState;
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (state) {
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case CONNECTED:
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dcState = DataConnectionTracker.State.CONNECTED;
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case SUSPENDED:
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dcState = DataConnectionTracker.State.CONNECTED;
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case DISCONNECTED:
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dcState = DataConnectionTracker.State.FAILED;
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dcState = DataConnectionTracker.State.CONNECTING;
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDataConnection.setState(dcState);
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        notifyDataConnection(null);
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1577767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1578767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
1579767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Retrieves the PhoneSubInfo of the GSMPhone
1580767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
1581767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public PhoneSubInfo getPhoneSubInfo(){
1582767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSubInfo;
1583767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1584767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1585767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
1586767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Retrieves the IccSmsInterfaceManager of the GSMPhone
1587767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
1588767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public IccSmsInterfaceManager getIccSmsInterfaceManager(){
1589767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSimSmsIntManager;
1590767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1591767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1592767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
1593767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * Retrieves the IccPhoneBookInterfaceManager of the GSMPhone
1594767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
1595767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public IccPhoneBookInterfaceManager getIccPhoneBookInterfaceManager(){
1596767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return mSimPhoneBookIntManager;
1597767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1598767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1599767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
1600767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * {@inheritDoc}
1601767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
1602767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public Handler getHandler(){
1603767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return h;
1604767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1605767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1606767a662ecde33c3979bf02b793d392aca0403162Wink Saville    /**
1607767a662ecde33c3979bf02b793d392aca0403162Wink Saville     * {@inheritDoc}
1608767a662ecde33c3979bf02b793d392aca0403162Wink Saville     */
1609767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public IccFileHandler getIccFileHandler(){
1610767a662ecde33c3979bf02b793d392aca0403162Wink Saville        return this.mIccFileHandler;
1611767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1612767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1613767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void activateCellBroadcastSms(int activate, Message response) {
1614767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "Error! This functionality is not implemented for GSM.");
1615767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1616767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1617767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void getCellBroadcastSmsConfig(Message response) {
1618767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "Error! This functionality is not implemented for GSM.");
1619767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1620767a662ecde33c3979bf02b793d392aca0403162Wink Saville
1621767a662ecde33c3979bf02b793d392aca0403162Wink Saville    public void setCellBroadcastSmsConfig(int[] configValuesArray, Message response){
1622767a662ecde33c3979bf02b793d392aca0403162Wink Saville        Log.e(LOG_TAG, "Error! This functionality is not implemented for GSM.");
1623767a662ecde33c3979bf02b793d392aca0403162Wink Saville    }
1624767a662ecde33c3979bf02b793d392aca0403162Wink Saville
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1626