1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/* 21a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Copyright (C) 2015 The Android Open Source Project 3c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 4c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * you may not use this file except in compliance with the License. 6c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * You may obtain a copy of the License at 7c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 8c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * 10c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Unless required by applicable law or agreed to in writing, software 11c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See the License for the specific language governing permissions and 14c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * limitations under the License. 15c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 16c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yupackage com.android.internal.telephony; 18c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.content.Context; 19c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.AsyncResult; 20c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Handler; 21c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Looper; 22c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Message; 23059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunnimport android.os.PersistableBundle; 24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.PowerManager; 25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Registrant; 26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemClock; 271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.telephony.CarrierConfigManager; 28b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensenimport android.telephony.DisconnectCause; 29c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.PhoneNumberUtils; 301d7bfb91683b3df05b4d437d79a82fec4ce04f79Johan Redestigimport android.telephony.Rlog; 31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.ServiceState; 321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport android.text.TextUtils; 33e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka 341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.cdma.CdmaCallWaitingNotification; 351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yuimport com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager; 36d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState; 371d7bfb91683b3df05b4d437d79a82fec4ce04f79Johan Redestigimport com.android.internal.telephony.uicc.UiccCardApplication; 38c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/** 40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide} 41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yupublic class GsmCdmaConnection extends Connection { 431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final String LOG_TAG = "GsmCdmaConnection"; 441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final boolean DBG = true; 45cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private static final boolean VDBG = false; 46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Instance Variables 48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmCdmaCallTracker mOwner; 501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmCdmaCall mParent; 51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean mDisconnected; 531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int mIndex; // index in GsmCdmaCallTracker.connections[], -1 if unassigned 551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // The GsmCdma index is 1 + this 56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* 58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * These time/timespan values are based on System.currentTimeMillis(), 59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * i.e., "wall clock" time. 60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 6122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville long mDisconnectTime; 62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu UUSInfo mUusInfo; 640742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela int mPreciseCause = 0; 6533cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu String mVendorCause; 66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Connection mOrigConnection; 681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 6922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Handler mHandler; 70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private PowerManager.WakeLock mPartialWakeLock; 72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 73cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger private boolean mIsEmergencyCall = false; 74cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger 75059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn // The cached delay to be used between DTMF tones fetched from carrier config. 76059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn private int mDtmfToneDelay = 0; 77059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Event Constants 79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_DTMF_DONE = 1; 80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_PAUSE_DONE = 2; 81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_NEXT_POST_DIAL = 3; 82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_WAKE_LOCK_TIMEOUT = 4; 83059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn static final int EVENT_DTMF_DELAY_DONE = 5; 84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constants 861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu static final int PAUSE_DELAY_MILLIS_GSM = 3 * 1000; 871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu static final int PAUSE_DELAY_MILLIS_CDMA = 2 * 1000; 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000; 89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Inner Classes 91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville class MyHandler extends Handler { 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville MyHandler(Looper l) {super(l);} 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 95cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void 97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleMessage(Message msg) { 98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (msg.what) { 100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_NEXT_POST_DIAL: 101059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn case EVENT_DTMF_DELAY_DONE: 102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_PAUSE_DONE: 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_WAKE_LOCK_TIMEOUT: 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 108059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn case EVENT_DTMF_DONE: 109059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn // We may need to add a delay specified by carrier between DTMF tones that are 110059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn // sent out. 111059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_DTMF_DELAY_DONE), 112059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn mDtmfToneDelay); 113059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn break; 114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constructors 119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 120cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger /** This is probably an MT call that we first saw in a CLCC response or a hand over. */ 1210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public GsmCdmaConnection (GsmCdmaPhone phone, DriverCall dc, GsmCdmaCallTracker ct, int index) { 122c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan super(phone.getPhoneType()); 123059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn createWakeLock(phone.getContext()); 124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 12622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 12722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 12922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = dc.number; 130cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger mIsEmergencyCall = PhoneNumberUtils.isLocalEmergencyNumber(phone.getContext(), mAddress); 13122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = dc.isMT; 13222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 13322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = dc.name; 13422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = dc.namePresentation; 13522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = dc.numberPresentation; 1361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mUusInfo = dc.uusInfo; 137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 13822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = index; 139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mParent = parentFromDCState(dc.state); 14122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.attach(this, dc); 142059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 143059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn fetchDtmfToneDelay(phone); 144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** This is an MO call, created when dialing */ 1470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public GsmCdmaConnection (GsmCdmaPhone phone, String dialString, GsmCdmaCallTracker ct, 148cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger GsmCdmaCall parent, boolean isEmergencyCall) { 149c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan super(phone.getPhoneType()); 150059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn createWakeLock(phone.getContext()); 151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 15422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 1571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDialString = dialString; 1581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 159cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger Rlog.d(LOG_TAG, "[GsmCdmaConn] GsmCdmaConnection: dialString=" + 160cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger maskDialString(dialString)); 1611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu dialString = formatDialString(dialString); 1621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, 163cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger "[GsmCdmaConn] GsmCdmaConnection:formated dialString=" + 164cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger maskDialString(dialString)); 1651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 16722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString); 168cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger mIsEmergencyCall = isEmergencyCall; 16922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString); 170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 17122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = -1; 172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 17322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = false; 17422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = null; 17522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED; 17622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 17722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (parent != null) { 18022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = parent; 1811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 1821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu parent.attachFake(this, GsmCdmaCall.State.DIALING); 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //for the three way call case, not change parent state 1851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (parent.mState == GsmCdmaCall.State.ACTIVE) { 1861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu parent.attachFake(this, GsmCdmaCall.State.ACTIVE); 1871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 1881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu parent.attachFake(this, GsmCdmaCall.State.DIALING); 1891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 193059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 194059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn fetchDtmfToneDelay(phone); 195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** This is a Call waiting call*/ 1990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public GsmCdmaConnection(Context context, CdmaCallWaitingNotification cw, GsmCdmaCallTracker ct, 2000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan GsmCdmaCall parent) { 201c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan super(parent.getPhone().getPhoneType()); 202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(context); 203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 20522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 20622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 20722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = cw.number; 20822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = cw.numberPresentation; 20922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = cw.name; 21022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = cw.namePresentation; 21122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = -1; 21222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = true; 21322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 21422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTime = 0; 21522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = parent; 2161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu parent.attachFake(this, GsmCdmaCall.State.WAITING); 217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 2218f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan clearPostDialListeners(); 2228dd4a1915f45460dfed9646470fbc0405bff934bAmit Mahajan if (mParent != null) { 2238dd4a1915f45460dfed9646470fbc0405bff934bAmit Mahajan mParent.detach(this); 2248dd4a1915f45460dfed9646470fbc0405bff934bAmit Mahajan } 2258f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan releaseAllWakeLocks(); 226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2286bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu static boolean equalsHandlesNulls(Object a, Object b) { 229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return (a == null) ? (b == null) : a.equals (b); 230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 23274c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi static boolean 23374c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi equalsBaseDialString (String a, String b) { 23474c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi return (a == null) ? (b == null) : (b != null && a.startsWith (b)); 23574c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi } 23674c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi 2371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 2381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 2391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * format original dial string 2401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 1) convert international dialing prefix "+" to 2411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * string specified per region 2421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 2431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 2) handle corner cases for PAUSE/WAIT dialing: 2441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 2451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * If PAUSE/WAIT sequence at the end, ignore them. 2461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 2471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * If consecutive PAUSE/WAIT sequence in the middle of the string, 2481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * and if there is any WAIT in PAUSE/WAIT sequence, treat them like WAIT. 2491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 2501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public static String formatDialString(String phoneNumber) { 2511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 2521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * TODO(cleanup): This function should move to PhoneNumberUtils, and 2531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * tests should be added. 2541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 2551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (phoneNumber == null) { 2571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return null; 2581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int length = phoneNumber.length(); 2601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu StringBuilder ret = new StringBuilder(); 2611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu char c; 2621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int currIndex = 0; 2631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu while (currIndex < length) { 2651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu c = phoneNumber.charAt(currIndex); 2661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPause(c) || isWait(c)) { 2671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (currIndex < length - 1) { 2681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // if PW not at the end 2691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int nextIndex = findNextPCharOrNonPOrNonWCharIndex(phoneNumber, currIndex); 2701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If there is non PW char following PW sequence 2711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (nextIndex < length) { 2721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu char pC = findPOrWCharToAppend(phoneNumber, currIndex, nextIndex); 2731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret.append(pC); 2741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If PW char sequence has more than 2 PW characters, 2751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // skip to the last PW character since the sequence already be 2761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // converted to WAIT character 2771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (nextIndex > (currIndex + 1)) { 2781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu currIndex = nextIndex - 1; 2791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (nextIndex == length) { 2811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // It means PW characters at the end, ignore 2821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu currIndex = length - 1; 2831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 2861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret.append(c); 2871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu currIndex++; 2891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return PhoneNumberUtils.cdmaCheckAndProcessPlusCode(ret.toString()); 2911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ boolean 294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville compareTo(DriverCall c) { 295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // On mobile originated (MO) calls, the phone number may have changed 296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // due to a SIM Toolkit call control modification. 297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We assume we know when MO calls are created (since we created them) 299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // and therefore don't need to compare the phone number anyway. 30022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (! (mIsIncoming || c.isMT)) return true; 301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 3021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // A new call appearing by SRVCC may have invalid number 3031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // if IMS service is not tightly coupled with cellular modem stack. 3041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Thus we prefer the preexisting handover connection instance. 3051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm() && mOrigConnection != null) return true; 3061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ... but we can compare phone numbers on MT calls, and we have 308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // no control over when they begin, so we might as well 309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String cAddress = PhoneNumberUtils.stringFromStringAndTOA(c.number, c.TOA); 31122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIsIncoming == c.isMT && equalsHandlesNulls(mAddress, cAddress); 312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 314cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getOrigDialString(){ 31622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mDialString; 317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 319cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 3201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public GsmCdmaCall getCall() { 32122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mParent; 322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 324cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getDisconnectTime() { 32622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mDisconnectTime; 327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 329cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getHoldDurationMillis() { 3311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (getState() != GsmCdmaCall.State.HOLDING) { 332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If not holding, return 0 333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 0; 334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 33522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return SystemClock.elapsedRealtime() - mHoldingStartTime; 336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 339cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 3401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public GsmCdmaCall.State getState() { 34122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mDisconnected) { 3421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return GsmCdmaCall.State.DISCONNECTED; 343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return super.getState(); 345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 348cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void hangup() throws CallStateException { 35022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 35122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.hangup(this); 352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 357cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void separate() throws CallStateException { 35922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 36022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.separate(this); 361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 366cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWaitChar() { 36822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.WAIT) { 3691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.w(LOG_TAG, "GsmCdmaConnection.proceedAfterWaitChar(): Expected " 3701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + "getPostDialState() to be WAIT but was " + mPostDialState); 371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 379cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWildChar(String str) { 38122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.WILD) { 3821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.w(LOG_TAG, "GsmCdmaConnection.proceedAfterWaitChar(): Expected " 38322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + "getPostDialState() to be WILD but was " + mPostDialState); 384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 389cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // make a new postDialString, with the wild char replacement string 390cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // at the beginning, followed by the remaining postDialString. 391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 392cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville StringBuilder buf = new StringBuilder(str); 39322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville buf.append(mPostDialString.substring(mNextPostDialChar)); 39422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString = buf.toString(); 39522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNextPostDialChar = 0; 396cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (Phone.DEBUG_PHONE) { 397cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("proceedAfterWildChar: new postDialString is " + 39822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString); 399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 400cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 401cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville processNextPostDialChar(); 402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 404cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void cancelPostDial() { 406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.CANCELLED); 407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is being hung up locally (eg, user pressed "end") 411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Note that at this point, the hangup request has been dispatched to the radio 412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * but no response has yet been received so update() has not yet been called 413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onHangupLocal() { 41622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCause = DisconnectCause.LOCAL; 4170742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela mPreciseCause = 0; 41833cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu mVendorCause = null; 419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 421b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /** 422b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * Maps RIL call disconnect code to {@link DisconnectCause}. 423b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @param causeCode RIL disconnect code 424b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @return the corresponding value from {@link DisconnectCause} 425b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen */ 426b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen int disconnectCauseFromCode(int causeCode) { 427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See 22.001 Annex F.4 for mapping of cause codes 429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to local tones 430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (causeCode) { 433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.USER_BUSY: 434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.BUSY; 4351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NO_CIRCUIT_AVAIL: 4371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.TEMPORARY_FAILURE: 4381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.SWITCHING_CONGESTION: 4391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.CHANNEL_NOT_AVAIL: 4401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.QOS_NOT_AVAIL: 4411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.BEARER_NOT_AVAIL: 442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CONGESTION; 4431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ACM_LIMIT_EXCEEDED: 445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.LIMIT_EXCEEDED; 4461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 447e9382711a69df42919f9cf301784be0651f9dc45Youhan Wang case CallFailCause.OPERATOR_DETERMINED_BARRING: 448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CALL_BARRED: 449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CALL_BARRED; 4501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.FDN_BLOCKED: 452c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.FDN_BLOCKED; 4531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4541d7bfb91683b3df05b4d437d79a82fec4ce04f79Johan Redestig case CallFailCause.IMEI_NOT_ACCEPTED: 4551d7bfb91683b3df05b4d437d79a82fec4ce04f79Johan Redestig return DisconnectCause.IMEI_NOT_ACCEPTED; 4561d7bfb91683b3df05b4d437d79a82fec4ce04f79Johan Redestig 4571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.UNOBTAINABLE_NUMBER: 4581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.UNOBTAINABLE_NUMBER; 4591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 46009b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_USSD: 46109b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_USSD; 4621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 46309b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_SS: 46409b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_SS; 4651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 46609b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_DIAL: 46709b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_DIAL; 4681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_LOCKED_UNTIL_POWER_CYCLE: 470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_LOCKED_UNTIL_POWER_CYCLE; 4711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_DROP: 473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_DROP; 4741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_INTERCEPT: 476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_INTERCEPT; 4771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_REORDER: 479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_REORDER; 4801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_SO_REJECT: 482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_SO_REJECT; 4831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_RETRY_ORDER: 485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_RETRY_ORDER; 4861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_ACCESS_FAILURE: 488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_ACCESS_FAILURE; 4891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_PREEMPTED: 491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_PREEMPTED; 4921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_NOT_EMERGENCY: 494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_NOT_EMERGENCY; 4951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_ACCESS_BLOCKED: 497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_ACCESS_BLOCKED; 4981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ERROR_UNSPECIFIED: 500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NORMAL_CLEARING: 501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 5020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan GsmCdmaPhone phone = mOwner.getPhone(); 503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int serviceState = phone.getServiceState().getState(); 5041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu UiccCardApplication cardApp = phone.getUiccCardApplication(); 5051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu AppState uiccAppState = (cardApp != null) ? cardApp.getState() : 506cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger AppState.APPSTATE_UNKNOWN; 507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (serviceState == ServiceState.STATE_POWER_OFF) { 508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.POWER_OFF; 509cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } 510cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (!mIsEmergencyCall) { 511cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // Only send OUT_OF_SERVICE if it is not an emergency call. We can still 512cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // technically be in STATE_OUT_OF_SERVICE or STATE_EMERGENCY_ONLY during 513cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // an emergency call and when it ends, we do not want to mistakenly generate 514cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // an OUT_OF_SERVICE disconnect cause during normal call ending. 515cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if ((serviceState == ServiceState.STATE_OUT_OF_SERVICE 516cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger || serviceState == ServiceState.STATE_EMERGENCY_ONLY)) { 517cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger return DisconnectCause.OUT_OF_SERVICE; 518cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } 519cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // If we are placing an emergency call and the SIM is currently PIN/PUK 520cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // locked the AppState will always not be equal to APPSTATE_READY. 521cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (uiccAppState != AppState.APPSTATE_READY) { 522cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (isPhoneTypeGsm()) { 5231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.ICC_ERROR; 524cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } else { // CDMA 525cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (phone.mCdmaSubscriptionSource == 526cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_RUIM) { 527cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger return DisconnectCause.ICC_ERROR; 5281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 530cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } 531cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } 532cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (isPhoneTypeGsm()) { 533cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (causeCode == CallFailCause.ERROR_UNSPECIFIED) { 534cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (phone.mSST.mRestrictedState.isCsRestricted()) { 535cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger return DisconnectCause.CS_RESTRICTED; 536cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } else if (phone.mSST.mRestrictedState.isCsEmergencyRestricted()) { 537cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger return DisconnectCause.CS_RESTRICTED_EMERGENCY; 538cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } else if (phone.mSST.mRestrictedState.isCsNormalRestricted()) { 539cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger return DisconnectCause.CS_RESTRICTED_NORMAL; 5401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 543cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (causeCode == CallFailCause.NORMAL_CLEARING) { 544cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger return DisconnectCause.NORMAL; 545cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } 546cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // If nothing else matches, report unknown call drop reason 547cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // to app, not NORMAL call end. 548cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger return DisconnectCause.ERROR_UNSPECIFIED; 549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ void 55333cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu onRemoteDisconnect(int causeCode, String vendorCause) { 5540742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela this.mPreciseCause = causeCode; 55533cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu this.mVendorCause = vendorCause; 556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onDisconnect(disconnectCauseFromCode(causeCode)); 557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 559b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /** 560b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * Called when the radio indicates the connection has been disconnected. 561b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @param cause call disconnect cause; values are defined in {@link DisconnectCause} 562b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen */ 563c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan @Override 564c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan public boolean onDisconnect(int cause) { 5651220a4e283def0598468376cf112d3b904026fb8Danny Baumann boolean changed = false; 5661220a4e283def0598468376cf112d3b904026fb8Danny Baumann 56722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCause = cause; 568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 56922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville doDisconnect(); 5711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) Rlog.d(LOG_TAG, "onDisconnect: cause=" + cause); 573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mOwner.getPhone().notifyDisconnect(this); 575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 57622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 5771220a4e283def0598468376cf112d3b904026fb8Danny Baumann changed = mParent.connectionDisconnected(this); 578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 5791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mOrigConnection = null; 581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 5821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu clearPostDialListeners(); 583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 5841220a4e283def0598468376cf112d3b904026fb8Danny Baumann return changed; 585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Called when the call waiting connection has been hung up */ 589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ void 590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onLocalDisconnect() { 59122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville doDisconnect(); 593cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (VDBG) Rlog.d(LOG_TAG, "onLoalDisconnect" ); 594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 59522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 59622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Returns true if state has changed, false if nothing changed 6035d65624eb9189b0369bf1d914a9fb7e141284226fionaxu public boolean 604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville update (DriverCall dc) { 6051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmCdmaCall newParent; 606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean changed = false; 607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wasConnectingInOrOut = isConnectingInOrOut(); 6081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean wasHolding = (getState() == GsmCdmaCall.State.HOLDING); 609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent = parentFromDCState(dc.state); 611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 61222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (Phone.DEBUG_PHONE) log("parent= " +mParent +", newParent= " + newParent); 613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 6141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //Ignore dc.number and dc.name in case of a handover connection 6151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm() && mOrigConnection != null) { 6161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (Phone.DEBUG_PHONE) log("update: mOrigConnection is not null"); 617fe215a7ee5ad268048410d545c0436b7d4a6bdd7Tyler Gunn } else if (isIncoming()) { 61874c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi if (!equalsBaseDialString(mAddress, dc.number) && (!mNumberConverted 61974c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi || !equalsBaseDialString(mConvertedNumber, dc.number))) { 6201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (Phone.DEBUG_PHONE) log("update: phone # changed!"); 6211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mAddress = dc.number; 6221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu changed = true; 6231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // A null cnapName should be the same as "" 627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (TextUtils.isEmpty(dc.name)) { 62822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!TextUtils.isEmpty(mCnapName)) { 629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 63022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = ""; 631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 63222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (!dc.name.equals(mCnapName)) { 633c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 63422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = dc.name; 635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 63722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (Phone.DEBUG_PHONE) log("--dssds----"+mCnapName); 63822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = dc.namePresentation; 63922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = dc.numberPresentation; 640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 64122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (newParent != mParent) { 64222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 64322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent.attach(this, dc); 64622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = newParent; 647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean parentStateChange; 65022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville parentStateChange = mParent.update (this, dc); 651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = changed || parentStateChange; 652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Some state-transition events */ 655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) log( 6571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "update: parent=" + mParent + 6581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ", hasNewParent=" + (newParent != mParent) + 6591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ", wasConnectingInOrOut=" + wasConnectingInOrOut + 660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", wasHolding=" + wasHolding + 661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", isConnectingInOrOut=" + isConnectingInOrOut() + 662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", changed=" + changed); 663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (wasConnectingInOrOut && !isConnectingInOrOut()) { 666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut(); 667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 6691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (changed && !wasHolding && (getState() == GsmCdmaCall.State.HOLDING)) { 670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We've transitioned into HOLDING 671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return changed; 675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is in the foregroundCall 679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * when a dial is initiated. 680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * We know we're ACTIVE, and we know we're going to end up 681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * HOLDING in the backgroundCall 682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fakeHoldBeforeDial() { 68522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 68622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 68922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = mOwner.mBackgroundCall; 6901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mParent.attachFake(this, GsmCdmaCall.State.HOLDING); 691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ int 6961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu getGsmCdmaIndex() throws CallStateException { 69722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mIndex >= 0) { 69822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIndex + 1; 699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 7001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu throw new CallStateException ("GsmCdma index not yet assigned"); 701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * An incoming or outgoing call has connected 706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut() { 70922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTime = System.currentTimeMillis(); 71022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTimeReal = SystemClock.elapsedRealtime(); 71122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDuration = 0; 712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // bug #678474: incoming call interpreted as missed call, even though 714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // it sounds like the user has picked up the call. 715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) { 71622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville log("onConnectedInOrOut: connectTime=" + mConnectTime); 717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 71922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mIsIncoming) { 720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // outgoing calls only 721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 72386ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan // Only release wake lock for incoming calls, for outgoing calls the wake lock 72486ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan // will be released after any pause-dial is completed 725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville doDisconnect() { 7310b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton mIndex = -1; 7320b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton mDisconnectTime = System.currentTimeMillis(); 7330b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton mDuration = SystemClock.elapsedRealtime() - mConnectTimeReal; 7340b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton mDisconnected = true; 7350b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton clearPostDialListeners(); 736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 7389b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam /*package*/ void 739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding() { 74022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHoldingStartTime = SystemClock.elapsedRealtime(); 741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 7421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Performs the appropriate action for a post-dial char, but does not 745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * notify application. returns false if the character is invalid and 746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * should be ignored 747c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processPostDialChar(char c) { 750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (PhoneNumberUtils.is12Key(c)) { 75122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.mCi.sendDtmf(c, mHandler.obtainMessage(EVENT_DTMF_DONE)); 7521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (isPause(c)) { 7531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isPhoneTypeGsm()) { 7541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setPostDialState(PostDialState.PAUSE); 7551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // From TS 22.101: 7571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // It continues... 7581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Upon the called party answering the UE shall send the DTMF digits 7591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // automatically to the network after a delay of 3 seconds( 20 ). 7601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // The digits shall be sent according to the procedures and timing 7611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // specified in 3GPP TS 24.008 [13]. The first occurrence of the 7621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // "DTMF Control Digits Separator" shall be used by the ME to 7631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // distinguish between the addressing digits (i.e. the phone number) 7641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // and the DTMF digits. Upon subsequent occurrences of the 7651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // separator, 7661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // the UE shall pause again for 3 seconds ( 20 ) before sending 7671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // any further DTMF digits. 76822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_PAUSE_DONE), 7691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isPhoneTypeGsm() ? PAUSE_DELAY_MILLIS_GSM: PAUSE_DELAY_MILLIS_CDMA); 7701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (isWait(c)) { 771c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.WAIT); 7721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (isWild(c)) { 773c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.WILD); 774c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 775c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 776c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 777c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 778c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 779c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 780c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 781cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 7821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String 7831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu getRemainingPostDialString() { 784032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan String subStr = super.getRemainingPostDialString(); 785032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan if (!isPhoneTypeGsm() && !TextUtils.isEmpty(subStr)) { 786032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan int wIndex = subStr.indexOf(PhoneNumberUtils.WAIT); 787032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan int pIndex = subStr.indexOf(PhoneNumberUtils.PAUSE); 788032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan 789032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan if (wIndex > 0 && (wIndex < pIndex || pIndex <= 0)) { 790032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan subStr = subStr.substring(0, wIndex); 791032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan } else if (pIndex > 0) { 792032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan subStr = subStr.substring(0, pIndex); 793c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 795c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return subStr; 796c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 797c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 7981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 7991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void updateParent(GsmCdmaCall oldParent, GsmCdmaCall newParent){ 800c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (newParent != oldParent) { 801c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (oldParent != null) { 802c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville oldParent.detach(this); 803c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 8041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu newParent.attachFake(this, GsmCdmaCall.State.ACTIVE); 80522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = newParent; 806c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 807c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 808c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 809c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 810c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void finalize() 811c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville { 812c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 8136bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu * It is understood that This finalizer is not guaranteed 814c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to be called and the release lock call is here just in 815c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * case there is some path that doesn't call onDisconnect 816c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and or onConnectedInOrOut. 817c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 8186bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu if (mPartialWakeLock != null && mPartialWakeLock.isHeld()) { 8196bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu Rlog.e(LOG_TAG, "UNEXPECTED; mPartialWakeLock is held when finalizing."); 820c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 8211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu clearPostDialListeners(); 822c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 824c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void 8261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu processNextPostDialChar() { 827c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char c = 0; 828c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Registrant postDialHandler; 829c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 83022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState == PostDialState.CANCELLED) { 83186ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan releaseWakeLock(); 832c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 833c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 834c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 83522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialString == null || 83622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString.length() <= mNextPostDialChar) { 837c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.COMPLETE); 838c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 83986ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan // We were holding a wake lock until pause-dial was complete, so give it up now 84086ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan releaseWakeLock(); 841c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 842c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // notifyMessage.arg1 is 0 on complete 843c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c = 0; 844c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 845c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isValid; 846c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 847c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 848c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 84922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville c = mPostDialString.charAt(mNextPostDialChar++); 850c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 851c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isValid = processPostDialChar(c); 852c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 853c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isValid) { 854c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Will call processNextPostDialChar 85522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget(); 856c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Don't notify application 8571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, "processNextPostDialChar: c=" + c + " isn't valid!"); 858c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 859c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 860c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 861c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8624567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen notifyPostDialListenersNextChar(c); 8634567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen 8644567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen // TODO: remove the following code since the handler no longer executes anything. 86593c62c8a71821f46194e16ca3e84f95e101edb90Amit Mahajan postDialHandler = mOwner.getPhone().getPostDialHandler(); 866c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 867c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message notifyMessage; 868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (postDialHandler != null 8701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && (notifyMessage = postDialHandler.messageForRegistrant()) != null) { 871c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The AsyncResult.result is the Connection object 87222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville PostDialState state = mPostDialState; 873c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult ar = AsyncResult.forMessage(notifyMessage); 874c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.result = this; 875c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.userObj = state; 876c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 877c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // arg1 is the character that was/is being processed 878c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.arg1 = c; 879c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //Rlog.v("GsmCdma", "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c); 881c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.sendToTarget(); 882c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 883c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 884c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 885c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** "connecting" means "has never been ACTIVE" for both incoming 886c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and outgoing calls 887c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 888c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 889c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isConnectingInOrOut() { 89022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mParent == null || mParent == mOwner.mRingingCall 8911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || mParent.mState == GsmCdmaCall.State.DIALING 8921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || mParent.mState == GsmCdmaCall.State.ALERTING; 893c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 894c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private GsmCdmaCall 896c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parentFromDCState (DriverCall.State state) { 897c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (state) { 898c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ACTIVE: 899c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case DIALING: 900c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ALERTING: 90122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mForegroundCall; 902c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 903c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 904c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case HOLDING: 90522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mBackgroundCall; 906c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 907c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 908c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case INCOMING: 909c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case WAITING: 91022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mRingingCall; 911c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 912c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 913c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 914c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new RuntimeException("illegal call state: " + state); 915c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 916c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 917c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 918c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 91986ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan * Set post dial state and acquire wake lock while switching to "started" or "pause" 92086ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan * state, the wake lock will be released if state switches out of "started" or "pause" 921c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * state or after WAKE_LOCK_TIMEOUT_MILLIS. 922c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param s new PostDialState 923c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 924c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void setPostDialState(PostDialState s) { 92586ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan if (s == PostDialState.STARTED || 92686ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan s == PostDialState.PAUSE) { 92786ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan synchronized (mPartialWakeLock) { 92886ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan if (mPartialWakeLock.isHeld()) { 92986ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 93086ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan } else { 93186ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan acquireWakeLock(); 93286ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan } 93322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); 93422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); 935c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 936c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 93786ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 93886ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan releaseWakeLock(); 939c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 94022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialState = s; 9410b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton notifyPostDialListeners(); 942c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 943c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9446bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu private void createWakeLock(Context context) { 9451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 946c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 947c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 948c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9496bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu private void acquireWakeLock() { 9506bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu if (mPartialWakeLock != null) { 9516bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu synchronized (mPartialWakeLock) { 9526bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu log("acquireWakeLock"); 9536bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu mPartialWakeLock.acquire(); 9546bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu } 9556bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu } 956c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 957c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9586bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu private void releaseWakeLock() { 9596bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu if (mPartialWakeLock != null) { 9606bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu synchronized (mPartialWakeLock) { 9616bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu if (mPartialWakeLock.isHeld()) { 9626bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu log("releaseWakeLock"); 9636bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu mPartialWakeLock.release(); 9646bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu } 965c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 966c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 967c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 968c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9696bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu private void releaseAllWakeLocks() { 9706bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu if (mPartialWakeLock != null) { 9716bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu synchronized (mPartialWakeLock) { 9726bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu while (mPartialWakeLock.isHeld()) { 9736bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu mPartialWakeLock.release(); 9746bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu } 9758f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan } 9768f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan } 9778f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan } 9788f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan 979c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static boolean isPause(char c) { 980c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return c == PhoneNumberUtils.PAUSE; 981c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 982c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 983c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static boolean isWait(char c) { 984c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return c == PhoneNumberUtils.WAIT; 985c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 986c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static boolean isWild(char c) { 9881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return c == PhoneNumberUtils.WILD; 9891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 992c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // This function is to find the next PAUSE character index if 993c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // multiple pauses in a row. Otherwise it finds the next non PAUSE or 994c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // non WAIT character index. 9956bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu private static int findNextPCharOrNonPOrNonWCharIndex(String phoneNumber, int currIndex) { 996c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wMatched = isWait(phoneNumber.charAt(currIndex)); 997c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int index = currIndex + 1; 998c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int length = phoneNumber.length(); 999c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville while (index < length) { 1000c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char cNext = phoneNumber.charAt(index); 1001c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // if there is any W inside P/W sequence,mark it 1002c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (isWait(cNext)) { 1003c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville wMatched = true; 1004c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1005c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // if any characters other than P/W chars after P/W sequence 1006c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // we break out the loop and append the correct 1007c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isWait(cNext) && !isPause(cNext)) { 1008c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1009c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1010c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville index++; 1011c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1012c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1013c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // It means the PAUSE character(s) is in the middle of dial string 1014c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // and it needs to be handled one by one. 1015c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((index < length) && (index > (currIndex + 1)) && 10161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ((wMatched == false) && isPause(phoneNumber.charAt(currIndex)))) { 1017c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return (currIndex + 1); 1018c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1019c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return index; 1020c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1021c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 10226bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu // CDMA 1023c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // This function returns either PAUSE or WAIT character to append. 1024c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // It is based on the next non PAUSE/WAIT character in the phoneNumber and the 1025c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // index for the current PAUSE/WAIT character 10266bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu private static char findPOrWCharToAppend(String phoneNumber, int currPwIndex, 10276bfad8034f8262da897f454fbe2ecc9f042a6090Jack Yu int nextNonPwCharIndex) { 1028c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char c = phoneNumber.charAt(currPwIndex); 1029c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char ret; 1030c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1031c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Append the PW char 1032c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ret = (isPause(c)) ? PhoneNumberUtils.PAUSE : PhoneNumberUtils.WAIT; 1033c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1034c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If the nextNonPwCharIndex is greater than currPwIndex + 1, 1035c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // it means the PW sequence contains not only P characters. 1036c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Since for the sequence that only contains P character, 1037c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // the P character is handled one by one, the nextNonPwCharIndex 1038c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // equals to currPwIndex + 1. 1039c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // In this case, skip P, append W. 1040c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (nextNonPwCharIndex > (currPwIndex + 1)) { 1041c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ret = PhoneNumberUtils.WAIT; 1042c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1043c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ret; 1044c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1045c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1046936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen private String maskDialString(String dialString) { 1047936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen if (VDBG) { 1048936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen return dialString; 1049936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen } 1050936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen 1051936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen return "<MASKED>"; 1052936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen } 1053936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen 10541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void fetchDtmfToneDelay(GsmCdmaPhone phone) { 1055059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn CarrierConfigManager configMgr = (CarrierConfigManager) 1056059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn phone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE); 1057059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn PersistableBundle b = configMgr.getConfigForSubId(phone.getSubId()); 1058059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn if (b != null) { 1059dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan mDtmfToneDelay = b.getInt(phone.getDtmfToneDelayKey()); 1060059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn } 1061059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn } 1062059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 10631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean isPhoneTypeGsm() { 10640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mOwner.getPhone().getPhoneType() == PhoneConstants.PHONE_TYPE_GSM; 10651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 10661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void log(String msg) { 10681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, "[GsmCdmaConn] " + msg); 10691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1070059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 1071c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1072c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public int getNumberPresentation() { 107322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mNumberPresentation; 1074c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1075c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1076c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1077c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public UUSInfo getUUSInfo() { 10781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mUusInfo; 1079c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 10800742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela 10810742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela public int getPreciseDisconnectCause() { 10820742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela return mPreciseCause; 10830742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela } 10840742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela 1085a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 108633cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu public String getVendorDisconnectCause() { 108733cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu return mVendorCause; 108833cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu } 108933cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu 109033cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu @Override 10911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void migrateFrom(Connection c) { 10921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (c == null) return; 10931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu super.migrateFrom(c); 10951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu this.mUusInfo = c.getUUSInfo(); 10971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu this.setUserData(c.getUserData()); 10991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1102a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public Connection getOrigConnection() { 11031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mOrigConnection; 1104a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1105a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1106a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 1107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isMultiparty() { 11081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mOrigConnection != null) { 11091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mOrigConnection.isMultiparty(); 11101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 1113a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 1115