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