GsmCdmaCallTracker.java revision 1a87ab3d7170d618f048c4f5af8c7504a587aaa5
10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
21a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Copyright (C) 2015 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
171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yupackage com.android.internal.telephony;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.content.BroadcastReceiver;
20e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wuimport android.content.Context;
211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.content.Intent;
221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.content.IntentFilter;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult;
241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.os.Bundle;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Registrant;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RegistrantList;
291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.os.SystemProperties;
301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telephony.CellLocation;
31b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensenimport android.telephony.DisconnectCause;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.PhoneNumberUtils;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState;
34e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wuimport android.telephony.TelephonyManager;
351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telephony.cdma.CdmaCellLocation;
361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telephony.gsm.GsmCellLocation;
372d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Yingimport android.text.TextUtils;
381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.Iterator;
391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telephony.Rlog;
401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.util.EventLog;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.cdma.CdmaCallWaitingNotification;
431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.EventLogTags;
4469e989aceb5660b39932049daad2299f75f07201Libin.Tang@motorola.comimport com.android.internal.telephony.imsphone.ImsPhone;
45de2242679c927ed9c46fa42f40162b113e337112Omkar Kolangadeimport com.android.internal.telephony.imsphone.ImsPhoneConnection;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor;
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter;
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List;
501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport java.util.ArrayList;
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yupublic class GsmCdmaCallTracker extends CallTracker {
561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    static final String LOG_TAG = "GsmCdmaCallTracker";
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final boolean REPEAT_POLLING = false;
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final boolean DBG_POLL = false;
601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private static final boolean VDBG = false;
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Constants
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    static final int MAX_CONNECTIONS_GSM = 19;   // 7 allowed in GSM + 12 from IMS for SRVCC
651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    static final int MAX_CONNECTIONS_PER_CALL_GSM = 5; // only 5 connections allowed per call
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    static final int MAX_CONNECTIONS_CDMA = 8;
681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    static final int MAX_CONNECTIONS_PER_CALL_CDMA = 1; // only 1 connection allowed per call
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //***** Instance Variables
711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    GsmCdmaConnection mConnections[];
7222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    RegistrantList mVoiceCallEndedRegistrants = new RegistrantList();
7322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    RegistrantList mVoiceCallStartedRegistrants = new RegistrantList();
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // connections dropped during last poll
761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    ArrayList<GsmCdmaConnection> mDroppedDuringPoll
771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        = new ArrayList<GsmCdmaConnection>(MAX_CONNECTIONS_GSM);
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    public GsmCdmaCall mRingingCall = new GsmCdmaCall(this);
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // A call that is ringing or (call) waiting
811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    public GsmCdmaCall mForegroundCall = new GsmCdmaCall(this);
821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    public GsmCdmaCall mBackgroundCall = new GsmCdmaCall(this);
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    GsmCdmaConnection mPendingMO;
8522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    boolean mHangupPendingMO;
861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    GsmCdmaPhone mPhone;
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    boolean mDesiredMute = false;    // false = mute off
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    public PhoneConstants.State mState = PhoneConstants.State.IDLE;
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    Call.SrvccState mSrvccState = Call.SrvccState.NONE;
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    // Following member variables are for CDMA only
961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    RegistrantList mCallWaitingRegistrants = new RegistrantList();
971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    boolean mPendingCallInEcm;
981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    boolean mIsInEmergencyCall;
991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    int mPendingCallClirMode;
1001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private boolean mIsEcmTimerCanceled;
1011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private int m3WayCallFlashDelay;
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    /**
1041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu     * Listens for Emergency Callback Mode state change intents
1051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu     */
1061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private BroadcastReceiver mEcmExitReceiver = new BroadcastReceiver() {
1071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        @Override
1081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        public void onReceive(Context context, Intent intent) {
1091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            if (intent.getAction().equals(
1101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED)) {
1111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
1121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                boolean isInEcm = intent.getBooleanExtra(PhoneConstants.PHONE_IN_ECM_STATE, false);
1131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                log("Received ACTION_EMERGENCY_CALLBACK_MODE_CHANGED isInEcm = " + isInEcm);
1141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
1151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                // If we exit ECM mode, notify all connections.
1161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                if (!isInEcm) {
1171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // Although mConnections seems to be the place to look, it is not guaranteed
1181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // to have all of the connections we're tracking.  THe best place to look is in
1191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // the Call objects associated with the tracker.
1201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    List<Connection> toNotify = new ArrayList<Connection>();
1211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    toNotify.addAll(mRingingCall.getConnections());
1221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    toNotify.addAll(mForegroundCall.getConnections());
1231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    toNotify.addAll(mBackgroundCall.getConnections());
1241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    if (mPendingMO != null) {
1251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        toNotify.add(mPendingMO);
1261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    }
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // Notify connections that ECM mode exited.
1291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    for (Connection connection : toNotify) {
1301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        if (connection != null) {
1311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            connection.onExitedEcmMode();
1321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        }
1331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    }
1341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                }
1351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            }
1361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
1371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    };
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Events
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Constructors
1431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
1441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    GsmCdmaCallTracker (GsmCdmaPhone phone) {
1451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        this.mPhone = phone;
14622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi = phone.mCi;
14722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForCallStateChanged(this, EVENT_CALL_STATE_CHANGE, null);
14822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForOn(this, EVENT_RADIO_AVAILABLE, null);
14922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForNotAvailable(this, EVENT_RADIO_NOT_AVAILABLE, null);
1501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        updatePhoneType();
1511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    }
1521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
1531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    void updatePhoneType() {
1541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (mPhone.isPhoneTypeGsm()) {
1551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mConnections = new GsmCdmaConnection[MAX_CONNECTIONS_GSM];
1561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mPhone.getContext().unregisterReceiver(mEcmExitReceiver);
1571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        } else {
1581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mConnections = new GsmCdmaConnection[MAX_CONNECTIONS_CDMA];
1591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mPendingCallInEcm = false;
1601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mIsInEmergencyCall = false;
1611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mPendingCallClirMode = CommandsInterface.CLIR_DEFAULT;
1621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mIsEcmTimerCanceled = false;
1631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            m3WayCallFlashDelay = 0;
1641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mCi.registerForCallWaitingInfo(this, EVENT_CALL_WAITING_INFO_CDMA, null);
1651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mForegroundCall.setGeneric(false);
1661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
1671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // Register receiver for ECM exit
1681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            IntentFilter filter = new IntentFilter();
1691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            filter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED);
1701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mPhone.getContext().registerReceiver(mEcmExitReceiver, filter);
1711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dispose() {
1751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        Rlog.d(LOG_TAG, "GsmCdmaCallTracker dispose");
1761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        //Unregister for all events
17722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForCallStateChanged(this);
17822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForOn(this);
17922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForNotAvailable(this);
1801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
1811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        //CDMA
1821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        mCi.unregisterForLineControlInfo(this);
18322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForCallWaitingInfo(this);
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        clearDisconnected();
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        for (GsmCdmaConnection gsmCdmaConnection : mConnections) {
1881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            if (gsmCdmaConnection != null) {
1891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                gsmCdmaConnection.dispose();
1908f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan            }
1918f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan        }
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void finalize() {
1961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        Rlog.d(LOG_TAG, "GsmCdmaCallTracker finalized");
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Instance Methods
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Public Methods
202cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForVoiceCallStarted(Handler h, int what, Object obj) {
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Registrant r = new Registrant(h, what, obj);
20522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceCallStartedRegistrants.add(r);
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Notify if in call when registering
20722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mState != PhoneConstants.State.IDLE) {
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            r.notifyRegistrant(new AsyncResult(null, null, null));
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
212cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForVoiceCallStarted(Handler h) {
21422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceCallStartedRegistrants.remove(h);
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
217cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForVoiceCallEnded(Handler h, int what, Object obj) {
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Registrant r = new Registrant(h, what, obj);
22022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceCallEndedRegistrants.add(r);
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
223cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForVoiceCallEnded(Handler h) {
22522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceCallEndedRegistrants.remove(h);
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForCallWaiting(Handler h, int what, Object obj) {
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Registrant r = new Registrant (h, what, obj);
23022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCallWaitingRegistrants.add(r);
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForCallWaiting(Handler h) {
23422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCallWaitingRegistrants.remove(h);
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private void
2381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    fakeHoldForegroundBeforeDial() {
2391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        List<Connection> connCopy;
2401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
2411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // We need to make a copy here, since fakeHoldBeforeDial()
2421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // modifies the lists, and we don't want to reverse the order
2431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        connCopy = (List<Connection>) mForegroundCall.mConnections.clone();
2441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
2451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        for (int i = 0, s = connCopy.size() ; i < s ; i++) {
2461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            GsmCdmaConnection conn = (GsmCdmaConnection)connCopy.get(i);
2471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
2481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            conn.fakeHoldBeforeDial();
2491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
2501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    }
2511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
2521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //GSM
2531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    /**
2541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu     * clirMode is one of the CLIR_ constants
2551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu     */
2561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    synchronized Connection
2571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    dial (String dialString, int clirMode, UUSInfo uusInfo, Bundle intentExtras)
2581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            throws CallStateException {
2591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // note that this triggers call state changed notif
2601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        clearDisconnected();
2611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
2621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (!canDial()) {
2631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            throw new CallStateException("cannot dial in current state");
2641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
2651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
2661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        String origNumber = dialString;
2671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        dialString = convertNumberIfNecessary(mPhone, dialString);
2681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
2691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // The new call must be assigned to the foreground call.
2701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // That call must be idle, so place anything that's
2711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // there on hold
2721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (mForegroundCall.getState() == GsmCdmaCall.State.ACTIVE) {
2731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // this will probably be done by the radio anyway
2741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // but the dial might fail before this happens
2751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // and we need to make sure the foreground call is clear
2761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // for the newly dialed connection
2771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            switchWaitingOrHoldingAndActive();
2781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // This is a hack to delay DIAL so that it is sent out to RIL only after
2791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // EVENT_SWITCH_RESULT is received. We've seen failures when adding a new call to
2801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // multi-way conference calls due to DIAL being sent out before SWITCH is processed
2811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            try {
2821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                Thread.sleep(500);
2831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            } catch (InterruptedException e) {
2841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                // do nothing
2851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            }
2861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
2871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // Fake local state so that
2881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // a) foregroundCall is empty for the newly dialed connection
2891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // b) hasNonHangupStateChanged remains false in the
2901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // next poll, so that we don't clear a failed dialing call
2911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            fakeHoldForegroundBeforeDial();
2921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
2931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
2941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (mForegroundCall.getState() != GsmCdmaCall.State.IDLE) {
2951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            //we should have failed in !canDial() above before we get here
2961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            throw new CallStateException("cannot dial in current state");
2971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
2981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
2991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        mPendingMO = new GsmCdmaConnection(mPhone, checkForTestEmergencyNumber(dialString),
3001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                this, mForegroundCall);
3011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        mHangupPendingMO = false;
3021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
3031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if ( mPendingMO.getAddress() == null || mPendingMO.getAddress().length() == 0
3041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                || mPendingMO.getAddress().indexOf(PhoneNumberUtils.WILD) >= 0) {
3051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // Phone number is invalid
3061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mPendingMO.mCause = DisconnectCause.INVALID_NUMBER;
3071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
3081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // handlePollCalls() will notice this call not present
3091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // and will mark it as dropped.
3101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            pollCallsWhenSafe();
3111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        } else {
3121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // Always unmute when initiating a new call
3131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            setMute(false);
3141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
3151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mCi.dial(mPendingMO.getAddress(), clirMode, uusInfo, obtainCompleteMessage());
3161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
3171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
3181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (mNumberConverted) {
3191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mPendingMO.setConverted(origNumber);
3201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mNumberConverted = false;
3211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
3221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
3231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        updatePhoneState();
3241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        mPhone.notifyPreciseCallStateChanged();
3251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
3261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        return mPendingMO;
3271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    }
3281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
3291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //CDMA
3301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    /**
3311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu     * Handle Ecm timer to be canceled or re-started
3321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu     */
3331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private void handleEcmTimer(int action) {
3341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        mPhone.handleTimerInEmergencyCallbackMode(action);
3351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        switch(action) {
3361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            case GsmCdmaPhone.CANCEL_ECM_TIMER: mIsEcmTimerCanceled = true; break;
3371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            case GsmCdmaPhone.RESTART_ECM_TIMER: mIsEcmTimerCanceled = false; break;
3381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            default:
3391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                Rlog.e(LOG_TAG, "handleEcmTimer, unsupported action " + action);
3401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
3411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    }
3421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
3431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //CDMA
3441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    /**
3451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu     * Disable data call when emergency call is connected
3461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu     */
3471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private void disableDataCallInEmergencyCall(String dialString) {
3481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (PhoneNumberUtils.isLocalEmergencyNumber(mPhone.getContext(), dialString)) {
3491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            if (Phone.DEBUG_PHONE) log("disableDataCallInEmergencyCall");
3501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            setIsInEmergencyCall();
3511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
3521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    }
3531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
3541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //CDMA
3551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    protected void setIsInEmergencyCall() {
3561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        mIsInEmergencyCall = true;
3571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        mPhone.mDcTracker.setInternalDataEnabled(false);
3581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        mPhone.notifyEmergencyCallRegistrants(true);
3591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    }
3601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
3611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //CDMA
3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * clirMode is one of the CLIR_ constants
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Connection
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    dial (String dialString, int clirMode) throws CallStateException {
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // note that this triggers call state changed notif
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        clearDisconnected();
3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!canDial()) {
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("cannot dial in current state");
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
374e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu        TelephonyManager tm =
375e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu                (TelephonyManager) mPhone.getContext().getSystemService(Context.TELEPHONY_SERVICE);
3762d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        String origNumber = dialString;
377e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu        String operatorIsoContry = tm.getNetworkCountryIsoForPhone(mPhone.getPhoneId());
378e70617d81dcd42350a737b11c25532e1d43df4ffLegler Wu        String simIsoContry = tm.getSimCountryIsoForPhone(mPhone.getPhoneId());
3792d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        boolean internationalRoaming = !TextUtils.isEmpty(operatorIsoContry)
3802d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying                && !TextUtils.isEmpty(simIsoContry)
3812d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying                && !simIsoContry.equals(operatorIsoContry);
3822d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        if (internationalRoaming) {
3832d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying            if ("us".equals(simIsoContry)) {
3842d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying                internationalRoaming = internationalRoaming && !"vi".equals(operatorIsoContry);
3852d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying            } else if ("vi".equals(simIsoContry)) {
3862d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying                internationalRoaming = internationalRoaming && !"us".equals(operatorIsoContry);
3872d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying            }
3882d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        }
3892d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        if (internationalRoaming) {
3902d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying            dialString = convertNumberIfNecessary(mPhone, dialString);
3912d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        }
3922d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean isPhoneInEcmMode = inEcm.equals("true");
3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean isEmergencyCall =
396f4f5308a309d43fcfca8d0d5fbb54bc38c82ca3fYorke Lee                PhoneNumberUtils.isLocalEmergencyNumber(mPhone.getContext(), dialString);
3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Cancel Ecm timer if a second emergency call is originating in Ecm mode
3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (isPhoneInEcmMode && isEmergencyCall) {
4001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            handleEcmTimer(GsmCdmaPhone.CANCEL_ECM_TIMER);
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // We are initiating a call therefore even if we previously
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // didn't know the state (i.e. Generic was true) we now know
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // and therefore can set Generic to false.
40622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mForegroundCall.setGeneric(false);
4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // The new call must be assigned to the foreground call.
4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // That call must be idle, so place anything that's
4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // there on hold
4111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (mForegroundCall.getState() == GsmCdmaCall.State.ACTIVE) {
4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return dialThreeWay(dialString);
4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        mPendingMO = new GsmCdmaConnection(mPhone, checkForTestEmergencyNumber(dialString),
41622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                this, mForegroundCall);
41722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mHangupPendingMO = false;
4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
419e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        if ( mPendingMO.getAddress() == null || mPendingMO.getAddress().length() == 0
420e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                || mPendingMO.getAddress().indexOf(PhoneNumberUtils.WILD) >= 0 ) {
4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Phone number is invalid
422b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen            mPendingMO.mCause = DisconnectCause.INVALID_NUMBER;
4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // handlePollCalls() will notice this call not present
4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // and will mark it as dropped.
4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollCallsWhenSafe();
4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Always unmute when initiating a new call
4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setMute(false);
4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Check data call
4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            disableDataCallInEmergencyCall(dialString);
4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // In Ecm mode, if another emergency call is dialed, Ecm mode will not exit.
4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if(!isPhoneInEcmMode || (isPhoneInEcmMode && isEmergencyCall)) {
436e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                mCi.dial(mPendingMO.getAddress(), clirMode, obtainCompleteMessage());
4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
43822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.exitEmergencyCallbackMode();
43922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.setOnEcbModeExitResponse(this,EVENT_EXIT_ECM_RESPONSE_CDMA, null);
44022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPendingCallClirMode=clirMode;
44122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPendingCallInEcm=true;
4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4452d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        if (mNumberConverted) {
4462d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying            mPendingMO.setConverted(origNumber);
4472d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying            mNumberConverted = false;
4482d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying        }
4492d265969ca301ba3720458ea9da2ec8d6a18bb8dXia Ying
4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        updatePhoneState();
45122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.notifyPreciseCallStateChanged();
4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
45322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mPendingMO;
4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //CDMA
4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Connection
4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    dialThreeWay (String dialString) {
45922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (!mForegroundCall.isIdle()) {
4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Check data call
4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            disableDataCallInEmergencyCall(dialString);
4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Attach the new connection to foregroundCall
4641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mPendingMO = new GsmCdmaConnection(mPhone,
4651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    checkForTestEmergencyNumber(dialString), this, mForegroundCall);
466bb097a7ba08252c516e578ce30cdb658b63d7c9bJing Zhao            // Some network need a empty flash before sending the normal one
467bb097a7ba08252c516e578ce30cdb658b63d7c9bJing Zhao            m3WayCallFlashDelay = mPhone.getContext().getResources()
468bb097a7ba08252c516e578ce30cdb658b63d7c9bJing Zhao                    .getInteger(com.android.internal.R.integer.config_cdma_3waycall_flash_delay);
469bb097a7ba08252c516e578ce30cdb658b63d7c9bJing Zhao            if (m3WayCallFlashDelay > 0) {
470bb097a7ba08252c516e578ce30cdb658b63d7c9bJing Zhao                mCi.sendCDMAFeatureCode("", obtainMessage(EVENT_THREE_WAY_DIAL_BLANK_FLASH));
471bb097a7ba08252c516e578ce30cdb658b63d7c9bJing Zhao            } else {
472bb097a7ba08252c516e578ce30cdb658b63d7c9bJing Zhao                mCi.sendCDMAFeatureCode(mPendingMO.getAddress(),
473bb097a7ba08252c516e578ce30cdb658b63d7c9bJing Zhao                        obtainMessage(EVENT_THREE_WAY_DIAL_L2_RESULT_CDMA));
474bb097a7ba08252c516e578ce30cdb658b63d7c9bJing Zhao            }
47522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            return mPendingMO;
4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    Connection
4811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    dial(String dialString) throws CallStateException {
4821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (isPhoneTypeGsm()) {
4831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            return dial(dialString, CommandsInterface.CLIR_DEFAULT, null);
4841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        } else {
4851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            return dial(dialString, CommandsInterface.CLIR_DEFAULT);
4861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
4871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    }
4881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
4891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //GSM
4901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    Connection
4911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    dial(String dialString, UUSInfo uusInfo, Bundle intentExtras) throws CallStateException {
4921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        return dial(dialString, CommandsInterface.CLIR_DEFAULT, uusInfo, intentExtras);
4931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    }
4941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
4951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //GSM
4961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    Connection
4971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    dial(String dialString, int clirMode, Bundle intentExtras) throws CallStateException {
4981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        return dial(dialString, clirMode, null, intentExtras);
4991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    }
5001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
5021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    acceptCall () throws CallStateException {
5031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // FIXME if SWITCH fails, should retry with ANSWER
5041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // in case the active/holding call disappeared and this
5051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // is no longer call waiting
5061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
5071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (mRingingCall.getState() == GsmCdmaCall.State.INCOMING) {
508ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.i("phone", "acceptCall: incoming...");
5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Always unmute when answering a new call
5100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setMute(false);
51122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.acceptCall(obtainCompleteMessage());
5121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        } else if (mRingingCall.getState() == GsmCdmaCall.State.WAITING) {
5131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            if (isPhoneTypeGsm()) {
5141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                setMute(false);
5151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            } else {
5161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                GsmCdmaConnection cwConn = (GsmCdmaConnection)(mRingingCall.getLatestConnection());
5171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
5181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                // Since there is no network response for supplimentary
5191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                // service for CDMA, we assume call waiting is answered.
5201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                // ringing Call state change to idle is in GsmCdmaCall.detach
5211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                // triggered by updateParent.
5221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                cwConn.updateParent(mRingingCall, mForegroundCall);
5231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                cwConn.onConnectedInOrOut();
5241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                updatePhoneState();
5251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            }
5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            switchWaitingOrHoldingAndActive();
5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("phone not ringing");
5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    rejectCall () throws CallStateException {
5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // AT+CHLD=0 means "release held or UDUB"
5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // so if the phone isn't ringing, this could hang up held
53622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRingingCall.getState().isRinging()) {
53722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.rejectCall(obtainCompleteMessage());
5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("phone not ringing");
5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //CDMA
5441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private void flashAndSetGenericTrue() {
5451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        mCi.sendCDMAFeatureCode("", obtainMessage(EVENT_SWITCH_RESULT));
5461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
5471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // Set generic to true because in CDMA it is not known what
5481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // the status of the call is after a call waiting is answered,
5491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // 3 way call merged or a switch between calls.
5501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        mForegroundCall.setGeneric(true);
5511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        mPhone.notifyPreciseCallStateChanged();
5521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    }
5531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    switchWaitingOrHoldingAndActive() throws CallStateException {
5560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Should we bother with this check?
5571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (mRingingCall.getState() == GsmCdmaCall.State.INCOMING) {
5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("cannot be in the incoming state");
5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
5601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            if (isPhoneTypeGsm()) {
5611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                mCi.switchWaitingOrHoldingAndActive(
5621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        obtainCompleteMessage(EVENT_SWITCH_RESULT));
5631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            } else {
5641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                if (mForegroundCall.getConnections().size() > 1) {
5651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    flashAndSetGenericTrue();
5661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                } else {
5671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // Send a flash command to CDMA network for putting the other party on hold.
5681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // For CDMA networks which do not support this the user would just hear a beep
5691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // from the network. For CDMA networks which do support it will put the other
5701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // party on hold.
5711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    mCi.sendCDMAFeatureCode("", obtainMessage(EVENT_SWITCH_RESULT));
5721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                }
5731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            }
5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
578cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    conference() {
5791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (isPhoneTypeGsm()) {
5801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mCi.conference(obtainCompleteMessage(EVENT_CONFERENCE_RESULT));
5811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        } else {
5821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // Should we be checking state?
5831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            flashAndSetGenericTrue();
5841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
5850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
588cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    explicitCallTransfer() {
58922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.explicitCallTransfer(obtainCompleteMessage(EVENT_ECT_RESULT));
5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    clearDisconnected() {
5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        internalClearDisconnected();
5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        updatePhoneState();
59722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.notifyPreciseCallStateChanged();
5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean
6010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    canConference() {
6021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        return mForegroundCall.getState() == GsmCdmaCall.State.ACTIVE
6031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                && mBackgroundCall.getState() == GsmCdmaCall.State.HOLDING
60422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && !mBackgroundCall.isFull()
60522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && !mForegroundCall.isFull();
6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean
6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    canDial() {
6100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean ret;
61122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        int serviceState = mPhone.getServiceState().getState();
6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String disableCall = SystemProperties.get(
6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                TelephonyProperties.PROPERTY_DISABLE_CALL, "false");
6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ret = (serviceState != ServiceState.STATE_POWER_OFF)
61622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && mPendingMO == null
61722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && !mRingingCall.isRinging()
6180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                && !disableCall.equals("true")
61922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && (!mForegroundCall.getState().isAlive()
6201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    || !mBackgroundCall.getState().isAlive()
6211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    || (!isPhoneTypeGsm()
6221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        && mForegroundCall.getState() == GsmCdmaCall.State.ACTIVE));
6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!ret) {
6250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log(String.format("canDial is false\n" +
6261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            "((serviceState=%d) != ServiceState.STATE_POWER_OFF)::=%s\n" +
6271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            "&& pendingMO == null::=%s\n" +
6281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            "&& !ringingCall.isRinging()::=%s\n" +
6291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            "&& !disableCall.equals(\"true\")::=%s\n" +
6301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            "&& (!foregroundCall.getState().isAlive()::=%s\n" +
6311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            "   || foregroundCall.getState() == GsmCdmaCall.State.ACTIVE::=%s\n" +
6321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            "   ||!backgroundCall.getState().isAlive())::=%s)",
6330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    serviceState,
6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    serviceState != ServiceState.STATE_POWER_OFF,
63522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO == null,
63622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    !mRingingCall.isRinging(),
6370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    !disableCall.equals("true"),
63822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    !mForegroundCall.getState().isAlive(),
6391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    mForegroundCall.getState() == GsmCdmaCall.State.ACTIVE,
64022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    !mBackgroundCall.getState().isAlive()));
6410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ret;
6440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean
6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    canTransfer() {
6481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (isPhoneTypeGsm()) {
6491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            return (mForegroundCall.getState() == GsmCdmaCall.State.ACTIVE
6501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    || mForegroundCall.getState() == GsmCdmaCall.State.ALERTING
6511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    || mForegroundCall.getState() == GsmCdmaCall.State.DIALING)
6521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    && mBackgroundCall.getState() == GsmCdmaCall.State.HOLDING;
6531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        } else {
6541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            Rlog.e(LOG_TAG, "canTransfer: not possible in CDMA");
6551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            return false;
6561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Private Instance Methods
6600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void
6620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    internalClearDisconnected() {
66322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRingingCall.clearDisconnected();
66422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mForegroundCall.clearDisconnected();
66522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mBackgroundCall.clearDisconnected();
6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Obtain a message to use for signalling "invoke getCurrentCalls() when
6700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * this operation and all other pending operations are complete
6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Message
6730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    obtainCompleteMessage() {
6740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return obtainCompleteMessage(EVENT_OPERATION_COMPLETE);
6750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Obtain a message to use for signalling "invoke getCurrentCalls() when
6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * this operation and all other pending operations are complete
6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
6810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Message
6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    obtainCompleteMessage(int what) {
68322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPendingOperations++;
68422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mLastRelevantPoll = null;
68522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mNeedsPoll = true;
6860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG_POLL) log("obtainCompleteMessage: pendingOperations=" +
68822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPendingOperations + ", needsPoll=" + mNeedsPoll);
6890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return obtainMessage(what);
6910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
6920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void
6940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    operationComplete() {
69522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPendingOperations--;
6960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG_POLL) log("operationComplete: pendingOperations=" +
69822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPendingOperations + ", needsPoll=" + mNeedsPoll);
6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
70022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mPendingOperations == 0 && mNeedsPoll) {
70122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mLastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT);
70222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.getCurrentCalls(mLastRelevantPoll);
70322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mPendingOperations < 0) {
7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // this should never happen
7051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            Rlog.e(LOG_TAG,"GsmCdmaCallTracker.pendingOperations < 0");
70622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPendingOperations = 0;
7070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void
7110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    updatePhoneState() {
71222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        PhoneConstants.State oldState = mState;
71322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRingingCall.isRinging()) {
71422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mState = PhoneConstants.State.RINGING;
71522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mPendingMO != null ||
71622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                !(mForegroundCall.isIdle() && mBackgroundCall.isIdle())) {
71722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mState = PhoneConstants.State.OFFHOOK;
7180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
71969e989aceb5660b39932049daad2299f75f07201Libin.Tang@motorola.com            ImsPhone imsPhone = (ImsPhone)mPhone.getImsPhone();
72069e989aceb5660b39932049daad2299f75f07201Libin.Tang@motorola.com            if ( mState == PhoneConstants.State.OFFHOOK && (imsPhone != null)){
72169e989aceb5660b39932049daad2299f75f07201Libin.Tang@motorola.com                imsPhone.callEndCleanupHandOverCallIfAny();
72269e989aceb5660b39932049daad2299f75f07201Libin.Tang@motorola.com            }
72322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mState = PhoneConstants.State.IDLE;
7240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
72622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mState == PhoneConstants.State.IDLE && oldState != mState) {
72722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mVoiceCallEndedRegistrants.notifyRegistrants(
7280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                new AsyncResult(null, null, null));
72922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (oldState == PhoneConstants.State.IDLE && oldState != mState) {
73022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mVoiceCallStartedRegistrants.notifyRegistrants (
7310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    new AsyncResult(null, null, null));
7320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (Phone.DEBUG_PHONE) {
73422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            log("update phone state, old=" + oldState + " new="+ mState);
7350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
73622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mState != oldState) {
73722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyPhoneStateChanged();
7380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // ***** Overwritten from CallTracker
7420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
743cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
7441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    protected synchronized void
7450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    handlePollCalls(AsyncResult ar) {
7460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        List polledCalls;
7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (VDBG) log("handlePollCalls");
7490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (ar.exception == null) {
7500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            polledCalls = (List)ar.result;
7510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (isCommandExceptionRadioNotAvailable(ar.exception)) {
7520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // just a dummy empty ArrayList to cause the loop
7530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // to hang up all the calls
7540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            polledCalls = new ArrayList();
7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Radio probably wasn't ready--try again in a bit
7570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // But don't keep polling if the channel is closed
7580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollCallsAfterDelay();
7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
7600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Connection newRinging = null; //or waiting
7631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        ArrayList<Connection> newUnknownConnectionsGsm = new ArrayList<Connection>();
7641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        Connection newUnknownConnectionCdma = null;
7650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean hasNonHangupStateChanged = false;   // Any change besides
7660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                                    // a dropped connection
767368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann        boolean hasAnyCallDisconnected = false;
7680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean needsPollDelay = false;
7690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean unknownConnectionAppeared = false;
7700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        //CDMA
7728bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan        boolean noConnectionExists = true;
7738bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan
7740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0, curDC = 0, dcSize = polledCalls.size()
77522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                ; i < mConnections.length; i++) {
7761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            GsmCdmaConnection conn = mConnections[i];
7770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            DriverCall dc = null;
7780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // polledCall list is sparse
7800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (curDC < dcSize) {
7810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                dc = (DriverCall) polledCalls.get(curDC);
7820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (dc.index == i+1) {
7840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    curDC++;
7850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
7860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    dc = null;
7870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
7880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
7890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            //CDMA
7918bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan            if (conn != null || dc != null) {
7928bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan                noConnectionExists = false;
7938bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan            }
7948bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan
7950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG_POLL) log("poll: conn[i=" + i + "]=" +
7960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    conn+", dc=" + dc);
7970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (conn == null && dc != null) {
7990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Connection appeared in CLCC response that we don't know about
80022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mPendingMO != null && mPendingMO.compareTo(dc)) {
8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
80222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (DBG_POLL) log("poll: pendingMO=" + mPendingMO);
8030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // It's our pending mobile originating call
80522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mConnections[i] = mPendingMO;
80622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO.mIndex = i;
80722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO.update(dc);
80822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO = null;
8090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // Someone has already asked to hangup this call
81122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mHangupPendingMO) {
81222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mHangupPendingMO = false;
8131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
8140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Re-start Ecm timer when an uncompleted emergency call ends
8151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        if (!isPhoneTypeGsm() && mIsEcmTimerCanceled) {
8161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            handleEcmTimer(GsmCdmaPhone.RESTART_ECM_TIMER);
8170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
8180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        try {
8200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            if (Phone.DEBUG_PHONE) log(
8210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    "poll: hangupPendingMO, hangup conn " + i);
82222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            hangup(mConnections[i]);
8230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        } catch (CallStateException ex) {
824ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                            Rlog.e(LOG_TAG, "unexpected error on hangup");
8250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
8260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Do not continue processing this poll
8280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Wait for hangup and repoll
8290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        return;
8300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (Phone.DEBUG_PHONE) {
83322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        log("pendingMo=" + mPendingMO + ", dc=" + dc);
8340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
8351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
8361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    mConnections[i] = new GsmCdmaConnection(mPhone, dc, this, i);
837e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam
8384be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam                    Connection hoConnection = getHoConnection(dc);
8394be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam                    if (hoConnection != null) {
840e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        // Single Radio Voice Call Continuity (SRVCC) completed
8414be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam                        mConnections[i].migrateFrom(hoConnection);
84208e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh                        // Updating connect time for silent redial cases (ex: Calls are transferred
84308e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh                        // from DIALING/ALERTING/INCOMING/WAITING to ACTIVE)
8441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        if (hoConnection.mPreHandoverState != GsmCdmaCall.State.ACTIVE &&
8451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                hoConnection.mPreHandoverState != GsmCdmaCall.State.HOLDING) {
84608e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh                            mConnections[i].onConnectedInOrOut();
84708e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh                        }
84808e9c4b483dac2cbf1b7fe4cbad22f003ff92bcbShriram Ganesh
8494be56374921b52d54b80889540d982f39d26e3abUma Maheswari Ramalingam                        mHandoverConnections.remove(hoConnection);
8501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
8511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        if (isPhoneTypeGsm()) {
8521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            for (Iterator<Connection> it = mHandoverConnections.iterator();
8531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                 it.hasNext(); ) {
8541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                Connection c = it.next();
8551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                Rlog.i(LOG_TAG, "HO Conn state is " + c.mPreHandoverState);
8561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                if (c.mPreHandoverState == mConnections[i].getState()) {
8571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                    Rlog.i(LOG_TAG, "Removing HO conn "
8581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                            + hoConnection + c.mPreHandoverState);
8591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                    it.remove();
8601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                }
8611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            }
8621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        }
8631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
864e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        mPhone.notifyHandoverStateChanged(mConnections[i]);
865e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                    } else {
866e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        // find if the MT call is a new ring or unknown connection
867e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        newRinging = checkMtFindNewRinging(dc,i);
868e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        if (newRinging == null) {
869e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                            unknownConnectionAppeared = true;
8701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            if (isPhoneTypeGsm()) {
8711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                newUnknownConnectionsGsm.add(mConnections[i]);
8721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            } else {
8731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                newUnknownConnectionCdma = mConnections[i];
8741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            }
875e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        }
8760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
8770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
8780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                hasNonHangupStateChanged = true;
8790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (conn != null && dc == null) {
8801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                if (isPhoneTypeGsm()) {
8811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // Connection missing in CLCC response that we were
8821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // tracking.
8831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    mDroppedDuringPoll.add(conn);
8841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // Dropped connections are removed from the CallTracker
8851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // list but kept in the GsmCdmaCall list
8861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    mConnections[i] = null;
8871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                } else {
8881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // This case means the RIL has no more active call anymore and
8891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // we need to clean up the foregroundCall and ringingCall.
8901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // Loop through foreground call connections as
8911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // it contains the known logical connections.
8921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    int count = mForegroundCall.mConnections.size();
8931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    for (int n = 0; n < count; n++) {
8941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        if (Phone.DEBUG_PHONE) log("adding fgCall cn " + n + " to droppedDuringPoll");
8951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        GsmCdmaConnection cn = (GsmCdmaConnection)mForegroundCall.mConnections.get(n);
8961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        mDroppedDuringPoll.add(cn);
8971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    }
8981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    count = mRingingCall.mConnections.size();
8991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // Loop through ringing call connections as
9001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // it may contain the known logical connections.
9011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    for (int n = 0; n < count; n++) {
9021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        if (Phone.DEBUG_PHONE) log("adding rgCall cn " + n + " to droppedDuringPoll");
9031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        GsmCdmaConnection cn = (GsmCdmaConnection)mRingingCall.mConnections.get(n);
9041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        mDroppedDuringPoll.add(cn);
9051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    }
9061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    mForegroundCall.setGeneric(false);
9071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    mRingingCall.setGeneric(false);
9081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
9091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // Re-start Ecm timer when the connected emergency call ends
9101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    if (mIsEcmTimerCanceled) {
9111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        handleEcmTimer(GsmCdmaPhone.RESTART_ECM_TIMER);
9121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    }
9131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // If emergency call is not going through while dialing
9141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    checkAndEnableDataCallAfterEmergencyCallDropped();
9151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
9161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // Dropped connections are removed from the CallTracker
9171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // list but kept in the Call list
9181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    mConnections[i] = null;
9190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
9211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            } else if (conn != null && dc != null && !conn.compareTo(dc) && isPhoneTypeGsm()) {
9221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                // Connection in CLCC response does not match what
9231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                // we were tracking. Assume dropped call and new call
9241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
9251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                mDroppedDuringPoll.add(conn);
9261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                mConnections[i] = new GsmCdmaConnection (mPhone, dc, this, i);
9270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                if (mConnections[i].getCall() == mRingingCall) {
9291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    newRinging = mConnections[i];
9301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                } // else something strange happened
9311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                hasNonHangupStateChanged = true;
9320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (conn != null && dc != null) { /* implicit conn.compareTo(dc) */
9330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Call collision case
9341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                if (!isPhoneTypeGsm() && conn.isIncoming() != dc.isMT) {
9351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    if (dc.isMT == true) {
9360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Mt call takes precedence than Mo,drops Mo
93722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mDroppedDuringPoll.add(conn);
9380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // find if the MT call is a new ring or unknown connection
9390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        newRinging = checkMtFindNewRinging(dc,i);
9400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (newRinging == null) {
9410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            unknownConnectionAppeared = true;
9421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            newUnknownConnectionCdma = conn;
9430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
9440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        checkAndEnableDataCallAfterEmergencyCallDropped();
9450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
9460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Call info stored in conn is not consistent with the call info from dc.
9470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // We should follow the rule of MT calls taking precedence over MO calls
9480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // when there is conflict, so here we drop the call info from dc and
9490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // continue to use the call info from conn, and only take a log.
950ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                        Rlog.e(LOG_TAG,"Error in RIL, Phantom call appeared " + dc);
9510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
9520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
9530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    boolean changed;
9540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    changed = conn.update(dc);
9550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    hasNonHangupStateChanged = hasNonHangupStateChanged || changed;
9560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
9570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
9580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (REPEAT_POLLING) {
9600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (dc != null) {
9610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // FIXME with RIL, we should not need this anymore
9620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if ((dc.state == DriverCall.State.DIALING
9630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            /*&& cm.getOption(cm.OPTION_POLL_DIALING)*/)
9640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        || (dc.state == DriverCall.State.ALERTING
9650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            /*&& cm.getOption(cm.OPTION_POLL_ALERTING)*/)
9660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        || (dc.state == DriverCall.State.INCOMING
9670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            /*&& cm.getOption(cm.OPTION_POLL_INCOMING)*/)
9680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        || (dc.state == DriverCall.State.WAITING
9691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            /*&& cm.getOption(cm.OPTION_POLL_WAITING)*/)) {
9700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Sometimes there's no unsolicited notification
9710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // for state transitions
9720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        needsPollDelay = true;
9730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
9740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
9750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
9760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9788bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan        // Safety check so that obj is not stuck with mIsInEmergencyCall set to true (and data
9798bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan        // disabled). This should never happen though.
9801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (!isPhoneTypeGsm() && noConnectionExists) {
9818bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan            checkAndEnableDataCallAfterEmergencyCallDropped();
9828bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan        }
9838bfa1b42f0ffebf33239546ceaf5d6f5ca813191Amit Mahajan
9840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This is the first poll after an ATD.
9850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // We expect the pending call to appear in the list
9860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // If it does not, we land here
98722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mPendingMO != null) {
9881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            Rlog.d(LOG_TAG, "Pending MO dropped before poll fg state:"
9891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    + mForegroundCall.getState());
9900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
99122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mDroppedDuringPoll.add(mPendingMO);
99222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPendingMO = null;
99322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mHangupPendingMO = false;
9941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
9951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            if (!isPhoneTypeGsm()) {
9961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                if( mPendingCallInEcm) {
9971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    mPendingCallInEcm = false;
9981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                }
9991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                checkAndEnableDataCallAfterEmergencyCallDropped();
10000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (newRinging != null) {
100422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyNewRingingConnection(newRinging);
10050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // clear the "local hangup" and "missed/rejected call"
10080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // cases from the "dropped during poll" list
10090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // These cases need no "last call fail" reason
101022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        for (int i = mDroppedDuringPoll.size() - 1; i >= 0 ; i--) {
10111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            GsmCdmaConnection conn = mDroppedDuringPoll.get(i);
10121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            //CDMA
1013f77612abdb6de211f33d5b3598d269b291c1d4a8Santos Cordon            boolean wasDisconnected = false;
10140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (conn.isIncoming() && conn.getConnectTime() == 0) {
10160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Missed or rejected call
1017b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen                int cause;
1018b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen                if (conn.mCause == DisconnectCause.LOCAL) {
1019b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen                    cause = DisconnectCause.INCOMING_REJECTED;
10200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
1021b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen                    cause = DisconnectCause.INCOMING_MISSED;
10220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
10230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (Phone.DEBUG_PHONE) {
102522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    log("missed/rejected call, conn.cause=" + conn.mCause);
10260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    log("setting cause to " + cause);
10270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
102822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDroppedDuringPoll.remove(i);
1029368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann                hasAnyCallDisconnected |= conn.onDisconnect(cause);
1030f77612abdb6de211f33d5b3598d269b291c1d4a8Santos Cordon                wasDisconnected = true;
1031b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen            } else if (conn.mCause == DisconnectCause.LOCAL
1032b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen                    || conn.mCause == DisconnectCause.INVALID_NUMBER) {
103322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDroppedDuringPoll.remove(i);
1034368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann                hasAnyCallDisconnected |= conn.onDisconnect(conn.mCause);
1035f77612abdb6de211f33d5b3598d269b291c1d4a8Santos Cordon                wasDisconnected = true;
1036f77612abdb6de211f33d5b3598d269b291c1d4a8Santos Cordon            }
1037f77612abdb6de211f33d5b3598d269b291c1d4a8Santos Cordon
10381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            if (!isPhoneTypeGsm() && wasDisconnected && unknownConnectionAppeared
10391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    && conn == newUnknownConnectionCdma) {
1040f77612abdb6de211f33d5b3598d269b291c1d4a8Santos Cordon                unknownConnectionAppeared = false;
10411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                newUnknownConnectionCdma = null;
10420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1045de2242679c927ed9c46fa42f40162b113e337112Omkar Kolangade        /* Disconnect any pending Handover connections */
1046ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh        for (Iterator<Connection> it = mHandoverConnections.iterator();
1047ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh                it.hasNext();) {
1048ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh            Connection hoConnection = it.next();
1049ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh            log("handlePollCalls - disconnect hoConn= " + hoConnection);
1050de2242679c927ed9c46fa42f40162b113e337112Omkar Kolangade            ((ImsPhoneConnection)hoConnection).onDisconnect(DisconnectCause.NOT_VALID);
1051ab759cc92562162ceeb3d1a5b7592b704185433dShriram Ganesh            it.remove();
1052de2242679c927ed9c46fa42f40162b113e337112Omkar Kolangade        }
1053de2242679c927ed9c46fa42f40162b113e337112Omkar Kolangade
10540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Any non-local disconnects: determine cause
105522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mDroppedDuringPoll.size() > 0) {
105622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.getLastCallFailCause(
10570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                obtainNoPollCompleteMessage(EVENT_GET_LAST_CALL_FAIL_CAUSE));
10580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (needsPollDelay) {
10610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollCallsAfterDelay();
10620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Cases when we can no longer keep disconnected Connection's
10650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // with their previous calls
10660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // 1) the phone has started to ring
10670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // 2) A Call/Connection object has changed state...
10680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //    we may have switched or held or answered (but not hung up)
1069368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann        if (newRinging != null || hasNonHangupStateChanged || hasAnyCallDisconnected) {
10700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            internalClearDisconnected();
10710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (VDBG) log("handlePollCalls calling updatePhoneState()");
10740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        updatePhoneState();
10750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (unknownConnectionAppeared) {
10771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            if (isPhoneTypeGsm()) {
10781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                for (Connection c : newUnknownConnectionsGsm) {
10791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    log("Notify unknown for " + c);
10801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    mPhone.notifyUnknownConnection(c);
10811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                }
10821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            } else {
10831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                mPhone.notifyUnknownConnection(newUnknownConnectionCdma);
10841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            }
10850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1087368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann        if (hasNonHangupStateChanged || newRinging != null || hasAnyCallDisconnected) {
108822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyPreciseCallStateChanged();
10890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //dumpState();
10920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private void
10951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    handleRadioNotAvailable() {
10961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // handlePollCalls will clear out its
10971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // call list when it gets the CommandException
10981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // error result from this
10991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        pollCallsWhenSafe();
11001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    }
11011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
11021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private void
11031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    dumpState() {
11041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        List l;
11051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
11061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        Rlog.i(LOG_TAG,"Phone State:" + mState);
11071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
11081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        Rlog.i(LOG_TAG,"Ringing call: " + mRingingCall.toString());
11091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
11101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        l = mRingingCall.getConnections();
11111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        for (int i = 0, s = l.size(); i < s; i++) {
11121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            Rlog.i(LOG_TAG,l.get(i).toString());
11131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
11141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
11151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        Rlog.i(LOG_TAG,"Foreground call: " + mForegroundCall.toString());
11161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
11171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        l = mForegroundCall.getConnections();
11181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        for (int i = 0, s = l.size(); i < s; i++) {
11191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            Rlog.i(LOG_TAG,l.get(i).toString());
11201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
11211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
11221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        Rlog.i(LOG_TAG,"Background call: " + mBackgroundCall.toString());
11231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
11241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        l = mBackgroundCall.getConnections();
11251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        for (int i = 0, s = l.size(); i < s; i++) {
11261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            Rlog.i(LOG_TAG,l.get(i).toString());
11271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
11281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
11291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    }
11301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
11311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //***** Called from GsmCdmaConnection
11321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
11331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    /*package*/ void hangup (GsmCdmaConnection conn) throws CallStateException {
113422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (conn.mOwner != this) {
11351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            throw new CallStateException ("GsmCdmaConnection " + conn
11361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                    + "does not belong to GsmCdmaCallTracker " + this);
11370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
113922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (conn == mPendingMO) {
11400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // We're hanging up an outgoing call that doesn't have it's
11411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // GsmCdma index assigned yet
11420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (Phone.DEBUG_PHONE) log("hangup: set hangupPendingMO to true");
114422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mHangupPendingMO = true;
11451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        } else if (!isPhoneTypeGsm()
11461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                && conn.getCall() == mRingingCall
11471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                && mRingingCall.getState() == GsmCdmaCall.State.WAITING) {
11480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Handle call waiting hang up case.
11490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //
11501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // The ringingCall state will change to IDLE in GsmCdmaCall.detach
11510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // if the ringing call connection size is 0. We don't specifically
11520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // set the ringing call state to IDLE here to avoid a race condition
11530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // where a new call waiting could get a hang up from an old call
11540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // waiting ringingCall.
11550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //
11560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // PhoneApp does the call log itself since only PhoneApp knows
11570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // the hangup reason is user ignoring or timing out. So conn.onDisconnect()
11580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // is not called here. Instead, conn.onLocalDisconnect() is called.
11590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            conn.onLocalDisconnect();
11601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
11610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            updatePhoneState();
116222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyPreciseCallStateChanged();
11630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
11640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
11650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
11661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                mCi.hangupConnection (conn.getGsmCdmaIndex(), obtainCompleteMessage());
11670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (CallStateException ex) {
11680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Ignore "connection not found"
11690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Call may have hung up already
11701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                Rlog.w(LOG_TAG,"GsmCdmaCallTracker WARN: hangup() on absent connection "
11710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                + conn);
11720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        conn.onHangupLocal();
11760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void
11791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    separate (GsmCdmaConnection conn) throws CallStateException {
118022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (conn.mOwner != this) {
11811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            throw new CallStateException ("GsmCdmaConnection " + conn
11821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                    + "does not belong to GsmCdmaCallTracker " + this);
11830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
11851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            mCi.separateConnection (conn.getGsmCdmaIndex(),
11860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                obtainCompleteMessage(EVENT_SEPARATE_RESULT));
11870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (CallStateException ex) {
11880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Ignore "connection not found"
11890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Call may have hung up already
11901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            Rlog.w(LOG_TAG,"GsmCdmaCallTracker WARN: separate() on absent connection " + conn);
11910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //***** Called from GsmCdmaPhone
11950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void
11970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    setMute(boolean mute) {
119822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mDesiredMute = mute;
119922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setMute(mDesiredMute, null);
12000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ boolean
12030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getMute() {
120422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mDesiredMute;
12050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //***** Called from GsmCdmaCall
12090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    public void hangup (GsmCdmaCall call) throws CallStateException {
12110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (call.getConnections().size() == 0) {
12120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("no connections in call");
12130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
12140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
121522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (call == mRingingCall) {
12160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (Phone.DEBUG_PHONE) log("(ringing) hangup waiting or background");
121722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.hangupWaitingOrBackground(obtainCompleteMessage());
121822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (call == mForegroundCall) {
12190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (call.isDialingOrAlerting()) {
12200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (Phone.DEBUG_PHONE) {
12210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    log("(foregnd) hangup dialing or alerting...");
12220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
12231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                hangup((GsmCdmaConnection)(call.getConnections().get(0)));
12241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            } else if (isPhoneTypeGsm()
12251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    && mRingingCall.isRinging()) {
12261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                // Do not auto-answer ringing on CHUP, instead just end active calls
12271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                log("hangup all conns in active/background call, without affecting ringing call");
12281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                hangupAllConnections(call);
12290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
12300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                hangupForegroundResumeBackground();
12310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
123222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (call == mBackgroundCall) {
123322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (mRingingCall.isRinging()) {
12340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (Phone.DEBUG_PHONE) {
12350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    log("hangup all conns in background call");
12360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
12370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                hangupAllConnections(call);
12380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
12390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                hangupWaitingOrBackground();
12400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
12410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
12421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            throw new RuntimeException ("GsmCdmaCall " + call +
12431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    "does not belong to GsmCdmaCallTracker " + this);
12440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
12450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        call.onHangupLocal();
124722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.notifyPreciseCallStateChanged();
12480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* package */
12510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void hangupWaitingOrBackground() {
12520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (Phone.DEBUG_PHONE) log("hangupWaitingOrBackground");
125322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.hangupWaitingOrBackground(obtainCompleteMessage());
12540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* package */
12570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void hangupForegroundResumeBackground() {
12580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (Phone.DEBUG_PHONE) log("hangupForegroundResumeBackground");
125922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.hangupForegroundResumeBackground(obtainCompleteMessage());
12600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    void hangupConnectionByIndex(GsmCdmaCall call, int index)
12630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throws CallStateException {
126422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        int count = call.mConnections.size();
12650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0; i < count; i++) {
12661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            GsmCdmaConnection cn = (GsmCdmaConnection)call.mConnections.get(i);
12671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            if (cn.getGsmCdmaIndex() == index) {
126822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCi.hangupConnection(index, obtainCompleteMessage());
12690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return;
12700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
12710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
12720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        throw new CallStateException("no GsmCdma index found");
12740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    void hangupAllConnections(GsmCdmaCall call) {
12770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
127822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            int count = call.mConnections.size();
12790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (int i = 0; i < count; i++) {
12801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                GsmCdmaConnection cn = (GsmCdmaConnection)call.mConnections.get(i);
12811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                mCi.hangupConnection(cn.getGsmCdmaIndex(), obtainCompleteMessage());
12820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
12830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (CallStateException ex) {
1284ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.e(LOG_TAG, "hangupConnectionByIndex caught " + ex);
12850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
12860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
12870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* package */
12891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    GsmCdmaConnection getConnectionByIndex(GsmCdmaCall call, int index)
12900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throws CallStateException {
129122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        int count = call.mConnections.size();
12920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0; i < count; i++) {
12931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            GsmCdmaConnection cn = (GsmCdmaConnection)call.mConnections.get(i);
12941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            if (cn.getGsmCdmaIndex() == index) {
12950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return cn;
12960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
12970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
12980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
12990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
13000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //CDMA
13030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void notifyCallWaitingInfo(CdmaCallWaitingNotification obj) {
130422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mCallWaitingRegistrants != null) {
130522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCallWaitingRegistrants.notifyRegistrants(new AsyncResult(null, obj, null));
13060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
13070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //CDMA
13100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void handleCallWaitingInfo (CdmaCallWaitingNotification cw) {
13110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Check how many connections in foregroundCall.
13120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // If the connection in foregroundCall is more
13130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // than one, then the connection information is
13140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // not reliable anymore since it means either
13150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // call waiting is connected or 3 way call is
13160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // dialed before, so set generic.
131722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mForegroundCall.mConnections.size() > 1 ) {
131822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mForegroundCall.setGeneric(true);
13190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
13200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        // Create a new GsmCdmaConnection which attaches itself to ringingCall.
132222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRingingCall.setGeneric(false);
13231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        new GsmCdmaConnection(mPhone.getContext(), cw, this, mRingingCall);
13240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        updatePhoneState();
13250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Finally notify application
13270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        notifyCallWaitingInfo(cw);
13280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
13291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
13301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private Phone.SuppService getFailedService(int what) {
13311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        switch (what) {
13321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            case EVENT_SWITCH_RESULT:
13331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                return Phone.SuppService.SWITCH;
13341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            case EVENT_CONFERENCE_RESULT:
13351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                return Phone.SuppService.CONFERENCE;
13361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            case EVENT_SEPARATE_RESULT:
13371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                return Phone.SuppService.SEPARATE;
13381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            case EVENT_ECT_RESULT:
13391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                return Phone.SuppService.TRANSFER;
13401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
13411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        return Phone.SuppService.UNKNOWN;
13421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    }
13431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
13440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //****** Overridden from Handler
13450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1346cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
13470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
13480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    handleMessage (Message msg) {
13490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar;
13500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (msg.what) {
13521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            case EVENT_POLL_CALLS_RESULT:
1353ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                Rlog.d(LOG_TAG, "Event EVENT_POLL_CALLS_RESULT Received");
13540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                if (msg == mLastRelevantPoll) {
13561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    if (DBG_POLL) log(
13570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            "handle EVENT_POLL_CALL_RESULT: set needsPoll=F");
135822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mNeedsPoll = false;
135922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mLastRelevantPoll = null;
13600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    handlePollCalls((AsyncResult)msg.obj);
13610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
13620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
13630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_OPERATION_COMPLETE:
13650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                operationComplete();
13660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
13670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            case EVENT_CONFERENCE_RESULT:
13691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                if (isPhoneTypeGsm()) {
13701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // The conference merge failed, so notify listeners.  Ultimately this bubbles up
13711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // to Telecom, which will inform the InCall UI of the failure.
13721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    Connection connection = mForegroundCall.getLatestConnection();
13731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    if (connection != null) {
13741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        connection.onConferenceMergeFailed();
13751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    }
13761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                }
13771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                // fall through
13781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            case EVENT_SEPARATE_RESULT:
13791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            case EVENT_ECT_RESULT:
13800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_SWITCH_RESULT:
13811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                if (isPhoneTypeGsm()) {
13821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    ar = (AsyncResult) msg.obj;
13831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    if (ar.exception != null) {
13841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        mPhone.notifySuppServiceFailed(getFailedService(msg.what));
13851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    }
13861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    operationComplete();
13871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                } else {
13881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    if (msg.what != EVENT_SWITCH_RESULT) {
13891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        // EVENT_SWITCH_RESULT in GSM call triggers operationComplete() which gets
13901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        // the current call list. But in CDMA there is no list so there is nothing
13911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        // to do. Other messages however are not expected in CDMA.
13921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        throw new RuntimeException("unexpected event " + msg.what + " not handled by " +
13931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                "phone type " + mPhone.getPhoneType());
13941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    }
13951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                }
13960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
13970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
13980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_GET_LAST_CALL_FAIL_CAUSE:
13990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                int causeCode;
140033cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu                String vendorCause = null;
14010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
14020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                operationComplete();
14040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception != null) {
14060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // An exception occurred...just treat the disconnect
14070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // cause as "normal"
14080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    causeCode = CallFailCause.NORMAL_CLEARING;
1409ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                    Rlog.i(LOG_TAG,
14100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            "Exception during getLastCallFailCause, assuming normal disconnect");
14110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
141233cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu                    LastCallFailCause failCause = (LastCallFailCause)ar.result;
141333cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu                    causeCode = failCause.causeCode;
141433cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu                    vendorCause = failCause.vendorCause;
14150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
14161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                // Log the causeCode if its not normal
14171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                if (causeCode == CallFailCause.NO_CIRCUIT_AVAIL ||
14181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    causeCode == CallFailCause.TEMPORARY_FAILURE ||
14191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    causeCode == CallFailCause.SWITCHING_CONGESTION ||
14201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    causeCode == CallFailCause.CHANNEL_NOT_AVAIL ||
14211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    causeCode == CallFailCause.QOS_NOT_AVAIL ||
14221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    causeCode == CallFailCause.BEARER_NOT_AVAIL ||
14231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    causeCode == CallFailCause.ERROR_UNSPECIFIED) {
14241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
14251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    CellLocation loc = mPhone.getCellLocation();
14261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    int cid = -1;
14271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    if (loc != null) {
14281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        if (isPhoneTypeGsm()) {
14291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            cid = ((GsmCellLocation)loc).getCid();
14301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        } else {
14311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            cid = ((CdmaCellLocation)loc).getBaseStationId();
14321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        }
14331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    }
14341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    EventLog.writeEvent(EventLogTags.CALL_DROP, causeCode, cid,
14351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            TelephonyManager.getDefault().getNetworkType());
14361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                }
14370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                for (int i = 0, s = mDroppedDuringPoll.size(); i < s ; i++) {
14391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    GsmCdmaConnection conn = mDroppedDuringPoll.get(i);
14400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
144133cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu                    conn.onRemoteDisconnect(causeCode, vendorCause);
14420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
14430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                updatePhoneState();
14450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
144622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.notifyPreciseCallStateChanged();
144722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDroppedDuringPoll.clear();
14480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
14490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_REPOLL_AFTER_DELAY:
14510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_CALL_STATE_CHANGE:
14520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                pollCallsWhenSafe();
14530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
14540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_RADIO_AVAILABLE:
14560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                handleRadioAvailable();
14570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
14580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_RADIO_NOT_AVAILABLE:
14600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                handleRadioNotAvailable();
14610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
14620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_EXIT_ECM_RESPONSE_CDMA:
14641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                if (!isPhoneTypeGsm()) {
14651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    // no matter the result, we still do the same here
14661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    if (mPendingCallInEcm) {
14671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        mCi.dial(mPendingMO.getAddress(), mPendingCallClirMode, obtainCompleteMessage());
14681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        mPendingCallInEcm = false;
14691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    }
14701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    mPhone.unsetOnEcbModeExitResponse(this);
14711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                } else {
14721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    throw new RuntimeException("unexpected event " + msg.what + " not handled by " +
14731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            "phone type " + mPhone.getPhoneType());
1474e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                }
14751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                break;
14760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_CALL_WAITING_INFO_CDMA:
14781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                if (!isPhoneTypeGsm()) {
14791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    ar = (AsyncResult)msg.obj;
14801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    if (ar.exception == null) {
14811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        handleCallWaitingInfo((CdmaCallWaitingNotification)ar.result);
14821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        Rlog.d(LOG_TAG, "Event EVENT_CALL_WAITING_INFO_CDMA Received");
14831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    }
14841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                } else {
14851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    throw new RuntimeException("unexpected event " + msg.what + " not handled by " +
14861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            "phone type " + mPhone.getPhoneType());
14871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                }
14881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                break;
14890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
14900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_THREE_WAY_DIAL_L2_RESULT_CDMA:
14911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                if (!isPhoneTypeGsm()) {
14921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    ar = (AsyncResult)msg.obj;
14931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    if (ar.exception == null) {
14941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        // Assume 3 way call is connected
14951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        mPendingMO.onConnectedInOrOut();
14961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        mPendingMO = null;
14971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    }
14981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                } else {
14991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    throw new RuntimeException("unexpected event " + msg.what + " not handled by " +
15001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            "phone type " + mPhone.getPhoneType());
15010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
15021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                break;
15030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1504bb097a7ba08252c516e578ce30cdb658b63d7c9bJing Zhao            case EVENT_THREE_WAY_DIAL_BLANK_FLASH:
15051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                if (!isPhoneTypeGsm()) {
15061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    ar = (AsyncResult) msg.obj;
15071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    if (ar.exception == null) {
15081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        postDelayed(
15091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                new Runnable() {
15101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                    public void run() {
15111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                        if (mPendingMO != null) {
15121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                            mCi.sendCDMAFeatureCode(mPendingMO.getAddress(),
15131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                                    obtainMessage(EVENT_THREE_WAY_DIAL_L2_RESULT_CDMA));
15141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                        }
1515bb097a7ba08252c516e578ce30cdb658b63d7c9bJing Zhao                                    }
15161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                                }, m3WayCallFlashDelay);
15171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    } else {
15181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        mPendingMO = null;
15191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        Rlog.w(LOG_TAG, "exception happened on Blank Flash for 3-way call");
15201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    }
1521bb097a7ba08252c516e578ce30cdb658b63d7c9bJing Zhao                } else {
15221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    throw new RuntimeException("unexpected event " + msg.what + " not handled by " +
15231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                            "phone type " + mPhone.getPhoneType());
1524bb097a7ba08252c516e578ce30cdb658b63d7c9bJing Zhao                }
15251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                break;
1526bb097a7ba08252c516e578ce30cdb658b63d7c9bJing Zhao
15270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:{
15281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                throw new RuntimeException("unexpected event " + msg.what + " not handled by " +
15291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                        "phone type " + mPhone.getPhoneType());
15300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
15310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
15320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //CDMA
15350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Check and enable data call after an emergency call is dropped if it's
15370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * not in ECM
15380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
15390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void checkAndEnableDataCallAfterEmergencyCallDropped() {
15400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mIsInEmergencyCall) {
15410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mIsInEmergencyCall = false;
15420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
15430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (Phone.DEBUG_PHONE) {
15440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                log("checkAndEnableDataCallAfterEmergencyCallDropped,inEcm=" + inEcm);
15450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
15460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (inEcm.compareTo("false") == 0) {
15470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Re-initiate data connection
1548454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                mPhone.mDcTracker.setInternalDataEnabled(true);
1549f3cb9192272e4ddd68970352e998690f6c80e393Amit Mahajan                mPhone.notifyEmergencyCallRegistrants(false);
15500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
15510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
15520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Check the MT call to see if it's a new ring or
15560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * a unknown connection.
15570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
15580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Connection checkMtFindNewRinging(DriverCall dc, int i) {
15590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Connection newRinging = null;
15610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // it's a ringing call
156322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mConnections[i].getCall() == mRingingCall) {
156422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            newRinging = mConnections[i];
15650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (Phone.DEBUG_PHONE) log("Notify new ring " + dc);
15660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
15670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Something strange happened: a call which is neither
15680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // a ringing call nor the one we created. It could be the
15690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // call collision result from RIL
1570ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.e(LOG_TAG,"Phantom call appeared " + dc);
15710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // If it's a connected call, set the connect time so that
15720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // it's non-zero.  It may not be accurate, but at least
15730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // it won't appear as a Missed Call.
15740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (dc.state != DriverCall.State.ALERTING
15751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    && dc.state != DriverCall.State.DIALING) {
157622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mConnections[i].onConnectedInOrOut();
15779b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam                if (dc.state == DriverCall.State.HOLDING) {
15789b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam                    // We've transitioned into HOLDING
157922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mConnections[i].onStartedHolding();
15809b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam                }
15810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
15820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
15830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return newRinging;
15840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    //CDMA
15870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
15880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Check if current call is in emergency call
15890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
15900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if it is in emergency call
15910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         false if it is not in emergency call
15920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
15930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean isInEmergencyCall() {
15940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mIsInEmergencyCall;
15950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
15960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
15971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    private boolean isPhoneTypeGsm() {
15981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        return mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_GSM;
15991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu    }
16001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
1601cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
16020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void log(String msg) {
16031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        Rlog.d(LOG_TAG, "[GsmCdmaCallTracker] " + msg);
16040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
16050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
16060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
16070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
16081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        pw.println("GsmCdmaCallTracker extends:");
16090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.dump(fd, pw, args);
16101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        pw.println("mConnections: length=" + mConnections.length);
161122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        for(int i=0; i < mConnections.length; i++) {
16121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            pw.printf("  mConnections[%d]=%s\n", i, mConnections[i]);
16130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
161422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mVoiceCallEndedRegistrants=" + mVoiceCallEndedRegistrants);
161522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mVoiceCallStartedRegistrants=" + mVoiceCallStartedRegistrants);
16161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (!isPhoneTypeGsm()) {
16171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            pw.println(" mCallWaitingRegistrants=" + mCallWaitingRegistrants);
16181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
16191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        pw.println(" mDroppedDuringPoll: size=" + mDroppedDuringPoll.size());
162022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        for(int i = 0; i < mDroppedDuringPoll.size(); i++) {
16211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            pw.printf( "  mDroppedDuringPoll[%d]=%s\n", i, mDroppedDuringPoll.get(i));
16220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
162322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mRingingCall=" + mRingingCall);
162422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mForegroundCall=" + mForegroundCall);
162522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mBackgroundCall=" + mBackgroundCall);
162622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mPendingMO=" + mPendingMO);
162722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mHangupPendingMO=" + mHangupPendingMO);
162822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mPhone=" + mPhone);
162922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mDesiredMute=" + mDesiredMute);
163022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mState=" + mState);
16311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (!isPhoneTypeGsm()) {
16321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            pw.println(" mPendingCallInEcm=" + mPendingCallInEcm);
16331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            pw.println(" mIsInEmergencyCall=" + mIsInEmergencyCall);
16341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            pw.println(" mPendingCallClirMode=" + mPendingCallClirMode);
16351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            pw.println(" mIsEcmTimerCanceled=" + mIsEcmTimerCanceled);
16361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
16371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu
16380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1639b79f845a0451895b0f0b8a926a8571511d476ce8Libin.Tang@motorola.com    @Override
1640b79f845a0451895b0f0b8a926a8571511d476ce8Libin.Tang@motorola.com    public PhoneConstants.State getState() {
1641b79f845a0451895b0f0b8a926a8571511d476ce8Libin.Tang@motorola.com        return mState;
1642b79f845a0451895b0f0b8a926a8571511d476ce8Libin.Tang@motorola.com    }
16430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
1644