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