11a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu/* 20a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Copyright (C) 2015 The Android Open Source Project 31a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 41a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Licensed under the Apache License, Version 2.0 (the "License"); 51a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * you may not use this file except in compliance with the License. 61a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * You may obtain a copy of the License at 71a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 81a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * http://www.apache.org/licenses/LICENSE-2.0 91a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Unless required by applicable law or agreed to in writing, software 111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * distributed under the License is distributed on an "AS IS" BASIS, 121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * See the License for the specific language governing permissions and 141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * limitations under the License. 151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yupackage com.android.internal.telephony; 181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.app.ActivityManagerNative; 201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.content.BroadcastReceiver; 211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.content.ContentValues; 221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.content.Context; 231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.content.Intent; 241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.content.IntentFilter; 251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.content.SharedPreferences; 261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.database.SQLException; 271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.net.Uri; 281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.os.AsyncResult; 291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.os.Bundle; 301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.os.Handler; 311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.os.Message; 321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.os.PersistableBundle; 331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.os.PowerManager; 341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.os.Registrant; 351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.os.RegistrantList; 361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.os.SystemProperties; 371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.os.UserHandle; 381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.preference.PreferenceManager; 391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.provider.Settings; 401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.provider.Telephony; 411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telecom.VideoProfile; 421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telephony.CarrierConfigManager; 431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telephony.CellLocation; 441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telephony.PhoneNumberUtils; 451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telephony.ServiceState; 461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telephony.SubscriptionManager; 471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telephony.TelephonyManager; 481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telephony.cdma.CdmaCellLocation; 501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.text.TextUtils; 511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telephony.Rlog; 521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.util.Log; 531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.ims.ImsManager; 551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_DISABLE; 561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_ENABLE; 571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_ERASURE; 581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_REGISTRATION; 591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport static com.android.internal.telephony.CommandsInterface.CF_REASON_ALL; 601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport static com.android.internal.telephony.CommandsInterface.CF_REASON_ALL_CONDITIONAL; 611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport static com.android.internal.telephony.CommandsInterface.CF_REASON_NO_REPLY; 621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport static com.android.internal.telephony.CommandsInterface.CF_REASON_NOT_REACHABLE; 631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport static com.android.internal.telephony.CommandsInterface.CF_REASON_BUSY; 641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDITIONAL; 651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_VOICE; 661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 67de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajanimport com.android.internal.annotations.VisibleForTesting; 681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.cdma.CdmaMmiCode; 691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager; 701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.cdma.EriManager; 711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.dataconnection.DcTracker; 721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.gsm.GsmMmiCode; 731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.gsm.SuppServiceNotification; 741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.test.SimulatedRadioControl; 751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.uicc.IccCardProxy; 761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.uicc.IccException; 771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.uicc.IccRecords; 781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.uicc.IccVmNotSupportedException; 791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.uicc.RuimRecords; 801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.uicc.SIMRecords; 811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.uicc.UiccCard; 821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.uicc.UiccCardApplication; 831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.uicc.UiccController; 841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.uicc.IsimRecords; 851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.uicc.IsimUiccRecords; 861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.io.FileDescriptor; 881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.io.PrintWriter; 891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.ArrayList; 901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.List; 911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.regex.Matcher; 921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.regex.Pattern; 931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu/** 961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * {@hide} 971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yupublic class GsmCdmaPhone extends Phone { 991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // NOTE that LOG_TAG here is "GsmCdma", which means that log messages 1001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // from this file will go into the radio log rather than the main 1011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // log. (Use "adb logcat -b radio" to see them.) 1021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public static final String LOG_TAG = "GsmCdmaPhone"; 1031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final boolean DBG = true; 1041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final boolean VDBG = false; /* STOPSHIP if true */ 1051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //GSM 1071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Key used to read/write voice mail number 108604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan private static final String VM_NUMBER = "vm_number_key"; 1091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Key used to read/write the SIM IMSI used for storing the voice mail 110604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan private static final String VM_SIM_IMSI = "vm_sim_imsi_key"; 1111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** List of Registrants to receive Supplementary Service Notifications. */ 112604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan private RegistrantList mSsnRegistrants = new RegistrantList(); 1131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 1151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Default Emergency Callback Mode exit timer 1161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int DEFAULT_ECM_EXIT_TIMER_VALUE = 300000; 1171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final String VM_NUMBER_CDMA = "vm_number_key_cdma"; 118604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan public static final int RESTART_ECM_TIMER = 0; // restart Ecm timer 119604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan public static final int CANCEL_ECM_TIMER = 1; // cancel Ecm timer 120604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan private CdmaSubscriptionSourceManager mCdmaSSM; 121604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan public int mCdmaSubscriptionSource = CdmaSubscriptionSourceManager.SUBSCRIPTION_SOURCE_UNKNOWN; 1221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public EriManager mEriManager; 123604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan private PowerManager.WakeLock mWakeLock; 1241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // mEriFileLoadedRegistrants are informed after the ERI text has been loaded 1251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private final RegistrantList mEriFileLoadedRegistrants = new RegistrantList(); 1261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // mEcmExitRespRegistrant is informed after the phone has been exited 1271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //the emergency callback mode 1281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //keep track of if phone is in emergency callback mode 129604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan private boolean mIsPhoneInEcmState; 1301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private Registrant mEcmExitRespRegistrant; 1311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private String mEsn; 1321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private String mMeid; 1331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // string to define how the carrier specifies its own ota sp number 134604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan private String mCarrierOtaSpNumSchema; 1351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // A runnable which is used to automatically exit from Ecm after a period of time. 1361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private Runnable mExitEcmRunnable = new Runnable() { 1371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void run() { 1391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu exitEmergencyCallbackMode(); 1401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu }; 142604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan public static final String PROPERTY_CDMA_HOME_OPERATOR_NUMERIC = 143604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan "ro.cdma.home.operator.numeric"; 1441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMALTE 1461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** PHONE_TYPE_CDMA_LTE in addition to RuimRecords needs access to SIMRecords and 1471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * IsimUiccRecords 1481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 1491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private SIMRecords mSimRecords; 1501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //Common 1521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Instance Variables 1531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private IsimUiccRecords mIsimUiccRecords; 1541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public GsmCdmaCallTracker mCT; 155604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan public ServiceStateTracker mSST; 156604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan private ArrayList <MmiCode> mPendingMMIs = new ArrayList<MmiCode>(); 157604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan private IccPhoneBookInterfaceManager mIccPhoneBookIntManager; 1581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private int mPrecisePhoneType; 1601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // mEcmTimerResetRegistrants are informed after Ecm timer is canceled or re-started 1621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private final RegistrantList mEcmTimerResetRegistrants = new RegistrantList(); 1631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private String mImei; 1651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private String mImeiSv; 1661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private String mVmNumber; 1671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Create Cfu (Call forward unconditional) so that dialing number & 1691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // mOnComplete (Message object passed by client) can be packed & 1701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // given as a single Cfu object as user data to RIL. 1711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static class Cfu { 1721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu final String mSetCfNumber; 1731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu final Message mOnComplete; 1741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Cfu(String cfNumber, Message onComplete) { 1761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSetCfNumber = cfNumber; 1771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mOnComplete = onComplete; 1781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private IccSmsInterfaceManager mIccSmsInterfaceManager; 1821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private IccCardProxy mIccCardProxy; 1831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean mResetModemOnRadioTechnologyChange = false; 1851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private int mRilVersion; 187a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan private boolean mBroadcastEmergencyCallStateChanges = false; 1881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Constructors 1901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public GsmCdmaPhone(Context context, CommandsInterface ci, PhoneNotifier notifier, int phoneId, 1920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int precisePhoneType, TelephonyComponentFactory telephonyComponentFactory) { 1930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan this(context, ci, notifier, false, phoneId, precisePhoneType, telephonyComponentFactory); 1941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public GsmCdmaPhone(Context context, CommandsInterface ci, PhoneNotifier notifier, 1970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan boolean unitTestMode, int phoneId, int precisePhoneType, 1980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan TelephonyComponentFactory telephonyComponentFactory) { 1991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu super(precisePhoneType == PhoneConstants.PHONE_TYPE_GSM ? "GSM" : "CDMA", 2000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan notifier, context, ci, unitTestMode, phoneId, telephonyComponentFactory); 2011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2021e7c950418dcc4132136eee3c4834e1a758e48e9Amit Mahajan // phone type needs to be set before other initialization as other objects rely on it 2031e7c950418dcc4132136eee3c4834e1a758e48e9Amit Mahajan mPrecisePhoneType = precisePhoneType; 2041e7c950418dcc4132136eee3c4834e1a758e48e9Amit Mahajan initOnce(ci); 2051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu initRatSpecific(precisePhoneType); 2060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mSST = mTelephonyComponentFactory.makeServiceStateTracker(this, this.mCi); 2071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // DcTracker uses SST so needs to be created after it is instantiated 2080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mDcTracker = mTelephonyComponentFactory.makeDcTracker(this); 2091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null); 2101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("GsmCdmaPhone: constructor: sub = " + mPhoneId); 2111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 2141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 2151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void onReceive(Context context, Intent intent) { 2161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, "mBroadcastReceiver: action " + intent.getAction()); 2171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { 2181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendMessage(obtainMessage(EVENT_CARRIER_CONFIG_CHANGED)); 2191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu }; 2221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2231e7c950418dcc4132136eee3c4834e1a758e48e9Amit Mahajan private void initOnce(CommandsInterface ci) { 2241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ci instanceof SimulatedRadioControl) { 2251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSimulatedRadioControl = (SimulatedRadioControl) ci; 2261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mCT = mTelephonyComponentFactory.makeGsmCdmaCallTracker(this); 2290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mIccPhoneBookIntManager = mTelephonyComponentFactory.makeIccPhoneBookInterfaceManager(this); 2300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan PowerManager pm 2310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); 2320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 2330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mIccSmsInterfaceManager = mTelephonyComponentFactory.makeIccSmsInterfaceManager(this); 2340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mIccCardProxy = mTelephonyComponentFactory.makeIccCardProxy(mContext, mCi, mPhoneId); 2351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.registerForAvailable(this, EVENT_RADIO_AVAILABLE, null); 2371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null); 2381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.registerForOn(this, EVENT_RADIO_ON, null); 2391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.setOnSuppServiceNotification(this, EVENT_SSN, null); 2401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //GSM 2421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.setOnUSSD(this, EVENT_USSD, null); 2431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.setOnSs(this, EVENT_SS, null); 2441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 2460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mCdmaSSM = mTelephonyComponentFactory.getCdmaSubscriptionSourceManagerInstance(mContext, 2470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mCi, this, EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null); 2480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mEriManager = mTelephonyComponentFactory.makeEriManager(this, mContext, 2490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan EriManager.ERI_FROM_XML); 2501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.setEmergencyCallbackMode(this, EVENT_EMERGENCY_CALLBACK_MODE_ENTER, null); 2511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.registerForExitEmergencyCallbackMode(this, EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE, 2521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu null); 2531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // get the string that specifies the carrier OTA Sp number 2541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCarrierOtaSpNumSchema = TelephonyManager.from(mContext).getOtaSpNumberSchemaForPhone( 2551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu getPhoneId(), ""); 2561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mResetModemOnRadioTechnologyChange = SystemProperties.getBoolean( 2581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu TelephonyProperties.PROPERTY_RESET_ON_RADIO_TECH_CHANGE, false); 2591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.registerForRilConnected(this, EVENT_RIL_CONNECTED, null); 2611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.registerForVoiceRadioTechChanged(this, EVENT_VOICE_RADIO_TECH_CHANGED, null); 2621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mContext.registerReceiver(mBroadcastReceiver, new IntentFilter( 2631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)); 2641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 266e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan private void initRatSpecific(int precisePhoneType) { 2671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPendingMMIs.clear(); 2681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIccPhoneBookIntManager.updateIccRecords(null); 2691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //todo: maybe not needed?? should the count also be updated on sim_state_absent? 2701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mVmCount = 0; 2711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEsn = null; 2721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mMeid = null; 2731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPrecisePhoneType = precisePhoneType; 2751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu TelephonyManager tm = TelephonyManager.from(mContext); 2771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 2781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.setPhoneType(PhoneConstants.PHONE_TYPE_GSM); 2791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu tm.setPhoneType(getPhoneId(), PhoneConstants.PHONE_TYPE_GSM); 2801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIccCardProxy.setVoiceRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_UMTS); 2811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 2821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCdmaSubscriptionSource = CdmaSubscriptionSourceManager.SUBSCRIPTION_SOURCE_UNKNOWN; 2831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // This is needed to handle phone process crashes 2841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String inEcm = SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false"); 2851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIsPhoneInEcmState = inEcm.equals("true"); 2861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mIsPhoneInEcmState) { 2871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Send a message which will invoke handleExitEmergencyCallbackMode 2881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.exitEmergencyCallbackMode( 2891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu obtainMessage(EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE)); 2901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.setPhoneType(PhoneConstants.PHONE_TYPE_CDMA); 2931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu tm.setPhoneType(getPhoneId(), PhoneConstants.PHONE_TYPE_CDMA); 2941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIccCardProxy.setVoiceRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT); 2951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Sets operator properties by retrieving from build-time system property 2961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String operatorAlpha = SystemProperties.get("ro.cdma.home.operator.alpha"); 2971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String operatorNumeric = SystemProperties.get(PROPERTY_CDMA_HOME_OPERATOR_NUMERIC); 2981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("init: operatorAlpha='" + operatorAlpha 2991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + "' operatorNumeric='" + operatorNumeric + "'"); 3001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mUiccController.getUiccCardApplication(mPhoneId, UiccController.APP_FAM_3GPP) == 301dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan null || isPhoneTypeCdmaLte()) { 3021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!TextUtils.isEmpty(operatorAlpha)) { 3031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("init: set 'gsm.sim.operator.alpha' to operator='" + operatorAlpha + "'"); 3041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu tm.setSimOperatorNameForPhone(mPhoneId, operatorAlpha); 3051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!TextUtils.isEmpty(operatorNumeric)) { 3071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("init: set 'gsm.sim.operator.numeric' to operator='" + operatorNumeric + 3081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "'"); 3091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("update icc_operator_numeric=" + operatorNumeric); 3101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu tm.setSimOperatorNumericForPhone(mPhoneId, operatorNumeric); 3111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SubscriptionController.getInstance().setMccMnc(operatorNumeric, getSubId()); 3131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Sets iso country property by retrieving from build-time system property 3141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setIsoCountryProperty(operatorNumeric); 3151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Updates MCC MNC device configuration information 3161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("update mccmnc=" + operatorNumeric); 3171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu MccTable.updateMccMncConfiguration(mContext, operatorNumeric, false); 3181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Sets current entry in the telephony carrier table 3221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu updateCurrentCarrierInProvider(operatorNumeric); 3231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 3271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 3281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Sets PROPERTY_ICC_OPERATOR_ISO_COUNTRY property 3291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 3301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 331e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan private void setIsoCountryProperty(String operatorNumeric) { 3321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu TelephonyManager tm = TelephonyManager.from(mContext); 3331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (TextUtils.isEmpty(operatorNumeric)) { 3341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("setIsoCountryProperty: clear 'gsm.sim.operator.iso-country'"); 3351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu tm.setSimCountryIsoForPhone(mPhoneId, ""); 3361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 3371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String iso = ""; 3381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 3391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu iso = MccTable.countryCodeForMcc(Integer.parseInt( 3401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu operatorNumeric.substring(0,3))); 3411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (NumberFormatException ex) { 3421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, "setIsoCountryProperty: countryCodeForMcc error", ex); 3431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (StringIndexOutOfBoundsException ex) { 3441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, "setIsoCountryProperty: countryCodeForMcc error", ex); 3451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("setIsoCountryProperty: set 'gsm.sim.operator.iso-country' to iso=" + iso); 3481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu tm.setSimCountryIsoForPhone(mPhoneId, iso); 3491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public boolean isPhoneTypeGsm() { 3531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mPrecisePhoneType == PhoneConstants.PHONE_TYPE_GSM; 3541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 356dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan public boolean isPhoneTypeCdma() { 357dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan return mPrecisePhoneType == PhoneConstants.PHONE_TYPE_CDMA; 358dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan } 359dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan 360dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan public boolean isPhoneTypeCdmaLte() { 361dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan return mPrecisePhoneType == PhoneConstants.PHONE_TYPE_CDMA_LTE; 362dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan } 363dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan 3641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void switchPhoneType(int precisePhoneType) { 3651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu removeCallbacks(mExitEcmRunnable); 3661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu initRatSpecific(precisePhoneType); 3681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSST.updatePhoneType(); 3701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setPhoneName(precisePhoneType == PhoneConstants.PHONE_TYPE_GSM ? "GSM" : "CDMA"); 3711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onUpdateIccAvailability(); 3721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.updatePhoneType(); 3731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu CommandsInterface.RadioState radioState = mCi.getRadioState(); 3751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (radioState.isAvailable()) { 3761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu handleRadioAvailable(); 3771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (radioState.isOn()) { 3781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu handleRadioOn(); 3791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!radioState.isAvailable() || !radioState.isOn()) { 3821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu handleRadioOffOrNotAvailable(); 3831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 3871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu protected void finalize() { 3881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if(DBG) logd("GsmCdmaPhone finalized"); 3891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mWakeLock.isHeld()) { 3901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, "UNEXPECTED; mWakeLock is held when finalizing."); 3911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mWakeLock.release(); 3921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 3961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public ServiceState getServiceState() { 3971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mSST == null || mSST.mSS.getState() != ServiceState.STATE_IN_SERVICE) { 3981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mImsPhone != null) { 3991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return ServiceState.mergeServiceStates( 4001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu (mSST == null) ? new ServiceState() : mSST.mSS, 4011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mImsPhone.getServiceState()); 4021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mSST != null) { 4061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mSST.mSS; 4071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 4081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // avoid potential NPE in EmergencyCallHelper during Phone switch 4091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return new ServiceState(); 4101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 4141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public CellLocation getCellLocation() { 4151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 4161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mSST.getCellLocation(); 4171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 4181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu CdmaCellLocation loc = (CdmaCellLocation)mSST.mCellLoc; 4191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int mode = Settings.Secure.getInt(getContext().getContentResolver(), 4211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF); 4221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mode == Settings.Secure.LOCATION_MODE_OFF) { 4231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // clear lat/long values for location privacy 4241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu CdmaCellLocation privateLoc = new CdmaCellLocation(); 4251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu privateLoc.setCellLocationData(loc.getBaseStationId(), 4261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu CdmaCellLocation.INVALID_LAT_LONG, 4271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu CdmaCellLocation.INVALID_LAT_LONG, 4281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loc.getSystemId(), loc.getNetworkId()); 4291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loc = privateLoc; 4301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return loc; 4321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 4361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public PhoneConstants.State getState() { 4371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mImsPhone != null) { 4381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu PhoneConstants.State imsState = mImsPhone.getState(); 4391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (imsState != PhoneConstants.State.IDLE) { 4401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return imsState; 4411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mCT.mState; 4451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 4481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public int getPhoneType() { 4491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mPrecisePhoneType == PhoneConstants.PHONE_TYPE_GSM) { 4501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return PhoneConstants.PHONE_TYPE_GSM; 4511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 4521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return PhoneConstants.PHONE_TYPE_CDMA; 4531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 4571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public ServiceStateTracker getServiceStateTracker() { 4581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mSST; 4591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 4621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public CallTracker getCallTracker() { 4631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mCT; 4641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 46697b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan @Override 46797b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan public void updateVoiceMail() { 4681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 4691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int countVoiceMessages = 0; 4701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 4711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (r != null) { 4721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // get voice mail count from SIM 4731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu countVoiceMessages = r.getVoiceMessageCount(); 4741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int countVoiceMessagesStored = getStoredVoiceMessageCount(); 4761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (countVoiceMessages == -1 && countVoiceMessagesStored != 0) { 4771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu countVoiceMessages = countVoiceMessagesStored; 4781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("updateVoiceMail countVoiceMessages = " + countVoiceMessages 4801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + " subId " + getSubId()); 4811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setVoiceMessageCount(countVoiceMessages); 4821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 4831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setVoiceMessageCount(getStoredVoiceMessageCount()); 4841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 4881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public List<? extends MmiCode> 4891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu getPendingMmiCodes() { 4901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mPendingMMIs; 4911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 4921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 4941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public PhoneConstants.DataState getDataConnectionState(String apnType) { 4951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu PhoneConstants.DataState ret = PhoneConstants.DataState.DISCONNECTED; 4961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mSST == null) { 4981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Radio Technology Change is ongoning, dispose() and removeReferences() have 4991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // already been called 5001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret = PhoneConstants.DataState.DISCONNECTED; 5021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (mSST.getCurrentDataConnectionState() != ServiceState.STATE_IN_SERVICE 503dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan && (isPhoneTypeCdma() || 5041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu (isPhoneTypeGsm() && !apnType.equals(PhoneConstants.APN_TYPE_EMERGENCY)))) { 5051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If we're out of service, open TCP sockets may still work 5061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // but no data will flow 5071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Emergency APN is available even in Out Of Service 5091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Pass the actual State of EPDN 5101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret = PhoneConstants.DataState.DISCONNECTED; 5121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { /* mSST.gprsState == ServiceState.STATE_IN_SERVICE */ 5131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu switch (mDcTracker.getState(apnType)) { 5141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case RETRYING: 5151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case FAILED: 5161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case IDLE: 5171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret = PhoneConstants.DataState.DISCONNECTED; 5181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 5191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CONNECTED: 5211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DISCONNECTING: 5221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ( mCT.mState != PhoneConstants.State.IDLE 5231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && !mSST.isConcurrentVoiceAndDataAllowed()) { 5241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret = PhoneConstants.DataState.SUSPENDED; 5251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 5261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret = PhoneConstants.DataState.CONNECTED; 5271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 5291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CONNECTING: 5311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case SCANNING: 5321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret = PhoneConstants.DataState.CONNECTING; 5331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 5341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("getDataConnectionState apnType=" + apnType + " ret=" + ret); 5381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return ret; 5391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 5421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public DataActivityState getDataActivityState() { 5431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu DataActivityState ret = DataActivityState.NONE; 5441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mSST.getCurrentDataConnectionState() == ServiceState.STATE_IN_SERVICE) { 5461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu switch (mDcTracker.getActivity()) { 5471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DATAIN: 5481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret = DataActivityState.DATAIN; 5491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 5501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DATAOUT: 5521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret = DataActivityState.DATAOUT; 5531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 5541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DATAINANDOUT: 5561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret = DataActivityState.DATAINANDOUT; 5571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 5581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case DORMANT: 5601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret = DataActivityState.DORMANT; 5611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 5621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu default: 5641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret = DataActivityState.NONE; 5651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 5661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return ret; 5701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 5731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Notify any interested party of a Phone state change 5741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * {@link com.android.internal.telephony.PhoneConstants.State} 5751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 576e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void notifyPhoneStateChanged() { 5771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mNotifier.notifyPhoneState(this); 5781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 5811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Notify registrants of a change in the call state. This notifies changes in 5821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * {@link com.android.internal.telephony.Call.State}. Use this when changes 5831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * in the precise call state are needed, else use notifyPhoneStateChanged. 5841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 585e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void notifyPreciseCallStateChanged() { 5861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* we'd love it if this was package-scoped*/ 5871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu super.notifyPreciseCallStateChangedP(); 5881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void notifyNewRingingConnection(Connection c) { 5911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu super.notifyNewRingingConnectionP(c); 5921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 594e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void notifyDisconnect(Connection cn) { 5951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDisconnectRegistrants.notifyResult(cn); 5961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mNotifier.notifyDisconnectCause(cn.getDisconnectCause(), cn.getPreciseDisconnectCause()); 5981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 600e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void notifyUnknownConnection(Connection cn) { 6011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu super.notifyUnknownConnectionP(cn); 6021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 6051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean isInEmergencyCall() { 6061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 6071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 6081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 6091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mCT.isInEmergencyCall(); 6101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 6141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu protected void setIsInEmergencyCall() { 6151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isPhoneTypeGsm()) { 6161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.setIsInEmergencyCall(); 6171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 6211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean isInEcm() { 6221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 6231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 6241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 6251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mIsPhoneInEcmState; 6261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 630e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan private void sendEmergencyCallbackModeChange(){ 6311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //Send an Intent 6321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Intent intent = new Intent(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED); 6331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu intent.putExtra(PhoneConstants.PHONE_IN_ECM_STATE, mIsPhoneInEcmState); 6341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SubscriptionManager.putPhoneIdAndSubIdExtra(intent, getPhoneId()); 6351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ActivityManagerNative.broadcastStickyIntent(intent, null, UserHandle.USER_ALL); 6361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("sendEmergencyCallbackModeChange"); 6371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 639a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan @Override 640a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan public void sendEmergencyCallStateChange(boolean callActive) { 641a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan if (mBroadcastEmergencyCallStateChanges) { 642a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan Intent intent = new Intent(TelephonyIntents.ACTION_EMERGENCY_CALL_STATE_CHANGED); 643a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan intent.putExtra(PhoneConstants.PHONE_IN_EMERGENCY_CALL, callActive); 644a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan SubscriptionManager.putPhoneIdAndSubIdExtra(intent, getPhoneId()); 645a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan ActivityManagerNative.broadcastStickyIntent(intent, null, UserHandle.USER_ALL); 646a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan if (DBG) Rlog.d(LOG_TAG, "sendEmergencyCallStateChange"); 647a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan } 648a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan } 649a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan 650a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan @Override 651a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan public void setBroadcastEmergencyCallStateChanges(boolean broadcast) { 652a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan mBroadcastEmergencyCallStateChanges = broadcast; 653a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan } 654a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan 655e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void notifySuppServiceFailed(SuppService code) { 6561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSuppServiceFailedRegistrants.notifyResult(code); 6571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 659e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void notifyServiceStateChanged(ServiceState ss) { 6601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu super.notifyServiceStateChangedP(ss); 6611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void notifyLocationChanged() { 6641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mNotifier.notifyCellLocation(this); 6651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 668e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void notifyCallForwardingIndicator() { 6691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mNotifier.notifyCallForwardingChanged(this); 6701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // override for allowing access from other classes of this package 6731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 6741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * {@inheritDoc} 6751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 6761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 677e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void setSystemProperty(String property, String value) { 6781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (getUnitTestMode()) { 6791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 6801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 681dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan if (isPhoneTypeGsm() || isPhoneTypeCdmaLte()) { 6821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu TelephonyManager.setTelephonyProperty(mPhoneId, property, value); 6831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 6841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu super.setSystemProperty(property, value); 6851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 6891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void registerForSuppServiceNotification( 6901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Handler h, int what, Object obj) { 691dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan mSsnRegistrants.addUnique(h, what, obj); 692dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan if (mSsnRegistrants.size() == 1) mCi.setSuppServiceNotifications(true, null); 6931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 6941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 6961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void unregisterForSuppServiceNotification(Handler h) { 697dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan mSsnRegistrants.remove(h); 698dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan if (mSsnRegistrants.size() == 0) mCi.setSuppServiceNotifications(false, null); 6991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 7011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 7021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void registerForSimRecordsLoaded(Handler h, int what, Object obj) { 7031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSimRecordsLoadedRegistrants.addUnique(h, what, obj); 7041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 7061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 7071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void unregisterForSimRecordsLoaded(Handler h) { 7081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSimRecordsLoadedRegistrants.remove(h); 7091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 7111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 712e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void acceptCall(int videoState) throws CallStateException { 713c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Phone imsPhone = mImsPhone; 7141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ( imsPhone != null && imsPhone.getRingingCall().isRinging() ) { 7151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu imsPhone.acceptCall(videoState); 7161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 7171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.acceptCall(); 7181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 7211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 722e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void rejectCall() throws CallStateException { 7231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.rejectCall(); 7241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 7261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 727e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void switchHoldingAndActive() throws CallStateException { 7281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.switchWaitingOrHoldingAndActive(); 7291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 7311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 7321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getIccSerialNumber() { 7331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 7341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isPhoneTypeGsm() && r == null) { 7351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // to get ICCID form SIMRecords because it is on MF. 7361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu r = mUiccController.getIccRecords(mPhoneId, UiccController.APP_FAM_3GPP); 7371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (r != null) ? r.getIccId() : null; 7391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 7411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 742a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan public String getFullIccSerialNumber() { 743a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan IccRecords r = mIccRecords.get(); 744a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan if (!isPhoneTypeGsm() && r == null) { 745a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan // to get ICCID form SIMRecords because it is on MF. 746a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan r = mUiccController.getIccRecords(mPhoneId, UiccController.APP_FAM_3GPP); 747a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan } 748a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan return (r != null) ? r.getFullIccId() : null; 749a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan } 750a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan 751a2df69ceec27f7f35d7e8a840218f30b01dd4f21Amit Mahajan @Override 7521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean canConference() { 7531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mImsPhone != null && mImsPhone.canConference()) { 7541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return true; 7551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 7571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mCT.canConference(); 7581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 7591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("canConference: not possible in CDMA"); 7601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 7611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 7641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 7651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void conference() { 7661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mImsPhone != null && mImsPhone.canConference()) { 7671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("conference() - delegated to IMS phone"); 768c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan try { 769c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan mImsPhone.conference(); 770c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan } catch (CallStateException e) { 771c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan loge(e.toString()); 772c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan } 7731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 7741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 7761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.conference(); 7771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 7781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // three way calls in CDMA will be handled by feature codes 7791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("conference: not possible in CDMA"); 7801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 7831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 7841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void enableEnhancedVoicePrivacy(boolean enable, Message onComplete) { 7851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 7861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("enableEnhancedVoicePrivacy: not expected on GSM"); 7871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 7881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.setPreferredVoicePrivacy(enable, onComplete); 7891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 7921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 7931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void getEnhancedVoicePrivacy(Message onComplete) { 7941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 7951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("getEnhancedVoicePrivacy: not expected on GSM"); 7961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 7971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.getPreferredVoicePrivacy(onComplete); 7981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 8021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void clearDisconnected() { 8031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.clearDisconnected(); 8041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 8071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean canTransfer() { 8081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 8091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mCT.canTransfer(); 8101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 8111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("canTransfer: not possible in CDMA"); 8121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 8131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 8171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void explicitCallTransfer() { 8181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 8191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.explicitCallTransfer(); 8201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 8211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("explicitCallTransfer: not possible in CDMA"); 8221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 826e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public GsmCdmaCall getForegroundCall() { 8271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mCT.mForegroundCall; 8281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 831e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public GsmCdmaCall getBackgroundCall() { 8321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mCT.mBackgroundCall; 8331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 8361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public Call getRingingCall() { 837c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Phone imsPhone = mImsPhone; 838a3e96a42d9f83a649c4edf7dc07b1f0977efd393twen.chang // It returns the ringing call of ImsPhone if the ringing call of GSMPhone isn't ringing. 839a3e96a42d9f83a649c4edf7dc07b1f0977efd393twen.chang // In CallManager.registerPhone(), it always registers ringing call of ImsPhone, because 840a3e96a42d9f83a649c4edf7dc07b1f0977efd393twen.chang // the ringing call of GSMPhone isn't ringing. Consequently, it can't answer GSM call 841a3e96a42d9f83a649c4edf7dc07b1f0977efd393twen.chang // successfully by invoking TelephonyManager.answerRingingCall() since the implementation 842a3e96a42d9f83a649c4edf7dc07b1f0977efd393twen.chang // in PhoneInterfaceManager.answerRingingCallInternal() could not get the correct ringing 843a3e96a42d9f83a649c4edf7dc07b1f0977efd393twen.chang // call from CallManager. So we check the ringing call state of imsPhone first as 844a3e96a42d9f83a649c4edf7dc07b1f0977efd393twen.chang // accpetCall() does. 845a3e96a42d9f83a649c4edf7dc07b1f0977efd393twen.chang if ( imsPhone != null && imsPhone.getRingingCall().isRinging()) { 8461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return imsPhone.getRingingCall(); 8471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mCT.mRingingCall; 8491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean handleCallDeflectionIncallSupplementaryService( 8521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String dialString) { 8531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dialString.length() > 1) { 8541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 8551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (getRingingCall().getState() != GsmCdmaCall.State.IDLE) { 8581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("MmiCode 0: rejectCall"); 8591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 8601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.rejectCall(); 8611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (CallStateException e) { 8621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) Rlog.d(LOG_TAG, 8631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "reject failed", e); 8641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu notifySuppServiceFailed(Phone.SuppService.REJECT); 8651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (getBackgroundCall().getState() != GsmCdmaCall.State.IDLE) { 8671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("MmiCode 0: hangupWaitingOrBackground"); 8681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.hangupWaitingOrBackground(); 8691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return true; 8721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //GSM 875e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan private boolean handleCallWaitingIncallSupplementaryService(String dialString) { 8761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int len = dialString.length(); 8771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (len > 2) { 8791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 8801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmCdmaCall call = getForegroundCall(); 8831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 8851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (len > 1) { 8861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu char ch = dialString.charAt(1); 8871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int callIndex = ch - '0'; 8881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 8891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (callIndex >= 1 && callIndex <= GsmCdmaCallTracker.MAX_CONNECTIONS_GSM) { 8901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("MmiCode 1: hangupConnectionByIndex " + callIndex); 8911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.hangupConnectionByIndex(call, callIndex); 8921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 8941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (call.getState() != GsmCdmaCall.State.IDLE) { 8951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("MmiCode 1: hangup foreground"); 8961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //mCT.hangupForegroundResumeBackground(); 8971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.hangup(call); 8981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 8991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("MmiCode 1: switchWaitingOrHoldingAndActive"); 9001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.switchWaitingOrHoldingAndActive(); 9011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (CallStateException e) { 9041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) Rlog.d(LOG_TAG, 9051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "hangup failed", e); 9061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu notifySuppServiceFailed(Phone.SuppService.HANGUP); 9071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return true; 9101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean handleCallHoldIncallSupplementaryService(String dialString) { 9131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int len = dialString.length(); 9141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (len > 2) { 9161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 9171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmCdmaCall call = getForegroundCall(); 9201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (len > 1) { 9221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 9231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu char ch = dialString.charAt(1); 9241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int callIndex = ch - '0'; 9251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmCdmaConnection conn = mCT.getConnectionByIndex(call, callIndex); 9261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // GsmCdma index starts at 1, up to 5 connections in a call, 9281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (conn != null && callIndex >= 1 && callIndex <= GsmCdmaCallTracker.MAX_CONNECTIONS_GSM) { 929e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan if (DBG) logd("MmiCode 2: separate call " + callIndex); 9301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.separate(conn); 9311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 932e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan if (DBG) logd("separate: invalid call index " + callIndex); 9331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu notifySuppServiceFailed(Phone.SuppService.SEPARATE); 9341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (CallStateException e) { 936e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan if (DBG) Rlog.d(LOG_TAG, "separate failed", e); 9371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu notifySuppServiceFailed(Phone.SuppService.SEPARATE); 9381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 9401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 9411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (getRingingCall().getState() != GsmCdmaCall.State.IDLE) { 9421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("MmiCode 2: accept ringing call"); 9431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.acceptCall(); 9441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 9451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("MmiCode 2: switchWaitingOrHoldingAndActive"); 9461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.switchWaitingOrHoldingAndActive(); 9471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (CallStateException e) { 949e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan if (DBG) Rlog.d(LOG_TAG, "switch failed", e); 9501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu notifySuppServiceFailed(Phone.SuppService.SWITCH); 9511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return true; 9551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 957e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan private boolean handleMultipartyIncallSupplementaryService(String dialString) { 9581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dialString.length() > 1) { 9591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 9601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("MmiCode 3: merge calls"); 9631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu conference(); 9641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return true; 9651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean handleEctIncallSupplementaryService(String dialString) { 9681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int len = dialString.length(); 9701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (len != 1) { 9721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 9731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("MmiCode 4: explicit call transfer"); 9761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu explicitCallTransfer(); 9771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return true; 9781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean handleCcbsIncallSupplementaryService(String dialString) { 9811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dialString.length() > 1) { 9821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 9831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.i(LOG_TAG, "MmiCode 5: CCBS not supported!"); 9861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Treat it as an "unknown" service. 9871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu notifySuppServiceFailed(Phone.SuppService.UNKNOWN); 9881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return true; 9891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 9921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean handleInCallMmiCommands(String dialString) throws CallStateException { 9931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isPhoneTypeGsm()) { 9941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("method handleInCallMmiCommands is NOT supported in CDMA!"); 995e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan return false; 9961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 998c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Phone imsPhone = mImsPhone; 9991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (imsPhone != null 10001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE) { 10011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return imsPhone.handleInCallMmiCommands(dialString); 10021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 10031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isInCall()) { 10051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 10061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 10071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (TextUtils.isEmpty(dialString)) { 10091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 10101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 10111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean result = false; 10131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu char ch = dialString.charAt(0); 10141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu switch (ch) { 10151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case '0': 10160c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan result = handleCallDeflectionIncallSupplementaryService(dialString); 10171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 10181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case '1': 10190c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan result = handleCallWaitingIncallSupplementaryService(dialString); 10201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 10211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case '2': 10221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu result = handleCallHoldIncallSupplementaryService(dialString); 10231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 10241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case '3': 10251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu result = handleMultipartyIncallSupplementaryService(dialString); 10261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 10271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case '4': 10281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu result = handleEctIncallSupplementaryService(dialString); 10291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 10301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case '5': 10311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu result = handleCcbsIncallSupplementaryService(dialString); 10321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 10331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu default: 10341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 10351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 10361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return result; 10381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 10391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean isInCall() { 10411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmCdmaCall.State foregroundCallState = getForegroundCall().getState(); 10421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmCdmaCall.State backgroundCallState = getBackgroundCall().getState(); 10431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmCdmaCall.State ringingCallState = getRingingCall().getState(); 10441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (foregroundCallState.isAlive() || 10461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu backgroundCallState.isAlive() || 10471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ringingCallState.isAlive()); 10481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 10491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1051e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public Connection dial(String dialString, int videoState) throws CallStateException { 10521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return dial(dialString, null, videoState, null); 10531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 10541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1056604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan public Connection dial(String dialString, UUSInfo uusInfo, int videoState, Bundle intentExtras) 10571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu throws CallStateException { 10581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isPhoneTypeGsm() && uusInfo != null) { 10591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu throw new CallStateException("Sending UUS information NOT supported in CDMA!"); 10601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 10611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean isEmergency = PhoneNumberUtils.isEmergencyNumber(dialString); 1063c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Phone imsPhone = mImsPhone; 10641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu CarrierConfigManager configManager = 10661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE); 10671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean alwaysTryImsForEmergencyCarrierConfig = configManager.getConfigForSubId(getSubId()) 10681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu .getBoolean(CarrierConfigManager.KEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY_BOOL); 10691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean imsUseEnabled = isImsUseEnabled() 10711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && imsPhone != null 10725d3ff3cf62037c91a72d9677e16a5a705f7a995dOmkar Kolangade && (imsPhone.isVolteEnabled() || imsPhone.isWifiCallingEnabled() || 10735d3ff3cf62037c91a72d9677e16a5a705f7a995dOmkar Kolangade (imsPhone.isVideoEnabled() && VideoProfile.isVideo(videoState))) 10741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && (imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE); 10751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean useImsForEmergency = imsPhone != null 10771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && isEmergency 10781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && alwaysTryImsForEmergencyCarrierConfig 10791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && ImsManager.isNonTtyOrTtyOnVolteEnabled(mContext) 10801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && (imsPhone.getServiceState().getState() != ServiceState.STATE_POWER_OFF); 10811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1082b5245ec56c5ecf8387499be08c8d3f7621a48203Omkar Kolangade String dialPart = PhoneNumberUtils.extractNetworkPortionAlt(PhoneNumberUtils. 1083b5245ec56c5ecf8387499be08c8d3f7621a48203Omkar Kolangade stripSeparators(dialString)); 1084b5245ec56c5ecf8387499be08c8d3f7621a48203Omkar Kolangade boolean isUt = (dialPart.startsWith("*") || dialPart.startsWith("#")) 1085b5245ec56c5ecf8387499be08c8d3f7621a48203Omkar Kolangade && dialPart.endsWith("#"); 10861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean useImsForUt = imsPhone != null && imsPhone.isUtEnabled(); 10881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 10901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("imsUseEnabled=" + imsUseEnabled 10911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + ", useImsForEmergency=" + useImsForEmergency 10921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + ", useImsForUt=" + useImsForUt 10931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + ", isUt=" + isUt 10941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + ", imsPhone=" + imsPhone 10951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + ", imsPhone.isVolteEnabled()=" 10961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + ((imsPhone != null) ? imsPhone.isVolteEnabled() : "N/A") 10971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + ", imsPhone.isVowifiEnabled()=" 1098c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan + ((imsPhone != null) ? imsPhone.isWifiCallingEnabled() : "N/A") 10995d3ff3cf62037c91a72d9677e16a5a705f7a995dOmkar Kolangade + ", imsPhone.isVideoEnabled()=" 11005d3ff3cf62037c91a72d9677e16a5a705f7a995dOmkar Kolangade + ((imsPhone != null) ? imsPhone.isVideoEnabled() : "N/A") 11011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + ", imsPhone.getServiceState().getState()=" 11021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + ((imsPhone != null) ? imsPhone.getServiceState().getState() : "N/A")); 11031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1105c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Phone.checkWfcWifiOnlyModeBeforeDial(mImsPhone, mContext); 11061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((imsUseEnabled && (!isUt || useImsForUt)) || useImsForEmergency) { 11081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 11091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("Trying IMS PS call"); 11101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return imsPhone.dial(dialString, uusInfo, videoState, intentExtras); 11111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (CallStateException e) { 11121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("IMS PS call exception " + e + 11131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "imsUseEnabled =" + imsUseEnabled + ", imsPhone =" + imsPhone); 1114c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan if (!Phone.CS_FALLBACK.equals(e.getMessage())) { 11151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu CallStateException ce = new CallStateException(e.getMessage()); 11161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ce.setStackTrace(e.getStackTrace()); 11171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu throw ce; 11181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mSST != null && mSST.mSS.getState() == ServiceState.STATE_OUT_OF_SERVICE 11231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && mSST.mSS.getDataRegState() != ServiceState.STATE_IN_SERVICE && !isEmergency) { 11241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu throw new CallStateException("cannot dial in current state"); 11251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("Trying (non-IMS) CS call"); 11271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 11291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return dialInternal(dialString, null, VideoProfile.STATE_AUDIO_ONLY, intentExtras); 11301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 11311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return dialInternal(dialString, null, videoState, intentExtras); 11321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1136604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan protected Connection dialInternal(String dialString, UUSInfo uusInfo, int videoState, 1137604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan Bundle intentExtras) 11381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu throws CallStateException { 11391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Need to make sure dialString gets parsed properly 11411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String newDialString = PhoneNumberUtils.stripSeparators(dialString); 11421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 11441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // handle in-call MMI first if applicable 11451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (handleInCallMmiCommands(newDialString)) { 11461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return null; 11471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Only look at the Network portion for mmi 11501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String networkPortion = PhoneNumberUtils.extractNetworkPortionAlt(newDialString); 11511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmMmiCode mmi = 11521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmMmiCode.newFromDialString(networkPortion, this, mUiccApplication.get()); 11531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("dialing w/ mmi '" + mmi + "'..."); 11541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mmi == null) { 11561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mCT.dial(newDialString, uusInfo, intentExtras); 11571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (mmi.isTemporaryModeCLIR()) { 11581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mCT.dial(mmi.mDialingNumber, mmi.getCLIRMode(), uusInfo, intentExtras); 11591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 11601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPendingMMIs.add(mmi); 11611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null)); 11621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 11631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mmi.processCode(); 11641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (CallStateException e) { 11651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //do nothing 11661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // FIXME should this return null or something else? 11691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return null; 11701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 11721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mCT.dial(newDialString); 11731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 11771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean handlePinMmi(String dialString) { 11781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu MmiCode mmi; 11791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 11801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mmi = GsmMmiCode.newFromDialString(dialString, this, mUiccApplication.get()); 11811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 11821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mmi = CdmaMmiCode.newFromDialString(dialString, this, mUiccApplication.get()); 11831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mmi != null && mmi.isPinPukCommand()) { 11861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPendingMMIs.add(mmi); 11871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null)); 11881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 11891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mmi.processCode(); 11901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (CallStateException e) { 11911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //do nothing 11921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return true; 11941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("Mmi is null or unrecognized!"); 11971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 11981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 12001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 12011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void sendUssdResponse(String ussdMessge) { 12021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 12031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmMmiCode mmi = GsmMmiCode.newFromUssdUserInput(ussdMessge, this, mUiccApplication.get()); 12041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mPendingMMIs.add(mmi); 12051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null)); 12061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mmi.sendUssd(ussdMessge); 12071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 12081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("sendUssdResponse: not possible in CDMA"); 12091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 12121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1213e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void sendDtmf(char c) { 12141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!PhoneNumberUtils.is12Key(c)) { 12151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("sendDtmf called with invalid character '" + c + "'"); 12161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 12171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mCT.mState == PhoneConstants.State.OFFHOOK) { 12181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.sendDtmf(c, null); 12191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 12231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1224e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void startDtmf(char c) { 12251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!PhoneNumberUtils.is12Key(c)) { 12261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("startDtmf called with invalid character '" + c + "'"); 12271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 12281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.startDtmf(c, null); 12291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 12321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1233e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void stopDtmf() { 12341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.stopDtmf(null); 12351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 12371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 12381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete) { 12391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 12401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("[GsmCdmaPhone] sendBurstDtmf() is a CDMA method"); 12411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 12421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean check = true; 12431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (int itr = 0;itr < dtmfString.length(); itr++) { 12441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!PhoneNumberUtils.is12Key(dtmfString.charAt(itr))) { 12451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, 12461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "sendDtmf called with invalid character '" + dtmfString.charAt(itr)+ "'"); 12471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu check = false; 12481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 12491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 125132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan if (mCT.mState == PhoneConstants.State.OFFHOOK && check) { 12521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.sendBurstDtmf(dtmfString, on, off, onComplete); 12531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 12571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1258e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void setRadioPower(boolean power) { 12591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSST.setRadioPower(power); 12601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 12621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void storeVoiceMailNumber(String number) { 12631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); 12641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SharedPreferences.Editor editor = sp.edit(); 12651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 12661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu editor.putString(VM_NUMBER + getPhoneId(), number); 12671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu editor.apply(); 12681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setVmSimImsi(getSubscriberId()); 12691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 12701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu editor.putString(VM_NUMBER_CDMA + getPhoneId(), number); 12711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu editor.apply(); 12721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 12751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 12761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getVoiceMailNumber() { 12771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String number = null; 12781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 12791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Read from the SIM. If its null, try reading from the shared preference area. 12801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 12811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu number = (r != null) ? r.getVoiceMailNumber() : ""; 12821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (TextUtils.isEmpty(number)) { 12831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); 12841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu number = sp.getString(VM_NUMBER + getPhoneId(), null); 12851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 12871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); 12881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu number = sp.getString(VM_NUMBER_CDMA + getPhoneId(), null); 12891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 12901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 12911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (TextUtils.isEmpty(number)) { 12921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String[] listArray = getContext().getResources() 12931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu .getStringArray(com.android.internal.R.array.config_default_vm_number); 12941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (listArray != null && listArray.length > 0) { 12951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (int i=0; i<listArray.length; i++) { 12961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!TextUtils.isEmpty(listArray[i])) { 12971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String[] defaultVMNumberArray = listArray[i].split(";"); 12981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (defaultVMNumberArray != null && defaultVMNumberArray.length > 0) { 12991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (defaultVMNumberArray.length == 1) { 13001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu number = defaultVMNumberArray[0]; 13011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (defaultVMNumberArray.length == 2 && 13021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu !TextUtils.isEmpty(defaultVMNumberArray[1]) && 13031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isMatchGid(defaultVMNumberArray[1])) { 13041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu number = defaultVMNumberArray[0]; 13051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 13061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 13131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isPhoneTypeGsm() && TextUtils.isEmpty(number)) { 13141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Read platform settings for dynamic voicemail number 13151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (getContext().getResources().getBoolean(com.android.internal 13161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu .R.bool.config_telephony_use_own_number_for_voicemail)) { 13171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu number = getLine1Number(); 13181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 13191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu number = "*86"; 13201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 13231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return number; 13241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 13261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private String getVmSimImsi() { 13271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); 13281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return sp.getString(VM_SIM_IMSI + getPhoneId(), null); 13291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 13311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void setVmSimImsi(String imsi) { 13321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); 13331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SharedPreferences.Editor editor = sp.edit(); 13341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu editor.putString(VM_SIM_IMSI + getPhoneId(), imsi); 13351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu editor.apply(); 13361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 13381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 13391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getVoiceMailAlphaTag() { 13401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String ret = ""; 13411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 13421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 13431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 13441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 13451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret = (r != null) ? r.getVoiceMailAlphaTag() : ""; 13461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 13481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ret == null || ret.length() == 0) { 13491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mContext.getText( 13501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu com.android.internal.R.string.defaultVoiceMailAlphaTag).toString(); 13511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 13531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return ret; 13541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 13561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 13571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getDeviceId() { 13581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 13591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mImei; 13601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 13611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String id = getMeid(); 13621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((id == null) || id.matches("^0*$")) { 13631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("getDeviceId(): MEID is not initialized use ESN"); 13641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu id = getEsn(); 13651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return id; 13671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 13701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 13711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getDeviceSvn() { 1372dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan if (isPhoneTypeGsm() || isPhoneTypeCdmaLte()) { 13731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mImeiSv; 13741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 13751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("getDeviceSvn(): return 0"); 13761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return "0"; 13771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 13801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 13811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public IsimRecords getIsimRecords() { 13821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mIsimUiccRecords; 13831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 13851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 13861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getImei() { 13871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mImei; 13881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 13901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 13911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getEsn() { 13921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 13931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("[GsmCdmaPhone] getEsn() is a CDMA method"); 13941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return "0"; 13951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 13961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mEsn; 13971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 13991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 14001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 14011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getMeid() { 14021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 14031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("[GsmCdmaPhone] getMeid() is a CDMA method"); 14041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return "0"; 14051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 14061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mMeid; 14071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 14101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 14111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getNai() { 14121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mUiccController.getIccRecords(mPhoneId, UiccController.APP_FAM_3GPP2); 14131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (Log.isLoggable(LOG_TAG, Log.VERBOSE)) { 14141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.v(LOG_TAG, "IccRecords is " + r); 14151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (r != null) ? r.getNAI() : null; 14171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 14191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 14201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getSubscriberId() { 14211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 14221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 14231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (r != null) ? r.getIMSI() : null; 1424dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan } else if (isPhoneTypeCdma()) { 14251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mSST.getImsi(); 1426dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan } else { //isPhoneTypeCdmaLte() 14271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (mSimRecords != null) ? mSimRecords.getIMSI() : ""; 14281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 14311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 14321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getGroupIdLevel1() { 14331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 14341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 14351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (r != null) ? r.getGid1() : null; 1436dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan } else if (isPhoneTypeCdma()) { 14371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("GID1 is not available in CDMA"); 14381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return null; 1439dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan } else { //isPhoneTypeCdmaLte() 14401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (mSimRecords != null) ? mSimRecords.getGid1() : ""; 14411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 14441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 14451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getGroupIdLevel2() { 14461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 14471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 14481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (r != null) ? r.getGid2() : null; 1449dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan } else if (isPhoneTypeCdma()) { 14501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("GID2 is not available in CDMA"); 14511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return null; 1452dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan } else { //isPhoneTypeCdmaLte() 14531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (mSimRecords != null) ? mSimRecords.getGid2() : ""; 14541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 14571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 14581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getLine1Number() { 14591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 14601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 14611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (r != null) ? r.getMsisdnNumber() : null; 1462808e8bbbeda1f0894fafd2a91bcc095048734499Amit Mahajan } else { 14631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mSST.getMdnNumber(); 14641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 14671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 14681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getCdmaPrlVersion() { 1469dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan return mSST.getPrlVersion(); 14701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 14721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 14731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getCdmaMin() { 1474dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan return mSST.getCdmaMin(); 14751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 14771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 14781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean isMinInfoReady() { 1479dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan return mSST.isMinInfoReady(); 14801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 14821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 14831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getMsisdn() { 14841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 14851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 14861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (r != null) ? r.getMsisdnNumber() : null; 1487dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan } else if (isPhoneTypeCdmaLte()) { 14881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (mSimRecords != null) ? mSimRecords.getMsisdnNumber() : null; 14891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 14901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("getMsisdn: not expected on CDMA"); 14911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return null; 14921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 14941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 14951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 14961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getLine1AlphaTag() { 14971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 14981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 14991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (r != null) ? r.getMsisdnAlphaTag() : null; 15001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 15011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("getLine1AlphaTag: not possible in CDMA"); 15021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return null; 15031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 15061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 15071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean setLine1Number(String alphaTag, String number, Message onComplete) { 15081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 15091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 15101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (r != null) { 15111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu r.setMsisdnNumber(alphaTag, number, onComplete); 15121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return true; 15131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 15141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 15151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 15171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("setLine1Number: not possible in CDMA"); 15181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 15191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 15221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 152378867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan public void setVoiceMailNumber(String alphaTag, String voiceMailNumber, Message onComplete) { 15241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Message resp; 15251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mVmNumber = voiceMailNumber; 15261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu resp = obtainMessage(EVENT_SET_VM_NUMBER_DONE, 0, 0, onComplete); 15271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 15281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (r != null) { 15291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu r.setVoiceMailNumber(alphaTag, mVmNumber, resp); 15301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 15331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean isValidCommandInterfaceCFReason (int commandInterfaceCFReason) { 15341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu switch (commandInterfaceCFReason) { 153578867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan case CF_REASON_UNCONDITIONAL: 153678867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan case CF_REASON_BUSY: 153778867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan case CF_REASON_NO_REPLY: 153878867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan case CF_REASON_NOT_REACHABLE: 153978867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan case CF_REASON_ALL: 154078867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan case CF_REASON_ALL_CONDITIONAL: 154178867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan return true; 154278867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan default: 154378867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan return false; 15441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 15471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 15481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getSystemProperty(String property, String defValue) { 1549dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan if (isPhoneTypeGsm() || isPhoneTypeCdmaLte()) { 15501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (getUnitTestMode()) { 15511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return null; 15521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return TelephonyManager.getTelephonyProperty(mPhoneId, property, defValue); 15541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 15551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return super.getSystemProperty(property, defValue); 15561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 15591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean isValidCommandInterfaceCFAction (int commandInterfaceCFAction) { 15601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu switch (commandInterfaceCFAction) { 156178867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan case CF_ACTION_DISABLE: 156278867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan case CF_ACTION_ENABLE: 156378867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan case CF_ACTION_REGISTRATION: 156478867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan case CF_ACTION_ERASURE: 156578867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan return true; 156678867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan default: 156778867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan return false; 15681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1571e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan private boolean isCfEnable(int action) { 15721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (action == CF_ACTION_ENABLE) || (action == CF_ACTION_REGISTRATION); 15731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 15751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 15761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void getCallForwardingOption(int commandInterfaceCFReason, Message onComplete) { 15771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 1578c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Phone imsPhone = mImsPhone; 15791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((imsPhone != null) 15801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && ((imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE) 15811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || imsPhone.isUtEnabled())) { 15821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu imsPhone.getCallForwardingOption(commandInterfaceCFReason, onComplete); 15831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 15841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 15861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isValidCommandInterfaceCFReason(commandInterfaceCFReason)) { 15871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("requesting call forwarding query."); 15881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Message resp; 15891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (commandInterfaceCFReason == CF_REASON_UNCONDITIONAL) { 15901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu resp = obtainMessage(EVENT_GET_CALL_FORWARD_DONE, onComplete); 15911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 15921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu resp = onComplete; 15931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.queryCallForwardStatus(commandInterfaceCFReason, 0, null, resp); 15951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 15971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("getCallForwardingOption: not possible in CDMA"); 15981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 15991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 16011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 16021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void setCallForwardingOption(int commandInterfaceCFAction, 16031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int commandInterfaceCFReason, 16041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String dialingNumber, 16051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int timerSeconds, 16061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Message onComplete) { 16071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 1608c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Phone imsPhone = mImsPhone; 16091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((imsPhone != null) 16101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && ((imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE) 16111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || imsPhone.isUtEnabled())) { 16121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu imsPhone.setCallForwardingOption(commandInterfaceCFAction, 16131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu commandInterfaceCFReason, dialingNumber, timerSeconds, onComplete); 16141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 16151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 16171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((isValidCommandInterfaceCFAction(commandInterfaceCFAction)) && 16181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu (isValidCommandInterfaceCFReason(commandInterfaceCFReason))) { 16191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 16201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Message resp; 16211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (commandInterfaceCFReason == CF_REASON_UNCONDITIONAL) { 16221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Cfu cfu = new Cfu(dialingNumber, onComplete); 16231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu resp = obtainMessage(EVENT_SET_CALL_FORWARD_DONE, 16241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isCfEnable(commandInterfaceCFAction) ? 1 : 0, 0, cfu); 16251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 16261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu resp = onComplete; 16271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.setCallForward(commandInterfaceCFAction, 16291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu commandInterfaceCFReason, 16301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu CommandsInterface.SERVICE_CLASS_VOICE, 16311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu dialingNumber, 16321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu timerSeconds, 16331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu resp); 16341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 16361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("setCallForwardingOption: not possible in CDMA"); 16371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 16401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 16411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void getOutgoingCallerIdDisplay(Message onComplete) { 16421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 1643c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Phone imsPhone = mImsPhone; 16441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((imsPhone != null) 16451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && (imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE)) { 16461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu imsPhone.getOutgoingCallerIdDisplay(onComplete); 16471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 16481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.getCLIR(onComplete); 16501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 16511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("getOutgoingCallerIdDisplay: not possible in CDMA"); 16521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 16551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1656e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode, Message onComplete) { 16571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 1658c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Phone imsPhone = mImsPhone; 16591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((imsPhone != null) 16601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && (imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE)) { 16611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu imsPhone.setOutgoingCallerIdDisplay(commandInterfaceCLIRMode, onComplete); 16621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 16631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Packing CLIR value in the message. This will be required for 16651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // SharedPreference caching, if the message comes back as part of 16661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // a success response. 16671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.setCLIR(commandInterfaceCLIRMode, 16681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu obtainMessage(EVENT_SET_CLIR_COMPLETE, commandInterfaceCLIRMode, 0, onComplete)); 16691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 16701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("setOutgoingCallerIdDisplay: not possible in CDMA"); 16711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 16741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 16751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void getCallWaiting(Message onComplete) { 16761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 1677c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Phone imsPhone = mImsPhone; 16781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((imsPhone != null) 16791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && ((imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE) 16801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || imsPhone.isUtEnabled())) { 16811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu imsPhone.getCallWaiting(onComplete); 16821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 16831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 16851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //As per 3GPP TS 24.083, section 1.6 UE doesn't need to send service 16861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //class parameter in call waiting interrogation to network 16871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.queryCallWaiting(CommandsInterface.SERVICE_CLASS_NONE, onComplete); 16881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 16891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.queryCallWaiting(CommandsInterface.SERVICE_CLASS_VOICE, onComplete); 16901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 16921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 16931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 16941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void setCallWaiting(boolean enable, Message onComplete) { 16951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 1696c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Phone imsPhone = mImsPhone; 16971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((imsPhone != null) 16981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && ((imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE) 16991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || imsPhone.isUtEnabled())) { 17001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu imsPhone.setCallWaiting(enable, onComplete); 17011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 17021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.setCallWaiting(enable, CommandsInterface.SERVICE_CLASS_VOICE, onComplete); 17051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 17061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("method setCallWaiting is NOT supported in CDMA!"); 17071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1711e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void getAvailableNetworks(Message response) { 1712dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan if (isPhoneTypeGsm() || isPhoneTypeCdmaLte()) { 17131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.getAvailableNetworks(response); 17141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 17151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("getAvailableNetworks: not possible in CDMA"); 17161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1720e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void getNeighboringCids(Message response) { 17211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 17221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.getNeighboringCids(response); 17231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 17241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* 17251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * This is currently not implemented. At least as of June 17261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 2009, there is no neighbor cell information available for 17271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * CDMA because some party is resisting making this 17281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * information readily available. Consequently, calling this 17291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * function can have no useful effect. This situation may 17301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * (and hopefully will) change in the future. 17311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 17321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (response != null) { 17331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu CommandException ce = new CommandException( 17341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu CommandException.Error.REQUEST_NOT_SUPPORTED); 17351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu AsyncResult.forMessage(response).exception = ce; 17361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu response.sendToTarget(); 17371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 17421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void setUiTTYMode(int uiTtyMode, Message onComplete) { 17431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mImsPhone != null) { 17441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mImsPhone.setUiTTYMode(uiTtyMode, onComplete); 17451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 17491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void setMute(boolean muted) { 17501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCT.setMute(muted); 17511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 17541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean getMute() { 17551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mCT.getMute(); 17561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 17591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void getDataCallList(Message response) { 17601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.getDataCallList(response); 17611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 17641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void updateServiceLocation() { 17651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSST.enableSingleLocationUpdate(); 17661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 17691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void enableLocationUpdates() { 17701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSST.enableLocationUpdates(); 17711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 17741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void disableLocationUpdates() { 17751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSST.disableLocationUpdates(); 17761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 17791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean getDataRoamingEnabled() { 17801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mDcTracker.getDataOnRoamingEnabled(); 17811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 17841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void setDataRoamingEnabled(boolean enable) { 17851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDcTracker.setDataOnRoamingEnabled(enable); 17861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 17891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void registerForCdmaOtaStatusChange(Handler h, int what, Object obj) { 1790dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan mCi.registerForCdmaOtaProvision(h, what, obj); 17911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 17941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void unregisterForCdmaOtaStatusChange(Handler h) { 1795dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan mCi.unregisterForCdmaOtaProvision(h); 17961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 17971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 17981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 17991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void registerForSubscriptionInfoReady(Handler h, int what, Object obj) { 1800dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan mSST.registerForSubscriptionInfoReady(h, what, obj); 18011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 18021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 18041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void unregisterForSubscriptionInfoReady(Handler h) { 1805dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan mSST.unregisterForSubscriptionInfoReady(h); 18061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 18071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 18091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void setOnEcbModeExitResponse(Handler h, int what, Object obj) { 18101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEcmExitRespRegistrant = new Registrant(h, what, obj); 18111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 18121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 18141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void unsetOnEcbModeExitResponse(Handler h) { 18151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEcmExitRespRegistrant.clear(); 18161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 18171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 18191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void registerForCallWaiting(Handler h, int what, Object obj) { 1820dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan mCT.registerForCallWaiting(h, what, obj); 18211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 18221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 18241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void unregisterForCallWaiting(Handler h) { 1825dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan mCT.unregisterForCallWaiting(h); 18261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 18271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 18291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean getDataEnabled() { 18301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mDcTracker.getDataEnabled(); 18311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 18321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 18341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void setDataEnabled(boolean enable) { 18351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDcTracker.setDataEnabled(enable); 18361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 18371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 18391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Removes the given MMI from the pending list and notifies 18401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * registrants that it is complete. 18411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @param mmi MMI that is done 18421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 1843e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void onMMIDone(MmiCode mmi) { 18441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* Only notify complete if it's on the pending list. 18461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Otherwise, it's already been handled (eg, previously canceled). 18471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * The exception is cancellation of an incoming USSD-REQUEST, which is 18481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * not on the list. 18491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 18506916d439438ba49e9612977c572c07711228d8a1fionaxu if (mPendingMMIs.remove(mmi) || (isPhoneTypeGsm() && (mmi.isUssdRequest() || 18516916d439438ba49e9612977c572c07711228d8a1fionaxu ((GsmMmiCode)mmi).isSsInfo()))) { 18521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mMmiCompleteRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null)); 18531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 18541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 18551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1856e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan private void onNetworkInitiatedUssd(MmiCode mmi) { 18571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mMmiCompleteRegistrants.notifyRegistrants( 18581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu new AsyncResult(null, mmi, null)); 18591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 18601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** ussdMode is one of CommandsInterface.USSD_MODE_* */ 1862e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan private void onIncomingUSSD (int ussdMode, String ussdMessage) { 18631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isPhoneTypeGsm()) { 18641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("onIncomingUSSD: not expected on GSM"); 18651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 18661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean isUssdError; 18671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean isUssdRequest; 18681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean isUssdRelease; 18691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isUssdRequest 18711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu = (ussdMode == CommandsInterface.USSD_MODE_REQUEST); 18721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isUssdError 18741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu = (ussdMode != CommandsInterface.USSD_MODE_NOTIFY 18751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && ussdMode != CommandsInterface.USSD_MODE_REQUEST); 18761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isUssdRelease = (ussdMode == CommandsInterface.USSD_MODE_NW_RELEASE); 18781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // See comments in GsmMmiCode.java 18811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // USSD requests aren't finished until one 18821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // of these two events happen 18831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmMmiCode found = null; 18841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (int i = 0, s = mPendingMMIs.size() ; i < s; i++) { 18851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if(((GsmMmiCode)mPendingMMIs.get(i)).isPendingUSSD()) { 18861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu found = (GsmMmiCode)mPendingMMIs.get(i); 18871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 18881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 18891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 18901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (found != null) { 18921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Complete pending USSD 18931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 18941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isUssdRelease) { 18951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu found.onUssdRelease(); 18961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (isUssdError) { 18971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu found.onUssdFinishedError(); 18981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 18991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu found.onUssdFinished(ussdMessage, isUssdRequest); 19001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { // pending USSD not found 19021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // The network may initiate its own USSD request 19031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 19041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // ignore everything that isnt a Notify or a Request 19051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // also, discard if there is no message to present 19061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isUssdError && ussdMessage != null) { 19071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmMmiCode mmi; 19081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mmi = GsmMmiCode.newNetworkInitiatedUssd(ussdMessage, 19091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isUssdRequest, 19101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmCdmaPhone.this, 19111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mUiccApplication.get()); 19121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onNetworkInitiatedUssd(mmi); 19131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 19171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 19181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Make sure the network knows our preferred setting. 19191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 1920e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan private void syncClirSetting() { 19211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); 19221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int clirSetting = sp.getInt(CLIR_KEY + getPhoneId(), -1); 19231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (clirSetting >= 0) { 19241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.setCLIR(clirSetting, null); 19251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 19281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void handleRadioAvailable() { 19291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.getBasebandVersion(obtainMessage(EVENT_GET_BASEBAND_VERSION_DONE)); 19301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 19311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 19321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.getIMEI(obtainMessage(EVENT_GET_IMEI_DONE)); 19331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.getIMEISV(obtainMessage(EVENT_GET_IMEISV_DONE)); 19341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 19351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.getDeviceIdentity(obtainMessage(EVENT_GET_DEVICE_IDENTITY_DONE)); 19361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.getRadioCapability(obtainMessage(EVENT_GET_RADIO_CAPABILITY)); 19381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu startLceAfterRadioIsAvailable(); 19391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 19411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void handleRadioOn() { 19421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* Proactively query voice radio technologies */ 19431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.getVoiceRadioTechnology(obtainMessage(EVENT_REQUEST_VOICE_RADIO_TECH_DONE)); 19441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 19451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isPhoneTypeGsm()) { 1946867e0150ea9181755c681013f18877e8eab8ffffAmit Mahajan mCdmaSubscriptionSource = mCdmaSSM.getCdmaSubscriptionSource(); 19471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 19491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If this is on APM off, SIM may already be loaded. Send setPreferredNetworkType 19501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // request to RIL to preserve user setting across APM toggling 19511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setPreferredNetworkTypeIfSimLoaded(); 19521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 19541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void handleRadioOffOrNotAvailable() { 19551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 19561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Some MMI requests (eg USSD) are not completed 19571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // within the course of a CommandsInterface request 19581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If the radio shuts off or resets while one of these 19591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // is pending, we need to clean up. 19601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 19611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (int i = mPendingMMIs.size() - 1; i >= 0; i--) { 19621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (((GsmMmiCode) mPendingMMIs.get(i)).isPendingUSSD()) { 19631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ((GsmMmiCode) mPendingMMIs.get(i)).onUssdFinishedError(); 19641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1967c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Phone imsPhone = mImsPhone; 19681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (imsPhone != null) { 19691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu imsPhone.getServiceState().setStateOff(); 19701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mRadioOffOrNotAvailableRegistrants.notifyRegistrants(); 19721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 19741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1975e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void handleMessage(Message msg) { 19761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu AsyncResult ar; 19771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Message onComplete; 19781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 19791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu switch (msg.what) { 19801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_RADIO_AVAILABLE: { 19811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu handleRadioAvailable(); 19821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 19841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 19851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_GET_DEVICE_IDENTITY_DONE:{ 19861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult)msg.obj; 19871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 19881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ar.exception != null) { 19891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 19901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String[] respId = (String[])ar.result; 19921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mImei = respId[0]; 19931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mImeiSv = respId[1]; 19941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEsn = respId[2]; 19951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mMeid = respId[3]; 19961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 19971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 19981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 19991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_EMERGENCY_CALLBACK_MODE_ENTER:{ 20001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu handleEnterEmergencyCallbackMode(msg); 20011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 20021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 20031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 20041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE:{ 20051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu handleExitEmergencyCallbackMode(msg); 20061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 20071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 20081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 20091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_RUIM_RECORDS_LOADED: 20101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("Event EVENT_RUIM_RECORDS_LOADED Received"); 20111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu updateCurrentCarrierInProvider(); 20121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 20131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 20141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_RADIO_ON: 20151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("Event EVENT_RADIO_ON Received"); 20161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu handleRadioOn(); 20171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 20181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 20191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_RIL_CONNECTED: 20201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult) msg.obj; 20211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ar.exception == null && ar.result != null) { 20221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mRilVersion = (Integer) ar.result; 20231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 20241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("Unexpected exception on EVENT_RIL_CONNECTED"); 20251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mRilVersion = -1; 20261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 20271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 20281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 20291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_VOICE_RADIO_TECH_CHANGED: 20301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_REQUEST_VOICE_RADIO_TECH_DONE: 20311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String what = (msg.what == EVENT_VOICE_RADIO_TECH_CHANGED) ? 20321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "EVENT_VOICE_RADIO_TECH_CHANGED" : "EVENT_REQUEST_VOICE_RADIO_TECH_DONE"; 20331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult) msg.obj; 20341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ar.exception == null) { 20351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((ar.result != null) && (((int[]) ar.result).length != 0)) { 20361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int newVoiceTech = ((int[]) ar.result)[0]; 20371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd(what + ": newVoiceTech=" + newVoiceTech); 20381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu phoneObjectUpdater(newVoiceTech); 20391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 20401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge(what + ": has no tech!"); 20411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 20421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 20431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge(what + ": exception=" + ar.exception); 20441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 20451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 20461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 20471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_UPDATE_PHONE_OBJECT: 20481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu phoneObjectUpdater(msg.arg1); 20491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 20501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 20511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_CARRIER_CONFIG_CHANGED: 20521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Only check for the voice radio tech if it not going to be updated by the voice 20531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // registration changes. 20541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!mContext.getResources().getBoolean(com.android.internal.R.bool. 20551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu config_switch_phone_on_voice_reg_state_change)) { 20561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.getVoiceRadioTechnology(obtainMessage(EVENT_REQUEST_VOICE_RADIO_TECH_DONE)); 20571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 20581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Force update IMS service 20591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ImsManager.updateImsServiceConfig(mContext, mPhoneId, true); 2060a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan 2061a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan // Update broadcastEmergencyCallStateChanges 2062a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan CarrierConfigManager configMgr = (CarrierConfigManager) 2063a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE); 2064a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan PersistableBundle b = configMgr.getConfigForSubId(getSubId()); 2065a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan if (b != null) { 2066a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan boolean broadcastEmergencyCallStateChanges = b.getBoolean( 2067a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan CarrierConfigManager.KEY_BROADCAST_EMERGENCY_CALL_STATE_CHANGES_BOOL); 2068a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan logd("broadcastEmergencyCallStateChanges =" + broadcastEmergencyCallStateChanges); 2069a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan setBroadcastEmergencyCallStateChanges(broadcastEmergencyCallStateChanges); 2070a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan } else { 2071a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan loge("didn't get broadcastEmergencyCallStateChanges from carrier config"); 2072a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan } 2073a579e9c631d70bb6dbd39283438212d5ff8f19c0Amit Mahajan 20749d3f7e2198479ede7009c53aea1499d73016de7cqingxi // Changing the cdma roaming settings based carrier config. 20759d3f7e2198479ede7009c53aea1499d73016de7cqingxi if (b != null) { 20769d3f7e2198479ede7009c53aea1499d73016de7cqingxi int config_cdma_roaming_mode = b.getInt( 20779d3f7e2198479ede7009c53aea1499d73016de7cqingxi CarrierConfigManager.KEY_CDMA_ROAMING_MODE_INT); 20789d3f7e2198479ede7009c53aea1499d73016de7cqingxi int current_cdma_roaming_mode = 20799d3f7e2198479ede7009c53aea1499d73016de7cqingxi Settings.Global.getInt(getContext().getContentResolver(), 20809d3f7e2198479ede7009c53aea1499d73016de7cqingxi Settings.Global.CDMA_ROAMING_MODE, 20819d3f7e2198479ede7009c53aea1499d73016de7cqingxi CarrierConfigManager.CDMA_ROAMING_MODE_RADIO_DEFAULT); 20829d3f7e2198479ede7009c53aea1499d73016de7cqingxi switch (config_cdma_roaming_mode) { 20839d3f7e2198479ede7009c53aea1499d73016de7cqingxi // Carrier's cdma_roaming_mode will overwrite the user's previous settings 20849d3f7e2198479ede7009c53aea1499d73016de7cqingxi // Keep the user's previous setting in global variable which will be used 20859d3f7e2198479ede7009c53aea1499d73016de7cqingxi // when carrier's setting is turn off. 20869d3f7e2198479ede7009c53aea1499d73016de7cqingxi case CarrierConfigManager.CDMA_ROAMING_MODE_HOME: 20879d3f7e2198479ede7009c53aea1499d73016de7cqingxi case CarrierConfigManager.CDMA_ROAMING_MODE_AFFILIATED: 20889d3f7e2198479ede7009c53aea1499d73016de7cqingxi case CarrierConfigManager.CDMA_ROAMING_MODE_ANY: 20899d3f7e2198479ede7009c53aea1499d73016de7cqingxi logd("cdma_roaming_mode is going to changed to " 20909d3f7e2198479ede7009c53aea1499d73016de7cqingxi + config_cdma_roaming_mode); 20919d3f7e2198479ede7009c53aea1499d73016de7cqingxi setCdmaRoamingPreference(config_cdma_roaming_mode, 20929d3f7e2198479ede7009c53aea1499d73016de7cqingxi obtainMessage(EVENT_SET_ROAMING_PREFERENCE_DONE)); 20939d3f7e2198479ede7009c53aea1499d73016de7cqingxi break; 20949d3f7e2198479ede7009c53aea1499d73016de7cqingxi 20959d3f7e2198479ede7009c53aea1499d73016de7cqingxi // When carrier's setting is turn off, change the cdma_roaming_mode to the 20969d3f7e2198479ede7009c53aea1499d73016de7cqingxi // previous user's setting 20979d3f7e2198479ede7009c53aea1499d73016de7cqingxi case CarrierConfigManager.CDMA_ROAMING_MODE_RADIO_DEFAULT: 20989d3f7e2198479ede7009c53aea1499d73016de7cqingxi if (current_cdma_roaming_mode != config_cdma_roaming_mode) { 20999d3f7e2198479ede7009c53aea1499d73016de7cqingxi logd("cdma_roaming_mode is going to changed to " 21009d3f7e2198479ede7009c53aea1499d73016de7cqingxi + current_cdma_roaming_mode); 21019d3f7e2198479ede7009c53aea1499d73016de7cqingxi setCdmaRoamingPreference(current_cdma_roaming_mode, 21029d3f7e2198479ede7009c53aea1499d73016de7cqingxi obtainMessage(EVENT_SET_ROAMING_PREFERENCE_DONE)); 21039d3f7e2198479ede7009c53aea1499d73016de7cqingxi } 21049d3f7e2198479ede7009c53aea1499d73016de7cqingxi 21059d3f7e2198479ede7009c53aea1499d73016de7cqingxi default: 21069d3f7e2198479ede7009c53aea1499d73016de7cqingxi loge("Invalid cdma_roaming_mode settings: " 21079d3f7e2198479ede7009c53aea1499d73016de7cqingxi + config_cdma_roaming_mode); 21089d3f7e2198479ede7009c53aea1499d73016de7cqingxi } 21099d3f7e2198479ede7009c53aea1499d73016de7cqingxi } else { 21109d3f7e2198479ede7009c53aea1499d73016de7cqingxi loge("didn't get the cdma_roaming_mode changes from the carrier config."); 21119d3f7e2198479ede7009c53aea1499d73016de7cqingxi } 21129d3f7e2198479ede7009c53aea1499d73016de7cqingxi 21132dd874066ed871c8adf50f58e4b025d525db78ebJack Yu // Load the ERI based on carrier config. Carrier might have their specific ERI. 21142dd874066ed871c8adf50f58e4b025d525db78ebJack Yu prepareEri(); 21152dd874066ed871c8adf50f58e4b025d525db78ebJack Yu if (!isPhoneTypeGsm()) { 21162dd874066ed871c8adf50f58e4b025d525db78ebJack Yu mSST.pollState(); 21172dd874066ed871c8adf50f58e4b025d525db78ebJack Yu } 21182dd874066ed871c8adf50f58e4b025d525db78ebJack Yu 21191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 21201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21219d3f7e2198479ede7009c53aea1499d73016de7cqingxi case EVENT_SET_ROAMING_PREFERENCE_DONE: 21229d3f7e2198479ede7009c53aea1499d73016de7cqingxi logd("cdma_roaming_mode change is done"); 21239d3f7e2198479ede7009c53aea1499d73016de7cqingxi break; 21249d3f7e2198479ede7009c53aea1499d73016de7cqingxi 21251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED: 21261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED"); 2127867e0150ea9181755c681013f18877e8eab8ffffAmit Mahajan mCdmaSubscriptionSource = mCdmaSSM.getCdmaSubscriptionSource(); 21281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 21291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_REGISTERED_TO_NETWORK: 21311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("Event EVENT_REGISTERED_TO_NETWORK Received"); 21321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 21331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu syncClirSetting(); 21341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 21351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 21361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_SIM_RECORDS_LOADED: 21381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 21391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu updateCurrentCarrierInProvider(); 21401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Check if this is a different SIM than the previous one. If so unset the 21421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // voice mail number. 21431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String imsi = getVmSimImsi(); 21441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String imsiFromSIM = getSubscriberId(); 21451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (imsi != null && imsiFromSIM != null && !imsiFromSIM.equals(imsi)) { 21461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu storeVoiceMailNumber(null); 21471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setVmSimImsi(null); 21481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 21491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 21501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSimRecordsLoadedRegistrants.notifyRegistrants(); 21521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 21531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_GET_BASEBAND_VERSION_DONE: 21551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult)msg.obj; 21561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ar.exception != null) { 21581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 21591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 21601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("Baseband version: " + ar.result); 21621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu TelephonyManager.from(mContext).setBasebandVersionForPhone(getPhoneId(), 21631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu (String)ar.result); 21641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 21651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_GET_IMEI_DONE: 21671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult)msg.obj; 21681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ar.exception != null) { 21701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 21711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 21721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mImei = (String)ar.result; 21741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 21751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_GET_IMEISV_DONE: 21771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult)msg.obj; 21781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ar.exception != null) { 21801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 21811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 21821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mImeiSv = (String)ar.result; 21841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 21851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_USSD: 21871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult)msg.obj; 21881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String[] ussdResult = (String[]) ar.result; 21901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 21911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ussdResult.length > 1) { 21921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 21931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onIncomingUSSD(Integer.parseInt(ussdResult[0]), ussdResult[1]); 21941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (NumberFormatException e) { 21951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.w(LOG_TAG, "error parsing USSD"); 21961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 21971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 21981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 21991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 22001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_RADIO_OFF_OR_NOT_AVAILABLE: { 22011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("Event EVENT_RADIO_OFF_OR_NOT_AVAILABLE Received"); 22021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu handleRadioOffOrNotAvailable(); 22031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 22041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 22051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 22061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_SSN: 22071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("Event EVENT_SSN Received"); 22081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 22091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult) msg.obj; 22101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SuppServiceNotification not = (SuppServiceNotification) ar.result; 22111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSsnRegistrants.notifyRegistrants(ar); 22121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 22131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 22141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 22151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_SET_CALL_FORWARD_DONE: 22161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult)msg.obj; 22171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 22181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Cfu cfu = (Cfu) ar.userObj; 22191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ar.exception == null && r != null) { 22201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setVoiceCallForwardingFlag(1, msg.arg1 == 1, cfu.mSetCfNumber); 22211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 22221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (cfu.mOnComplete != null) { 22231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu AsyncResult.forMessage(cfu.mOnComplete, ar.result, ar.exception); 22241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu cfu.mOnComplete.sendToTarget(); 22251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 22261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 22271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 22281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_SET_VM_NUMBER_DONE: 22291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult)msg.obj; 22301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((isPhoneTypeGsm() && IccVmNotSupportedException.class.isInstance(ar.exception)) || 22311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu (!isPhoneTypeGsm() && IccException.class.isInstance(ar.exception))){ 22321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu storeVoiceMailNumber(mVmNumber); 22331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar.exception = null; 22341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 22351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onComplete = (Message) ar.userObj; 22361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (onComplete != null) { 22371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu AsyncResult.forMessage(onComplete, ar.result, ar.exception); 22381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onComplete.sendToTarget(); 22391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 22401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 22411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 22421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 22431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_GET_CALL_FORWARD_DONE: 22441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult)msg.obj; 22451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ar.exception == null) { 22461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu handleCfuQueryResult((CallForwardInfo[])ar.result); 22471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 22481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onComplete = (Message) ar.userObj; 22491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (onComplete != null) { 22501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu AsyncResult.forMessage(onComplete, ar.result, ar.exception); 22511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onComplete.sendToTarget(); 22521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 22531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 22541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 22551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_SET_NETWORK_AUTOMATIC: 22561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Automatic network selection from EF_CSP SIM record 22571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult) msg.obj; 22581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mSST.mSS.getIsManualSelection()) { 22591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setNetworkSelectionModeAutomatic((Message) ar.result); 22601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("SET_NETWORK_SELECTION_AUTOMATIC: set to automatic"); 22611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 22621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // prevent duplicate request which will push current PLMN to low priority 22631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("SET_NETWORK_SELECTION_AUTOMATIC: already automatic, ignore"); 22641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 22651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 22661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 22671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_ICC_RECORD_EVENTS: 22681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult)msg.obj; 22691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu processIccRecordEvents((Integer)ar.result); 22701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 22711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 22721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_SET_CLIR_COMPLETE: 22731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult)msg.obj; 22741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ar.exception == null) { 22751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu saveClirSetting(msg.arg1); 22761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 22771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onComplete = (Message) ar.userObj; 22781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (onComplete != null) { 22791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu AsyncResult.forMessage(onComplete, ar.result, ar.exception); 22801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu onComplete.sendToTarget(); 22811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 22821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 22831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 22841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case EVENT_SS: 22851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ar = (AsyncResult)msg.obj; 22861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("Event EVENT_SS received"); 22871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 22881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // SS data is already being handled through MMI codes. 22891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // So, this result if processed as MMI response would help 22901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // in re-using the existing functionality. 22911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmMmiCode mmi = new GsmMmiCode(this, mUiccApplication.get()); 22921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mmi.processSsData(ar); 22931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 22941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 22951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2296c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan case EVENT_GET_RADIO_CAPABILITY: 2297c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan ar = (AsyncResult) msg.obj; 2298c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan RadioCapability rc = (RadioCapability) ar.result; 2299c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan if (ar.exception != null) { 2300c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Rlog.d(LOG_TAG, "get phone radio capability fail, no need to change " + 2301c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan "mRadioCapability"); 2302c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan } else { 2303c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan radioCapabilityUpdated(rc); 2304c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan } 2305c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Rlog.d(LOG_TAG, "EVENT_GET_RADIO_CAPABILITY: phone rc: " + rc); 2306c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan break; 2307c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan 23081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu default: 23091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu super.handleMessage(msg); 23101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2313604d70ccbf958d1abd92b128fa18a9f17b42b133Amit Mahajan public UiccCardApplication getUiccCardApplication() { 23141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 23151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mUiccController.getUiccCardApplication(mPhoneId, UiccController.APP_FAM_3GPP); 23161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 23171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mUiccController.getUiccCardApplication(mPhoneId, UiccController.APP_FAM_3GPP2); 23181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 23211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 23221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu protected void onUpdateIccAvailability() { 23231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mUiccController == null ) { 23241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 23251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 23271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu UiccCardApplication newUiccApplication = null; 23281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2329c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan // Update mIsimUiccRecords 2330dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan if (isPhoneTypeGsm() || isPhoneTypeCdmaLte()) { 23311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu newUiccApplication = 23321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mUiccController.getUiccCardApplication(mPhoneId, UiccController.APP_FAM_IMS); 23331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IsimUiccRecords newIsimUiccRecords = null; 23341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 23351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (newUiccApplication != null) { 23361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu newIsimUiccRecords = (IsimUiccRecords) newUiccApplication.getIccRecords(); 23371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("New ISIM application found"); 23381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIsimUiccRecords = newIsimUiccRecords; 2340c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan } 23411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2342c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan // Update mSimRecords 2343c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan if (mSimRecords != null) { 2344c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan mSimRecords.unregisterForRecordsLoaded(this); 2345c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan } 2346dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan if (isPhoneTypeCdmaLte()) { 2347c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan newUiccApplication = mUiccController.getUiccCardApplication(mPhoneId, 2348c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan UiccController.APP_FAM_3GPP); 2349c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan SIMRecords newSimRecords = null; 2350c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan if (newUiccApplication != null) { 2351c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan newSimRecords = (SIMRecords) newUiccApplication.getIccRecords(); 23521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2353c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan mSimRecords = newSimRecords; 2354c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan if (mSimRecords != null) { 2355c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan mSimRecords.registerForRecordsLoaded(this, EVENT_SIM_RECORDS_LOADED, null); 2356c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan } 2357c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan } else { 2358c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan mSimRecords = null; 23591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2361c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan // Update mIccRecords, mUiccApplication, mIccPhoneBookIntManager 2362c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan newUiccApplication = getUiccCardApplication(); 2363c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan if (!isPhoneTypeGsm() && newUiccApplication == null) { 2364c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan logd("can't find 3GPP2 application; trying APP_FAM_3GPP"); 2365c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan newUiccApplication = mUiccController.getUiccCardApplication(mPhoneId, 2366c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan UiccController.APP_FAM_3GPP); 23671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 23691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu UiccCardApplication app = mUiccApplication.get(); 23701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (app != newUiccApplication) { 23711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (app != null) { 23721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("Removing stale icc objects."); 23731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mIccRecords.get() != null) { 23741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu unregisterForIccRecordEvents(); 23751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIccPhoneBookIntManager.updateIccRecords(null); 23761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIccRecords.set(null); 23781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mUiccApplication.set(null); 23791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (newUiccApplication != null) { 23811573c17cbeab5a41936d369cb05cb7c0b0299ca1Jack Yu if (DBG) { 23821573c17cbeab5a41936d369cb05cb7c0b0299ca1Jack Yu logd("New Uicc application found. type = " + newUiccApplication.getType()); 23831573c17cbeab5a41936d369cb05cb7c0b0299ca1Jack Yu } 23841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mUiccApplication.set(newUiccApplication); 23851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIccRecords.set(newUiccApplication.getIccRecords()); 23861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu registerForIccRecordEvents(); 23871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIccPhoneBookIntManager.updateIccRecords(mIccRecords.get()); 23881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 23921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void processIccRecordEvents(int eventCode) { 23931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu switch (eventCode) { 23941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case IccRecords.EVENT_CFI: 23951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu notifyCallForwardingIndicator(); 23961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 23971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 23991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 24001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 24011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Sets the "current" field in the telephony provider according to the SIM's operator 24021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 24031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @return true for success; false otherwise. 24041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 24051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 24061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean updateCurrentCarrierInProvider() { 2407dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan if (isPhoneTypeGsm() || isPhoneTypeCdmaLte()) { 240838ca51d0f643405df51e78fce6c546424e9f410dShishir Agrawal long currentDds = SubscriptionManager.getDefaultDataSubscriptionId(); 24091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String operatorNumeric = getOperatorNumeric(); 24101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 24111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("updateCurrentCarrierInProvider: mSubId = " + getSubId() 24121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + " currentDds = " + currentDds + " operatorNumeric = " + operatorNumeric); 24131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 24141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!TextUtils.isEmpty(operatorNumeric) && (getSubId() == currentDds)) { 24151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 24161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current"); 24171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ContentValues map = new ContentValues(); 24181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu map.put(Telephony.Carriers.NUMERIC, operatorNumeric); 24191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mContext.getContentResolver().insert(uri, map); 24201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return true; 24211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (SQLException e) { 24221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, "Can't store current operator", e); 24231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 24261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 24271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return true; 24281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 24311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 24321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 24331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Sets the "current" field in the telephony provider according to the 24341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * build-time operator numeric property 24351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 24361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @return true for success; false otherwise. 24371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 2438e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan private boolean updateCurrentCarrierInProvider(String operatorNumeric) { 2439dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan if (isPhoneTypeCdma() 2440dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan || (isPhoneTypeCdmaLte() && mUiccController.getUiccCardApplication(mPhoneId, 2441dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan UiccController.APP_FAM_3GPP) == null)) { 24421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("CDMAPhone: updateCurrentCarrierInProvider called"); 24431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!TextUtils.isEmpty(operatorNumeric)) { 24441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 24451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current"); 24461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ContentValues map = new ContentValues(); 24471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu map.put(Telephony.Carriers.NUMERIC, operatorNumeric); 24481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("updateCurrentCarrierInProvider from system: numeric=" + operatorNumeric); 24491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu getContext().getContentResolver().insert(uri, map); 24501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 24511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Updates MCC MNC device configuration information 24521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("update mccmnc=" + operatorNumeric); 24531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu MccTable.updateMccMncConfiguration(mContext, operatorNumeric, false); 24541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 24551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return true; 24561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (SQLException e) { 24571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, "Can't store current operator", e); 24581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 2461dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan } else { // isPhoneTypeCdmaLte() 24621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) logd("updateCurrentCarrierInProvider not updated X retVal=" + true); 24631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return true; 24641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 24671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void handleCfuQueryResult(CallForwardInfo[] infos) { 24681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 24691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (r != null) { 24701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (infos == null || infos.length == 0) { 24711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Assume the default is not active 24721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Set unconditional CFF in SIM to false 24731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setVoiceCallForwardingFlag(1, false, null); 24741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 24751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (int i = 0, s = infos.length; i < s; i++) { 24761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((infos[i].serviceClass & SERVICE_CLASS_VOICE) != 0) { 24771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setVoiceCallForwardingFlag(1, (infos[i].status == 1), 24781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu infos[i].number); 24791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // should only have the one 24801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 24811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 24871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 24881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Retrieves the IccPhoneBookInterfaceManager of the GsmCdmaPhone 24891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 24901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 24911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public IccPhoneBookInterfaceManager getIccPhoneBookInterfaceManager(){ 24921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mIccPhoneBookIntManager; 24931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 24941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 24951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 24961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void registerForEriFileLoaded(Handler h, int what, Object obj) { 24971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Registrant r = new Registrant (h, what, obj); 24981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEriFileLoadedRegistrants.add(r); 24991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 25021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void unregisterForEriFileLoaded(Handler h) { 25031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEriFileLoadedRegistrants.remove(h); 25041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 25071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void prepareEri() { 25081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mEriManager == null) { 25091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, "PrepareEri: Trying to access stale objects"); 25101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 25111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEriManager.loadEriFile(); 25131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if(mEriManager.isEriFileLoaded()) { 25141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // when the ERI file is loaded 25151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("ERI read, notify registrants"); 25161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEriFileLoadedRegistrants.notifyRegistrants(); 25171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 25211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean isEriFileLoaded() { 25221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mEriManager.isEriFileLoaded(); 25231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 25271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Activate or deactivate cell broadcast SMS. 25281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 25291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @param activate 0 = activate, 1 = deactivate 25301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @param response Callback message is empty on completion 25311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 25321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 25331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void activateCellBroadcastSms(int activate, Message response) { 25341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("[GsmCdmaPhone] activateCellBroadcastSms() is obsolete; use SmsManager"); 25351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu response.sendToTarget(); 25361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 25391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Query the current configuration of cdma cell broadcast SMS. 25401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 25411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @param response Callback message is empty on completion 25421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 25431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 25441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void getCellBroadcastSmsConfig(Message response) { 25451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("[GsmCdmaPhone] getCellBroadcastSmsConfig() is obsolete; use SmsManager"); 25461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu response.sendToTarget(); 25471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 25501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Configure cdma cell broadcast SMS. 25511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 25521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @param response Callback message is empty on completion 25531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 25541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 25551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void setCellBroadcastSmsConfig(int[] configValuesArray, Message response) { 25561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("[GsmCdmaPhone] setCellBroadcastSmsConfig() is obsolete; use SmsManager"); 25571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu response.sendToTarget(); 25581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 25611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Returns true if OTA Service Provisioning needs to be performed. 25621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 25631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 25641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean needsOtaServiceProvisioning() { 25651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 25661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 25671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 25681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mSST.getOtasp() != ServiceStateTracker.OTASP_NOT_NEEDED; 25691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 25731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean isCspPlmnEnabled() { 25741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 25751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return (r != null) ? r.isCspPlmnEnabled() : false; 25761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean isManualNetSelAllowed() { 25791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int nwMode = Phone.PREFERRED_NT_MODE; 25811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int subId = getSubId(); 25821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu nwMode = android.provider.Settings.Global.getInt(mContext.getContentResolver(), 25841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu android.provider.Settings.Global.PREFERRED_NETWORK_MODE + subId, nwMode); 25851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 25861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("isManualNetSelAllowed in mode = " + nwMode); 25871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* 25881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * For multimode targets in global mode manual network 25891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * selection is disallowed 25901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 25911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isManualSelProhibitedInGlobalMode() 25921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && ((nwMode == Phone.NT_MODE_LTE_CDMA_EVDO_GSM_WCDMA) 25931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || (nwMode == Phone.NT_MODE_GLOBAL)) ){ 25941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("Manual selection not supported in mode = " + nwMode); 25951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 25961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 25971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("Manual selection is supported in mode = " + nwMode); 25981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 25991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 26001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* 26011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Single mode phone with - GSM network modes/global mode 26021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * LTE only for 3GPP 26031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * LTE centric + 3GPP Legacy 26041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Note: the actual enabling/disabling manual selection for these 26051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * cases will be controlled by csp 26061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 26071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return true; 26081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 26101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean isManualSelProhibitedInGlobalMode() { 26111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean isProhibited = false; 26121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu final String configString = getContext().getResources().getString(com.android.internal. 26131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu R.string.prohibit_manual_network_selection_in_gobal_mode); 26141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 26151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!TextUtils.isEmpty(configString)) { 26161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String[] configArray = configString.split(";"); 26171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 26181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (configArray != null && 26191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ((configArray.length == 1 && configArray[0].equalsIgnoreCase("true")) || 26201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu (configArray.length == 2 && !TextUtils.isEmpty(configArray[1]) && 26211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu configArray[0].equalsIgnoreCase("true") && 26221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isMatchGid(configArray[1])))) { 26231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isProhibited = true; 26241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("isManualNetSelAllowedInGlobal in current carrier is " + isProhibited); 26271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return isProhibited; 26281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 26301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void registerForIccRecordEvents() { 26311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 26321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (r == null) { 26331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 26341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 26361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu r.registerForNetworkSelectionModeAutomatic( 26371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu this, EVENT_SET_NETWORK_AUTOMATIC, null); 26381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu r.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null); 26391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu r.registerForRecordsLoaded(this, EVENT_SIM_RECORDS_LOADED, null); 26401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 26411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu r.registerForRecordsLoaded(this, EVENT_RUIM_RECORDS_LOADED, null); 26421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 26451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void unregisterForIccRecordEvents() { 26461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 26471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (r == null) { 26481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 26491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu r.unregisterForNetworkSelectionModeAutomatic(this); 26511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu r.unregisterForRecordsEvents(this); 26521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu r.unregisterForRecordsLoaded(this); 26531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 26551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 26561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void exitEmergencyCallbackMode() { 26571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 26581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mImsPhone != null) { 26591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mImsPhone.exitEmergencyCallbackMode(); 26601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 26621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mWakeLock.isHeld()) { 26631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mWakeLock.release(); 26641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Send a message which will invoke handleExitEmergencyCallbackMode 26661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.exitEmergencyCallbackMode(obtainMessage(EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE)); 26671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 26701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 26711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void handleEnterEmergencyCallbackMode(Message msg) { 26721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 26731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, "handleEnterEmergencyCallbackMode,mIsPhoneInEcmState= " 26741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + mIsPhoneInEcmState); 26751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // if phone is not in Ecm mode, and it's changed to Ecm mode 26771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mIsPhoneInEcmState == false) { 26781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIsPhoneInEcmState = true; 26791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // notify change 26801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendEmergencyCallbackModeChange(); 26811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE, "true"); 26821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 26831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Post this runnable so we will automatically exit 26841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // if no one invokes exitEmergencyCallbackMode() directly. 26851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu long delayInMillis = SystemProperties.getLong( 26861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE); 26871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu postDelayed(mExitEcmRunnable, delayInMillis); 26881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // We don't want to go to sleep while in Ecm 26891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mWakeLock.acquire(); 26901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 26921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 26931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 26941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void handleExitEmergencyCallbackMode(Message msg) { 26951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu AsyncResult ar = (AsyncResult)msg.obj; 26961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 26971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, "handleExitEmergencyCallbackMode,ar.exception , mIsPhoneInEcmState " 26981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + ar.exception + mIsPhoneInEcmState); 26991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 27001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Remove pending exit Ecm runnable, if any 27011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu removeCallbacks(mExitEcmRunnable); 27021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 27031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mEcmExitRespRegistrant != null) { 27041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEcmExitRespRegistrant.notifyRegistrant(ar); 27051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 27061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // if exiting ecm success 27071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ar.exception == null) { 2708de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan // release wakeLock 2709de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan if (mWakeLock.isHeld()) { 2710de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan mWakeLock.release(); 2711de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan } 2712de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan 27131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mIsPhoneInEcmState) { 27141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIsPhoneInEcmState = false; 27151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setSystemProperty(TelephonyProperties.PROPERTY_INECM_MODE, "false"); 27161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 27171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // send an Intent 27181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendEmergencyCallbackModeChange(); 27191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Re-initiate data connection 27201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDcTracker.setInternalDataEnabled(true); 27211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu notifyEmergencyCallRegistrants(false); 27221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 27231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 27241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 27251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 27261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void notifyEmergencyCallRegistrants(boolean started) { 27271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEmergencyCallToggledRegistrants.notifyResult(started ? 1 : 0); 27281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 27291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 27301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 27311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 27321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Handle to cancel or restart Ecm timer in emergency call back mode 27331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * if action is CANCEL_ECM_TIMER, cancel Ecm timer and notify apps the timer is canceled; 27341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * otherwise, restart Ecm timer and notify apps the timer is restarted. 27351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 2736e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan public void handleTimerInEmergencyCallbackMode(int action) { 27371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu switch(action) { 27381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CANCEL_ECM_TIMER: 27391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu removeCallbacks(mExitEcmRunnable); 27401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEcmTimerResetRegistrants.notifyResult(Boolean.TRUE); 27411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 27421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case RESTART_ECM_TIMER: 27431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu long delayInMillis = SystemProperties.getLong( 27441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu TelephonyProperties.PROPERTY_ECM_EXIT_TIMER, DEFAULT_ECM_EXIT_TIMER_VALUE); 27451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu postDelayed(mExitEcmRunnable, delayInMillis); 27461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEcmTimerResetRegistrants.notifyResult(Boolean.FALSE); 27471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 27481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu default: 27491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, "handleTimerInEmergencyCallbackMode, unsupported action " + action); 27501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 27511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 27521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 27531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 27541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final String IS683A_FEATURE_CODE = "*228"; 27551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int IS683A_FEATURE_CODE_NUM_DIGITS = 4; 27561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int IS683A_SYS_SEL_CODE_NUM_DIGITS = 2; 27571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int IS683A_SYS_SEL_CODE_OFFSET = 4; 27581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 27591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int IS683_CONST_800MHZ_A_BAND = 0; 27601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int IS683_CONST_800MHZ_B_BAND = 1; 27611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int IS683_CONST_1900MHZ_A_BLOCK = 2; 27621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int IS683_CONST_1900MHZ_B_BLOCK = 3; 27631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int IS683_CONST_1900MHZ_C_BLOCK = 4; 27641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int IS683_CONST_1900MHZ_D_BLOCK = 5; 27651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int IS683_CONST_1900MHZ_E_BLOCK = 6; 27661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int IS683_CONST_1900MHZ_F_BLOCK = 7; 27671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final int INVALID_SYSTEM_SELECTION_CODE = -1; 27681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 27691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Define the pattern/format for carrier specified OTASP number schema. 27701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // It separates by comma and/or whitespace. 27711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static Pattern pOtaSpNumSchema = Pattern.compile("[,\\s]+"); 27721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 27731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 27741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static boolean isIs683OtaSpDialStr(String dialStr) { 27751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int sysSelCodeInt; 27761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean isOtaspDialString = false; 27771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int dialStrLen = dialStr.length(); 27781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 27791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dialStrLen == IS683A_FEATURE_CODE_NUM_DIGITS) { 27801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dialStr.equals(IS683A_FEATURE_CODE)) { 27811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isOtaspDialString = true; 27821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 27831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 27841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sysSelCodeInt = extractSelCodeFromOtaSpNum(dialStr); 27851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu switch (sysSelCodeInt) { 27861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case IS683_CONST_800MHZ_A_BAND: 27871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case IS683_CONST_800MHZ_B_BAND: 27881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case IS683_CONST_1900MHZ_A_BLOCK: 27891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case IS683_CONST_1900MHZ_B_BLOCK: 27901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case IS683_CONST_1900MHZ_C_BLOCK: 27911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case IS683_CONST_1900MHZ_D_BLOCK: 27921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case IS683_CONST_1900MHZ_E_BLOCK: 27931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case IS683_CONST_1900MHZ_F_BLOCK: 27941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isOtaspDialString = true; 27951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 27961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu default: 27971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 27981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 27991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 28001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return isOtaspDialString; 28011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 28021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 28031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 28041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 28051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * This function extracts the system selection code from the dial string. 28061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 28071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static int extractSelCodeFromOtaSpNum(String dialStr) { 28081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int dialStrLen = dialStr.length(); 28091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int sysSelCodeInt = INVALID_SYSTEM_SELECTION_CODE; 28101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 28111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((dialStr.regionMatches(0, IS683A_FEATURE_CODE, 28121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 0, IS683A_FEATURE_CODE_NUM_DIGITS)) && 28131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu (dialStrLen >= (IS683A_FEATURE_CODE_NUM_DIGITS + 28141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IS683A_SYS_SEL_CODE_NUM_DIGITS))) { 28151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Since we checked the condition above, the system selection code 28161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // extracted from dialStr will not cause any exception 28171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sysSelCodeInt = Integer.parseInt ( 28181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu dialStr.substring (IS683A_FEATURE_CODE_NUM_DIGITS, 28191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IS683A_FEATURE_CODE_NUM_DIGITS + IS683A_SYS_SEL_CODE_NUM_DIGITS)); 28201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 28211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) Rlog.d(LOG_TAG, "extractSelCodeFromOtaSpNum " + sysSelCodeInt); 28221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return sysSelCodeInt; 28231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 28241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 28251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 28261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 28271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * This function checks if the system selection code extracted from 28281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * the dial string "sysSelCodeInt' is the system selection code specified 28291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * in the carrier ota sp number schema "sch". 28301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 2831e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan private static boolean checkOtaSpNumBasedOnSysSelCode(int sysSelCodeInt, String sch[]) { 28321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean isOtaSpNum = false; 28331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 28341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Get how many number of system selection code ranges 28351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int selRc = Integer.parseInt(sch[1]); 28361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu for (int i = 0; i < selRc; i++) { 28371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!TextUtils.isEmpty(sch[i+2]) && !TextUtils.isEmpty(sch[i+3])) { 28381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int selMin = Integer.parseInt(sch[i+2]); 28391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int selMax = Integer.parseInt(sch[i+3]); 28401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Check if the selection code extracted from the dial string falls 28411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // within any of the range pairs specified in the schema. 28421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((sysSelCodeInt >= selMin) && (sysSelCodeInt <= selMax)) { 28431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isOtaSpNum = true; 28441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu break; 28451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 28461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 28471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 28481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (NumberFormatException ex) { 28491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If the carrier ota sp number schema is not correct, we still allow dial 28501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // and only log the error: 28511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, "checkOtaSpNumBasedOnSysSelCode, error", ex); 28521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 28531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return isOtaSpNum; 28541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 28551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 28561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 28571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 28581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * The following function checks if a dial string is a carrier specified 28591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * OTASP number or not by checking against the OTASP number schema stored 28601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * in PROPERTY_OTASP_NUM_SCHEMA. 28611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 28621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Currently, there are 2 schemas for carriers to specify the OTASP number: 28631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 1) Use system selection code: 28641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * The schema is: 28651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * SELC,the # of code pairs,min1,max1,min2,max2,... 28661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * e.g "SELC,3,10,20,30,40,60,70" indicates that there are 3 pairs of 28671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * selection codes, and they are {10,20}, {30,40} and {60,70} respectively. 28681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 28691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 2) Use feature code: 28701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * The schema is: 28711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * "FC,length of feature code,feature code". 28721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * e.g "FC,2,*2" indicates that the length of the feature code is 2, 28731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * and the code itself is "*2". 28741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 28751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean isCarrierOtaSpNum(String dialStr) { 28761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean isOtaSpNum = false; 28771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int sysSelCodeInt = extractSelCodeFromOtaSpNum(dialStr); 28781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (sysSelCodeInt == INVALID_SYSTEM_SELECTION_CODE) { 28791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return isOtaSpNum; 28801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 28811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // mCarrierOtaSpNumSchema is retrieved from PROPERTY_OTASP_NUM_SCHEMA: 28821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!TextUtils.isEmpty(mCarrierOtaSpNumSchema)) { 28831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Matcher m = pOtaSpNumSchema.matcher(mCarrierOtaSpNumSchema); 28841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 28851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, "isCarrierOtaSpNum,schema" + mCarrierOtaSpNumSchema); 28861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 28871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 28881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (m.find()) { 28891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String sch[] = pOtaSpNumSchema.split(mCarrierOtaSpNumSchema); 28901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If carrier uses system selection code mechanism 28911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!TextUtils.isEmpty(sch[0]) && sch[0].equals("SELC")) { 28921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (sysSelCodeInt!=INVALID_SYSTEM_SELECTION_CODE) { 28931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isOtaSpNum=checkOtaSpNumBasedOnSysSelCode(sysSelCodeInt,sch); 28941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 28951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 28961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, "isCarrierOtaSpNum,sysSelCodeInt is invalid"); 28971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 28981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 28991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (!TextUtils.isEmpty(sch[0]) && sch[0].equals("FC")) { 29001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int fcLen = Integer.parseInt(sch[1]); 29011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String fc = sch[2]; 29021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dialStr.regionMatches(0,fc,0,fcLen)) { 29031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isOtaSpNum = true; 29041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 29051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) Rlog.d(LOG_TAG, "isCarrierOtaSpNum,not otasp number"); 29061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 29081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 29091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, "isCarrierOtaSpNum,ota schema not supported" + sch[0]); 29101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 29131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) { 29141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, "isCarrierOtaSpNum,ota schema pattern not right" + 29151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCarrierOtaSpNumSchema); 29161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 29191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) Rlog.d(LOG_TAG, "isCarrierOtaSpNum,ota schema pattern empty"); 29201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return isOtaSpNum; 29221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 29241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 29251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * isOTASPNumber: checks a given number against the IS-683A OTASP dial string and carrier 29261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * OTASP dial string. 29271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 29281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @param dialStr the number to look up. 29291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @return true if the number is in IS-683A OTASP dial string or carrier OTASP dial string 29301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 29311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 29321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean isOtaSpNumber(String dialStr) { 29331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 29341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return super.isOtaSpNumber(dialStr); 29351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 29361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean isOtaSpNum = false; 29371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String dialableStr = PhoneNumberUtils.extractNetworkPortionAlt(dialStr); 29381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (dialableStr != null) { 29391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isOtaSpNum = isIs683OtaSpDialStr(dialableStr); 29401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isOtaSpNum == false) { 29411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isOtaSpNum = isCarrierOtaSpNum(dialableStr); 29421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) Rlog.d(LOG_TAG, "isOtaSpNumber " + isOtaSpNum); 29451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return isOtaSpNum; 29461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 29491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 29501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public int getCdmaEriIconIndex() { 29511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 29521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return super.getCdmaEriIconIndex(); 29531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 29541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return getServiceState().getCdmaEriIconIndex(); 29551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 29581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 29591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Returns the CDMA ERI icon mode, 29601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 0 - ON 29611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 1 - FLASHING 29621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 29631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 29641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public int getCdmaEriIconMode() { 29651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 29661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return super.getCdmaEriIconMode(); 29671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 29681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return getServiceState().getCdmaEriIconMode(); 29691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 29721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 29731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Returns the CDMA ERI text, 29741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 29751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 29761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String getCdmaEriText() { 29771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 29781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return super.getCdmaEriText(); 29791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 29801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int roamInd = getServiceState().getCdmaRoamingIndicator(); 29811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int defRoamInd = getServiceState().getCdmaDefaultRoamingIndicator(); 29821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mEriManager.getCdmaEriText(roamInd, defRoamInd); 29831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 29851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 29861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void phoneObjectUpdater(int newVoiceRadioTech) { 29871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("phoneObjectUpdater: newVoiceRadioTech=" + newVoiceRadioTech); 29881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 29891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Check for a voice over lte replacement 29901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((newVoiceRadioTech == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) 29911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || (newVoiceRadioTech == ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN)) { 29921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu CarrierConfigManager configMgr = (CarrierConfigManager) 29931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE); 29941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu PersistableBundle b = configMgr.getConfigForSubId(getSubId()); 29951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (b != null) { 29961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int volteReplacementRat = 29971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu b.getInt(CarrierConfigManager.KEY_VOLTE_REPLACEMENT_RAT_INT); 29981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("phoneObjectUpdater: volteReplacementRat=" + volteReplacementRat); 29991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (volteReplacementRat != ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) { 30001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu newVoiceRadioTech = volteReplacementRat; 30011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 30021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 30031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("phoneObjectUpdater: didn't get volteReplacementRat from carrier config"); 30041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 30051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 30061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 30071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if(mRilVersion == 6 && getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE) { 30081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /* 30091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * On v6 RIL, when LTE_ON_CDMA is TRUE, always create CDMALTEPhone 30101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * irrespective of the voice radio tech reported. 30111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 30121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) { 30131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("phoneObjectUpdater: LTE ON CDMA property is set. Use CDMA Phone" + 30141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " newVoiceRadioTech=" + newVoiceRadioTech + 30151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " mActivePhone=" + getPhoneName()); 30161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 30171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 30181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("phoneObjectUpdater: LTE ON CDMA property is set. Switch to CDMALTEPhone" + 30191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " newVoiceRadioTech=" + newVoiceRadioTech + 30201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " mActivePhone=" + getPhoneName()); 30211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu newVoiceRadioTech = ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT; 30221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 30231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 30241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 30251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If the device is shutting down, then there is no need to switch to the new phone 30261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // which might send unnecessary attach request to the modem. 30271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isShuttingDown()) { 30281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("Device is shutting down. No need to switch phone now."); 30291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 30301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 30311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 30321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean matchCdma = ServiceState.isCdma(newVoiceRadioTech); 30331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean matchGsm = ServiceState.isGsm(newVoiceRadioTech); 30341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if ((matchCdma && getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) || 30351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu (matchGsm && getPhoneType() == PhoneConstants.PHONE_TYPE_GSM)) { 30361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Nothing changed. Keep phone as it is. 30371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("phoneObjectUpdater: No change ignore," + 30381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " newVoiceRadioTech=" + newVoiceRadioTech + 30391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " mActivePhone=" + getPhoneName()); 30401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 30411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 30421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!matchCdma && !matchGsm) { 30431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("phoneObjectUpdater: newVoiceRadioTech=" + newVoiceRadioTech + 30441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " doesn't match either CDMA or GSM - error! No phone change"); 30451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 30461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 30471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 30481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 30491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (newVoiceRadioTech == ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) { 30501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // We need some voice phone object to be active always, so never 30511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // delete the phone without anything to replace it with! 30521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("phoneObjectUpdater: Unknown rat ignore, " 30531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + " newVoiceRadioTech=Unknown. mActivePhone=" + getPhoneName()); 30541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 30551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 30561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 30571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean oldPowerState = false; // old power state to off 30581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mResetModemOnRadioTechnologyChange) { 30591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mCi.getRadioState().isOn()) { 30601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu oldPowerState = true; 30611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("phoneObjectUpdater: Setting Radio Power to Off"); 30621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.setRadioPower(false, null); 30631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 30641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 30651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 30661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu switchVoiceRadioTech(newVoiceRadioTech); 30671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 30681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mResetModemOnRadioTechnologyChange && oldPowerState) { // restore power state 30691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("phoneObjectUpdater: Resetting Radio"); 30701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mCi.setRadioPower(oldPowerState, null); 30711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 30721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 30731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // update voice radio tech in icc card proxy 30741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIccCardProxy.setVoiceRadioTech(newVoiceRadioTech); 30751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 30761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Send an Intent to the PhoneApp that we had a radio technology change 30771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Intent intent = new Intent(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED); 30781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 30791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu intent.putExtra(PhoneConstants.PHONE_NAME_KEY, getPhoneName()); 30801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mPhoneId); 3081de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan ActivityManagerNative.broadcastStickyIntent(intent, null, UserHandle.USER_ALL); 30821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 30831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 30841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void switchVoiceRadioTech(int newVoiceRadioTech) { 30851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 30861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String outgoingPhoneName = getPhoneName(); 30871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 30881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("Switching Voice Phone : " + outgoingPhoneName + " >>> " 30891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + (ServiceState.isGsm(newVoiceRadioTech) ? "GSM" : "CDMA")); 30901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 30911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (ServiceState.isCdma(newVoiceRadioTech)) { 30921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu switchPhoneType(PhoneConstants.PHONE_TYPE_CDMA_LTE); 30931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (ServiceState.isGsm(newVoiceRadioTech)) { 30941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu switchPhoneType(PhoneConstants.PHONE_TYPE_GSM); 30951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 30961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("deleteAndCreatePhone: newVoiceRadioTech=" + newVoiceRadioTech + 30971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " is not CDMA or GSM (error) - aborting!"); 30981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return; 30991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 31021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 31031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public IccSmsInterfaceManager getIccSmsInterfaceManager(){ 31041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mIccSmsInterfaceManager; 31051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 31071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 31081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void updatePhoneObject(int voiceRadioTech) { 31091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("updatePhoneObject: radioTechnology=" + voiceRadioTech); 31101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu sendMessage(obtainMessage(EVENT_UPDATE_PHONE_OBJECT, voiceRadioTech, 0, null)); 31111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 31131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 31141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void setImsRegistrationState(boolean registered) { 31151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSST.setImsRegistrationState(registered); 31161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 31181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 31191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean getIccRecordsLoaded() { 31201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mIccCardProxy.getIccRecordsLoaded(); 31211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 31231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 31241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public IccCard getIccCard() { 31251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mIccCardProxy; 31261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 31281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 31291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 31301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println("GsmCdmaPhone extends:"); 31311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu super.dump(fd, pw, args); 31321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mPrecisePhoneType=" + mPrecisePhoneType); 31331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mCT=" + mCT); 31341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mSST=" + mSST); 31351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mPendingMMIs=" + mPendingMMIs); 31361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mIccPhoneBookIntManager=" + mIccPhoneBookIntManager); 31371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) pw.println(" mImei=" + mImei); 31381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) pw.println(" mImeiSv=" + mImeiSv); 31391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mVmNumber=" + mVmNumber); 31401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mCdmaSSM=" + mCdmaSSM); 31411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mCdmaSubscriptionSource=" + mCdmaSubscriptionSource); 31421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mEriManager=" + mEriManager); 31431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mWakeLock=" + mWakeLock); 31441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mIsPhoneInEcmState=" + mIsPhoneInEcmState); 31451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) pw.println(" mEsn=" + mEsn); 31461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (VDBG) pw.println(" mMeid=" + mMeid); 31471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" mCarrierOtaSpNumSchema=" + mCarrierOtaSpNumSchema); 31481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isPhoneTypeGsm()) { 31491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" getCdmaEriIconIndex()=" + getCdmaEriIconIndex()); 31501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" getCdmaEriIconMode()=" + getCdmaEriIconMode()); 31511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" getCdmaEriText()=" + getCdmaEriText()); 31521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" isMinInfoReady()=" + isMinInfoReady()); 31531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println(" isCspPlmnEnabled()=" + isCspPlmnEnabled()); 31551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.flush(); 31561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println("++++++++++++++++++++++++++++++++"); 31571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 31581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu try { 31591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mIccCardProxy.dump(fd, pw, args); 31601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } catch (Exception e) { 31611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu e.printStackTrace(); 31621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.flush(); 31641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu pw.println("++++++++++++++++++++++++++++++++"); 31651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 31671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 31681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean setOperatorBrandOverride(String brand) { 31691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mUiccController == null) { 31701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 31711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 31731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu UiccCard card = mUiccController.getUiccCard(getPhoneId()); 31741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (card == null) { 31751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 31761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 31781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean status = card.setOperatorBrandOverride(brand); 31791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 31801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Refresh. 31811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (status) { 31821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords iccRecords = mIccRecords.get(); 31831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (iccRecords != null) { 31841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu TelephonyManager.from(mContext).setSimOperatorNameForPhone( 31851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu getPhoneId(), iccRecords.getServiceProviderName()); 31861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mSST != null) { 31881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mSST.pollState(); 31891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return status; 31921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 31931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 31941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 31951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @return operator numeric. 31961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 31971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private String getOperatorNumeric() { 31981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu String operatorNumeric = null; 31991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 32001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 32011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (r != null) { 32021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu operatorNumeric = r.getOperatorNumeric(); 32031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3204dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan } else { //isPhoneTypeCdmaLte() 32051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords curIccRecords = null; 32061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mCdmaSubscriptionSource == CDMA_SUBSCRIPTION_NV) { 32071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu operatorNumeric = SystemProperties.get("ro.cdma.home.operator.numeric"); 32081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (mCdmaSubscriptionSource == CDMA_SUBSCRIPTION_RUIM_SIM) { 32091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu curIccRecords = mSimRecords; 32101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (curIccRecords != null) { 32111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu operatorNumeric = curIccRecords.getOperatorNumeric(); 32121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 32131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu curIccRecords = mIccRecords.get(); 32141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (curIccRecords != null && (curIccRecords instanceof RuimRecords)) { 32151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu RuimRecords csim = (RuimRecords) curIccRecords; 32161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu operatorNumeric = csim.getRUIMOperatorNumeric(); 32171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (operatorNumeric == null) { 32211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu loge("getOperatorNumeric: Cannot retrieve operatorNumeric:" 32221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + " mCdmaSubscriptionSource = " + mCdmaSubscriptionSource + 32231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu " mIccRecords = " + ((curIccRecords != null) ? 32241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu curIccRecords.getRecordsLoaded() : null)); 32251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 32271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("getOperatorNumeric: mCdmaSubscriptionSource = " + mCdmaSubscriptionSource 32281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + " operatorNumeric = " + operatorNumeric); 32291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 32301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return operatorNumeric; 32321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 32341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void notifyEcbmTimerReset(Boolean flag) { 32351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEcmTimerResetRegistrants.notifyResult(flag); 32361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 32381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 32391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Registration point for Ecm timer reset 32401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 32411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @param h handler to notify 32421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @param what User-defined message code 32431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @param obj placed in Message.obj 32441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 32451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 32461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void registerForEcmTimerReset(Handler h, int what, Object obj) { 32471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEcmTimerResetRegistrants.addUnique(h, what, obj); 32481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 32501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 32511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void unregisterForEcmTimerReset(Handler h) { 32521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mEcmTimerResetRegistrants.remove(h); 32531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 32551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 32561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Sets the SIM voice message waiting indicator records. 32571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @param line GSM Subscriber Profile Number, one-based. Only '1' is supported 32581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * @param countWaiting The number of messages waiting, if known. Use 32591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * -1 to indicate that an unknown number of 32601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * messages are waiting 32611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 32621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 32631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void setVoiceMessageWaiting(int line, int countWaiting) { 32641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 32651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu IccRecords r = mIccRecords.get(); 32661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (r != null) { 32671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu r.setVoiceMessageWaiting(line, countWaiting); 32681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 32691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("SIM Records not found, MWI not updated"); 32701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 32721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setVoiceMessageCount(countWaiting); 32731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3276e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan private void logd(String s) { 32771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, "[GsmCdmaPhone] " + s); 32781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3280e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan private void loge(String s) { 32811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, "[GsmCdmaPhone] " + s); 32821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 3284e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan @Override 32851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public boolean isUtEnabled() { 3286c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan Phone imsPhone = mImsPhone; 32871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (imsPhone != null) { 32881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return imsPhone.isUtEnabled(); 32891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 32901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu logd("isUtEnabled: called for GsmCdma"); 32911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return false; 32921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 32931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 3294dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan 3295dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan public String getDtmfToneDelayKey() { 3296dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan return isPhoneTypeGsm() ? 3297dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan CarrierConfigManager.KEY_GSM_DTMF_TONE_DELAY_INT : 3298dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan CarrierConfigManager.KEY_CDMA_DTMF_TONE_DELAY_INT; 3299dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan } 3300de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan 3301de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan @VisibleForTesting 3302de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan public PowerManager.WakeLock getWakeLock() { 3303de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan return mWakeLock; 3304de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan } 3305de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan 33061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu} 3307