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; 26c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.util.Log; 27c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.PhoneNumberUtils; 28c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.telephony.ServiceState; 29c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport android.text.TextUtils; 30c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 31c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savilleimport com.android.internal.telephony.*; 32e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.IccCardApplicationStatus.AppState; 33e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenkaimport com.android.internal.telephony.uicc.UiccController; 34c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 35c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville/** 36c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * {@hide} 37c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 38c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Savillepublic class GsmConnection extends Connection { 39c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final String LOG_TAG = "GSM"; 40c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 41c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Instance Variables 42c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 43c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmCallTracker owner; 44c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmCall parent; 45c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 46c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String address; // MAY BE NULL!!! 47c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String dialString; // outgoing calls only 48c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String postDialString; // outgoing calls only 49c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isIncoming; 50c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean disconnected; 51c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 52c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int index; // index in GsmCallTracker.connections[], -1 if unassigned 53c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The GSM index is 1 + this 54c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 55c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* 56c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * These time/timespan values are based on System.currentTimeMillis(), 57c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * i.e., "wall clock" time. 58c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 59c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long createTime; 60c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long connectTime; 61c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long disconnectTime; 62c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 63c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /* 64c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * These time/timespan values are based on SystemClock.elapsedRealTime(), 65c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * i.e., time since boot. They are appropriate for comparison and 66c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * calculating deltas. 67c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 68c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long connectTimeReal; 69c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long duration; 70c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville long holdingStartTime; // The time when the Connection last transitioned 71c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // into HOLDING 72c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 73c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int nextPostDialChar; // index into postDialString 74c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 75c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville DisconnectCause cause = DisconnectCause.NOT_DISCONNECTED; 76c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville PostDialState postDialState = PostDialState.NOT_STARTED; 77c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int numberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 78c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville UUSInfo uusInfo; 79c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 80c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Handler h; 81c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 82c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private PowerManager.WakeLock mPartialWakeLock; 83c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 84c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Event Constants 85c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_DTMF_DONE = 1; 86c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_PAUSE_DONE = 2; 87c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_NEXT_POST_DIAL = 3; 88c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int EVENT_WAKE_LOCK_TIMEOUT = 4; 89c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 90c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constants 91c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int PAUSE_DELAY_FIRST_MILLIS = 100; 92c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int PAUSE_DELAY_MILLIS = 3 * 1000; 93c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static final int WAKE_LOCK_TIMEOUT_MILLIS = 60*1000; 94c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 95c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Inner Classes 96c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 97c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville class MyHandler extends Handler { 98c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville MyHandler(Looper l) {super(l);} 99c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 100c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void 101c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville handleMessage(Message msg) { 102c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 103c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (msg.what) { 104c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_NEXT_POST_DIAL: 105c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_DTMF_DONE: 106c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_PAUSE_DONE: 107c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 108c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 109c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case EVENT_WAKE_LOCK_TIMEOUT: 110c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 111c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville break; 112c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 113c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 114c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 115c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 116c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //***** Constructors 117c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 118c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** This is probably an MT call that we first saw in a CLCC response */ 119c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ 120c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmConnection (Context context, DriverCall dc, GsmCallTracker ct, int index) { 121c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(context); 122c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 123c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 124c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville owner = ct; 125c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville h = new MyHandler(owner.getLooper()); 126c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 127c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville address = dc.number; 128c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 129c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isIncoming = dc.isMT; 130c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createTime = System.currentTimeMillis(); 131c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cnapName = dc.name; 132c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cnapNamePresentation = dc.namePresentation; 133c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville numberPresentation = dc.numberPresentation; 134c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville uusInfo = dc.uusInfo; 135c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 136c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.index = index; 137c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 138c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parent = parentFromDCState (dc.state); 139c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parent.attach(this, dc); 140c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 141c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 142c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** This is an MO call, created when dialing */ 143c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ 144c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmConnection (Context context, String dialString, GsmCallTracker ct, GsmCall parent) { 145c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(context); 146c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 147c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 148c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville owner = ct; 149c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville h = new MyHandler(owner.getLooper()); 150c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 151c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.dialString = dialString; 152c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 153c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.address = PhoneNumberUtils.extractNetworkPortionAlt(dialString); 154c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.postDialString = PhoneNumberUtils.extractPostDialPortion(dialString); 155c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 156c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville index = -1; 157c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 158c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isIncoming = false; 159c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cnapName = null; 160c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cnapNamePresentation = PhoneConstants.PRESENTATION_ALLOWED; 161c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville numberPresentation = PhoneConstants.PRESENTATION_ALLOWED; 162c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createTime = System.currentTimeMillis(); 163c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 164c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.parent = parent; 165c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parent.attachFake(this, GsmCall.State.DIALING); 166c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 167c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 168c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void dispose() { 169c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 170c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 171c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville static boolean 172c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville equalsHandlesNulls (Object a, Object b) { 173c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return (a == null) ? (b == null) : a.equals (b); 174c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 175c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 176c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ boolean 177c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville compareTo(DriverCall c) { 178c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // On mobile originated (MO) calls, the phone number may have changed 179c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // due to a SIM Toolkit call control modification. 180c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // 181c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We assume we know when MO calls are created (since we created them) 182c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // and therefore don't need to compare the phone number anyway. 183c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (! (isIncoming || c.isMT)) return true; 184c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 185c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // ... but we can compare phone numbers on MT calls, and we have 186c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // no control over when they begin, so we might as well 187c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 188c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville String cAddress = PhoneNumberUtils.stringFromStringAndTOA(c.number, c.TOA); 189c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return isIncoming == c.isMT && equalsHandlesNulls(address, cAddress); 190c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 191c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 192c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String getAddress() { 193c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return address; 194c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 195c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 196c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public GsmCall getCall() { 197c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return parent; 198c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 199c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 200c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getCreateTime() { 201c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return createTime; 202c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 203c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 204c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getConnectTime() { 205c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return connectTime; 206c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 207c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 208c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getDisconnectTime() { 209c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return disconnectTime; 210c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 211c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 212c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getDurationMillis() { 213c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (connectTimeReal == 0) { 214c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 0; 215c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (duration == 0) { 216c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return SystemClock.elapsedRealtime() - connectTimeReal; 217c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 218c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return duration; 219c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 220c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 221c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 222c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public long getHoldDurationMillis() { 223c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (getState() != GsmCall.State.HOLDING) { 224c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If not holding, return 0 225c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return 0; 226c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 227c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return SystemClock.elapsedRealtime() - holdingStartTime; 228c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 229c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 230c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 231c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public DisconnectCause getDisconnectCause() { 232c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return cause; 233c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 234c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 235c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public boolean isIncoming() { 236c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return isIncoming; 237c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 238c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 239c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public GsmCall.State getState() { 240c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (disconnected) { 241c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return GsmCall.State.DISCONNECTED; 242c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 243c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return super.getState(); 244c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 245c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 246c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 247c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void hangup() throws CallStateException { 248c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!disconnected) { 249c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville owner.hangup(this); 250c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 251c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 252c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 253c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 254c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 255c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void separate() throws CallStateException { 256c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!disconnected) { 257c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville owner.separate(this); 258c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 259c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("disconnected"); 260c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 261c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 262c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 263c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public PostDialState getPostDialState() { 264c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return postDialState; 265c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 266c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 267c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWaitChar() { 268c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (postDialState != PostDialState.WAIT) { 269c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Log.w(LOG_TAG, "GsmConnection.proceedAfterWaitChar(): Expected " 270c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "getPostDialState() to be WAIT but was " + postDialState); 271c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 272c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 273c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 274c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 275c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 276c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 277c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 278c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 279c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void proceedAfterWildChar(String str) { 280c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (postDialState != PostDialState.WILD) { 281c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Log.w(LOG_TAG, "GsmConnection.proceedAfterWaitChar(): Expected " 282c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville + "getPostDialState() to be WILD but was " + postDialState); 283c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 284c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 285c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 286c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 287c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 288c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (false) { 289c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean playedTone = false; 290c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int len = (str != null ? str.length() : 0); 291c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 292c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville for (int i=0; i<len; i++) { 293c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char c = str.charAt(i); 294c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message msg = null; 295c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 296c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (i == len-1) { 297c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville msg = h.obtainMessage(EVENT_DTMF_DONE); 298c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 299c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 300c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (PhoneNumberUtils.is12Key(c)) { 301c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville owner.cm.sendDtmf(c, msg); 302c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville playedTone = true; 303c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 304c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 305c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 306c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!playedTone) { 307c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 308c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 309c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 310c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // make a new postDialString, with the wild char replacement string 311c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // at the beginning, followed by the remaining postDialString. 312c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 313c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville StringBuilder buf = new StringBuilder(str); 314c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville buf.append(postDialString.substring(nextPostDialChar)); 315c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville postDialString = buf.toString(); 316c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville nextPostDialChar = 0; 317c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) { 318c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("proceedAfterWildChar: new postDialString is " + 319c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville postDialString); 320c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 321c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 322c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 323c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 324c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 325c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 326c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public void cancelPostDial() { 327c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.CANCELLED); 328c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 329c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 330c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 331c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is being hung up locally (eg, user pressed "end") 332c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Note that at this point, the hangup request has been dispatched to the radio 333c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * but no response has yet been received so update() has not yet been called 334c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 335c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 336c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onHangupLocal() { 337c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cause = DisconnectCause.LOCAL; 338c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 339c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 340c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville DisconnectCause 341c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville disconnectCauseFromCode(int causeCode) { 342c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 343c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * See 22.001 Annex F.4 for mapping of cause codes 344c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to local tones 345c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 346c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 347c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (causeCode) { 348c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.USER_BUSY: 349c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.BUSY; 350c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 351c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NO_CIRCUIT_AVAIL: 352c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.TEMPORARY_FAILURE: 353c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.SWITCHING_CONGESTION: 354c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CHANNEL_NOT_AVAIL: 355c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.QOS_NOT_AVAIL: 356c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.BEARER_NOT_AVAIL: 357c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CONGESTION; 358c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 359c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ACM_LIMIT_EXCEEDED: 360c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.LIMIT_EXCEEDED; 361c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 362c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.CALL_BARRED: 363c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CALL_BARRED; 364c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 365c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.FDN_BLOCKED: 366c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.FDN_BLOCKED; 367c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 368c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.UNOBTAINABLE_NUMBER: 369c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.UNOBTAINABLE_NUMBER; 370c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 371c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.ERROR_UNSPECIFIED: 372c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case CallFailCause.NORMAL_CLEARING: 373c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 374c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GSMPhone phone = owner.phone; 375c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville int serviceState = phone.getServiceState().getState(); 376c90b7d250dae1931a603cc052bd90bc34c070f1bWink Saville UiccCardApplication cardApp = UiccController 377e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka .getInstance() 378c90b7d250dae1931a603cc052bd90bc34c070f1bWink Saville .getUiccCardApplication(UiccController.APP_FAM_3GPP); 379c90b7d250dae1931a603cc052bd90bc34c070f1bWink Saville AppState uiccAppState = (cardApp != null) ? cardApp.getState() : 380c90b7d250dae1931a603cc052bd90bc34c070f1bWink Saville AppState.APPSTATE_UNKNOWN; 381c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (serviceState == ServiceState.STATE_POWER_OFF) { 382c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.POWER_OFF; 383c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE 384c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || serviceState == ServiceState.STATE_EMERGENCY_ONLY ) { 385c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.OUT_OF_SERVICE; 386e287feac673ff68565b766e0e463d105fa9cef9dAlex Yakavenka } else if (uiccAppState != AppState.APPSTATE_READY) { 387c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ICC_ERROR; 388c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (causeCode == CallFailCause.ERROR_UNSPECIFIED) { 389c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (phone.mSST.mRestrictedState.isCsRestricted()) { 390c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED; 391c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (phone.mSST.mRestrictedState.isCsEmergencyRestricted()) { 392c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED_EMERGENCY; 393c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (phone.mSST.mRestrictedState.isCsNormalRestricted()) { 394c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.CS_RESTRICTED_NORMAL; 395c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 396c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ERROR_UNSPECIFIED; 397c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 398c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (causeCode == CallFailCause.NORMAL_CLEARING) { 399c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.NORMAL; 400c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 401c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // If nothing else matches, report unknown call drop reason 402c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // to app, not NORMAL call end. 403c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return DisconnectCause.ERROR_UNSPECIFIED; 404c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 405c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 406c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 407c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 408c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ void 409c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onRemoteDisconnect(int causeCode) { 410c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onDisconnect(disconnectCauseFromCode(causeCode)); 411c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 412c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 413c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Called when the radio indicates the connection has been disconnected */ 414c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ void 415c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onDisconnect(DisconnectCause cause) { 416c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville this.cause = cause; 417c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 418c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!disconnected) { 419c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville index = -1; 420c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 421c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville disconnectTime = System.currentTimeMillis(); 422c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville duration = SystemClock.elapsedRealtime() - connectTimeReal; 423c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville disconnected = true; 424c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 425c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (false) Log.d(LOG_TAG, 426c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "[GSMConn] onDisconnect: cause=" + cause); 427c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 428c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville owner.phone.notifyDisconnect(this); 429c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 430c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (parent != null) { 431c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parent.connectionDisconnected(this); 432c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 433c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 434c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 435c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 436c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 437c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Returns true if state has changed, false if nothing changed 438c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ boolean 439c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville update (DriverCall dc) { 440c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville GsmCall newParent; 441c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean changed = false; 442c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wasConnectingInOrOut = isConnectingInOrOut(); 443c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean wasHolding = (getState() == GsmCall.State.HOLDING); 444c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 445c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent = parentFromDCState(dc.state); 446c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 447c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!equalsHandlesNulls(address, dc.number)) { 448c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) log("update: phone # changed!"); 449c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville address = dc.number; 450c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 451c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 452c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 453c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // A null cnapName should be the same as "" 454c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (TextUtils.isEmpty(dc.name)) { 455c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!TextUtils.isEmpty(cnapName)) { 456c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 457c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cnapName = ""; 458c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 459c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (!dc.name.equals(cnapName)) { 460c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 461c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cnapName = dc.name; 462c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 463c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 464c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) log("--dssds----"+cnapName); 465c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville cnapNamePresentation = dc.namePresentation; 466c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville numberPresentation = dc.numberPresentation; 467c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 468c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (newParent != parent) { 469c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (parent != null) { 470c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parent.detach(this); 471c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 472c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville newParent.attach(this, dc); 473c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parent = newParent; 474c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = true; 475c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 476c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean parentStateChange; 477c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parentStateChange = parent.update (this, dc); 478c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville changed = changed || parentStateChange; 479c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 480c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 481c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** Some state-transition events */ 482c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 483c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) log( 484c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville "update: parent=" + parent + 485c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", hasNewParent=" + (newParent != parent) + 486c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", wasConnectingInOrOut=" + wasConnectingInOrOut + 487c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", wasHolding=" + wasHolding + 488c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", isConnectingInOrOut=" + isConnectingInOrOut() + 489c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ", changed=" + changed); 490c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 491c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 492c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (wasConnectingInOrOut && !isConnectingInOrOut()) { 493c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut(); 494c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 495c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 496c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (changed && !wasHolding && (getState() == GsmCall.State.HOLDING)) { 497c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We've transitioned into HOLDING 498c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 499c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 500c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 501c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return changed; 502c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 503c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 504c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 505c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Called when this Connection is in the foregroundCall 506c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * when a dial is initiated. 507c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * We know we're ACTIVE, and we know we're going to end up 508c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * HOLDING in the backgroundCall 509c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 510c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 511c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville fakeHoldBeforeDial() { 512c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (parent != null) { 513c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parent.detach(this); 514c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 515c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 516c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parent = owner.backgroundCall; 517c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parent.attachFake(this, GsmCall.State.HOLDING); 518c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 519c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding(); 520c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 521c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 522c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /*package*/ int 523c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getGSMIndex() throws CallStateException { 524c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (index >= 0) { 525c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return index + 1; 526c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 527c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new CallStateException ("GSM index not yet assigned"); 528c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 529c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 530c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 531c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 532c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * An incoming or outgoing call has connected 533c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 534c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville void 535c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onConnectedInOrOut() { 536c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville connectTime = System.currentTimeMillis(); 537c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville connectTimeReal = SystemClock.elapsedRealtime(); 538c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville duration = 0; 539c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 540c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // bug #678474: incoming call interpreted as missed call, even though 541c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // it sounds like the user has picked up the call. 542c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (Phone.DEBUG_PHONE) { 543c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("onConnectedInOrOut: connectTime=" + connectTime); 544c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 545c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 546c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isIncoming) { 547c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // outgoing calls only 548c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar(); 549c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 550c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 551c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 552c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 553c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 554c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville onStartedHolding() { 555c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville holdingStartTime = SystemClock.elapsedRealtime(); 556c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 557c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 558c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Performs the appropriate action for a post-dial char, but does not 559c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * notify application. returns false if the character is invalid and 560c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * should be ignored 561c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 562c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 563c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processPostDialChar(char c) { 564c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (PhoneNumberUtils.is12Key(c)) { 565c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville owner.cm.sendDtmf(c, h.obtainMessage(EVENT_DTMF_DONE)); 566c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (c == PhoneNumberUtils.PAUSE) { 567c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // From TS 22.101: 568c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 569c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // "The first occurrence of the "DTMF Control Digits Separator" 570c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // shall be used by the ME to distinguish between the addressing 571c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // digits (i.e. the phone number) and the DTMF digits...." 572c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 573c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (nextPostDialChar == 1) { 574c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The first occurrence. 575c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // We don't need to pause here, but wait for just a bit anyway 576c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville h.sendMessageDelayed(h.obtainMessage(EVENT_PAUSE_DONE), 577c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville PAUSE_DELAY_FIRST_MILLIS); 578c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 579c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // It continues... 580c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // "Upon subsequent occurrences of the separator, the UE shall 581c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // pause again for 3 seconds (\u00B1 20 %) before sending any 582c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // further DTMF digits." 583c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville h.sendMessageDelayed(h.obtainMessage(EVENT_PAUSE_DONE), 584c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville PAUSE_DELAY_MILLIS); 585c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 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 597c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public String 598c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville getRemainingPostDialString() { 599c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (postDialState == PostDialState.CANCELLED 600c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || postDialState == PostDialState.COMPLETE 601c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || postDialString == null 602c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || postDialString.length() <= nextPostDialChar 603c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ) { 604c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return ""; 605c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 606c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 607c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return postDialString.substring(nextPostDialChar); 608c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 609c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 610c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 611c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville protected void finalize() 612c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville { 613c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 614c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * It is understood that This finializer is not guaranteed 615c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * to be called and the release lock call is here just in 616c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * case there is some path that doesn't call onDisconnect 617c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and or onConnectedInOrOut. 618c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 619c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mPartialWakeLock.isHeld()) { 620c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Log.e(LOG_TAG, "[GSMConn] UNEXPECTED; mPartialWakeLock is held when finalizing."); 621c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 622c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 623c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 624c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 625c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 626c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville processNextPostDialChar() { 627c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville char c = 0; 628c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Registrant postDialHandler; 629c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 630c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (postDialState == PostDialState.CANCELLED) { 631c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //Log.v("GSM", "##### processNextPostDialChar: postDialState == CANCELLED, bail"); 632c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 633c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 634c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 635c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (postDialString == null || 636c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville postDialString.length() <= nextPostDialChar) { 637c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.COMPLETE); 638c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 639c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // notifyMessage.arg1 is 0 on complete 640c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c = 0; 641c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else { 642c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville boolean isValid; 643c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 644c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville setPostDialState(PostDialState.STARTED); 645c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 646c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville c = postDialString.charAt(nextPostDialChar++); 647c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 648c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isValid = processPostDialChar(c); 649c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 650c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (!isValid) { 651c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Will call processNextPostDialChar 652c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville h.obtainMessage(EVENT_NEXT_POST_DIAL).sendToTarget(); 653c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // Don't notify application 654c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Log.e("GSM", "processNextPostDialChar: c=" + c + " isn't valid!"); 655c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return; 656c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 657c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 658c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 659c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville postDialHandler = owner.phone.mPostDialHandler; 660c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 661c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message notifyMessage; 662c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 663c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (postDialHandler != null 664c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && (notifyMessage = postDialHandler.messageForRegistrant()) != null) { 665c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // The AsyncResult.result is the Connection object 666c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville PostDialState state = postDialState; 667c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville AsyncResult ar = AsyncResult.forMessage(notifyMessage); 668c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.result = this; 669c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville ar.userObj = state; 670c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 671c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville // arg1 is the character that was/is being processed 672c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.arg1 = c; 673c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 674c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //Log.v("GSM", "##### processNextPostDialChar: send msg to postDialHandler, arg1=" + c); 675c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville notifyMessage.sendToTarget(); 676c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 677c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 678c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 679c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 680c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** "connecting" means "has never been ACTIVE" for both incoming 681c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * and outgoing calls 682c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 683c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private boolean 684c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville isConnectingInOrOut() { 685c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return parent == null || parent == owner.ringingCall 686c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || parent.state == GsmCall.State.DIALING 687c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville || parent.state == GsmCall.State.ALERTING; 688c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 689c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 690c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private GsmCall 691c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville parentFromDCState (DriverCall.State state) { 692c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville switch (state) { 693c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ACTIVE: 694c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case DIALING: 695c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case ALERTING: 696c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return owner.foregroundCall; 697c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 698c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 699c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case HOLDING: 700c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return owner.backgroundCall; 701c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 702c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 703c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case INCOMING: 704c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville case WAITING: 705c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return owner.ringingCall; 706c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville //break; 707c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 708c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville default: 709c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville throw new RuntimeException("illegal call state: " + state); 710c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 711c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 712c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 713c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville /** 714c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * Set post dial state and acquire wake lock while switching to "started" 715c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * state, the wake lock will be released if state switches out of "started" 716c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * state or after WAKE_LOCK_TIMEOUT_MILLIS. 717c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville * @param s new PostDialState 718c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville */ 719c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void setPostDialState(PostDialState s) { 720c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (postDialState != PostDialState.STARTED 721c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && s == PostDialState.STARTED) { 722c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock(); 723c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Message msg = h.obtainMessage(EVENT_WAKE_LOCK_TIMEOUT); 724c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville h.sendMessageDelayed(msg, WAKE_LOCK_TIMEOUT_MILLIS); 725c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } else if (postDialState == PostDialState.STARTED 726c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville && s != PostDialState.STARTED) { 727c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville h.removeMessages(EVENT_WAKE_LOCK_TIMEOUT); 728c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock(); 729c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 730c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville postDialState = s; 731c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 732c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 733c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 734c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville createWakeLock(Context context) { 735c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 736c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); 737c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 738c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 739c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 740c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville acquireWakeLock() { 741c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("acquireWakeLock"); 742c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock.acquire(); 743c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 744c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 745c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void 746c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville releaseWakeLock() { 747c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville synchronized(mPartialWakeLock) { 748c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville if (mPartialWakeLock.isHeld()) { 749c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville log("releaseWakeLock"); 750c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville mPartialWakeLock.release(); 751c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 752c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 753c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 754c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 755c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville private void log(String msg) { 756c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville Log.d(LOG_TAG, "[GSMConn] " + msg); 757c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 758c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 759c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 760c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public int getNumberPresentation() { 761c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return numberPresentation; 762c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 763c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville 764c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville @Override 765c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville public UUSInfo getUUSInfo() { 766c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville return uusInfo; 767c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville } 768c38bb60d867c5d61d90b7179a9ed2b2d1848124fWink Saville} 769