19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17767a662ecde33c3979bf02b793d392aca0403162Wink Savillepackage com.android.internal.telephony.cdma; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.AsyncResult; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Registrant; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RegistrantList; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.PhoneNumberUtils; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.ServiceState; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 27dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Savilleimport android.os.SystemProperties; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.CallStateException; 30767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.CallTracker; 31767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.CommandsInterface; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.Connection; 33767a662ecde33c3979bf02b793d392aca0403162Wink Savilleimport com.android.internal.telephony.DriverCall; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.Phone; 35dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Savilleimport com.android.internal.telephony.TelephonyProperties; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 44767a662ecde33c3979bf02b793d392aca0403162Wink Savillepublic final class CdmaCallTracker extends CallTracker { 45767a662ecde33c3979bf02b793d392aca0403162Wink Saville static final String LOG_TAG = "CDMA"; 46767a662ecde33c3979bf02b793d392aca0403162Wink Saville 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean REPEAT_POLLING = false; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DBG_POLL = false; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Constants 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53767a662ecde33c3979bf02b793d392aca0403162Wink Saville static final int MAX_CONNECTIONS = 1; // only 1 connection allowed in CDMA 54767a662ecde33c3979bf02b793d392aca0403162Wink Saville static final int MAX_CONNECTIONS_PER_CALL = 1; // only 1 connection allowed per call 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Instance Variables 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 58767a662ecde33c3979bf02b793d392aca0403162Wink Saville CdmaConnection connections[] = new CdmaConnection[MAX_CONNECTIONS]; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RegistrantList voiceCallEndedRegistrants = new RegistrantList(); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RegistrantList voiceCallStartedRegistrants = new RegistrantList(); 6122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville RegistrantList callWaitingRegistrants = new RegistrantList(); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // connections dropped durin last poll 65767a662ecde33c3979bf02b793d392aca0403162Wink Saville ArrayList<CdmaConnection> droppedDuringPoll 66767a662ecde33c3979bf02b793d392aca0403162Wink Saville = new ArrayList<CdmaConnection>(MAX_CONNECTIONS); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 68767a662ecde33c3979bf02b793d392aca0403162Wink Saville CdmaCall ringingCall = new CdmaCall(this); 69767a662ecde33c3979bf02b793d392aca0403162Wink Saville // A call that is ringing or (call) waiting 70767a662ecde33c3979bf02b793d392aca0403162Wink Saville CdmaCall foregroundCall = new CdmaCall(this); 71767a662ecde33c3979bf02b793d392aca0403162Wink Saville CdmaCall backgroundCall = new CdmaCall(this); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73767a662ecde33c3979bf02b793d392aca0403162Wink Saville CdmaConnection pendingMO; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hangupPendingMO; 7595a1d1a89e383dab893750638c2393dec54833ffWink Saville boolean pendingCallInEcm=false; 761cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang boolean mIsInEmergencyCall = false; 77767a662ecde33c3979bf02b793d392aca0403162Wink Saville CDMAPhone phone; 78767a662ecde33c3979bf02b793d392aca0403162Wink Saville 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean desiredMute = false; // false = mute off 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 81dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville int pendingCallClirMode; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Phone.State state = Phone.State.IDLE; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8495a1d1a89e383dab893750638c2393dec54833ffWink Saville private boolean mIsEcmTimerCanceled = false; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86767a662ecde33c3979bf02b793d392aca0403162Wink Saville// boolean needsPoll; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 90767a662ecde33c3979bf02b793d392aca0403162Wink Saville //***** Events 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Constructors 93767a662ecde33c3979bf02b793d392aca0403162Wink Saville CdmaCallTracker(CDMAPhone phone) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.phone = phone; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cm = phone.mCM; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cm.registerForCallStateChanged(this, EVENT_CALL_STATE_CHANGE, null); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cm.registerForOn(this, EVENT_RADIO_AVAILABLE, null); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cm.registerForNotAvailable(this, EVENT_RADIO_NOT_AVAILABLE, null); 9922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville cm.registerForCallWaitingInfo(this, EVENT_CALL_WAITING_INFO_CDMA, null); 10022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville foregroundCall.setGeneric(false); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 103767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void dispose() { 104767a662ecde33c3979bf02b793d392aca0403162Wink Saville cm.unregisterForCallStateChanged(this); 105767a662ecde33c3979bf02b793d392aca0403162Wink Saville cm.unregisterForOn(this); 106767a662ecde33c3979bf02b793d392aca0403162Wink Saville cm.unregisterForNotAvailable(this); 10722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville cm.unregisterForCallWaitingInfo(this); 108767a662ecde33c3979bf02b793d392aca0403162Wink Saville for(CdmaConnection c : connections) { 109767a662ecde33c3979bf02b793d392aca0403162Wink Saville try { 110767a662ecde33c3979bf02b793d392aca0403162Wink Saville if(c != null) hangup(c); 111767a662ecde33c3979bf02b793d392aca0403162Wink Saville } catch (CallStateException ex) { 112767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.e(LOG_TAG, "unexpected error on hangup during dispose"); 113767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 114767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 115767a662ecde33c3979bf02b793d392aca0403162Wink Saville 116767a662ecde33c3979bf02b793d392aca0403162Wink Saville try { 117767a662ecde33c3979bf02b793d392aca0403162Wink Saville if(pendingMO != null) hangup(pendingMO); 118767a662ecde33c3979bf02b793d392aca0403162Wink Saville } catch (CallStateException ex) { 119767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.e(LOG_TAG, "unexpected error on hangup during dispose"); 120767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 121767a662ecde33c3979bf02b793d392aca0403162Wink Saville 122767a662ecde33c3979bf02b793d392aca0403162Wink Saville clearDisconnected(); 123767a662ecde33c3979bf02b793d392aca0403162Wink Saville 124767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 125767a662ecde33c3979bf02b793d392aca0403162Wink Saville 126dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville @Override 127767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void finalize() { 128767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.d(LOG_TAG, "CdmaCallTracker finalized"); 129767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 130767a662ecde33c3979bf02b793d392aca0403162Wink Saville 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Instance Methods 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Public Methods 134767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void registerForVoiceCallStarted(Handler h, int what, Object obj) { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Registrant r = new Registrant(h, what, obj); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project voiceCallStartedRegistrants.add(r); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 138767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void unregisterForVoiceCallStarted(Handler h) { 139767a662ecde33c3979bf02b793d392aca0403162Wink Saville voiceCallStartedRegistrants.remove(h); 140767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 142767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void registerForVoiceCallEnded(Handler h, int what, Object obj) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Registrant r = new Registrant(h, what, obj); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project voiceCallEndedRegistrants.add(r); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 147767a662ecde33c3979bf02b793d392aca0403162Wink Saville public void unregisterForVoiceCallEnded(Handler h) { 148767a662ecde33c3979bf02b793d392aca0403162Wink Saville voiceCallEndedRegistrants.remove(h); 149767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 150767a662ecde33c3979bf02b793d392aca0403162Wink Saville 15122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville public void registerForCallWaiting(Handler h, int what, Object obj) { 15222ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville Registrant r = new Registrant (h, what, obj); 15322ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville callWaitingRegistrants.add(r); 15422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville } 15522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville 15622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville public void unregisterForCallWaiting(Handler h) { 15722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville callWaitingRegistrants.remove(h); 15822ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville } 15922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void 161767a662ecde33c3979bf02b793d392aca0403162Wink Saville fakeHoldForegroundBeforeDial() { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List<Connection> connCopy; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We need to make a copy here, since fakeHoldBeforeDial() 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // modifies the lists, and we don't want to reverse the order 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project connCopy = (List<Connection>) foregroundCall.connections.clone(); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, s = connCopy.size() ; i < s ; i++) { 169767a662ecde33c3979bf02b793d392aca0403162Wink Saville CdmaConnection conn = (CdmaConnection)connCopy.get(i); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project conn.fakeHoldBeforeDial(); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clirMode is one of the CLIR_ constants 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Connection 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dial (String dialString, int clirMode) throws CallStateException { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // note that this triggers call state changed notif 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearDisconnected(); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!canDial()) { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new CallStateException("cannot dial in current state"); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18795a1d1a89e383dab893750638c2393dec54833ffWink Saville String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false"); 18895a1d1a89e383dab893750638c2393dec54833ffWink Saville boolean isPhoneInEcmMode = inEcm.equals("true"); 18995a1d1a89e383dab893750638c2393dec54833ffWink Saville boolean isEmergencyCall = PhoneNumberUtils.isEmergencyNumber(dialString); 19095a1d1a89e383dab893750638c2393dec54833ffWink Saville 19195a1d1a89e383dab893750638c2393dec54833ffWink Saville // Cancel Ecm timer if a second emergency call is originating in Ecm mode 19295a1d1a89e383dab893750638c2393dec54833ffWink Saville if (isPhoneInEcmMode && isEmergencyCall) { 19395a1d1a89e383dab893750638c2393dec54833ffWink Saville handleEcmTimer(phone.CANCEL_ECM_TIMER); 19495a1d1a89e383dab893750638c2393dec54833ffWink Saville } 19522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville 19622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // We are initiating a call therefore even if we previously 19722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // didn't know the state (i.e. Generic was true) we now know 19822ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // and therefore can set Generic to false. 19922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville foregroundCall.setGeneric(false); 20022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The new call must be assigned to the foreground call. 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // That call must be idle, so place anything that's 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // there on hold 204767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (foregroundCall.getState() == CdmaCall.State.ACTIVE) { 20522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville return dialThreeWay(dialString); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 208767a662ecde33c3979bf02b793d392aca0403162Wink Saville pendingMO = new CdmaConnection(phone.getContext(), dialString, this, foregroundCall); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hangupPendingMO = false; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pendingMO.address == null || pendingMO.address.length() == 0 21222ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville || pendingMO.address.indexOf(PhoneNumberUtils.WILD) >= 0) { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Phone number is invalid 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pendingMO.cause = Connection.DisconnectCause.INVALID_NUMBER; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // handlePollCalls() will notice this call not present 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // and will mark it as dropped. 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pollCallsWhenSafe(); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Always unmute when initiating a new call 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMute(false); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2231cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang // Check data call 2241cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang disableDataCallInEmergencyCall(dialString); 2251cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang 22695a1d1a89e383dab893750638c2393dec54833ffWink Saville // In Ecm mode, if another emergency call is dialed, Ecm mode will not exit. 22795a1d1a89e383dab893750638c2393dec54833ffWink Saville if(!isPhoneInEcmMode || (isPhoneInEcmMode && isEmergencyCall)) { 228dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville cm.dial(pendingMO.address, clirMode, obtainCompleteMessage()); 229dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville } else { 230dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville phone.exitEmergencyCallbackMode(); 231dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville phone.setOnEcbModeExitResponse(this,EVENT_EXIT_ECM_RESPONSE_CDMA, null); 232dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville pendingCallClirMode=clirMode; 23395a1d1a89e383dab893750638c2393dec54833ffWink Saville pendingCallInEcm=true; 234dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville } 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updatePhoneState(); 2381c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh phone.notifyPreciseCallStateChanged(); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pendingMO; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Connection 245767a662ecde33c3979bf02b793d392aca0403162Wink Saville dial (String dialString) throws CallStateException { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dial(dialString, CommandsInterface.CLIR_DEFAULT); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville private Connection 25022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville dialThreeWay (String dialString) { 25122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville if (!foregroundCall.isIdle()) { 2521cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang // Check data call 2531cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang disableDataCallInEmergencyCall(dialString); 2541cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang 25522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // Attach the new connection to foregroundCall 25622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville pendingMO = new CdmaConnection(phone.getContext(), 25722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville dialString, this, foregroundCall); 25822ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville cm.sendCDMAFeatureCode(pendingMO.address, 25922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville obtainMessage(EVENT_THREE_WAY_DIAL_L2_RESULT_CDMA)); 26022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville return pendingMO; 26122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville } 26222ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville return null; 26322ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville void 26622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville acceptCall() throws CallStateException { 267767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (ringingCall.getState() == CdmaCall.State.INCOMING) { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i("phone", "acceptCall: incoming..."); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Always unmute when answering a new call 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMute(false); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cm.acceptCall(obtainCompleteMessage()); 2728a9ae45015a4cabdd56b1160261d4e7cbe551014David Krause } else if (ringingCall.getState() == CdmaCall.State.WAITING) { 27322ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville CdmaConnection cwConn = (CdmaConnection)(ringingCall.getLatestConnection()); 27422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville 27522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // Since there is no network response for supplimentary 27622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // service for CDMA, we assume call waiting is answered. 27722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // ringing Call state change to idle is in CdmaCall.detach 27822ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // triggered by updateParent. 27922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville cwConn.updateParent(ringingCall, foregroundCall); 28022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville cwConn.onConnectedInOrOut(); 28184d5585b99f08caba384c933906c0da175fce995Cheng Yang updatePhoneState(); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switchWaitingOrHoldingAndActive(); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new CallStateException("phone not ringing"); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void 289767a662ecde33c3979bf02b793d392aca0403162Wink Saville rejectCall () throws CallStateException { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // AT+CHLD=0 means "release held or UDUB" 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so if the phone isn't ringing, this could hang up held 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ringingCall.getState().isRinging()) { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cm.rejectCall(obtainCompleteMessage()); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new CallStateException("phone not ringing"); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switchWaitingOrHoldingAndActive() throws CallStateException { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should we bother with this check? 302767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (ringingCall.getState() == CdmaCall.State.INCOMING) { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new CallStateException("cannot be in the incoming state"); 3045abc78405f03e739f972692aa100f25609301ff5Guo-Bin Zhang } else if (foregroundCall.getConnections().size() > 1) { 30522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville flashAndSetGenericTrue(); 3065abc78405f03e739f972692aa100f25609301ff5Guo-Bin Zhang } else { 3075abc78405f03e739f972692aa100f25609301ff5Guo-Bin Zhang // Send a flash command to CDMA network for putting the other party on hold. 3085abc78405f03e739f972692aa100f25609301ff5Guo-Bin Zhang // For CDMA networks which do not support this the user would just hear a beep 3095abc78405f03e739f972692aa100f25609301ff5Guo-Bin Zhang // from the network. For CDMA networks which do support it will put the other 3105abc78405f03e739f972692aa100f25609301ff5Guo-Bin Zhang // party on hold. 3115abc78405f03e739f972692aa100f25609301ff5Guo-Bin Zhang cm.sendCDMAFeatureCode("", obtainMessage(EVENT_SWITCH_RESULT)); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void 316767a662ecde33c3979bf02b793d392aca0403162Wink Saville conference() throws CallStateException { 31722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // Should we be checking state? 31822ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville flashAndSetGenericTrue(); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void 322767a662ecde33c3979bf02b793d392aca0403162Wink Saville explicitCallTransfer() throws CallStateException { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cm.explicitCallTransfer(obtainCompleteMessage(EVENT_ECT_RESULT)); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void 327767a662ecde33c3979bf02b793d392aca0403162Wink Saville clearDisconnected() { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project internalClearDisconnected(); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updatePhoneState(); 3311c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh phone.notifyPreciseCallStateChanged(); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean 335767a662ecde33c3979bf02b793d392aca0403162Wink Saville canConference() { 336767a662ecde33c3979bf02b793d392aca0403162Wink Saville return foregroundCall.getState() == CdmaCall.State.ACTIVE 337767a662ecde33c3979bf02b793d392aca0403162Wink Saville && backgroundCall.getState() == CdmaCall.State.HOLDING 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !backgroundCall.isFull() 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !foregroundCall.isFull(); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean 343767a662ecde33c3979bf02b793d392aca0403162Wink Saville canDial() { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean ret; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int serviceState = phone.getServiceState().getState(); 346597f2b7022db1368831251d776f42b98d10ba2cdjohnwang String disableCall = SystemProperties.get( 347597f2b7022db1368831251d776f42b98d10ba2cdjohnwang TelephonyProperties.PROPERTY_DISABLE_CALL, "false"); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349597f2b7022db1368831251d776f42b98d10ba2cdjohnwang ret = (serviceState != ServiceState.STATE_POWER_OFF) 350597f2b7022db1368831251d776f42b98d10ba2cdjohnwang && pendingMO == null 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !ringingCall.isRinging() 352597f2b7022db1368831251d776f42b98d10ba2cdjohnwang && !disableCall.equals("true") 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (!foregroundCall.getState().isAlive() 354597f2b7022db1368831251d776f42b98d10ba2cdjohnwang || (foregroundCall.getState() == CdmaCall.State.ACTIVE) 355597f2b7022db1368831251d776f42b98d10ba2cdjohnwang || !backgroundCall.getState().isAlive()); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean 361767a662ecde33c3979bf02b793d392aca0403162Wink Saville canTransfer() { 362767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.e(LOG_TAG, "canTransfer: not possible in CDMA"); 363767a662ecde33c3979bf02b793d392aca0403162Wink Saville return false; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //***** Private Instance Methods 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void 369767a662ecde33c3979bf02b793d392aca0403162Wink Saville internalClearDisconnected() { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ringingCall.clearDisconnected(); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project foregroundCall.clearDisconnected(); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project backgroundCall.clearDisconnected(); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Obtain a message to use for signalling "invoke getCurrentCalls() when 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this operation and all other pending operations are complete 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Message 380767a662ecde33c3979bf02b793d392aca0403162Wink Saville obtainCompleteMessage() { 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obtainCompleteMessage(EVENT_OPERATION_COMPLETE); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Obtain a message to use for signalling "invoke getCurrentCalls() when 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this operation and all other pending operations are complete 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Message 389767a662ecde33c3979bf02b793d392aca0403162Wink Saville obtainCompleteMessage(int what) { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pendingOperations++; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastRelevantPoll = null; 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project needsPoll = true; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG_POLL) log("obtainCompleteMessage: pendingOperations=" + 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pendingOperations + ", needsPoll=" + needsPoll); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return obtainMessage(what); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void 401767a662ecde33c3979bf02b793d392aca0403162Wink Saville operationComplete() { 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pendingOperations--; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG_POLL) log("operationComplete: pendingOperations=" + 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pendingOperations + ", needsPoll=" + needsPoll); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pendingOperations == 0 && needsPoll) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cm.getCurrentCalls(lastRelevantPoll); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (pendingOperations < 0) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this should never happen 412767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.e(LOG_TAG,"CdmaCallTracker.pendingOperations < 0"); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pendingOperations = 0; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void 420767a662ecde33c3979bf02b793d392aca0403162Wink Saville updatePhoneState() { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Phone.State oldState = state; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ringingCall.isRinging()) { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state = Phone.State.RINGING; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (pendingMO != null || 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project !(foregroundCall.isIdle() && backgroundCall.isIdle())) { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state = Phone.State.OFFHOOK; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state = Phone.State.IDLE; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == Phone.State.IDLE && oldState != state) { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project voiceCallEndedRegistrants.notifyRegistrants( 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new AsyncResult(null, null, null)); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (oldState == Phone.State.IDLE && oldState != state) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project voiceCallStartedRegistrants.notifyRegistrants ( 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new AsyncResult(null, null, null)); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4392189daf50c174b5bed048a2777fae8b57df8e467Libin Tang if (Phone.DEBUG_PHONE) { 440b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville log("update phone state, old=" + oldState + " new="+ state); 4412189daf50c174b5bed048a2777fae8b57df8e467Libin Tang } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state != oldState) { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyPhoneStateChanged(); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 447767a662ecde33c3979bf02b793d392aca0403162Wink Saville // ***** Overwritten from CallTracker 448767a662ecde33c3979bf02b793d392aca0403162Wink Saville 449767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void 450767a662ecde33c3979bf02b793d392aca0403162Wink Saville handlePollCalls(AsyncResult ar) { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project List polledCalls; 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ar.exception == null) { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project polledCalls = (List)ar.result; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (isCommandExceptionRadioNotAvailable(ar.exception)) { 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // just a dummy empty ArrayList to cause the loop 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to hang up all the calls 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project polledCalls = new ArrayList(); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Radio probably wasn't ready--try again in a bit 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // But don't keep polling if the channel is closed 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pollCallsAfterDelay(); 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Connection newRinging = null; //or waiting 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasNonHangupStateChanged = false; // Any change besides 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // a dropped connection 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean needsPollDelay = false; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean unknownConnectionAppeared = false; 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, curDC = 0, dcSize = polledCalls.size() 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; i < connections.length; i++) { 474767a662ecde33c3979bf02b793d392aca0403162Wink Saville CdmaConnection conn = connections[i]; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DriverCall dc = null; 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // polledCall list is sparse 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (curDC < dcSize) { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dc = (DriverCall) polledCalls.get(curDC); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dc.index == i+1) { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curDC++; 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dc = null; 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG_POLL) log("poll: conn[i=" + i + "]=" + 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project conn+", dc=" + dc); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (conn == null && dc != null) { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Connection appeared in CLCC response that we don't know about 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pendingMO != null && pendingMO.compareTo(dc)) { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG_POLL) log("poll: pendingMO=" + pendingMO); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // It's our pending mobile originating call 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project connections[i] = pendingMO; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pendingMO.index = i; 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pendingMO.update(dc); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pendingMO = null; 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Someone has already asked to hangup this call 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hangupPendingMO) { 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hangupPendingMO = false; 50695a1d1a89e383dab893750638c2393dec54833ffWink Saville // Re-start Ecm timer when an uncompleted emergency call ends 50795a1d1a89e383dab893750638c2393dec54833ffWink Saville if (mIsEcmTimerCanceled) { 50895a1d1a89e383dab893750638c2393dec54833ffWink Saville handleEcmTimer(phone.RESTART_ECM_TIMER); 50995a1d1a89e383dab893750638c2393dec54833ffWink Saville } 51095a1d1a89e383dab893750638c2393dec54833ffWink Saville 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) log( 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "poll: hangupPendingMO, hangup conn " + i); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hangup(connections[i]); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (CallStateException ex) { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOG_TAG, "unexpected error on hangup"); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Do not continue processing this poll 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Wait for hangup and repoll 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5242189daf50c174b5bed048a2777fae8b57df8e467Libin Tang if (Phone.DEBUG_PHONE) { 525b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville log("pendingMo=" + pendingMO + ", dc=" + dc); 5262189daf50c174b5bed048a2777fae8b57df8e467Libin Tang } 5272189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // find if the MT call is a new ring or unknown connection 5282189daf50c174b5bed048a2777fae8b57df8e467Libin Tang newRinging = checkMtFindNewRinging(dc,i); 5292189daf50c174b5bed048a2777fae8b57df8e467Libin Tang if (newRinging == null) { 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unknownConnectionAppeared = true; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 532b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville checkAndEnableDataCallAfterEmergencyCallDropped(); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasNonHangupStateChanged = true; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (conn != null && dc == null) { 536b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville // This case means the RIL has no more active call anymore and 537b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville // we need to clean up the foregroundCall and ringingCall. 538b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville // Loop through foreground call connections as 539b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville // it contains the known logical connections. 54022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville int count = foregroundCall.connections.size(); 541b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville for (int n = 0; n < count; n++) { 542b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville if (Phone.DEBUG_PHONE) log("adding fgCall cn " + n + " to droppedDuringPoll"); 543b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville CdmaConnection cn = (CdmaConnection)foregroundCall.connections.get(n); 544b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville droppedDuringPoll.add(cn); 545b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville } 546b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville count = ringingCall.connections.size(); 547b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville // Loop through ringing call connections as 548b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville // it may contain the known logical connections. 549b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville for (int n = 0; n < count; n++) { 550b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville if (Phone.DEBUG_PHONE) log("adding rgCall cn " + n + " to droppedDuringPoll"); 551b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville CdmaConnection cn = (CdmaConnection)ringingCall.connections.get(n); 552b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville droppedDuringPoll.add(cn); 55322ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville } 55422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville foregroundCall.setGeneric(false); 555b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville ringingCall.setGeneric(false); 55695a1d1a89e383dab893750638c2393dec54833ffWink Saville 55795a1d1a89e383dab893750638c2393dec54833ffWink Saville // Re-start Ecm timer when the connected emergency call ends 55895a1d1a89e383dab893750638c2393dec54833ffWink Saville if (mIsEcmTimerCanceled) { 55995a1d1a89e383dab893750638c2393dec54833ffWink Saville handleEcmTimer(phone.RESTART_ECM_TIMER); 56095a1d1a89e383dab893750638c2393dec54833ffWink Saville } 561b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville // If emergency call is not going through while dialing 562b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville checkAndEnableDataCallAfterEmergencyCallDropped(); 56395a1d1a89e383dab893750638c2393dec54833ffWink Saville 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dropped connections are removed from the CallTracker 565767a662ecde33c3979bf02b793d392aca0403162Wink Saville // list but kept in the Call list 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project connections[i] = null; 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (conn != null && dc != null) { /* implicit conn.compareTo(dc) */ 5682189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // Call collision case 5692189daf50c174b5bed048a2777fae8b57df8e467Libin Tang if (conn.isIncoming != dc.isMT) { 5702189daf50c174b5bed048a2777fae8b57df8e467Libin Tang if (dc.isMT == true){ 5712189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // Mt call takes precedence than Mo,drops Mo 5722189daf50c174b5bed048a2777fae8b57df8e467Libin Tang droppedDuringPoll.add(conn); 5732189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // find if the MT call is a new ring or unknown connection 5742189daf50c174b5bed048a2777fae8b57df8e467Libin Tang newRinging = checkMtFindNewRinging(dc,i); 5752189daf50c174b5bed048a2777fae8b57df8e467Libin Tang if (newRinging == null) { 5762189daf50c174b5bed048a2777fae8b57df8e467Libin Tang unknownConnectionAppeared = true; 5772189daf50c174b5bed048a2777fae8b57df8e467Libin Tang } 578b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville checkAndEnableDataCallAfterEmergencyCallDropped(); 5792189daf50c174b5bed048a2777fae8b57df8e467Libin Tang } else { 5802189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // Call info stored in conn is not consistent with the call info from dc. 5812189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // We should follow the rule of MT calls taking precedence over MO calls 5822189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // when there is conflict, so here we drop the call info from dc and 5832189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // continue to use the call info from conn, and only take a log. 5842189daf50c174b5bed048a2777fae8b57df8e467Libin Tang Log.e(LOG_TAG,"Error in RIL, Phantom call appeared " + dc); 5852189daf50c174b5bed048a2777fae8b57df8e467Libin Tang } 5862189daf50c174b5bed048a2777fae8b57df8e467Libin Tang } else { 5872189daf50c174b5bed048a2777fae8b57df8e467Libin Tang boolean changed; 5882189daf50c174b5bed048a2777fae8b57df8e467Libin Tang changed = conn.update(dc); 5892189daf50c174b5bed048a2777fae8b57df8e467Libin Tang hasNonHangupStateChanged = hasNonHangupStateChanged || changed; 5902189daf50c174b5bed048a2777fae8b57df8e467Libin Tang } 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (REPEAT_POLLING) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dc != null) { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FIXME with RIL, we should not need this anymore 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((dc.state == DriverCall.State.DIALING 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*&& cm.getOption(cm.OPTION_POLL_DIALING)*/) 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (dc.state == DriverCall.State.ALERTING 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*&& cm.getOption(cm.OPTION_POLL_ALERTING)*/) 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (dc.state == DriverCall.State.INCOMING 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*&& cm.getOption(cm.OPTION_POLL_INCOMING)*/) 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (dc.state == DriverCall.State.WAITING 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*&& cm.getOption(cm.OPTION_POLL_WAITING)*/) 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ) { 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Sometimes there's no unsolicited notification 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for state transitions 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project needsPollDelay = true; 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is the first poll after an ATD. 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We expect the pending call to appear in the list 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If it does not, we land here 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pendingMO != null) { 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(LOG_TAG,"Pending MO dropped before poll fg state:" 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + foregroundCall.getState()); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project droppedDuringPoll.add(pendingMO); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pendingMO = null; 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hangupPendingMO = false; 62395a1d1a89e383dab893750638c2393dec54833ffWink Saville if( pendingCallInEcm) { 62495a1d1a89e383dab893750638c2393dec54833ffWink Saville pendingCallInEcm = false; 625dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville } 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newRinging != null) { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyNewRingingConnection(newRinging); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clear the "local hangup" and "missed/rejected call" 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // cases from the "dropped during poll" list 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These cases need no "last call fail" reason 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = droppedDuringPoll.size() - 1; i >= 0 ; i--) { 636767a662ecde33c3979bf02b793d392aca0403162Wink Saville CdmaConnection conn = droppedDuringPoll.get(i); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (conn.isIncoming() && conn.getConnectTime() == 0) { 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Missed or rejected call 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Connection.DisconnectCause cause; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (conn.cause == Connection.DisconnectCause.LOCAL) { 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cause = Connection.DisconnectCause.INCOMING_REJECTED; 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cause = Connection.DisconnectCause.INCOMING_MISSED; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) { 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log("missed/rejected call, conn.cause=" + conn.cause); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log("setting cause to " + cause); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project droppedDuringPoll.remove(i); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project conn.onDisconnect(cause); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (conn.cause == Connection.DisconnectCause.LOCAL) { 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Local hangup 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project droppedDuringPoll.remove(i); 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project conn.onDisconnect(Connection.DisconnectCause.LOCAL); 657767a662ecde33c3979bf02b793d392aca0403162Wink Saville } else if (conn.cause == Connection.DisconnectCause.INVALID_NUMBER) { 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project droppedDuringPoll.remove(i); 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project conn.onDisconnect(Connection.DisconnectCause.INVALID_NUMBER); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Any non-local disconnects: determine cause 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (droppedDuringPoll.size() > 0) { 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cm.getLastCallFailCause( 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obtainNoPollCompleteMessage(EVENT_GET_LAST_CALL_FAIL_CAUSE)); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needsPollDelay) { 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pollCallsAfterDelay(); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Cases when we can no longer keep disconnected Connection's 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // with their previous calls 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 1) the phone has started to ring 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 2) A Call/Connection object has changed state... 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we may have switched or held or answered (but not hung up) 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newRinging != null || hasNonHangupStateChanged) { 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project internalClearDisconnected(); 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updatePhoneState(); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (unknownConnectionAppeared) { 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phone.notifyUnknownConnection(); 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasNonHangupStateChanged || newRinging != null) { 6891c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh phone.notifyPreciseCallStateChanged(); 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //dumpState(); 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 695767a662ecde33c3979bf02b793d392aca0403162Wink Saville //***** Called from CdmaConnection 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ void 697767a662ecde33c3979bf02b793d392aca0403162Wink Saville hangup (CdmaConnection conn) throws CallStateException { 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (conn.owner != this) { 699767a662ecde33c3979bf02b793d392aca0403162Wink Saville throw new CallStateException ("CdmaConnection " + conn 700767a662ecde33c3979bf02b793d392aca0403162Wink Saville + "does not belong to CdmaCallTracker " + this); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (conn == pendingMO) { 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We're hanging up an outgoing call that doesn't have it's 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // GSM index assigned yet 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) log("hangup: set hangupPendingMO to true"); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hangupPendingMO = true; 70922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville } else if ((conn.getCall() == ringingCall) 71022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville && (ringingCall.getState() == CdmaCall.State.WAITING)) { 71122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // Handle call waiting hang up case. 71222ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // 71322ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // The ringingCall state will change to IDLE in CdmaCall.detach 71422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // if the ringing call connection size is 0. We don't specifically 71522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // set the ringing call state to IDLE here to avoid a race condition 71622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // where a new call waiting could get a hang up from an old call 71722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // waiting ringingCall. 7188a9ae45015a4cabdd56b1160261d4e7cbe551014David Krause // 7198a9ae45015a4cabdd56b1160261d4e7cbe551014David Krause // PhoneApp does the call log itself since only PhoneApp knows 7208a9ae45015a4cabdd56b1160261d4e7cbe551014David Krause // the hangup reason is user ignoring or timing out. So conn.onDisconnect() 7218a9ae45015a4cabdd56b1160261d4e7cbe551014David Krause // is not called here. Instead, conn.onLocalDisconnect() is called. 7228a9ae45015a4cabdd56b1160261d4e7cbe551014David Krause conn.onLocalDisconnect(); 72384d5585b99f08caba384c933906c0da175fce995Cheng Yang updatePhoneState(); 7248125864adcf27f706f261903ae5adf84f30b1987Ling Li phone.notifyPreciseCallStateChanged(); 72522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville return; 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 728767a662ecde33c3979bf02b793d392aca0403162Wink Saville cm.hangupConnection (conn.getCDMAIndex(), obtainCompleteMessage()); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (CallStateException ex) { 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore "connection not found" 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Call may have hung up already 732767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.w(LOG_TAG,"CdmaCallTracker WARN: hangup() on absent connection " 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + conn); 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project conn.onHangupLocal(); 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ void 741767a662ecde33c3979bf02b793d392aca0403162Wink Saville separate (CdmaConnection conn) throws CallStateException { 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (conn.owner != this) { 743767a662ecde33c3979bf02b793d392aca0403162Wink Saville throw new CallStateException ("CdmaConnection " + conn 744767a662ecde33c3979bf02b793d392aca0403162Wink Saville + "does not belong to CdmaCallTracker " + this); 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 747767a662ecde33c3979bf02b793d392aca0403162Wink Saville cm.separateConnection (conn.getCDMAIndex(), 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obtainCompleteMessage(EVENT_SEPARATE_RESULT)); 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (CallStateException ex) { 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore "connection not found" 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Call may have hung up already 752767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.w(LOG_TAG,"CdmaCallTracker WARN: separate() on absent connection " 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + conn); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 757767a662ecde33c3979bf02b793d392aca0403162Wink Saville //***** Called from CDMAPhone 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ void 760767a662ecde33c3979bf02b793d392aca0403162Wink Saville setMute(boolean mute) { 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project desiredMute = mute; 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cm.setMute(desiredMute, null); 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ boolean 766767a662ecde33c3979bf02b793d392aca0403162Wink Saville getMute() { 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return desiredMute; 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 771767a662ecde33c3979bf02b793d392aca0403162Wink Saville //***** Called from CdmaCall 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* package */ void 774767a662ecde33c3979bf02b793d392aca0403162Wink Saville hangup (CdmaCall call) throws CallStateException { 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (call.getConnections().size() == 0) { 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new CallStateException("no connections in call"); 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (call == ringingCall) { 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) log("(ringing) hangup waiting or background"); 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cm.hangupWaitingOrBackground(obtainCompleteMessage()); 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (call == foregroundCall) { 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (call.isDialingOrAlerting()) { 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) { 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log("(foregnd) hangup dialing or alerting..."); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 787767a662ecde33c3979bf02b793d392aca0403162Wink Saville hangup((CdmaConnection)(call.getConnections().get(0))); 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hangupForegroundResumeBackground(); 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (call == backgroundCall) { 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ringingCall.isRinging()) { 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) { 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project log("hangup all conns in background call"); 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hangupAllConnections(call); 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hangupWaitingOrBackground(); 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 801767a662ecde33c3979bf02b793d392aca0403162Wink Saville throw new RuntimeException ("CdmaCall " + call + 802767a662ecde33c3979bf02b793d392aca0403162Wink Saville "does not belong to CdmaCallTracker " + this); 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project call.onHangupLocal(); 806e7a9201edbb4d18f12d00ba1b80e2481a5cb446fjsh phone.notifyPreciseCallStateChanged(); 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* package */ 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void hangupWaitingOrBackground() { 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) log("hangupWaitingOrBackground"); 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cm.hangupWaitingOrBackground(obtainCompleteMessage()); 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* package */ 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void hangupForegroundResumeBackground() { 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Phone.DEBUG_PHONE) log("hangupForegroundResumeBackground"); 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cm.hangupForegroundResumeBackground(obtainCompleteMessage()); 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 821767a662ecde33c3979bf02b793d392aca0403162Wink Saville void hangupConnectionByIndex(CdmaCall call, int index) 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws CallStateException { 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = call.connections.size(); 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 825767a662ecde33c3979bf02b793d392aca0403162Wink Saville CdmaConnection cn = (CdmaConnection)call.connections.get(i); 826767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (cn.getCDMAIndex() == index) { 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cm.hangupConnection(index, obtainCompleteMessage()); 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new CallStateException("no gsm index found"); 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 835767a662ecde33c3979bf02b793d392aca0403162Wink Saville void hangupAllConnections(CdmaCall call) throws CallStateException{ 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = call.connections.size(); 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 839767a662ecde33c3979bf02b793d392aca0403162Wink Saville CdmaConnection cn = (CdmaConnection)call.connections.get(i); 840767a662ecde33c3979bf02b793d392aca0403162Wink Saville cm.hangupConnection(cn.getCDMAIndex(), obtainCompleteMessage()); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (CallStateException ex) { 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOG_TAG, "hangupConnectionByIndex caught " + ex); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* package */ 848767a662ecde33c3979bf02b793d392aca0403162Wink Saville CdmaConnection getConnectionByIndex(CdmaCall call, int index) 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws CallStateException { 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = call.connections.size(); 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 852767a662ecde33c3979bf02b793d392aca0403162Wink Saville CdmaConnection cn = (CdmaConnection)call.connections.get(i); 853767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (cn.getCDMAIndex() == index) { 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cn; 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville private void flashAndSetGenericTrue() throws CallStateException { 86222ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville cm.sendCDMAFeatureCode("", obtainMessage(EVENT_SWITCH_RESULT)); 86322ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville 86422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // Set generic to true because in CDMA it is not known what 86522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // the status of the call is after a call waiting is answered, 86622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // 3 way call merged or a switch between calls. 86722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville foregroundCall.setGeneric(true); 8681c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh phone.notifyPreciseCallStateChanged(); 86922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville } 87022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Phone.SuppService getFailedService(int what) { 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (what) { 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_SWITCH_RESULT: 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Phone.SuppService.SWITCH; 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_CONFERENCE_RESULT: 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Phone.SuppService.CONFERENCE; 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_SEPARATE_RESULT: 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Phone.SuppService.SEPARATE; 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_ECT_RESULT: 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Phone.SuppService.TRANSFER; 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Phone.SuppService.UNKNOWN; 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 885767a662ecde33c3979bf02b793d392aca0403162Wink Saville private void handleRadioNotAvailable() { 886767a662ecde33c3979bf02b793d392aca0403162Wink Saville // handlePollCalls will clear out its 887767a662ecde33c3979bf02b793d392aca0403162Wink Saville // call list when it gets the CommandException 888767a662ecde33c3979bf02b793d392aca0403162Wink Saville // error result from this 889767a662ecde33c3979bf02b793d392aca0403162Wink Saville pollCallsWhenSafe(); 890767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 891767a662ecde33c3979bf02b793d392aca0403162Wink Saville 89222ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville private void notifyCallWaitingInfo(CdmaCallWaitingNotification obj) { 89322ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville if (callWaitingRegistrants != null) { 89422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville callWaitingRegistrants.notifyRegistrants(new AsyncResult(null, obj, null)); 89522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville } 89622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville } 89722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville 89822ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville private void handleCallWaitingInfo (CdmaCallWaitingNotification cw) { 89922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // Check how many connections in foregroundCall. 90022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // If the connection in foregroundCall is more 90122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // than one, then the connection information is 90222ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // not reliable anymore since it means either 90322ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // call waiting is connected or 3 way call is 90422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // dialed before, so set generic. 90522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville if (foregroundCall.connections.size() > 1 ) { 90622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville foregroundCall.setGeneric(true); 90722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville } 90822ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville 90922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // Create a new CdmaConnection which attaches itself to ringingCall. 91022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville ringingCall.setGeneric(false); 91122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville new CdmaConnection(phone.getContext(), cw, this, ringingCall); 91284d5585b99f08caba384c933906c0da175fce995Cheng Yang updatePhoneState(); 91322ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville 91422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // Finally notify application 91522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville notifyCallWaitingInfo(cw); 91622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville } 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //****** Overridden from Handler 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void 920767a662ecde33c3979bf02b793d392aca0403162Wink Saville handleMessage (Message msg) { 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AsyncResult ar; 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (msg.what) { 924767a662ecde33c3979bf02b793d392aca0403162Wink Saville case EVENT_POLL_CALLS_RESULT:{ 925767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.d(LOG_TAG, "Event EVENT_POLL_CALLS_RESULT Received"); 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ar = (AsyncResult)msg.obj; 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 928767a662ecde33c3979bf02b793d392aca0403162Wink Saville if(msg == lastRelevantPoll) { 929767a662ecde33c3979bf02b793d392aca0403162Wink Saville if(DBG_POLL) log( 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "handle EVENT_POLL_CALL_RESULT: set needsPoll=F"); 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project needsPoll = false; 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastRelevantPoll = null; 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handlePollCalls((AsyncResult)msg.obj); 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 935767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_OPERATION_COMPLETE: 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project operationComplete(); 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_SWITCH_RESULT: 94322ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // In GSM call operationComplete() here which gets the 94422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // current call list. But in CDMA there is no list so 94522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // there is nothing to do. 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_GET_LAST_CALL_FAIL_CAUSE: 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int causeCode; 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ar = (AsyncResult)msg.obj; 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project operationComplete(); 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ar.exception != null) { 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // An exception occurred...just treat the disconnect 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // cause as "normal" 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project causeCode = CallFailCause.NORMAL_CLEARING; 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(LOG_TAG, 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Exception during getLastCallFailCause, assuming normal disconnect"); 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project causeCode = ((int[])ar.result)[0]; 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, s = droppedDuringPoll.size() 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; i < s ; i++ 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ) { 967767a662ecde33c3979bf02b793d392aca0403162Wink Saville CdmaConnection conn = droppedDuringPoll.get(i); 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project conn.onRemoteDisconnect(causeCode); 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updatePhoneState(); 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9741c42769339d8fe98ecb2698c64e7dc6672e3d59dJaikumar Ganesh phone.notifyPreciseCallStateChanged(); 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project droppedDuringPoll.clear(); 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9784be0d4378c3d9c79a094e99ce429907f1e9eda5fWink Saville case EVENT_REPOLL_AFTER_DELAY: 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_CALL_STATE_CHANGE: 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pollCallsWhenSafe(); 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_RADIO_AVAILABLE: 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handleRadioAvailable(); 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EVENT_RADIO_NOT_AVAILABLE: 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handleRadioNotAvailable(); 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 990767a662ecde33c3979bf02b793d392aca0403162Wink Saville 991dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville case EVENT_EXIT_ECM_RESPONSE_CDMA: 992dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville //no matter the result, we still do the same here 99395a1d1a89e383dab893750638c2393dec54833ffWink Saville if (pendingCallInEcm) { 994dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville cm.dial(pendingMO.address, pendingCallClirMode, obtainCompleteMessage()); 99595a1d1a89e383dab893750638c2393dec54833ffWink Saville pendingCallInEcm = false; 996dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville } 997dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville phone.unsetOnEcbModeExitResponse(this); 998dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville break; 999dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville 100022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville case EVENT_CALL_WAITING_INFO_CDMA: 100122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville ar = (AsyncResult)msg.obj; 100222ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville if (ar.exception == null) { 100322ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville handleCallWaitingInfo((CdmaCallWaitingNotification)ar.result); 100422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville Log.d(LOG_TAG, "Event EVENT_CALL_WAITING_INFO_CDMA Received"); 100522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville } 100622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville break; 100722ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville 100822ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville case EVENT_THREE_WAY_DIAL_L2_RESULT_CDMA: 100922ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville ar = (AsyncResult)msg.obj; 101022ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville if (ar.exception == null) { 101122ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville // Assume 3 way call is connected 101222ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville pendingMO.onConnectedInOrOut(); 1013e30d4bf531cf8873f345cff0503974952c2daf65Jinghui Guo pendingMO = null; 101422ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville } 101522ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville break; 101622ccaf5321cf9d2df57cf0d686d1abcd74acb193Wink Saville 1017767a662ecde33c3979bf02b793d392aca0403162Wink Saville default:{ 1018dda5391d5079537e275c9f4ed2637a1484d0e4e8Wink Saville throw new RuntimeException("unexpected event not handled"); 1019767a662ecde33c3979bf02b793d392aca0403162Wink Saville } 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 102395a1d1a89e383dab893750638c2393dec54833ffWink Saville /** 102495a1d1a89e383dab893750638c2393dec54833ffWink Saville * Handle Ecm timer to be canceled or re-started 102595a1d1a89e383dab893750638c2393dec54833ffWink Saville */ 102695a1d1a89e383dab893750638c2393dec54833ffWink Saville private void handleEcmTimer(int action) { 102795a1d1a89e383dab893750638c2393dec54833ffWink Saville phone.handleTimerInEmergencyCallbackMode(action); 102895a1d1a89e383dab893750638c2393dec54833ffWink Saville switch(action) { 102995a1d1a89e383dab893750638c2393dec54833ffWink Saville case CDMAPhone.CANCEL_ECM_TIMER: mIsEcmTimerCanceled = true; break; 103095a1d1a89e383dab893750638c2393dec54833ffWink Saville case CDMAPhone.RESTART_ECM_TIMER: mIsEcmTimerCanceled = false; break; 103195a1d1a89e383dab893750638c2393dec54833ffWink Saville default: 103295a1d1a89e383dab893750638c2393dec54833ffWink Saville Log.e(LOG_TAG, "handleEcmTimer, unsupported action " + action); 103395a1d1a89e383dab893750638c2393dec54833ffWink Saville } 103495a1d1a89e383dab893750638c2393dec54833ffWink Saville } 103595a1d1a89e383dab893750638c2393dec54833ffWink Saville 10361cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang /** 10371cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang * Disable data call when emergency call is connected 10381cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang */ 10391cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang private void disableDataCallInEmergencyCall(String dialString) { 10401cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang if (PhoneNumberUtils.isEmergencyNumber(dialString)) { 1041b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville if (Phone.DEBUG_PHONE) log("disableDataCallInEmergencyCall"); 10421cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang mIsInEmergencyCall = true; 1043984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt phone.disableDataConnectivity(); 10441cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang } 10451cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang } 1046b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville 1047b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville /** 1048b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville * Check and enable data call after an emergency call is dropped if it's 1049b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville * not in ECM 1050b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville */ 1051b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville private void checkAndEnableDataCallAfterEmergencyCallDropped() { 1052b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville if (mIsInEmergencyCall) { 1053984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt mIsInEmergencyCall = false; 1054b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville String inEcm=SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE, "false"); 1055b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville if (Phone.DEBUG_PHONE) { 1056b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville log("checkAndEnableDataCallAfterEmergencyCallDropped,inEcm=" + inEcm); 1057b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville } 1058b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville if (inEcm.compareTo("false") == 0) { 1059b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville // Re-initiate data connection 1060984d22b180e68d6b9f8e2c81c4eb271deccfc94aRobert Greenwalt // TODO - can this be changed to phone.enableDataConnectivity(); 1061b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville phone.mDataConnection.setDataEnabled(true); 1062b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville } 1063b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville } 1064b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville } 1065b14300140d9f8b0af4d573eb0420035f814e2d03Wink Saville 10662189daf50c174b5bed048a2777fae8b57df8e467Libin Tang /** 10672189daf50c174b5bed048a2777fae8b57df8e467Libin Tang * Check the MT call to see if it's a new ring or 10682189daf50c174b5bed048a2777fae8b57df8e467Libin Tang * a unknown connection. 10692189daf50c174b5bed048a2777fae8b57df8e467Libin Tang */ 10702189daf50c174b5bed048a2777fae8b57df8e467Libin Tang private Connection checkMtFindNewRinging(DriverCall dc, int i) { 10712189daf50c174b5bed048a2777fae8b57df8e467Libin Tang 10722189daf50c174b5bed048a2777fae8b57df8e467Libin Tang Connection newRinging = null; 10732189daf50c174b5bed048a2777fae8b57df8e467Libin Tang 10742189daf50c174b5bed048a2777fae8b57df8e467Libin Tang connections[i] = new CdmaConnection(phone.getContext(), dc, this, i); 10752189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // it's a ringing call 10762189daf50c174b5bed048a2777fae8b57df8e467Libin Tang if (connections[i].getCall() == ringingCall) { 10772189daf50c174b5bed048a2777fae8b57df8e467Libin Tang newRinging = connections[i]; 10782189daf50c174b5bed048a2777fae8b57df8e467Libin Tang if (Phone.DEBUG_PHONE) log("Notify new ring " + dc); 10792189daf50c174b5bed048a2777fae8b57df8e467Libin Tang } else { 10802189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // Something strange happened: a call which is neither 10812189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // a ringing call nor the one we created. It could be the 10822189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // call collision result from RIL 10832189daf50c174b5bed048a2777fae8b57df8e467Libin Tang Log.e(LOG_TAG,"Phantom call appeared " + dc); 10842189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // If it's a connected call, set the connect time so that 10852189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // it's non-zero. It may not be accurate, but at least 10862189daf50c174b5bed048a2777fae8b57df8e467Libin Tang // it won't appear as a Missed Call. 10872189daf50c174b5bed048a2777fae8b57df8e467Libin Tang if (dc.state != DriverCall.State.ALERTING 10882189daf50c174b5bed048a2777fae8b57df8e467Libin Tang && dc.state != DriverCall.State.DIALING) { 10892189daf50c174b5bed048a2777fae8b57df8e467Libin Tang connections[i].connectTime = System.currentTimeMillis(); 10902189daf50c174b5bed048a2777fae8b57df8e467Libin Tang } 10912189daf50c174b5bed048a2777fae8b57df8e467Libin Tang } 10922189daf50c174b5bed048a2777fae8b57df8e467Libin Tang return newRinging; 10932189daf50c174b5bed048a2777fae8b57df8e467Libin Tang } 10941cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang 10951cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang /** 10961cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang * Check if current call is in emergency call 10971cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang * 10981cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang * @return true if it is in emergency call 10991cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang * false if it is not in emergency call 11001cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang */ 11011cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang boolean isInEmergencyCall() { 11021cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang return mIsInEmergencyCall; 11031cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang } 11041cef22890d10417977397a5dccf34956858d0803Guo-Bin Zhang 1105767a662ecde33c3979bf02b793d392aca0403162Wink Saville protected void log(String msg) { 1106767a662ecde33c3979bf02b793d392aca0403162Wink Saville Log.d(LOG_TAG, "[CdmaCallTracker] " + msg); 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1108767a662ecde33c3979bf02b793d392aca0403162Wink Saville 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1110