1c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/* 2c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Copyright (C) 2006 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 17c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepackage com.android.internal.telephony.gsm; 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; 23c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.PowerManager; 24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Registrant; 25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemClock; 26b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensenimport android.telephony.DisconnectCause; 27ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog; 28c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.PhoneNumberUtils; 29c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.ServiceState; 30c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.text.TextUtils; 31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 32c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.*; 33d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.UiccCardApplication; 34e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.uicc.UiccController; 35d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState; 36c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 37c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/** 38c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide} 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic class GsmConnection extends Connection { 41cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private static final String LOG_TAG = "GsmConnection"; 42cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private static final boolean DBG = true; 43c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Instance Variables 45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 4622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville GsmCallTracker mOwner; 4722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville GsmCall mParent; 48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 4922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville String mPostDialString; // outgoing calls only 5022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean mDisconnected; 51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville int mIndex; // index in GsmCallTracker.connections[], -1 if unassigned 53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The GSM index is 1 + this 54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* 56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * These time/timespan values are based on System.currentTimeMillis(), 57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * i.e., "wall clock" time. 58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 5922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville long mDisconnectTime; 60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 6122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville int mNextPostDialChar; // index into postDialString 62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 63b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen int mCause = DisconnectCause.NOT_DISCONNECTED; 6422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville PostDialState mPostDialState = PostDialState.NOT_STARTED; 6522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville UUSInfo mUusInfo; 660742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela int mPreciseCause = 0; 67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 68a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Connection mOrigConnection; 69a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 7022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Handler mHandler; 71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private PowerManager.WakeLock mPartialWakeLock; 73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Event Constants 75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_DTMF_DONE = 1; 76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_PAUSE_DONE = 2; 77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_NEXT_POST_DIAL = 3; 78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_WAKE_LOCK_TIMEOUT = 4; 79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constants 81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int PAUSE_DELAY_MILLIS = 3 * 1000; 82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000; 83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Inner Classes 85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville class MyHandler extends Handler { 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville MyHandler(Looper l) {super(l);} 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 89cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void 91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleMessage(Message msg) { 92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (msg.what) { 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_NEXT_POST_DIAL: 95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_DTMF_DONE: 96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_PAUSE_DONE: 97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_WAKE_LOCK_TIMEOUT: 100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constructors 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** This is probably an MT call that we first saw in a CLCC response */ 109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ 110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmConnection (Context context, DriverCall dc, GsmCallTracker ct, int index) { 111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(context); 112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 11422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 11522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 11722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = dc.number; 118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 11922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = dc.isMT; 12022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 12122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = dc.name; 12222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = dc.namePresentation; 12322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = dc.numberPresentation; 12422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mUusInfo = dc.uusInfo; 125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 12622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = index; 127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 12822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = parentFromDCState (dc.state); 12922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.attach(this, dc); 130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** This is an MO call, created when dialing */ 133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ 134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmConnection (Context context, String dialString, GsmCallTracker ct, GsmCall parent) { 135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(context); 136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 13822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 13922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 14122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDialString = dialString; 142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 14322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString); 14422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString); 145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 14622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = -1; 147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 14822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = false; 14922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = null; 15022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED; 15122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 15222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = parent; 155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parent.attachFake(this, GsmCall.State.DIALING); 156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static boolean 162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville equalsHandlesNulls (Object a, Object b) { 163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return (a == null) ? (b == null) : a.equals (b); 164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ boolean 167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville compareTo(DriverCall c) { 168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // On mobile originated (MO) calls, the phone number may have changed 169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // due to a SIM Toolkit call control modification. 170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We assume we know when MO calls are created (since we created them) 172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // and therefore don't need to compare the phone number anyway. 17322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (! (mIsIncoming || c.isMT)) return true; 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 175a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // A new call appearing by SRVCC may have invalid number 176a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // if IMS service is not tightly coupled with cellular modem stack. 177a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Thus we prefer the preexisting handover connection instance. 178a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mOrigConnection != null) return true; 179a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ... but we can compare phone numbers on MT calls, and we have 181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // no control over when they begin, so we might as well 182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String cAddress = PhoneNumberUtils.stringFromStringAndTOA(c.number, c.TOA); 18422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIsIncoming == c.isMT && equalsHandlesNulls(mAddress, cAddress); 185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 187cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public GsmCall getCall() { 18922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mParent; 190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 192cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getDisconnectTime() { 19422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mDisconnectTime; 195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 197cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getHoldDurationMillis() { 199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (getState() != GsmCall.State.HOLDING) { 200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If not holding, return 0 201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 0; 202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 20322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return SystemClock.elapsedRealtime() - mHoldingStartTime; 204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 207cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 208b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen public int getDisconnectCause() { 20922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mCause; 210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 212cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public GsmCall.State getState() { 21422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mDisconnected) { 215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return GsmCall.State.DISCONNECTED; 216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return super.getState(); 218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 221cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void hangup() throws CallStateException { 22322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 22422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.hangup(this); 225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 230cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void separate() throws CallStateException { 23222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 23322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.separate(this); 234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 239cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public PostDialState getPostDialState() { 24122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mPostDialState; 242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 244cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWaitChar() { 24622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.WAIT) { 247ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "GsmConnection.proceedAfterWaitChar(): Expected " 24822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + "getPostDialState() to be WAIT but was " + mPostDialState); 249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 257cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWildChar(String str) { 25922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.WILD) { 260ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "GsmConnection.proceedAfterWaitChar(): Expected " 26122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + "getPostDialState() to be WILD but was " + mPostDialState); 262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 267cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // make a new postDialString, with the wild char replacement string 268cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // at the beginning, followed by the remaining postDialString. 269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 270cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville StringBuilder buf = new StringBuilder(str); 27122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville buf.append(mPostDialString.substring(mNextPostDialChar)); 27222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString = buf.toString(); 27322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNextPostDialChar = 0; 274cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (Phone.DEBUG_PHONE) { 275cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("proceedAfterWildChar: new postDialString is " + 27622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString); 277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 278cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 279cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville processNextPostDialChar(); 280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 282cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void cancelPostDial() { 284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.CANCELLED); 285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is being hung up locally (eg, user pressed "end") 289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Note that at this point, the hangup request has been dispatched to the radio 290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * but no response has yet been received so update() has not yet been called 291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onHangupLocal() { 29422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCause = DisconnectCause.LOCAL; 2950742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela mPreciseCause = 0; 296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 298b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /** 299b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * Maps RIL call disconnect code to {@link DisconnectCause}. 300b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @param causeCode RIL disconnect code 301b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @return the corresponding value from {@link DisconnectCause} 302b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen */ 303b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen int disconnectCauseFromCode(int causeCode) { 304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See 22.001 Annex F.4 for mapping of cause codes 306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to local tones 307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (causeCode) { 310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.USER_BUSY: 311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.BUSY; 312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NO_CIRCUIT_AVAIL: 314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.TEMPORARY_FAILURE: 315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.SWITCHING_CONGESTION: 316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CHANNEL_NOT_AVAIL: 317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.QOS_NOT_AVAIL: 318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.BEARER_NOT_AVAIL: 319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CONGESTION; 320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ACM_LIMIT_EXCEEDED: 322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.LIMIT_EXCEEDED; 323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CALL_BARRED: 325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CALL_BARRED; 326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.FDN_BLOCKED: 328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.FDN_BLOCKED; 329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.UNOBTAINABLE_NUMBER: 331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.UNOBTAINABLE_NUMBER; 332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 33309b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_USSD: 33409b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_USSD; 33509b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja 33609b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_SS: 33709b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_SS; 33809b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja 33909b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_DIAL: 34009b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_DIAL; 34109b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja 342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ERROR_UNSPECIFIED: 343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NORMAL_CLEARING: 344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 34522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville GSMPhone phone = mOwner.mPhone; 346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int serviceState = phone.getServiceState().getState(); 347a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville UiccCardApplication cardApp = phone.getUiccCardApplication(); 348a2da94751bbf8718bbaa4e181eb7d0633c1ab0f7Alex Yakavenka AppState uiccAppState = (cardApp != null) ? cardApp.getState() : 349a2da94751bbf8718bbaa4e181eb7d0633c1ab0f7Alex Yakavenka AppState.APPSTATE_UNKNOWN; 350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (serviceState == ServiceState.STATE_POWER_OFF) { 351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.POWER_OFF; 352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE 353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || serviceState == ServiceState.STATE_EMERGENCY_ONLY ) { 354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.OUT_OF_SERVICE; 355e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (uiccAppState != AppState.APPSTATE_READY) { 356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ICC_ERROR; 357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (causeCode == CallFailCause.ERROR_UNSPECIFIED) { 358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (phone.mSST.mRestrictedState.isCsRestricted()) { 359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED; 360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (phone.mSST.mRestrictedState.isCsEmergencyRestricted()) { 361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED_EMERGENCY; 362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (phone.mSST.mRestrictedState.isCsNormalRestricted()) { 363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED_NORMAL; 364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ERROR_UNSPECIFIED; 366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (causeCode == CallFailCause.NORMAL_CLEARING) { 368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.NORMAL; 369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If nothing else matches, report unknown call drop reason 371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // to app, not NORMAL call end. 372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ERROR_UNSPECIFIED; 373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ void 378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onRemoteDisconnect(int causeCode) { 3790742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela this.mPreciseCause = causeCode; 380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onDisconnect(disconnectCauseFromCode(causeCode)); 381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 383b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /** 384b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * Called when the radio indicates the connection has been disconnected. 385b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @param cause call disconnect cause; values are defined in {@link DisconnectCause} 386b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen */ 387b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /*package*/ boolean onDisconnect(int cause) { 3881220a4e283def0598468376cf112d3b904026fb8Danny Baumann boolean changed = false; 3891220a4e283def0598468376cf112d3b904026fb8Danny Baumann 39022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCause = cause; 391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 39222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 39322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = -1; 394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 39522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDisconnectTime = System.currentTimeMillis(); 39622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDuration = SystemClock.elapsedRealtime() - mConnectTimeReal; 39722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDisconnected = true; 398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 399cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) Rlog.d(LOG_TAG, "onDisconnect: cause=" + cause); 400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 40122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.mPhone.notifyDisconnect(this); 402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 40322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 4041220a4e283def0598468376cf112d3b904026fb8Danny Baumann changed = mParent.connectionDisconnected(this); 405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 406a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 407a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOrigConnection = null; 408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 4090b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton clearPostDialListeners(); 410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 4111220a4e283def0598468376cf112d3b904026fb8Danny Baumann return changed; 412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Returns true if state has changed, false if nothing changed 415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ boolean 416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville update (DriverCall dc) { 417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmCall newParent; 418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean changed = false; 419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wasConnectingInOrOut = isConnectingInOrOut(); 420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wasHolding = (getState() == GsmCall.State.HOLDING); 421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent = parentFromDCState(dc.state); 423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 424a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //Ignore dc.number and dc.name in case of a handover connection 425a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mOrigConnection != null) { 426a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (Phone.DEBUG_PHONE) log("update: mOrigConnection is not null"); 427a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 4284bd290e38a3eb70e153b7bffa101a0c9f130e32ew log(" mNumberConverted " + mNumberConverted); 4294bd290e38a3eb70e153b7bffa101a0c9f130e32ew if (!equalsHandlesNulls(mAddress, dc.number) && (!mNumberConverted 4304bd290e38a3eb70e153b7bffa101a0c9f130e32ew || !equalsHandlesNulls(mConvertedNumber, dc.number))) { 431a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (Phone.DEBUG_PHONE) log("update: phone # changed!"); 432a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mAddress = dc.number; 433a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville changed = true; 434a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // A null cnapName should be the same as "" 438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (TextUtils.isEmpty(dc.name)) { 43922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!TextUtils.isEmpty(mCnapName)) { 440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 44122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = ""; 442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 44322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (!dc.name.equals(mCnapName)) { 444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 44522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = dc.name; 446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 44822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (Phone.DEBUG_PHONE) log("--dssds----"+mCnapName); 44922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = dc.namePresentation; 45022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = dc.numberPresentation; 451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 45222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (newParent != mParent) { 45322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 45422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent.attach(this, dc); 45722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = newParent; 458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean parentStateChange; 46122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville parentStateChange = mParent.update (this, dc); 462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = changed || parentStateChange; 463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Some state-transition events */ 466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) log( 46822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville "update: parent=" + mParent + 46922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville ", hasNewParent=" + (newParent != mParent) + 470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", wasConnectingInOrOut=" + wasConnectingInOrOut + 471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", wasHolding=" + wasHolding + 472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", isConnectingInOrOut=" + isConnectingInOrOut() + 473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", changed=" + changed); 474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (wasConnectingInOrOut && !isConnectingInOrOut()) { 477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut(); 478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (changed && !wasHolding && (getState() == GsmCall.State.HOLDING)) { 481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We've transitioned into HOLDING 482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return changed; 486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is in the foregroundCall 490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * when a dial is initiated. 491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * We know we're ACTIVE, and we know we're going to end up 492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * HOLDING in the backgroundCall 493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fakeHoldBeforeDial() { 49622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 49722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 50022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = mOwner.mBackgroundCall; 50122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.attachFake(this, GsmCall.State.HOLDING); 502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ int 507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getGSMIndex() throws CallStateException { 50822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mIndex >= 0) { 50922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIndex + 1; 510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("GSM index not yet assigned"); 512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * An incoming or outgoing call has connected 517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut() { 52022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTime = System.currentTimeMillis(); 52122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTimeReal = SystemClock.elapsedRealtime(); 52222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDuration = 0; 523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // bug #678474: incoming call interpreted as missed call, even though 525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // it sounds like the user has picked up the call. 526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) { 52722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville log("onConnectedInOrOut: connectTime=" + mConnectTime); 528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 53022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mIsIncoming) { 531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // outgoing calls only 532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5379b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam /*package*/ void 538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding() { 53922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHoldingStartTime = SystemClock.elapsedRealtime(); 540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Performs the appropriate action for a post-dial char, but does not 543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * notify application. returns false if the character is invalid and 544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * should be ignored 545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processPostDialChar(char c) { 548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (PhoneNumberUtils.is12Key(c)) { 54922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.mCi.sendDtmf(c, mHandler.obtainMessage(EVENT_DTMF_DONE)); 550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (c == PhoneNumberUtils.PAUSE) { 551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // From TS 22.101: 55237d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // It continues... 55337d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // Upon the called party answering the UE shall send the DTMF digits 554a6aedcd548ee25f4df9d86ae94eec8b2a0b61f5aWink Saville // automatically to the network after a delay of 3 seconds( 20 ). 55537d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // The digits shall be sent according to the procedures and timing 55637d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // specified in 3GPP TS 24.008 [13]. The first occurrence of the 55737d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // "DTMF Control Digits Separator" shall be used by the ME to 55837d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // distinguish between the addressing digits (i.e. the phone number) 55937d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // and the DTMF digits. Upon subsequent occurrences of the 56037d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // separator, 561a6aedcd548ee25f4df9d86ae94eec8b2a0b61f5aWink Saville // the UE shall pause again for 3 seconds ( 20 ) before sending 56237d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // any further DTMF digits. 563a6aedcd548ee25f4df9d86ae94eec8b2a0b61f5aWink Saville mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_PAUSE_DONE), 56437d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan PAUSE_DELAY_MILLIS); 565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (c == PhoneNumberUtils.WAIT) { 566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.WAIT); 567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (c == PhoneNumberUtils.WILD) { 568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.WILD); 569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 576cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String 578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getRemainingPostDialString() { 57922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState == PostDialState.CANCELLED 58022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mPostDialState == PostDialState.COMPLETE 58122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mPostDialString == null 58222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mPostDialString.length() <= mNextPostDialChar 583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ) { 584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ""; 585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 58722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mPostDialString.substring(mNextPostDialChar); 588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void finalize() 592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville { 593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * It is understood that This finializer is not guaranteed 595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to be called and the release lock call is here just in 596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * case there is some path that doesn't call onDisconnect 597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and or onConnectedInOrOut. 598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mPartialWakeLock.isHeld()) { 600ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e(LOG_TAG, "[GSMConn] UNEXPECTED; mPartialWakeLock is held when finalizing."); 601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 6020b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton clearPostDialListeners(); 603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar() { 608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char c = 0; 609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Registrant postDialHandler; 610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 61122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState == PostDialState.CANCELLED) { 612ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville //Rlog.v("GSM", "##### processNextPostDialChar: postDialState == CANCELLED, bail"); 613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 61622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialString == null || 61722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString.length() <= mNextPostDialChar) { 618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.COMPLETE); 619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // notifyMessage.arg1 is 0 on complete 621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c = 0; 622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isValid; 624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 62722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville c = mPostDialString.charAt(mNextPostDialChar++); 628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isValid = processPostDialChar(c); 630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isValid) { 632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Will call processNextPostDialChar 63322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget(); 634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Don't notify application 635ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e("GSM", "processNextPostDialChar: c=" + c + " isn't valid!"); 636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 6404567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen notifyPostDialListenersNextChar(c); 6414567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen 6424567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen // TODO: remove the following code since the handler no longer executes anything. 64322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville postDialHandler = mOwner.mPhone.mPostDialHandler; 644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message notifyMessage; 646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (postDialHandler != null 648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && (notifyMessage = postDialHandler.messageForRegistrant()) != null) { 649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The AsyncResult.result is the Connection object 65022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville PostDialState state = mPostDialState; 651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult ar = AsyncResult.forMessage(notifyMessage); 652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.result = this; 653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.userObj = state; 654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // arg1 is the character that was/is being processed 656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.arg1 = c; 657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 658ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville //Rlog.v("GSM", "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c); 659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.sendToTarget(); 660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** "connecting" means "has never been ACTIVE" for both incoming 665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and outgoing calls 666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isConnectingInOrOut() { 66922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mParent == null || mParent == mOwner.mRingingCall 67022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mParent.mState == GsmCall.State.DIALING 67122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mParent.mState == GsmCall.State.ALERTING; 672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private GsmCall 675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parentFromDCState (DriverCall.State state) { 676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (state) { 677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ACTIVE: 678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case DIALING: 679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ALERTING: 68022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mForegroundCall; 681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case HOLDING: 68422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mBackgroundCall; 685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case INCOMING: 688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case WAITING: 68922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mRingingCall; 690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new RuntimeException("illegal call state: " + state); 694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set post dial state and acquire wake lock while switching to "started" 699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * state, the wake lock will be released if state switches out of "started" 700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * state or after WAKE_LOCK_TIMEOUT_MILLIS. 701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param s new PostDialState 702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void setPostDialState(PostDialState s) { 70422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.STARTED 705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && s == PostDialState.STARTED) { 706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 70722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); 70822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); 70922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (mPostDialState == PostDialState.STARTED 710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && s != PostDialState.STARTED) { 71122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 71422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialState = s; 7150b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton notifyPostDialListeners(); 716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(Context context) { 720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 723c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock() { 726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("acquireWakeLock"); 727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock.acquire(); 728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock() { 732c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville synchronized(mPartialWakeLock) { 733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mPartialWakeLock.isHeld()) { 734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("releaseWakeLock"); 735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock.release(); 736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void log(String msg) { 741ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "[GSMConn] " + msg); 742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public int getNumberPresentation() { 74622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mNumberPresentation; 747c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public UUSInfo getUUSInfo() { 75122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mUusInfo; 752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 7530742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela 7540742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela public int getPreciseDisconnectCause() { 7550742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela return mPreciseCause; 7560742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela } 757a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 758e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam @Override 759e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam public void migrateFrom(Connection c) { 760a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (c == null) return; 761a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 762e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam super.migrateFrom(c); 763a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 764a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.mUusInfo = c.getUUSInfo(); 765a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 766a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.setUserData(c.getUserData()); 767a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 768a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 769a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 770a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public Connection getOrigConnection() { 771a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mOrigConnection; 772a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 773a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 774a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 775a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isMultiparty() { 776a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mOrigConnection != null) { 777a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mOrigConnection.isMultiparty(); 778a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 779a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 780a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 781a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 782c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 783