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; 26ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog; 27c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.PhoneNumberUtils; 28c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.ServiceState; 29c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.text.TextUtils; 30c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.*; 32d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.UiccCardApplication; 33e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.uicc.UiccController; 34d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState; 35c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 36c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/** 37c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide} 38c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic class GsmConnection extends Connection { 40cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private static final String LOG_TAG = "GsmConnection"; 41cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private static final boolean DBG = true; 42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 43c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Instance Variables 44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 4522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville GsmCallTracker mOwner; 4622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville GsmCall mParent; 47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 4822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville String mAddress; // MAY BE NULL!!! 4922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville String mDialString; // outgoing calls only 5022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville String mPostDialString; // outgoing calls only 5122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean mIsIncoming; 5222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville boolean mDisconnected; 53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville int mIndex; // index in GsmCallTracker.connections[], -1 if unassigned 55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The GSM index is 1 + this 56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* 58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * These time/timespan values are based on System.currentTimeMillis(), 59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * i.e., "wall clock" time. 60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 6122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville long mCreateTime; 6222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville long mConnectTime; 6322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville long mDisconnectTime; 64c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* 66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * These time/timespan values are based on SystemClock.elapsedRealTime(), 67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * i.e., time since boot. They are appropriate for comparison and 68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * calculating deltas. 69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 7022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville long mConnectTimeReal; 7122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville long mDuration; 7222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville long mHoldingStartTime; // The time when the Connection last transitioned 73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // into HOLDING 74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 7522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville int mNextPostDialChar; // index into postDialString 76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 7722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville DisconnectCause mCause = DisconnectCause.NOT_DISCONNECTED; 7822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville PostDialState mPostDialState = PostDialState.NOT_STARTED; 7922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville int mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 8022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville UUSInfo mUusInfo; 81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 8222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Handler mHandler; 83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private PowerManager.WakeLock mPartialWakeLock; 85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Event Constants 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_DTMF_DONE = 1; 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_PAUSE_DONE = 2; 89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_NEXT_POST_DIAL = 3; 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_WAKE_LOCK_TIMEOUT = 4; 91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constants 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int PAUSE_DELAY_MILLIS = 3 * 1000; 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000; 95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Inner Classes 97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville class MyHandler extends Handler { 99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville MyHandler(Looper l) {super(l);} 100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 101cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleMessage(Message msg) { 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (msg.what) { 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_NEXT_POST_DIAL: 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_DTMF_DONE: 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_PAUSE_DONE: 109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_WAKE_LOCK_TIMEOUT: 112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constructors 119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** This is probably an MT call that we first saw in a CLCC response */ 121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ 122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmConnection (Context context, DriverCall dc, GsmCallTracker ct, int index) { 123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(context); 124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 12622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 12722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 12922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = dc.number; 130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 13122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = dc.isMT; 13222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 13322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = dc.name; 13422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = dc.namePresentation; 13522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = dc.numberPresentation; 13622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mUusInfo = dc.uusInfo; 137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 13822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = index; 139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 14022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = parentFromDCState (dc.state); 14122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.attach(this, dc); 142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** This is an MO call, created when dialing */ 145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ 146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmConnection (Context context, String dialString, GsmCallTracker ct, GsmCall parent) { 147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(context); 148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 15122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDialString = dialString; 154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString); 15622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString); 157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = -1; 159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 16022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = false; 16122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = null; 16222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED; 16322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 16422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 16622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = parent; 167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parent.attachFake(this, GsmCall.State.DIALING); 168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static boolean 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville equalsHandlesNulls (Object a, Object b) { 175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return (a == null) ? (b == null) : a.equals (b); 176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ boolean 179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville compareTo(DriverCall c) { 180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // On mobile originated (MO) calls, the phone number may have changed 181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // due to a SIM Toolkit call control modification. 182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We assume we know when MO calls are created (since we created them) 184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // and therefore don't need to compare the phone number anyway. 18522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (! (mIsIncoming || c.isMT)) return true; 186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ... but we can compare phone numbers on MT calls, and we have 188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // no control over when they begin, so we might as well 189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String cAddress = PhoneNumberUtils.stringFromStringAndTOA(c.number, c.TOA); 19122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIsIncoming == c.isMT && equalsHandlesNulls(mAddress, cAddress); 192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 194cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getAddress() { 19622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mAddress; 197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 199cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public GsmCall getCall() { 20122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mParent; 202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 204cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getCreateTime() { 20622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mCreateTime; 207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 209cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getConnectTime() { 21122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mConnectTime; 212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 214cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getDisconnectTime() { 21622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mDisconnectTime; 217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 219cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getDurationMillis() { 22122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mConnectTimeReal == 0) { 222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 0; 22322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (mDuration == 0) { 22422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return SystemClock.elapsedRealtime() - mConnectTimeReal; 225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 22622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mDuration; 227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 230cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getHoldDurationMillis() { 232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (getState() != GsmCall.State.HOLDING) { 233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If not holding, return 0 234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 0; 235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 23622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return SystemClock.elapsedRealtime() - mHoldingStartTime; 237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 240cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public DisconnectCause getDisconnectCause() { 24222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mCause; 243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 245cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public boolean isIncoming() { 24722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIsIncoming; 248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 250cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public GsmCall.State getState() { 25222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mDisconnected) { 253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return GsmCall.State.DISCONNECTED; 254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return super.getState(); 256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 259cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void hangup() throws CallStateException { 26122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 26222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.hangup(this); 263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 268cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void separate() throws CallStateException { 27022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 27122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.separate(this); 272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 277cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public PostDialState getPostDialState() { 27922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mPostDialState; 280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 282cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWaitChar() { 28422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.WAIT) { 285ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "GsmConnection.proceedAfterWaitChar(): Expected " 28622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + "getPostDialState() to be WAIT but was " + mPostDialState); 287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 295cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWildChar(String str) { 29722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.WILD) { 298ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "GsmConnection.proceedAfterWaitChar(): Expected " 29922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + "getPostDialState() to be WILD but was " + mPostDialState); 300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 305cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // make a new postDialString, with the wild char replacement string 306cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // at the beginning, followed by the remaining postDialString. 307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 308cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville StringBuilder buf = new StringBuilder(str); 30922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville buf.append(mPostDialString.substring(mNextPostDialChar)); 31022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString = buf.toString(); 31122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNextPostDialChar = 0; 312cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (Phone.DEBUG_PHONE) { 313cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("proceedAfterWildChar: new postDialString is " + 31422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString); 315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 316cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 317cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville processNextPostDialChar(); 318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 320cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void cancelPostDial() { 322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.CANCELLED); 323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is being hung up locally (eg, user pressed "end") 327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Note that at this point, the hangup request has been dispatched to the radio 328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * but no response has yet been received so update() has not yet been called 329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onHangupLocal() { 33222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCause = DisconnectCause.LOCAL; 333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville DisconnectCause 336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville disconnectCauseFromCode(int causeCode) { 337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See 22.001 Annex F.4 for mapping of cause codes 339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to local tones 340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (causeCode) { 343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.USER_BUSY: 344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.BUSY; 345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NO_CIRCUIT_AVAIL: 347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.TEMPORARY_FAILURE: 348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.SWITCHING_CONGESTION: 349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CHANNEL_NOT_AVAIL: 350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.QOS_NOT_AVAIL: 351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.BEARER_NOT_AVAIL: 352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CONGESTION; 353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ACM_LIMIT_EXCEEDED: 355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.LIMIT_EXCEEDED; 356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CALL_BARRED: 358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CALL_BARRED; 359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.FDN_BLOCKED: 361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.FDN_BLOCKED; 362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.UNOBTAINABLE_NUMBER: 364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.UNOBTAINABLE_NUMBER; 365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ERROR_UNSPECIFIED: 367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NORMAL_CLEARING: 368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 36922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville GSMPhone phone = mOwner.mPhone; 370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int serviceState = phone.getServiceState().getState(); 371a2da94751bbf8718bbaa4e181eb7d0633c1ab0f7Alex Yakavenka UiccCardApplication cardApp = UiccController 372e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka .getInstance() 373a2da94751bbf8718bbaa4e181eb7d0633c1ab0f7Alex Yakavenka .getUiccCardApplication(UiccController.APP_FAM_3GPP); 374a2da94751bbf8718bbaa4e181eb7d0633c1ab0f7Alex Yakavenka AppState uiccAppState = (cardApp != null) ? cardApp.getState() : 375a2da94751bbf8718bbaa4e181eb7d0633c1ab0f7Alex Yakavenka AppState.APPSTATE_UNKNOWN; 376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (serviceState == ServiceState.STATE_POWER_OFF) { 377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.POWER_OFF; 378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE 379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || serviceState == ServiceState.STATE_EMERGENCY_ONLY ) { 380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.OUT_OF_SERVICE; 381e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (uiccAppState != AppState.APPSTATE_READY) { 382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ICC_ERROR; 383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (causeCode == CallFailCause.ERROR_UNSPECIFIED) { 384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (phone.mSST.mRestrictedState.isCsRestricted()) { 385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED; 386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (phone.mSST.mRestrictedState.isCsEmergencyRestricted()) { 387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED_EMERGENCY; 388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (phone.mSST.mRestrictedState.isCsNormalRestricted()) { 389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED_NORMAL; 390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ERROR_UNSPECIFIED; 392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (causeCode == CallFailCause.NORMAL_CLEARING) { 394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.NORMAL; 395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If nothing else matches, report unknown call drop reason 397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // to app, not NORMAL call end. 398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ERROR_UNSPECIFIED; 399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ void 404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onRemoteDisconnect(int causeCode) { 405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onDisconnect(disconnectCauseFromCode(causeCode)); 406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Called when the radio indicates the connection has been disconnected */ 409368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann /*package*/ boolean 410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onDisconnect(DisconnectCause cause) { 411368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann boolean changed = false; 412368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann 41322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCause = cause; 414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 41522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 41622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = -1; 417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 41822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDisconnectTime = System.currentTimeMillis(); 41922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDuration = SystemClock.elapsedRealtime() - mConnectTimeReal; 42022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDisconnected = true; 421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 422cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) Rlog.d(LOG_TAG, "onDisconnect: cause=" + cause); 423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 42422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.mPhone.notifyDisconnect(this); 425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 42622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 427368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann changed = mParent.connectionDisconnected(this); 428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 431368e873b65e60268521b3c74110a9b2abe8086acDanny Baumann return changed; 432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Returns true if state has changed, false if nothing changed 435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ boolean 436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville update (DriverCall dc) { 437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmCall newParent; 438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean changed = false; 439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wasConnectingInOrOut = isConnectingInOrOut(); 440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wasHolding = (getState() == GsmCall.State.HOLDING); 441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent = parentFromDCState(dc.state); 443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 44422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!equalsHandlesNulls(mAddress, dc.number)) { 445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) log("update: phone # changed!"); 44622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = dc.number; 447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // A null cnapName should be the same as "" 451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (TextUtils.isEmpty(dc.name)) { 45222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!TextUtils.isEmpty(mCnapName)) { 453c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 45422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = ""; 455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 45622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (!dc.name.equals(mCnapName)) { 457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 45822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = dc.name; 459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 46122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (Phone.DEBUG_PHONE) log("--dssds----"+mCnapName); 46222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = dc.namePresentation; 46322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = dc.numberPresentation; 464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 46522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (newParent != mParent) { 46622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 46722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent.attach(this, dc); 47022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = newParent; 471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean parentStateChange; 47422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville parentStateChange = mParent.update (this, dc); 475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = changed || parentStateChange; 476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Some state-transition events */ 479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) log( 48122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville "update: parent=" + mParent + 48222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville ", hasNewParent=" + (newParent != mParent) + 483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", wasConnectingInOrOut=" + wasConnectingInOrOut + 484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", wasHolding=" + wasHolding + 485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", isConnectingInOrOut=" + isConnectingInOrOut() + 486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", changed=" + changed); 487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (wasConnectingInOrOut && !isConnectingInOrOut()) { 490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut(); 491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (changed && !wasHolding && (getState() == GsmCall.State.HOLDING)) { 494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We've transitioned into HOLDING 495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return changed; 499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is in the foregroundCall 503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * when a dial is initiated. 504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * We know we're ACTIVE, and we know we're going to end up 505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * HOLDING in the backgroundCall 506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fakeHoldBeforeDial() { 50922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 51022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 51322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = mOwner.mBackgroundCall; 51422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.attachFake(this, GsmCall.State.HOLDING); 515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ int 520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getGSMIndex() throws CallStateException { 52122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mIndex >= 0) { 52222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIndex + 1; 523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("GSM index not yet assigned"); 525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * An incoming or outgoing call has connected 530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut() { 53322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTime = System.currentTimeMillis(); 53422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTimeReal = SystemClock.elapsedRealtime(); 53522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDuration = 0; 536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // bug #678474: incoming call interpreted as missed call, even though 538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // it sounds like the user has picked up the call. 539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) { 54022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville log("onConnectedInOrOut: connectTime=" + mConnectTime); 541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 54322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mIsIncoming) { 544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // outgoing calls only 545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5509b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam /*package*/ void 551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding() { 55222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHoldingStartTime = SystemClock.elapsedRealtime(); 553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Performs the appropriate action for a post-dial char, but does not 556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * notify application. returns false if the character is invalid and 557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * should be ignored 558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processPostDialChar(char c) { 561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (PhoneNumberUtils.is12Key(c)) { 56222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.mCi.sendDtmf(c, mHandler.obtainMessage(EVENT_DTMF_DONE)); 563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (c == PhoneNumberUtils.PAUSE) { 564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // From TS 22.101: 56537d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // It continues... 56637d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // Upon the called party answering the UE shall send the DTMF digits 567a6aedcd548ee25f4df9d86ae94eec8b2a0b61f5aWink Saville // automatically to the network after a delay of 3 seconds( 20 ). 56837d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // The digits shall be sent according to the procedures and timing 56937d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // specified in 3GPP TS 24.008 [13]. The first occurrence of the 57037d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // "DTMF Control Digits Separator" shall be used by the ME to 57137d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // distinguish between the addressing digits (i.e. the phone number) 57237d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // and the DTMF digits. Upon subsequent occurrences of the 57337d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // separator, 574a6aedcd548ee25f4df9d86ae94eec8b2a0b61f5aWink Saville // the UE shall pause again for 3 seconds ( 20 ) before sending 57537d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // any further DTMF digits. 576a6aedcd548ee25f4df9d86ae94eec8b2a0b61f5aWink Saville mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_PAUSE_DONE), 57737d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan PAUSE_DELAY_MILLIS); 578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (c == PhoneNumberUtils.WAIT) { 579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.WAIT); 580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (c == PhoneNumberUtils.WILD) { 581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.WILD); 582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 589cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String 591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getRemainingPostDialString() { 59222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState == PostDialState.CANCELLED 59322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mPostDialState == PostDialState.COMPLETE 59422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mPostDialString == null 59522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mPostDialString.length() <= mNextPostDialChar 596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ) { 597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ""; 598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 60022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mPostDialString.substring(mNextPostDialChar); 601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void finalize() 605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville { 606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * It is understood that This finializer is not guaranteed 608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to be called and the release lock call is here just in 609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * case there is some path that doesn't call onDisconnect 610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and or onConnectedInOrOut. 611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mPartialWakeLock.isHeld()) { 613ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e(LOG_TAG, "[GSMConn] UNEXPECTED; mPartialWakeLock is held when finalizing."); 614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar() { 620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char c = 0; 621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Registrant postDialHandler; 622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 62322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState == PostDialState.CANCELLED) { 624ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville //Rlog.v("GSM", "##### processNextPostDialChar: postDialState == CANCELLED, bail"); 625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 62822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialString == null || 62922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString.length() <= mNextPostDialChar) { 630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.COMPLETE); 631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // notifyMessage.arg1 is 0 on complete 633c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c = 0; 634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isValid; 636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 63922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville c = mPostDialString.charAt(mNextPostDialChar++); 640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isValid = processPostDialChar(c); 642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isValid) { 644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Will call processNextPostDialChar 64522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget(); 646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Don't notify application 647ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e("GSM", "processNextPostDialChar: c=" + c + " isn't valid!"); 648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 65222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville postDialHandler = mOwner.mPhone.mPostDialHandler; 653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message notifyMessage; 655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (postDialHandler != null 657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && (notifyMessage = postDialHandler.messageForRegistrant()) != null) { 658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The AsyncResult.result is the Connection object 65922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville PostDialState state = mPostDialState; 660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult ar = AsyncResult.forMessage(notifyMessage); 661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.result = this; 662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.userObj = state; 663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // arg1 is the character that was/is being processed 665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.arg1 = c; 666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 667ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville //Rlog.v("GSM", "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c); 668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.sendToTarget(); 669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** "connecting" means "has never been ACTIVE" for both incoming 674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and outgoing calls 675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isConnectingInOrOut() { 67822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mParent == null || mParent == mOwner.mRingingCall 67922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mParent.mState == GsmCall.State.DIALING 68022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mParent.mState == GsmCall.State.ALERTING; 681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private GsmCall 684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parentFromDCState (DriverCall.State state) { 685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (state) { 686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ACTIVE: 687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case DIALING: 688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ALERTING: 68922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mForegroundCall; 690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case HOLDING: 69322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mBackgroundCall; 694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case INCOMING: 697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case WAITING: 69822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mRingingCall; 699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new RuntimeException("illegal call state: " + state); 703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set post dial state and acquire wake lock while switching to "started" 708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * state, the wake lock will be released if state switches out of "started" 709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * state or after WAKE_LOCK_TIMEOUT_MILLIS. 710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param s new PostDialState 711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void setPostDialState(PostDialState s) { 71322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.STARTED 714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && s == PostDialState.STARTED) { 715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 71622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); 71722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); 71822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (mPostDialState == PostDialState.STARTED 719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && s != PostDialState.STARTED) { 72022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 72322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialState = s; 724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(Context context) { 728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 732c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock() { 734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("acquireWakeLock"); 735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock.acquire(); 736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock() { 740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville synchronized(mPartialWakeLock) { 741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mPartialWakeLock.isHeld()) { 742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("releaseWakeLock"); 743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock.release(); 744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 747c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void log(String msg) { 749ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "[GSMConn] " + msg); 750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 753c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public int getNumberPresentation() { 75422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mNumberPresentation; 755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 757c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 758c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public UUSInfo getUUSInfo() { 75922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mUusInfo; 760c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 761c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 762