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; 236fe3701df3477f7456c594e71a124bcbba926121Roshan Piusimport android.os.PersistableBundle; 24c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.PowerManager; 25c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.Registrant; 26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.os.SystemClock; 276fe3701df3477f7456c594e71a124bcbba926121Roshan Piusimport android.telephony.CarrierConfigManager; 28b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensenimport android.telephony.DisconnectCause; 29ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Savilleimport android.telephony.Rlog; 30c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.PhoneNumberUtils; 31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.ServiceState; 32c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.text.TextUtils; 33c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 34c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.*; 35d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.UiccCardApplication; 36e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.uicc.UiccController; 37d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex Yakavenkaimport com.android.internal.telephony.uicc.IccCardApplicationStatus.AppState; 38c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/** 40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide} 41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic class GsmConnection extends Connection { 43cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private static final String LOG_TAG = "GsmConnection"; 44cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville private static final boolean DBG = true; 45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Instance Variables 47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 4822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville GsmCallTracker mOwner; 4922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville GsmCall mParent; 50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville String mPostDialString; // outgoing calls only 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 mDisconnectTime; 62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 6322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville int mNextPostDialChar; // index into postDialString 64c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 65b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen int mCause = DisconnectCause.NOT_DISCONNECTED; 6622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville PostDialState mPostDialState = PostDialState.NOT_STARTED; 6722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville UUSInfo mUusInfo; 680742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela int mPreciseCause = 0; 6933cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu String mVendorCause; 70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 71a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville Connection mOrigConnection; 72a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 7322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Handler mHandler; 74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private PowerManager.WakeLock mPartialWakeLock; 76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 776fe3701df3477f7456c594e71a124bcbba926121Roshan Pius // The cached delay to be used between DTMF tones fetched from carrier config. 786fe3701df3477f7456c594e71a124bcbba926121Roshan Pius private int mDtmfToneDelay = 0; 796fe3701df3477f7456c594e71a124bcbba926121Roshan Pius 80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Event Constants 81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_DTMF_DONE = 1; 82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_PAUSE_DONE = 2; 83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_NEXT_POST_DIAL = 3; 84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_WAKE_LOCK_TIMEOUT = 4; 856fe3701df3477f7456c594e71a124bcbba926121Roshan Pius static final int EVENT_DTMF_DELAY_DONE = 5; 86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constants 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int PAUSE_DELAY_MILLIS = 3 * 1000; 89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000; 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Inner Classes 92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville class MyHandler extends Handler { 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville MyHandler(Looper l) {super(l);} 95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 96cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void 98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleMessage(Message msg) { 99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (msg.what) { 101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_NEXT_POST_DIAL: 1026fe3701df3477f7456c594e71a124bcbba926121Roshan Pius case EVENT_DTMF_DELAY_DONE: 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_PAUSE_DONE: 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_WAKE_LOCK_TIMEOUT: 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 1096fe3701df3477f7456c594e71a124bcbba926121Roshan Pius case EVENT_DTMF_DONE: 1106fe3701df3477f7456c594e71a124bcbba926121Roshan Pius // We may need to add a delay specified by carrier between DTMF tones that are 1116fe3701df3477f7456c594e71a124bcbba926121Roshan Pius // sent out. 1126fe3701df3477f7456c594e71a124bcbba926121Roshan Pius mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_DTMF_DELAY_DONE), 1136fe3701df3477f7456c594e71a124bcbba926121Roshan Pius mDtmfToneDelay); 1146fe3701df3477f7456c594e71a124bcbba926121Roshan Pius break; 115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constructors 120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** This is probably an MT call that we first saw in a CLCC response */ 122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ 1236fe3701df3477f7456c594e71a124bcbba926121Roshan Pius GsmConnection (GSMPhone phone, DriverCall dc, GsmCallTracker ct, int index) { 1246fe3701df3477f7456c594e71a124bcbba926121Roshan Pius createWakeLock(phone.getContext()); 125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 12722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 12822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 13022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = dc.number; 131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 13222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = dc.isMT; 13322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 13422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = dc.name; 13522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = dc.namePresentation; 13622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = dc.numberPresentation; 13722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mUusInfo = dc.uusInfo; 138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 13922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = index; 140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 14122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = parentFromDCState (dc.state); 14222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.attach(this, dc); 1436fe3701df3477f7456c594e71a124bcbba926121Roshan Pius 1446fe3701df3477f7456c594e71a124bcbba926121Roshan Pius fetchDtmfToneDelay(phone); 145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** This is an MO call, created when dialing */ 148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ 1496fe3701df3477f7456c594e71a124bcbba926121Roshan Pius GsmConnection (GSMPhone phone, String dialString, GsmCallTracker ct, GsmCall parent) { 1506fe3701df3477f7456c594e71a124bcbba926121Roshan Pius createWakeLock(phone.getContext()); 151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner = ct; 15422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new MyHandler(mOwner.getLooper()); 155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDialString = dialString; 157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 15822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString); 15922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString); 160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 16122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = -1; 162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 16322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIsIncoming = false; 16422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = null; 16522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED; 16622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 16722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCreateTime = System.currentTimeMillis(); 168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 16922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = parent; 170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parent.attachFake(this, GsmCall.State.DIALING); 1716fe3701df3477f7456c594e71a124bcbba926121Roshan Pius 1726fe3701df3477f7456c594e71a124bcbba926121Roshan Pius fetchDtmfToneDelay(phone); 173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 1768f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan clearPostDialListeners(); 1778f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan releaseAllWakeLocks(); 178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static boolean 181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville equalsHandlesNulls (Object a, Object b) { 182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return (a == null) ? (b == null) : a.equals (b); 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ boolean 186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville compareTo(DriverCall c) { 187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // On mobile originated (MO) calls, the phone number may have changed 188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // due to a SIM Toolkit call control modification. 189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We assume we know when MO calls are created (since we created them) 191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // and therefore don't need to compare the phone number anyway. 19222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (! (mIsIncoming || c.isMT)) return true; 193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 194a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // A new call appearing by SRVCC may have invalid number 195a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // if IMS service is not tightly coupled with cellular modem stack. 196a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville // Thus we prefer the preexisting handover connection instance. 197a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mOrigConnection != null) return true; 198a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ... but we can compare phone numbers on MT calls, and we have 200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // no control over when they begin, so we might as well 201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String cAddress = PhoneNumberUtils.stringFromStringAndTOA(c.number, c.TOA); 20322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIsIncoming == c.isMT && equalsHandlesNulls(mAddress, cAddress); 204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 206cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public GsmCall getCall() { 20822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mParent; 209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 211cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getDisconnectTime() { 21322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mDisconnectTime; 214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 216cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getHoldDurationMillis() { 218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (getState() != GsmCall.State.HOLDING) { 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If not holding, return 0 220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 0; 221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 22222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return SystemClock.elapsedRealtime() - mHoldingStartTime; 223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 226cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 227b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen public int getDisconnectCause() { 22822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mCause; 229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 231cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public GsmCall.State getState() { 23322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mDisconnected) { 234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return GsmCall.State.DISCONNECTED; 235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return super.getState(); 237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 240cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void hangup() throws CallStateException { 24222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 24322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.hangup(this); 244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 249cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void separate() throws CallStateException { 25122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 25222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.separate(this); 253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 258cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public PostDialState getPostDialState() { 26022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mPostDialState; 261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 263cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWaitChar() { 26522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.WAIT) { 266ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "GsmConnection.proceedAfterWaitChar(): Expected " 26722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + "getPostDialState() to be WAIT but was " + mPostDialState); 268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 276cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWildChar(String str) { 27822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.WILD) { 279ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.w(LOG_TAG, "GsmConnection.proceedAfterWaitChar(): Expected " 28022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville + "getPostDialState() to be WILD but was " + mPostDialState); 281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 286cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // make a new postDialString, with the wild char replacement string 287cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville // at the beginning, followed by the remaining postDialString. 288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 289cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville StringBuilder buf = new StringBuilder(str); 29022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville buf.append(mPostDialString.substring(mNextPostDialChar)); 29122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString = buf.toString(); 29222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNextPostDialChar = 0; 293cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (Phone.DEBUG_PHONE) { 294cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville log("proceedAfterWildChar: new postDialString is " + 29522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString); 296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 297cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville 298cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville processNextPostDialChar(); 299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 301cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void cancelPostDial() { 303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.CANCELLED); 304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is being hung up locally (eg, user pressed "end") 308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Note that at this point, the hangup request has been dispatched to the radio 309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * but no response has yet been received so update() has not yet been called 310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onHangupLocal() { 31322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCause = DisconnectCause.LOCAL; 3140742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela mPreciseCause = 0; 31533cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu mVendorCause = null; 316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 318b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /** 319b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * Maps RIL call disconnect code to {@link DisconnectCause}. 320b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @param causeCode RIL disconnect code 321b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @return the corresponding value from {@link DisconnectCause} 322b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen */ 323b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen int disconnectCauseFromCode(int causeCode) { 324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See 22.001 Annex F.4 for mapping of cause codes 326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to local tones 327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (causeCode) { 330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.USER_BUSY: 331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.BUSY; 332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NO_CIRCUIT_AVAIL: 334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.TEMPORARY_FAILURE: 335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.SWITCHING_CONGESTION: 336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CHANNEL_NOT_AVAIL: 337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.QOS_NOT_AVAIL: 338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.BEARER_NOT_AVAIL: 339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CONGESTION; 340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ACM_LIMIT_EXCEEDED: 342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.LIMIT_EXCEEDED; 343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CALL_BARRED: 345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CALL_BARRED; 346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.FDN_BLOCKED: 348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.FDN_BLOCKED; 349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.UNOBTAINABLE_NUMBER: 351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.UNOBTAINABLE_NUMBER; 352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 35309b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_USSD: 35409b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_USSD; 35509b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja 35609b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_SS: 35709b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_SS; 35809b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja 35909b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja case CallFailCause.DIAL_MODIFIED_TO_DIAL: 36009b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja return DisconnectCause.DIAL_MODIFIED_TO_DIAL; 36109b65da3b46e18c8acc146d722047ba2fb161bfePreeti Ahuja 362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ERROR_UNSPECIFIED: 363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NORMAL_CLEARING: 364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 36522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville GSMPhone phone = mOwner.mPhone; 366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int serviceState = phone.getServiceState().getState(); 367a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville UiccCardApplication cardApp = phone.getUiccCardApplication(); 368a2da94751bbf8718bbaa4e181eb7d0633c1ab0f7Alex Yakavenka AppState uiccAppState = (cardApp != null) ? cardApp.getState() : 369a2da94751bbf8718bbaa4e181eb7d0633c1ab0f7Alex Yakavenka AppState.APPSTATE_UNKNOWN; 370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (serviceState == ServiceState.STATE_POWER_OFF) { 371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.POWER_OFF; 372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE 373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || serviceState == ServiceState.STATE_EMERGENCY_ONLY ) { 374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.OUT_OF_SERVICE; 375e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (uiccAppState != AppState.APPSTATE_READY) { 376c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ICC_ERROR; 377c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (causeCode == CallFailCause.ERROR_UNSPECIFIED) { 378c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (phone.mSST.mRestrictedState.isCsRestricted()) { 379c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED; 380c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (phone.mSST.mRestrictedState.isCsEmergencyRestricted()) { 381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED_EMERGENCY; 382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (phone.mSST.mRestrictedState.isCsNormalRestricted()) { 383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED_NORMAL; 384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ERROR_UNSPECIFIED; 386c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (causeCode == CallFailCause.NORMAL_CLEARING) { 388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.NORMAL; 389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If nothing else matches, report unknown call drop reason 391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // to app, not NORMAL call end. 392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ERROR_UNSPECIFIED; 393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ void 39833cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu onRemoteDisconnect(int causeCode, String vendorCause) { 3990742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela this.mPreciseCause = causeCode; 40033cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu this.mVendorCause = vendorCause; 401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onDisconnect(disconnectCauseFromCode(causeCode)); 402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 404b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /** 405b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * Called when the radio indicates the connection has been disconnected. 406b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen * @param cause call disconnect cause; values are defined in {@link DisconnectCause} 407b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen */ 408b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen /*package*/ boolean onDisconnect(int cause) { 4091220a4e283def0598468376cf112d3b904026fb8Danny Baumann boolean changed = false; 4101220a4e283def0598468376cf112d3b904026fb8Danny Baumann 41122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCause = cause; 412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 41322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mDisconnected) { 41422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mIndex = -1; 415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 41622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDisconnectTime = System.currentTimeMillis(); 41722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDuration = SystemClock.elapsedRealtime() - mConnectTimeReal; 41822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDisconnected = true; 419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 420cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville if (DBG) Rlog.d(LOG_TAG, "onDisconnect: cause=" + cause); 421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 42222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.mPhone.notifyDisconnect(this); 423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 42422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 4251220a4e283def0598468376cf112d3b904026fb8Danny Baumann changed = mParent.connectionDisconnected(this); 426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 427a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 428a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mOrigConnection = null; 429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 4300b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton clearPostDialListeners(); 431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 4321220a4e283def0598468376cf112d3b904026fb8Danny Baumann return changed; 433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Returns true if state has changed, false if nothing changed 436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ boolean 437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville update (DriverCall dc) { 438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmCall newParent; 439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean changed = false; 440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wasConnectingInOrOut = isConnectingInOrOut(); 441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wasHolding = (getState() == GsmCall.State.HOLDING); 442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent = parentFromDCState(dc.state); 444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 445a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville //Ignore dc.number and dc.name in case of a handover connection 446a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mOrigConnection != null) { 447a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (Phone.DEBUG_PHONE) log("update: mOrigConnection is not null"); 448a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } else { 4494bd290e38a3eb70e153b7bffa101a0c9f130e32ew log(" mNumberConverted " + mNumberConverted); 4504bd290e38a3eb70e153b7bffa101a0c9f130e32ew if (!equalsHandlesNulls(mAddress, dc.number) && (!mNumberConverted 4514bd290e38a3eb70e153b7bffa101a0c9f130e32ew || !equalsHandlesNulls(mConvertedNumber, dc.number))) { 452a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (Phone.DEBUG_PHONE) log("update: phone # changed!"); 453a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville mAddress = dc.number; 454a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville changed = true; 455a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // A null cnapName should be the same as "" 459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (TextUtils.isEmpty(dc.name)) { 46022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!TextUtils.isEmpty(mCnapName)) { 461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 46222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = ""; 463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 46422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (!dc.name.equals(mCnapName)) { 465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 46622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapName = dc.name; 467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 46922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (Phone.DEBUG_PHONE) log("--dssds----"+mCnapName); 47022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCnapNamePresentation = dc.namePresentation; 47122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mNumberPresentation = dc.numberPresentation; 472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 47322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (newParent != mParent) { 47422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 47522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent.attach(this, dc); 47822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = newParent; 479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean parentStateChange; 48222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville parentStateChange = mParent.update (this, dc); 483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = changed || parentStateChange; 484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Some state-transition events */ 487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) log( 48922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville "update: parent=" + mParent + 49022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville ", hasNewParent=" + (newParent != mParent) + 491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", wasConnectingInOrOut=" + wasConnectingInOrOut + 492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", wasHolding=" + wasHolding + 493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", isConnectingInOrOut=" + isConnectingInOrOut() + 494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", changed=" + changed); 495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (wasConnectingInOrOut && !isConnectingInOrOut()) { 498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut(); 499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (changed && !wasHolding && (getState() == GsmCall.State.HOLDING)) { 502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We've transitioned into HOLDING 503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return changed; 507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 509c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is in the foregroundCall 511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * when a dial is initiated. 512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * We know we're ACTIVE, and we know we're going to end up 513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * HOLDING in the backgroundCall 514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fakeHoldBeforeDial() { 51722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mParent != null) { 51822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.detach(this); 519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 52122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent = mOwner.mBackgroundCall; 52222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mParent.attachFake(this, GsmCall.State.HOLDING); 523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ int 528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getGSMIndex() throws CallStateException { 52922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mIndex >= 0) { 53022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mIndex + 1; 531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("GSM index not yet assigned"); 533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * An incoming or outgoing call has connected 538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut() { 54122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTime = System.currentTimeMillis(); 54222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mConnectTimeReal = SystemClock.elapsedRealtime(); 54322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mDuration = 0; 544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // bug #678474: incoming call interpreted as missed call, even though 546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // it sounds like the user has picked up the call. 547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) { 54822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville log("onConnectedInOrOut: connectTime=" + mConnectTime); 549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 55122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (!mIsIncoming) { 552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // outgoing calls only 553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 5589b41acc443e068fa3c3e547e820f710c6e2297baUma Maheswari Ramalingam /*package*/ void 559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding() { 56022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHoldingStartTime = SystemClock.elapsedRealtime(); 561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Performs the appropriate action for a post-dial char, but does not 564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * notify application. returns false if the character is invalid and 565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * should be ignored 566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processPostDialChar(char c) { 569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (PhoneNumberUtils.is12Key(c)) { 57022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mOwner.mCi.sendDtmf(c, mHandler.obtainMessage(EVENT_DTMF_DONE)); 571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (c == PhoneNumberUtils.PAUSE) { 572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // From TS 22.101: 57337d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // It continues... 57437d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // Upon the called party answering the UE shall send the DTMF digits 575a6aedcd548ee25f4df9d86ae94eec8b2a0b61f5aWink Saville // automatically to the network after a delay of 3 seconds( 20 ). 57637d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // The digits shall be sent according to the procedures and timing 57737d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // specified in 3GPP TS 24.008 [13]. The first occurrence of the 57837d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // "DTMF Control Digits Separator" shall be used by the ME to 57937d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // distinguish between the addressing digits (i.e. the phone number) 58037d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // and the DTMF digits. Upon subsequent occurrences of the 58137d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // separator, 582a6aedcd548ee25f4df9d86ae94eec8b2a0b61f5aWink Saville // the UE shall pause again for 3 seconds ( 20 ) before sending 58337d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan // any further DTMF digits. 584a6aedcd548ee25f4df9d86ae94eec8b2a0b61f5aWink Saville mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_PAUSE_DONE), 58537d3599e3fd89987da444ba971df98516d2ea3f5Shruthi Krishnan PAUSE_DELAY_MILLIS); 586c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (c == PhoneNumberUtils.WAIT) { 587c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.WAIT); 588c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (c == PhoneNumberUtils.WILD) { 589c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.WILD); 590c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 591c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return false; 592c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 593c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 594c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return true; 595c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 596c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 597cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville @Override 598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String 599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getRemainingPostDialString() { 60022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState == PostDialState.CANCELLED 60122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mPostDialState == PostDialState.COMPLETE 60222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mPostDialString == null 60322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mPostDialString.length() <= mNextPostDialChar 604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ) { 605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ""; 606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 60822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mPostDialString.substring(mNextPostDialChar); 609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void finalize() 613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville { 614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * It is understood that This finializer is not guaranteed 616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to be called and the release lock call is here just in 617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * case there is some path that doesn't call onDisconnect 618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and or onConnectedInOrOut. 619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mPartialWakeLock.isHeld()) { 621ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e(LOG_TAG, "[GSMConn] UNEXPECTED; mPartialWakeLock is held when finalizing."); 622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 6230b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton clearPostDialListeners(); 624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar() { 629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char c = 0; 630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Registrant postDialHandler; 631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 63222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState == PostDialState.CANCELLED) { 633ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville //Rlog.v("GSM", "##### processNextPostDialChar: postDialState == CANCELLED, bail"); 634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 63722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialString == null || 63822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialString.length() <= mNextPostDialChar) { 639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.COMPLETE); 640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // notifyMessage.arg1 is 0 on complete 642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c = 0; 643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isValid; 645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 64822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville c = mPostDialString.charAt(mNextPostDialChar++); 649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isValid = processPostDialChar(c); 651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isValid) { 653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Will call processNextPostDialChar 65422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget(); 655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Don't notify application 656ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.e("GSM", "processNextPostDialChar: c=" + c + " isn't valid!"); 657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 6614567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen notifyPostDialListenersNextChar(c); 6624567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen 6634567a0789e9966929c71af9a2c3866582c85c9e0Nancy Chen // TODO: remove the following code since the handler no longer executes anything. 66422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville postDialHandler = mOwner.mPhone.mPostDialHandler; 665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message notifyMessage; 667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (postDialHandler != null 669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && (notifyMessage = postDialHandler.messageForRegistrant()) != null) { 670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The AsyncResult.result is the Connection object 67122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville PostDialState state = mPostDialState; 672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult ar = AsyncResult.forMessage(notifyMessage); 673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.result = this; 674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.userObj = state; 675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // arg1 is the character that was/is being processed 677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.arg1 = c; 678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 679ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville //Rlog.v("GSM", "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c); 680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.sendToTarget(); 681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** "connecting" means "has never been ACTIVE" for both incoming 686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and outgoing calls 687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isConnectingInOrOut() { 69022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mParent == null || mParent == mOwner.mRingingCall 69122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mParent.mState == GsmCall.State.DIALING 69222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville || mParent.mState == GsmCall.State.ALERTING; 693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private GsmCall 696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parentFromDCState (DriverCall.State state) { 697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (state) { 698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ACTIVE: 699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case DIALING: 700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ALERTING: 70122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mForegroundCall; 702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case HOLDING: 70522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mBackgroundCall; 706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case INCOMING: 709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case WAITING: 71022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mOwner.mRingingCall; 711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new RuntimeException("illegal call state: " + state); 715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set post dial state and acquire wake lock while switching to "started" 720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * state, the wake lock will be released if state switches out of "started" 721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * state or after WAKE_LOCK_TIMEOUT_MILLIS. 722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param s new PostDialState 723c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void setPostDialState(PostDialState s) { 72522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville if (mPostDialState != PostDialState.STARTED 726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && s == PostDialState.STARTED) { 727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 72822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville Message msg = mHandler.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); 72922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); 73022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville } else if (mPostDialState == PostDialState.STARTED 731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && s != PostDialState.STARTED) { 73222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 73522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mPostDialState = s; 7360b9246d6254bed6f625fa9c551f7f9dcc33d4e38Evan Charlton notifyPostDialListeners(); 737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(Context context) { 741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock() { 747c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("acquireWakeLock"); 748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock.acquire(); 749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock() { 753c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville synchronized(mPartialWakeLock) { 754c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mPartialWakeLock.isHeld()) { 755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("releaseWakeLock"); 756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock.release(); 757c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 758c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 759c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 760c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 7618f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan private void 7628f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan releaseAllWakeLocks() { 7638f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan synchronized(mPartialWakeLock) { 7648f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan while (mPartialWakeLock.isHeld()) { 7658f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan mPartialWakeLock.release(); 7668f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan } 7678f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan } 7688f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan } 7698f811769f344f892056e17eb81c8d74a457cf133Amit Mahajan 7706fe3701df3477f7456c594e71a124bcbba926121Roshan Pius private void fetchDtmfToneDelay(GSMPhone phone) { 7716fe3701df3477f7456c594e71a124bcbba926121Roshan Pius CarrierConfigManager configMgr = (CarrierConfigManager) 7726fe3701df3477f7456c594e71a124bcbba926121Roshan Pius phone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE); 7736fe3701df3477f7456c594e71a124bcbba926121Roshan Pius PersistableBundle b = configMgr.getConfigForSubId(phone.getSubId()); 7746fe3701df3477f7456c594e71a124bcbba926121Roshan Pius if (b != null) { 7756fe3701df3477f7456c594e71a124bcbba926121Roshan Pius mDtmfToneDelay = b.getInt(CarrierConfigManager.KEY_GSM_DTMF_TONE_DELAY_INT); 7766fe3701df3477f7456c594e71a124bcbba926121Roshan Pius } 7776fe3701df3477f7456c594e71a124bcbba926121Roshan Pius } 7786fe3701df3477f7456c594e71a124bcbba926121Roshan Pius 779c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void log(String msg) { 780ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville Rlog.d(LOG_TAG, "[GSMConn] " + msg); 781c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 782c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 783c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 784c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public int getNumberPresentation() { 78522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mNumberPresentation; 786c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 787c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 788c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 789c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public UUSInfo getUUSInfo() { 79022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville return mUusInfo; 791c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 7920742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela 7930742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela public int getPreciseDisconnectCause() { 7940742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela return mPreciseCause; 7950742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela } 796a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 797e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam @Override 79833cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu public String getVendorDisconnectCause() { 79933cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu return mVendorCause; 80033cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu } 80133cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu 80233cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu @Override 803e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam public void migrateFrom(Connection c) { 804a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (c == null) return; 805a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 806e64a413b850aae224e2f56e7dfc6e0bcd667643eUma Maheswari Ramalingam super.migrateFrom(c); 807a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 808a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.mUusInfo = c.getUUSInfo(); 809a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 810a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville this.setUserData(c.getUserData()); 811a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 812a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 813a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 814a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public Connection getOrigConnection() { 815a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mOrigConnection; 816a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 817a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 818a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville @Override 819a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville public boolean isMultiparty() { 820a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville if (mOrigConnection != null) { 821a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return mOrigConnection.isMultiparty(); 822a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 823a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville 824a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville return false; 825a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville } 826c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 827