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