GsmCdmaConnection.java revision 032d73c15281387a97cdb91c6f0c7c3a1b1b230e
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 74059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn // The cached delay to be used between DTMF tones fetched from carrier config. 75059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn private int mDtmfToneDelay = 0; 76059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Event Constants 78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_DTMF_DONE = 1; 79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_PAUSE_DONE = 2; 80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_NEXT_POST_DIAL = 3; 81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_WAKE_LOCK_TIMEOUT = 4; 82059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn static final int EVENT_DTMF_DELAY_DONE = 5; 83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constants 851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu static final int PAUSE_DELAY_MILLIS_GSM = 3 * 1000; 861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu static final int PAUSE_DELAY_MILLIS_CDMA = 2 * 1000; 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000; 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Inner Classes 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville class MyHandler extends Handler { 92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville MyHandler(Looper l) {super(l);} 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 94cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void 96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleMessage(Message msg) { 97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (msg.what) { 99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_NEXT_POST_DIAL: 100059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn case EVENT_DTMF_DELAY_DONE: 101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_PAUSE_DONE: 102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_WAKE_LOCK_TIMEOUT: 105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 107059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn case EVENT_DTMF_DONE: 108059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn // We may need to add a delay specified by carrier between DTMF tones that are 109059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn // sent out. 110059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_DTMF_DELAY_DONE), 111059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn mDtmfToneDelay); 112059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn break; 113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constructors 118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** This is probably an MT call that we first saw in a CLCC response */ 1200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public GsmCdmaConnection (GsmCdmaPhone phone, DriverCall dc, GsmCdmaCallTracker ct, int index) { 121c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan super(phone.getPhoneType()); 122059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn createWakeLock(phone.getContext()); 123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 12522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 12622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 12822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = dc.number; 129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 13022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = dc.isMT; 13122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 13222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = dc.name; 13322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = dc.namePresentation; 13422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = dc.numberPresentation; 1351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mUusInfo = dc.uusInfo; 136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 13722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = index; 138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mParent = parentFromDCState(dc.state); 14022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.attach(this, dc); 141059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 142059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn fetchDtmfToneDelay(phone); 143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** This is an MO call, created when dialing */ 1460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public GsmCdmaConnection (GsmCdmaPhone phone, String dialString, GsmCdmaCallTracker ct, 1470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan GsmCdmaCall parent) { 148c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan super(phone.getPhoneType()); 149059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn createWakeLock(phone.getContext()); 150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 15322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 1561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mDialString = dialString; 1571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 1581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, "[GsmCdmaConn] GsmCdmaConnection: dialString=" + maskDialString(dialString)); 1591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu dialString = formatDialString(dialString); 1601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, 1611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "[GsmCdmaConn] GsmCdmaConnection:formated dialString=" + maskDialString(dialString)); 1621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 16422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString); 16522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString); 166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 16722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = -1; 168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 16922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = false; 17022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = null; 17122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED; 17222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 17322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (parent != null) { 17622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = parent; 1771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 1781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu parent.attachFake(this, GsmCdmaCall.State.DIALING); 179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 1801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //for the three way call case, not change parent state 1811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (parent.mState == GsmCdmaCall.State.ACTIVE) { 1821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu parent.attachFake(this, GsmCdmaCall.State.ACTIVE); 1831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 1841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu parent.attachFake(this, GsmCdmaCall.State.DIALING); 1851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 189059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 190059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn fetchDtmfToneDelay(phone); 191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** This is a Call waiting call*/ 1950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public GsmCdmaConnection(Context context, CdmaCallWaitingNotification cw, GsmCdmaCallTracker ct, 1960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan GsmCdmaCall parent) { 197c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan super(parent.getPhone().getPhoneType()); 198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(context); 199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 20122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 20222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 20322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = cw.number; 20422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = cw.numberPresentation; 20522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = cw.name; 20622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = cw.namePresentation; 20722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = -1; 20822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = true; 20922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 21022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTime = 0; 21122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = parent; 2121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu parent.attachFake(this, GsmCdmaCall.State.WAITING); 213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 2178f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan clearPostDialListeners(); 2188f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan releaseAllWakeLocks(); 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static boolean 222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville equalsHandlesNulls (Object a, Object b) { 223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return (a == null) ? (b == null) : a.equals (b); 224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 2271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 2281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * format original dial string 2291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 1) convert international dialing prefix "+" to 2301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * string specified per region 2311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 2321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 2) handle corner cases for PAUSE/WAIT dialing: 2331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 2341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * If PAUSE/WAIT sequence at the end, ignore them. 2351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * 2361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * If consecutive PAUSE/WAIT sequence in the middle of the string, 2371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * and if there is any WAIT in PAUSE/WAIT sequence, treat them like WAIT. 2381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 2391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public static String formatDialString(String phoneNumber) { 2401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu /** 2411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * TODO(cleanup): This function should move to PhoneNumberUtils, and 2421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * tests should be added. 2431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu */ 2441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (phoneNumber == null) { 2461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return null; 2471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int length = phoneNumber.length(); 2491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu StringBuilder ret = new StringBuilder(); 2501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu char c; 2511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int currIndex = 0; 2521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 2531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu while (currIndex < length) { 2541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu c = phoneNumber.charAt(currIndex); 2551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPause(c) || isWait(c)) { 2561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (currIndex < length - 1) { 2571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // if PW not at the end 2581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu int nextIndex = findNextPCharOrNonPOrNonWCharIndex(phoneNumber, currIndex); 2591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If there is non PW char following PW sequence 2601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (nextIndex < length) { 2611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu char pC = findPOrWCharToAppend(phoneNumber, currIndex, nextIndex); 2621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret.append(pC); 2631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If PW char sequence has more than 2 PW characters, 2641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // skip to the last PW character since the sequence already be 2651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // converted to WAIT character 2661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (nextIndex > (currIndex + 1)) { 2671a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu currIndex = nextIndex - 1; 2681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (nextIndex == length) { 2701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // It means PW characters at the end, ignore 2711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu currIndex = length - 1; 2721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 2751a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ret.append(c); 2761a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu currIndex++; 2781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2791a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return PhoneNumberUtils.cdmaCheckAndProcessPlusCode(ret.toString()); 2801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 2811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ boolean 283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville compareTo(DriverCall c) { 284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // On mobile originated (MO) calls, the phone number may have changed 285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // due to a SIM Toolkit call control modification. 286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We assume we know when MO calls are created (since we created them) 288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // and therefore don't need to compare the phone number anyway. 28922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (! (mIsIncoming || c.isMT)) return true; 290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 2911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // A new call appearing by SRVCC may have invalid number 2921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // if IMS service is not tightly coupled with cellular modem stack. 2931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Thus we prefer the preexisting handover connection instance. 2941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm() && mOrigConnection != null) return true; 2951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ... but we can compare phone numbers on MT calls, and we have 297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // no control over when they begin, so we might as well 298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String cAddress = PhoneNumberUtils.stringFromStringAndTOA(c.number, c.TOA); 30022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIsIncoming == c.isMT && equalsHandlesNulls(mAddress, cAddress); 301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 303cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getOrigDialString(){ 30522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mDialString; 306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 308cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 3091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public GsmCdmaCall getCall() { 31022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mParent; 311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 313cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getDisconnectTime() { 31522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mDisconnectTime; 316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 318cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getHoldDurationMillis() { 3201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (getState() != GsmCdmaCall.State.HOLDING) { 321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If not holding, return 0 322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 0; 323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 32422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return SystemClock.elapsedRealtime() - mHoldingStartTime; 325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 328cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 3291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public GsmCdmaCall.State getState() { 33022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mDisconnected) { 3311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return GsmCdmaCall.State.DISCONNECTED; 332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return super.getState(); 334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 337cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void hangup() throws CallStateException { 33922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 34022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.hangup(this); 341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 346cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void separate() throws CallStateException { 34822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 34922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.separate(this); 350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 355cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWaitChar() { 35722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.WAIT) { 3581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.w(LOG_TAG, "GsmCdmaConnection.proceedAfterWaitChar(): Expected " 3591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu + "getPostDialState() to be WAIT but was " + mPostDialState); 360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 368cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWildChar(String str) { 37022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.WILD) { 3711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.w(LOG_TAG, "GsmCdmaConnection.proceedAfterWaitChar(): Expected " 37222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + "getPostDialState() to be WILD but was " + mPostDialState); 373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 378cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // make a new postDialString, with the wild char replacement string 379cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // at the beginning, followed by the remaining postDialString. 380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 381cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville StringBuilder buf = new StringBuilder(str); 38222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville buf.append(mPostDialString.substring(mNextPostDialChar)); 38322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString = buf.toString(); 38422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNextPostDialChar = 0; 385cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (Phone.DEBUG_PHONE) { 386cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("proceedAfterWildChar: new postDialString is " + 38722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString); 388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 389cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 390cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville processNextPostDialChar(); 391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 393cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void cancelPostDial() { 395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.CANCELLED); 396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is being hung up locally (eg, user pressed "end") 400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Note that at this point, the hangup request has been dispatched to the radio 401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * but no response has yet been received so update() has not yet been called 402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onHangupLocal() { 40522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCause = DisconnectCause.LOCAL; 4060742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela mPreciseCause = 0; 40733cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu mVendorCause = null; 408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 410b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /** 411b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * Maps RIL call disconnect code to {@link DisconnectCause}. 412b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @param causeCode RIL disconnect code 413b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @return the corresponding value from {@link DisconnectCause} 414b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen */ 415b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen int disconnectCauseFromCode(int causeCode) { 416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See 22.001 Annex F.4 for mapping of cause codes 418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to local tones 419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (causeCode) { 422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.USER_BUSY: 423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.BUSY; 4241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NO_CIRCUIT_AVAIL: 4261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.TEMPORARY_FAILURE: 4271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.SWITCHING_CONGESTION: 4281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.CHANNEL_NOT_AVAIL: 4291a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.QOS_NOT_AVAIL: 4301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.BEARER_NOT_AVAIL: 431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CONGESTION; 4321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ACM_LIMIT_EXCEEDED: 434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.LIMIT_EXCEEDED; 4351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CALL_BARRED: 437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CALL_BARRED; 4381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.FDN_BLOCKED: 440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.FDN_BLOCKED; 4411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 4421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu case CallFailCause.UNOBTAINABLE_NUMBER: 4431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.UNOBTAINABLE_NUMBER; 4441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 44509b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_USSD: 44609b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_USSD; 4471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 44809b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_SS: 44909b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_SS; 4501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 45109b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_DIAL: 45209b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_DIAL; 4531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 454c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_LOCKED_UNTIL_POWER_CYCLE: 455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_LOCKED_UNTIL_POWER_CYCLE; 4561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_DROP: 458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_DROP; 4591a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_INTERCEPT: 461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_INTERCEPT; 4621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_REORDER: 464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_REORDER; 4651a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_SO_REJECT: 467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_SO_REJECT; 4681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_RETRY_ORDER: 470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_RETRY_ORDER; 4711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_ACCESS_FAILURE: 473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_ACCESS_FAILURE; 4741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_PREEMPTED: 476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_PREEMPTED; 4771a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_NOT_EMERGENCY: 479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_NOT_EMERGENCY; 4801a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CDMA_ACCESS_BLOCKED: 482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CDMA_ACCESS_BLOCKED; 4831a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ERROR_UNSPECIFIED: 485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NORMAL_CLEARING: 486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 4870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan GsmCdmaPhone phone = mOwner.getPhone(); 488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int serviceState = phone.getServiceState().getState(); 4891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu UiccCardApplication cardApp = phone.getUiccCardApplication(); 4901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu AppState uiccAppState = (cardApp != null) ? cardApp.getState() : 4911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu AppState.APPSTATE_UNKNOWN; 492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (serviceState == ServiceState.STATE_POWER_OFF) { 493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.POWER_OFF; 494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE 4951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || serviceState == ServiceState.STATE_EMERGENCY_ONLY ) { 496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.OUT_OF_SERVICE; 497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 4981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 4991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (uiccAppState != AppState.APPSTATE_READY) { 5001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.ICC_ERROR; 5011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (causeCode == CallFailCause.ERROR_UNSPECIFIED) { 5021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (phone.mSST.mRestrictedState.isCsRestricted()) { 5031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.CS_RESTRICTED; 5041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (phone.mSST.mRestrictedState.isCsEmergencyRestricted()) { 5051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.CS_RESTRICTED_EMERGENCY; 5061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (phone.mSST.mRestrictedState.isCsNormalRestricted()) { 5071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.CS_RESTRICTED_NORMAL; 5081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 5091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.ERROR_UNSPECIFIED; 5101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (causeCode == CallFailCause.NORMAL_CLEARING) { 5121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.NORMAL; 5131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 5141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // If nothing else matches, report unknown call drop reason 5151a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // to app, not NORMAL call end. 5161a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.ERROR_UNSPECIFIED; 5171a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 5191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (phone.mCdmaSubscriptionSource == 5201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_RUIM 5211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && uiccAppState != AppState.APPSTATE_READY) { 5221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.ICC_ERROR; 5231a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (causeCode==CallFailCause.NORMAL_CLEARING) { 5241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.NORMAL; 5251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 5261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return DisconnectCause.ERROR_UNSPECIFIED; 5271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 5281a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ void 53433cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu onRemoteDisconnect(int causeCode, String vendorCause) { 5350742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela this.mPreciseCause = causeCode; 53633cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu this.mVendorCause = vendorCause; 537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onDisconnect(disconnectCauseFromCode(causeCode)); 538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 540b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /** 541b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * Called when the radio indicates the connection has been disconnected. 542b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @param cause call disconnect cause; values are defined in {@link DisconnectCause} 543b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen */ 544c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan @Override 545c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan public boolean onDisconnect(int cause) { 5461220a4e283def0598468376cf112d3b904026fb8Danny Baumann boolean changed = false; 5471220a4e283def0598468376cf112d3b904026fb8Danny Baumann 54822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCause = cause; 549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 55022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville doDisconnect(); 5521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (DBG) Rlog.d(LOG_TAG, "onDisconnect: cause=" + cause); 554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mOwner.getPhone().notifyDisconnect(this); 556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 55722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 5581220a4e283def0598468376cf112d3b904026fb8Danny Baumann changed = mParent.connectionDisconnected(this); 559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 5601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 5611a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mOrigConnection = null; 562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 5631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu clearPostDialListeners(); 564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 5651220a4e283def0598468376cf112d3b904026fb8Danny Baumann return changed; 566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Called when the call waiting connection has been hung up */ 570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ void 571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onLocalDisconnect() { 57222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville doDisconnect(); 574cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (VDBG) Rlog.d(LOG_TAG, "onLoalDisconnect" ); 575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 57622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 57722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Returns true if state has changed, false if nothing changed 5845d65624eb9189b0369bf1d914a9fb7e141284226fionaxu public boolean 585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville update (DriverCall dc) { 5861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu GsmCdmaCall newParent; 587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean changed = false; 588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wasConnectingInOrOut = isConnectingInOrOut(); 5891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu boolean wasHolding = (getState() == GsmCdmaCall.State.HOLDING); 590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent = parentFromDCState(dc.state); 592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 59322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (Phone.DEBUG_PHONE) log("parent= " +mParent +", newParent= " + newParent); 594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //Ignore dc.number and dc.name in case of a handover connection 5961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm() && mOrigConnection != null) { 5971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (Phone.DEBUG_PHONE) log("update: mOrigConnection is not null"); 5981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 5991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu log(" mNumberConverted " + mNumberConverted); 6001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!equalsHandlesNulls(mAddress, dc.number) && (!mNumberConverted 6011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || !equalsHandlesNulls(mConvertedNumber, dc.number))) { 6021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (Phone.DEBUG_PHONE) log("update: phone # changed!"); 6031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mAddress = dc.number; 6041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu changed = true; 6051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // A null cnapName should be the same as "" 609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (TextUtils.isEmpty(dc.name)) { 61022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!TextUtils.isEmpty(mCnapName)) { 611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 61222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = ""; 613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 61422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (!dc.name.equals(mCnapName)) { 615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 61622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = dc.name; 617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 61922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (Phone.DEBUG_PHONE) log("--dssds----"+mCnapName); 62022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = dc.namePresentation; 62122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = dc.numberPresentation; 622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 62322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (newParent != mParent) { 62422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 62522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent.attach(this, dc); 62822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = newParent; 629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean parentStateChange; 63222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville parentStateChange = mParent.update (this, dc); 633c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = changed || parentStateChange; 634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Some state-transition events */ 637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) log( 6391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu "update: parent=" + mParent + 6401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ", hasNewParent=" + (newParent != mParent) + 6411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ", wasConnectingInOrOut=" + wasConnectingInOrOut + 642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", wasHolding=" + wasHolding + 643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", isConnectingInOrOut=" + isConnectingInOrOut() + 644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", changed=" + changed); 645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (wasConnectingInOrOut && !isConnectingInOrOut()) { 648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut(); 649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 6511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (changed && !wasHolding && (getState() == GsmCdmaCall.State.HOLDING)) { 652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We've transitioned into HOLDING 653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return changed; 657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is in the foregroundCall 661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * when a dial is initiated. 662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * We know we're ACTIVE, and we know we're going to end up 663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * HOLDING in the backgroundCall 664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fakeHoldBeforeDial() { 66722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 66822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 67122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = mOwner.mBackgroundCall; 6721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mParent.attachFake(this, GsmCdmaCall.State.HOLDING); 673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ int 6781a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu getGsmCdmaIndex() throws CallStateException { 67922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mIndex >= 0) { 68022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIndex + 1; 681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 6821a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu throw new CallStateException ("GsmCdma index not yet assigned"); 683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * An incoming or outgoing call has connected 688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut() { 69122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTime = System.currentTimeMillis(); 69222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTimeReal = SystemClock.elapsedRealtime(); 69322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDuration = 0; 694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // bug #678474: incoming call interpreted as missed call, even though 696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // it sounds like the user has picked up the call. 697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) { 69822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville log("onConnectedInOrOut: connectTime=" + mConnectTime); 699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 70122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mIsIncoming) { 702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // outgoing calls only 703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 7051a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isPhoneTypeGsm()) { 7061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Only release wake lock for incoming calls, for outgoing calls the wake lock 7071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // will be released after any pause-dial is completed 7081a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu releaseWakeLock(); 7091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7101a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 7121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville doDisconnect() { 7190b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton mIndex = -1; 7200b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton mDisconnectTime = System.currentTimeMillis(); 7210b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton mDuration = SystemClock.elapsedRealtime() - mConnectTimeReal; 7220b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton mDisconnected = true; 7230b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton clearPostDialListeners(); 724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 7269b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam /*package*/ void 727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding() { 72822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHoldingStartTime = SystemClock.elapsedRealtime(); 729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 7301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 732c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Performs the appropriate action for a post-dial char, but does not 733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * notify application. returns false if the character is invalid and 734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * should be ignored 735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processPostDialChar(char c) { 738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (PhoneNumberUtils.is12Key(c)) { 73922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.mCi.sendDtmf(c, mHandler.obtainMessage(EVENT_DTMF_DONE)); 7401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (isPause(c)) { 7411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isPhoneTypeGsm()) { 7421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu setPostDialState(PostDialState.PAUSE); 7431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 7441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // From TS 22.101: 7451a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // It continues... 7461a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // Upon the called party answering the UE shall send the DTMF digits 7471a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // automatically to the network after a delay of 3 seconds( 20 ). 7481a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // The digits shall be sent according to the procedures and timing 7491a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // specified in 3GPP TS 24.008 [13]. The first occurrence of the 7501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // "DTMF Control Digits Separator" shall be used by the ME to 7511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // distinguish between the addressing digits (i.e. the phone number) 7521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // and the DTMF digits. Upon subsequent occurrences of the 7531a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // separator, 7541a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // the UE shall pause again for 3 seconds ( 20 ) before sending 7551a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // any further DTMF digits. 75622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_PAUSE_DONE), 7571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu isPhoneTypeGsm() ? PAUSE_DELAY_MILLIS_GSM: PAUSE_DELAY_MILLIS_CDMA); 7581a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (isWait(c)) { 759c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.WAIT); 7601a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (isWild(c)) { 761c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.WILD); 762c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 763c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 764c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 765c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 766c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 769cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 7701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public String 7711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu getRemainingPostDialString() { 772032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan String subStr = super.getRemainingPostDialString(); 773032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan if (!isPhoneTypeGsm() && !TextUtils.isEmpty(subStr)) { 774032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan int wIndex = subStr.indexOf(PhoneNumberUtils.WAIT); 775032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan int pIndex = subStr.indexOf(PhoneNumberUtils.PAUSE); 776032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan 777032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan if (wIndex > 0 && (wIndex < pIndex || pIndex <= 0)) { 778032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan subStr = subStr.substring(0, wIndex); 779032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan } else if (pIndex > 0) { 780032d73c15281387a97cdb91c6f0c7c3a1b1b230eAmit Mahajan subStr = subStr.substring(0, pIndex); 781c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 782c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 783c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return subStr; 784c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 785c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 7861a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 7871a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void updateParent(GsmCdmaCall oldParent, GsmCdmaCall newParent){ 788c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (newParent != oldParent) { 789c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (oldParent != null) { 790c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville oldParent.detach(this); 791c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 7921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu newParent.attachFake(this, GsmCdmaCall.State.ACTIVE); 79322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = newParent; 794c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 795c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 796c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 797c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 798c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void finalize() 799c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville { 800c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 801c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * It is understood that This finializer is not guaranteed 802c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to be called and the release lock call is here just in 803c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * case there is some path that doesn't call onDisconnect 804c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and or onConnectedInOrOut. 805c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 806c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mPartialWakeLock.isHeld()) { 8071a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, "[GsmCdmaConn] UNEXPECTED; mPartialWakeLock is held when finalizing."); 808c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 8091a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu clearPostDialListeners(); 810c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 811c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 812c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void 8141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu processNextPostDialChar() { 815c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char c = 0; 816c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Registrant postDialHandler; 817c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 81822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState == PostDialState.CANCELLED) { 8191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isPhoneTypeGsm()) { 8201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu releaseWakeLock(); 8211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 8221a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //Rlog.v("GsmCdma", "##### processNextPostDialChar: postDialState == CANCELLED, bail"); 823c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 824c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 825c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 82622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialString == null || 82722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString.length() <= mNextPostDialChar) { 828c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.COMPLETE); 829c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (!isPhoneTypeGsm()) { 8311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu // We were holding a wake lock until pause-dial was complete, so give it up now 8321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu releaseWakeLock(); 8331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 834c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 835c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // notifyMessage.arg1 is 0 on complete 836c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c = 0; 837c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 838c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isValid; 839c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 840c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 841c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 84222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville c = mPostDialString.charAt(mNextPostDialChar++); 843c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 844c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isValid = processPostDialChar(c); 845c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 846c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isValid) { 847c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Will call processNextPostDialChar 84822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget(); 849c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Don't notify application 8501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.e(LOG_TAG, "processNextPostDialChar: c=" + c + " isn't valid!"); 851c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 852c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 853c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 854c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8554567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen notifyPostDialListenersNextChar(c); 8564567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen 8574567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen // TODO: remove the following code since the handler no longer executes anything. 8580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan postDialHandler = mOwner.getPhone().mPostDialHandler; 859c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 860c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message notifyMessage; 861c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (postDialHandler != null 8631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && (notifyMessage = postDialHandler.messageForRegistrant()) != null) { 864c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The AsyncResult.result is the Connection object 86522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville PostDialState state = mPostDialState; 866c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult ar = AsyncResult.forMessage(notifyMessage); 867c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.result = this; 868c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.userObj = state; 869c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 870c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // arg1 is the character that was/is being processed 871c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.arg1 = c; 872c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //Rlog.v("GsmCdma", "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c); 874c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.sendToTarget(); 875c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 876c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 877c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 878c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** "connecting" means "has never been ACTIVE" for both incoming 879c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and outgoing calls 880c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 881c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 882c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isConnectingInOrOut() { 88322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mParent == null || mParent == mOwner.mRingingCall 8841a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || mParent.mState == GsmCdmaCall.State.DIALING 8851a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu || mParent.mState == GsmCdmaCall.State.ALERTING; 886c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 887c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8881a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private GsmCdmaCall 889c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parentFromDCState (DriverCall.State state) { 890c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (state) { 891c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ACTIVE: 892c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case DIALING: 893c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ALERTING: 89422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mForegroundCall; 895c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 896c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 897c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case HOLDING: 89822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mBackgroundCall; 899c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 900c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 901c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case INCOMING: 902c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case WAITING: 90322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mRingingCall; 904c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 905c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 906c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 907c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new RuntimeException("illegal call state: " + state); 908c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 909c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 910c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 911c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 9121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * Set post dial state and acquire wake lock while switching to "started" 9131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu * state, the wake lock will be released if state switches out of "started" 914c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * state or after WAKE_LOCK_TIMEOUT_MILLIS. 915c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param s new PostDialState 916c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 917c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void setPostDialState(PostDialState s) { 9181a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (isPhoneTypeGsm()) { 9191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mPostDialState != PostDialState.STARTED 9201a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && s == PostDialState.STARTED) { 9211a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu acquireWakeLock(); 92222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); 92322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); 9241a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else if (mPostDialState == PostDialState.STARTED 9251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu && s != PostDialState.STARTED) { 9261a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 9271a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu releaseWakeLock(); 928c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 929c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 9301a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (s == PostDialState.STARTED || 9311a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu s == PostDialState.PAUSE) { 9321a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu synchronized (mPartialWakeLock) { 9331a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mPartialWakeLock.isHeld()) { 9341a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 9351a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 9361a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu acquireWakeLock(); 9371a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9381a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); 9391a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); 9401a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9411a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } else { 9421a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 9431a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu releaseWakeLock(); 9441a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 945c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 94622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialState = s; 9470b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton notifyPostDialListeners(); 948c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 949c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9501a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void 9511a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu createWakeLock(Context context) { 9521a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 953c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 954c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 955c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9561a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void 9571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu acquireWakeLock() { 958c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("acquireWakeLock"); 959c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock.acquire(); 960c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 961c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9621a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void 9631a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu releaseWakeLock() { 9641a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu synchronized(mPartialWakeLock) { 965c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mPartialWakeLock.isHeld()) { 966c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("releaseWakeLock"); 967c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock.release(); 968c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 969c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 970c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 971c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void 9731a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu releaseAllWakeLocks() { 9741a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu synchronized(mPartialWakeLock) { 9758f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan while (mPartialWakeLock.isHeld()) { 9768f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan mPartialWakeLock.release(); 9778f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan } 9788f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan } 9798f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan } 9808f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan 981c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static boolean isPause(char c) { 982c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return c == PhoneNumberUtils.PAUSE; 983c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 984c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 985c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static boolean isWait(char c) { 986c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return c == PhoneNumberUtils.WAIT; 987c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 988c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 9891a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private static boolean isWild(char c) { 9901a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return c == PhoneNumberUtils.WILD; 9911a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 9921a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 9931a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 994c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // This function is to find the next PAUSE character index if 995c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // multiple pauses in a row. Otherwise it finds the next non PAUSE or 996c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // non WAIT character index. 997c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static int 998c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville findNextPCharOrNonPOrNonWCharIndex(String phoneNumber, int currIndex) { 999c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wMatched = isWait(phoneNumber.charAt(currIndex)); 1000c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int index = currIndex + 1; 1001c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int length = phoneNumber.length(); 1002c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville while (index < length) { 1003c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char cNext = phoneNumber.charAt(index); 1004c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // if there is any W inside P/W sequence,mark it 1005c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (isWait(cNext)) { 1006c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville wMatched = true; 1007c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1008c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // if any characters other than P/W chars after P/W sequence 1009c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // we break out the loop and append the correct 1010c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isWait(cNext) && !isPause(cNext)) { 1011c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1012c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1013c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville index++; 1014c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1015c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1016c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // It means the PAUSE character(s) is in the middle of dial string 1017c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // and it needs to be handled one by one. 1018c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if ((index < length) && (index > (currIndex + 1)) && 10191a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu ((wMatched == false) && isPause(phoneNumber.charAt(currIndex)))) { 1020c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return (currIndex + 1); 1021c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1022c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return index; 1023c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1024c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 10251a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu //CDMA 1026c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // This function returns either PAUSE or WAIT character to append. 1027c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // It is based on the next non PAUSE/WAIT character in the phoneNumber and the 1028c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // index for the current PAUSE/WAIT character 1029c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private static char 1030c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville findPOrWCharToAppend(String phoneNumber, int currPwIndex, int nextNonPwCharIndex) { 1031c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char c = phoneNumber.charAt(currPwIndex); 1032c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char ret; 1033c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1034c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Append the PW char 1035c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ret = (isPause(c)) ? PhoneNumberUtils.PAUSE : PhoneNumberUtils.WAIT; 1036c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1037c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If the nextNonPwCharIndex is greater than currPwIndex + 1, 1038c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // it means the PW sequence contains not only P characters. 1039c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Since for the sequence that only contains P character, 1040c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // the P character is handled one by one, the nextNonPwCharIndex 1041c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // equals to currPwIndex + 1. 1042c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // In this case, skip P, append W. 1043c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (nextNonPwCharIndex > (currPwIndex + 1)) { 1044c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ret = PhoneNumberUtils.WAIT; 1045c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1046c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ret; 1047c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1048c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1049936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen private String maskDialString(String dialString) { 1050936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen if (VDBG) { 1051936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen return dialString; 1052936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen } 1053936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen 1054936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen return "<MASKED>"; 1055936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen } 1056936cf96aeb696feeec28638c08acbb53d5cb725bEtan Cohen 10571a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void fetchDtmfToneDelay(GsmCdmaPhone phone) { 1058059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn CarrierConfigManager configMgr = (CarrierConfigManager) 1059059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn phone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE); 1060059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn PersistableBundle b = configMgr.getConfigForSubId(phone.getSubId()); 1061059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn if (b != null) { 1062dd4b0f4b5a2def03bd45637be5ceed3e86781f68Amit Mahajan mDtmfToneDelay = b.getInt(phone.getDtmfToneDelayKey()); 1063059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn } 1064059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn } 1065059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 10661a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private boolean isPhoneTypeGsm() { 10670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mOwner.getPhone().getPhoneType() == PhoneConstants.PHONE_TYPE_GSM; 10681a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 10691a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10701a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu private void log(String msg) { 10711a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu Rlog.d(LOG_TAG, "[GsmCdmaConn] " + msg); 10721a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 1073059a9a5494e190d940ce9728cb1b821c2fe04788Tyler Gunn 1074c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1075c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public int getNumberPresentation() { 107622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mNumberPresentation; 1077c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 1078c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 1079c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 1080c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public UUSInfo getUUSInfo() { 10811a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mUusInfo; 1082c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 10830742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela 10840742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela public int getPreciseDisconnectCause() { 10850742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela return mPreciseCause; 10860742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela } 10870742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela 1088a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 108933cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu public String getVendorDisconnectCause() { 109033cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu return mVendorCause; 109133cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu } 109233cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu 109333cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu @Override 10941a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu public void migrateFrom(Connection c) { 10951a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (c == null) return; 10961a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10971a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu super.migrateFrom(c); 10981a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 10991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu this.mUusInfo = c.getUUSInfo(); 11001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu this.setUserData(c.getUserData()); 11021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 11041a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu @Override 1105a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public Connection getOrigConnection() { 11061a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mOrigConnection; 1107a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 1109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 1110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isMultiparty() { 11111a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu if (mOrigConnection != null) { 11121a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu return mOrigConnection.isMultiparty(); 11131a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu } 11141a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu 1115a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 1116a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 1117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 1118