GsmCdmaCallTracker.java revision 22d85a8e3a575a6d01d2c788587971657dfe20c6
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;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.PhoneNumberUtils;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState;
26ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallStateException;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallTracker;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CommandsInterface;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Connection;
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.DriverCall;
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Phone;
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneConstants;
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.TelephonyProperties;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.FileDescriptor;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.io.PrintWriter;
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@hide}
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic final class CdmaCallTracker extends CallTracker {
48cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    static final String LOG_TAG = "CdmaCallTracker";
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final boolean REPEAT_POLLING = false;
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final boolean DBG_POLL = false;
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Constants
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final int MAX_CONNECTIONS = 1;   // only 1 connection allowed in CDMA
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static final int MAX_CONNECTIONS_PER_CALL = 1; // only 1 connection allowed per call
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Instance Variables
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CdmaConnection mConnections[] = new CdmaConnection[MAX_CONNECTIONS];
6222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    RegistrantList mVoiceCallEndedRegistrants = new RegistrantList();
6322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    RegistrantList mVoiceCallStartedRegistrants = new RegistrantList();
6422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    RegistrantList mCallWaitingRegistrants =  new RegistrantList();
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // connections dropped during last poll
6822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    ArrayList<CdmaConnection> mDroppedDuringPoll
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        = new ArrayList<CdmaConnection>(MAX_CONNECTIONS);
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CdmaCall mRingingCall = new CdmaCall(this);
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // A call that is ringing or (call) waiting
7322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CdmaCall mForegroundCall = new CdmaCall(this);
7422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CdmaCall mBackgroundCall = new CdmaCall(this);
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CdmaConnection mPendingMO;
7722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    boolean mHangupPendingMO;
7822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    boolean mPendingCallInEcm=false;
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean mIsInEmergencyCall = false;
8022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    CDMAPhone mPhone;
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    boolean mDesiredMute = false;    // false = mute off
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    int mPendingCallClirMode;
8522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    PhoneConstants.State mState = PhoneConstants.State.IDLE;
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean mIsEcmTimerCanceled = false;
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville//    boolean needsPoll;
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Events
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Constructors
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    CdmaCallTracker(CDMAPhone phone) {
9722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone = phone;
9822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi = phone.mCi;
9922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForCallStateChanged(this, EVENT_CALL_STATE_CHANGE, null);
10022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForOn(this, EVENT_RADIO_AVAILABLE, null);
10122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForNotAvailable(this, EVENT_RADIO_NOT_AVAILABLE, null);
10222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.registerForCallWaitingInfo(this, EVENT_CALL_WAITING_INFO_CDMA, null);
10322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mForegroundCall.setGeneric(false);
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dispose() {
10722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForCallStateChanged(this);
10822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForOn(this);
10922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForNotAvailable(this);
11022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.unregisterForCallWaitingInfo(this);
11122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        for(CdmaConnection c : mConnections) {
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if(c != null) hangup(c);
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (CallStateException ex) {
115ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                Rlog.e(LOG_TAG, "unexpected error on hangup during dispose");
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
12022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if(mPendingMO != null) hangup(mPendingMO);
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (CallStateException ex) {
122ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.e(LOG_TAG, "unexpected error on hangup during dispose");
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        clearDisconnected();
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void finalize() {
131ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.d(LOG_TAG, "CdmaCallTracker finalized");
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Instance Methods
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Public Methods
137cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForVoiceCallStarted(Handler h, int what, Object obj) {
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Registrant r = new Registrant(h, what, obj);
14022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceCallStartedRegistrants.add(r);
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Notify if in call when registering
14222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mState != PhoneConstants.State.IDLE) {
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            r.notifyRegistrant(new AsyncResult(null, null, null));
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
146cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForVoiceCallStarted(Handler h) {
14822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceCallStartedRegistrants.remove(h);
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
151cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForVoiceCallEnded(Handler h, int what, Object obj) {
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Registrant r = new Registrant(h, what, obj);
15422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceCallEndedRegistrants.add(r);
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
157cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForVoiceCallEnded(Handler h) {
15922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mVoiceCallEndedRegistrants.remove(h);
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForCallWaiting(Handler h, int what, Object obj) {
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Registrant r = new Registrant (h, what, obj);
16422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCallWaitingRegistrants.add(r);
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForCallWaiting(Handler h) {
16822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCallWaitingRegistrants.remove(h);
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * clirMode is one of the CLIR_ constants
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Connection
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    dial (String dialString, int clirMode) throws CallStateException {
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // note that this triggers call state changed notif
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        clearDisconnected();
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!canDial()) {
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("cannot dial in current state");
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean isPhoneInEcmMode = inEcm.equals("true");
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean isEmergencyCall =
18622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                PhoneNumberUtils.isLocalEmergencyNumber(dialString, mPhone.getContext());
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Cancel Ecm timer if a second emergency call is originating in Ecm mode
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (isPhoneInEcmMode && isEmergencyCall) {
190cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            handleEcmTimer(CDMAPhone.CANCEL_ECM_TIMER);
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // We are initiating a call therefore even if we previously
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // didn't know the state (i.e. Generic was true) we now know
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // and therefore can set Generic to false.
19622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mForegroundCall.setGeneric(false);
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // The new call must be assigned to the foreground call.
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // That call must be idle, so place anything that's
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // there on hold
20122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mForegroundCall.getState() == CdmaCall.State.ACTIVE) {
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return dialThreeWay(dialString);
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
20522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPendingMO = new CdmaConnection(mPhone.getContext(), checkForTestEmergencyNumber(dialString),
20622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                this, mForegroundCall);
20722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mHangupPendingMO = false;
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
20922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mPendingMO.mAddress == null || mPendingMO.mAddress.length() == 0
21022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            || mPendingMO.mAddress.indexOf(PhoneNumberUtils.WILD) >= 0) {
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Phone number is invalid
21222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPendingMO.mCause = Connection.DisconnectCause.INVALID_NUMBER;
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // handlePollCalls() will notice this call not present
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // and will mark it as dropped.
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollCallsWhenSafe();
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Always unmute when initiating a new call
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setMute(false);
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Check data call
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            disableDataCallInEmergencyCall(dialString);
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // In Ecm mode, if another emergency call is dialed, Ecm mode will not exit.
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if(!isPhoneInEcmMode || (isPhoneInEcmMode && isEmergencyCall)) {
22622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCi.dial(mPendingMO.mAddress, clirMode, obtainCompleteMessage());
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
22822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.exitEmergencyCallbackMode();
22922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.setOnEcbModeExitResponse(this,EVENT_EXIT_ECM_RESPONSE_CDMA, null);
23022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPendingCallClirMode=clirMode;
23122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPendingCallInEcm=true;
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        updatePhoneState();
23622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.notifyPreciseCallStateChanged();
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
23822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mPendingMO;
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    Connection
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    dial (String dialString) throws CallStateException {
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return dial(dialString, CommandsInterface.CLIR_DEFAULT);
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Connection
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    dialThreeWay (String dialString) {
24922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (!mForegroundCall.isIdle()) {
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Check data call
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            disableDataCallInEmergencyCall(dialString);
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Attach the new connection to foregroundCall
25422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPendingMO = new CdmaConnection(mPhone.getContext(),
25522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                                checkForTestEmergencyNumber(dialString), this, mForegroundCall);
25622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.sendCDMAFeatureCode(mPendingMO.mAddress,
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                obtainMessage(EVENT_THREE_WAY_DIAL_L2_RESULT_CDMA));
25822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            return mPendingMO;
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    acceptCall() throws CallStateException {
26522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRingingCall.getState() == CdmaCall.State.INCOMING) {
266ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.i("phone", "acceptCall: incoming...");
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Always unmute when answering a new call
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            setMute(false);
26922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.acceptCall(obtainCompleteMessage());
27022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mRingingCall.getState() == CdmaCall.State.WAITING) {
27122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            CdmaConnection cwConn = (CdmaConnection)(mRingingCall.getLatestConnection());
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Since there is no network response for supplimentary
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // service for CDMA, we assume call waiting is answered.
2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // ringing Call state change to idle is in CdmaCall.detach
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // triggered by updateParent.
27722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            cwConn.updateParent(mRingingCall, mForegroundCall);
2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            cwConn.onConnectedInOrOut();
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            updatePhoneState();
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            switchWaitingOrHoldingAndActive();
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("phone not ringing");
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    rejectCall () throws CallStateException {
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // AT+CHLD=0 means "release held or UDUB"
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // so if the phone isn't ringing, this could hang up held
29022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRingingCall.getState().isRinging()) {
29122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.rejectCall(obtainCompleteMessage());
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("phone not ringing");
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    switchWaitingOrHoldingAndActive() throws CallStateException {
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Should we bother with this check?
30022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRingingCall.getState() == CdmaCall.State.INCOMING) {
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("cannot be in the incoming state");
30222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mForegroundCall.getConnections().size() > 1) {
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            flashAndSetGenericTrue();
3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Send a flash command to CDMA network for putting the other party on hold.
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // For CDMA networks which do not support this the user would just hear a beep
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // from the network. For CDMA networks which do support it will put the other
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // party on hold.
30922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.sendCDMAFeatureCode("", obtainMessage(EVENT_SWITCH_RESULT));
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
314cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    conference() {
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Should we be checking state?
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        flashAndSetGenericTrue();
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
320cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    explicitCallTransfer() {
32122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.explicitCallTransfer(obtainCompleteMessage(EVENT_ECT_RESULT));
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    clearDisconnected() {
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        internalClearDisconnected();
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        updatePhoneState();
32922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.notifyPreciseCallStateChanged();
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    canConference() {
33422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mForegroundCall.getState() == CdmaCall.State.ACTIVE
33522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && mBackgroundCall.getState() == CdmaCall.State.HOLDING
33622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && !mBackgroundCall.isFull()
33722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && !mForegroundCall.isFull();
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    canDial() {
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean ret;
34322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        int serviceState = mPhone.getServiceState().getState();
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String disableCall = SystemProperties.get(
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                TelephonyProperties.PROPERTY_DISABLE_CALL, "false");
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ret = (serviceState != ServiceState.STATE_POWER_OFF)
34822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && mPendingMO == null
34922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && !mRingingCall.isRinging()
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                && !disableCall.equals("true")
35122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && (!mForegroundCall.getState().isAlive()
35222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    || (mForegroundCall.getState() == CdmaCall.State.ACTIVE)
35322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    || !mBackgroundCall.getState().isAlive());
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (!ret) {
3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            log(String.format("canDial is false\n" +
3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                              "((serviceState=%d) != ServiceState.STATE_POWER_OFF)::=%s\n" +
3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                              "&& pendingMO == null::=%s\n" +
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                              "&& !ringingCall.isRinging()::=%s\n" +
3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                              "&& !disableCall.equals(\"true\")::=%s\n" +
3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                              "&& (!foregroundCall.getState().isAlive()::=%s\n" +
3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                              "   || foregroundCall.getState() == CdmaCall.State.ACTIVE::=%s\n" +
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                              "   ||!backgroundCall.getState().isAlive())::=%s)",
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    serviceState,
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    serviceState != ServiceState.STATE_POWER_OFF,
36622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO == null,
36722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    !mRingingCall.isRinging(),
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    !disableCall.equals("true"),
36922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    !mForegroundCall.getState().isAlive(),
37022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mForegroundCall.getState() == CdmaCall.State.ACTIVE,
37122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    !mBackgroundCall.getState().isAlive()));
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return ret;
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    canTransfer() {
378ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.e(LOG_TAG, "canTransfer: not possible in CDMA");
3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Private Instance Methods
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void
3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    internalClearDisconnected() {
38622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRingingCall.clearDisconnected();
38722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mForegroundCall.clearDisconnected();
38822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mBackgroundCall.clearDisconnected();
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() {
3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return obtainCompleteMessage(EVENT_OPERATION_COMPLETE);
3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Obtain a message to use for signalling "invoke getCurrentCalls() when
4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * this operation and all other pending operations are complete
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Message
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    obtainCompleteMessage(int what) {
40622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPendingOperations++;
40722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mLastRelevantPoll = null;
40822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mNeedsPoll = true;
4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG_POLL) log("obtainCompleteMessage: pendingOperations=" +
41122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPendingOperations + ", needsPoll=" + mNeedsPoll);
4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return obtainMessage(what);
4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void
4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    operationComplete() {
41822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPendingOperations--;
4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (DBG_POLL) log("operationComplete: pendingOperations=" +
42122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPendingOperations + ", needsPoll=" + mNeedsPoll);
4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
42322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mPendingOperations == 0 && mNeedsPoll) {
42422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mLastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT);
42522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.getCurrentCalls(mLastRelevantPoll);
42622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mPendingOperations < 0) {
4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // this should never happen
428ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.e(LOG_TAG,"CdmaCallTracker.pendingOperations < 0");
42922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPendingOperations = 0;
4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void
4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    updatePhoneState() {
43722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        PhoneConstants.State oldState = mState;
4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
43922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mRingingCall.isRinging()) {
44022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mState = PhoneConstants.State.RINGING;
44122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mPendingMO != null ||
44222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                !(mForegroundCall.isIdle() && mBackgroundCall.isIdle())) {
44322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mState = PhoneConstants.State.OFFHOOK;
4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
44522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mState = PhoneConstants.State.IDLE;
4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
44822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mState == PhoneConstants.State.IDLE && oldState != mState) {
44922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mVoiceCallEndedRegistrants.notifyRegistrants(
4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                new AsyncResult(null, null, null));
45122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (oldState == PhoneConstants.State.IDLE && oldState != mState) {
45222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mVoiceCallStartedRegistrants.notifyRegistrants (
4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    new AsyncResult(null, null, null));
4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (Phone.DEBUG_PHONE) {
45622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            log("update phone state, old=" + oldState + " new="+ mState);
4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
45822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mState != oldState) {
45922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyPhoneStateChanged();
4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    // ***** Overwritten from CallTracker
4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
465cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void
4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    handlePollCalls(AsyncResult ar) {
4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        List polledCalls;
4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (ar.exception == null) {
4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            polledCalls = (List)ar.result;
4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (isCommandExceptionRadioNotAvailable(ar.exception)) {
4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // just a dummy empty ArrayList to cause the loop
4740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // to hang up all the calls
4750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            polledCalls = new ArrayList();
4760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
4770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Radio probably wasn't ready--try again in a bit
4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // But don't keep polling if the channel is closed
4790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollCallsAfterDelay();
4800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
4810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Connection newRinging = null; //or waiting
4840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean hasNonHangupStateChanged = false;   // Any change besides
4850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                                    // a dropped connection
4860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean needsPollDelay = false;
4870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean unknownConnectionAppeared = false;
4880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0, curDC = 0, dcSize = polledCalls.size()
49022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                ; i < mConnections.length; i++) {
49122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            CdmaConnection conn = mConnections[i];
4920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            DriverCall dc = null;
4930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // polledCall list is sparse
4950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (curDC < dcSize) {
4960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                dc = (DriverCall) polledCalls.get(curDC);
4970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (dc.index == i+1) {
4990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    curDC++;
5000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
5010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    dc = null;
5020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
5030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
5040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (DBG_POLL) log("poll: conn[i=" + i + "]=" +
5060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    conn+", dc=" + dc);
5070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (conn == null && dc != null) {
5090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Connection appeared in CLCC response that we don't know about
51022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mPendingMO != null && mPendingMO.compareTo(dc)) {
5110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
51222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (DBG_POLL) log("poll: pendingMO=" + mPendingMO);
5130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // It's our pending mobile originating call
51522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mConnections[i] = mPendingMO;
51622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO.mIndex = i;
51722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO.update(dc);
51822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO = null;
5190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // Someone has already asked to hangup this call
52122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    if (mHangupPendingMO) {
52222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mHangupPendingMO = false;
5230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Re-start Ecm timer when an uncompleted emergency call ends
5240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (mIsEcmTimerCanceled) {
525cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                            handleEcmTimer(CDMAPhone.RESTART_ECM_TIMER);
5260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
5270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        try {
5290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            if (Phone.DEBUG_PHONE) log(
5300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    "poll: hangupPendingMO, hangup conn " + i);
53122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            hangup(mConnections[i]);
5320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        } catch (CallStateException ex) {
533ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                            Rlog.e(LOG_TAG, "unexpected error on hangup");
5340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
5350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Do not continue processing this poll
5370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Wait for hangup and repoll
5380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        return;
5390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
5400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
5410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (Phone.DEBUG_PHONE) {
54222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        log("pendingMo=" + mPendingMO + ", dc=" + dc);
5430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
5440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // find if the MT call is a new ring or unknown connection
5450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    newRinging = checkMtFindNewRinging(dc,i);
5460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (newRinging == null) {
5470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        unknownConnectionAppeared = true;
5480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
5490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    checkAndEnableDataCallAfterEmergencyCallDropped();
5500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
5510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                hasNonHangupStateChanged = true;
5520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (conn != null && dc == null) {
5530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // This case means the RIL has no more active call anymore and
5540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // we need to clean up the foregroundCall and ringingCall.
5550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Loop through foreground call connections as
5560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // it contains the known logical connections.
55722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                int count = mForegroundCall.mConnections.size();
5580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                for (int n = 0; n < count; n++) {
5590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (Phone.DEBUG_PHONE) log("adding fgCall cn " + n + " to droppedDuringPoll");
56022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    CdmaConnection cn = (CdmaConnection)mForegroundCall.mConnections.get(n);
56122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mDroppedDuringPoll.add(cn);
5620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
56322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                count = mRingingCall.mConnections.size();
5640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Loop through ringing call connections as
5650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // it may contain the known logical connections.
5660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                for (int n = 0; n < count; n++) {
5670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (Phone.DEBUG_PHONE) log("adding rgCall cn " + n + " to droppedDuringPoll");
56822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    CdmaConnection cn = (CdmaConnection)mRingingCall.mConnections.get(n);
56922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mDroppedDuringPoll.add(cn);
5700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
57122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mForegroundCall.setGeneric(false);
57222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mRingingCall.setGeneric(false);
5730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Re-start Ecm timer when the connected emergency call ends
5750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (mIsEcmTimerCanceled) {
576cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                    handleEcmTimer(CDMAPhone.RESTART_ECM_TIMER);
5770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
5780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // If emergency call is not going through while dialing
5790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                checkAndEnableDataCallAfterEmergencyCallDropped();
5800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
5810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Dropped connections are removed from the CallTracker
5820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // list but kept in the Call list
58322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mConnections[i] = null;
5840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else if (conn != null && dc != null) { /* implicit conn.compareTo(dc) */
5850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Call collision case
58622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (conn.mIsIncoming != dc.isMT) {
5870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if (dc.isMT == true){
5880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Mt call takes precedence than Mo,drops Mo
58922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                        mDroppedDuringPoll.add(conn);
5900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // find if the MT call is a new ring or unknown connection
5910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        newRinging = checkMtFindNewRinging(dc,i);
5920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        if (newRinging == null) {
5930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            unknownConnectionAppeared = true;
5940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        }
5950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        checkAndEnableDataCallAfterEmergencyCallDropped();
5960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    } else {
5970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Call info stored in conn is not consistent with the call info from dc.
5980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // We should follow the rule of MT calls taking precedence over MO calls
5990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // when there is conflict, so here we drop the call info from dc and
6000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // continue to use the call info from conn, and only take a log.
601ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                        Rlog.e(LOG_TAG,"Error in RIL, Phantom call appeared " + dc);
6020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
6030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
6040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    boolean changed;
6050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    changed = conn.update(dc);
6060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    hasNonHangupStateChanged = hasNonHangupStateChanged || changed;
6070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
6080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
6090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (REPEAT_POLLING) {
6110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (dc != null) {
6120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // FIXME with RIL, we should not need this anymore
6130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if ((dc.state == DriverCall.State.DIALING
6140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            /*&& cm.getOption(cm.OPTION_POLL_DIALING)*/)
6150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        || (dc.state == DriverCall.State.ALERTING
6160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            /*&& cm.getOption(cm.OPTION_POLL_ALERTING)*/)
6170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        || (dc.state == DriverCall.State.INCOMING
6180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            /*&& cm.getOption(cm.OPTION_POLL_INCOMING)*/)
6190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        || (dc.state == DriverCall.State.WAITING
6200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            /*&& cm.getOption(cm.OPTION_POLL_WAITING)*/)
6210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    ) {
6220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // Sometimes there's no unsolicited notification
6230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        // for state transitions
6240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        needsPollDelay = true;
6250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    }
6260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
6270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
6280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // This is the first poll after an ATD.
6310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // We expect the pending call to appear in the list
6320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // If it does not, we land here
63322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mPendingMO != null) {
634ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.d(LOG_TAG,"Pending MO dropped before poll fg state:"
63522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                            + mForegroundCall.getState());
6360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
63722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mDroppedDuringPoll.add(mPendingMO);
63822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPendingMO = null;
63922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mHangupPendingMO = false;
64022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if( mPendingCallInEcm) {
64122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPendingCallInEcm = false;
6420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
6430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (newRinging != null) {
64622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyNewRingingConnection(newRinging);
6470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // clear the "local hangup" and "missed/rejected call"
6500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // cases from the "dropped during poll" list
6510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // These cases need no "last call fail" reason
65222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        for (int i = mDroppedDuringPoll.size() - 1; i >= 0 ; i--) {
65322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            CdmaConnection conn = mDroppedDuringPoll.get(i);
6540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (conn.isIncoming() && conn.getConnectTime() == 0) {
6560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Missed or rejected call
6570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                Connection.DisconnectCause cause;
65822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (conn.mCause == Connection.DisconnectCause.LOCAL) {
6590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    cause = Connection.DisconnectCause.INCOMING_REJECTED;
6600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
6610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    cause = Connection.DisconnectCause.INCOMING_MISSED;
6620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
6630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (Phone.DEBUG_PHONE) {
66522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    log("missed/rejected call, conn.cause=" + conn.mCause);
6660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    log("setting cause to " + cause);
6670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
66822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDroppedDuringPoll.remove(i);
6690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                conn.onDisconnect(cause);
67022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            } else if (conn.mCause == Connection.DisconnectCause.LOCAL) {
6710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Local hangup
67222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDroppedDuringPoll.remove(i);
6730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                conn.onDisconnect(Connection.DisconnectCause.LOCAL);
67422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            } else if (conn.mCause == Connection.DisconnectCause.INVALID_NUMBER) {
67522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDroppedDuringPoll.remove(i);
6760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                conn.onDisconnect(Connection.DisconnectCause.INVALID_NUMBER);
6770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
6780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Any non-local disconnects: determine cause
68122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mDroppedDuringPoll.size() > 0) {
68222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.getLastCallFailCause(
6830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                obtainNoPollCompleteMessage(EVENT_GET_LAST_CALL_FAIL_CAUSE));
6840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (needsPollDelay) {
6870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            pollCallsAfterDelay();
6880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Cases when we can no longer keep disconnected Connection's
6910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // with their previous calls
6920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // 1) the phone has started to ring
6930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // 2) A Call/Connection object has changed state...
6940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //    we may have switched or held or answered (but not hung up)
6950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (newRinging != null || hasNonHangupStateChanged) {
6960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            internalClearDisconnected();
6970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
6980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        updatePhoneState();
7000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (unknownConnectionAppeared) {
70222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyUnknownConnection();
7030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (hasNonHangupStateChanged || newRinging != null) {
70622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyPreciseCallStateChanged();
7070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        //dumpState();
7100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Called from CdmaConnection
7130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void
7140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    hangup (CdmaConnection conn) throws CallStateException {
71522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (conn.mOwner != this) {
7160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException ("CdmaConnection " + conn
7170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    + "does not belong to CdmaCallTracker " + this);
7180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
72022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (conn == mPendingMO) {
7210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // We're hanging up an outgoing call that doesn't have it's
7220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // GSM index assigned yet
7230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (Phone.DEBUG_PHONE) log("hangup: set hangupPendingMO to true");
72522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mHangupPendingMO = true;
72622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if ((conn.getCall() == mRingingCall)
72722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                && (mRingingCall.getState() == CdmaCall.State.WAITING)) {
7280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Handle call waiting hang up case.
7290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //
7300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // The ringingCall state will change to IDLE in CdmaCall.detach
7310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // if the ringing call connection size is 0. We don't specifically
7320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // set the ringing call state to IDLE here to avoid a race condition
7330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // where a new call waiting could get a hang up from an old call
7340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // waiting ringingCall.
7350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            //
7360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // PhoneApp does the call log itself since only PhoneApp knows
7370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // the hangup reason is user ignoring or timing out. So conn.onDisconnect()
7380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // is not called here. Instead, conn.onLocalDisconnect() is called.
7390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            conn.onLocalDisconnect();
7400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            updatePhoneState();
74122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.notifyPreciseCallStateChanged();
7420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return;
7430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
7440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            try {
74522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCi.hangupConnection (conn.getCDMAIndex(), obtainCompleteMessage());
7460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } catch (CallStateException ex) {
7470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Ignore "connection not found"
7480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Call may have hung up already
749ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                Rlog.w(LOG_TAG,"CdmaCallTracker WARN: hangup() on absent connection "
7500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                + conn);
7510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
7520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        conn.onHangupLocal();
7550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void
7580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    separate (CdmaConnection conn) throws CallStateException {
75922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (conn.mOwner != this) {
7600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException ("CdmaConnection " + conn
7610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                    + "does not belong to CdmaCallTracker " + this);
7620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
76422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.separateConnection (conn.getCDMAIndex(),
7650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                obtainCompleteMessage(EVENT_SEPARATE_RESULT));
7660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (CallStateException ex) {
7670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Ignore "connection not found"
7680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Call may have hung up already
769ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.w(LOG_TAG,"CdmaCallTracker WARN: separate() on absent connection "
7700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                          + conn);
7710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Called from CDMAPhone
7750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ void
7770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    setMute(boolean mute) {
77822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mDesiredMute = mute;
77922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.setMute(mDesiredMute, null);
7800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*package*/ boolean
7830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    getMute() {
78422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mDesiredMute;
7850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
7860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //***** Called from CdmaCall
7890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
7900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* package */ void
7910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    hangup (CdmaCall call) throws CallStateException {
7920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (call.getConnections().size() == 0) {
7930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new CallStateException("no connections in call");
7940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
7950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
79622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (call == mRingingCall) {
7970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (Phone.DEBUG_PHONE) log("(ringing) hangup waiting or background");
79822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCi.hangupWaitingOrBackground(obtainCompleteMessage());
79922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (call == mForegroundCall) {
8000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (call.isDialingOrAlerting()) {
8010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (Phone.DEBUG_PHONE) {
8020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    log("(foregnd) hangup dialing or alerting...");
8030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
8040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                hangup((CdmaConnection)(call.getConnections().get(0)));
8050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
8060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                hangupForegroundResumeBackground();
8070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
80822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (call == mBackgroundCall) {
80922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            if (mRingingCall.isRinging()) {
8100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (Phone.DEBUG_PHONE) {
8110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    log("hangup all conns in background call");
8120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
8130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                hangupAllConnections(call);
8140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            } else {
8150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                hangupWaitingOrBackground();
8160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
8170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
8180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throw new RuntimeException ("CdmaCall " + call +
8190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "does not belong to CdmaCallTracker " + this);
8200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        call.onHangupLocal();
82322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.notifyPreciseCallStateChanged();
8240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* package */
8270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void hangupWaitingOrBackground() {
8280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (Phone.DEBUG_PHONE) log("hangupWaitingOrBackground");
82922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.hangupWaitingOrBackground(obtainCompleteMessage());
8300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* package */
8330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void hangupForegroundResumeBackground() {
8340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (Phone.DEBUG_PHONE) log("hangupForegroundResumeBackground");
83522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.hangupForegroundResumeBackground(obtainCompleteMessage());
8360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void hangupConnectionByIndex(CdmaCall call, int index)
8390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throws CallStateException {
84022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        int count = call.mConnections.size();
8410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0; i < count; i++) {
84222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            CdmaConnection cn = (CdmaConnection)call.mConnections.get(i);
8430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (cn.getCDMAIndex() == index) {
84422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCi.hangupConnection(index, obtainCompleteMessage());
8450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return;
8460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
8470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        throw new CallStateException("no gsm index found");
8500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
852cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    void hangupAllConnections(CdmaCall call) {
8530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
85422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            int count = call.mConnections.size();
8550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            for (int i = 0; i < count; i++) {
85622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                CdmaConnection cn = (CdmaConnection)call.mConnections.get(i);
85722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mCi.hangupConnection(cn.getCDMAIndex(), obtainCompleteMessage());
8580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
8590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (CallStateException ex) {
860ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.e(LOG_TAG, "hangupConnectionByIndex caught " + ex);
8610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /* package */
8650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    CdmaConnection getConnectionByIndex(CdmaCall call, int index)
8660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throws CallStateException {
86722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        int count = call.mConnections.size();
8680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0; i < count; i++) {
86922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            CdmaConnection cn = (CdmaConnection)call.mConnections.get(i);
8700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (cn.getCDMAIndex() == index) {
8710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return cn;
8720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
8730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
8760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
878cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private void flashAndSetGenericTrue() {
87922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCi.sendCDMAFeatureCode("", obtainMessage(EVENT_SWITCH_RESULT));
8800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Set generic to true because in CDMA it is not known what
8820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // the status of the call is after a call waiting is answered,
8830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // 3 way call merged or a switch between calls.
88422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mForegroundCall.setGeneric(true);
88522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.notifyPreciseCallStateChanged();
8860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void handleRadioNotAvailable() {
8890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // handlePollCalls will clear out its
8900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // call list when it gets the CommandException
8910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // error result from this
8920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pollCallsWhenSafe();
8930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
8940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
8950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void notifyCallWaitingInfo(CdmaCallWaitingNotification obj) {
89622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mCallWaitingRegistrants != null) {
89722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mCallWaitingRegistrants.notifyRegistrants(new AsyncResult(null, obj, null));
8980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
8990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void handleCallWaitingInfo (CdmaCallWaitingNotification cw) {
9020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Check how many connections in foregroundCall.
9030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // If the connection in foregroundCall is more
9040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // than one, then the connection information is
9050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // not reliable anymore since it means either
9060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // call waiting is connected or 3 way call is
9070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // dialed before, so set generic.
90822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mForegroundCall.mConnections.size() > 1 ) {
90922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mForegroundCall.setGeneric(true);
9100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
9110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Create a new CdmaConnection which attaches itself to ringingCall.
91322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mRingingCall.setGeneric(false);
91422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        new CdmaConnection(mPhone.getContext(), cw, this, mRingingCall);
9150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        updatePhoneState();
9160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // Finally notify application
9180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        notifyCallWaitingInfo(cw);
9190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
9200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //****** Overridden from Handler
9210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
922cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
9230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void
9240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    handleMessage (Message msg) {
9250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult ar;
9260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (msg.what) {
9280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_POLL_CALLS_RESULT:{
929ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                Rlog.d(LOG_TAG, "Event EVENT_POLL_CALLS_RESULT Received");
9300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
9310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
93222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if(msg == mLastRelevantPoll) {
9330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    if(DBG_POLL) log(
9340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            "handle EVENT_POLL_CALL_RESULT: set needsPoll=F");
93522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mNeedsPoll = false;
93622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mLastRelevantPoll = null;
9370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    handlePollCalls((AsyncResult)msg.obj);
9380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
9390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
9400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_OPERATION_COMPLETE:
9430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                operationComplete();
9440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_SWITCH_RESULT:
9470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                 // In GSM call operationComplete() here which gets the
9480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                 // current call list. But in CDMA there is no list so
9490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                 // there is nothing to do.
9500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_GET_LAST_CALL_FAIL_CAUSE:
9530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                int causeCode;
9540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
9550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                operationComplete();
9570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception != null) {
9590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // An exception occurred...just treat the disconnect
9600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // cause as "normal"
9610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    causeCode = CallFailCause.NORMAL_CLEARING;
962ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                    Rlog.i(LOG_TAG,
9630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            "Exception during getLastCallFailCause, assuming normal disconnect");
9640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                } else {
9650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    causeCode = ((int[])ar.result)[0];
9660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
9670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
96822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                for (int i = 0, s =  mDroppedDuringPoll.size()
9690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                        ; i < s ; i++
9700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ) {
97122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    CdmaConnection conn = mDroppedDuringPoll.get(i);
9720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    conn.onRemoteDisconnect(causeCode);
9740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
9750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                updatePhoneState();
9770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
97822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.notifyPreciseCallStateChanged();
97922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDroppedDuringPoll.clear();
9800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_REPOLL_AFTER_DELAY:
9830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_CALL_STATE_CHANGE:
9840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                pollCallsWhenSafe();
9850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_RADIO_AVAILABLE:
9880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                handleRadioAvailable();
9890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_RADIO_NOT_AVAILABLE:
9920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                handleRadioNotAvailable();
9930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
9940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
9950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_EXIT_ECM_RESPONSE_CDMA:
9960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville               //no matter the result, we still do the same here
99722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville               if (mPendingCallInEcm) {
99822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                   mCi.dial(mPendingMO.mAddress, mPendingCallClirMode, obtainCompleteMessage());
99922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                   mPendingCallInEcm = false;
10000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville               }
100122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville               mPhone.unsetOnEcbModeExitResponse(this);
10020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
10030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_CALL_WAITING_INFO_CDMA:
10050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville               ar = (AsyncResult)msg.obj;
10060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville               if (ar.exception == null) {
10070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                   handleCallWaitingInfo((CdmaCallWaitingNotification)ar.result);
1008ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville                   Rlog.d(LOG_TAG, "Event EVENT_CALL_WAITING_INFO_CDMA Received");
10090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville               }
10100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
10110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case EVENT_THREE_WAY_DIAL_L2_RESULT_CDMA:
10130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                ar = (AsyncResult)msg.obj;
10140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (ar.exception == null) {
10150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    // Assume 3 way call is connected
101622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO.onConnectedInOrOut();
101722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mPendingMO = null;
10180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
10190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            break;
10200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:{
10220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville               throw new RuntimeException("unexpected event not handled");
10230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Handle Ecm timer to be canceled or re-started
10290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void handleEcmTimer(int action) {
103122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPhone.handleTimerInEmergencyCallbackMode(action);
10320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch(action) {
10330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CDMAPhone.CANCEL_ECM_TIMER: mIsEcmTimerCanceled = true; break;
10340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        case CDMAPhone.RESTART_ECM_TIMER: mIsEcmTimerCanceled = false; break;
10350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        default:
1036ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.e(LOG_TAG, "handleEcmTimer, unsupported action " + action);
10370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Disable data call when emergency call is connected
10420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void disableDataCallInEmergencyCall(String dialString) {
104422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (PhoneNumberUtils.isLocalEmergencyNumber(dialString, mPhone.getContext())) {
10450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (Phone.DEBUG_PHONE) log("disableDataCallInEmergencyCall");
10460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mIsInEmergencyCall = true;
104722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            mPhone.mDataConnectionTracker.setInternalDataEnabled(false);
10480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Check and enable data call after an emergency call is dropped if it's
10530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * not in ECM
10540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void checkAndEnableDataCallAfterEmergencyCallDropped() {
10560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (mIsInEmergencyCall) {
10570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            mIsInEmergencyCall = false;
10580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false");
10590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (Phone.DEBUG_PHONE) {
10600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                log("checkAndEnableDataCallAfterEmergencyCallDropped,inEcm=" + inEcm);
10610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (inEcm.compareTo("false") == 0) {
10630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                // Re-initiate data connection
106422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mPhone.mDataConnectionTracker.setInternalDataEnabled(true);
10650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
10680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
10700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Check the MT call to see if it's a new ring or
10710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * a unknown connection.
10720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
10730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private Connection checkMtFindNewRinging(DriverCall dc, int i) {
10740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
10750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Connection newRinging = null;
10760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
107722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mConnections[i] = new CdmaConnection(mPhone.getContext(), dc, this, i);
10780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // it's a ringing call
107922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mConnections[i].getCall() == mRingingCall) {
108022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            newRinging = mConnections[i];
10810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (Phone.DEBUG_PHONE) log("Notify new ring " + dc);
10820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
10830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // Something strange happened: a call which is neither
10840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // a ringing call nor the one we created. It could be the
10850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // call collision result from RIL
1086ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville            Rlog.e(LOG_TAG,"Phantom call appeared " + dc);
10870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // If it's a connected call, set the connect time so that
10880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // it's non-zero.  It may not be accurate, but at least
10890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // it won't appear as a Missed Call.
10900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            if (dc.state != DriverCall.State.ALERTING
10910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                && dc.state != DriverCall.State.DIALING) {
109222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mConnections[i].onConnectedInOrOut();
10939b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam                if (dc.state == DriverCall.State.HOLDING) {
10949b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam                    // We've transitioned into HOLDING
109522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mConnections[i].onStartedHolding();
10969b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam                }
10970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            }
10980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
10990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return newRinging;
11000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
11030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Check if current call is in emergency call
11040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *
11050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * @return true if it is in emergency call
11060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     *         false if it is not in emergency call
11070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
11080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean isInEmergencyCall() {
11090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mIsInEmergencyCall;
11100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1112cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
11130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void log(String msg) {
1114ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville        Rlog.d(LOG_TAG, "[CdmaCallTracker] " + msg);
11150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
11170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
11180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
11190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println("GsmCallTracker extends:");
11200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.dump(fd, pw, args);
112122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println("droppedDuringPoll: length=" + mConnections.length);
112222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        for(int i=0; i < mConnections.length; i++) {
112322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            pw.printf(" mConnections[%d]=%s\n", i, mConnections[i]);
11240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
112522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mVoiceCallEndedRegistrants=" + mVoiceCallEndedRegistrants);
112622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mVoiceCallStartedRegistrants=" + mVoiceCallStartedRegistrants);
112722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mCallWaitingRegistrants=" + mCallWaitingRegistrants);
112822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println("droppedDuringPoll: size=" + mDroppedDuringPoll.size());
112922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        for(int i = 0; i < mDroppedDuringPoll.size(); i++) {
113022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            pw.printf( " mDroppedDuringPoll[%d]=%s\n", i, mDroppedDuringPoll.get(i));
11310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
113222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mRingingCall=" + mRingingCall);
113322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mForegroundCall=" + mForegroundCall);
113422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mBackgroundCall=" + mBackgroundCall);
113522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mPendingMO=" + mPendingMO);
113622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mHangupPendingMO=" + mHangupPendingMO);
113722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mPendingCallInEcm=" + mPendingCallInEcm);
11380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mIsInEmergencyCall=" + mIsInEmergencyCall);
113922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mPhone=" + mPhone);
114022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mDesiredMute=" + mDesiredMute);
114122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mPendingCallClirMode=" + mPendingCallClirMode);
114222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        pw.println(" mState=" + mState);
11430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        pw.println(" mIsEcmTimerCanceled=" + mIsEcmTimerCanceled);
11440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
11450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
1146