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; 32dc2b5d1c32cad5269106d00fd106bd64097238f4Tyler Gunnimport android.telecom.VideoProfile; 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.CellLocation; 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.PhoneNumberUtils; 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState; 3626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowaimport android.telephony.SubscriptionManager; 37a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.TelephonyManager; 38530036ca1f522f477c438466c0577aad38c74d03Etan Cohen 39530036ca1f522f477c438466c0577aad38c74d03Etan Cohenimport com.android.ims.ImsManager; 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallTracker; 41e9fdc85df2111a0a0d7d240bbc11ed5b14b01376xinhe 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.text.TextUtils; 4399c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog; 44e9fdc85df2111a0a0d7d240bbc11ed5b14b01376xinheimport android.util.Log; 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_DISABLE; 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_ENABLE; 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_ERASURE; 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_REGISTRATION; 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_ALL; 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_ALL_CONDITIONAL; 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_NO_REPLY; 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_NOT_REACHABLE; 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_BUSY; 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDITIONAL; 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_VOICE; 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 58454b1dfd508844b42eb775e4ab2359be74d3672bWink Savilleimport com.android.internal.telephony.dataconnection.DcTracker; 59a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Call; 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallForwardInfo; 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallStateException; 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CommandsInterface; 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Connection; 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IccPhoneBookInterfaceManager; 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.MmiCode; 666bc4098827f3070a44b5e51508b455d7c7be9c07Wink Savilleimport com.android.internal.telephony.OperatorInfo; 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Phone; 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneBase; 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneConstants; 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneNotifier; 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneProxy; 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneSubInfo; 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.TelephonyProperties; 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.UUSInfo; 75888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohenimport com.android.internal.telephony.imsphone.ImsPhone; 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.test.SimulatedRadioControl; 77d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccRecords; 78d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccVmNotSupportedException; 79b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawalimport com.android.internal.telephony.uicc.UiccCard; 80d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.UiccCardApplication; 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.uicc.UiccController; 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.ServiceStateTracker; 83a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.uicc.IsimRecords; 84a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.uicc.IsimUiccRecords; 85a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor; 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter; 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList; 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List; 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 91a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide} 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class GSMPhone extends PhoneBase { 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // NOTE that LOG_TAG here is "GSM", which means that log messages 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // from this file will go into the radio log rather than the main 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // log. (Use "adb logcat -b radio" to see them.) 99cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville static final String LOG_TAG = "GSMPhone"; 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final boolean LOCAL_DEBUG = true; 101cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private static final boolean VDBG = false; /* STOPSHIP if true */ 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Key used to read/write current ciphering state 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static final String CIPHERING_KEY = "ciphering_key"; 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Key used to read/write voice mail number 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static final String VM_NUMBER = "vm_number_key"; 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Key used to read/write the SIM IMSI used for storing the voice mail 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static final String VM_SIM_IMSI = "vm_sim_imsi_key"; 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Instance Variables 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GsmCallTracker mCT; 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GsmServiceStateTracker mSST; 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ArrayList <GsmMmiCode> mPendingMMIs = new ArrayList<GsmMmiCode>(); 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SimPhoneBookInterfaceManager mSimPhoneBookIntManager; 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville PhoneSubInfo mSubInfo; 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Registrant mPostDialHandler; 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** List of Registrants to receive Supplementary Service Notifications. */ 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville RegistrantList mSsnRegistrants = new RegistrantList(); 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam // mEcmTimerResetRegistrants are informed after Ecm timer is canceled or re-started 12404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam private final RegistrantList mEcmTimerResetRegistrants = new RegistrantList(); 12504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private String mImei; 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private String mImeiSv; 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private String mVmNumber; 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 130a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville private IsimUiccRecords mIsimUiccRecords; 131a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1326bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville // Create Cfu (Call forward unconditional) so that dialing number & 13331ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville // mOnComplete (Message object passed by client) can be packed & 13431ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville // given as a single Cfu object as user data to RIL. 13531ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville private static class Cfu { 13631ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville final String mSetCfNumber; 13731ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville final Message mOnComplete; 13831ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville 13931ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville Cfu(String cfNumber, Message onComplete) { 14031ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville mSetCfNumber = cfNumber; 14131ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville mOnComplete = onComplete; 14231ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville } 14331ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville } 14431ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Constructors 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public 148299dad50409e907993fa96c7401d4f10c58018b1Wink Saville GSMPhone(Context context, CommandsInterface ci, PhoneNotifier notifier, boolean unitTestMode) { 149ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville super("GSM", notifier, context, ci, unitTestMode); 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ci instanceof SimulatedRadioControl) { 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSimulatedRadioControl = (SimulatedRadioControl) ci; 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.setPhoneType(PhoneConstants.PHONE_TYPE_GSM); 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT = new GsmCallTracker(this); 157e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka 158a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSST = new GsmServiceStateTracker(this); 159454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mDcTracker = new DcTracker(this); 160a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!unitTestMode) { 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSimPhoneBookIntManager = new SimPhoneBookInterfaceManager(this); 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSubInfo = new PhoneSubInfo(this); 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 16622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.registerForAvailable(this, EVENT_RADIO_AVAILABLE, null); 16722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null); 16822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.registerForOn(this, EVENT_RADIO_ON, null); 16922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.setOnUSSD(this, EVENT_USSD, null); 17022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.setOnSuppServiceNotification(this, EVENT_SSN, null); 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null); 17209b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja mCi.setOnSs(this, EVENT_SS, null); 173a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setProperties(); 174a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 175a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 176a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public 177299dad50409e907993fa96c7401d4f10c58018b1Wink Saville GSMPhone(Context context, CommandsInterface ci, PhoneNotifier notifier, int phoneId) { 178a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this(context, ci, notifier, false, phoneId); 179a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 180a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 181a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public 182299dad50409e907993fa96c7401d4f10c58018b1Wink Saville GSMPhone(Context context, CommandsInterface ci, 183a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville PhoneNotifier notifier, boolean unitTestMode, int phoneId) { 184a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville super("GSM", notifier, context, ci, unitTestMode, phoneId); 185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 186a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (ci instanceof SimulatedRadioControl) { 187a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSimulatedRadioControl = (SimulatedRadioControl) ci; 188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCi.setPhoneType(PhoneConstants.PHONE_TYPE_GSM); 191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCT = new GsmCallTracker(this); 192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSST = new GsmServiceStateTracker(this); 194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mDcTracker = new DcTracker(this); 195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 196a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!unitTestMode) { 197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSimPhoneBookIntManager = new SimPhoneBookInterfaceManager(this); 198a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSubInfo = new PhoneSubInfo(this); 199a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 200a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 201a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCi.registerForAvailable(this, EVENT_RADIO_AVAILABLE, null); 202a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCi.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null); 203a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCi.registerForOn(this, EVENT_RADIO_ON, null); 204a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCi.setOnUSSD(this, EVENT_USSD, null); 205a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mCi.setOnSuppServiceNotification(this, EVENT_SSN, null); 206a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null); 20709b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja mCi.setOnSs(this, EVENT_SS, null); 208a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setProperties(); 209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 210a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("GSMPhone: constructor: sub = " + mPhoneId); 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 212a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville setProperties(); 213a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 214a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 215a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville protected void setProperties() { 216e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu TelephonyManager.from(mContext).setPhoneType(getPhoneId(), PhoneConstants.PHONE_TYPE_GSM); 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dispose() { 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville synchronized(PhoneProxy.lockForRadioTechnologyChange) { 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.dispose(); 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //Unregister from all former registered events 22522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.unregisterForAvailable(this); //EVENT_RADIO_AVAILABLE 2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville unregisterForSimRecordEvents(); 22722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.unregisterForOffOrNotAvailable(this); //EVENT_RADIO_OFF_OR_NOT_AVAILABLE 22822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.unregisterForOn(this); //EVENT_RADIO_ON 2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSST.unregisterForNetworkAttached(this); //EVENT_REGISTERED_TO_NETWORK 23022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.unSetOnUSSD(this); 23122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.unSetOnSuppServiceNotification(this); 23209b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja mCi.unSetOnSs(this); 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPendingMMIs.clear(); 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //Force all referenced classes to unregister their former registered events 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.dispose(); 238454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mDcTracker.dispose(); 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSST.dispose(); 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSimPhoneBookIntManager.dispose(); 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSubInfo.dispose(); 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void removeReferences() { 24799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.d(LOG_TAG, "removeReferences"); 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSimulatedRadioControl = null; 2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSimPhoneBookIntManager = null; 2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSubInfo = null; 2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT = null; 2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSST = null; 253a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.removeReferences(); 2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 257cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void finalize() { 25999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if(LOCAL_DEBUG) Rlog.d(LOG_TAG, "GSMPhone finalized"); 2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 262cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public ServiceState 2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getServiceState() { 265e84571be717f0b45c60aa5ad5d07337d81cf23b8Wink Saville if (mSST == null || mSST.mSS.getState() != ServiceState.STATE_IN_SERVICE) { 26680111bd9a39f8c4b6828b68e7f326172e251c78eEtan Cohen if (mImsPhone != null) { 26780111bd9a39f8c4b6828b68e7f326172e251c78eEtan Cohen return ServiceState.mergeServiceStates( 26880111bd9a39f8c4b6828b68e7f326172e251c78eEtan Cohen (mSST == null) ? new ServiceState() : mSST.mSS, 26980111bd9a39f8c4b6828b68e7f326172e251c78eEtan Cohen mImsPhone.getServiceState()); 270e84571be717f0b45c60aa5ad5d07337d81cf23b8Wink Saville } 271e84571be717f0b45c60aa5ad5d07337d81cf23b8Wink Saville } 272e84571be717f0b45c60aa5ad5d07337d81cf23b8Wink Saville 2732ad65b760c52976fe3aa8740934f9cfa108ad4fcJake Hamby if (mSST != null) { 2742ad65b760c52976fe3aa8740934f9cfa108ad4fcJake Hamby return mSST.mSS; 2752ad65b760c52976fe3aa8740934f9cfa108ad4fcJake Hamby } else { 2762ad65b760c52976fe3aa8740934f9cfa108ad4fcJake Hamby // avoid potential NPE in EmergencyCallHelper during Phone switch 2772ad65b760c52976fe3aa8740934f9cfa108ad4fcJake Hamby return new ServiceState(); 2782ad65b760c52976fe3aa8740934f9cfa108ad4fcJake Hamby } 2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 281cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public CellLocation getCellLocation() { 2830c5a2697697b49228bd2e23dc8d8217877a0fd7bWink Saville return mSST.getCellLocation(); 2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 286cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public PhoneConstants.State getState() { 2884f5f5e2aab6a42cdb9493bddcb3c3d9530bc778fEtan Cohen if (mImsPhone != null) { 2894f5f5e2aab6a42cdb9493bddcb3c3d9530bc778fEtan Cohen PhoneConstants.State imsState = mImsPhone.getState(); 2904f5f5e2aab6a42cdb9493bddcb3c3d9530bc778fEtan Cohen if (imsState != PhoneConstants.State.IDLE) { 2914f5f5e2aab6a42cdb9493bddcb3c3d9530bc778fEtan Cohen return imsState; 2924f5f5e2aab6a42cdb9493bddcb3c3d9530bc778fEtan Cohen } 2934f5f5e2aab6a42cdb9493bddcb3c3d9530bc778fEtan Cohen } 2944f5f5e2aab6a42cdb9493bddcb3c3d9530bc778fEtan Cohen 29522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mCT.mState; 2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 298cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int getPhoneType() { 3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return PhoneConstants.PHONE_TYPE_GSM; 3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 303cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 304ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville public ServiceStateTracker getServiceStateTracker() { 305ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville return mSST; 3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 308cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public CallTracker getCallTracker() { 3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mCT; 3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 31326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa // pending voice mail count updated after phone creation 31426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa private void updateVoiceMail() { 31526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa int countVoiceMessages = 0; 31626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa IccRecords r = mIccRecords.get(); 31726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa if (r != null) { 31826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa // get voice mail count from SIM 31926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa countVoiceMessages = r.getVoiceMessageCount(); 32026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa } 32126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa int countVoiceMessagesStored = getStoredVoiceMessageCount(); 32226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa if (countVoiceMessages == -1 && countVoiceMessagesStored != 0) { 32326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa countVoiceMessages = countVoiceMessagesStored; 32426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa } 32526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa Rlog.d(LOG_TAG, "updateVoiceMail countVoiceMessages = " + countVoiceMessages 32626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa +" subId "+getSubId()); 32726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa setVoiceMessageCount(countVoiceMessages); 32826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa } 32926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa 330cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public List<? extends MmiCode> 3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getPendingMmiCodes() { 3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mPendingMMIs; 3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 336cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public PhoneConstants.DataState getDataConnectionState(String apnType) { 3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville PhoneConstants.DataState ret = PhoneConstants.DataState.DISCONNECTED; 3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mSST == null) { 3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Radio Technology Change is ongoning, dispose() and removeReferences() have 3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // already been called 3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret = PhoneConstants.DataState.DISCONNECTED; 345cf5205f70eb1eac497164124187a088ecb03fff5Ram } else if (!apnType.equals(PhoneConstants.APN_TYPE_EMERGENCY) && 346cf5205f70eb1eac497164124187a088ecb03fff5Ram mSST.getCurrentDataConnectionState() != ServiceState.STATE_IN_SERVICE) { 3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // If we're out of service, open TCP sockets may still work 3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // but no data will flow 349cf5205f70eb1eac497164124187a088ecb03fff5Ram 350cf5205f70eb1eac497164124187a088ecb03fff5Ram // Emergency APN is available even in Out Of Service 351cf5205f70eb1eac497164124187a088ecb03fff5Ram // Pass the actual State of EPDN 352cf5205f70eb1eac497164124187a088ecb03fff5Ram 3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret = PhoneConstants.DataState.DISCONNECTED; 354454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville } else if (mDcTracker.isApnTypeEnabled(apnType) == false || 355454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mDcTracker.isApnTypeActive(apnType) == false) { 3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //TODO: isApnTypeActive() is just checking whether ApnContext holds 3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Dataconnection or not. Checking each ApnState below should 3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // provide the same state. Calling isApnTypeActive() can be removed. 3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret = PhoneConstants.DataState.DISCONNECTED; 3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { /* mSST.gprsState == ServiceState.STATE_IN_SERVICE */ 361454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville switch (mDcTracker.getState(apnType)) { 362c6bbea82bf74ebb492508199b6f3e172b7ce860aWink Saville case RETRYING: 3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case FAILED: 3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case IDLE: 3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret = PhoneConstants.DataState.DISCONNECTED; 3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CONNECTED: 3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DISCONNECTING: 37022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if ( mCT.mState != PhoneConstants.State.IDLE 3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville && !mSST.isConcurrentVoiceAndDataAllowed()) { 3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret = PhoneConstants.DataState.SUSPENDED; 3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret = PhoneConstants.DataState.CONNECTED; 3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CONNECTING: 3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case SCANNING: 3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret = PhoneConstants.DataState.CONNECTING; 3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ret; 3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 388cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public DataActivityState getDataActivityState() { 3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville DataActivityState ret = DataActivityState.NONE; 3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 392f92cb4bd5519427a0db673709d94683a8baf203aWink Saville if (mSST.getCurrentDataConnectionState() == ServiceState.STATE_IN_SERVICE) { 393454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville switch (mDcTracker.getActivity()) { 3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DATAIN: 3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret = DataActivityState.DATAIN; 3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DATAOUT: 3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret = DataActivityState.DATAOUT; 4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case DATAINANDOUT: 4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ret = DataActivityState.DATAINANDOUT; 4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 405b3a03455be44a2a0ffbeb757b193d860c1878599Naveen Kalla 406b3a03455be44a2a0ffbeb757b193d860c1878599Naveen Kalla case DORMANT: 407b3a03455be44a2a0ffbeb757b193d860c1878599Naveen Kalla ret = DataActivityState.DORMANT; 408b3a03455be44a2a0ffbeb757b193d860c1878599Naveen Kalla break; 409cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 410cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville default: 411cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville ret = DataActivityState.NONE; 412cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville break; 4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ret; 4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 420cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Notify any interested party of a Phone state change 421cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * {@link com.android.internal.telephony.PhoneConstants.State} 4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void notifyPhoneStateChanged() { 4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNotifier.notifyPhoneState(this); 4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 428cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * Notify registrants of a change in the call state. This notifies changes in 429cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * {@link com.android.internal.telephony.Call.State}. Use this when changes 430cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * in the precise call state are needed, else use notifyPhoneStateChanged. 4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void notifyPreciseCallStateChanged() { 4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /* we'd love it if this was package-scoped*/ 4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.notifyPreciseCallStateChangedP(); 4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4375d0d72d9b7dc34c93303f6732541bbb74fed53daEtan Cohen public void notifyNewRingingConnection(Connection c) { 4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.notifyNewRingingConnectionP(c); 4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyDisconnect(Connection cn) { 4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mDisconnectRegistrants.notifyResult(cn); 4440742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela 4450742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela mNotifier.notifyDisconnectCause(cn.getDisconnectCause(), cn.getPreciseDisconnectCause()); 4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 44883a97603d6e38ca5600cc12780fbfbee0cfe483fYorke Lee void notifyUnknownConnection(Connection cn) { 44983a97603d6e38ca5600cc12780fbfbee0cfe483fYorke Lee mUnknownConnectionRegistrants.notifyResult(cn); 4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void notifySuppServiceFailed(SuppService code) { 4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSuppServiceFailedRegistrants.notifyResult(code); 4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyServiceStateChanged(ServiceState ss) { 4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.notifyServiceStateChangedP(ss); 4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ 4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void notifyLocationChanged() { 4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNotifier.notifyCellLocation(this); 4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 466cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyCallForwardingIndicator() { 4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNotifier.notifyCallForwardingChanged(this); 4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // override for allowing access from other classes of this package 4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@inheritDoc} 4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 476cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 477a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void 4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville setSystemProperty(String property, String value) { 4796bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville TelephonyManager.setTelephonyProperty(mPhoneId, property, value); 4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 482cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void registerForSuppServiceNotification( 4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Handler h, int what, Object obj) { 4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSsnRegistrants.addUnique(h, what, obj); 48622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mSsnRegistrants.size() == 1) mCi.setSuppServiceNotifications(true, null); 4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 489cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void unregisterForSuppServiceNotification(Handler h) { 4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSsnRegistrants.remove(h); 49222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mSsnRegistrants.size() == 0) mCi.setSuppServiceNotifications(false, null); 4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 495cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 496a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void registerForSimRecordsLoaded(Handler h, int what, Object obj) { 497a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSimRecordsLoadedRegistrants.addUnique(h, what, obj); 498a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 499a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 500a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 501a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void unregisterForSimRecordsLoaded(Handler h) { 502a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSimRecordsLoadedRegistrants.remove(h); 503a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 504a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 505a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 5076d05f561549a66b597a5119665ccc3bf8a962d16Andrew Lee acceptCall(int videoState) throws CallStateException { 50838b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen ImsPhone imsPhone = mImsPhone; 50938b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen if ( imsPhone != null && imsPhone.getRingingCall().isRinging() ) { 51038b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen imsPhone.acceptCall(videoState); 5115d0d72d9b7dc34c93303f6732541bbb74fed53daEtan Cohen } else { 5125d0d72d9b7dc34c93303f6732541bbb74fed53daEtan Cohen mCT.acceptCall(); 5135d0d72d9b7dc34c93303f6732541bbb74fed53daEtan Cohen } 5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 516cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 5170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 5180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville rejectCall() throws CallStateException { 5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.rejectCall(); 5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 522cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switchHoldingAndActive() throws CallStateException { 5250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.switchWaitingOrHoldingAndActive(); 5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 528cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean canConference() { 530c6bfb9fe8381b05d9f3cfdf842e9381ca9d4c8f4Etan Cohen boolean canImsConference = false; 531c6bfb9fe8381b05d9f3cfdf842e9381ca9d4c8f4Etan Cohen if (mImsPhone != null) { 532c6bfb9fe8381b05d9f3cfdf842e9381ca9d4c8f4Etan Cohen canImsConference = mImsPhone.canConference(); 533c6bfb9fe8381b05d9f3cfdf842e9381ca9d4c8f4Etan Cohen } 534c6bfb9fe8381b05d9f3cfdf842e9381ca9d4c8f4Etan Cohen return mCT.canConference() || canImsConference; 5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean canDial() { 5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mCT.canDial(); 5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 541cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 542cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public void conference() { 543c6bfb9fe8381b05d9f3cfdf842e9381ca9d4c8f4Etan Cohen if (mImsPhone != null && mImsPhone.canConference()) { 544c6bfb9fe8381b05d9f3cfdf842e9381ca9d4c8f4Etan Cohen log("conference() - delegated to IMS phone"); 545c6bfb9fe8381b05d9f3cfdf842e9381ca9d4c8f4Etan Cohen mImsPhone.conference(); 546c6bfb9fe8381b05d9f3cfdf842e9381ca9d4c8f4Etan Cohen return; 547c6bfb9fe8381b05d9f3cfdf842e9381ca9d4c8f4Etan Cohen } 5480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.conference(); 5490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 551cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 5520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void clearDisconnected() { 5530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.clearDisconnected(); 5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 556cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 5570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean canTransfer() { 5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mCT.canTransfer(); 5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 561cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 562cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville public void explicitCallTransfer() { 5630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.explicitCallTransfer(); 5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 566cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public GsmCall 5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getForegroundCall() { 56922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mCT.mForegroundCall; 5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 572cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public GsmCall 5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getBackgroundCall() { 57522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mCT.mBackgroundCall; 5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 578cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 5795d0d72d9b7dc34c93303f6732541bbb74fed53daEtan Cohen public Call getRingingCall() { 58038b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen ImsPhone imsPhone = mImsPhone; 5815d0d72d9b7dc34c93303f6732541bbb74fed53daEtan Cohen if ( mCT.mRingingCall != null && mCT.mRingingCall.isRinging() ) { 5825d0d72d9b7dc34c93303f6732541bbb74fed53daEtan Cohen return mCT.mRingingCall; 58338b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen } else if ( imsPhone != null ) { 58438b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen return imsPhone.getRingingCall(); 5855d0d72d9b7dc34c93303f6732541bbb74fed53daEtan Cohen } 58622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mCT.mRingingCall; 5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean handleCallDeflectionIncallSupplementaryService( 590cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String dialString) { 5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (dialString.length() > 1) { 5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (getRingingCall().getState() != GsmCall.State.IDLE) { 59699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, "MmiCode 0: rejectCall"); 5970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.rejectCall(); 5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (CallStateException e) { 60099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, 6010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "reject failed", e); 6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifySuppServiceFailed(Phone.SuppService.REJECT); 6030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (getBackgroundCall().getState() != GsmCall.State.IDLE) { 60599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, 6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "MmiCode 0: hangupWaitingOrBackground"); 6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.hangupWaitingOrBackground(); 6080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean handleCallWaitingIncallSupplementaryService( 614cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String dialString) { 6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int len = dialString.length(); 6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (len > 2) { 6180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 6190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 621cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville GsmCall call = getForegroundCall(); 6220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (len > 1) { 6250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville char ch = dialString.charAt(1); 6260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int callIndex = ch - '0'; 6270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (callIndex >= 1 && callIndex <= GsmCallTracker.MAX_CONNECTIONS) { 62999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, 6300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "MmiCode 1: hangupConnectionByIndex " + 6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville callIndex); 6320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.hangupConnectionByIndex(call, callIndex); 6330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 6350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (call.getState() != GsmCall.State.IDLE) { 63699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, 6370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "MmiCode 1: hangup foreground"); 6380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //mCT.hangupForegroundResumeBackground(); 6390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.hangup(call); 6400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 64199c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, 6420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "MmiCode 1: switchWaitingOrHoldingAndActive"); 6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.switchWaitingOrHoldingAndActive(); 6440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (CallStateException e) { 64799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, 6480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "hangup failed", e); 6490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifySuppServiceFailed(Phone.SuppService.HANGUP); 6500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 6530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 655cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private boolean handleCallHoldIncallSupplementaryService(String dialString) { 6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int len = dialString.length(); 6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (len > 2) { 6590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 6600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 662cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville GsmCall call = getForegroundCall(); 6630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (len > 1) { 6650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville char ch = dialString.charAt(1); 6670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int callIndex = ch - '0'; 6680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GsmConnection conn = mCT.getConnectionByIndex(call, callIndex); 6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 6700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // gsm index starts at 1, up to 5 connections in a call, 6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (conn != null && callIndex >= 1 && callIndex <= GsmCallTracker.MAX_CONNECTIONS) { 67299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, "MmiCode 2: separate call "+ 6730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville callIndex); 6740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.separate(conn); 6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 67699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, "separate: invalid call index "+ 6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville callIndex); 6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifySuppServiceFailed(Phone.SuppService.SEPARATE); 6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (CallStateException e) { 68199c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, 6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "separate failed", e); 6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifySuppServiceFailed(Phone.SuppService.SEPARATE); 6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 6860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (getRingingCall().getState() != GsmCall.State.IDLE) { 68899c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, 6890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "MmiCode 2: accept ringing call"); 6900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.acceptCall(); 6910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 69299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, 6930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "MmiCode 2: switchWaitingOrHoldingAndActive"); 6940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.switchWaitingOrHoldingAndActive(); 6950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 6960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (CallStateException e) { 69799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, 6980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "switch failed", e); 6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifySuppServiceFailed(Phone.SuppService.SWITCH); 7000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean handleMultipartyIncallSupplementaryService( 707cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville String dialString) { 7080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (dialString.length() > 1) { 7090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 7100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 71299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, "MmiCode 3: merge calls"); 713cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville conference(); 7140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 7150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 717cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private boolean handleEctIncallSupplementaryService(String dialString) { 7180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int len = dialString.length(); 7200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (len != 1) { 7220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 7230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 72599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, "MmiCode 4: explicit call transfer"); 726cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville explicitCallTransfer(); 7270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 7280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 730cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private boolean handleCcbsIncallSupplementaryService(String dialString) { 7310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (dialString.length() > 1) { 7320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 7330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 73599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.i(LOG_TAG, "MmiCode 5: CCBS not supported!"); 7360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Treat it as an "unknown" service. 7370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifySuppServiceFailed(Phone.SuppService.UNKNOWN); 7380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 7390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 741cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 742a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean handleInCallMmiCommands(String dialString) throws CallStateException { 74338b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen ImsPhone imsPhone = mImsPhone; 74438b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen if (imsPhone != null 74538b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen && imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE) { 74638b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen return imsPhone.handleInCallMmiCommands(dialString); 747a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 748a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 7490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!isInCall()) { 7500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 7510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (TextUtils.isEmpty(dialString)) { 7540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean result = false; 7580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville char ch = dialString.charAt(0); 7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (ch) { 7600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case '0': 7610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result = handleCallDeflectionIncallSupplementaryService( 7620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dialString); 7630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case '1': 7650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result = handleCallWaitingIncallSupplementaryService( 7660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dialString); 7670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case '2': 7690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result = handleCallHoldIncallSupplementaryService(dialString); 7700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case '3': 7720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result = handleMultipartyIncallSupplementaryService(dialString); 7730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case '4': 7750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result = handleEctIncallSupplementaryService(dialString); 7760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case '5': 7780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville result = handleCcbsIncallSupplementaryService(dialString); 7790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 7810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 7820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return result; 7850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean isInCall() { 7880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GsmCall.State foregroundCallState = getForegroundCall().getState(); 7890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GsmCall.State backgroundCallState = getBackgroundCall().getState(); 7900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GsmCall.State ringingCallState = getRingingCall().getState(); 7910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 7920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return (foregroundCallState.isAlive() || 7930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville backgroundCallState.isAlive() || 7940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ringingCallState.isAlive()); 7950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 7960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 797cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 7980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Connection 7996bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn dial(String dialString, int videoState) throws CallStateException { 8006bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn return dial(dialString, null, videoState); 8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 803cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 8040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Connection 8056bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn dial (String dialString, UUSInfo uusInfo, int videoState) throws CallStateException { 80638b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen ImsPhone imsPhone = mImsPhone; 8078c3879362ce5a7a7c8151ec415e4d394812df357Etan Cohen 808284fb669478713333afe8ad2af329e4a6497911dEtan Cohen boolean imsUseEnabled = 8090b83b4f03096a3b7111d758407786538fdfd3dffEtan Cohen ImsManager.isVolteEnabledByPlatform(mContext) && 810f1099a9dfe0250a6b343de0646413db4034381deEtan Cohen ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mContext) && 811f1099a9dfe0250a6b343de0646413db4034381deEtan Cohen ImsManager.isNonTtyOrTtyOnVolteEnabled(mContext); 8128c3879362ce5a7a7c8151ec415e4d394812df357Etan Cohen if (!imsUseEnabled) { 8138c3879362ce5a7a7c8151ec415e4d394812df357Etan Cohen Rlog.w(LOG_TAG, "IMS is disabled: forced to CS"); 8148c3879362ce5a7a7c8151ec415e4d394812df357Etan Cohen } 8158c3879362ce5a7a7c8151ec415e4d394812df357Etan Cohen 816367855488aacde260410dad0eddc18b183cf852fEtan Cohen if (LOCAL_DEBUG) { 817367855488aacde260410dad0eddc18b183cf852fEtan Cohen Rlog.d(LOG_TAG, "imsUseEnabled=" + imsUseEnabled + ", imsPhone=" + imsPhone 818367855488aacde260410dad0eddc18b183cf852fEtan Cohen + ", imsPhone.isVolteEnabled()=" 819367855488aacde260410dad0eddc18b183cf852fEtan Cohen + ((imsPhone != null) ? imsPhone.isVolteEnabled() : "N/A") 820367855488aacde260410dad0eddc18b183cf852fEtan Cohen + ", imsPhone.getServiceState().getState()=" 821367855488aacde260410dad0eddc18b183cf852fEtan Cohen + ((imsPhone != null) ? imsPhone.getServiceState().getState() : "N/A")); 822367855488aacde260410dad0eddc18b183cf852fEtan Cohen } 823367855488aacde260410dad0eddc18b183cf852fEtan Cohen 8245bf6757ac96865fc84e4a4326b76cf6d9b136800Libin.Tang@motorola.com if (imsUseEnabled && imsPhone != null && imsPhone.isVolteEnabled() 82538b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen && ((imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE 826077d04f2ca9fbf1b17302aff609aba5d1659f56bShriram Ganesh && !PhoneNumberUtils.isEmergencyNumber(dialString)) 827077d04f2ca9fbf1b17302aff609aba5d1659f56bShriram Ganesh || (PhoneNumberUtils.isEmergencyNumber(dialString) 828077d04f2ca9fbf1b17302aff609aba5d1659f56bShriram Ganesh && mContext.getResources().getBoolean( 829077d04f2ca9fbf1b17302aff609aba5d1659f56bShriram Ganesh com.android.internal.R.bool.useImsAlwaysForEmergencyCall))) ) { 830a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville try { 8318c3879362ce5a7a7c8151ec415e4d394812df357Etan Cohen if (LOCAL_DEBUG) Rlog.d(LOG_TAG, "Trying IMS PS call"); 83238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen return imsPhone.dial(dialString, videoState); 833a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } catch (CallStateException e) { 8345bf6757ac96865fc84e4a4326b76cf6d9b136800Libin.Tang@motorola.com if (LOCAL_DEBUG) Rlog.d(LOG_TAG, "IMS PS call exception " + e + 8355bf6757ac96865fc84e4a4326b76cf6d9b136800Libin.Tang@motorola.com "imsUseEnabled =" + imsUseEnabled + ", imsPhone =" + imsPhone); 836888c60a7fe1c8f3612ab8e8ec5f2f7ca8f24e766Etan Cohen if (!ImsPhone.CS_FALLBACK.equals(e.getMessage())) { 837a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville CallStateException ce = new CallStateException(e.getMessage()); 838a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ce.setStackTrace(e.getStackTrace()); 839a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville throw ce; 840a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 841a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 842a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 843a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 8448c3879362ce5a7a7c8151ec415e4d394812df357Etan Cohen if (LOCAL_DEBUG) Rlog.d(LOG_TAG, "Trying (non-IMS) CS call"); 845d5c5a168b4f5806701a4d146309c996acca7183dIhab Awad return dialInternal(dialString, null, VideoProfile.VideoState.AUDIO_ONLY); 846a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 847a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 848a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 849a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville protected Connection 8506bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn dialInternal (String dialString, UUSInfo uusInfo, int videoState) 8516bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn throws CallStateException { 8526bbcbfd62c9aa5787e7c33936e2246ff05b59d58Tyler Gunn 8530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Need to make sure dialString gets parsed properly 8540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String newDialString = PhoneNumberUtils.stripSeparators(dialString); 8550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // handle in-call MMI first if applicable 8570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (handleInCallMmiCommands(newDialString)) { 8580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 8590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Only look at the Network portion for mmi 8620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String networkPortion = PhoneNumberUtils.extractNetworkPortionAlt(newDialString); 863e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka GsmMmiCode mmi = 864e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka GsmMmiCode.newFromDialString(networkPortion, this, mUiccApplication.get()); 86599c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, 8660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "dialing w/ mmi '" + mmi + "'..."); 8670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mmi == null) { 8690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mCT.dial(newDialString, uusInfo); 8700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (mmi.isTemporaryModeCLIR()) { 87122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mCT.dial(mmi.mDialingNumber, mmi.getCLIRMode(), uusInfo); 8720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 8730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPendingMMIs.add(mmi); 8740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null)); 8750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mmi.processCode(); 8760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // FIXME should this return null or something else? 8780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return null; 8790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 882cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 8830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean handlePinMmi(String dialString) { 884e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka GsmMmiCode mmi = GsmMmiCode.newFromDialString(dialString, this, mUiccApplication.get()); 8850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8863522c54a64f577f2b657a775dae9b4eb2d8003d5Wink Saville if (mmi != null && mmi.isPinPukCommand()) { 8870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPendingMMIs.add(mmi); 8880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null)); 8890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mmi.processCode(); 8900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 8910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 8930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 8940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 8950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 896cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 8970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void sendUssdResponse(String ussdMessge) { 898e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka GsmMmiCode mmi = GsmMmiCode.newFromUssdUserInput(ussdMessge, this, mUiccApplication.get()); 8990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPendingMMIs.add(mmi); 9000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null)); 9010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mmi.sendUssd(ussdMessge); 9020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 904cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 9050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 9060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendDtmf(char c) { 9070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!PhoneNumberUtils.is12Key(c)) { 90899c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, 9090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "sendDtmf called with invalid character '" + c + "'"); 9100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 91122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mCT.mState == PhoneConstants.State.OFFHOOK) { 91222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.sendDtmf(c, null); 9130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 917cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 9180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 9190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville startDtmf(char c) { 9200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!PhoneNumberUtils.is12Key(c)) { 92199c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, 9220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville "startDtmf called with invalid character '" + c + "'"); 9230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 92422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.startDtmf(c, null); 9250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 928cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 9290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 9300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville stopDtmf() { 93122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.stopDtmf(null); 9320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 9350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville sendBurstDtmf(String dtmfString) { 93699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, "[GSMPhone] sendBurstDtmf() is a CDMA method"); 9370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 939cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 9400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 9410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville setRadioPower(boolean power) { 9420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSST.setRadioPower(power); 9430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void storeVoiceMailNumber(String number) { 9460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); 9470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SharedPreferences.Editor editor = sp.edit(); 948a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville editor.putString(VM_NUMBER + getPhoneId(), number); 9490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville editor.apply(); 9500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville setVmSimImsi(getSubscriberId()); 9510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 953cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 9540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getVoiceMailNumber() { 9550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Read from the SIM. If its null, try reading from the shared preference area. 956e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka IccRecords r = mIccRecords.get(); 957e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka String number = (r != null) ? r.getVoiceMailNumber() : ""; 9580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (TextUtils.isEmpty(number)) { 9590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); 960a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville number = sp.getString(VM_NUMBER + getPhoneId(), null); 9610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9624fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying 9634fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying if (TextUtils.isEmpty(number)) { 9644fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying String[] listArray = getContext().getResources() 9654fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying .getStringArray(com.android.internal.R.array.config_default_vm_number); 9664fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying if (listArray != null && listArray.length > 0) { 9674fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying for (int i=0; i<listArray.length; i++) { 9684fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying if (!TextUtils.isEmpty(listArray[i])) { 9694fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying String[] defaultVMNumberArray = listArray[i].split(";"); 9704fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying if (defaultVMNumberArray != null && defaultVMNumberArray.length > 0) { 9714fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying if (defaultVMNumberArray.length == 1) { 9724fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying number = defaultVMNumberArray[0]; 9734fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying } else if (defaultVMNumberArray.length == 2 && 9744fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying !TextUtils.isEmpty(defaultVMNumberArray[1]) && 9754fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying defaultVMNumberArray[1].equalsIgnoreCase(getGroupIdLevel1())) { 9764fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying number = defaultVMNumberArray[0]; 9774fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying break; 9784fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying } 9794fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying } 9804fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying } 9814fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying } 9824fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying } 9834fe735103bd4d8026a25f4b0b40784fe60cddac4Xia Ying } 9840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return number; 9850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private String getVmSimImsi() { 9880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); 989a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return sp.getString(VM_SIM_IMSI + getPhoneId(), null); 9900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 9920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void setVmSimImsi(String imsi) { 9930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); 9940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SharedPreferences.Editor editor = sp.edit(); 995a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville editor.putString(VM_SIM_IMSI + getPhoneId(), imsi); 9960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville editor.apply(); 9970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 9980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 999cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 10000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getVoiceMailAlphaTag() { 10010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String ret; 1002e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka IccRecords r = mIccRecords.get(); 10030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1004e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka ret = (r != null) ? r.getVoiceMailAlphaTag() : ""; 10050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ret == null || ret.length() == 0) { 10070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mContext.getText( 10080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville com.android.internal.R.string.defaultVoiceMailAlphaTag).toString(); 10090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ret; 10120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1014cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 10150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getDeviceId() { 10160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mImei; 10170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1019cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 10200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getDeviceSvn() { 10210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mImeiSv; 10220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1024cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1025a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public IsimRecords getIsimRecords() { 1026a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mIsimUiccRecords; 1027a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1028a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1029a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 10300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getImei() { 10310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mImei; 10320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1034cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 10350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getEsn() { 103699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, "[GSMPhone] getEsn() is a CDMA method"); 10370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return "0"; 10380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1040cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 10410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getMeid() { 104299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, "[GSMPhone] getMeid() is a CDMA method"); 10430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return "0"; 10440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1046cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1047e9fdc85df2111a0a0d7d240bbc11ed5b14b01376xinhe public String getNai() { 1048e9fdc85df2111a0a0d7d240bbc11ed5b14b01376xinhe IccRecords r = mUiccController.getIccRecords(mPhoneId, UiccController.APP_FAM_3GPP2); 1049e9fdc85df2111a0a0d7d240bbc11ed5b14b01376xinhe if (Log.isLoggable(LOG_TAG, Log.VERBOSE)) { 1050e9fdc85df2111a0a0d7d240bbc11ed5b14b01376xinhe Rlog.v(LOG_TAG, "IccRecords is " + r); 1051e9fdc85df2111a0a0d7d240bbc11ed5b14b01376xinhe } 1052e9fdc85df2111a0a0d7d240bbc11ed5b14b01376xinhe return (r != null) ? r.getNAI() : null; 1053e9fdc85df2111a0a0d7d240bbc11ed5b14b01376xinhe } 1054e9fdc85df2111a0a0d7d240bbc11ed5b14b01376xinhe 1055e9fdc85df2111a0a0d7d240bbc11ed5b14b01376xinhe @Override 10560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getSubscriberId() { 1057e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka IccRecords r = mIccRecords.get(); 10584b048b326272496b8bd6932173041280bc22c8dcAbhishek Adappa return (r != null) ? r.getIMSI() : null; 10590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1061cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 10620e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi public String getGroupIdLevel1() { 10630e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi IccRecords r = mIccRecords.get(); 10640e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi return (r != null) ? r.getGid1() : null; 10650e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi } 10660e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi 10670e4abef0d7e978d4c3dea5199f451a1c69158d03Sungmin Choi @Override 10680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getLine1Number() { 1069e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka IccRecords r = mIccRecords.get(); 10704b048b326272496b8bd6932173041280bc22c8dcAbhishek Adappa return (r != null) ? r.getMsisdnNumber() : null; 10710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 10730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 10740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getMsisdn() { 1075e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka IccRecords r = mIccRecords.get(); 10763c6bdec23af42aba1168303cdefc20525b0ec1d0Ajay Nambi return (r != null) ? r.getMsisdnNumber() : null; 10770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1079cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 10800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getLine1AlphaTag() { 1081e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka IccRecords r = mIccRecords.get(); 10823c6bdec23af42aba1168303cdefc20525b0ec1d0Ajay Nambi return (r != null) ? r.getMsisdnAlphaTag() : null; 10830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1085cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 10865866914ae9798adebcb84cd710bca660b797bff0Amit Mahajan public boolean setLine1Number(String alphaTag, String number, Message onComplete) { 1087e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka IccRecords r = mIccRecords.get(); 1088e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka if (r != null) { 1089e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka r.setMsisdnNumber(alphaTag, number, onComplete); 10905866914ae9798adebcb84cd710bca660b797bff0Amit Mahajan return true; 10915866914ae9798adebcb84cd710bca660b797bff0Amit Mahajan } else { 10925866914ae9798adebcb84cd710bca660b797bff0Amit Mahajan return false; 1093e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka } 10940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 10950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1096cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 10970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setVoiceMailNumber(String alphaTag, 10980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String voiceMailNumber, 10990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Message onComplete) { 11000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Message resp; 11020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mVmNumber = voiceMailNumber; 11030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville resp = obtainMessage(EVENT_SET_VM_NUMBER_DONE, 0, 0, onComplete); 1104e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka IccRecords r = mIccRecords.get(); 1105e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka if (r != null) { 1106e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka r.setVoiceMailNumber(alphaTag, mVmNumber, resp); 1107e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka } 11080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean isValidCommandInterfaceCFReason (int commandInterfaceCFReason) { 11110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (commandInterfaceCFReason) { 11120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CF_REASON_UNCONDITIONAL: 11130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CF_REASON_BUSY: 11140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CF_REASON_NO_REPLY: 11150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CF_REASON_NOT_REACHABLE: 11160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CF_REASON_ALL: 11170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CF_REASON_ALL_CONDITIONAL: 11180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 11190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 11200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 11210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1124367855488aacde260410dad0eddc18b183cf852fEtan Cohen @Override 1125a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public String getSystemProperty(String property, String defValue) { 1126a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if(getUnitTestMode()) { 1127a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return null; 1128a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 11296bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville return TelephonyManager.getTelephonyProperty(mPhoneId, property, defValue); 1130a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1131a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 11320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean isValidCommandInterfaceCFAction (int commandInterfaceCFAction) { 11330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (commandInterfaceCFAction) { 11340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CF_ACTION_DISABLE: 11350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CF_ACTION_ENABLE: 11360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CF_ACTION_REGISTRATION: 11370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case CF_ACTION_ERASURE: 11380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 11390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 11400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 11410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1144a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void updateDataConnectionTracker() { 1145a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ((DcTracker)mDcTracker).update(); 1146a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1147a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 11480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected boolean isCfEnable(int action) { 11490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return (action == CF_ACTION_ENABLE) || (action == CF_ACTION_REGISTRATION); 11500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1152cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 11530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void getCallForwardingOption(int commandInterfaceCFReason, Message onComplete) { 115438b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen ImsPhone imsPhone = mImsPhone; 115538b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen if ((imsPhone != null) 115638b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen && (imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE)) { 115738b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen imsPhone.getCallForwardingOption(commandInterfaceCFReason, onComplete); 1158a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 1159a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1160a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 11610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (isValidCommandInterfaceCFReason(commandInterfaceCFReason)) { 116299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, "requesting call forwarding query."); 11630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Message resp; 11640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (commandInterfaceCFReason == CF_REASON_UNCONDITIONAL) { 11650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville resp = obtainMessage(EVENT_GET_CALL_FORWARD_DONE, onComplete); 11660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 11670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville resp = onComplete; 11680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 116922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.queryCallForwardStatus(commandInterfaceCFReason,0,null,resp); 11700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 11720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1173cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 11740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setCallForwardingOption(int commandInterfaceCFAction, 11750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int commandInterfaceCFReason, 11760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String dialingNumber, 11770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int timerSeconds, 11780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Message onComplete) { 117938b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen ImsPhone imsPhone = mImsPhone; 118038b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen if ((imsPhone != null) 118138b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen && (imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE)) { 118238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen imsPhone.setCallForwardingOption(commandInterfaceCFAction, 1183a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville commandInterfaceCFReason, dialingNumber, timerSeconds, onComplete); 1184a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 1185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1186a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 11870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ( (isValidCommandInterfaceCFAction(commandInterfaceCFAction)) && 11880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (isValidCommandInterfaceCFReason(commandInterfaceCFReason))) { 11890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Message resp; 11910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (commandInterfaceCFReason == CF_REASON_UNCONDITIONAL) { 119231ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville Cfu cfu = new Cfu(dialingNumber, onComplete); 11930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville resp = obtainMessage(EVENT_SET_CALL_FORWARD_DONE, 119431ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville isCfEnable(commandInterfaceCFAction) ? 1 : 0, 0, cfu); 11950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 11960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville resp = onComplete; 11970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 119822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.setCallForward(commandInterfaceCFAction, 11990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville commandInterfaceCFReason, 12000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CommandsInterface.SERVICE_CLASS_VOICE, 12010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville dialingNumber, 12020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville timerSeconds, 12030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville resp); 12040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1207cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 12080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void getOutgoingCallerIdDisplay(Message onComplete) { 120922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.getCLIR(onComplete); 12100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1212cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 12130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode, 12140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Message onComplete) { 121522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.setCLIR(commandInterfaceCLIRMode, 12160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville obtainMessage(EVENT_SET_CLIR_COMPLETE, commandInterfaceCLIRMode, 0, onComplete)); 12170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1219cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 12200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void getCallWaiting(Message onComplete) { 122138b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen ImsPhone imsPhone = mImsPhone; 122238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen if ((imsPhone != null) 122338b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen && (imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE)) { 122438b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen imsPhone.getCallWaiting(onComplete); 1225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 1226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 12280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //As per 3GPP TS 24.083, section 1.6 UE doesn't need to send service 12290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville //class parameter in call waiting interrogation to network 123022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.queryCallWaiting(CommandsInterface.SERVICE_CLASS_NONE, onComplete); 12310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1233cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 12340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setCallWaiting(boolean enable, Message onComplete) { 123538b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen ImsPhone imsPhone = mImsPhone; 123638b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen if ((imsPhone != null) 123738b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen && (imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE)) { 123838b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen imsPhone.setCallWaiting(enable, onComplete); 1239a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return; 1240a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1241a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 124222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.setCallWaiting(enable, CommandsInterface.SERVICE_CLASS_VOICE, onComplete); 12430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1245cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 12460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 12470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getAvailableNetworks(Message response) { 124822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.getAvailableNetworks(response); 12490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1251cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 12520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void 12530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville getNeighboringCids(Message response) { 125422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.getNeighboringCids(response); 12550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1257cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 12580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setOnPostDialCharacter(Handler h, int what, Object obj) { 12590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPostDialHandler = new Registrant(h, what, obj); 12600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1262cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 1263b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh public void setUiTTYMode(int uiTtyMode, Message onComplete) { 1264b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh if (mImsPhone != null) { 1265b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh mImsPhone.setUiTTYMode(uiTtyMode, onComplete); 1266b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh } 1267b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh } 1268b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh 1269b7aff911e1106eb2eb16fd2bafae0ed8f4d4d4f7Shriram Ganesh @Override 12700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setMute(boolean muted) { 12710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCT.setMute(muted); 12720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1274cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 12750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean getMute() { 12760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mCT.getMute(); 12770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1279cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 12800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void getDataCallList(Message response) { 128122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.getDataCallList(response); 12820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1284cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 12850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void updateServiceLocation() { 12860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSST.enableSingleLocationUpdate(); 12870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1289cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 12900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void enableLocationUpdates() { 12910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSST.enableLocationUpdates(); 12920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1294cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 12950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void disableLocationUpdates() { 12960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSST.disableLocationUpdates(); 12970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 12980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1299cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 13000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean getDataRoamingEnabled() { 1301454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville return mDcTracker.getDataOnRoamingEnabled(); 13020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1304cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 13050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setDataRoamingEnabled(boolean enable) { 1306454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville mDcTracker.setDataOnRoamingEnabled(enable); 13070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13093a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt @Override 13103a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt public boolean getDataEnabled() { 13113a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt return mDcTracker.getDataEnabled(); 13123a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt } 13133a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt 13143a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt @Override 13153a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt public void setDataEnabled(boolean enable) { 13163a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt mDcTracker.setDataEnabled(enable); 13173a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt } 13183a6fa6e964a0cb361f79302afe18b8d7f5f9ceefRobert Greenwalt 13190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 13200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Removes the given MMI from the pending list and notifies 13210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * registrants that it is complete. 13220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param mmi MMI that is done 13230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 13240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /*package*/ void 13250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onMMIDone(GsmMmiCode mmi) { 13260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /* Only notify complete if it's on the pending list. 13270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Otherwise, it's already been handled (eg, previously canceled). 13280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The exception is cancellation of an incoming USSD-REQUEST, which is 13290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * not on the list. 13300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 133109b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja if (mPendingMMIs.remove(mmi) || mmi.isUssdRequest() || mmi.isSsInfo()) { 13320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mMmiCompleteRegistrants.notifyRegistrants( 13330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville new AsyncResult(null, mmi, null)); 13340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void 13390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onNetworkInitiatedUssd(GsmMmiCode mmi) { 13400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mMmiCompleteRegistrants.notifyRegistrants( 13410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville new AsyncResult(null, mmi, null)); 13420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** ussdMode is one of CommandsInterface.USSD_MODE_* */ 13460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void 13470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onIncomingUSSD (int ussdMode, String ussdMessage) { 13480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean isUssdError; 13490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean isUssdRequest; 13500aa03d22e29d57d1064c292bcdb4e762e9abca01Anju Mathapati boolean isUssdRelease; 13510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isUssdRequest 13530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = (ussdMode == CommandsInterface.USSD_MODE_REQUEST); 13540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isUssdError 13560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville = (ussdMode != CommandsInterface.USSD_MODE_NOTIFY 13570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville && ussdMode != CommandsInterface.USSD_MODE_REQUEST); 13580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13590aa03d22e29d57d1064c292bcdb4e762e9abca01Anju Mathapati isUssdRelease = (ussdMode == CommandsInterface.USSD_MODE_NW_RELEASE); 13600aa03d22e29d57d1064c292bcdb4e762e9abca01Anju Mathapati 13610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // See comments in GsmMmiCode.java 13620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // USSD requests aren't finished until one 13630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // of these two events happen 13640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GsmMmiCode found = null; 13650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = 0, s = mPendingMMIs.size() ; i < s; i++) { 13660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if(mPendingMMIs.get(i).isPendingUSSD()) { 13670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville found = mPendingMMIs.get(i); 13680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 13690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (found != null) { 13730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Complete pending USSD 13740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13750aa03d22e29d57d1064c292bcdb4e762e9abca01Anju Mathapati if (isUssdRelease) { 13760aa03d22e29d57d1064c292bcdb4e762e9abca01Anju Mathapati found.onUssdRelease(); 13770aa03d22e29d57d1064c292bcdb4e762e9abca01Anju Mathapati } else if (isUssdError) { 13780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville found.onUssdFinishedError(); 13790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 13800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville found.onUssdFinished(ussdMessage, isUssdRequest); 13810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { // pending USSD not found 13830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // The network may initiate its own USSD request 13840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // ignore everything that isnt a Notify or a Request 13860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // also, discard if there is no message to present 13870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!isUssdError && ussdMessage != null) { 13880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville GsmMmiCode mmi; 13890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mmi = GsmMmiCode.newNetworkInitiatedUssd(ussdMessage, 13900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville isUssdRequest, 1391e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka GSMPhone.this, 1392e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.get()); 13930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onNetworkInitiatedUssd(mmi); 13940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 13970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 13990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Make sure the network knows our preferred setting. 14000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 14010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void syncClirSetting() { 14020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); 1403a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville int clirSetting = sp.getInt(CLIR_KEY + getPhoneId(), -1); 14040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (clirSetting >= 0) { 140522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.setCLIR(clirSetting, null); 14060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 14100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void handleMessage (Message msg) { 14110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult ar; 14120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Message onComplete; 14130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14147771a0a487bc9253872034025e9c91283af4425fEtan Cohen // messages to be handled whether or not the phone is being destroyed 14157771a0a487bc9253872034025e9c91283af4425fEtan Cohen // should only include messages which are being re-directed and do not use 14167771a0a487bc9253872034025e9c91283af4425fEtan Cohen // resources of the phone being destroyed 14177771a0a487bc9253872034025e9c91283af4425fEtan Cohen switch (msg.what) { 14187771a0a487bc9253872034025e9c91283af4425fEtan Cohen // handle the select network completion callbacks. 14197771a0a487bc9253872034025e9c91283af4425fEtan Cohen case EVENT_SET_NETWORK_MANUAL_COMPLETE: 14207771a0a487bc9253872034025e9c91283af4425fEtan Cohen case EVENT_SET_NETWORK_AUTOMATIC_COMPLETE: 14217771a0a487bc9253872034025e9c91283af4425fEtan Cohen super.handleMessage(msg); 14227771a0a487bc9253872034025e9c91283af4425fEtan Cohen return; 14237771a0a487bc9253872034025e9c91283af4425fEtan Cohen } 14247771a0a487bc9253872034025e9c91283af4425fEtan Cohen 14255e2000b856a7959609e8f15148a3584ec372f865Wink Saville if (!mIsTheCurrentActivePhone) { 14265e2000b856a7959609e8f15148a3584ec372f865Wink Saville Rlog.e(LOG_TAG, "Received message " + msg + 14275e2000b856a7959609e8f15148a3584ec372f865Wink Saville "[" + msg.what + "] while being destroyed. Ignoring."); 14285e2000b856a7959609e8f15148a3584ec372f865Wink Saville return; 14295e2000b856a7959609e8f15148a3584ec372f865Wink Saville } 14300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (msg.what) { 14310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_RADIO_AVAILABLE: { 143222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.getBasebandVersion( 14330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville obtainMessage(EVENT_GET_BASEBAND_VERSION_DONE)); 14340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 143522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.getIMEI(obtainMessage(EVENT_GET_IMEI_DONE)); 143622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.getIMEISV(obtainMessage(EVENT_GET_IMEISV_DONE)); 14372b40e6226b4b71408964bca46f0a9f256cd4f523Wink Saville mCi.getRadioCapability(obtainMessage(EVENT_GET_RADIO_CAPABILITY)); 14380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 14400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1441f9a248ba28469d55ea75f032a9cc7e2f55c16c9fEtan Cohen case EVENT_RADIO_ON: 1442f9a248ba28469d55ea75f032a9cc7e2f55c16c9fEtan Cohen // do-nothing 144338b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen break; 14440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_REGISTERED_TO_NETWORK: 14460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville syncClirSetting(); 14470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 14480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_SIM_RECORDS_LOADED: 14500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville updateCurrentCarrierInProvider(); 14510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Check if this is a different SIM than the previous one. If so unset the 14530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // voice mail number. 14540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String imsi = getVmSimImsi(); 14550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String imsiFromSIM = getSubscriberId(); 14560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (imsi != null && imsiFromSIM != null && !imsiFromSIM.equals(imsi)) { 14570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville storeVoiceMailNumber(null); 14580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville setVmSimImsi(null); 14590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1461a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mSimRecordsLoadedRegistrants.notifyRegistrants(); 146226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa updateVoiceMail(); 14630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 14640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_GET_BASEBAND_VERSION_DONE: 14660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult)msg.obj; 14670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ar.exception != null) { 14690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 14700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 147299c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville if (LOCAL_DEBUG) Rlog.d(LOG_TAG, "Baseband version: " + ar.result); 1473e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu TelephonyManager.from(mContext).setBasebandVersionForPhone(getPhoneId(), 1474e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu (String)ar.result); 14750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 14760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_GET_IMEI_DONE: 14780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult)msg.obj; 14790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ar.exception != null) { 14810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 14820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mImei = (String)ar.result; 14850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 14860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_GET_IMEISV_DONE: 14880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult)msg.obj; 14890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ar.exception != null) { 14910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 14920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 14930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mImeiSv = (String)ar.result; 14950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 14960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 14970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_USSD: 14980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult)msg.obj; 14990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String[] ussdResult = (String[]) ar.result; 15010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ussdResult.length > 1) { 15030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 15040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onIncomingUSSD(Integer.parseInt(ussdResult[0]), ussdResult[1]); 15050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (NumberFormatException e) { 150699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.w(LOG_TAG, "error parsing USSD"); 15070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 15100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 151138b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen case EVENT_RADIO_OFF_OR_NOT_AVAILABLE: { 15120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Some MMI requests (eg USSD) are not completed 15130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // within the course of a CommandsInterface request 15140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // If the radio shuts off or resets while one of these 15150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // is pending, we need to clean up. 15160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = mPendingMMIs.size() - 1; i >= 0; i--) { 15180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mPendingMMIs.get(i).isPendingUSSD()) { 15190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mPendingMMIs.get(i).onUssdFinishedError(); 15200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 152238b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen ImsPhone imsPhone = mImsPhone; 152338b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen if (imsPhone != null) { 152438b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen imsPhone.getServiceState().setStateOff(); 1525a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 15266bc4098827f3070a44b5e51508b455d7c7be9c07Wink Saville mRadioOffOrNotAvailableRegistrants.notifyRegistrants(); 152738b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen break; 152838b5fac001d38ad7a4f886ba7fcaf7c417216b01Etan Cohen } 15290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_SSN: 15310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult)msg.obj; 15320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SuppServiceNotification not = (SuppServiceNotification) ar.result; 15330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSsnRegistrants.notifyRegistrants(ar); 15340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 15350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_SET_CALL_FORWARD_DONE: 15370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult)msg.obj; 1538e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka IccRecords r = mIccRecords.get(); 153931ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville Cfu cfu = (Cfu) ar.userObj; 1540e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka if (ar.exception == null && r != null) { 154131ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville r.setVoiceCallForwardingFlag(1, msg.arg1 == 1, cfu.mSetCfNumber); 15420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 154331ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville if (cfu.mOnComplete != null) { 154431ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville AsyncResult.forMessage(cfu.mOnComplete, ar.result, ar.exception); 154531ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville cfu.mOnComplete.sendToTarget(); 15460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 15480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_SET_VM_NUMBER_DONE: 15500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult)msg.obj; 15510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (IccVmNotSupportedException.class.isInstance(ar.exception)) { 15520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville storeVoiceMailNumber(mVmNumber); 15530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar.exception = null; 15540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onComplete = (Message) ar.userObj; 15560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (onComplete != null) { 15570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult.forMessage(onComplete, ar.result, ar.exception); 15580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onComplete.sendToTarget(); 15590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 15610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_GET_CALL_FORWARD_DONE: 15640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult)msg.obj; 15650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ar.exception == null) { 15660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville handleCfuQueryResult((CallForwardInfo[])ar.result); 15670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onComplete = (Message) ar.userObj; 15690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (onComplete != null) { 15700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult.forMessage(onComplete, ar.result, ar.exception); 15710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onComplete.sendToTarget(); 15720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 15740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_SET_NETWORK_AUTOMATIC: 15762bb44b616cb36b981dc5ee781d2b2580af3a05e6Uma Maheswari Ramalingam // Automatic network selection from EF_CSP SIM record 15772bb44b616cb36b981dc5ee781d2b2580af3a05e6Uma Maheswari Ramalingam ar = (AsyncResult) msg.obj; 15782bb44b616cb36b981dc5ee781d2b2580af3a05e6Uma Maheswari Ramalingam if (mSST.mSS.getIsManualSelection()) { 15792bb44b616cb36b981dc5ee781d2b2580af3a05e6Uma Maheswari Ramalingam setNetworkSelectionModeAutomatic((Message) ar.result); 15802bb44b616cb36b981dc5ee781d2b2580af3a05e6Uma Maheswari Ramalingam Rlog.d(LOG_TAG, "SET_NETWORK_SELECTION_AUTOMATIC: set to automatic"); 15812bb44b616cb36b981dc5ee781d2b2580af3a05e6Uma Maheswari Ramalingam } else { 15822bb44b616cb36b981dc5ee781d2b2580af3a05e6Uma Maheswari Ramalingam // prevent duplicate request which will push current PLMN to low priority 15832bb44b616cb36b981dc5ee781d2b2580af3a05e6Uma Maheswari Ramalingam Rlog.d(LOG_TAG, "SET_NETWORK_SELECTION_AUTOMATIC: already automatic, ignore"); 15842bb44b616cb36b981dc5ee781d2b2580af3a05e6Uma Maheswari Ramalingam } 15850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 15860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_ICC_RECORD_EVENTS: 15880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult)msg.obj; 15890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville processIccRecordEvents((Integer)ar.result); 15900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 15910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 15920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case EVENT_SET_CLIR_COMPLETE: 15930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ar = (AsyncResult)msg.obj; 15940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (ar.exception == null) { 15950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville saveClirSetting(msg.arg1); 15960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 15970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onComplete = (Message) ar.userObj; 15980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (onComplete != null) { 15990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AsyncResult.forMessage(onComplete, ar.result, ar.exception); 16000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville onComplete.sendToTarget(); 16010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 16030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 160409b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case EVENT_SS: 160509b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja ar = (AsyncResult)msg.obj; 160609b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja Rlog.d(LOG_TAG, "Event EVENT_SS received"); 160709b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja // SS data is already being handled through MMI codes. 160809b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja // So, this result if processed as MMI response would help 160909b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja // in re-using the existing functionality. 161009b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja GsmMmiCode mmi = new GsmMmiCode(this, mUiccApplication.get()); 161109b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja mmi.processSsData(ar); 161209b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja break; 161309b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja 161409b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja default: 16150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.handleMessage(msg); 16160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1619a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville protected UiccCardApplication getUiccCardApplication() { 1620367855488aacde260410dad0eddc18b183cf852fEtan Cohen return mUiccController.getUiccCardApplication(mPhoneId, 1621a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville UiccController.APP_FAM_3GPP); 1622a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1623a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1624e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka @Override 1625e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka protected void onUpdateIccAvailability() { 1626e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka if (mUiccController == null ) { 1627e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka return; 1628e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka } 1629e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka 1630e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka UiccCardApplication newUiccApplication = 1631a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mUiccController.getUiccCardApplication(mPhoneId, UiccController.APP_FAM_IMS); 1632a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville IsimUiccRecords newIsimUiccRecords = null; 1633a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1634a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (newUiccApplication != null) { 1635a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville newIsimUiccRecords = (IsimUiccRecords)newUiccApplication.getIccRecords(); 1636a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (LOCAL_DEBUG) log("New ISIM application found"); 1637a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1638a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mIsimUiccRecords = newIsimUiccRecords; 1639a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1640a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville newUiccApplication = getUiccCardApplication(); 1641e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka 1642e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka UiccCardApplication app = mUiccApplication.get(); 1643e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (app != newUiccApplication) { 1644e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (app != null) { 1645e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka if (LOCAL_DEBUG) log("Removing stale icc objects."); 1646e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka if (mIccRecords.get() != null) { 1647e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka unregisterForSimRecordEvents(); 1648e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka mSimPhoneBookIntManager.updateIccRecords(null); 1649e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka } 1650e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka mIccRecords.set(null); 1651e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.set(null); 1652e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka } 1653e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (newUiccApplication != null) { 1654e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka if (LOCAL_DEBUG) log("New Uicc application found"); 1655e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mUiccApplication.set(newUiccApplication); 1656e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka mIccRecords.set(newUiccApplication.getIccRecords()); 1657e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka registerForSimRecordEvents(); 1658e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka mSimPhoneBookIntManager.updateIccRecords(mIccRecords.get()); 1659e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka } 1660e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka } 1661e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka } 1662e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka 16630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void processIccRecordEvents(int eventCode) { 16640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (eventCode) { 1665e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka case IccRecords.EVENT_CFI: 16660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyCallForwardingIndicator(); 16670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 16680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 16712a9a655afb255aa5dc449180499e68a2bbfbb82dSukanya Rajkhowa /** 16720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Sets the "current" field in the telephony provider according to the SIM's operator 16730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 16740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return true for success; false otherwise. 16750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 16764918296afe1c667e9523cdfc799f558f7ebc2bfbWink Saville public boolean updateCurrentCarrierInProvider() { 1677a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville long currentDds = SubscriptionManager.getDefaultDataSubId(); 1678a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String operatorNumeric = getOperatorNumeric(); 1679a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1680a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville log("updateCurrentCarrierInProvider: mSubId = " + getSubId() 1681a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville + " currentDds = " + currentDds + " operatorNumeric = " + operatorNumeric); 1682a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1683a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!TextUtils.isEmpty(operatorNumeric) && (getSubId() == currentDds)) { 16840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 16850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current"); 16860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ContentValues map = new ContentValues(); 1687a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville map.put(Telephony.Carriers.NUMERIC, operatorNumeric); 16880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mContext.getContentResolver().insert(uri, map); 16890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 16900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (SQLException e) { 169199c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, "Can't store current operator", e); 16920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 16950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 16960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 16970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 16980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Saves CLIR setting so that we can re-apply it as necessary 16990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * (in case the RIL resets it across reboots). 17000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 17010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void saveClirSetting(int commandInterfaceCLIRMode) { 17020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // open the shared preferences editor, and write the value. 17030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); 17040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SharedPreferences.Editor editor = sp.edit(); 1705a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville editor.putInt(CLIR_KEY + getPhoneId(), commandInterfaceCLIRMode); 17060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // commit and log the result. 17080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (! editor.commit()) { 170999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, "failed to commit CLIR preference"); 17100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void handleCfuQueryResult(CallForwardInfo[] infos) { 1714e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka IccRecords r = mIccRecords.get(); 1715e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka if (r != null) { 1716e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka if (infos == null || infos.length == 0) { 1717e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka // Assume the default is not active 1718e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka // Set unconditional CFF in SIM to false 171931ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville r.setVoiceCallForwardingFlag(1, false, null); 1720e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka } else { 1721e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka for (int i = 0, s = infos.length; i < s; i++) { 1722e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka if ((infos[i].serviceClass & SERVICE_CLASS_VOICE) != 0) { 172331ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville r.setVoiceCallForwardingFlag(1, (infos[i].status == 1), 172431ae682ff511ddde4073c3f94eff15da2f7fade6Wink Saville infos[i].number); 1725e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka // should only have the one 1726e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka break; 1727e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka } 17280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 17340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Retrieves the PhoneSubInfo of the GSMPhone 17350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1736cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 17370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public PhoneSubInfo getPhoneSubInfo(){ 17380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mSubInfo; 17390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 17420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Retrieves the IccPhoneBookInterfaceManager of the GSMPhone 17430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1744cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 17450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public IccPhoneBookInterfaceManager getIccPhoneBookInterfaceManager(){ 17460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mSimPhoneBookIntManager; 17470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 17500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Activate or deactivate cell broadcast SMS. 17510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 17520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param activate 0 = activate, 1 = deactivate 17530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param response Callback message is empty on completion 17540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1755cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 17560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void activateCellBroadcastSms(int activate, Message response) { 175799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, "[GSMPhone] activateCellBroadcastSms() is obsolete; use SmsManager"); 17580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville response.sendToTarget(); 17590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 17620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Query the current configuration of cdma cell broadcast SMS. 17630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 17640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param response Callback message is empty on completion 17650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1766cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 17670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void getCellBroadcastSmsConfig(Message response) { 176899c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, "[GSMPhone] getCellBroadcastSmsConfig() is obsolete; use SmsManager"); 17690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville response.sendToTarget(); 17700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 17720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 17730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Configure cdma cell broadcast SMS. 17740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 17750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param response Callback message is empty on completion 17760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1777cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 17780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void setCellBroadcastSmsConfig(int[] configValuesArray, Message response) { 177999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.e(LOG_TAG, "[GSMPhone] setCellBroadcastSmsConfig() is obsolete; use SmsManager"); 17800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville response.sendToTarget(); 17810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1783cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 17840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public boolean isCspPlmnEnabled() { 1785e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka IccRecords r = mIccRecords.get(); 1786e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka return (r != null) ? r.isCspPlmnEnabled() : false; 17870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 17880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1789fcfebf4b77005d8936f487684e34d2b028407f14a boolean isManualNetSelAllowed() { 1790fcfebf4b77005d8936f487684e34d2b028407f14a 1791fcfebf4b77005d8936f487684e34d2b028407f14a int nwMode = Phone.PREFERRED_NT_MODE; 1792fcfebf4b77005d8936f487684e34d2b028407f14a int subId = getSubId(); 1793fcfebf4b77005d8936f487684e34d2b028407f14a 1794fcfebf4b77005d8936f487684e34d2b028407f14a nwMode = android.provider.Settings.Global.getInt(mContext.getContentResolver(), 1795fcfebf4b77005d8936f487684e34d2b028407f14a android.provider.Settings.Global.PREFERRED_NETWORK_MODE + subId, nwMode); 1796fcfebf4b77005d8936f487684e34d2b028407f14a 1797fcfebf4b77005d8936f487684e34d2b028407f14a Rlog.d(LOG_TAG, "isManualNetSelAllowed in mode = " + nwMode); 1798fcfebf4b77005d8936f487684e34d2b028407f14a /* 1799fcfebf4b77005d8936f487684e34d2b028407f14a * For multimode targets in global mode manual network 1800fcfebf4b77005d8936f487684e34d2b028407f14a * selection is disallowed 1801fcfebf4b77005d8936f487684e34d2b028407f14a */ 1802fcfebf4b77005d8936f487684e34d2b028407f14a if (isManualSelProhibitedInGlobalMode() 1803fcfebf4b77005d8936f487684e34d2b028407f14a && ((nwMode == Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA) 1804fcfebf4b77005d8936f487684e34d2b028407f14a || (nwMode == Phone.NT_MODE_GLOBAL)) ){ 1805fcfebf4b77005d8936f487684e34d2b028407f14a Rlog.d(LOG_TAG, "Manual selection not supported in mode = " + nwMode); 1806fcfebf4b77005d8936f487684e34d2b028407f14a return false; 1807fcfebf4b77005d8936f487684e34d2b028407f14a } else { 1808fcfebf4b77005d8936f487684e34d2b028407f14a Rlog.d(LOG_TAG, "Manual selection is supported in mode = " + nwMode); 1809fcfebf4b77005d8936f487684e34d2b028407f14a } 1810fcfebf4b77005d8936f487684e34d2b028407f14a 1811fcfebf4b77005d8936f487684e34d2b028407f14a /* 1812fcfebf4b77005d8936f487684e34d2b028407f14a * Single mode phone with - GSM network modes/global mode 1813fcfebf4b77005d8936f487684e34d2b028407f14a * LTE only for 3GPP 1814fcfebf4b77005d8936f487684e34d2b028407f14a * LTE centric + 3GPP Legacy 1815fcfebf4b77005d8936f487684e34d2b028407f14a * Note: the actual enabling/disabling manual selection for these 1816fcfebf4b77005d8936f487684e34d2b028407f14a * cases will be controlled by csp 1817fcfebf4b77005d8936f487684e34d2b028407f14a */ 1818fcfebf4b77005d8936f487684e34d2b028407f14a return true; 1819fcfebf4b77005d8936f487684e34d2b028407f14a } 1820fcfebf4b77005d8936f487684e34d2b028407f14a 1821fcfebf4b77005d8936f487684e34d2b028407f14a private boolean isManualSelProhibitedInGlobalMode() { 1822fcfebf4b77005d8936f487684e34d2b028407f14a boolean isProhibited = false; 1823fcfebf4b77005d8936f487684e34d2b028407f14a final String configString = getContext().getResources().getString(com.android.internal. 1824fcfebf4b77005d8936f487684e34d2b028407f14a R.string.prohibit_manual_network_selection_in_gobal_mode); 1825fcfebf4b77005d8936f487684e34d2b028407f14a 1826fcfebf4b77005d8936f487684e34d2b028407f14a if (!TextUtils.isEmpty(configString)) { 1827fcfebf4b77005d8936f487684e34d2b028407f14a String[] configArray = configString.split(";"); 1828fcfebf4b77005d8936f487684e34d2b028407f14a 1829fcfebf4b77005d8936f487684e34d2b028407f14a if (configArray != null && 1830fcfebf4b77005d8936f487684e34d2b028407f14a ((configArray.length == 1 && configArray[0].equalsIgnoreCase("true")) || 1831fcfebf4b77005d8936f487684e34d2b028407f14a (configArray.length == 2 && !TextUtils.isEmpty(configArray[1]) && 1832fcfebf4b77005d8936f487684e34d2b028407f14a configArray[0].equalsIgnoreCase("true") && 1833fcfebf4b77005d8936f487684e34d2b028407f14a configArray[1].equalsIgnoreCase(getGroupIdLevel1())))) { 1834fcfebf4b77005d8936f487684e34d2b028407f14a isProhibited = true; 1835fcfebf4b77005d8936f487684e34d2b028407f14a } 1836fcfebf4b77005d8936f487684e34d2b028407f14a } 1837fcfebf4b77005d8936f487684e34d2b028407f14a Rlog.d(LOG_TAG, "isManualNetSelAllowedInGlobal in current carrier is " + isProhibited); 1838fcfebf4b77005d8936f487684e34d2b028407f14a return isProhibited; 1839fcfebf4b77005d8936f487684e34d2b028407f14a } 1840fcfebf4b77005d8936f487684e34d2b028407f14a 18410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void registerForSimRecordEvents() { 1842e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka IccRecords r = mIccRecords.get(); 1843e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka if (r == null) { 1844e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka return; 1845e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka } 1846e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka r.registerForNetworkSelectionModeAutomatic( 18470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville this, EVENT_SET_NETWORK_AUTOMATIC, null); 1848e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka r.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null); 1849e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka r.registerForRecordsLoaded(this, EVENT_SIM_RECORDS_LOADED, null); 18500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 18510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 18520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void unregisterForSimRecordEvents() { 1853e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka IccRecords r = mIccRecords.get(); 1854e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka if (r == null) { 1855e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka return; 1856e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka } 1857e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka r.unregisterForNetworkSelectionModeAutomatic(this); 1858e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka r.unregisterForRecordsEvents(this); 1859e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka r.unregisterForRecordsLoaded(this); 18600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 18610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 18620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 186304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam public void exitEmergencyCallbackMode() { 186404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam if (mImsPhone != null) { 186504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam mImsPhone.exitEmergencyCallbackMode(); 186604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 186704e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 186804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 186904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam @Override 18700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 18710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println("GSMPhone extends:"); 18720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.dump(fd, pw, args); 18730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mCT=" + mCT); 18740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mSST=" + mSST); 18750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mPendingMMIs=" + mPendingMMIs); 18760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mSimPhoneBookIntManager=" + mSimPhoneBookIntManager); 18770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mSubInfo=" + mSubInfo); 18780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) pw.println(" mImei=" + mImei); 18790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (VDBG) pw.println(" mImeiSv=" + mImeiSv); 18800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pw.println(" mVmNumber=" + mVmNumber); 18810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1882e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka 1883b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal @Override 1884279a26768a5fde8f0dd72e4b9e951c1c32265aabShishir Agrawal public boolean setOperatorBrandOverride(String brand) { 1885b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal if (mUiccController == null) { 1886b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal return false; 1887b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal } 1888b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal 1889062a2a3838c8d8adf16f4d9fbde8d52450da0336Shishir Agrawal UiccCard card = mUiccController.getUiccCard(getPhoneId()); 1890b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal if (card == null) { 1891b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal return false; 1892b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal } 1893b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal 1894279a26768a5fde8f0dd72e4b9e951c1c32265aabShishir Agrawal boolean status = card.setOperatorBrandOverride(brand); 1895b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal 1896b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal // Refresh. 1897b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal if (status) { 1898b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal IccRecords iccRecords = mIccRecords.get(); 1899b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal if (iccRecords != null) { 1900e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu TelephonyManager.from(mContext).setSimOperatorNameForPhone( 1901e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu getPhoneId(), iccRecords.getServiceProviderName()); 1902b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal } 1903b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal if (mSST != null) { 1904b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal mSST.pollState(); 1905b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal } 1906b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal } 1907b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal return status; 1908b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal } 1909b93bb3538c55f173f94a4ee7510d9d1521d8f731Shishir Agrawal 1910a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /** 1911a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville * @return operator numeric. 1912a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */ 1913a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public String getOperatorNumeric() { 1914a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville String operatorNumeric = null; 1915a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville IccRecords r = mIccRecords.get(); 1916a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (r != null) { 1917a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville operatorNumeric = r.getOperatorNumeric(); 1918a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1919a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return operatorNumeric; 1920a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1921a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1922a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void registerForAllDataDisconnected(Handler h, int what, Object obj) { 1923a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ((DcTracker)mDcTracker) 1924a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville .registerForAllDataDisconnected(h, what, obj); 1925a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1926a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1927a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void unregisterForAllDataDisconnected(Handler h) { 1928a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ((DcTracker)mDcTracker).unregisterForAllDataDisconnected(h); 1929a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1930a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1931a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public void setInternalDataEnabled(boolean enable, Message onCompleteMsg) { 1932a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville ((DcTracker)mDcTracker) 1933a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville .setInternalDataEnabled(enable, onCompleteMsg); 1934a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1935a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1936a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1937a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean setInternalDataEnabledFlag(boolean enable) { 1938a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return ((DcTracker)mDcTracker) 1939a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville .setInternalDataEnabledFlag(enable); 1940a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1941a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 194204e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam public void notifyEcbmTimerReset(Boolean flag) { 194304e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam mEcmTimerResetRegistrants.notifyResult(flag); 194404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 194504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 194604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam /** 194704e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam * Registration point for Ecm timer reset 194804e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam * 194904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam * @param h handler to notify 195004e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam * @param what User-defined message code 195104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam * @param obj placed in Message.obj 195204e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam */ 1953367855488aacde260410dad0eddc18b183cf852fEtan Cohen @Override 195404e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam public void registerForEcmTimerReset(Handler h, int what, Object obj) { 195504e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam mEcmTimerResetRegistrants.addUnique(h, what, obj); 195604e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 195704e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 1958367855488aacde260410dad0eddc18b183cf852fEtan Cohen @Override 195904e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam public void unregisterForEcmTimerReset(Handler h) { 196004e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam mEcmTimerResetRegistrants.remove(h); 196104e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam } 196204e36a78936967df68d9175ac09dd3f087727888Uma Maheswari Ramalingam 196326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa /** 196426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa * Sets the SIM voice message waiting indicator records. 196526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa * @param line GSM Subscriber Profile Number, one-based. Only '1' is supported 196626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa * @param countWaiting The number of messages waiting, if known. Use 196726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa * -1 to indicate that an unknown number of 196826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa * messages are waiting 196926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa */ 197026a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa @Override 197126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa public void setVoiceMessageWaiting(int line, int countWaiting) { 197226a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa IccRecords r = mIccRecords.get(); 197326a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa if (r != null) { 197426a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa r.setVoiceMessageWaiting(line, countWaiting); 197526a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa } else { 197626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa log("SIM Records not found, MWI not updated"); 197726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa } 197826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa } 197926a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa 1980e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka protected void log(String s) { 198199c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.d(LOG_TAG, "[GSMPhone] " + s); 1982e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka } 19830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1984