GsmConnection.java revision a8467dd0c524787104b1ccdddc5e8af10ba729ed
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 mAddress; // MAY BE NULL!!! 5022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville String mDialString; // outgoing calls only 5122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville String mPostDialString; // outgoing calls only 5222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean mIsIncoming; 5322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean mDisconnected; 54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville int mIndex; // index in GsmCallTracker.connections[], -1 if unassigned 56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The GSM 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 mCreateTime; 6322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville long mConnectTime; 6422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville long mDisconnectTime; 65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* 67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * These time/timespan values are based on SystemClock.elapsedRealTime(), 68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * i.e., time since boot. They are appropriate for comparison and 69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * calculating deltas. 70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 7122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville long mConnectTimeReal; 7222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville long mDuration; 7322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville long mHoldingStartTime; // The time when the Connection last transitioned 74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // into HOLDING 75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 7622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville int mNextPostDialChar; // index into postDialString 77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 78b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen int mCause = DisconnectCause.NOT_DISCONNECTED; 7922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville PostDialState mPostDialState = PostDialState.NOT_STARTED; 8022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville int mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 8122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville UUSInfo mUusInfo; 820742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela int mPreciseCause = 0; 83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 84a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Connection mOrigConnection; 85a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 8622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Handler mHandler; 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private PowerManager.WakeLock mPartialWakeLock; 89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Event Constants 91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_DTMF_DONE = 1; 92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_PAUSE_DONE = 2; 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_NEXT_POST_DIAL = 3; 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_WAKE_LOCK_TIMEOUT = 4; 95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constants 97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int PAUSE_DELAY_MILLIS = 3 * 1000; 98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000; 99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Inner Classes 101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville class MyHandler extends Handler { 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville MyHandler(Looper l) {super(l);} 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 105cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleMessage(Message msg) { 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (msg.what) { 110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_NEXT_POST_DIAL: 111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_DTMF_DONE: 112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_PAUSE_DONE: 113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_WAKE_LOCK_TIMEOUT: 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constructors 123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** This is probably an MT call that we first saw in a CLCC response */ 125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ 126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmConnection (Context context, DriverCall dc, GsmCallTracker ct, int index) { 127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(context); 128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 13022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 13122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 13322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = dc.number; 134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 13522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = dc.isMT; 13622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 13722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = dc.name; 13822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = dc.namePresentation; 13922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = dc.numberPresentation; 14022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mUusInfo = dc.uusInfo; 141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 14222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = index; 143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 14422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = parentFromDCState (dc.state); 14522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.attach(this, dc); 146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** This is an MO call, created when dialing */ 149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ 150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmConnection (Context context, String dialString, GsmCallTracker ct, GsmCall parent) { 151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(context); 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 15522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDialString = dialString; 158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString); 16022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString); 161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 16222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = -1; 163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 16422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = false; 16522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = null; 16622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED; 16722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 16822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 17022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = parent; 171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parent.attachFake(this, GsmCall.State.DIALING); 172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static boolean 178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville equalsHandlesNulls (Object a, Object b) { 179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return (a == null) ? (b == null) : a.equals (b); 180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ boolean 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville compareTo(DriverCall c) { 184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // On mobile originated (MO) calls, the phone number may have changed 185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // due to a SIM Toolkit call control modification. 186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We assume we know when MO calls are created (since we created them) 188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // and therefore don't need to compare the phone number anyway. 18922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (! (mIsIncoming || c.isMT)) return true; 190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 191a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // A new call appearing by SRVCC may have invalid number 192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // if IMS service is not tightly coupled with cellular modem stack. 193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Thus we prefer the preexisting handover connection instance. 194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mOrigConnection != null) return true; 195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ... but we can compare phone numbers on MT calls, and we have 197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // no control over when they begin, so we might as well 198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String cAddress = PhoneNumberUtils.stringFromStringAndTOA(c.number, c.TOA); 20022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIsIncoming == c.isMT && equalsHandlesNulls(mAddress, cAddress); 201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 203cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getAddress() { 20522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mAddress; 206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 208cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public GsmCall getCall() { 21022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mParent; 211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 213cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getCreateTime() { 21522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mCreateTime; 216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 218cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getConnectTime() { 22022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mConnectTime; 221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 223cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public long getConnectTimeReal() { 225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mConnectTimeReal; 226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 227a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getDisconnectTime() { 23022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mDisconnectTime; 231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 233cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getDurationMillis() { 23522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mConnectTimeReal == 0) { 236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 0; 23722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (mDuration == 0) { 23822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return SystemClock.elapsedRealtime() - mConnectTimeReal; 239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 24022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mDuration; 241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 244cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 245a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public long getHoldingStartTime() { 246a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mHoldingStartTime; 247a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 248a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 249a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getHoldDurationMillis() { 251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (getState() != GsmCall.State.HOLDING) { 252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If not holding, return 0 253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 0; 254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 25522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return SystemClock.elapsedRealtime() - mHoldingStartTime; 256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 259cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 260b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen public int getDisconnectCause() { 26122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mCause; 262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 264cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public boolean isIncoming() { 26622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIsIncoming; 267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 269cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public GsmCall.State getState() { 27122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mDisconnected) { 272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return GsmCall.State.DISCONNECTED; 273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return super.getState(); 275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 278cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void hangup() throws CallStateException { 28022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 28122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.hangup(this); 282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 287cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void separate() throws CallStateException { 28922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 29022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.separate(this); 291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 296cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public PostDialState getPostDialState() { 29822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mPostDialState; 299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 301cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWaitChar() { 30322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.WAIT) { 304ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "GsmConnection.proceedAfterWaitChar(): Expected " 30522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + "getPostDialState() to be WAIT but was " + mPostDialState); 306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 314cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWildChar(String str) { 31622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.WILD) { 317ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "GsmConnection.proceedAfterWaitChar(): Expected " 31822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + "getPostDialState() to be WILD but was " + mPostDialState); 319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 324cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // make a new postDialString, with the wild char replacement string 325cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // at the beginning, followed by the remaining postDialString. 326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 327cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville StringBuilder buf = new StringBuilder(str); 32822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville buf.append(mPostDialString.substring(mNextPostDialChar)); 32922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString = buf.toString(); 33022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNextPostDialChar = 0; 331cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (Phone.DEBUG_PHONE) { 332cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("proceedAfterWildChar: new postDialString is " + 33322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString); 334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 335cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 336cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville processNextPostDialChar(); 337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 339cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void cancelPostDial() { 341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.CANCELLED); 342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is being hung up locally (eg, user pressed "end") 346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Note that at this point, the hangup request has been dispatched to the radio 347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * but no response has yet been received so update() has not yet been called 348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onHangupLocal() { 35122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCause = DisconnectCause.LOCAL; 3520742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela mPreciseCause = 0; 353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 355b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /** 356b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * Maps RIL call disconnect code to {@link DisconnectCause}. 357b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @param causeCode RIL disconnect code 358b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @return the corresponding value from {@link DisconnectCause} 359b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen */ 360b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen int disconnectCauseFromCode(int causeCode) { 361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See 22.001 Annex F.4 for mapping of cause codes 363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to local tones 364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (causeCode) { 367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.USER_BUSY: 368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.BUSY; 369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NO_CIRCUIT_AVAIL: 371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.TEMPORARY_FAILURE: 372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.SWITCHING_CONGESTION: 373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CHANNEL_NOT_AVAIL: 374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.QOS_NOT_AVAIL: 375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.BEARER_NOT_AVAIL: 376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CONGESTION; 377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ACM_LIMIT_EXCEEDED: 379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.LIMIT_EXCEEDED; 380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CALL_BARRED: 382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CALL_BARRED; 383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.FDN_BLOCKED: 385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.FDN_BLOCKED; 386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.UNOBTAINABLE_NUMBER: 388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.UNOBTAINABLE_NUMBER; 389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ERROR_UNSPECIFIED: 391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NORMAL_CLEARING: 392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 39322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville GSMPhone phone = mOwner.mPhone; 394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int serviceState = phone.getServiceState().getState(); 395a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville UiccCardApplication cardApp = phone.getUiccCardApplication(); 396a2da94751bbf8718bbaa4e181eb7d0633c1ab0f7Alex Yakavenka AppState uiccAppState = (cardApp != null) ? cardApp.getState() : 397a2da94751bbf8718bbaa4e181eb7d0633c1ab0f7Alex Yakavenka AppState.APPSTATE_UNKNOWN; 398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (serviceState == ServiceState.STATE_POWER_OFF) { 399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.POWER_OFF; 400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE 401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || serviceState == ServiceState.STATE_EMERGENCY_ONLY ) { 402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.OUT_OF_SERVICE; 403e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (uiccAppState != AppState.APPSTATE_READY) { 404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ICC_ERROR; 405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (causeCode == CallFailCause.ERROR_UNSPECIFIED) { 406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (phone.mSST.mRestrictedState.isCsRestricted()) { 407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED; 408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (phone.mSST.mRestrictedState.isCsEmergencyRestricted()) { 409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED_EMERGENCY; 410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (phone.mSST.mRestrictedState.isCsNormalRestricted()) { 411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED_NORMAL; 412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ERROR_UNSPECIFIED; 414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (causeCode == CallFailCause.NORMAL_CLEARING) { 416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.NORMAL; 417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If nothing else matches, report unknown call drop reason 419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // to app, not NORMAL call end. 420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ERROR_UNSPECIFIED; 421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ void 426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onRemoteDisconnect(int causeCode) { 4270742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela this.mPreciseCause = causeCode; 428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onDisconnect(disconnectCauseFromCode(causeCode)); 429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 431b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /** 432b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * Called when the radio indicates the connection has been disconnected. 433b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @param cause call disconnect cause; values are defined in {@link DisconnectCause} 434b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen */ 435b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /*package*/ boolean onDisconnect(int cause) { 4361220a4e283def0598468376cf112d3b904026fb8Danny Baumann boolean changed = false; 4371220a4e283def0598468376cf112d3b904026fb8Danny Baumann 43822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCause = cause; 439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 44022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 44122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = -1; 442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 44322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDisconnectTime = System.currentTimeMillis(); 44422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDuration = SystemClock.elapsedRealtime() - mConnectTimeReal; 44522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDisconnected = true; 446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 447cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) Rlog.d(LOG_TAG, "onDisconnect: cause=" + cause); 448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 44922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.mPhone.notifyDisconnect(this); 450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 45122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 4521220a4e283def0598468376cf112d3b904026fb8Danny Baumann changed = mParent.connectionDisconnected(this); 453c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 454a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 455a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOrigConnection = null; 456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 4570b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton clearPostDialListeners(); 458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 4591220a4e283def0598468376cf112d3b904026fb8Danny Baumann return changed; 460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Returns true if state has changed, false if nothing changed 463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ boolean 464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville update (DriverCall dc) { 465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmCall newParent; 466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean changed = false; 467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wasConnectingInOrOut = isConnectingInOrOut(); 468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wasHolding = (getState() == GsmCall.State.HOLDING); 469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent = parentFromDCState(dc.state); 471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 472a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //Ignore dc.number and dc.name in case of a handover connection 473a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mOrigConnection != null) { 474a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (Phone.DEBUG_PHONE) log("update: mOrigConnection is not null"); 475a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 476a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (!equalsHandlesNulls(mAddress, dc.number)) { 477a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (Phone.DEBUG_PHONE) log("update: phone # changed!"); 478a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mAddress = dc.number; 479a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville changed = true; 480a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // A null cnapName should be the same as "" 484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (TextUtils.isEmpty(dc.name)) { 48522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!TextUtils.isEmpty(mCnapName)) { 486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 48722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = ""; 488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 48922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (!dc.name.equals(mCnapName)) { 490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 49122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = dc.name; 492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 49422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (Phone.DEBUG_PHONE) log("--dssds----"+mCnapName); 49522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = dc.namePresentation; 49622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = dc.numberPresentation; 497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 49822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (newParent != mParent) { 49922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 50022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent.attach(this, dc); 50322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = newParent; 504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean parentStateChange; 50722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville parentStateChange = mParent.update (this, dc); 508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = changed || parentStateChange; 509c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Some state-transition events */ 512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) log( 51422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville "update: parent=" + mParent + 51522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville ", hasNewParent=" + (newParent != mParent) + 516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", wasConnectingInOrOut=" + wasConnectingInOrOut + 517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", wasHolding=" + wasHolding + 518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", isConnectingInOrOut=" + isConnectingInOrOut() + 519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", changed=" + changed); 520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 521c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 522c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (wasConnectingInOrOut && !isConnectingInOrOut()) { 523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut(); 524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (changed && !wasHolding && (getState() == GsmCall.State.HOLDING)) { 527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We've transitioned into HOLDING 528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return changed; 532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is in the foregroundCall 536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * when a dial is initiated. 537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * We know we're ACTIVE, and we know we're going to end up 538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * HOLDING in the backgroundCall 539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fakeHoldBeforeDial() { 54222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 54322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 54622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = mOwner.mBackgroundCall; 54722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.attachFake(this, GsmCall.State.HOLDING); 548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ int 553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getGSMIndex() throws CallStateException { 55422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mIndex >= 0) { 55522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIndex + 1; 556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("GSM index not yet assigned"); 558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * An incoming or outgoing call has connected 563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut() { 56622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTime = System.currentTimeMillis(); 56722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTimeReal = SystemClock.elapsedRealtime(); 56822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDuration = 0; 569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // bug #678474: incoming call interpreted as missed call, even though 571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // it sounds like the user has picked up the call. 572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) { 57322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville log("onConnectedInOrOut: connectTime=" + mConnectTime); 574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 57622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mIsIncoming) { 577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // outgoing calls only 578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5839b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam /*package*/ void 584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding() { 58522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHoldingStartTime = SystemClock.elapsedRealtime(); 586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Performs the appropriate action for a post-dial char, but does not 589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * notify application. returns false if the character is invalid and 590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * should be ignored 591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processPostDialChar(char c) { 594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (PhoneNumberUtils.is12Key(c)) { 59522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.mCi.sendDtmf(c, mHandler.obtainMessage(EVENT_DTMF_DONE)); 596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (c == PhoneNumberUtils.PAUSE) { 597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // From TS 22.101: 59837d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // It continues... 59937d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // Upon the called party answering the UE shall send the DTMF digits 600a6aedcd548ee25f4df9d86ae94eec8b2a0b61f5aWink Saville // automatically to the network after a delay of 3 seconds( 20 ). 60137d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // The digits shall be sent according to the procedures and timing 60237d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // specified in 3GPP TS 24.008 [13]. The first occurrence of the 60337d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // "DTMF Control Digits Separator" shall be used by the ME to 60437d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // distinguish between the addressing digits (i.e. the phone number) 60537d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // and the DTMF digits. Upon subsequent occurrences of the 60637d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // separator, 607a6aedcd548ee25f4df9d86ae94eec8b2a0b61f5aWink Saville // the UE shall pause again for 3 seconds ( 20 ) before sending 60837d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // any further DTMF digits. 609a6aedcd548ee25f4df9d86ae94eec8b2a0b61f5aWink Saville mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_PAUSE_DONE), 61037d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan PAUSE_DELAY_MILLIS); 611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (c == PhoneNumberUtils.WAIT) { 612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.WAIT); 613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (c == PhoneNumberUtils.WILD) { 614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.WILD); 615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 622cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String 624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getRemainingPostDialString() { 62522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState == PostDialState.CANCELLED 62622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mPostDialState == PostDialState.COMPLETE 62722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mPostDialString == null 62822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mPostDialString.length() <= mNextPostDialChar 629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ) { 630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ""; 631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 63322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mPostDialString.substring(mNextPostDialChar); 634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void finalize() 638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville { 639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * It is understood that This finializer is not guaranteed 641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to be called and the release lock call is here just in 642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * case there is some path that doesn't call onDisconnect 643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and or onConnectedInOrOut. 644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mPartialWakeLock.isHeld()) { 646ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e(LOG_TAG, "[GSMConn] UNEXPECTED; mPartialWakeLock is held when finalizing."); 647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 6480b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton clearPostDialListeners(); 649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar() { 654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char c = 0; 655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Registrant postDialHandler; 656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 65722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState == PostDialState.CANCELLED) { 658ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville //Rlog.v("GSM", "##### processNextPostDialChar: postDialState == CANCELLED, bail"); 659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 66222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialString == null || 66322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString.length() <= mNextPostDialChar) { 664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.COMPLETE); 665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // notifyMessage.arg1 is 0 on complete 667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c = 0; 668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isValid; 670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 67322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville c = mPostDialString.charAt(mNextPostDialChar++); 674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isValid = processPostDialChar(c); 676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isValid) { 678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Will call processNextPostDialChar 67922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget(); 680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Don't notify application 681ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e("GSM", "processNextPostDialChar: c=" + c + " isn't valid!"); 682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 68622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville postDialHandler = mOwner.mPhone.mPostDialHandler; 687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message notifyMessage; 689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (postDialHandler != null 691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && (notifyMessage = postDialHandler.messageForRegistrant()) != null) { 692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The AsyncResult.result is the Connection object 69322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville PostDialState state = mPostDialState; 694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult ar = AsyncResult.forMessage(notifyMessage); 695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.result = this; 696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.userObj = state; 697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // arg1 is the character that was/is being processed 699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.arg1 = c; 700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 701ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville //Rlog.v("GSM", "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c); 702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.sendToTarget(); 703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** "connecting" means "has never been ACTIVE" for both incoming 708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and outgoing calls 709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isConnectingInOrOut() { 71222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mParent == null || mParent == mOwner.mRingingCall 71322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mParent.mState == GsmCall.State.DIALING 71422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mParent.mState == GsmCall.State.ALERTING; 715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private GsmCall 718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parentFromDCState (DriverCall.State state) { 719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (state) { 720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ACTIVE: 721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case DIALING: 722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ALERTING: 72322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mForegroundCall; 724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case HOLDING: 72722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mBackgroundCall; 728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case INCOMING: 731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case WAITING: 73222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mRingingCall; 733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new RuntimeException("illegal call state: " + state); 737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set post dial state and acquire wake lock while switching to "started" 742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * state, the wake lock will be released if state switches out of "started" 743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * state or after WAKE_LOCK_TIMEOUT_MILLIS. 744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param s new PostDialState 745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void setPostDialState(PostDialState s) { 74722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.STARTED 748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && s == PostDialState.STARTED) { 749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 75022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); 75122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); 75222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (mPostDialState == PostDialState.STARTED 753c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && s != PostDialState.STARTED) { 75422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 75722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialState = s; 7580b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton notifyPostDialListeners(); 759c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 760c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 761c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 762c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(Context context) { 763c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 764c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 765c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 766c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock() { 769c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("acquireWakeLock"); 770c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock.acquire(); 771c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 772c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 773c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 774c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock() { 775c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville synchronized(mPartialWakeLock) { 776c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mPartialWakeLock.isHeld()) { 777c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("releaseWakeLock"); 778c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock.release(); 779c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 780c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 781c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 782c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 783c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void log(String msg) { 784ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "[GSMConn] " + msg); 785c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 786c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 787c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 788c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public int getNumberPresentation() { 78922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mNumberPresentation; 790c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 791c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 792c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 793c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public UUSInfo getUUSInfo() { 79422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mUusInfo; 795c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 7960742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela 7970742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela public int getPreciseDisconnectCause() { 7980742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela return mPreciseCause; 7990742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela } 800a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 801a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville /* package */ void 802a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville migrateFrom(Connection c) { 803a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (c == null) return; 804a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 805a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.mAddress = c.getAddress(); 806a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.mNumberPresentation = c.getNumberPresentation(); 807a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 808a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.mDialString = c.getOrigDialString(); 809a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 810a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.mCnapName = c.getCnapName(); 811a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.mCnapNamePresentation = c.getCnapNamePresentation(); 812a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 813a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.mIsIncoming = c.isIncoming(); 814a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 815a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.mCreateTime = c.getCreateTime(); 816a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.mConnectTime = c.getConnectTime(); 817a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.mConnectTimeReal = c.getConnectTimeReal(); 818a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 819a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.mHoldingStartTime = c.getHoldingStartTime(); 820a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 821a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.mUusInfo = c.getUUSInfo(); 822a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 823a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.setUserData(c.getUserData()); 824a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 825a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.mOrigConnection = c; 826a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 827a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 828a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 829a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public Connection getOrigConnection() { 830a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mOrigConnection; 831a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 832a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 833a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 834a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isMultiparty() { 835a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mOrigConnection != null) { 836a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mOrigConnection.isMultiparty(); 837a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 838a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 839a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 840a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 841c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 842