GsmCdmaConnection.java revision cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9
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; 29ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog; 30c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.PhoneNumberUtils; 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; 36a914a2429cb352f1f294e15dc236b3721e81a823Alex Yakavenkaimport com.android.internal.telephony.uicc.UiccCardApplication; 37e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.uicc.UiccController; 38d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState; 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/** 41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide} 42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yupublic class GsmCdmaConnection extends Connection { 441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final String LOG_TAG = "GsmCdmaConnection"; 451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static final boolean DBG = true; 46cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private static final boolean VDBG = false; 47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Instance Variables 49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmCdmaCallTracker mOwner; 511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmCdmaCall mParent; 52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean mDisconnected; 541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int mIndex; // index in GsmCdmaCallTracker.connections[], -1 if unassigned 561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // The GsmCdma index is 1 + this 57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* 59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * These time/timespan values are based on System.currentTimeMillis(), 60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * i.e., "wall clock" time. 61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 6222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville long mDisconnectTime; 63c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu UUSInfo mUusInfo; 650742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela int mPreciseCause = 0; 6633cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu String mVendorCause; 67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Connection mOrigConnection; 691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 7022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Handler mHandler; 71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private PowerManager.WakeLock mPartialWakeLock; 73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 74cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger private boolean mIsEmergencyCall = false; 75cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger 76059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn // The cached delay to be used between DTMF tones fetched from carrier config. 77059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn private int mDtmfToneDelay = 0; 78059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Event Constants 80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_DTMF_DONE = 1; 81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_PAUSE_DONE = 2; 82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_NEXT_POST_DIAL = 3; 83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_WAKE_LOCK_TIMEOUT = 4; 84059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn static final int EVENT_DTMF_DELAY_DONE = 5; 85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constants 871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu static final int PAUSE_DELAY_MILLIS_GSM = 3 * 1000; 881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu static final int PAUSE_DELAY_MILLIS_CDMA = 2 * 1000; 89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000; 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Inner Classes 92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville class MyHandler extends Handler { 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville MyHandler(Looper l) {super(l);} 95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 96cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void 98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleMessage(Message msg) { 99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (msg.what) { 101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_NEXT_POST_DIAL: 102059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn case EVENT_DTMF_DELAY_DONE: 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_PAUSE_DONE: 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_WAKE_LOCK_TIMEOUT: 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 109059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn case EVENT_DTMF_DONE: 110059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn // We may need to add a delay specified by carrier between DTMF tones that are 111059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn // sent out. 112059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_DTMF_DELAY_DONE), 113059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn mDtmfToneDelay); 114059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn break; 115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constructors 120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 121cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger /** This is probably an MT call that we first saw in a CLCC response or a hand over. */ 1220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public GsmCdmaConnection (GsmCdmaPhone phone, DriverCall dc, GsmCdmaCallTracker ct, int index) { 123c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan super(phone.getPhoneType()); 124059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn createWakeLock(phone.getContext()); 125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 12722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 12822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 13022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = dc.number; 131cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger mIsEmergencyCall = PhoneNumberUtils.isLocalEmergencyNumber(phone.getContext(), mAddress); 13222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = dc.isMT; 13322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 13422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = dc.name; 13522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = dc.namePresentation; 13622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = dc.numberPresentation; 1371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mUusInfo = dc.uusInfo; 138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 13922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = index; 140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mParent = parentFromDCState(dc.state); 14222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.attach(this, dc); 143059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 144059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn fetchDtmfToneDelay(phone); 145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** This is an MO call, created when dialing */ 1480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public GsmCdmaConnection (GsmCdmaPhone phone, String dialString, GsmCdmaCallTracker ct, 149cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger GsmCdmaCall parent, boolean isEmergencyCall) { 150c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan super(phone.getPhoneType()); 151059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn createWakeLock(phone.getContext()); 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 15522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 1581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDialString = dialString; 1591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 160cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger Rlog.d(LOG_TAG, "[GsmCdmaConn] GsmCdmaConnection: dialString=" + 161cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger maskDialString(dialString)); 1621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu dialString = formatDialString(dialString); 1631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, 164cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger "[GsmCdmaConn] GsmCdmaConnection:formated dialString=" + 165cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger maskDialString(dialString)); 1661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 16822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString); 169cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger mIsEmergencyCall = isEmergencyCall; 17022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString); 171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 17222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = -1; 173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 17422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = false; 17522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = null; 17622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED; 17722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 17822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (parent != null) { 18122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = parent; 1821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 1831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu parent.attachFake(this, GsmCdmaCall.State.DIALING); 184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //for the three way call case, not change parent state 1861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (parent.mState == GsmCdmaCall.State.ACTIVE) { 1871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu parent.attachFake(this, GsmCdmaCall.State.ACTIVE); 1881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 1891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu parent.attachFake(this, GsmCdmaCall.State.DIALING); 1901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 194059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 195059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn fetchDtmfToneDelay(phone); 196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** This is a Call waiting call*/ 2000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public GsmCdmaConnection(Context context, CdmaCallWaitingNotification cw, GsmCdmaCallTracker ct, 2010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan GsmCdmaCall parent) { 202c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan super(parent.getPhone().getPhoneType()); 203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(context); 204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 20622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 20722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 20822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = cw.number; 20922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = cw.numberPresentation; 21022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = cw.name; 21122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = cw.namePresentation; 21222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = -1; 21322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = true; 21422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 21522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTime = 0; 21622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = parent; 2171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu parent.attachFake(this, GsmCdmaCall.State.WAITING); 218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 2228f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan clearPostDialListeners(); 2238dd4a1915f45460dfed9646470fbc0405bff934bAmit Mahajan if (mParent != null) { 2248dd4a1915f45460dfed9646470fbc0405bff934bAmit Mahajan mParent.detach(this); 2258dd4a1915f45460dfed9646470fbc0405bff934bAmit Mahajan } 2268f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan releaseAllWakeLocks(); 227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static boolean 230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville equalsHandlesNulls (Object a, Object b) { 231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return (a == null) ? (b == null) : a.equals (b); 232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 2351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 2361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * format original dial string 2371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 1) convert international dialing prefix "+" to 2381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * string specified per region 2391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 2401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 2) handle corner cases for PAUSE/WAIT dialing: 2411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 2421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * If PAUSE/WAIT sequence at the end, ignore them. 2431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 2441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * If consecutive PAUSE/WAIT sequence in the middle of the string, 2451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * and if there is any WAIT in PAUSE/WAIT sequence, treat them like WAIT. 2461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 2471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public static String formatDialString(String phoneNumber) { 2481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 2491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * TODO(cleanup): This function should move to PhoneNumberUtils, and 2501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * tests should be added. 2511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 2521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (phoneNumber == null) { 2541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return null; 2551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int length = phoneNumber.length(); 2571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu StringBuilder ret = new StringBuilder(); 2581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu char c; 2591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int currIndex = 0; 2601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu while (currIndex < length) { 2621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu c = phoneNumber.charAt(currIndex); 2631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPause(c) || isWait(c)) { 2641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (currIndex < length - 1) { 2651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // if PW not at the end 2661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int nextIndex = findNextPCharOrNonPOrNonWCharIndex(phoneNumber, currIndex); 2671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If there is non PW char following PW sequence 2681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (nextIndex < length) { 2691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu char pC = findPOrWCharToAppend(phoneNumber, currIndex, nextIndex); 2701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret.append(pC); 2711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If PW char sequence has more than 2 PW characters, 2721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // skip to the last PW character since the sequence already be 2731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // converted to WAIT character 2741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (nextIndex > (currIndex + 1)) { 2751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu currIndex = nextIndex - 1; 2761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (nextIndex == length) { 2781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // It means PW characters at the end, ignore 2791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu currIndex = length - 1; 2801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 2831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret.append(c); 2841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu currIndex++; 2861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return PhoneNumberUtils.cdmaCheckAndProcessPlusCode(ret.toString()); 2881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ boolean 291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville compareTo(DriverCall c) { 292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // On mobile originated (MO) calls, the phone number may have changed 293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // due to a SIM Toolkit call control modification. 294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We assume we know when MO calls are created (since we created them) 296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // and therefore don't need to compare the phone number anyway. 29722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (! (mIsIncoming || c.isMT)) return true; 298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // A new call appearing by SRVCC may have invalid number 3001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // if IMS service is not tightly coupled with cellular modem stack. 3011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Thus we prefer the preexisting handover connection instance. 3021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm() && mOrigConnection != null) return true; 3031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ... but we can compare phone numbers on MT calls, and we have 305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // no control over when they begin, so we might as well 306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String cAddress = PhoneNumberUtils.stringFromStringAndTOA(c.number, c.TOA); 30822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIsIncoming == c.isMT && equalsHandlesNulls(mAddress, cAddress); 309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 311cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getOrigDialString(){ 31322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mDialString; 314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 316cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 3171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public GsmCdmaCall getCall() { 31822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mParent; 319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 321cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getDisconnectTime() { 32322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mDisconnectTime; 324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 326cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getHoldDurationMillis() { 3281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (getState() != GsmCdmaCall.State.HOLDING) { 329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If not holding, return 0 330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 0; 331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 33222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return SystemClock.elapsedRealtime() - mHoldingStartTime; 333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 336cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 3371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public GsmCdmaCall.State getState() { 33822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mDisconnected) { 3391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return GsmCdmaCall.State.DISCONNECTED; 340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return super.getState(); 342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 345cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void hangup() throws CallStateException { 34722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 34822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.hangup(this); 349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 354cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void separate() throws CallStateException { 35622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 35722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.separate(this); 358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 363cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWaitChar() { 36522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.WAIT) { 3661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.w(LOG_TAG, "GsmCdmaConnection.proceedAfterWaitChar(): Expected " 3671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + "getPostDialState() to be WAIT but was " + mPostDialState); 368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 376cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWildChar(String str) { 37822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.WILD) { 3791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.w(LOG_TAG, "GsmCdmaConnection.proceedAfterWaitChar(): Expected " 38022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + "getPostDialState() to be WILD but was " + mPostDialState); 381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 386cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // make a new postDialString, with the wild char replacement string 387cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // at the beginning, followed by the remaining postDialString. 388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 389cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville StringBuilder buf = new StringBuilder(str); 39022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville buf.append(mPostDialString.substring(mNextPostDialChar)); 39122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString = buf.toString(); 39222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNextPostDialChar = 0; 393cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (Phone.DEBUG_PHONE) { 394cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("proceedAfterWildChar: new postDialString is " + 39522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString); 396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 397cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 398cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville processNextPostDialChar(); 399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 401cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void cancelPostDial() { 403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.CANCELLED); 404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is being hung up locally (eg, user pressed "end") 408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Note that at this point, the hangup request has been dispatched to the radio 409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * but no response has yet been received so update() has not yet been called 410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onHangupLocal() { 41322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCause = DisconnectCause.LOCAL; 4140742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela mPreciseCause = 0; 41533cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu mVendorCause = null; 416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 418b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /** 419b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * Maps RIL call disconnect code to {@link DisconnectCause}. 420b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @param causeCode RIL disconnect code 421b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @return the corresponding value from {@link DisconnectCause} 422b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen */ 423b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen int disconnectCauseFromCode(int causeCode) { 424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See 22.001 Annex F.4 for mapping of cause codes 426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to local tones 427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (causeCode) { 430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.USER_BUSY: 431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.BUSY; 4321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NO_CIRCUIT_AVAIL: 4341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.TEMPORARY_FAILURE: 4351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.SWITCHING_CONGESTION: 4361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.CHANNEL_NOT_AVAIL: 4371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.QOS_NOT_AVAIL: 4381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.BEARER_NOT_AVAIL: 439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CONGESTION; 4401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ACM_LIMIT_EXCEEDED: 442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.LIMIT_EXCEEDED; 4431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CALL_BARRED: 445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CALL_BARRED; 4461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.FDN_BLOCKED: 448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.FDN_BLOCKED; 4491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.UNOBTAINABLE_NUMBER: 4511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.UNOBTAINABLE_NUMBER; 4521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 45309b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_USSD: 45409b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_USSD; 4551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 45609b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_SS: 45709b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_SS; 4581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 45909b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_DIAL: 46009b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_DIAL; 4611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_LOCKED_UNTIL_POWER_CYCLE: 463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_LOCKED_UNTIL_POWER_CYCLE; 4641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_DROP: 466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_DROP; 4671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_INTERCEPT: 469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_INTERCEPT; 4701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_REORDER: 472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_REORDER; 4731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_SO_REJECT: 475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_SO_REJECT; 4761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_RETRY_ORDER: 478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_RETRY_ORDER; 4791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_ACCESS_FAILURE: 481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_ACCESS_FAILURE; 4821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_PREEMPTED: 484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_PREEMPTED; 4851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_NOT_EMERGENCY: 487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_NOT_EMERGENCY; 4881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_ACCESS_BLOCKED: 490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_ACCESS_BLOCKED; 4911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ERROR_UNSPECIFIED: 493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NORMAL_CLEARING: 494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 4950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan GsmCdmaPhone phone = mOwner.getPhone(); 496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int serviceState = phone.getServiceState().getState(); 4971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu UiccCardApplication cardApp = phone.getUiccCardApplication(); 4981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu AppState uiccAppState = (cardApp != null) ? cardApp.getState() : 499cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger AppState.APPSTATE_UNKNOWN; 500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (serviceState == ServiceState.STATE_POWER_OFF) { 501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.POWER_OFF; 502cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } 503cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (!mIsEmergencyCall) { 504cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // Only send OUT_OF_SERVICE if it is not an emergency call. We can still 505cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // technically be in STATE_OUT_OF_SERVICE or STATE_EMERGENCY_ONLY during 506cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // an emergency call and when it ends, we do not want to mistakenly generate 507cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // an OUT_OF_SERVICE disconnect cause during normal call ending. 508cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if ((serviceState == ServiceState.STATE_OUT_OF_SERVICE 509cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger || serviceState == ServiceState.STATE_EMERGENCY_ONLY)) { 510cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger return DisconnectCause.OUT_OF_SERVICE; 511cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } 512cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // If we are placing an emergency call and the SIM is currently PIN/PUK 513cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // locked the AppState will always not be equal to APPSTATE_READY. 514cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (uiccAppState != AppState.APPSTATE_READY) { 515cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (isPhoneTypeGsm()) { 5161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.ICC_ERROR; 517cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } else { // CDMA 518cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (phone.mCdmaSubscriptionSource == 519cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_RUIM) { 520cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger return DisconnectCause.ICC_ERROR; 5211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 523cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } 524cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } 525cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (isPhoneTypeGsm()) { 526cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (causeCode == CallFailCause.ERROR_UNSPECIFIED) { 527cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (phone.mSST.mRestrictedState.isCsRestricted()) { 528cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger return DisconnectCause.CS_RESTRICTED; 529cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } else if (phone.mSST.mRestrictedState.isCsEmergencyRestricted()) { 530cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger return DisconnectCause.CS_RESTRICTED_EMERGENCY; 531cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } else if (phone.mSST.mRestrictedState.isCsNormalRestricted()) { 532cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger return DisconnectCause.CS_RESTRICTED_NORMAL; 5331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 536cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger if (causeCode == CallFailCause.NORMAL_CLEARING) { 537cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger return DisconnectCause.NORMAL; 538cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger } 539cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // If nothing else matches, report unknown call drop reason 540cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger // to app, not NORMAL call end. 541cdcf059efaf8f413cecc88f3ef8e05ef811fa5e9Brad Ebinger return DisconnectCause.ERROR_UNSPECIFIED; 542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ void 54633cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu onRemoteDisconnect(int causeCode, String vendorCause) { 5470742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela this.mPreciseCause = causeCode; 54833cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu this.mVendorCause = vendorCause; 549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onDisconnect(disconnectCauseFromCode(causeCode)); 550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 552b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /** 553b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * Called when the radio indicates the connection has been disconnected. 554b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @param cause call disconnect cause; values are defined in {@link DisconnectCause} 555b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen */ 556c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan @Override 557c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan public boolean onDisconnect(int cause) { 5581220a4e283def0598468376cf112d3b904026fb8Danny Baumann boolean changed = false; 5591220a4e283def0598468376cf112d3b904026fb8Danny Baumann 56022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCause = cause; 561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 56222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville doDisconnect(); 5641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) Rlog.d(LOG_TAG, "onDisconnect: cause=" + cause); 566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mOwner.getPhone().notifyDisconnect(this); 568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 56922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 5701220a4e283def0598468376cf112d3b904026fb8Danny Baumann changed = mParent.connectionDisconnected(this); 571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 5721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mOrigConnection = null; 574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 5751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu clearPostDialListeners(); 576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 5771220a4e283def0598468376cf112d3b904026fb8Danny Baumann return changed; 578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Called when the call waiting connection has been hung up */ 582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ void 583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onLocalDisconnect() { 58422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville doDisconnect(); 586cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (VDBG) Rlog.d(LOG_TAG, "onLoalDisconnect" ); 587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 58822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 58922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Returns true if state has changed, false if nothing changed 5965d65624eb9189b0369bf1d914a9fb7e141284226fionaxu public boolean 597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville update (DriverCall dc) { 5981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmCdmaCall newParent; 599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean changed = false; 600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wasConnectingInOrOut = isConnectingInOrOut(); 6011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean wasHolding = (getState() == GsmCdmaCall.State.HOLDING); 602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent = parentFromDCState(dc.state); 604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 60522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (Phone.DEBUG_PHONE) log("parent= " +mParent +", newParent= " + newParent); 606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 6071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //Ignore dc.number and dc.name in case of a handover connection 6081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm() && mOrigConnection != null) { 6091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (Phone.DEBUG_PHONE) log("update: mOrigConnection is not null"); 6101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 6111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log(" mNumberConverted " + mNumberConverted); 6121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!equalsHandlesNulls(mAddress, dc.number) && (!mNumberConverted 6131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || !equalsHandlesNulls(mConvertedNumber, dc.number))) { 6141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (Phone.DEBUG_PHONE) log("update: phone # changed!"); 6151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mAddress = dc.number; 6161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu changed = true; 6171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // A null cnapName should be the same as "" 621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (TextUtils.isEmpty(dc.name)) { 62222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!TextUtils.isEmpty(mCnapName)) { 623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 62422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = ""; 625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 62622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (!dc.name.equals(mCnapName)) { 627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 62822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = dc.name; 629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 63122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (Phone.DEBUG_PHONE) log("--dssds----"+mCnapName); 63222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = dc.namePresentation; 63322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = dc.numberPresentation; 634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 63522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (newParent != mParent) { 63622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 63722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent.attach(this, dc); 64022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = newParent; 641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean parentStateChange; 64422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville parentStateChange = mParent.update (this, dc); 645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = changed || parentStateChange; 646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Some state-transition events */ 649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) log( 6511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "update: parent=" + mParent + 6521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ", hasNewParent=" + (newParent != mParent) + 6531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ", wasConnectingInOrOut=" + wasConnectingInOrOut + 654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", wasHolding=" + wasHolding + 655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", isConnectingInOrOut=" + isConnectingInOrOut() + 656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", changed=" + changed); 657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (wasConnectingInOrOut && !isConnectingInOrOut()) { 660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut(); 661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 6631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (changed && !wasHolding && (getState() == GsmCdmaCall.State.HOLDING)) { 664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We've transitioned into HOLDING 665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return changed; 669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is in the foregroundCall 673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * when a dial is initiated. 674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * We know we're ACTIVE, and we know we're going to end up 675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * HOLDING in the backgroundCall 676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fakeHoldBeforeDial() { 67922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 68022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 68322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = mOwner.mBackgroundCall; 6841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mParent.attachFake(this, GsmCdmaCall.State.HOLDING); 685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ int 6901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu getGsmCdmaIndex() throws CallStateException { 69122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mIndex >= 0) { 69222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIndex + 1; 693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 6941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu throw new CallStateException ("GsmCdma index not yet assigned"); 695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * An incoming or outgoing call has connected 700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut() { 70322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTime = System.currentTimeMillis(); 70422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTimeReal = SystemClock.elapsedRealtime(); 70522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDuration = 0; 706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // bug #678474: incoming call interpreted as missed call, even though 708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // it sounds like the user has picked up the call. 709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) { 71022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville log("onConnectedInOrOut: connectTime=" + mConnectTime); 711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 71322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mIsIncoming) { 714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // outgoing calls only 715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 71786ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan // Only release wake lock for incoming calls, for outgoing calls the wake lock 71886ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan // will be released after any pause-dial is completed 719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 723c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville doDisconnect() { 7250b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton mIndex = -1; 7260b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton mDisconnectTime = System.currentTimeMillis(); 7270b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton mDuration = SystemClock.elapsedRealtime() - mConnectTimeReal; 7280b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton mDisconnected = true; 7290b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton clearPostDialListeners(); 730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 7329b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam /*package*/ void 733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding() { 73422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHoldingStartTime = SystemClock.elapsedRealtime(); 735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 7361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Performs the appropriate action for a post-dial char, but does not 739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * notify application. returns false if the character is invalid and 740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * should be ignored 741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processPostDialChar(char c) { 744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (PhoneNumberUtils.is12Key(c)) { 74522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.mCi.sendDtmf(c, mHandler.obtainMessage(EVENT_DTMF_DONE)); 7461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (isPause(c)) { 7471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isPhoneTypeGsm()) { 7481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setPostDialState(PostDialState.PAUSE); 7491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // From TS 22.101: 7511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // It continues... 7521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Upon the called party answering the UE shall send the DTMF digits 7531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // automatically to the network after a delay of 3 seconds( 20 ). 7541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // The digits shall be sent according to the procedures and timing 7551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // specified in 3GPP TS 24.008 [13]. The first occurrence of the 7561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // "DTMF Control Digits Separator" shall be used by the ME to 7571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // distinguish between the addressing digits (i.e. the phone number) 7581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // and the DTMF digits. Upon subsequent occurrences of the 7591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // separator, 7601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // the UE shall pause again for 3 seconds ( 20 ) before sending 7611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // any further DTMF digits. 76222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_PAUSE_DONE), 7631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isPhoneTypeGsm() ? PAUSE_DELAY_MILLIS_GSM: PAUSE_DELAY_MILLIS_CDMA); 7641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (isWait(c)) { 765c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.WAIT); 7661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (isWild(c)) { 767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.WILD); 768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 769c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 770c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 771c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 772c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 773c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 774c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 775cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 7761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String 7771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu getRemainingPostDialString() { 778032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan String subStr = super.getRemainingPostDialString(); 779032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan if (!isPhoneTypeGsm() && !TextUtils.isEmpty(subStr)) { 780032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan int wIndex = subStr.indexOf(PhoneNumberUtils.WAIT); 781032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan int pIndex = subStr.indexOf(PhoneNumberUtils.PAUSE); 782032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan 783032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan if (wIndex > 0 && (wIndex < pIndex || pIndex <= 0)) { 784032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan subStr = subStr.substring(0, wIndex); 785032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan } else if (pIndex > 0) { 786032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan subStr = subStr.substring(0, pIndex); 787c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 788c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 789c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return subStr; 790c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 791c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 7921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 7931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void updateParent(GsmCdmaCall oldParent, GsmCdmaCall newParent){ 794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (newParent != oldParent) { 795c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (oldParent != null) { 796c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville oldParent.detach(this); 797c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 7981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu newParent.attachFake(this, GsmCdmaCall.State.ACTIVE); 79922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = newParent; 800c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 801c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 802c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 803c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 804c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void finalize() 805c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville { 806c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 807c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * It is understood that This finializer is not guaranteed 808c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to be called and the release lock call is here just in 809c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * case there is some path that doesn't call onDisconnect 810c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and or onConnectedInOrOut. 811c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 812c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mPartialWakeLock.isHeld()) { 8131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, "[GsmCdmaConn] UNEXPECTED; mPartialWakeLock is held when finalizing."); 814c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 8151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu clearPostDialListeners(); 816c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 817c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 818c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void 8201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu processNextPostDialChar() { 821c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char c = 0; 822c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Registrant postDialHandler; 823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 82422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState == PostDialState.CANCELLED) { 82586ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan releaseWakeLock(); 826c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 827c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 828c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 82922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialString == null || 83022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString.length() <= mNextPostDialChar) { 831c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.COMPLETE); 832c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 83386ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan // We were holding a wake lock until pause-dial was complete, so give it up now 83486ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan releaseWakeLock(); 835c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 836c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // notifyMessage.arg1 is 0 on complete 837c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c = 0; 838c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 839c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isValid; 840c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 841c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 842c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 84322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville c = mPostDialString.charAt(mNextPostDialChar++); 844c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 845c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isValid = processPostDialChar(c); 846c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 847c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isValid) { 848c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Will call processNextPostDialChar 84922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget(); 850c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Don't notify application 8511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, "processNextPostDialChar: c=" + c + " isn't valid!"); 852c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 853c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 854c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 855c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8564567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen notifyPostDialListenersNextChar(c); 8574567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen 8584567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen // TODO: remove the following code since the handler no longer executes anything. 85993c62c8a71821f46194e16ca3e84f95e101edb90Amit Mahajan postDialHandler = mOwner.getPhone().getPostDialHandler(); 860c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 861c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message notifyMessage; 862c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (postDialHandler != null 8641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && (notifyMessage = postDialHandler.messageForRegistrant()) != null) { 865c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The AsyncResult.result is the Connection object 86622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville PostDialState state = mPostDialState; 867c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult ar = AsyncResult.forMessage(notifyMessage); 868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.result = this; 869c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.userObj = state; 870c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 871c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // arg1 is the character that was/is being processed 872c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.arg1 = c; 873c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //Rlog.v("GsmCdma", "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c); 875c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.sendToTarget(); 876c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 877c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 878c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 879c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** "connecting" means "has never been ACTIVE" for both incoming 880c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and outgoing calls 881c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 882c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 883c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isConnectingInOrOut() { 88422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mParent == null || mParent == mOwner.mRingingCall 8851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || mParent.mState == GsmCdmaCall.State.DIALING 8861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || mParent.mState == GsmCdmaCall.State.ALERTING; 887c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 888c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private GsmCdmaCall 890c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parentFromDCState (DriverCall.State state) { 891c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (state) { 892c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ACTIVE: 893c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case DIALING: 894c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ALERTING: 89522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mForegroundCall; 896c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 897c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 898c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case HOLDING: 89922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mBackgroundCall; 900c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 901c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 902c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case INCOMING: 903c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case WAITING: 90422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mRingingCall; 905c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 906c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 907c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 908c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new RuntimeException("illegal call state: " + state); 909c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 910c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 911c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 912c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 91386ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan * Set post dial state and acquire wake lock while switching to "started" or "pause" 91486ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan * state, the wake lock will be released if state switches out of "started" or "pause" 915c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * state or after WAKE_LOCK_TIMEOUT_MILLIS. 916c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param s new PostDialState 917c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 918c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void setPostDialState(PostDialState s) { 91986ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan if (s == PostDialState.STARTED || 92086ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan s == PostDialState.PAUSE) { 92186ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan synchronized (mPartialWakeLock) { 92286ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan if (mPartialWakeLock.isHeld()) { 92386ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 92486ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan } else { 92586ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan acquireWakeLock(); 92686ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan } 92722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); 92822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); 929c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 930c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 93186ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 93286ab6968a950b56a682da335ff73243f35cb8485Amit Mahajan releaseWakeLock(); 933c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 93422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialState = s; 9350b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton notifyPostDialListeners(); 936c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 937c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void 9391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu createWakeLock(Context context) { 9401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 941c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 942c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 943c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void 9451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu acquireWakeLock() { 946c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("acquireWakeLock"); 947c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock.acquire(); 948c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 949c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void 9511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu releaseWakeLock() { 9521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu synchronized(mPartialWakeLock) { 953c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mPartialWakeLock.isHeld()) { 954c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("releaseWakeLock"); 955c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock.release(); 956c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 957c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 958c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 959c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void 9611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu releaseAllWakeLocks() { 9621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu synchronized(mPartialWakeLock) { 9638f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan while (mPartialWakeLock.isHeld()) { 9648f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan mPartialWakeLock.release(); 9658f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan } 9668f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan } 9678f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan } 9688f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan 969c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static boolean isPause(char c) { 970c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return c == PhoneNumberUtils.PAUSE; 971c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 972c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 973c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static boolean isWait(char c) { 974c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return c == PhoneNumberUtils.WAIT; 975c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 976c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static boolean isWild(char c) { 9781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return c == PhoneNumberUtils.WILD; 9791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 982c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // This function is to find the next PAUSE character index if 983c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // multiple pauses in a row. Otherwise it finds the next non PAUSE or 984c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // non WAIT character index. 985c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static int 986c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville findNextPCharOrNonPOrNonWCharIndex(String phoneNumber, int currIndex) { 987c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wMatched = isWait(phoneNumber.charAt(currIndex)); 988c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int index = currIndex + 1; 989c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int length = phoneNumber.length(); 990c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville while (index < length) { 991c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char cNext = phoneNumber.charAt(index); 992c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // if there is any W inside P/W sequence,mark it 993c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (isWait(cNext)) { 994c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville wMatched = true; 995c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 996c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // if any characters other than P/W chars after P/W sequence 997c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // we break out the loop and append the correct 998c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isWait(cNext) && !isPause(cNext)) { 999c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1000c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1001c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville index++; 1002c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1003c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1004c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // It means the PAUSE character(s) is in the middle of dial string 1005c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // and it needs to be handled one by one. 1006c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((index < length) && (index > (currIndex + 1)) && 10071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ((wMatched == false) && isPause(phoneNumber.charAt(currIndex)))) { 1008c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return (currIndex + 1); 1009c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1010c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return index; 1011c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1012c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 10131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 1014c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // This function returns either PAUSE or WAIT character to append. 1015c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // It is based on the next non PAUSE/WAIT character in the phoneNumber and the 1016c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // index for the current PAUSE/WAIT character 1017c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static char 1018c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville findPOrWCharToAppend(String phoneNumber, int currPwIndex, int nextNonPwCharIndex) { 1019c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char c = phoneNumber.charAt(currPwIndex); 1020c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char ret; 1021c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1022c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Append the PW char 1023c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ret = (isPause(c)) ? PhoneNumberUtils.PAUSE : PhoneNumberUtils.WAIT; 1024c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1025c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If the nextNonPwCharIndex is greater than currPwIndex + 1, 1026c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // it means the PW sequence contains not only P characters. 1027c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Since for the sequence that only contains P character, 1028c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // the P character is handled one by one, the nextNonPwCharIndex 1029c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // equals to currPwIndex + 1. 1030c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // In this case, skip P, append W. 1031c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (nextNonPwCharIndex > (currPwIndex + 1)) { 1032c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ret = PhoneNumberUtils.WAIT; 1033c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1034c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ret; 1035c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1036c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1037936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen private String maskDialString(String dialString) { 1038936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen if (VDBG) { 1039936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen return dialString; 1040936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen } 1041936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen 1042936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen return "<MASKED>"; 1043936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen } 1044936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen 10451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void fetchDtmfToneDelay(GsmCdmaPhone phone) { 1046059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn CarrierConfigManager configMgr = (CarrierConfigManager) 1047059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn phone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE); 1048059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn PersistableBundle b = configMgr.getConfigForSubId(phone.getSubId()); 1049059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn if (b != null) { 1050dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan mDtmfToneDelay = b.getInt(phone.getDtmfToneDelayKey()); 1051059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn } 1052059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn } 1053059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 10541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean isPhoneTypeGsm() { 10550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mOwner.getPhone().getPhoneType() == PhoneConstants.PHONE_TYPE_GSM; 10561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 10571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void log(String msg) { 10591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, "[GsmCdmaConn] " + msg); 10601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1061059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 1062c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1063c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public int getNumberPresentation() { 106422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mNumberPresentation; 1065c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1066c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1067c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1068c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public UUSInfo getUUSInfo() { 10691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mUusInfo; 1070c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 10710742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela 10720742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela public int getPreciseDisconnectCause() { 10730742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela return mPreciseCause; 10740742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela } 10750742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela 1076a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 107733cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu public String getVendorDisconnectCause() { 107833cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu return mVendorCause; 107933cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu } 108033cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu 108133cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu @Override 10821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void migrateFrom(Connection c) { 10831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (c == null) return; 10841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu super.migrateFrom(c); 10861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu this.mUusInfo = c.getUUSInfo(); 10881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu this.setUserData(c.getUserData()); 10901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 10911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1093a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public Connection getOrigConnection() { 10941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mOrigConnection; 1095a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1096a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1097a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 1098a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isMultiparty() { 10991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mOrigConnection != null) { 11001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mOrigConnection.isMultiparty(); 11011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 1104a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 1106