GsmCdmaCallTracker.java revision e64a413b850aae224e2f56e7dfc6e0bcd667643e
10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony.cdma;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Registrant;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RegistrantList;
24b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensenimport android.telephony.DisconnectCause;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.PhoneNumberUtils;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState;
27ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallStateException;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallTracker;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CommandsInterface;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Connection;
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.DriverCall;
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Phone;
36e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingamimport com.android.internal.telephony.PhoneBase;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneConstants;
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.TelephonyProperties;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List;
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic final class CdmaCallTracker extends CallTracker {
50cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    static final String LOG_TAG = "CdmaCallTracker";
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final boolean REPEAT_POLLING = false;
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final boolean DBG_POLL = false;
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Constants
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
58d62a7cecd0451592222d73995dd53074aa6f98a5Sungmin Choi    static final int MAX_CONNECTIONS = 8;
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final int MAX_CONNECTIONS_PER_CALL = 1; // only 1 connection allowed per call
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Instance Variables
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CdmaConnection mConnections[] = new CdmaConnection[MAX_CONNECTIONS];
6422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    RegistrantList mVoiceCallEndedRegistrants = new RegistrantList();
6522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    RegistrantList mVoiceCallStartedRegistrants = new RegistrantList();
6622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    RegistrantList mCallWaitingRegistrants =  new RegistrantList();
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // connections dropped during last poll
7022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    ArrayList<CdmaConnection> mDroppedDuringPoll
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        = new ArrayList<CdmaConnection>(MAX_CONNECTIONS);
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CdmaCall mRingingCall = new CdmaCall(this);
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // A call that is ringing or (call) waiting
7522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CdmaCall mForegroundCall = new CdmaCall(this);
7622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CdmaCall mBackgroundCall = new CdmaCall(this);
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CdmaConnection mPendingMO;
7922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    boolean mHangupPendingMO;
8022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    boolean mPendingCallInEcm=false;
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean mIsInEmergencyCall = false;
8222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CDMAPhone mPhone;
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    boolean mDesiredMute = false;    // false = mute off
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    int mPendingCallClirMode;
8722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    PhoneConstants.State mState = PhoneConstants.State.IDLE;
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean mIsEcmTimerCanceled = false;
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville//    boolean needsPoll;
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Events
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Constructors
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    CdmaCallTracker(CDMAPhone phone) {
9922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone = phone;
10022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi = phone.mCi;
10122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForCallStateChanged(this, EVENT_CALL_STATE_CHANGE, null);
10222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForOn(this, EVENT_RADIO_AVAILABLE, null);
10322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForNotAvailable(this, EVENT_RADIO_NOT_AVAILABLE, null);
10422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForCallWaitingInfo(this, EVENT_CALL_WAITING_INFO_CDMA, null);
10522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mForegroundCall.setGeneric(false);
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dispose() {
109cb104a615d1e44cf39d837c3dbcf9475a5be57ebShriram Ganesh        Rlog.d(LOG_TAG, "CdmaCallTracker dispose");
110cb104a615d1e44cf39d837c3dbcf9475a5be57ebShriram Ganesh        mCi.unregisterForLineControlInfo(this);
11122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForCallStateChanged(this);
11222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForOn(this);
11322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForNotAvailable(this);
11422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForCallWaitingInfo(this);
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        clearDisconnected();
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void finalize() {
122ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.d(LOG_TAG, "CdmaCallTracker finalized");
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Instance Methods
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Public Methods
128cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForVoiceCallStarted(Handler h, int what, Object obj) {
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Registrant r = new Registrant(h, what, obj);
13122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceCallStartedRegistrants.add(r);
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Notify if in call when registering
13322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mState != PhoneConstants.State.IDLE) {
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            r.notifyRegistrant(new AsyncResult(null, null, null));
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
137cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForVoiceCallStarted(Handler h) {
13922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceCallStartedRegistrants.remove(h);
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
142cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForVoiceCallEnded(Handler h, int what, Object obj) {
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Registrant r = new Registrant(h, what, obj);
14522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceCallEndedRegistrants.add(r);
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
148cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForVoiceCallEnded(Handler h) {
15022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceCallEndedRegistrants.remove(h);
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForCallWaiting(Handler h, int what, Object obj) {
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Registrant r = new Registrant (h, what, obj);
15522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCallWaitingRegistrants.add(r);
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForCallWaiting(Handler h) {
15922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCallWaitingRegistrants.remove(h);
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * clirMode is one of the CLIR_ constants
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Connection
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    dial (String dialString, int clirMode) throws CallStateException {
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // note that this triggers call state changed notif
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        clearDisconnected();
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!canDial()) {
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("cannot dial in current state");
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean isPhoneInEcmMode = inEcm.equals("true");
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean isEmergencyCall =
177f4f5308a309d43fcfca8d0d5fbb54bc38c82ca3fYorke Lee                PhoneNumberUtils.isLocalEmergencyNumber(mPhone.getContext(), dialString);
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Cancel Ecm timer if a second emergency call is originating in Ecm mode
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (isPhoneInEcmMode && isEmergencyCall) {
181cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            handleEcmTimer(CDMAPhone.CANCEL_ECM_TIMER);
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // We are initiating a call therefore even if we previously
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // didn't know the state (i.e. Generic was true) we now know
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // and therefore can set Generic to false.
18722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mForegroundCall.setGeneric(false);
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // The new call must be assigned to the foreground call.
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // That call must be idle, so place anything that's
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // there on hold
19222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mForegroundCall.getState() == CdmaCall.State.ACTIVE) {
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return dialThreeWay(dialString);
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
19622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPendingMO = new CdmaConnection(mPhone.getContext(), checkForTestEmergencyNumber(dialString),
19722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                this, mForegroundCall);
19822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mHangupPendingMO = false;
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
200e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam        if ( mPendingMO.getAddress() == null || mPendingMO.getAddress().length() == 0
201e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                || mPendingMO.getAddress().indexOf(PhoneNumberUtils.WILD) >= 0 ) {
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Phone number is invalid
203b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen            mPendingMO.mCause = DisconnectCause.INVALID_NUMBER;
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // handlePollCalls() will notice this call not present
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // and will mark it as dropped.
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollCallsWhenSafe();
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Always unmute when initiating a new call
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setMute(false);
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Check data call
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            disableDataCallInEmergencyCall(dialString);
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // In Ecm mode, if another emergency call is dialed, Ecm mode will not exit.
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if(!isPhoneInEcmMode || (isPhoneInEcmMode && isEmergencyCall)) {
217e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                mCi.dial(mPendingMO.getAddress(), clirMode, obtainCompleteMessage());
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
21922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.exitEmergencyCallbackMode();
22022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.setOnEcbModeExitResponse(this,EVENT_EXIT_ECM_RESPONSE_CDMA, null);
22122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPendingCallClirMode=clirMode;
22222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPendingCallInEcm=true;
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        updatePhoneState();
22722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.notifyPreciseCallStateChanged();
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
22922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mPendingMO;
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Connection
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    dial (String dialString) throws CallStateException {
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return dial(dialString, CommandsInterface.CLIR_DEFAULT);
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Connection
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    dialThreeWay (String dialString) {
24022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (!mForegroundCall.isIdle()) {
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Check data call
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            disableDataCallInEmergencyCall(dialString);
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Attach the new connection to foregroundCall
24522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPendingMO = new CdmaConnection(mPhone.getContext(),
24622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                                checkForTestEmergencyNumber(dialString), this, mForegroundCall);
247e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam            mCi.sendCDMAFeatureCode(mPendingMO.getAddress(),
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                obtainMessage(EVENT_THREE_WAY_DIAL_L2_RESULT_CDMA));
24922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            return mPendingMO;
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    acceptCall() throws CallStateException {
25622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRingingCall.getState() == CdmaCall.State.INCOMING) {
257ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.i("phone", "acceptCall: incoming...");
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Always unmute when answering a new call
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setMute(false);
26022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.acceptCall(obtainCompleteMessage());
26122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mRingingCall.getState() == CdmaCall.State.WAITING) {
26222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            CdmaConnection cwConn = (CdmaConnection)(mRingingCall.getLatestConnection());
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Since there is no network response for supplimentary
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // service for CDMA, we assume call waiting is answered.
2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // ringing Call state change to idle is in CdmaCall.detach
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // triggered by updateParent.
26822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            cwConn.updateParent(mRingingCall, mForegroundCall);
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            cwConn.onConnectedInOrOut();
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            updatePhoneState();
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            switchWaitingOrHoldingAndActive();
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("phone not ringing");
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    rejectCall () throws CallStateException {
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // AT+CHLD=0 means "release held or UDUB"
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // so if the phone isn't ringing, this could hang up held
28122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRingingCall.getState().isRinging()) {
28222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.rejectCall(obtainCompleteMessage());
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("phone not ringing");
2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    switchWaitingOrHoldingAndActive() throws CallStateException {
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Should we bother with this check?
29122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRingingCall.getState() == CdmaCall.State.INCOMING) {
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("cannot be in the incoming state");
29322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mForegroundCall.getConnections().size() > 1) {
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            flashAndSetGenericTrue();
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Send a flash command to CDMA network for putting the other party on hold.
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // For CDMA networks which do not support this the user would just hear a beep
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // from the network. For CDMA networks which do support it will put the other
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // party on hold.
30022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.sendCDMAFeatureCode("", obtainMessage(EVENT_SWITCH_RESULT));
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
305cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    conference() {
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Should we be checking state?
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        flashAndSetGenericTrue();
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
311cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    explicitCallTransfer() {
31222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.explicitCallTransfer(obtainCompleteMessage(EVENT_ECT_RESULT));
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    clearDisconnected() {
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        internalClearDisconnected();
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        updatePhoneState();
32022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.notifyPreciseCallStateChanged();
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    canConference() {
32522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mForegroundCall.getState() == CdmaCall.State.ACTIVE
32622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && mBackgroundCall.getState() == CdmaCall.State.HOLDING
32722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && !mBackgroundCall.isFull()
32822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && !mForegroundCall.isFull();
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    canDial() {
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean ret;
33422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        int serviceState = mPhone.getServiceState().getState();
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String disableCall = SystemProperties.get(
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                TelephonyProperties.PROPERTY_DISABLE_CALL, "false");
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ret = (serviceState != ServiceState.STATE_POWER_OFF)
33922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && mPendingMO == null
34022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && !mRingingCall.isRinging()
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                && !disableCall.equals("true")
34222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && (!mForegroundCall.getState().isAlive()
34322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    || (mForegroundCall.getState() == CdmaCall.State.ACTIVE)
34422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    || !mBackgroundCall.getState().isAlive());
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!ret) {
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log(String.format("canDial is false\n" +
3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                              "((serviceState=%d) != ServiceState.STATE_POWER_OFF)::=%s\n" +
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                              "&& pendingMO == null::=%s\n" +
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                              "&& !ringingCall.isRinging()::=%s\n" +
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                              "&& !disableCall.equals(\"true\")::=%s\n" +
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                              "&& (!foregroundCall.getState().isAlive()::=%s\n" +
3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                              "   || foregroundCall.getState() == CdmaCall.State.ACTIVE::=%s\n" +
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                              "   ||!backgroundCall.getState().isAlive())::=%s)",
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    serviceState,
3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    serviceState != ServiceState.STATE_POWER_OFF,
35722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO == null,
35822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    !mRingingCall.isRinging(),
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    !disableCall.equals("true"),
36022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    !mForegroundCall.getState().isAlive(),
36122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mForegroundCall.getState() == CdmaCall.State.ACTIVE,
36222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    !mBackgroundCall.getState().isAlive()));
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ret;
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    canTransfer() {
369ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.e(LOG_TAG, "canTransfer: not possible in CDMA");
3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Private Instance Methods
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    internalClearDisconnected() {
37722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRingingCall.clearDisconnected();
37822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mForegroundCall.clearDisconnected();
37922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mBackgroundCall.clearDisconnected();
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Obtain a message to use for signalling "invoke getCurrentCalls() when
3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * this operation and all other pending operations are complete
3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Message
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    obtainCompleteMessage() {
3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return obtainCompleteMessage(EVENT_OPERATION_COMPLETE);
3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Obtain a message to use for signalling "invoke getCurrentCalls() when
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * this operation and all other pending operations are complete
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Message
3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    obtainCompleteMessage(int what) {
39722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPendingOperations++;
39822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mLastRelevantPoll = null;
39922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mNeedsPoll = true;
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG_POLL) log("obtainCompleteMessage: pendingOperations=" +
40222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPendingOperations + ", needsPoll=" + mNeedsPoll);
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return obtainMessage(what);
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void
4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    operationComplete() {
40922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPendingOperations--;
4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG_POLL) log("operationComplete: pendingOperations=" +
41222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPendingOperations + ", needsPoll=" + mNeedsPoll);
4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
41422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mPendingOperations == 0 && mNeedsPoll) {
41522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mLastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT);
41622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.getCurrentCalls(mLastRelevantPoll);
41722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mPendingOperations < 0) {
4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // this should never happen
419ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.e(LOG_TAG,"CdmaCallTracker.pendingOperations < 0");
42022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPendingOperations = 0;
4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void
4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    updatePhoneState() {
42822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        PhoneConstants.State oldState = mState;
4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
43022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRingingCall.isRinging()) {
43122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mState = PhoneConstants.State.RINGING;
43222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mPendingMO != null ||
43322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                !(mForegroundCall.isIdle() && mBackgroundCall.isIdle())) {
43422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mState = PhoneConstants.State.OFFHOOK;
4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
43622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mState = PhoneConstants.State.IDLE;
4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
43922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mState == PhoneConstants.State.IDLE && oldState != mState) {
44022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mVoiceCallEndedRegistrants.notifyRegistrants(
4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                new AsyncResult(null, null, null));
44222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (oldState == PhoneConstants.State.IDLE && oldState != mState) {
44322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mVoiceCallStartedRegistrants.notifyRegistrants (
4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    new AsyncResult(null, null, null));
4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (Phone.DEBUG_PHONE) {
44722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            log("update phone state, old=" + oldState + " new="+ mState);
4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
44922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mState != oldState) {
45022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyPhoneStateChanged();
4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // ***** Overwritten from CallTracker
4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
456cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void
4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    handlePollCalls(AsyncResult ar) {
4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        List polledCalls;
4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (ar.exception == null) {
4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            polledCalls = (List)ar.result;
4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (isCommandExceptionRadioNotAvailable(ar.exception)) {
4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // just a dummy empty ArrayList to cause the loop
4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // to hang up all the calls
4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            polledCalls = new ArrayList();
4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Radio probably wasn't ready--try again in a bit
4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // But don't keep polling if the channel is closed
4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollCallsAfterDelay();
4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Connection newRinging = null; //or waiting
4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean hasNonHangupStateChanged = false;   // Any change besides
4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                                    // a dropped connection
477368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann        boolean hasAnyCallDisconnected = false;
4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean needsPollDelay = false;
4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean unknownConnectionAppeared = false;
4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0, curDC = 0, dcSize = polledCalls.size()
48222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                ; i < mConnections.length; i++) {
48322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            CdmaConnection conn = mConnections[i];
4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            DriverCall dc = null;
4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // polledCall list is sparse
4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (curDC < dcSize) {
4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                dc = (DriverCall) polledCalls.get(curDC);
4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (dc.index == i+1) {
4910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    curDC++;
4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    dc = null;
4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG_POLL) log("poll: conn[i=" + i + "]=" +
4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    conn+", dc=" + dc);
4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (conn == null && dc != null) {
5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Connection appeared in CLCC response that we don't know about
50222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mPendingMO != null && mPendingMO.compareTo(dc)) {
5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
50422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (DBG_POLL) log("poll: pendingMO=" + mPendingMO);
5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // It's our pending mobile originating call
50722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mConnections[i] = mPendingMO;
50822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO.mIndex = i;
50922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO.update(dc);
51022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO = null;
5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // Someone has already asked to hangup this call
51322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mHangupPendingMO) {
51422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mHangupPendingMO = false;
5150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Re-start Ecm timer when an uncompleted emergency call ends
5160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (mIsEcmTimerCanceled) {
517cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                            handleEcmTimer(CDMAPhone.RESTART_ECM_TIMER);
5180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        try {
5210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            if (Phone.DEBUG_PHONE) log(
5220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    "poll: hangupPendingMO, hangup conn " + i);
52322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            hangup(mConnections[i]);
5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        } catch (CallStateException ex) {
525ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                            Rlog.e(LOG_TAG, "unexpected error on hangup");
5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Do not continue processing this poll
5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Wait for hangup and repoll
5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        return;
5310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
5330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (Phone.DEBUG_PHONE) {
53422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        log("pendingMo=" + mPendingMO + ", dc=" + dc);
5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
536e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                    mConnections[i] = new CdmaConnection(mPhone.getContext(), dc, this, i);
537e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam
538e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                    if (mHandoverConnection != null) {
539e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        // Single Radio Voice Call Continuity (SRVCC) completed
540e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        mPhone.migrateFrom((PhoneBase) mPhone.getImsPhone());
541e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        mConnections[i].migrateFrom(mHandoverConnection);
542e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        mPhone.notifyHandoverStateChanged(mConnections[i]);
543e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        mHandoverConnection = null;
544e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                    } else {
545e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        // find if the MT call is a new ring or unknown connection
546e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        newRinging = checkMtFindNewRinging(dc,i);
547e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        if (newRinging == null) {
548e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                            unknownConnectionAppeared = true;
549e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                        }
5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    checkAndEnableDataCallAfterEmergencyCallDropped();
5520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
5530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                hasNonHangupStateChanged = true;
5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (conn != null && dc == null) {
5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // This case means the RIL has no more active call anymore and
5560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // we need to clean up the foregroundCall and ringingCall.
5570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Loop through foreground call connections as
5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // it contains the known logical connections.
55922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                int count = mForegroundCall.mConnections.size();
5600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                for (int n = 0; n < count; n++) {
5610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (Phone.DEBUG_PHONE) log("adding fgCall cn " + n + " to droppedDuringPoll");
56222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    CdmaConnection cn = (CdmaConnection)mForegroundCall.mConnections.get(n);
56322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mDroppedDuringPoll.add(cn);
5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
56522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                count = mRingingCall.mConnections.size();
5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Loop through ringing call connections as
5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // it may contain the known logical connections.
5680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                for (int n = 0; n < count; n++) {
5690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (Phone.DEBUG_PHONE) log("adding rgCall cn " + n + " to droppedDuringPoll");
57022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    CdmaConnection cn = (CdmaConnection)mRingingCall.mConnections.get(n);
57122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mDroppedDuringPoll.add(cn);
5720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
57322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mForegroundCall.setGeneric(false);
57422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRingingCall.setGeneric(false);
5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Re-start Ecm timer when the connected emergency call ends
5770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (mIsEcmTimerCanceled) {
578cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    handleEcmTimer(CDMAPhone.RESTART_ECM_TIMER);
5790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
5800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // If emergency call is not going through while dialing
5810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                checkAndEnableDataCallAfterEmergencyCallDropped();
5820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Dropped connections are removed from the CallTracker
5840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // list but kept in the Call list
58522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mConnections[i] = null;
5860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (conn != null && dc != null) { /* implicit conn.compareTo(dc) */
5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Call collision case
58822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (conn.mIsIncoming != dc.isMT) {
5890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (dc.isMT == true){
5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Mt call takes precedence than Mo,drops Mo
59122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mDroppedDuringPoll.add(conn);
5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // find if the MT call is a new ring or unknown connection
5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        newRinging = checkMtFindNewRinging(dc,i);
5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (newRinging == null) {
5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            unknownConnectionAppeared = true;
5960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
5970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        checkAndEnableDataCallAfterEmergencyCallDropped();
5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Call info stored in conn is not consistent with the call info from dc.
6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // We should follow the rule of MT calls taking precedence over MO calls
6010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // when there is conflict, so here we drop the call info from dc and
6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // continue to use the call info from conn, and only take a log.
603ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                        Rlog.e(LOG_TAG,"Error in RIL, Phantom call appeared " + dc);
6040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
6050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    boolean changed;
6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    changed = conn.update(dc);
6080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    hasNonHangupStateChanged = hasNonHangupStateChanged || changed;
6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
6100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (REPEAT_POLLING) {
6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (dc != null) {
6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // FIXME with RIL, we should not need this anymore
6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if ((dc.state == DriverCall.State.DIALING
6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            /*&& cm.getOption(cm.OPTION_POLL_DIALING)*/)
6170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        || (dc.state == DriverCall.State.ALERTING
6180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            /*&& cm.getOption(cm.OPTION_POLL_ALERTING)*/)
6190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        || (dc.state == DriverCall.State.INCOMING
6200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            /*&& cm.getOption(cm.OPTION_POLL_INCOMING)*/)
6210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        || (dc.state == DriverCall.State.WAITING
6220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            /*&& cm.getOption(cm.OPTION_POLL_WAITING)*/)
6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ) {
6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Sometimes there's no unsolicited notification
6250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // for state transitions
6260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        needsPollDelay = true;
6270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
6280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
6290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
6300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This is the first poll after an ATD.
6330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // We expect the pending call to appear in the list
6340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // If it does not, we land here
63522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mPendingMO != null) {
636ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.d(LOG_TAG,"Pending MO dropped before poll fg state:"
63722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            + mForegroundCall.getState());
6380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
63922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mDroppedDuringPoll.add(mPendingMO);
64022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPendingMO = null;
64122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mHangupPendingMO = false;
64222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if( mPendingCallInEcm) {
64322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPendingCallInEcm = false;
6440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
6450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (newRinging != null) {
64822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyNewRingingConnection(newRinging);
6490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // clear the "local hangup" and "missed/rejected call"
6520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // cases from the "dropped during poll" list
6530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // These cases need no "last call fail" reason
65422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        for (int i = mDroppedDuringPoll.size() - 1; i >= 0 ; i--) {
65522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            CdmaConnection conn = mDroppedDuringPoll.get(i);
6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (conn.isIncoming() && conn.getConnectTime() == 0) {
6580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Missed or rejected call
659b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen                int cause;
660b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen                if (conn.mCause == DisconnectCause.LOCAL) {
661b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen                    cause = DisconnectCause.INCOMING_REJECTED;
6620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
663b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen                    cause = DisconnectCause.INCOMING_MISSED;
6640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
6650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (Phone.DEBUG_PHONE) {
66722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    log("missed/rejected call, conn.cause=" + conn.mCause);
6680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    log("setting cause to " + cause);
6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
67022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDroppedDuringPoll.remove(i);
671368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann                hasAnyCallDisconnected |= conn.onDisconnect(cause);
672b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen            } else if (conn.mCause == DisconnectCause.LOCAL
673b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen                    || conn.mCause == DisconnectCause.INVALID_NUMBER) {
67422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDroppedDuringPoll.remove(i);
675368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann                hasAnyCallDisconnected |= conn.onDisconnect(conn.mCause);
6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Any non-local disconnects: determine cause
68022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mDroppedDuringPoll.size() > 0) {
68122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.getLastCallFailCause(
6820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                obtainNoPollCompleteMessage(EVENT_GET_LAST_CALL_FAIL_CAUSE));
6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (needsPollDelay) {
6860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollCallsAfterDelay();
6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Cases when we can no longer keep disconnected Connection's
6900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // with their previous calls
6910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // 1) the phone has started to ring
6920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // 2) A Call/Connection object has changed state...
6930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //    we may have switched or held or answered (but not hung up)
694368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann        if (newRinging != null || hasNonHangupStateChanged || hasAnyCallDisconnected) {
6950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            internalClearDisconnected();
6960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        updatePhoneState();
6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (unknownConnectionAppeared) {
70122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyUnknownConnection();
7020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
704368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann        if (hasNonHangupStateChanged || newRinging != null || hasAnyCallDisconnected) {
70522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyPreciseCallStateChanged();
7060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //dumpState();
7090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Called from CdmaConnection
7120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void
7130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    hangup (CdmaConnection conn) throws CallStateException {
71422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (conn.mOwner != this) {
7150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException ("CdmaConnection " + conn
7160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    + "does not belong to CdmaCallTracker " + this);
7170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
71922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (conn == mPendingMO) {
7200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // We're hanging up an outgoing call that doesn't have it's
7210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // GSM index assigned yet
7220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (Phone.DEBUG_PHONE) log("hangup: set hangupPendingMO to true");
72422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mHangupPendingMO = true;
72522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if ((conn.getCall() == mRingingCall)
72622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && (mRingingCall.getState() == CdmaCall.State.WAITING)) {
7270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Handle call waiting hang up case.
7280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //
7290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // The ringingCall state will change to IDLE in CdmaCall.detach
7300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // if the ringing call connection size is 0. We don't specifically
7310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // set the ringing call state to IDLE here to avoid a race condition
7320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // where a new call waiting could get a hang up from an old call
7330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // waiting ringingCall.
7340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //
7350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // PhoneApp does the call log itself since only PhoneApp knows
7360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // the hangup reason is user ignoring or timing out. So conn.onDisconnect()
7370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // is not called here. Instead, conn.onLocalDisconnect() is called.
7380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            conn.onLocalDisconnect();
7390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            updatePhoneState();
74022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyPreciseCallStateChanged();
7410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
7420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
7430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
74422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCi.hangupConnection (conn.getCDMAIndex(), obtainCompleteMessage());
7450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (CallStateException ex) {
7460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Ignore "connection not found"
7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Call may have hung up already
748ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                Rlog.w(LOG_TAG,"CdmaCallTracker WARN: hangup() on absent connection "
7490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                + conn);
7500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
7510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        conn.onHangupLocal();
7540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void
7570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    separate (CdmaConnection conn) throws CallStateException {
75822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (conn.mOwner != this) {
7590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException ("CdmaConnection " + conn
7600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    + "does not belong to CdmaCallTracker " + this);
7610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
76322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.separateConnection (conn.getCDMAIndex(),
7640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                obtainCompleteMessage(EVENT_SEPARATE_RESULT));
7650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (CallStateException ex) {
7660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Ignore "connection not found"
7670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Call may have hung up already
768ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.w(LOG_TAG,"CdmaCallTracker WARN: separate() on absent connection "
7690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                          + conn);
7700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Called from CDMAPhone
7740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void
7760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    setMute(boolean mute) {
77722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mDesiredMute = mute;
77822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setMute(mDesiredMute, null);
7790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ boolean
7820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getMute() {
78322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mDesiredMute;
7840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Called from CdmaCall
7880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* package */ void
7900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    hangup (CdmaCall call) throws CallStateException {
7910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (call.getConnections().size() == 0) {
7920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("no connections in call");
7930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
79522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (call == mRingingCall) {
7960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (Phone.DEBUG_PHONE) log("(ringing) hangup waiting or background");
79722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.hangupWaitingOrBackground(obtainCompleteMessage());
79822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (call == mForegroundCall) {
7990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (call.isDialingOrAlerting()) {
8000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (Phone.DEBUG_PHONE) {
8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    log("(foregnd) hangup dialing or alerting...");
8020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
8030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                hangup((CdmaConnection)(call.getConnections().get(0)));
8040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
8050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                hangupForegroundResumeBackground();
8060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
80722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (call == mBackgroundCall) {
80822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (mRingingCall.isRinging()) {
8090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (Phone.DEBUG_PHONE) {
8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    log("hangup all conns in background call");
8110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
8120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                hangupAllConnections(call);
8130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
8140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                hangupWaitingOrBackground();
8150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
8160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
8170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new RuntimeException ("CdmaCall " + call +
8180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "does not belong to CdmaCallTracker " + this);
8190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        call.onHangupLocal();
82222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.notifyPreciseCallStateChanged();
8230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* package */
8260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void hangupWaitingOrBackground() {
8270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (Phone.DEBUG_PHONE) log("hangupWaitingOrBackground");
82822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.hangupWaitingOrBackground(obtainCompleteMessage());
8290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* package */
8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void hangupForegroundResumeBackground() {
8330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (Phone.DEBUG_PHONE) log("hangupForegroundResumeBackground");
83422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.hangupForegroundResumeBackground(obtainCompleteMessage());
8350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void hangupConnectionByIndex(CdmaCall call, int index)
8380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throws CallStateException {
83922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        int count = call.mConnections.size();
8400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0; i < count; i++) {
84122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            CdmaConnection cn = (CdmaConnection)call.mConnections.get(i);
8420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (cn.getCDMAIndex() == index) {
84322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCi.hangupConnection(index, obtainCompleteMessage());
8440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return;
8450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
8460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        throw new CallStateException("no gsm index found");
8490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
851cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    void hangupAllConnections(CdmaCall call) {
8520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
85322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            int count = call.mConnections.size();
8540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (int i = 0; i < count; i++) {
85522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                CdmaConnection cn = (CdmaConnection)call.mConnections.get(i);
85622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCi.hangupConnection(cn.getCDMAIndex(), obtainCompleteMessage());
8570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
8580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (CallStateException ex) {
859ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.e(LOG_TAG, "hangupConnectionByIndex caught " + ex);
8600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* package */
8640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    CdmaConnection getConnectionByIndex(CdmaCall call, int index)
8650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throws CallStateException {
86622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        int count = call.mConnections.size();
8670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0; i < count; i++) {
86822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            CdmaConnection cn = (CdmaConnection)call.mConnections.get(i);
8690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (cn.getCDMAIndex() == index) {
8700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return cn;
8710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
8720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
8750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
877cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private void flashAndSetGenericTrue() {
87822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.sendCDMAFeatureCode("", obtainMessage(EVENT_SWITCH_RESULT));
8790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Set generic to true because in CDMA it is not known what
8810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // the status of the call is after a call waiting is answered,
8820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // 3 way call merged or a switch between calls.
88322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mForegroundCall.setGeneric(true);
88422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.notifyPreciseCallStateChanged();
8850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void handleRadioNotAvailable() {
8880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // handlePollCalls will clear out its
8890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // call list when it gets the CommandException
8900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // error result from this
8910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pollCallsWhenSafe();
8920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void notifyCallWaitingInfo(CdmaCallWaitingNotification obj) {
89522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mCallWaitingRegistrants != null) {
89622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCallWaitingRegistrants.notifyRegistrants(new AsyncResult(null, obj, null));
8970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void handleCallWaitingInfo (CdmaCallWaitingNotification cw) {
9010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Check how many connections in foregroundCall.
9020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // If the connection in foregroundCall is more
9030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // than one, then the connection information is
9040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // not reliable anymore since it means either
9050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // call waiting is connected or 3 way call is
9060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // dialed before, so set generic.
90722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mForegroundCall.mConnections.size() > 1 ) {
90822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mForegroundCall.setGeneric(true);
9090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Create a new CdmaConnection which attaches itself to ringingCall.
91222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRingingCall.setGeneric(false);
91322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        new CdmaConnection(mPhone.getContext(), cw, this, mRingingCall);
9140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        updatePhoneState();
9150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Finally notify application
9170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        notifyCallWaitingInfo(cw);
9180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //****** Overridden from Handler
9200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
921cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
9220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
9230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    handleMessage (Message msg) {
9240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar;
9250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9265e2000b856a7959609e8f15148a3584ec372f865Wink Saville        if (!mPhone.mIsTheCurrentActivePhone) {
9275e2000b856a7959609e8f15148a3584ec372f865Wink Saville            Rlog.w(LOG_TAG, "Ignoring events received on inactive CdmaPhone");
9285e2000b856a7959609e8f15148a3584ec372f865Wink Saville            return;
9295e2000b856a7959609e8f15148a3584ec372f865Wink Saville        }
9300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (msg.what) {
9310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_POLL_CALLS_RESULT:{
932ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                Rlog.d(LOG_TAG, "Event EVENT_POLL_CALLS_RESULT Received");
9330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
9340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
93522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if(msg == mLastRelevantPoll) {
9360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if(DBG_POLL) log(
9370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            "handle EVENT_POLL_CALL_RESULT: set needsPoll=F");
93822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mNeedsPoll = false;
93922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mLastRelevantPoll = null;
9400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    handlePollCalls((AsyncResult)msg.obj);
9410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
9420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
9430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_OPERATION_COMPLETE:
9460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                operationComplete();
9470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_SWITCH_RESULT:
9500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                 // In GSM call operationComplete() here which gets the
9510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                 // current call list. But in CDMA there is no list so
9520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                 // there is nothing to do.
9530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_GET_LAST_CALL_FAIL_CAUSE:
9560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                int causeCode;
9570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
9580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                operationComplete();
9600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception != null) {
9620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // An exception occurred...just treat the disconnect
9630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // cause as "normal"
9640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    causeCode = CallFailCause.NORMAL_CLEARING;
965ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                    Rlog.i(LOG_TAG,
9660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            "Exception during getLastCallFailCause, assuming normal disconnect");
9670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
9680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    causeCode = ((int[])ar.result)[0];
9690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
9700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
97122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                for (int i = 0, s =  mDroppedDuringPoll.size()
9720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        ; i < s ; i++
9730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ) {
97422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    CdmaConnection conn = mDroppedDuringPoll.get(i);
9750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    conn.onRemoteDisconnect(causeCode);
9770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
9780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                updatePhoneState();
9800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
98122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.notifyPreciseCallStateChanged();
98222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDroppedDuringPoll.clear();
9830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_REPOLL_AFTER_DELAY:
9860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_CALL_STATE_CHANGE:
9870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                pollCallsWhenSafe();
9880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_RADIO_AVAILABLE:
9910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                handleRadioAvailable();
9920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_RADIO_NOT_AVAILABLE:
9950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                handleRadioNotAvailable();
9960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_EXIT_ECM_RESPONSE_CDMA:
999e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                // no matter the result, we still do the same here
1000e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                if (mPendingCallInEcm) {
1001e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                    mCi.dial(mPendingMO.getAddress(), mPendingCallClirMode, obtainCompleteMessage());
1002e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                    mPendingCallInEcm = false;
1003e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                }
1004e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam                mPhone.unsetOnEcbModeExitResponse(this);
10050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
10060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_CALL_WAITING_INFO_CDMA:
10080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville               ar = (AsyncResult)msg.obj;
10090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville               if (ar.exception == null) {
10100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                   handleCallWaitingInfo((CdmaCallWaitingNotification)ar.result);
1011ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                   Rlog.d(LOG_TAG, "Event EVENT_CALL_WAITING_INFO_CDMA Received");
10120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville               }
10130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
10140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_THREE_WAY_DIAL_L2_RESULT_CDMA:
10160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
10170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception == null) {
10180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // Assume 3 way call is connected
101922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO.onConnectedInOrOut();
102022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO = null;
10210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
10220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
10230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:{
10250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville               throw new RuntimeException("unexpected event not handled");
10260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Handle Ecm timer to be canceled or re-started
10320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void handleEcmTimer(int action) {
103422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.handleTimerInEmergencyCallbackMode(action);
10350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch(action) {
10360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CDMAPhone.CANCEL_ECM_TIMER: mIsEcmTimerCanceled = true; break;
10370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CDMAPhone.RESTART_ECM_TIMER: mIsEcmTimerCanceled = false; break;
10380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        default:
1039ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.e(LOG_TAG, "handleEcmTimer, unsupported action " + action);
10400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Disable data call when emergency call is connected
10450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void disableDataCallInEmergencyCall(String dialString) {
1047f4f5308a309d43fcfca8d0d5fbb54bc38c82ca3fYorke Lee        if (PhoneNumberUtils.isLocalEmergencyNumber(mPhone.getContext(), dialString)) {
10480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (Phone.DEBUG_PHONE) log("disableDataCallInEmergencyCall");
10490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mIsInEmergencyCall = true;
1050454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville            mPhone.mDcTracker.setInternalDataEnabled(false);
10510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Check and enable data call after an emergency call is dropped if it's
10560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * not in ECM
10570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void checkAndEnableDataCallAfterEmergencyCallDropped() {
10590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mIsInEmergencyCall) {
10600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mIsInEmergencyCall = false;
10610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
10620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (Phone.DEBUG_PHONE) {
10630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                log("checkAndEnableDataCallAfterEmergencyCallDropped,inEcm=" + inEcm);
10640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (inEcm.compareTo("false") == 0) {
10660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Re-initiate data connection
1067454b1dfd508844b42eb775e4ab2359be74d3672bWink Saville                mPhone.mDcTracker.setInternalDataEnabled(true);
10680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Check the MT call to see if it's a new ring or
10740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * a unknown connection.
10750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Connection checkMtFindNewRinging(DriverCall dc, int i) {
10770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Connection newRinging = null;
10790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // it's a ringing call
108122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mConnections[i].getCall() == mRingingCall) {
108222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            newRinging = mConnections[i];
10830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (Phone.DEBUG_PHONE) log("Notify new ring " + dc);
10840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
10850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Something strange happened: a call which is neither
10860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // a ringing call nor the one we created. It could be the
10870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // call collision result from RIL
1088ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.e(LOG_TAG,"Phantom call appeared " + dc);
10890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // If it's a connected call, set the connect time so that
10900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // it's non-zero.  It may not be accurate, but at least
10910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // it won't appear as a Missed Call.
10920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (dc.state != DriverCall.State.ALERTING
10930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                && dc.state != DriverCall.State.DIALING) {
109422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mConnections[i].onConnectedInOrOut();
10959b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam                if (dc.state == DriverCall.State.HOLDING) {
10969b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam                    // We've transitioned into HOLDING
109722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mConnections[i].onStartedHolding();
10989b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam                }
10990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
11000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
11010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return newRinging;
11020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Check if current call is in emergency call
11060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
11070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if it is in emergency call
11080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         false if it is not in emergency call
11090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
11100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean isInEmergencyCall() {
11110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mIsInEmergencyCall;
11120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1114cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
11150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void log(String msg) {
1116ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.d(LOG_TAG, "[CdmaCallTracker] " + msg);
11170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
11200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
11210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println("GsmCallTracker extends:");
11220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.dump(fd, pw, args);
112322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println("droppedDuringPoll: length=" + mConnections.length);
112422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        for(int i=0; i < mConnections.length; i++) {
112522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            pw.printf(" mConnections[%d]=%s\n", i, mConnections[i]);
11260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
112722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mVoiceCallEndedRegistrants=" + mVoiceCallEndedRegistrants);
112822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mVoiceCallStartedRegistrants=" + mVoiceCallStartedRegistrants);
112922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mCallWaitingRegistrants=" + mCallWaitingRegistrants);
113022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println("droppedDuringPoll: size=" + mDroppedDuringPoll.size());
113122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        for(int i = 0; i < mDroppedDuringPoll.size(); i++) {
113222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            pw.printf( " mDroppedDuringPoll[%d]=%s\n", i, mDroppedDuringPoll.get(i));
11330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
113422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mRingingCall=" + mRingingCall);
113522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mForegroundCall=" + mForegroundCall);
113622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mBackgroundCall=" + mBackgroundCall);
113722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mPendingMO=" + mPendingMO);
113822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mHangupPendingMO=" + mHangupPendingMO);
113922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mPendingCallInEcm=" + mPendingCallInEcm);
11400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mIsInEmergencyCall=" + mIsInEmergencyCall);
114122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mPhone=" + mPhone);
114222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mDesiredMute=" + mDesiredMute);
114322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mPendingCallClirMode=" + mPendingCallClirMode);
114422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mState=" + mState);
11450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mIsEcmTimerCanceled=" + mIsEcmTimerCanceled);
11460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
1148