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